1   package org.apache.maven.shared.io.location;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import java.util.List;
23  
24  import org.apache.maven.artifact.Artifact;
25  import org.apache.maven.artifact.factory.ArtifactFactory;
26  import org.apache.maven.artifact.repository.ArtifactRepository;
27  import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
28  import org.apache.maven.artifact.resolver.ArtifactResolutionException;
29  import org.apache.maven.artifact.resolver.ArtifactResolver;
30  import org.apache.maven.shared.io.logging.MessageHolder;
31  
32  
33  
34  
35  
36  public class ArtifactLocatorStrategy
37      implements LocatorStrategy
38  {
39      private final ArtifactFactory factory;
40  
41      private final ArtifactResolver resolver;
42  
43      private String defaultArtifactType = "jar";
44  
45      private final ArtifactRepository localRepository;
46  
47      private final List<ArtifactRepository> remoteRepositories;
48  
49      private String defaultClassifier = null;
50  
51      
52  
53  
54  
55  
56  
57      public ArtifactLocatorStrategy( ArtifactFactory factory, ArtifactResolver resolver,
58                                      ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
59      {
60          this.factory = factory;
61          this.resolver = resolver;
62          this.localRepository = localRepository;
63          this.remoteRepositories = remoteRepositories;
64      }
65  
66      
67  
68  
69  
70  
71  
72  
73      public ArtifactLocatorStrategy( ArtifactFactory factory, ArtifactResolver resolver,
74                                      ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
75                                      String defaultArtifactType )
76      {
77          this.factory = factory;
78          this.resolver = resolver;
79          this.localRepository = localRepository;
80          this.remoteRepositories = remoteRepositories;
81          this.defaultArtifactType = defaultArtifactType;
82      }
83  
84      
85  
86  
87  
88  
89  
90  
91  
92      public ArtifactLocatorStrategy( ArtifactFactory factory, ArtifactResolver resolver,
93                                      ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
94                                      String defaultArtifactType, String defaultClassifier )
95      {
96          this.factory = factory;
97          this.resolver = resolver;
98          this.localRepository = localRepository;
99          this.remoteRepositories = remoteRepositories;
100         this.defaultArtifactType = defaultArtifactType;
101         this.defaultClassifier = defaultClassifier;
102     }
103 
104     
105 
106 
107 
108 
109 
110 
111 
112     public Location resolve( String locationSpecification, MessageHolder messageHolder )
113     {
114         String[] parts = locationSpecification.split( ":" );
115 
116         Location location = null;
117 
118         if ( parts.length > 2 )
119         {
120             String groupId = parts[0];
121             String artifactId = parts[1];
122             String version = parts[2];
123 
124             String type = defaultArtifactType;
125             if ( parts.length > 3 )
126             {
127                 if ( parts[3].trim().length() > 0 )
128                 {
129                     type = parts[3];
130                 }
131             }
132 
133             String classifier = defaultClassifier;
134             if ( parts.length > 4 )
135             {
136                 classifier = parts[4];
137             }
138 
139             if ( parts.length > 5 )
140             {
141                 messageHolder.newMessage().append( "Location specification has unused tokens: \'" );
142 
143                 for ( int i = 5; i < parts.length; i++ )
144                 {
145                     messageHolder.append( ":" + parts[i] );
146                 }
147             }
148 
149             Artifact artifact;
150             if ( classifier == null )
151             {
152                 artifact = factory.createArtifact( groupId, artifactId, version, null, type );
153             }
154             else
155             {
156                 artifact = factory.createArtifactWithClassifier( groupId, artifactId, version, type, classifier );
157             }
158 
159             try
160             {
161                 resolver.resolve( artifact, remoteRepositories, localRepository );
162 
163                 if ( artifact.getFile() != null )
164                 {
165                     location = new ArtifactLocation( artifact, locationSpecification );
166                 }
167                 else
168                 {
169                     messageHolder.addMessage( "Supposedly resolved artifact: " + artifact.getId()
170                         + " does not have an associated file." );
171                 }
172             }
173             catch ( ArtifactResolutionException e )
174             {
175                 messageHolder.addMessage( "Failed to resolve artifact: " + artifact.getId() + " for location: "
176                     + locationSpecification, e );
177             }
178             catch ( ArtifactNotFoundException e )
179             {
180                 messageHolder.addMessage( "Failed to resolve artifact: " + artifact.getId() + " for location: "
181                     + locationSpecification, e );
182             }
183         }
184         else
185         {
186             messageHolder.addMessage( "Invalid artifact specification: \'" + locationSpecification
187                 + "\'. Must contain at least three fields, separated by ':'." );
188         }
189 
190         return location;
191     }
192 
193 }