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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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.metadata.model.facets.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. @Override
  54. public List<Artifact> getMergeConflictedArtifacts( String sourceRepositoryId, String targetRepositoryId )
  55. throws ArchivaRestServiceException
  56. {
  57. RepositorySession repositorySession = repositorySessionFactory.createSession();
  58. try
  59. {
  60. List<ArtifactMetadata> artifactMetadatas =
  61. repositoryMerger.getConflictingArtifacts( repositorySession.getRepository(), sourceRepositoryId,
  62. targetRepositoryId );
  63. return buildArtifacts( artifactMetadatas, sourceRepositoryId );
  64. }
  65. catch ( RepositoryMergerException e )
  66. {
  67. throw new ArchivaRestServiceException( e.getMessage(), e );
  68. }
  69. finally
  70. {
  71. repositorySession.close();
  72. }
  73. }
  74. @Override
  75. public void mergeRepositories( String sourceRepositoryId, String targetRepositoryId, boolean skipConflicts )
  76. throws ArchivaRestServiceException
  77. {
  78. try
  79. {
  80. if ( skipConflicts )
  81. {
  82. mergeBySkippingConflicts( sourceRepositoryId, targetRepositoryId );
  83. }
  84. else
  85. {
  86. doMerge( sourceRepositoryId, targetRepositoryId );
  87. }
  88. }
  89. catch ( RepositoryMergerException e )
  90. {
  91. throw new ArchivaRestServiceException( e.getMessage(), e );
  92. }
  93. }
  94. protected void doMerge( String sourceRepositoryId, String targetRepositoryId )
  95. throws RepositoryMergerException, ArchivaRestServiceException
  96. {
  97. RepositorySession repositorySession = repositorySessionFactory.createSession();
  98. try
  99. {
  100. ManagedRepository repository = managedRepositoryAdmin.getManagedRepository( targetRepositoryId );
  101. MetadataRepository metadataRepository = repositorySession.getRepository();
  102. List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts( sourceRepositoryId );
  103. if ( repository.isReleases() && !repository.isSnapshots() )
  104. {
  105. mergeWithOutSnapshots( metadataRepository, sourceArtifacts, sourceRepositoryId, targetRepositoryId );
  106. }
  107. else
  108. {
  109. repositoryMerger.merge( metadataRepository, sourceRepositoryId, targetRepositoryId );
  110. for ( ArtifactMetadata metadata : sourceArtifacts )
  111. {
  112. triggerAuditEvent( targetRepositoryId, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  113. }
  114. }
  115. doScanRepository( targetRepositoryId, false );
  116. }
  117. catch ( MetadataRepositoryException e )
  118. {
  119. throw new ArchivaRestServiceException( e.getMessage(), e );
  120. }
  121. catch ( RepositoryAdminException e )
  122. {
  123. throw new ArchivaRestServiceException( e.getMessage(), e );
  124. }
  125. finally
  126. {
  127. repositorySession.close();
  128. }
  129. }
  130. public void mergeBySkippingConflicts( String sourceRepositoryId, String targetRepositoryId )
  131. throws RepositoryMergerException, ArchivaRestServiceException
  132. {
  133. RepositorySession repositorySession = repositorySessionFactory.createSession();
  134. try
  135. {
  136. List<ArtifactMetadata> conflictSourceArtifacts =
  137. repositoryMerger.getConflictingArtifacts( repositorySession.getRepository(), sourceRepositoryId,
  138. targetRepositoryId );
  139. MetadataRepository metadataRepository = repositorySession.getRepository();
  140. List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts( sourceRepositoryId );
  141. sourceArtifacts.removeAll( conflictSourceArtifacts );
  142. ManagedRepository repository = managedRepositoryAdmin.getManagedRepository( targetRepositoryId );
  143. if ( repository.isReleases() && !repository.isSnapshots() )
  144. {
  145. mergeWithOutSnapshots( metadataRepository, sourceArtifacts, sourceRepositoryId, targetRepositoryId );
  146. }
  147. else
  148. {
  149. Filter<ArtifactMetadata> artifactsWithOutConflicts =
  150. new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
  151. repositoryMerger.merge( metadataRepository, sourceRepositoryId, targetRepositoryId,
  152. artifactsWithOutConflicts );
  153. for ( ArtifactMetadata metadata : sourceArtifacts )
  154. {
  155. triggerAuditEvent( targetRepositoryId, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  156. }
  157. }
  158. doScanRepository( targetRepositoryId, false );
  159. }
  160. catch ( MetadataRepositoryException e )
  161. {
  162. throw new ArchivaRestServiceException( e.getMessage(), e );
  163. }
  164. catch ( RepositoryAdminException e )
  165. {
  166. throw new ArchivaRestServiceException( e.getMessage(), e );
  167. }
  168. finally
  169. {
  170. repositorySession.close();
  171. }
  172. }
  173. private void mergeWithOutSnapshots( MetadataRepository metadataRepository, List<ArtifactMetadata> sourceArtifacts,
  174. String sourceRepoId, String repoid )
  175. throws RepositoryMergerException
  176. {
  177. List<ArtifactMetadata> artifactsWithOutSnapshots = new ArrayList<>();
  178. for ( ArtifactMetadata metadata : sourceArtifacts )
  179. {
  180. if ( VersionUtil.isSnapshot( metadata.getProjectVersion() ) )
  181. //if ( metadata.getProjectVersion().contains( VersionUtil.SNAPSHOT ) )
  182. {
  183. artifactsWithOutSnapshots.add( metadata );
  184. }
  185. else
  186. {
  187. triggerAuditEvent( repoid, metadata.getId(), AuditEvent.MERGING_REPOSITORIES );
  188. }
  189. }
  190. sourceArtifacts.removeAll( artifactsWithOutSnapshots );
  191. Filter<ArtifactMetadata> artifactListWithOutSnapShots = new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
  192. repositoryMerger.merge( metadataRepository, sourceRepoId, repoid, artifactListWithOutSnapShots );
  193. }
  194. }