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.

DefaultMergeRepositoriesService.java 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package org.apache.archiva.rest.services;
  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.common.utils.VersionUtil;
  21. import org.apache.archiva.maven2.model.Artifact;
  22. import org.apache.archiva.metadata.model.ArtifactMetadata;
  23. import org.apache.archiva.metadata.model.facets.AuditEvent;
  24. import org.apache.archiva.metadata.repository.MetadataRepository;
  25. import org.apache.archiva.metadata.repository.MetadataRepositoryException;
  26. import org.apache.archiva.metadata.repository.RepositorySession;
  27. import org.apache.archiva.filter.Filter;
  28. import org.apache.archiva.filter.IncludesFilter;
  29. import org.apache.archiva.repository.ReleaseScheme;
  30. import org.apache.archiva.repository.Repository;
  31. import org.apache.archiva.repository.RepositoryNotFoundException;
  32. import org.apache.archiva.repository.RepositoryRegistry;
  33. import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
  34. import org.apache.archiva.rest.api.services.MergeRepositoriesService;
  35. import org.apache.archiva.stagerepository.merge.RepositoryMerger;
  36. import org.apache.archiva.stagerepository.merge.RepositoryMergerException;
  37. import org.springframework.stereotype.Service;
  38. import javax.inject.Inject;
  39. import java.util.ArrayList;
  40. import java.util.List;
  41. /**
  42. * @author Olivier Lamy
  43. * @since 1.4-M3
  44. */
  45. @Service ( "mergeRepositoriesService#rest" )
  46. public class DefaultMergeRepositoriesService
  47. extends AbstractRestService
  48. implements MergeRepositoriesService
  49. {
  50. // FIXME check archiva-merge-repository to sourceRepoId
  51. @Inject
  52. private List<RepositoryMerger> repositoryMerger;
  53. @Inject
  54. private RepositoryRegistry repositoryRegistry;
  55. @Override
  56. public List<Artifact> getMergeConflictedArtifacts( String sourceRepositoryId, String targetRepositoryId )
  57. throws ArchivaRestServiceException
  58. {
  59. RepositorySession repositorySession = null;
  60. try
  61. {
  62. repositorySession = repositorySessionFactory.createSession();
  63. }
  64. catch ( MetadataRepositoryException e )
  65. {
  66. log.error( "Error while creating repository session {}", e.getMessage( ), e );
  67. }
  68. try
  69. {
  70. RepositoryMerger merger = findMerger( sourceRepositoryId );
  71. List<ArtifactMetadata> artifactMetadatas =
  72. merger.getConflictingArtifacts( repositorySession.getRepository(), sourceRepositoryId,
  73. targetRepositoryId );
  74. return buildArtifacts( artifactMetadatas, sourceRepositoryId );
  75. }
  76. catch ( RepositoryMergerException | RepositoryNotFoundException e )
  77. {
  78. throw new ArchivaRestServiceException( e.getMessage(), e );
  79. }
  80. finally
  81. {
  82. repositorySession.close();
  83. }
  84. }
  85. RepositoryMerger findMerger(String repositoryId) throws RepositoryNotFoundException
  86. {
  87. Repository repo = repositoryRegistry.getRepository( repositoryId );
  88. if (repo==null) {
  89. throw new RepositoryNotFoundException( repositoryId );
  90. } else {
  91. return repositoryMerger.stream( ).filter( m -> m.supportsRepository( repo.getType( ) ) ).findFirst().get();
  92. }
  93. }
  94. @Override
  95. public void mergeRepositories( String sourceRepositoryId, String targetRepositoryId, boolean skipConflicts )
  96. throws ArchivaRestServiceException
  97. {
  98. try
  99. {
  100. RepositoryMerger merger = findMerger( sourceRepositoryId );
  101. if ( skipConflicts )
  102. {
  103. mergeBySkippingConflicts( merger, sourceRepositoryId, targetRepositoryId );
  104. }
  105. else
  106. {
  107. doMerge( merger, sourceRepositoryId, targetRepositoryId );
  108. }
  109. }
  110. catch ( RepositoryMergerException | RepositoryNotFoundException e )
  111. {
  112. throw new ArchivaRestServiceException( e.getMessage(), e );
  113. }
  114. }
  115. protected void doMerge( RepositoryMerger merger, String sourceRepositoryId, String targetRepositoryId )
  116. throws RepositoryMergerException, ArchivaRestServiceException
  117. {
  118. RepositorySession repositorySession = null;
  119. try
  120. {
  121. repositorySession = repositorySessionFactory.createSession();
  122. }
  123. catch ( MetadataRepositoryException e )
  124. {
  125. e.printStackTrace( );
  126. }
  127. try
  128. {
  129. org.apache.archiva.repository.ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(targetRepositoryId);
  130. MetadataRepository metadataRepository = repositorySession.getRepository();
  131. List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts(repositorySession , sourceRepositoryId );
  132. if ( managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE) && !managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT) )
  133. {
  134. mergeWithOutSnapshots(merger, metadataRepository, sourceArtifacts, sourceRepositoryId, targetRepositoryId );
  135. }
  136. else
  137. {
  138. merger.merge( metadataRepository, sourceRepositoryId, targetRepositoryId );
  139. for ( ArtifactMetadata metadata : sourceArtifacts )
  140. {
  141. triggerAuditEvent( targetRepositoryId, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  142. }
  143. }
  144. doScanRepository( targetRepositoryId, false );
  145. }
  146. catch ( MetadataRepositoryException e )
  147. {
  148. throw new ArchivaRestServiceException( e.getMessage(), e );
  149. } finally
  150. {
  151. repositorySession.close();
  152. }
  153. }
  154. private void mergeBySkippingConflicts( RepositoryMerger merger, String sourceRepositoryId, String targetRepositoryId )
  155. throws RepositoryMergerException, ArchivaRestServiceException
  156. {
  157. RepositorySession repositorySession = null;
  158. try
  159. {
  160. repositorySession = repositorySessionFactory.createSession();
  161. }
  162. catch ( MetadataRepositoryException e )
  163. {
  164. e.printStackTrace( );
  165. }
  166. try
  167. {
  168. List<ArtifactMetadata> conflictSourceArtifacts =
  169. merger.getConflictingArtifacts( repositorySession.getRepository(), sourceRepositoryId,
  170. targetRepositoryId );
  171. MetadataRepository metadataRepository = repositorySession.getRepository();
  172. List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts(repositorySession , sourceRepositoryId );
  173. sourceArtifacts.removeAll( conflictSourceArtifacts );
  174. org.apache.archiva.repository.ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(targetRepositoryId);
  175. if ( managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE) && !managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT))
  176. {
  177. mergeWithOutSnapshots( merger, metadataRepository, sourceArtifacts, sourceRepositoryId, targetRepositoryId );
  178. }
  179. else
  180. {
  181. Filter<ArtifactMetadata> artifactsWithOutConflicts =
  182. new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
  183. merger.merge( metadataRepository, sourceRepositoryId, targetRepositoryId,
  184. artifactsWithOutConflicts );
  185. for ( ArtifactMetadata metadata : sourceArtifacts )
  186. {
  187. triggerAuditEvent( targetRepositoryId, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  188. }
  189. }
  190. doScanRepository( targetRepositoryId, false );
  191. }
  192. catch ( MetadataRepositoryException e )
  193. {
  194. throw new ArchivaRestServiceException( e.getMessage(), e );
  195. } finally
  196. {
  197. repositorySession.close();
  198. }
  199. }
  200. private void mergeWithOutSnapshots( RepositoryMerger merger, MetadataRepository metadataRepository, List<ArtifactMetadata> sourceArtifacts,
  201. String sourceRepoId, String repoid )
  202. throws RepositoryMergerException
  203. {
  204. List<ArtifactMetadata> artifactsWithOutSnapshots = new ArrayList<>();
  205. for ( ArtifactMetadata metadata : sourceArtifacts )
  206. {
  207. if ( VersionUtil.isSnapshot( metadata.getProjectVersion() ) )
  208. //if ( metadata.getProjectVersion().contains( VersionUtil.SNAPSHOT ) )
  209. {
  210. artifactsWithOutSnapshots.add( metadata );
  211. }
  212. else
  213. {
  214. triggerAuditEvent( repoid, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  215. }
  216. }
  217. sourceArtifacts.removeAll( artifactsWithOutSnapshots );
  218. Filter<ArtifactMetadata> artifactListWithOutSnapShots = new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
  219. merger.merge( metadataRepository, sourceRepoId, repoid, artifactListWithOutSnapShots );
  220. }
  221. }