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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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.audit.AuditEvent;
  29. import org.apache.archiva.configuration.Configuration;
  30. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  31. import org.apache.archiva.configuration.functors.ProxyConnectorSelectionPredicate;
  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. public List<ProxyConnector> getProxyConnectors()
  56. throws RepositoryAdminException
  57. {
  58. List<ProxyConnectorConfiguration> proxyConnectorConfigurations =
  59. getArchivaConfiguration().getConfiguration().getProxyConnectors();
  60. List<ProxyConnector> proxyConnectors = new ArrayList<>( proxyConnectorConfigurations.size() );
  61. for ( ProxyConnectorConfiguration configuration : proxyConnectorConfigurations )
  62. {
  63. proxyConnectors.add( getProxyConnector( configuration ) );
  64. }
  65. Collections.sort( proxyConnectors, ProxyConnectorOrderComparator.getInstance() );
  66. return proxyConnectors;
  67. }
  68. public ProxyConnector getProxyConnector( String sourceRepoId, String targetRepoId )
  69. throws RepositoryAdminException
  70. {
  71. for ( ProxyConnector proxyConnector : getProxyConnectors() )
  72. {
  73. if ( StringUtils.equals( sourceRepoId, proxyConnector.getSourceRepoId() ) && StringUtils.equals(
  74. targetRepoId, proxyConnector.getTargetRepoId() ) )
  75. {
  76. return proxyConnector;
  77. }
  78. }
  79. return null;
  80. }
  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. public Boolean deleteProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  104. throws RepositoryAdminException
  105. {
  106. Configuration configuration = getArchivaConfiguration().getConfiguration();
  107. ProxyConnectorConfiguration proxyConnectorConfiguration =
  108. findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
  109. if ( proxyConnectorConfiguration == null )
  110. {
  111. throw new RepositoryAdminException(
  112. "unable to find ProxyConnector with source " + proxyConnector.getSourceRepoId() + " and target "
  113. + proxyConnector.getTargetRepoId() );
  114. }
  115. configuration.removeProxyConnector( proxyConnectorConfiguration );
  116. saveConfiguration( configuration );
  117. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  118. AuditEvent.DELETE_PROXY_CONNECTOR, auditInformation );
  119. return Boolean.TRUE;
  120. }
  121. // FIXME care take of proxyConnectorRules !
  122. public Boolean updateProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
  123. throws RepositoryAdminException
  124. {
  125. Configuration configuration = getArchivaConfiguration().getConfiguration();
  126. ProxyConnectorConfiguration proxyConnectorConfiguration =
  127. findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
  128. configuration.removeProxyConnector( proxyConnectorConfiguration );
  129. configuration.addProxyConnector( getProxyConnectorConfiguration( proxyConnector ) );
  130. saveConfiguration( configuration );
  131. triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
  132. AuditEvent.MODIFY_PROXY_CONNECTOR, auditInformation );
  133. return Boolean.TRUE;
  134. }
  135. protected List<String> unescapePatterns( List<String> patterns )
  136. {
  137. if ( patterns != null )
  138. {
  139. List<String> rawPatterns = new ArrayList<>( patterns.size() );
  140. for ( String pattern : patterns )
  141. {
  142. rawPatterns.add( StringUtils.replace( pattern, "\\\\", "\\" ) );
  143. }
  144. return rawPatterns;
  145. }
  146. return Collections.emptyList();
  147. }
  148. public Map<String, List<ProxyConnector>> getProxyConnectorAsMap()
  149. throws RepositoryAdminException
  150. {
  151. Map<String, List<ProxyConnector>> proxyConnectorMap = new HashMap<String, java.util.List<ProxyConnector>>();
  152. Iterator<ProxyConnector> it = getProxyConnectors().iterator();
  153. while ( it.hasNext() )
  154. {
  155. ProxyConnector proxyConfig = it.next();
  156. String key = proxyConfig.getSourceRepoId();
  157. List<ProxyConnector> connectors = proxyConnectorMap.get( key );
  158. if ( connectors == null )
  159. {
  160. connectors = new ArrayList<>( 1 );
  161. proxyConnectorMap.put( key, connectors );
  162. }
  163. connectors.add( proxyConfig );
  164. Collections.sort( connectors, ProxyConnectorOrderComparator.getInstance() );
  165. }
  166. return proxyConnectorMap;
  167. }
  168. private ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId,
  169. Configuration configuration )
  170. {
  171. if ( StringUtils.isBlank( sourceId ) )
  172. {
  173. return null;
  174. }
  175. if ( StringUtils.isBlank( targetId ) )
  176. {
  177. return null;
  178. }
  179. ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
  180. return (ProxyConnectorConfiguration) CollectionUtils.find( configuration.getProxyConnectors(), selectedProxy );
  181. }
  182. protected ProxyConnectorConfiguration getProxyConnectorConfiguration( ProxyConnector proxyConnector )
  183. {
  184. return proxyConnector == null
  185. ? null
  186. : getModelMapper().map( proxyConnector, ProxyConnectorConfiguration.class );
  187. }
  188. protected ProxyConnector getProxyConnector( ProxyConnectorConfiguration proxyConnectorConfiguration )
  189. {
  190. return proxyConnectorConfiguration == null
  191. ? null
  192. : getModelMapper().map( proxyConnectorConfiguration, ProxyConnector.class );
  193. }
  194. protected void validateProxyConnector( ProxyConnector proxyConnector )
  195. throws RepositoryAdminException
  196. {
  197. // validate source a Managed target a Remote
  198. if ( managedRepositoryAdmin.getManagedRepository( proxyConnector.getSourceRepoId() ) == null )
  199. {
  200. throw new RepositoryAdminException(
  201. "non valid ProxyConnector sourceRepo with id " + proxyConnector.getSourceRepoId()
  202. + " is not a ManagedRepository" );
  203. }
  204. if ( remoteRepositoryAdmin.getRemoteRepository( proxyConnector.getTargetRepoId() ) == null )
  205. {
  206. throw new RepositoryAdminException(
  207. "non valid ProxyConnector sourceRepo with id " + proxyConnector.getTargetRepoId()
  208. + " is not a RemoteRepository" );
  209. }
  210. // FIXME validate NetworkProxyConfiguration too when available
  211. }
  212. }