View Javadoc
1   package org.apache.maven.report.projectinfo.dependencies;
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.ArrayList;
23  import java.util.List;
24  
25  import org.apache.maven.artifact.Artifact;
26  import org.apache.maven.artifact.ArtifactUtils;
27  import org.apache.maven.artifact.repository.ArtifactRepository;
28  import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
29  import org.apache.maven.plugin.logging.Log;
30  import org.apache.maven.project.DefaultProjectBuildingRequest;
31  import org.apache.maven.project.MavenProject;
32  import org.apache.maven.project.ProjectBuilder;
33  import org.apache.maven.project.ProjectBuildingException;
34  import org.apache.maven.project.ProjectBuildingRequest;
35  import org.apache.maven.repository.RepositorySystem;
36  import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
37  import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
38  import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
39  
40  /**
41   * Utility methods to play with repository.
42   *
43   * @version $Id$
44   * @since 2.1
45   */
46  public class RepositoryUtils
47  {
48      private final Log log;
49  
50      private final ProjectBuilder projectBuilder;
51  
52      private final RepositorySystem repositorySystem;
53  
54      private final List<ArtifactRepository> remoteRepositories;
55  
56      private final List<ArtifactRepository> pluginRepositories;
57  
58      private final ArtifactResolver resolver;
59  
60      private final ProjectBuildingRequest buildingRequest;
61  
62      /**
63       * @param log {@link Log}
64       * @param projectBuilder {@link ProjectBuilder}
65       * @param repositorySystem {@link RepositorySystem}
66       * @param resolver {@link ArtifactResolver}
67       * @param remoteRepositories {@link ArtifactRepository}
68       * @param pluginRepositories {@link ArtifactRepository}
69       * @param buildingRequest {@link ProjectBuildingRequest}
70       * @param repositoryMetadataManager {@link RepositoryMetadataManager}
71       */
72      public RepositoryUtils( Log log, ProjectBuilder projectBuilder, RepositorySystem repositorySystem,
73                              ArtifactResolver resolver, List<ArtifactRepository> remoteRepositories,
74                              List<ArtifactRepository> pluginRepositories, ProjectBuildingRequest buildingRequest,
75                              RepositoryMetadataManager repositoryMetadataManager )
76      {
77          this.log = log;
78          this.projectBuilder = projectBuilder;
79          this.repositorySystem = repositorySystem;
80          this.resolver = resolver;
81          this.remoteRepositories = remoteRepositories;
82          this.pluginRepositories = pluginRepositories;
83          this.buildingRequest = buildingRequest;
84      }
85  
86      /**
87       * @param artifact not null
88       * @throws ArtifactResolverException if any 
89       */
90      public void resolve( Artifact artifact )
91          throws ArtifactResolverException
92      {
93          List<ArtifactRepository> repos =
94              new ArrayList<>( pluginRepositories.size() + remoteRepositories.size() );
95          repos.addAll( pluginRepositories );
96          repos.addAll( remoteRepositories );
97  
98          ProjectBuildingRequest buildRequest = new DefaultProjectBuildingRequest( buildingRequest );
99          buildRequest.setRemoteRepositories( repos );
100 
101         ArtifactResult result = resolver.resolveArtifact( buildRequest , artifact );
102         artifact.setFile( result.getArtifact().getFile() );
103     }
104 
105     /**
106      * Get the <code>Maven project</code> from the repository depending the <code>Artifact</code> given.
107      *
108      * @param artifact an artifact
109      * @return the Maven project for the given artifact
110      * @throws ProjectBuildingException if any
111      */
112     public MavenProject getMavenProjectFromRepository( Artifact artifact )
113         throws ProjectBuildingException
114     {
115         Artifact projectArtifact = artifact;
116 
117         boolean allowStubModel = false;
118         if ( !"pom".equals( artifact.getType() ) )
119         {
120             projectArtifact = repositorySystem.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(),
121                                                              artifact.getVersion() );
122             allowStubModel = true;
123         }
124 
125         return projectBuilder.build( projectArtifact, allowStubModel, buildingRequest ).getProject();
126     }
127 
128     /**
129      * @param artifact not null
130      * @param repo not null
131      * @return the URL in the given repo for the given artifact. If it is a snapshot artifact, the version
132      * will be the timestamp and the build number from the metadata. Could return null if the repo is blacklisted.
133      */
134     public String getDependencyUrlFromRepository( Artifact artifact, ArtifactRepository repo )
135     {
136         if ( repo.isBlacklisted() )
137         {
138             return null;
139         }
140 
141         Artifact copyArtifact = ArtifactUtils.copyArtifact( artifact );
142         // Try to get the last artifact repo name depending the snapshot version
143         if ( ( artifact.isSnapshot() && repo.getSnapshots().isEnabled() ) )
144         {
145             if ( artifact.getBaseVersion().equals( artifact.getVersion() ) )
146             {
147                 // Try to resolve it if not already done
148                 if ( artifact.getMetadataList() == null || artifact.getMetadataList().isEmpty() )
149                 {
150                     try
151                     {
152                         resolve( artifact );
153                     }
154                     catch ( ArtifactResolverException e )
155                     {
156                         log.error( "Artifact: " + artifact.getId() + " could not be resolved." );
157                     }
158                 }
159             }
160         }
161 
162         return repo.getUrl() + "/" + repo.pathOf( copyArtifact );
163     }
164 }