001package org.apache.archiva.admin.repository.proxyconnector; 002/* 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 */ 020 021import org.apache.archiva.admin.model.AuditInformation; 022import org.apache.archiva.admin.model.RepositoryAdminException; 023import org.apache.archiva.admin.model.beans.ProxyConnector; 024import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin; 025import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorOrderComparator; 026import org.apache.archiva.admin.repository.AbstractRepositoryAdmin; 027import org.apache.archiva.configuration.Configuration; 028import org.apache.archiva.configuration.ProxyConnectorConfiguration; 029import org.apache.archiva.configuration.functors.ProxyConnectorSelectionPredicate; 030import org.apache.archiva.metadata.model.facets.AuditEvent; 031import org.apache.archiva.repository.RepositoryRegistry; 032import org.apache.commons.collections4.IterableUtils; 033import org.apache.commons.lang3.StringUtils; 034import org.springframework.stereotype.Service; 035 036import javax.inject.Inject; 037import java.util.ArrayList; 038import java.util.Collections; 039import java.util.HashMap; 040import java.util.Iterator; 041import java.util.List; 042import java.util.Map; 043 044/** 045 * @author Olivier Lamy 046 * @since 1.4-M1 047 */ 048@Service ( "proxyConnectorAdmin#default" ) 049public class DefaultProxyConnectorAdmin 050 extends AbstractRepositoryAdmin 051 implements ProxyConnectorAdmin 052{ 053 054 @Inject 055 RepositoryRegistry repositoryRegistry; 056 057 @Override 058 public List<ProxyConnector> getProxyConnectors() 059 throws RepositoryAdminException 060 { 061 List<ProxyConnectorConfiguration> proxyConnectorConfigurations = 062 getArchivaConfiguration().getConfiguration().getProxyConnectors(); 063 List<ProxyConnector> proxyConnectors = new ArrayList<>( proxyConnectorConfigurations.size() ); 064 for ( ProxyConnectorConfiguration configuration : proxyConnectorConfigurations ) 065 { 066 proxyConnectors.add( getProxyConnector( configuration ) ); 067 } 068 Collections.sort( proxyConnectors, ProxyConnectorOrderComparator.getInstance() ); 069 return proxyConnectors; 070 } 071 072 @Override 073 public ProxyConnector getProxyConnector( String sourceRepoId, String targetRepoId ) 074 throws RepositoryAdminException 075 { 076 for ( ProxyConnector proxyConnector : getProxyConnectors() ) 077 { 078 if ( StringUtils.equals( sourceRepoId, proxyConnector.getSourceRepoId() ) && StringUtils.equals( 079 targetRepoId, proxyConnector.getTargetRepoId() ) ) 080 { 081 return proxyConnector; 082 } 083 } 084 return null; 085 } 086 087 @Override 088 public Boolean addProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation ) 089 throws RepositoryAdminException 090 { 091 if ( getProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId() ) != null ) 092 { 093 throw new RepositoryAdminException( 094 "Unable to add proxy connector, as one already exists with source repository id [" 095 + proxyConnector.getSourceRepoId() + "] and target repository id [" 096 + proxyConnector.getTargetRepoId() + "]." ); 097 } 098 099 validateProxyConnector( proxyConnector ); 100 101 proxyConnector.setBlackListPatterns( unescapePatterns( proxyConnector.getBlackListPatterns() ) ); 102 proxyConnector.setWhiteListPatterns( unescapePatterns( proxyConnector.getWhiteListPatterns() ) ); 103 104 Configuration configuration = getArchivaConfiguration().getConfiguration(); 105 106 ProxyConnectorConfiguration proxyConnectorConfiguration = getProxyConnectorConfiguration( proxyConnector ); 107 configuration.addProxyConnector( proxyConnectorConfiguration ); 108 saveConfiguration( configuration ); 109 triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null, 110 AuditEvent.ADD_PROXY_CONNECTOR, auditInformation ); 111 return Boolean.TRUE; 112 113 } 114 115 // FIXME take care of proxyConnectorRules ! 116 @Override 117 public Boolean deleteProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation ) 118 throws RepositoryAdminException 119 { 120 Configuration configuration = getArchivaConfiguration().getConfiguration(); 121 ProxyConnectorConfiguration proxyConnectorConfiguration = 122 findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration ); 123 if ( proxyConnectorConfiguration == null ) 124 { 125 throw new RepositoryAdminException( 126 "unable to find ProxyConnector with source " + proxyConnector.getSourceRepoId() + " and target " 127 + proxyConnector.getTargetRepoId() ); 128 } 129 configuration.removeProxyConnector( proxyConnectorConfiguration ); 130 saveConfiguration( configuration ); 131 triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null, 132 AuditEvent.DELETE_PROXY_CONNECTOR, auditInformation ); 133 return Boolean.TRUE; 134 } 135 136 // FIXME care take of proxyConnectorRules ! 137 @Override 138 public Boolean updateProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation ) 139 throws RepositoryAdminException 140 { 141 Configuration configuration = getArchivaConfiguration().getConfiguration(); 142 ProxyConnectorConfiguration proxyConnectorConfiguration = 143 findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration ); 144 configuration.removeProxyConnector( proxyConnectorConfiguration ); 145 configuration.addProxyConnector( getProxyConnectorConfiguration( proxyConnector ) ); 146 saveConfiguration( configuration ); 147 triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null, 148 AuditEvent.MODIFY_PROXY_CONNECTOR, auditInformation ); 149 return Boolean.TRUE; 150 } 151 152 protected List<String> unescapePatterns( List<String> patterns ) 153 { 154 if ( patterns != null ) 155 { 156 List<String> rawPatterns = new ArrayList<>( patterns.size() ); 157 for ( String pattern : patterns ) 158 { 159 rawPatterns.add( StringUtils.replace( pattern, "\\\\", "\\" ) ); 160 } 161 return rawPatterns; 162 } 163 164 return Collections.emptyList(); 165 } 166 167 @Override 168 public Map<String, List<ProxyConnector>> getProxyConnectorAsMap() 169 throws RepositoryAdminException 170 { 171 Map<String, List<ProxyConnector>> proxyConnectorMap = new HashMap<>(); 172 173 Iterator<ProxyConnector> it = getProxyConnectors().iterator(); 174 while ( it.hasNext() ) 175 { 176 ProxyConnector proxyConfig = it.next(); 177 String key = proxyConfig.getSourceRepoId(); 178 179 List<ProxyConnector> connectors = proxyConnectorMap.get( key ); 180 if ( connectors == null ) 181 { 182 connectors = new ArrayList<>( 1 ); 183 proxyConnectorMap.put( key, connectors ); 184 } 185 186 connectors.add( proxyConfig ); 187 188 Collections.sort( connectors, ProxyConnectorOrderComparator.getInstance() ); 189 } 190 191 return proxyConnectorMap; 192 } 193 194 private ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId, 195 Configuration configuration ) 196 { 197 if ( StringUtils.isBlank( sourceId ) ) 198 { 199 return null; 200 } 201 202 if ( StringUtils.isBlank( targetId ) ) 203 { 204 return null; 205 } 206 207 ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId ); 208 return IterableUtils.find( configuration.getProxyConnectors(), selectedProxy ); 209 } 210 211 protected ProxyConnectorConfiguration getProxyConnectorConfiguration( ProxyConnector proxyConnector ) 212 { 213 return proxyConnector == null 214 ? null 215 : getModelMapper().map( proxyConnector, ProxyConnectorConfiguration.class ); 216 } 217 218 protected ProxyConnector getProxyConnector( ProxyConnectorConfiguration proxyConnectorConfiguration ) 219 { 220 return proxyConnectorConfiguration == null 221 ? null 222 : getModelMapper().map( proxyConnectorConfiguration, ProxyConnector.class ); 223 } 224 225 protected void validateProxyConnector( ProxyConnector proxyConnector ) 226 throws RepositoryAdminException 227 { 228 // validate source a Managed target a Remote 229 if ( repositoryRegistry.getManagedRepository( proxyConnector.getSourceRepoId() ) == null ) 230 { 231 throw new RepositoryAdminException( 232 "non valid ProxyConnector sourceRepo with id " + proxyConnector.getSourceRepoId() 233 + " is not a ManagedRepository" ); 234 } 235 if ( repositoryRegistry.getRemoteRepository( proxyConnector.getTargetRepoId() ) == null ) 236 { 237 throw new RepositoryAdminException( 238 "non valid ProxyConnector sourceRepo with id " + proxyConnector.getTargetRepoId() 239 + " is not a RemoteRepository" ); 240 } 241 242 // FIXME validate NetworkProxyConfiguration too when available 243 } 244}