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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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.rest.api.services.ArchivaRestServiceException;
  31. import org.apache.archiva.rest.api.services.MergeRepositoriesService;
  32. import org.apache.archiva.stagerepository.merge.Maven2RepositoryMerger;
  33. import org.apache.archiva.stagerepository.merge.RepositoryMergerException;
  34. import org.springframework.stereotype.Service;
  35. import javax.inject.Inject;
  36. import javax.inject.Named;
  37. import java.util.ArrayList;
  38. import java.util.List;
  39. /**
  40. * @author Olivier Lamy
  41. * @since 1.4-M3
  42. */
  43. @Service ( "mergeRepositoriesService#rest" )
  44. public class DefaultMergeRepositoriesService
  45. extends AbstractRestService
  46. implements MergeRepositoriesService
  47. {
  48. // FIXME check archiva-merge-repository to sourceRepoId
  49. @Inject
  50. @Named ( value = "repositoryMerger#maven2" )
  51. private Maven2RepositoryMerger repositoryMerger;
  52. @Override
  53. public List<Artifact> getMergeConflictedArtifacts( String sourceRepositoryId, String targetRepositoryId )
  54. throws ArchivaRestServiceException
  55. {
  56. RepositorySession repositorySession = repositorySessionFactory.createSession();
  57. try
  58. {
  59. List<ArtifactMetadata> artifactMetadatas =
  60. repositoryMerger.getConflictingArtifacts( repositorySession.getRepository(), sourceRepositoryId,
  61. targetRepositoryId );
  62. return buildArtifacts( artifactMetadatas, sourceRepositoryId );
  63. }
  64. catch ( RepositoryMergerException e )
  65. {
  66. throw new ArchivaRestServiceException( e.getMessage(), e );
  67. }
  68. finally
  69. {
  70. repositorySession.close();
  71. }
  72. }
  73. @Override
  74. public void mergeRepositories( String sourceRepositoryId, String targetRepositoryId, boolean skipConflicts )
  75. throws ArchivaRestServiceException
  76. {
  77. try
  78. {
  79. if ( skipConflicts )
  80. {
  81. mergeBySkippingConflicts( sourceRepositoryId, targetRepositoryId );
  82. }
  83. else
  84. {
  85. doMerge( sourceRepositoryId, targetRepositoryId );
  86. }
  87. }
  88. catch ( RepositoryMergerException e )
  89. {
  90. throw new ArchivaRestServiceException( e.getMessage(), e );
  91. }
  92. }
  93. protected void doMerge( String sourceRepositoryId, String targetRepositoryId )
  94. throws RepositoryMergerException, ArchivaRestServiceException
  95. {
  96. RepositorySession repositorySession = repositorySessionFactory.createSession();
  97. try
  98. {
  99. org.apache.archiva.repository.ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(targetRepositoryId);
  100. MetadataRepository metadataRepository = repositorySession.getRepository();
  101. List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts( sourceRepositoryId );
  102. if ( managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE) && !managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT) )
  103. {
  104. mergeWithOutSnapshots( metadataRepository, sourceArtifacts, sourceRepositoryId, targetRepositoryId );
  105. }
  106. else
  107. {
  108. repositoryMerger.merge( metadataRepository, sourceRepositoryId, targetRepositoryId );
  109. for ( ArtifactMetadata metadata : sourceArtifacts )
  110. {
  111. triggerAuditEvent( targetRepositoryId, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  112. }
  113. }
  114. doScanRepository( targetRepositoryId, false );
  115. }
  116. catch ( MetadataRepositoryException e )
  117. {
  118. throw new ArchivaRestServiceException( e.getMessage(), e );
  119. } finally
  120. {
  121. repositorySession.close();
  122. }
  123. }
  124. public void mergeBySkippingConflicts( String sourceRepositoryId, String targetRepositoryId )
  125. throws RepositoryMergerException, ArchivaRestServiceException
  126. {
  127. RepositorySession repositorySession = repositorySessionFactory.createSession();
  128. try
  129. {
  130. List<ArtifactMetadata> conflictSourceArtifacts =
  131. repositoryMerger.getConflictingArtifacts( repositorySession.getRepository(), sourceRepositoryId,
  132. targetRepositoryId );
  133. MetadataRepository metadataRepository = repositorySession.getRepository();
  134. List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts( sourceRepositoryId );
  135. sourceArtifacts.removeAll( conflictSourceArtifacts );
  136. org.apache.archiva.repository.ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(targetRepositoryId);
  137. if ( managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE) && !managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT))
  138. {
  139. mergeWithOutSnapshots( metadataRepository, sourceArtifacts, sourceRepositoryId, targetRepositoryId );
  140. }
  141. else
  142. {
  143. Filter<ArtifactMetadata> artifactsWithOutConflicts =
  144. new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
  145. repositoryMerger.merge( metadataRepository, sourceRepositoryId, targetRepositoryId,
  146. artifactsWithOutConflicts );
  147. for ( ArtifactMetadata metadata : sourceArtifacts )
  148. {
  149. triggerAuditEvent( targetRepositoryId, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  150. }
  151. }
  152. doScanRepository( targetRepositoryId, false );
  153. }
  154. catch ( MetadataRepositoryException e )
  155. {
  156. throw new ArchivaRestServiceException( e.getMessage(), e );
  157. } finally
  158. {
  159. repositorySession.close();
  160. }
  161. }
  162. private void mergeWithOutSnapshots( MetadataRepository metadataRepository, List<ArtifactMetadata> sourceArtifacts,
  163. String sourceRepoId, String repoid )
  164. throws RepositoryMergerException
  165. {
  166. List<ArtifactMetadata> artifactsWithOutSnapshots = new ArrayList<>();
  167. for ( ArtifactMetadata metadata : sourceArtifacts )
  168. {
  169. if ( VersionUtil.isSnapshot( metadata.getProjectVersion() ) )
  170. //if ( metadata.getProjectVersion().contains( VersionUtil.SNAPSHOT ) )
  171. {
  172. artifactsWithOutSnapshots.add( metadata );
  173. }
  174. else
  175. {
  176. triggerAuditEvent( repoid, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  177. }
  178. }
  179. sourceArtifacts.removeAll( artifactsWithOutSnapshots );
  180. Filter<ArtifactMetadata> artifactListWithOutSnapShots = new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
  181. repositoryMerger.merge( metadataRepository, sourceRepoId, repoid, artifactListWithOutSnapShots );
  182. }
  183. }