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 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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.proxyconnector.ProxyConnectorAdmin;
  24. import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorOrderComparator;
  25. import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
  26. import org.apache.archiva.configuration.Configuration;
  27. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  28. import org.apache.archiva.configuration.functors.ProxyConnectorSelectionPredicate;
  29. import org.apache.archiva.metadata.model.facets.AuditEvent;
  30. import org.apache.archiva.repository.RepositoryRegistry;
  31. import org.apache.commons.collections.CollectionUtils;
  32. import org.apache.commons.lang.StringUtils;
  33. import org.springframework.stereotype.Service;
  34. import javax.inject.Inject;
  35. import java.util.ArrayList;
  36. import java.util.Collections;
  37. import java.util.HashMap;
  38. import java.util.Iterator;
  39. import java.util.List;
  40. import java.util.Map;
  41. /**
  42. * @author Olivier Lamy
  43. * @since 1.4-M1
  44. */
  45. @Service ( "proxyConnectorAdmin#default" )
  46. public class DefaultProxyConnectorAdmin
  47. extends AbstractRepositoryAdmin
  48. implements ProxyConnectorAdmin
  49. {
  50. @Inject
  51. RepositoryRegistry repositoryRegistry;
  52. @Override
  53. public List<ProxyConnector> getProxyConnectors()
  54. throws RepositoryAdminException
  55. {
  56. List<ProxyConnectorConfiguration> proxyConnectorConfigurations =
  57. getArchivaConfiguration().getConfiguration().getProxyConnectors();
  58. List<ProxyConnector> proxyConnectors = new ArrayList<>( proxyConnectorConfigurations.size() );
  59. for ( ProxyConnectorConfiguration configuration : proxyConnectorConfigurations )
  60. {
  61. proxyConnectors.add( getProxyConnector( configuration ) );
  62. }
  63. Collections.sort( proxyConnectors, ProxyConnectorOrderComparator.getInstance() );
  64. return proxyConnectors;
  65. }
  66. @Override
  67. public ProxyConnector getProxyConnector( String sourceRepoId, String targetRepoId )
  68. throws RepositoryAdminException
  69. {
  70. for ( ProxyConnector proxyConnector : getProxyConnectors() )
  71. {
  72. if ( StringUtils.equals( sourceRepoId, proxyConnector.getSourceRepoId() ) && StringUtils.equals(
  73. targetRepoId, proxyConnector.getTargetRepoId() ) )
  74. {
  75. return proxyConnector;
  76. }
  77. }
  78. return null;
  79. }
  80. @Override
  81. public Boolean addProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  82. throws RepositoryAdminException
  83. {
  84. if ( getProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId() ) != null )
  85. {
  86. throw new RepositoryAdminException(
  87. "Unable to add proxy connector, as one already exists with source repository id ["
  88. + proxyConnector.getSourceRepoId() + "] and target repository id ["
  89. + proxyConnector.getTargetRepoId() + "]." );
  90. }
  91. validateProxyConnector( proxyConnector );
  92. proxyConnector.setBlackListPatterns( unescapePatterns( proxyConnector.getBlackListPatterns() ) );
  93. proxyConnector.setWhiteListPatterns( unescapePatterns( proxyConnector.getWhiteListPatterns() ) );
  94. Configuration configuration = getArchivaConfiguration().getConfiguration();
  95. ProxyConnectorConfiguration proxyConnectorConfiguration = getProxyConnectorConfiguration( proxyConnector );
  96. configuration.addProxyConnector( proxyConnectorConfiguration );
  97. saveConfiguration( configuration );
  98. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  99. AuditEvent.ADD_PROXY_CONNECTOR, auditInformation );
  100. return Boolean.TRUE;
  101. }
  102. // FIXME take care of proxyConnectorRules !
  103. @Override
  104. public Boolean deleteProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  105. throws RepositoryAdminException
  106. {
  107. Configuration configuration = getArchivaConfiguration().getConfiguration();
  108. ProxyConnectorConfiguration proxyConnectorConfiguration =
  109. findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
  110. if ( proxyConnectorConfiguration == null )
  111. {
  112. throw new RepositoryAdminException(
  113. "unable to find ProxyConnector with source " + proxyConnector.getSourceRepoId() + " and target "
  114. + proxyConnector.getTargetRepoId() );
  115. }
  116. configuration.removeProxyConnector( proxyConnectorConfiguration );
  117. saveConfiguration( configuration );
  118. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  119. AuditEvent.DELETE_PROXY_CONNECTOR, auditInformation );
  120. return Boolean.TRUE;
  121. }
  122. // FIXME care take of proxyConnectorRules !
  123. @Override
  124. public Boolean updateProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  125. throws RepositoryAdminException
  126. {
  127. Configuration configuration = getArchivaConfiguration().getConfiguration();
  128. ProxyConnectorConfiguration proxyConnectorConfiguration =
  129. findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
  130. configuration.removeProxyConnector( proxyConnectorConfiguration );
  131. configuration.addProxyConnector( getProxyConnectorConfiguration( proxyConnector ) );
  132. saveConfiguration( configuration );
  133. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  134. AuditEvent.MODIFY_PROXY_CONNECTOR, auditInformation );
  135. return Boolean.TRUE;
  136. }
  137. protected List<String> unescapePatterns( List<String> patterns )
  138. {
  139. if ( patterns != null )
  140. {
  141. List<String> rawPatterns = new ArrayList<>( patterns.size() );
  142. for ( String pattern : patterns )
  143. {
  144. rawPatterns.add( StringUtils.replace( pattern, "\\\\", "\\" ) );
  145. }
  146. return rawPatterns;
  147. }
  148. return Collections.emptyList();
  149. }
  150. @Override
  151. public Map<String, List<ProxyConnector>> getProxyConnectorAsMap()
  152. throws RepositoryAdminException
  153. {
  154. Map<String, List<ProxyConnector>> proxyConnectorMap = new HashMap<>();
  155. Iterator<ProxyConnector> it = getProxyConnectors().iterator();
  156. while ( it.hasNext() )
  157. {
  158. ProxyConnector proxyConfig = it.next();
  159. String key = proxyConfig.getSourceRepoId();
  160. List<ProxyConnector> connectors = proxyConnectorMap.get( key );
  161. if ( connectors == null )
  162. {
  163. connectors = new ArrayList<>( 1 );
  164. proxyConnectorMap.put( key, connectors );
  165. }
  166. connectors.add( proxyConfig );
  167. Collections.sort( connectors, ProxyConnectorOrderComparator.getInstance() );
  168. }
  169. return proxyConnectorMap;
  170. }
  171. private ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId,
  172. Configuration configuration )
  173. {
  174. if ( StringUtils.isBlank( sourceId ) )
  175. {
  176. return null;
  177. }
  178. if ( StringUtils.isBlank( targetId ) )
  179. {
  180. return null;
  181. }
  182. ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
  183. return (ProxyConnectorConfiguration) CollectionUtils.find( configuration.getProxyConnectors(), selectedProxy );
  184. }
  185. protected ProxyConnectorConfiguration getProxyConnectorConfiguration( ProxyConnector proxyConnector )
  186. {
  187. return proxyConnector == null
  188. ? null
  189. : getModelMapper().map( proxyConnector, ProxyConnectorConfiguration.class );
  190. }
  191. protected ProxyConnector getProxyConnector( ProxyConnectorConfiguration proxyConnectorConfiguration )
  192. {
  193. return proxyConnectorConfiguration == null
  194. ? null
  195. : getModelMapper().map( proxyConnectorConfiguration, ProxyConnector.class );
  196. }
  197. protected void validateProxyConnector( ProxyConnector proxyConnector )
  198. throws RepositoryAdminException
  199. {
  200. // validate source a Managed target a Remote
  201. if ( repositoryRegistry.getManagedRepository( proxyConnector.getSourceRepoId() ) == null )
  202. {
  203. throw new RepositoryAdminException(
  204. "non valid ProxyConnector sourceRepo with id " + proxyConnector.getSourceRepoId()
  205. + " is not a ManagedRepository" );
  206. }
  207. if ( repositoryRegistry.getRemoteRepository( proxyConnector.getTargetRepoId() ) == null )
  208. {
  209. throw new RepositoryAdminException(
  210. "non valid ProxyConnector sourceRepo with id " + proxyConnector.getTargetRepoId()
  211. + " is not a RemoteRepository" );
  212. }
  213. // FIXME validate NetworkProxyConfiguration too when available
  214. }
  215. }