Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

DefaultRemoteRepositoryAdmin.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. package org.apache.archiva.admin.repository.remote;
  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.RemoteRepository;
  23. import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
  24. import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
  25. import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
  26. import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
  27. import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
  28. import org.apache.archiva.configuration.Configuration;
  29. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  30. import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
  31. import org.apache.archiva.metadata.model.facets.AuditEvent;
  32. import org.apache.commons.lang.StringUtils;
  33. import org.apache.maven.index.NexusIndexer;
  34. import org.apache.maven.index.context.IndexCreator;
  35. import org.apache.maven.index.context.IndexingContext;
  36. import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
  37. import org.springframework.stereotype.Service;
  38. import javax.annotation.PostConstruct;
  39. import javax.annotation.PreDestroy;
  40. import javax.inject.Inject;
  41. import java.io.File;
  42. import java.io.IOException;
  43. import java.net.MalformedURLException;
  44. import java.util.ArrayList;
  45. import java.util.HashMap;
  46. import java.util.List;
  47. import java.util.Map;
  48. /**
  49. * @author Olivier Lamy
  50. * @since 1.4-M1
  51. */
  52. @Service("remoteRepositoryAdmin#default")
  53. public class DefaultRemoteRepositoryAdmin
  54. extends AbstractRepositoryAdmin
  55. implements RemoteRepositoryAdmin
  56. {
  57. @Inject
  58. private PlexusSisuBridge plexusSisuBridge;
  59. @Inject
  60. private MavenIndexerUtils mavenIndexerUtils;
  61. // fields
  62. private List<? extends IndexCreator> indexCreators;
  63. private NexusIndexer indexer;
  64. @PostConstruct
  65. private void initialize()
  66. throws RepositoryAdminException
  67. {
  68. try
  69. {
  70. indexCreators = mavenIndexerUtils.getAllIndexCreators();
  71. indexer = plexusSisuBridge.lookup( NexusIndexer.class );
  72. }
  73. catch ( PlexusSisuBridgeException e )
  74. {
  75. throw new RepositoryAdminException( e.getMessage(), e );
  76. }
  77. for ( RemoteRepository remoteRepository : getRemoteRepositories() )
  78. {
  79. createIndexContext( remoteRepository );
  80. }
  81. }
  82. @PreDestroy
  83. private void shutdown()
  84. throws RepositoryAdminException
  85. {
  86. try
  87. {
  88. List<RemoteRepository> remoteRepositories = getRemoteRepositories();
  89. // close index on shutdown
  90. for ( RemoteRepository remoteRepository : remoteRepositories )
  91. {
  92. IndexingContext context = indexer.getIndexingContexts().get( remoteRepository.getId() );
  93. if ( context != null )
  94. {
  95. indexer.removeIndexingContext( context, false );
  96. }
  97. }
  98. }
  99. catch ( IOException e )
  100. {
  101. throw new RepositoryAdminException( e.getMessage(), e );
  102. }
  103. }
  104. @Override
  105. public List<RemoteRepository> getRemoteRepositories()
  106. throws RepositoryAdminException
  107. {
  108. List<RemoteRepository> remoteRepositories =
  109. new ArrayList<>( getArchivaConfiguration().getConfiguration().getRemoteRepositories().size() );
  110. for ( RemoteRepositoryConfiguration repositoryConfiguration : getArchivaConfiguration().getConfiguration().getRemoteRepositories() )
  111. {
  112. RemoteRepository remoteRepository =
  113. new RemoteRepository( repositoryConfiguration.getId(), repositoryConfiguration.getName(),
  114. repositoryConfiguration.getUrl(), repositoryConfiguration.getLayout(),
  115. repositoryConfiguration.getUsername(), repositoryConfiguration.getPassword(),
  116. repositoryConfiguration.getTimeout() );
  117. remoteRepository.setDownloadRemoteIndex( repositoryConfiguration.isDownloadRemoteIndex() );
  118. remoteRepository.setRemoteIndexUrl( repositoryConfiguration.getRemoteIndexUrl() );
  119. remoteRepository.setCronExpression( repositoryConfiguration.getRefreshCronExpression() );
  120. remoteRepository.setIndexDirectory( repositoryConfiguration.getIndexDir() );
  121. remoteRepository.setRemoteDownloadNetworkProxyId(
  122. repositoryConfiguration.getRemoteDownloadNetworkProxyId() );
  123. remoteRepository.setRemoteDownloadTimeout( repositoryConfiguration.getRemoteDownloadTimeout() );
  124. remoteRepository.setDownloadRemoteIndexOnStartup(
  125. repositoryConfiguration.isDownloadRemoteIndexOnStartup() );
  126. remoteRepository.setDescription( repositoryConfiguration.getDescription() );
  127. remoteRepository.setExtraHeaders( repositoryConfiguration.getExtraHeaders() );
  128. remoteRepository.setExtraParameters( repositoryConfiguration.getExtraParameters() );
  129. remoteRepositories.add( remoteRepository );
  130. }
  131. return remoteRepositories;
  132. }
  133. @Override
  134. public RemoteRepository getRemoteRepository( String repositoryId )
  135. throws RepositoryAdminException
  136. {
  137. for ( RemoteRepository remoteRepository : getRemoteRepositories() )
  138. {
  139. if ( StringUtils.equals( repositoryId, remoteRepository.getId() ) )
  140. {
  141. return remoteRepository;
  142. }
  143. }
  144. return null;
  145. }
  146. @Override
  147. public Boolean addRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
  148. throws RepositoryAdminException
  149. {
  150. triggerAuditEvent( remoteRepository.getId(), null, AuditEvent.ADD_REMOTE_REPO, auditInformation );
  151. getRepositoryCommonValidator().basicValidation( remoteRepository, false );
  152. //TODO we can validate it's a good uri/url
  153. if ( StringUtils.isEmpty( remoteRepository.getUrl() ) )
  154. {
  155. throw new RepositoryAdminException( "url cannot be null" );
  156. }
  157. //MRM-752 - url needs trimming
  158. remoteRepository.setUrl( StringUtils.trim( remoteRepository.getUrl() ) );
  159. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  160. getRemoteRepositoryConfiguration( remoteRepository );
  161. Configuration configuration = getArchivaConfiguration().getConfiguration();
  162. configuration.addRemoteRepository( remoteRepositoryConfiguration );
  163. saveConfiguration( configuration );
  164. return Boolean.TRUE;
  165. }
  166. @Override
  167. public Boolean deleteRemoteRepository( String repositoryId, AuditInformation auditInformation )
  168. throws RepositoryAdminException
  169. {
  170. triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_REMOTE_REPO, auditInformation );
  171. Configuration configuration = getArchivaConfiguration().getConfiguration();
  172. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  173. configuration.getRemoteRepositoriesAsMap().get( repositoryId );
  174. if ( remoteRepositoryConfiguration == null )
  175. {
  176. throw new RepositoryAdminException(
  177. "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
  178. }
  179. configuration.removeRemoteRepository( remoteRepositoryConfiguration );
  180. // TODO use ProxyConnectorAdmin interface ?
  181. // [MRM-520] Proxy Connectors are not deleted with the deletion of a Repository.
  182. List<ProxyConnectorConfiguration> proxyConnectors = new ArrayList<>( configuration.getProxyConnectors() );
  183. for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
  184. {
  185. if ( StringUtils.equals( proxyConnector.getTargetRepoId(), repositoryId ) )
  186. {
  187. configuration.removeProxyConnector( proxyConnector );
  188. }
  189. }
  190. saveConfiguration( configuration );
  191. return Boolean.TRUE;
  192. }
  193. @Override
  194. public Boolean updateRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
  195. throws RepositoryAdminException
  196. {
  197. String repositoryId = remoteRepository.getId();
  198. triggerAuditEvent( repositoryId, null, AuditEvent.MODIFY_REMOTE_REPO, auditInformation );
  199. // update means : remove and add
  200. Configuration configuration = getArchivaConfiguration().getConfiguration();
  201. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  202. configuration.getRemoteRepositoriesAsMap().get( repositoryId );
  203. if ( remoteRepositoryConfiguration == null )
  204. {
  205. throw new RepositoryAdminException(
  206. "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
  207. }
  208. configuration.removeRemoteRepository( remoteRepositoryConfiguration );
  209. remoteRepositoryConfiguration = getRemoteRepositoryConfiguration( remoteRepository );
  210. configuration.addRemoteRepository( remoteRepositoryConfiguration );
  211. saveConfiguration( configuration );
  212. return Boolean.TRUE;
  213. }
  214. @Override
  215. public Map<String, RemoteRepository> getRemoteRepositoriesAsMap()
  216. throws RepositoryAdminException
  217. {
  218. java.util.Map<String, RemoteRepository> map = new HashMap<>();
  219. for ( RemoteRepository repo : getRemoteRepositories() )
  220. {
  221. map.put( repo.getId(), repo );
  222. }
  223. return map;
  224. }
  225. @Override
  226. public IndexingContext createIndexContext( RemoteRepository remoteRepository )
  227. throws RepositoryAdminException
  228. {
  229. try
  230. {
  231. String appServerBase = getRegistry().getString( "appserver.base" );
  232. String contextKey = "remote-" + remoteRepository.getId();
  233. IndexingContext indexingContext = indexer.getIndexingContexts().get( contextKey );
  234. if ( indexingContext != null )
  235. {
  236. return indexingContext;
  237. }
  238. // create remote repository path
  239. File repoDir = new File( appServerBase, "data/remotes/" + remoteRepository.getId() );
  240. if ( !repoDir.exists() )
  241. {
  242. repoDir.mkdirs();
  243. }
  244. File indexDirectory = null;
  245. // is there configured indexDirectory ?
  246. String indexDirectoryPath = remoteRepository.getIndexDirectory();
  247. if ( StringUtils.isNotBlank( indexDirectoryPath ) )
  248. {
  249. if ( new File( indexDirectoryPath ).isAbsolute() )
  250. {
  251. indexDirectory = new File( indexDirectoryPath );
  252. }
  253. else
  254. {
  255. indexDirectory = new File( repoDir, indexDirectoryPath );
  256. }
  257. }
  258. // if not configured use a default value
  259. if ( indexDirectory == null )
  260. {
  261. indexDirectory = new File( repoDir, ".index" );
  262. }
  263. if ( !indexDirectory.exists() )
  264. {
  265. indexDirectory.mkdirs();
  266. }
  267. return indexer.addIndexingContext( contextKey, remoteRepository.getId(), repoDir, indexDirectory,
  268. remoteRepository.getUrl(), calculateIndexRemoteUrl( remoteRepository ),
  269. mavenIndexerUtils.getAllIndexCreators() );
  270. }
  271. catch ( MalformedURLException e )
  272. {
  273. throw new RepositoryAdminException( e.getMessage(), e );
  274. }
  275. catch ( IOException e )
  276. {
  277. throw new RepositoryAdminException( e.getMessage(), e );
  278. }
  279. catch ( UnsupportedExistingLuceneIndexException e )
  280. {
  281. throw new RepositoryAdminException( e.getMessage(), e );
  282. }
  283. }
  284. protected String calculateIndexRemoteUrl( RemoteRepository remoteRepository )
  285. {
  286. if ( StringUtils.startsWith( remoteRepository.getRemoteIndexUrl(), "http" ) )
  287. {
  288. String baseUrl = remoteRepository.getRemoteIndexUrl();
  289. return baseUrl.endsWith( "/" ) ? StringUtils.substringBeforeLast( baseUrl, "/" ) : baseUrl;
  290. }
  291. String baseUrl = StringUtils.endsWith( remoteRepository.getUrl(), "/" ) ? StringUtils.substringBeforeLast(
  292. remoteRepository.getUrl(), "/" ) : remoteRepository.getUrl();
  293. baseUrl = StringUtils.isEmpty( remoteRepository.getRemoteIndexUrl() )
  294. ? baseUrl + "/.index"
  295. : baseUrl + "/" + remoteRepository.getRemoteIndexUrl();
  296. return baseUrl;
  297. }
  298. private RemoteRepositoryConfiguration getRemoteRepositoryConfiguration( RemoteRepository remoteRepository )
  299. {
  300. RemoteRepositoryConfiguration remoteRepositoryConfiguration = new RemoteRepositoryConfiguration();
  301. remoteRepositoryConfiguration.setId( remoteRepository.getId() );
  302. remoteRepositoryConfiguration.setPassword( remoteRepository.getPassword() );
  303. remoteRepositoryConfiguration.setTimeout( remoteRepository.getTimeout() );
  304. remoteRepositoryConfiguration.setUrl( remoteRepository.getUrl() );
  305. remoteRepositoryConfiguration.setUsername( remoteRepository.getUserName() );
  306. remoteRepositoryConfiguration.setLayout( remoteRepository.getLayout() );
  307. remoteRepositoryConfiguration.setName( remoteRepository.getName() );
  308. remoteRepositoryConfiguration.setDownloadRemoteIndex( remoteRepository.isDownloadRemoteIndex() );
  309. remoteRepositoryConfiguration.setRemoteIndexUrl( remoteRepository.getRemoteIndexUrl() );
  310. remoteRepositoryConfiguration.setRefreshCronExpression( remoteRepository.getCronExpression() );
  311. remoteRepositoryConfiguration.setIndexDir( remoteRepository.getIndexDirectory() );
  312. remoteRepositoryConfiguration.setRemoteDownloadNetworkProxyId(
  313. remoteRepository.getRemoteDownloadNetworkProxyId() );
  314. remoteRepositoryConfiguration.setRemoteDownloadTimeout( remoteRepository.getRemoteDownloadTimeout() );
  315. remoteRepositoryConfiguration.setDownloadRemoteIndexOnStartup(
  316. remoteRepository.isDownloadRemoteIndexOnStartup() );
  317. remoteRepositoryConfiguration.setDescription( remoteRepository.getDescription() );
  318. remoteRepositoryConfiguration.setExtraHeaders( remoteRepository.getExtraHeaders() );
  319. remoteRepositoryConfiguration.setExtraParameters( remoteRepository.getExtraParameters() );
  320. return remoteRepositoryConfiguration;
  321. }
  322. }