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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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.remote.RemoteRepositoryAdmin;
  23. import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
  24. import org.apache.archiva.common.utils.PathUtil;
  25. import org.apache.archiva.configuration.Configuration;
  26. import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
  27. import org.apache.archiva.configuration.RepositoryCheckPath;
  28. import org.apache.archiva.indexer.UnsupportedBaseContextException;
  29. import org.apache.archiva.metadata.model.facets.AuditEvent;
  30. import org.apache.archiva.repository.base.PasswordCredentials;
  31. import org.apache.archiva.repository.RemoteRepository;
  32. import org.apache.archiva.repository.RepositoryCredentials;
  33. import org.apache.archiva.repository.RepositoryException;
  34. import org.apache.archiva.repository.RepositoryRegistry;
  35. import org.apache.archiva.repository.features.IndexCreationFeature;
  36. import org.apache.archiva.repository.features.RemoteIndexFeature;
  37. import org.apache.commons.lang3.StringUtils;
  38. import org.apache.maven.index.context.IndexingContext;
  39. import org.springframework.stereotype.Service;
  40. import javax.annotation.PostConstruct;
  41. import javax.inject.Inject;
  42. import java.util.HashMap;
  43. import java.util.List;
  44. import java.util.Map;
  45. import java.util.stream.Collectors;
  46. /**
  47. * @author Olivier Lamy
  48. * @since 1.4-M1
  49. */
  50. @Service("remoteRepositoryAdmin#default")
  51. public class DefaultRemoteRepositoryAdmin
  52. extends AbstractRepositoryAdmin
  53. implements RemoteRepositoryAdmin
  54. {
  55. @Inject
  56. RepositoryRegistry repositoryRegistry;
  57. @PostConstruct
  58. private void initialize()
  59. throws RepositoryAdminException
  60. {
  61. for ( org.apache.archiva.admin.model.beans.RemoteRepository remoteRepository : getRemoteRepositories() )
  62. {
  63. createIndexContext( remoteRepository );
  64. }
  65. }
  66. /*
  67. * Conversion between the repository from the registry and the serialized DTO for the admin API
  68. */
  69. private org.apache.archiva.admin.model.beans.RemoteRepository convertRepo( RemoteRepository repo ) {
  70. if (repo==null) {
  71. return null;
  72. }
  73. org.apache.archiva.admin.model.beans.RemoteRepository adminRepo = new org.apache.archiva.admin.model.beans.RemoteRepository( getArchivaConfiguration().getDefaultLocale() );
  74. setBaseRepoAttributes( adminRepo, repo );
  75. adminRepo.setUrl( convertUriToString( repo.getLocation() ));
  76. adminRepo.setCronExpression( repo.getSchedulingDefinition() );
  77. adminRepo.setCheckPath( repo.getCheckPath() );
  78. adminRepo.setExtraHeaders( repo.getExtraHeaders() );
  79. adminRepo.setExtraParameters( repo.getExtraParameters() );
  80. adminRepo.setTimeout( (int) repo.getTimeout().getSeconds() );
  81. RepositoryCredentials creds = repo.getLoginCredentials();
  82. if (creds!=null && creds instanceof PasswordCredentials) {
  83. PasswordCredentials pCreds = (PasswordCredentials) creds;
  84. adminRepo.setUserName( pCreds.getUsername() );
  85. adminRepo.setPassword( new String(pCreds.getPassword()!=null ? pCreds.getPassword() : new char[0]) );
  86. }
  87. if (repo.supportsFeature( RemoteIndexFeature.class )) {
  88. RemoteIndexFeature rif = repo.getFeature( RemoteIndexFeature.class ).get();
  89. adminRepo.setRemoteIndexUrl( convertUriToString( rif.getIndexUri() ) );
  90. adminRepo.setDownloadRemoteIndex( rif.isDownloadRemoteIndex() );
  91. adminRepo.setRemoteDownloadNetworkProxyId( rif.getProxyId() );
  92. adminRepo.setDownloadRemoteIndexOnStartup( rif.isDownloadRemoteIndexOnStartup() );
  93. adminRepo.setRemoteDownloadTimeout( (int) rif.getDownloadTimeout().getSeconds() );
  94. }
  95. if (repo.supportsFeature(IndexCreationFeature.class)) {
  96. IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
  97. adminRepo.setIndexDirectory(PathUtil.getPathFromUri(icf.getIndexPath()).toString());
  98. }
  99. adminRepo.setDescription(repo.getDescription());
  100. return adminRepo;
  101. }
  102. private RemoteRepositoryConfiguration getRepositoryConfiguration( org.apache.archiva.admin.model.beans.RemoteRepository repo) {
  103. RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration();
  104. setBaseRepoAttributes( repoConfig, repo );
  105. repoConfig.setUrl( getRepositoryCommonValidator().removeExpressions( repo.getUrl() ) );
  106. repoConfig.setRefreshCronExpression( repo.getCronExpression() );
  107. repoConfig.setCheckPath( repo.getCheckPath() );
  108. repoConfig.setExtraHeaders( repo.getExtraHeaders() );
  109. repoConfig.setExtraParameters( repo.getExtraParameters() );
  110. repoConfig.setUsername( repo.getUserName() );
  111. repoConfig.setPassword( repo.getPassword() );
  112. repoConfig.setTimeout( repo.getTimeout() );
  113. repoConfig.setRemoteIndexUrl( repo.getRemoteIndexUrl() );
  114. repoConfig.setDownloadRemoteIndex( repo.isDownloadRemoteIndex() );
  115. repoConfig.setRemoteDownloadNetworkProxyId( repo.getRemoteDownloadNetworkProxyId() );
  116. repoConfig.setDownloadRemoteIndexOnStartup( repo.isDownloadRemoteIndexOnStartup() );
  117. repoConfig.setRemoteDownloadTimeout( repo.getRemoteDownloadTimeout() );
  118. repoConfig.setDescription(repo.getDescription());
  119. repoConfig.setIndexDir(repo.getIndexDirectory());
  120. return repoConfig;
  121. }
  122. @Override
  123. public List<org.apache.archiva.admin.model.beans.RemoteRepository> getRemoteRepositories()
  124. throws RepositoryAdminException
  125. {
  126. return repositoryRegistry.getRemoteRepositories().stream().map( repo -> convertRepo( repo ) ).collect( Collectors.toList());
  127. }
  128. @Override
  129. public org.apache.archiva.admin.model.beans.RemoteRepository getRemoteRepository( String repositoryId )
  130. throws RepositoryAdminException
  131. {
  132. return convertRepo( repositoryRegistry.getRemoteRepository( repositoryId ));
  133. }
  134. @Override
  135. public Boolean addRemoteRepository( org.apache.archiva.admin.model.beans.RemoteRepository remoteRepository, AuditInformation auditInformation )
  136. throws RepositoryAdminException
  137. {
  138. triggerAuditEvent( remoteRepository.getId(), null, AuditEvent.ADD_REMOTE_REPO, auditInformation );
  139. getRepositoryCommonValidator().basicValidation( remoteRepository, false );
  140. //TODO we can validate it's a good uri/url
  141. if ( StringUtils.isEmpty( remoteRepository.getUrl() ) )
  142. {
  143. throw new RepositoryAdminException( "url cannot be null" );
  144. }
  145. //MRM-752 - url needs trimming
  146. //MRM-1940 - URL should not end with a slash
  147. remoteRepository.setUrl( StringUtils.stripEnd(StringUtils.trim( remoteRepository.getUrl() ), "/"));
  148. if (StringUtils.isEmpty(remoteRepository.getCheckPath())) {
  149. String checkUrl = remoteRepository.getUrl().toLowerCase();
  150. for (RepositoryCheckPath path : getArchivaConfiguration ().getConfiguration().getArchivaDefaultConfiguration().getDefaultCheckPaths()) {
  151. log.debug("Checking path for urls: {} <-> {}", checkUrl, path.getUrl());
  152. if (checkUrl.startsWith(path.getUrl())) {
  153. remoteRepository.setCheckPath(path.getPath());
  154. break;
  155. }
  156. }
  157. }
  158. Configuration configuration = getArchivaConfiguration().getConfiguration();
  159. RemoteRepositoryConfiguration remoteRepositoryConfiguration =
  160. getRepositoryConfiguration( remoteRepository );
  161. log.debug("Adding remote repo {}", remoteRepositoryConfiguration);
  162. try
  163. {
  164. repositoryRegistry.putRepository( remoteRepositoryConfiguration, configuration );
  165. }
  166. catch ( RepositoryException e )
  167. {
  168. log.error("Could not add remote repository {}: {}", remoteRepositoryConfiguration.getId(), e.getMessage(), e);
  169. throw new RepositoryAdminException( "Adding of remote repository failed"+(e.getMessage()==null?"":": "+e.getMessage()) );
  170. }
  171. saveConfiguration( configuration );
  172. return Boolean.TRUE;
  173. }
  174. @Override
  175. public Boolean deleteRemoteRepository( String repositoryId, AuditInformation auditInformation )
  176. throws RepositoryAdminException
  177. {
  178. triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_REMOTE_REPO, auditInformation );
  179. Configuration configuration = getArchivaConfiguration().getConfiguration();
  180. RemoteRepository repo = repositoryRegistry.getRemoteRepository( repositoryId );
  181. if (repo==null) {
  182. throw new RepositoryAdminException( "Could not delete repository "+repositoryId+". The repository does not exist." );
  183. }
  184. try
  185. {
  186. repositoryRegistry.removeRepository( repo, configuration );
  187. }
  188. catch ( RepositoryException e )
  189. {
  190. log.error("Deletion of remote repository failed {}: {}", repo.getId(), e.getMessage(), e);
  191. throw new RepositoryAdminException( "Could not delete remote repository"+(e.getMessage()==null?"":": "+e.getMessage()) );
  192. }
  193. saveConfiguration( configuration );
  194. return Boolean.TRUE;
  195. }
  196. @Override
  197. public Boolean updateRemoteRepository( org.apache.archiva.admin.model.beans.RemoteRepository remoteRepository, AuditInformation auditInformation )
  198. throws RepositoryAdminException
  199. {
  200. String repositoryId = remoteRepository.getId();
  201. triggerAuditEvent( repositoryId, null, AuditEvent.MODIFY_REMOTE_REPO, auditInformation );
  202. // update means : remove and add
  203. Configuration configuration = getArchivaConfiguration().getConfiguration();
  204. RemoteRepositoryConfiguration remoteRepositoryConfiguration = getRepositoryConfiguration( remoteRepository );
  205. try
  206. {
  207. repositoryRegistry.putRepository( remoteRepositoryConfiguration, configuration );
  208. }
  209. catch ( RepositoryException e )
  210. {
  211. log.error("Could not update remote repository {}: {}", remoteRepositoryConfiguration.getId(), e.getMessage(), e);
  212. throw new RepositoryAdminException( "Update of remote repository failed"+(e.getMessage()==null?"":": "+e.getMessage()) );
  213. }
  214. saveConfiguration( configuration );
  215. return Boolean.TRUE;
  216. }
  217. @Override
  218. public Map<String, org.apache.archiva.admin.model.beans.RemoteRepository> getRemoteRepositoriesAsMap()
  219. throws RepositoryAdminException
  220. {
  221. java.util.Map<String, org.apache.archiva.admin.model.beans.RemoteRepository> map = new HashMap<>();
  222. for ( org.apache.archiva.admin.model.beans.RemoteRepository repo : getRemoteRepositories() )
  223. {
  224. map.put( repo.getId(), repo );
  225. }
  226. return map;
  227. }
  228. @Override
  229. public IndexingContext createIndexContext( org.apache.archiva.admin.model.beans.RemoteRepository remoteRepository )
  230. throws RepositoryAdminException
  231. {
  232. try
  233. {
  234. RemoteRepository repo = repositoryRegistry.getRemoteRepository(remoteRepository.getId());
  235. return repo.getIndexingContext().getBaseContext(IndexingContext.class);
  236. } catch (UnsupportedBaseContextException e) {
  237. throw new RepositoryAdminException( e.getMessage(), e);
  238. }
  239. }
  240. }