View Javadoc
1   package org.apache.maven.shared.transfer.repository.internal;
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.io.File;
23  
24  import org.apache.maven.RepositoryUtils;
25  import org.apache.maven.artifact.metadata.ArtifactMetadata;
26  import org.apache.maven.project.DefaultProjectBuildingRequest;
27  import org.apache.maven.project.ProjectBuildingRequest;
28  import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
29  import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
30  import org.eclipse.aether.DefaultRepositoryCache;
31  import org.eclipse.aether.DefaultRepositorySystemSession;
32  import org.eclipse.aether.RepositorySystem;
33  import org.eclipse.aether.RepositorySystemSession;
34  import org.eclipse.aether.artifact.Artifact;
35  import org.eclipse.aether.artifact.DefaultArtifact;
36  import org.eclipse.aether.metadata.DefaultMetadata;
37  import org.eclipse.aether.metadata.Metadata;
38  import org.eclipse.aether.metadata.Metadata.Nature;
39  import org.eclipse.aether.repository.LocalRepository;
40  import org.eclipse.aether.repository.LocalRepositoryManager;
41  
42  /**
43   * 
44   */
45  class Maven31RepositoryManager
46      implements MavenRepositoryManager
47  {
48      private final RepositorySystem repositorySystem;
49  
50      private final RepositorySystemSession session;
51  
52      Maven31RepositoryManager( RepositorySystem repositorySystem, 
53                                RepositorySystemSession session )
54      {
55          this.repositorySystem = repositorySystem;
56          this.session = session;
57      }
58  
59      @Override
60      public String getPathForLocalArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
61      {
62          Artifact aetherArtifact;
63  
64          // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
65          try
66          {
67              aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
68                                                          org.apache.maven.artifact.Artifact.class, mavenArtifact );
69          }
70          catch ( RepositoryManagerException e )
71          {
72              throw new RuntimeException( e.getMessage(), e );
73          }
74  
75          return session.getLocalRepositoryManager().getPathForLocalArtifact( aetherArtifact );
76      }
77  
78      @Override
79      public String getPathForLocalArtifact( ArtifactCoordinate coordinate )
80      {
81          Artifact aetherArtifact = toArtifact( coordinate );
82  
83          return session.getLocalRepositoryManager().getPathForLocalArtifact( aetherArtifact );
84      }
85      
86      @Override
87      public String getPathForLocalMetadata( ArtifactMetadata metadata )
88      {
89          Metadata aetherMetadata =
90              new DefaultMetadata( metadata.getGroupId(),
91                                   metadata.storedInGroupDirectory() ? null : metadata.getArtifactId(),
92                                   metadata.storedInArtifactVersionDirectory() ? metadata.getBaseVersion() : null,
93                                   "maven-metadata.xml", Nature.RELEASE_OR_SNAPSHOT );
94  
95          return session.getLocalRepositoryManager().getPathForLocalMetadata( aetherMetadata );
96      }
97  
98      @Override
99      public ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest, File basedir )
100     {
101         ProjectBuildingRequest newRequest = new DefaultProjectBuildingRequest( buildingRequest );
102 
103         RepositorySystemSession session;
104         try
105         {
106             session = Invoker.invoke( buildingRequest, "getRepositorySession" );
107         }
108         catch ( RepositoryManagerException e )
109         {
110             throw new RuntimeException( e.getMessage(), e );
111         }
112 
113         // "clone" session and replace localRepository
114         DefaultRepositorySystemSession newSession = new DefaultRepositorySystemSession( session );
115 
116         // Clear cache, since we're using a new local repository
117         newSession.setCache( new DefaultRepositoryCache() );
118 
119         // keep same repositoryType
120         String repositoryType = resolveRepositoryType( session.getLocalRepository() );
121 
122         LocalRepositoryManager localRepositoryManager =
123             repositorySystem.newLocalRepositoryManager( newSession, new LocalRepository( basedir, repositoryType ) );
124 
125         newSession.setLocalRepositoryManager( localRepositoryManager );
126 
127         try
128         {
129             Invoker.invoke( newRequest, "setRepositorySession", RepositorySystemSession.class, newSession );
130         }
131         catch ( RepositoryManagerException e )
132         {
133             throw new RuntimeException( e.getMessage(), e );
134         }
135 
136         return newRequest;
137     }
138 
139     @Override
140     public File getLocalRepositoryBasedir()
141     {
142         return session.getLocalRepository().getBasedir();
143     }
144 
145     /**
146      * @param localRepository {@link LocalRepository}
147      * @return the resolved type.
148      */
149     protected String resolveRepositoryType( LocalRepository localRepository )
150     {
151         String repositoryType;
152         if ( "enhanced".equals( localRepository.getContentType() ) )
153         {
154             repositoryType = "default";
155         }
156         else
157         {
158             // this should be "simple"
159             repositoryType = localRepository.getContentType();
160         }
161         return repositoryType;
162     }
163 
164     /**
165      * @param coordinate {@link ArtifactCoordinate}
166      * @return {@link Artifact}
167      */
168     protected Artifact toArtifact( ArtifactCoordinate coordinate )
169     {
170         if ( coordinate == null )
171         {
172             return null;
173         }
174 
175         Artifact result =
176             new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(),
177                                  coordinate.getExtension(), coordinate.getVersion() );
178 
179         return result;
180     }
181 }