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.4KB

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