PageRenderTime 49ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java

https://github.com/apache/maven
Java | 276 lines | 202 code | 47 blank | 27 comment | 21 complexity | ddd38900e45cfe91740409cde15b5e94 MD5 | raw file
Possible License(s): Apache-2.0
  1. package org.apache.maven.repository.internal;
  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 java.util.ArrayList;
  21. import java.util.Collections;
  22. import java.util.HashSet;
  23. import java.util.Iterator;
  24. import java.util.List;
  25. import java.util.Set;
  26. import org.apache.maven.model.Dependency;
  27. import org.apache.maven.model.Parent;
  28. import org.apache.maven.model.Repository;
  29. import org.apache.maven.model.building.ArtifactModelSource;
  30. import org.apache.maven.model.building.ModelSource;
  31. import org.apache.maven.model.resolution.InvalidRepositoryException;
  32. import org.apache.maven.model.resolution.ModelResolver;
  33. import org.apache.maven.model.resolution.UnresolvableModelException;
  34. import org.eclipse.aether.RepositorySystemSession;
  35. import org.eclipse.aether.RequestTrace;
  36. import org.eclipse.aether.artifact.Artifact;
  37. import org.eclipse.aether.artifact.DefaultArtifact;
  38. import org.eclipse.aether.impl.ArtifactResolver;
  39. import org.eclipse.aether.impl.RemoteRepositoryManager;
  40. import org.eclipse.aether.impl.VersionRangeResolver;
  41. import org.eclipse.aether.repository.RemoteRepository;
  42. import org.eclipse.aether.resolution.ArtifactRequest;
  43. import org.eclipse.aether.resolution.ArtifactResolutionException;
  44. import org.eclipse.aether.resolution.VersionRangeRequest;
  45. import org.eclipse.aether.resolution.VersionRangeResolutionException;
  46. import org.eclipse.aether.resolution.VersionRangeResult;
  47. /**
  48. * A model resolver to assist building of dependency POMs. This resolver gives priority to those repositories that have
  49. * been initially specified and repositories discovered in dependency POMs are recessively merged into the search chain.
  50. *
  51. * @author Benjamin Bentmann
  52. * @see DefaultArtifactDescriptorReader
  53. */
  54. class DefaultModelResolver
  55. implements ModelResolver
  56. {
  57. private final RepositorySystemSession session;
  58. private final RequestTrace trace;
  59. private final String context;
  60. private List<RemoteRepository> repositories;
  61. private final List<RemoteRepository> externalRepositories;
  62. private final ArtifactResolver resolver;
  63. private final VersionRangeResolver versionRangeResolver;
  64. private final RemoteRepositoryManager remoteRepositoryManager;
  65. private final Set<String> repositoryIds;
  66. DefaultModelResolver( RepositorySystemSession session, RequestTrace trace, String context,
  67. ArtifactResolver resolver, VersionRangeResolver versionRangeResolver,
  68. RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories )
  69. {
  70. this.session = session;
  71. this.trace = trace;
  72. this.context = context;
  73. this.resolver = resolver;
  74. this.versionRangeResolver = versionRangeResolver;
  75. this.remoteRepositoryManager = remoteRepositoryManager;
  76. this.repositories = repositories;
  77. this.externalRepositories = Collections.unmodifiableList( new ArrayList<>( repositories ) );
  78. this.repositoryIds = new HashSet<>();
  79. }
  80. private DefaultModelResolver( DefaultModelResolver original )
  81. {
  82. this.session = original.session;
  83. this.trace = original.trace;
  84. this.context = original.context;
  85. this.resolver = original.resolver;
  86. this.versionRangeResolver = original.versionRangeResolver;
  87. this.remoteRepositoryManager = original.remoteRepositoryManager;
  88. this.repositories = new ArrayList<>( original.repositories );
  89. this.externalRepositories = original.externalRepositories;
  90. this.repositoryIds = new HashSet<>( original.repositoryIds );
  91. }
  92. @Override
  93. public void addRepository( Repository repository )
  94. throws InvalidRepositoryException
  95. {
  96. addRepository( repository, false );
  97. }
  98. @Override
  99. public void addRepository( final Repository repository, boolean replace )
  100. throws InvalidRepositoryException
  101. {
  102. if ( session.isIgnoreArtifactDescriptorRepositories() )
  103. {
  104. return;
  105. }
  106. if ( !repositoryIds.add( repository.getId() ) )
  107. {
  108. if ( !replace )
  109. {
  110. return;
  111. }
  112. removeMatchingRepository( repositories, repository.getId() );
  113. }
  114. List<RemoteRepository> newRepositories =
  115. Collections.singletonList( ArtifactDescriptorUtils.toRemoteRepository( repository ) );
  116. this.repositories =
  117. remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true );
  118. }
  119. private static void removeMatchingRepository( Iterable<RemoteRepository> repositories, final String id )
  120. {
  121. Iterator<RemoteRepository> iterator = repositories.iterator();
  122. while ( iterator.hasNext() )
  123. {
  124. RemoteRepository remoteRepository = iterator.next();
  125. if ( remoteRepository.getId().equals( id ) )
  126. {
  127. iterator.remove();
  128. }
  129. }
  130. }
  131. @Override
  132. public ModelResolver newCopy()
  133. {
  134. return new DefaultModelResolver( this );
  135. }
  136. @Override
  137. public ModelSource resolveModel( String groupId, String artifactId, String version )
  138. throws UnresolvableModelException
  139. {
  140. Artifact pomArtifact = new DefaultArtifact( groupId, artifactId, "", "pom", version );
  141. try
  142. {
  143. ArtifactRequest request = new ArtifactRequest( pomArtifact, repositories, context );
  144. request.setTrace( trace );
  145. pomArtifact = resolver.resolveArtifact( session, request ).getArtifact();
  146. }
  147. catch ( ArtifactResolutionException e )
  148. {
  149. throw new UnresolvableModelException( e.getMessage(), groupId, artifactId, version, e );
  150. }
  151. return new ArtifactModelSource( pomArtifact.getFile(), groupId, artifactId, version );
  152. }
  153. @Override
  154. public ModelSource resolveModel( final Parent parent )
  155. throws UnresolvableModelException
  156. {
  157. try
  158. {
  159. final Artifact artifact = new DefaultArtifact( parent.getGroupId(), parent.getArtifactId(), "", "pom",
  160. parent.getVersion() );
  161. final VersionRangeRequest versionRangeRequest = new VersionRangeRequest( artifact, repositories, context );
  162. versionRangeRequest.setTrace( trace );
  163. final VersionRangeResult versionRangeResult =
  164. versionRangeResolver.resolveVersionRange( session, versionRangeRequest );
  165. if ( versionRangeResult.getHighestVersion() == null )
  166. {
  167. throw new UnresolvableModelException(
  168. String.format( "No versions matched the requested parent version range '%s'",
  169. parent.getVersion() ),
  170. parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
  171. }
  172. if ( versionRangeResult.getVersionConstraint() != null
  173. && versionRangeResult.getVersionConstraint().getRange() != null
  174. && versionRangeResult.getVersionConstraint().getRange().getUpperBound() == null )
  175. {
  176. // Message below is checked for in the MNG-2199 core IT.
  177. throw new UnresolvableModelException(
  178. String.format( "The requested parent version range '%s' does not specify an upper bound",
  179. parent.getVersion() ),
  180. parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
  181. }
  182. parent.setVersion( versionRangeResult.getHighestVersion().toString() );
  183. return resolveModel( parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
  184. }
  185. catch ( final VersionRangeResolutionException e )
  186. {
  187. throw new UnresolvableModelException( e.getMessage(), parent.getGroupId(), parent.getArtifactId(),
  188. parent.getVersion(), e );
  189. }
  190. }
  191. @Override
  192. public ModelSource resolveModel( final Dependency dependency )
  193. throws UnresolvableModelException
  194. {
  195. try
  196. {
  197. final Artifact artifact = new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), "",
  198. "pom", dependency.getVersion() );
  199. final VersionRangeRequest versionRangeRequest = new VersionRangeRequest( artifact, repositories, context );
  200. versionRangeRequest.setTrace( trace );
  201. final VersionRangeResult versionRangeResult =
  202. versionRangeResolver.resolveVersionRange( session, versionRangeRequest );
  203. if ( versionRangeResult.getHighestVersion() == null )
  204. {
  205. throw new UnresolvableModelException(
  206. String.format( "No versions matched the requested dependency version range '%s'",
  207. dependency.getVersion() ),
  208. dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
  209. }
  210. if ( versionRangeResult.getVersionConstraint() != null
  211. && versionRangeResult.getVersionConstraint().getRange() != null
  212. && versionRangeResult.getVersionConstraint().getRange().getUpperBound() == null )
  213. {
  214. // Message below is checked for in the MNG-4463 core IT.
  215. throw new UnresolvableModelException(
  216. String.format( "The requested dependency version range '%s' does not specify an upper bound",
  217. dependency.getVersion() ),
  218. dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
  219. }
  220. dependency.setVersion( versionRangeResult.getHighestVersion().toString() );
  221. return resolveModel( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
  222. }
  223. catch ( VersionRangeResolutionException e )
  224. {
  225. throw new UnresolvableModelException( e.getMessage(), dependency.getGroupId(), dependency.getArtifactId(),
  226. dependency.getVersion(), e );
  227. }
  228. }
  229. }