View Javadoc
1   package org.eclipse.aether.internal.impl.collect;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   * 
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   * 
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.Collection;
23  import java.util.Collections;
24  import java.util.List;
25  
26  import org.eclipse.aether.DefaultRepositorySystemSession;
27  import org.eclipse.aether.RepositoryException;
28  import org.eclipse.aether.RepositorySystemSession;
29  import org.eclipse.aether.artifact.Artifact;
30  import org.eclipse.aether.artifact.ArtifactProperties;
31  import org.eclipse.aether.collection.VersionFilter;
32  import org.eclipse.aether.graph.DefaultDependencyNode;
33  import org.eclipse.aether.graph.Dependency;
34  import org.eclipse.aether.graph.DependencyNode;
35  import org.eclipse.aether.repository.ArtifactRepository;
36  import org.eclipse.aether.repository.RemoteRepository;
37  import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
38  import org.eclipse.aether.resolution.ArtifactDescriptorResult;
39  import org.eclipse.aether.resolution.VersionRangeRequest;
40  import org.eclipse.aether.resolution.VersionRangeResolutionException;
41  import org.eclipse.aether.resolution.VersionRangeResult;
42  import org.eclipse.aether.version.Version;
43  
44  /**
45   * Utility methods for dependency collection.
46   *
47   */
48  public class DependencyCollectionUtils
49  {
50  
51      @SuppressWarnings( "checkstyle:parameternumber" )
52      static DefaultDependencyNode addDependencyNode( DependencyNode parent, List<Artifact> relocations,
53                                                      PremanagedDependency preManaged, VersionRangeResult rangeResult,
54                                                      Version version, Dependency d, Collection<Artifact> aliases,
55                                                      List<RemoteRepository> repos, String requestContext )
56      {
57          DefaultDependencyNode child = new DefaultDependencyNode( d );
58          preManaged.applyTo( child );
59          child.setRelocations( relocations );
60          child.setVersionConstraint( rangeResult.getVersionConstraint() );
61          child.setVersion( version );
62          child.setAliases( aliases );
63          child.setRepositories( repos );
64          child.setRequestContext( requestContext );
65          parent.getChildren().add( child );
66          return child;
67      }
68  
69      @SuppressWarnings( "checkstyle:parameternumber" )
70      static DefaultDependencyNode createDependencyNode( DependencyNode parent, List<Artifact> relocations,
71                                                         PremanagedDependency preManaged, VersionRangeResult rangeResult,
72                                                         Version version, Dependency d,
73                                                         ArtifactDescriptorResult descriptorResult,
74                                                         DependencyNode cycleNode )
75      {
76          DefaultDependencyNode child =
77              addDependencyNode( parent, relocations, preManaged, rangeResult, version, d, descriptorResult.getAliases(),
78                                 cycleNode.getRepositories(), cycleNode.getRequestContext() );
79          child.setChildren( cycleNode.getChildren() );
80          return child;
81      }
82  
83      static ArtifactDescriptorRequest createArtifactDescriptorRequest( Args args, List<RemoteRepository> repositories,
84                                                                        Dependency d )
85      {
86          ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
87          descriptorRequest.setArtifact( d.getArtifact() );
88          descriptorRequest.setRepositories( repositories );
89          descriptorRequest.setRequestContext( args.request.getRequestContext() );
90          descriptorRequest.setTrace( args.trace );
91          return descriptorRequest;
92      }
93  
94      static VersionRangeRequest createVersionRangeRequest( Args args, List<RemoteRepository> repositories,
95                                                            Dependency dependency )
96      {
97          VersionRangeRequest rangeRequest = new VersionRangeRequest();
98          rangeRequest.setArtifact( dependency.getArtifact() );
99          rangeRequest.setRepositories( repositories );
100         rangeRequest.setRequestContext( args.request.getRequestContext() );
101         rangeRequest.setTrace( args.trace );
102         return rangeRequest;
103     }
104 
105     static boolean isLackingDescriptor( Artifact artifact )
106     {
107         return artifact.getProperty( ArtifactProperties.LOCAL_PATH, null ) != null;
108     }
109 
110     static List<RemoteRepository> getRemoteRepositories( ArtifactRepository repository,
111                                                          List<RemoteRepository> repositories )
112     {
113         if ( repository instanceof RemoteRepository )
114         {
115             return Collections.singletonList( (RemoteRepository) repository );
116         }
117         if ( repository != null )
118         {
119             return Collections.emptyList();
120         }
121         return repositories;
122     }
123 
124     static List<? extends Version> filterVersions( Dependency dependency, VersionRangeResult rangeResult,
125                                                    VersionFilter verFilter, DefaultVersionFilterContext verContext )
126         throws VersionRangeResolutionException
127     {
128         if ( rangeResult.getVersions().isEmpty() )
129         {
130             throw new VersionRangeResolutionException( rangeResult, "No versions available for "
131                 + dependency.getArtifact() + " within specified range" );
132         }
133 
134         List<? extends Version> versions;
135         if ( verFilter != null && rangeResult.getVersionConstraint().getRange() != null )
136         {
137             verContext.set( dependency, rangeResult );
138             try
139             {
140                 verFilter.filterVersions( verContext );
141             }
142             catch ( RepositoryException e )
143             {
144                 throw new VersionRangeResolutionException( rangeResult, "Failed to filter versions for "
145                     + dependency.getArtifact() + ": " + e.getMessage(), e );
146             }
147             versions = verContext.get();
148             if ( versions.isEmpty() )
149             {
150                 throw new VersionRangeResolutionException( rangeResult, "No acceptable versions for "
151                     + dependency.getArtifact() + ": " + rangeResult.getVersions() );
152             }
153         }
154         else
155         {
156             versions = rangeResult.getVersions();
157         }
158         return versions;
159     }
160 
161     static RepositorySystemSession optimizeSession( RepositorySystemSession session )
162     {
163         DefaultRepositorySystemSession optimized = new DefaultRepositorySystemSession( session );
164         optimized.setArtifactTypeRegistry( CachingArtifactTypeRegistry.newInstance( session ) );
165         return optimized;
166     }
167 
168     static String getId( Dependency d )
169     {
170         Artifact a = d.getArtifact();
171         return a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getClassifier() + ':' + a.getExtension();
172     }
173 }