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.

DefaultRemoteRepositoryAdmin.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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.audit.AuditEvent;
  26. import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
  27. import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
  28. import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
  29. import org.apache.archiva.configuration.Configuration;
  30. import org.apache.archiva.configuration.ProxyConnectorConfiguration;
  31. import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
  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. List<? extends IndexCreator> indexCreators;
  63. 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. public List<RemoteRepository> getRemoteRepositories()
  105. throws RepositoryAdminException
  106. {
  107. List<RemoteRepository> remoteRepositories =
  108. new ArrayList<>( getArchivaConfiguration().getConfiguration().getRemoteRepositories().size() );
  109. for ( RemoteRepositoryConfiguration repositoryConfiguration : getArchivaConfiguration().getConfiguration().getRemoteRepositories() )
  110. {
  111. RemoteRepository remoteRepository =
  112. new RemoteRepository( repositoryConfiguration.getId(), repositoryConfiguration.getName(),
  113. repositoryConfiguration.getUrl(), repositoryConfiguration.getLayout(),
  114. repositoryConfiguration.getUsername(), repositoryConfiguration.getPassword(),
  115. repositoryConfiguration.getTimeout() );
  116. remoteRepository.setDownloadRemoteIndex( repositoryConfiguration.isDownloadRemoteIndex() );
  117. remoteRepository.setRemoteIndexUrl( repositoryConfiguration.getRemoteIndexUrl() );
  118. remoteRepository.setCronExpression( repositoryConfiguration.getRefreshCronExpression() );
  119. remoteRepository.setIndexDirectory( repositoryConfiguration.getIndexDir() );
  120. remoteRepository.setRemoteDownloadNetworkProxyId(
  121. repositoryConfiguration.getRemoteDownloadNetworkProxyId() );
  122. remoteRepository.setRemoteDownloadTimeout( repositoryConfiguration.getRemoteDownloadTimeout() );
  123. remoteRepository.setDownloadRemoteIndexOnStartup(
  124. repositoryConfiguration.isDownloadRemoteIndexOnStartup() );
  125. remoteRepository.setDescription( repositoryConfiguration.getDescription() );
  126. remoteRepository.setExtraHeaders( repositoryConfiguration.getExtraHeaders() );
  127. remoteRepository.setExtraParameters( repositoryConfiguration.getExtraParameters() );
  128. remoteRepositories.add( remoteRepository );
  129. }
  130. return remoteRepositories;
  131. }
  132. public RemoteRepository getRemoteRepository( String repositoryId )
  133. throws RepositoryAdminException
  134. {
  135. for ( RemoteRepository remoteRepository : getRemoteRepositories() )
  136. {
  137. if ( StringUtils.equals( repositoryId, remoteRepository.getId() ) )
  138. {
  139. return remoteRepository;
  140. }
  141. }
  142. return null;
  143. }
  144. public Boolean addRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
  145. throws RepositoryAdminException
  146. {
  147. triggerAuditEvent( remoteRepository.getId(), null, AuditEvent.ADD_REMOTE_REPO, auditInformation );
  148. getRepositoryCommonValidator().basicValidation( remoteRepository, false );
  149. //TODO we can validate it's a good uri/url
  150. if ( StringUtils.isEmpty( remoteRepository.getUrl() ) )
  151. {
  152. throw new RepositoryAdminException( "url cannot be null" );
  153. }
  154. //MRM-752 - url needs trimming
  155. remoteRepository.setUrl( StringUtils.trim( remoteRepository.getUrl() ) );
  156. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  157. getRemoteRepositoryConfiguration( remoteRepository );
  158. Configuration configuration = getArchivaConfiguration().getConfiguration();
  159. configuration.addRemoteRepository( remoteRepositoryConfiguration );
  160. saveConfiguration( configuration );
  161. return Boolean.TRUE;
  162. }
  163. public Boolean deleteRemoteRepository( String repositoryId, AuditInformation auditInformation )
  164. throws RepositoryAdminException
  165. {
  166. triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_REMOTE_REPO, auditInformation );
  167. Configuration configuration = getArchivaConfiguration().getConfiguration();
  168. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  169. configuration.getRemoteRepositoriesAsMap().get( repositoryId );
  170. if ( remoteRepositoryConfiguration == null )
  171. {
  172. throw new RepositoryAdminException(
  173. "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
  174. }
  175. configuration.removeRemoteRepository( remoteRepositoryConfiguration );
  176. // TODO use ProxyConnectorAdmin interface ?
  177. // [MRM-520] Proxy Connectors are not deleted with the deletion of a Repository.
  178. List<ProxyConnectorConfiguration> proxyConnectors = new ArrayList<>( configuration.getProxyConnectors() );
  179. for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
  180. {
  181. if ( StringUtils.equals( proxyConnector.getTargetRepoId(), repositoryId ) )
  182. {
  183. configuration.removeProxyConnector( proxyConnector );
  184. }
  185. }
  186. saveConfiguration( configuration );
  187. return Boolean.TRUE;
  188. }
  189. public Boolean updateRemoteRepository( RemoteRepository remoteRepository, AuditInformation auditInformation )
  190. throws RepositoryAdminException
  191. {
  192. String repositoryId = remoteRepository.getId();
  193. triggerAuditEvent( repositoryId, null, AuditEvent.MODIFY_REMOTE_REPO, auditInformation );
  194. // update means : remove and add
  195. Configuration configuration = getArchivaConfiguration().getConfiguration();
  196. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  197. configuration.getRemoteRepositoriesAsMap().get( repositoryId );
  198. if ( remoteRepositoryConfiguration == null )
  199. {
  200. throw new RepositoryAdminException(
  201. "remoteRepository with id " + repositoryId + " not exist cannot remove it" );
  202. }
  203. configuration.removeRemoteRepository( remoteRepositoryConfiguration );
  204. remoteRepositoryConfiguration = getRemoteRepositoryConfiguration( remoteRepository );
  205. configuration.addRemoteRepository( remoteRepositoryConfiguration );
  206. saveConfiguration( configuration );
  207. return Boolean.TRUE;
  208. }
  209. public Map<String, RemoteRepository> getRemoteRepositoriesAsMap()
  210. throws RepositoryAdminException
  211. {
  212. java.util.Map<String, RemoteRepository> map = new HashMap<String, RemoteRepository>();
  213. for ( RemoteRepository repo : getRemoteRepositories() )
  214. {
  215. map.put( repo.getId(), repo );
  216. }
  217. return map;
  218. }
  219. public IndexingContext createIndexContext( RemoteRepository remoteRepository )
  220. throws RepositoryAdminException
  221. {
  222. try
  223. {
  224. String appServerBase = getRegistry().getString( "appserver.base" );
  225. String contextKey = "remote-" + remoteRepository.getId();
  226. IndexingContext indexingContext = indexer.getIndexingContexts().get( contextKey );
  227. if ( indexingContext != null )
  228. {
  229. return indexingContext;
  230. }
  231. // create remote repository path
  232. File repoDir = new File( appServerBase, "data/remotes/" + remoteRepository.getId() );
  233. if ( !repoDir.exists() )
  234. {
  235. repoDir.mkdirs();
  236. }
  237. File indexDirectory = null;
  238. // is there configured indexDirectory ?
  239. String indexDirectoryPath = remoteRepository.getIndexDirectory();
  240. if ( StringUtils.isNotBlank( indexDirectoryPath ) )
  241. {
  242. if ( new File( indexDirectoryPath ).isAbsolute() )
  243. {
  244. indexDirectory = new File( indexDirectoryPath );
  245. }
  246. else
  247. {
  248. indexDirectory = new File( repoDir, indexDirectoryPath );
  249. }
  250. }
  251. // if not configured use a default value
  252. if ( indexDirectory == null )
  253. {
  254. indexDirectory = new File( repoDir, ".index" );
  255. }
  256. if ( !indexDirectory.exists() )
  257. {
  258. indexDirectory.mkdirs();
  259. }
  260. return indexer.addIndexingContext( contextKey, remoteRepository.getId(), repoDir, indexDirectory,
  261. remoteRepository.getUrl(), calculateIndexRemoteUrl( remoteRepository ),
  262. mavenIndexerUtils.getAllIndexCreators() );
  263. }
  264. catch ( MalformedURLException e )
  265. {
  266. throw new RepositoryAdminException( e.getMessage(), e );
  267. }
  268. catch ( IOException e )
  269. {
  270. throw new RepositoryAdminException( e.getMessage(), e );
  271. }
  272. catch ( UnsupportedExistingLuceneIndexException e )
  273. {
  274. throw new RepositoryAdminException( e.getMessage(), e );
  275. }
  276. }
  277. protected String calculateIndexRemoteUrl( RemoteRepository remoteRepository )
  278. {
  279. if ( StringUtils.startsWith( remoteRepository.getRemoteIndexUrl(), "http" ) )
  280. {
  281. String baseUrl = remoteRepository.getRemoteIndexUrl();
  282. return baseUrl.endsWith( "/" ) ? StringUtils.substringBeforeLast( baseUrl, "/" ) : baseUrl;
  283. }
  284. String baseUrl = StringUtils.endsWith( remoteRepository.getUrl(), "/" ) ? StringUtils.substringBeforeLast(
  285. remoteRepository.getUrl(), "/" ) : remoteRepository.getUrl();
  286. baseUrl = StringUtils.isEmpty( remoteRepository.getRemoteIndexUrl() )
  287. ? baseUrl + "/.index"
  288. : baseUrl + "/" + remoteRepository.getRemoteIndexUrl();
  289. return baseUrl;
  290. }
  291. private RemoteRepositoryConfiguration getRemoteRepositoryConfiguration( RemoteRepository remoteRepository )
  292. {
  293. RemoteRepositoryConfiguration remoteRepositoryConfiguration = new RemoteRepositoryConfiguration();
  294. remoteRepositoryConfiguration.setId( remoteRepository.getId() );
  295. remoteRepositoryConfiguration.setPassword( remoteRepository.getPassword() );
  296. remoteRepositoryConfiguration.setTimeout( remoteRepository.getTimeout() );
  297. remoteRepositoryConfiguration.setUrl( remoteRepository.getUrl() );
  298. remoteRepositoryConfiguration.setUsername( remoteRepository.getUserName() );
  299. remoteRepositoryConfiguration.setLayout( remoteRepository.getLayout() );
  300. remoteRepositoryConfiguration.setName( remoteRepository.getName() );
  301. remoteRepositoryConfiguration.setDownloadRemoteIndex( remoteRepository.isDownloadRemoteIndex() );
  302. remoteRepositoryConfiguration.setRemoteIndexUrl( remoteRepository.getRemoteIndexUrl() );
  303. remoteRepositoryConfiguration.setRefreshCronExpression( remoteRepository.getCronExpression() );
  304. remoteRepositoryConfiguration.setIndexDir( remoteRepository.getIndexDirectory() );
  305. remoteRepositoryConfiguration.setRemoteDownloadNetworkProxyId(
  306. remoteRepository.getRemoteDownloadNetworkProxyId() );
  307. remoteRepositoryConfiguration.setRemoteDownloadTimeout( remoteRepository.getRemoteDownloadTimeout() );
  308. remoteRepositoryConfiguration.setDownloadRemoteIndexOnStartup(
  309. remoteRepository.isDownloadRemoteIndexOnStartup() );
  310. remoteRepositoryConfiguration.setDescription( remoteRepository.getDescription() );
  311. remoteRepositoryConfiguration.setExtraHeaders( remoteRepository.getExtraHeaders() );
  312. remoteRepositoryConfiguration.setExtraParameters( remoteRepository.getExtraParameters() );
  313. return remoteRepositoryConfiguration;
  314. }
  315. }