You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DefaultProxyConnectorAdmin.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package org.apache.archiva.admin.repository.proxyconnector;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import org.apache.archiva.admin.model.AuditInformation;
  21. import org.apache.archiva.admin.model.RepositoryAdminException;
  22. import org.apache.archiva.admin.model.beans.ProxyConnector;
  23. import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
  24. import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin;
  25. import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorOrderComparator;
  26. import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
  27. import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
  28. import org.apache.archiva.configuration.Configuration;
  29. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  30. import org.apache.archiva.configuration.functors.ProxyConnectorSelectionPredicate;
  31. import org.apache.archiva.metadata.model.facets.AuditEvent;
  32. import org.apache.commons.collections.CollectionUtils;
  33. import org.apache.commons.lang.StringUtils;
  34. import org.springframework.stereotype.Service;
  35. import javax.inject.Inject;
  36. import java.util.ArrayList;
  37. import java.util.Collections;
  38. import java.util.HashMap;
  39. import java.util.Iterator;
  40. import java.util.List;
  41. import java.util.Map;
  42. /**
  43. * @author Olivier Lamy
  44. * @since 1.4-M1
  45. */
  46. @Service ( "proxyConnectorAdmin#default" )
  47. public class DefaultProxyConnectorAdmin
  48. extends AbstractRepositoryAdmin
  49. implements ProxyConnectorAdmin
  50. {
  51. @Inject
  52. private ManagedRepositoryAdmin managedRepositoryAdmin;
  53. @Inject
  54. private RemoteRepositoryAdmin remoteRepositoryAdmin;
  55. @Override
  56. public List<ProxyConnector> getProxyConnectors()
  57. throws RepositoryAdminException
  58. {
  59. List<ProxyConnectorConfiguration> proxyConnectorConfigurations =
  60. getArchivaConfiguration().getConfiguration().getProxyConnectors();
  61. List<ProxyConnector> proxyConnectors = new ArrayList<>( proxyConnectorConfigurations.size() );
  62. for ( ProxyConnectorConfiguration configuration : proxyConnectorConfigurations )
  63. {
  64. proxyConnectors.add( getProxyConnector( configuration ) );
  65. }
  66. Collections.sort( proxyConnectors, ProxyConnectorOrderComparator.getInstance() );
  67. return proxyConnectors;
  68. }
  69. @Override
  70. public ProxyConnector getProxyConnector( String sourceRepoId, String targetRepoId )
  71. throws RepositoryAdminException
  72. {
  73. for ( ProxyConnector proxyConnector : getProxyConnectors() )
  74. {
  75. if ( StringUtils.equals( sourceRepoId, proxyConnector.getSourceRepoId() ) && StringUtils.equals(
  76. targetRepoId, proxyConnector.getTargetRepoId() ) )
  77. {
  78. return proxyConnector;
  79. }
  80. }
  81. return null;
  82. }
  83. @Override
  84. public Boolean addProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  85. throws RepositoryAdminException
  86. {
  87. if ( getProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId() ) != null )
  88. {
  89. throw new RepositoryAdminException(
  90. "Unable to add proxy connector, as one already exists with source repository id ["
  91. + proxyConnector.getSourceRepoId() + "] and target repository id ["
  92. + proxyConnector.getTargetRepoId() + "]." );
  93. }
  94. validateProxyConnector( proxyConnector );
  95. proxyConnector.setBlackListPatterns( unescapePatterns( proxyConnector.getBlackListPatterns() ) );
  96. proxyConnector.setWhiteListPatterns( unescapePatterns( proxyConnector.getWhiteListPatterns() ) );
  97. Configuration configuration = getArchivaConfiguration().getConfiguration();
  98. ProxyConnectorConfiguration proxyConnectorConfiguration = getProxyConnectorConfiguration( proxyConnector );
  99. configuration.addProxyConnector( proxyConnectorConfiguration );
  100. saveConfiguration( configuration );
  101. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  102. AuditEvent.ADD_PROXY_CONNECTOR, auditInformation );
  103. return Boolean.TRUE;
  104. }
  105. // FIXME take care of proxyConnectorRules !
  106. @Override
  107. public Boolean deleteProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  108. throws RepositoryAdminException
  109. {
  110. Configuration configuration = getArchivaConfiguration().getConfiguration();
  111. ProxyConnectorConfiguration proxyConnectorConfiguration =
  112. findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
  113. if ( proxyConnectorConfiguration == null )
  114. {
  115. throw new RepositoryAdminException(
  116. "unable to find ProxyConnector with source " + proxyConnector.getSourceRepoId() + " and target "
  117. + proxyConnector.getTargetRepoId() );
  118. }
  119. configuration.removeProxyConnector( proxyConnectorConfiguration );
  120. saveConfiguration( configuration );
  121. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  122. AuditEvent.DELETE_PROXY_CONNECTOR, auditInformation );
  123. return Boolean.TRUE;
  124. }
  125. // FIXME care take of proxyConnectorRules !
  126. @Override
  127. public Boolean updateProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  128. throws RepositoryAdminException
  129. {
  130. Configuration configuration = getArchivaConfiguration().getConfiguration();
  131. ProxyConnectorConfiguration proxyConnectorConfiguration =
  132. findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
  133. configuration.removeProxyConnector( proxyConnectorConfiguration );
  134. configuration.addProxyConnector( getProxyConnectorConfiguration( proxyConnector ) );
  135. saveConfiguration( configuration );
  136. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  137. AuditEvent.MODIFY_PROXY_CONNECTOR, auditInformation );
  138. return Boolean.TRUE;
  139. }
  140. protected List<String> unescapePatterns( List<String> patterns )
  141. {
  142. if ( patterns != null )
  143. {
  144. List<String> rawPatterns = new ArrayList<>( patterns.size() );
  145. for ( String pattern : patterns )
  146. {
  147. rawPatterns.add( StringUtils.replace( pattern, "\\\\", "\\" ) );
  148. }
  149. return rawPatterns;
  150. }
  151. return Collections.emptyList();
  152. }
  153. @Override
  154. public Map<String, List<ProxyConnector>> getProxyConnectorAsMap()
  155. throws RepositoryAdminException
  156. {
  157. Map<String, List<ProxyConnector>> proxyConnectorMap = new HashMap<>();
  158. Iterator<ProxyConnector> it = getProxyConnectors().iterator();
  159. while ( it.hasNext() )
  160. {
  161. ProxyConnector proxyConfig = it.next();
  162. String key = proxyConfig.getSourceRepoId();
  163. List<ProxyConnector> connectors = proxyConnectorMap.get( key );
  164. if ( connectors == null )
  165. {
  166. connectors = new ArrayList<>( 1 );
  167. proxyConnectorMap.put( key, connectors );
  168. }
  169. connectors.add( proxyConfig );
  170. Collections.sort( connectors, ProxyConnectorOrderComparator.getInstance() );
  171. }
  172. return proxyConnectorMap;
  173. }
  174. private ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId,
  175. Configuration configuration )
  176. {
  177. if ( StringUtils.isBlank( sourceId ) )
  178. {
  179. return null;
  180. }
  181. if ( StringUtils.isBlank( targetId ) )
  182. {
  183. return null;
  184. }
  185. ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
  186. return (ProxyConnectorConfiguration) CollectionUtils.find( configuration.getProxyConnectors(), selectedProxy );
  187. }
  188. protected ProxyConnectorConfiguration getProxyConnectorConfiguration( ProxyConnector proxyConnector )
  189. {
  190. return proxyConnector == null
  191. ? null
  192. : getModelMapper().map( proxyConnector, ProxyConnectorConfiguration.class );
  193. }
  194. protected ProxyConnector getProxyConnector( ProxyConnectorConfiguration proxyConnectorConfiguration )
  195. {
  196. return proxyConnectorConfiguration == null
  197. ? null
  198. : getModelMapper().map( proxyConnectorConfiguration, ProxyConnector.class );
  199. }
  200. protected void validateProxyConnector( ProxyConnector proxyConnector )
  201. throws RepositoryAdminException
  202. {
  203. // validate source a Managed target a Remote
  204. if ( managedRepositoryAdmin.getManagedRepository( proxyConnector.getSourceRepoId() ) == null )
  205. {
  206. throw new RepositoryAdminException(
  207. "non valid ProxyConnector sourceRepo with id " + proxyConnector.getSourceRepoId()
  208. + " is not a ManagedRepository" );
  209. }
  210. if ( remoteRepositoryAdmin.getRemoteRepository( proxyConnector.getTargetRepoId() ) == null )
  211. {
  212. throw new RepositoryAdminException(
  213. "non valid ProxyConnector sourceRepo with id " + proxyConnector.getTargetRepoId()
  214. + " is not a RemoteRepository" );
  215. }
  216. // FIXME validate NetworkProxyConfiguration too when available
  217. }
  218. }