View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.artifact.repository;
20  
21  import java.io.File;
22  import java.util.Collections;
23  import java.util.List;
24  import java.util.Objects;
25  
26  import org.apache.maven.RepositoryUtils;
27  import org.apache.maven.artifact.metadata.ArtifactMetadata;
28  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
29  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
30  import org.apache.maven.artifact.repository.metadata.RepositoryMetadataStoreException;
31  import org.apache.maven.repository.Proxy;
32  import org.eclipse.aether.DefaultRepositorySystemSession;
33  import org.eclipse.aether.RepositorySystem;
34  import org.eclipse.aether.RepositorySystemSession;
35  import org.eclipse.aether.artifact.Artifact;
36  import org.eclipse.aether.metadata.Metadata;
37  import org.eclipse.aether.repository.LocalArtifactRegistration;
38  import org.eclipse.aether.repository.LocalArtifactRequest;
39  import org.eclipse.aether.repository.LocalArtifactResult;
40  import org.eclipse.aether.repository.LocalMetadataRegistration;
41  import org.eclipse.aether.repository.LocalMetadataRequest;
42  import org.eclipse.aether.repository.LocalMetadataResult;
43  import org.eclipse.aether.repository.LocalRepository;
44  import org.eclipse.aether.repository.LocalRepositoryManager;
45  import org.eclipse.aether.repository.RemoteRepository;
46  
47  /**
48   * <strong>Warning:</strong> This is an internal utility class that is only public for technical reasons, it is not part
49   * of the public API. In particular, this class can be changed or deleted without prior notice.
50   *
51   */
52  @Deprecated
53  public class LegacyLocalRepositoryManager implements LocalRepositoryManager {
54  
55      private final ArtifactRepository delegate;
56  
57      private final LocalRepository repo;
58  
59      private final boolean realLocalRepo;
60  
61      public static RepositorySystemSession overlay(
62              ArtifactRepository repository, RepositorySystemSession session, RepositorySystem system) {
63          return overlay(repository, session);
64      }
65  
66      public static RepositorySystemSession overlay(ArtifactRepository repository, RepositorySystemSession session) {
67          if (repository == null || repository.getBasedir() == null) {
68              return session;
69          }
70  
71          if (session != null) {
72              LocalRepositoryManager lrm = session.getLocalRepositoryManager();
73              if (lrm != null && lrm.getRepository().getBasedir().equals(new File(repository.getBasedir()))) {
74                  return session;
75              }
76          } else {
77              session = new DefaultRepositorySystemSession();
78          }
79  
80          final LocalRepositoryManager llrm = new LegacyLocalRepositoryManager(repository);
81  
82          return new DefaultRepositorySystemSession(session).setLocalRepositoryManager(llrm);
83      }
84  
85      private LegacyLocalRepositoryManager(ArtifactRepository delegate) {
86          this.delegate = Objects.requireNonNull(delegate, "delegate cannot be null");
87  
88          ArtifactRepositoryLayout layout = delegate.getLayout();
89          repo = new LocalRepository(
90                  new File(delegate.getBasedir()),
91                  (layout != null) ? layout.getClass().getSimpleName() : "legacy");
92  
93          /*
94           * NOTE: "invoker:install" vs "appassembler:assemble": Both mojos use the artifact installer to put an artifact
95           * into a repository. In the first case, the result needs to be a proper local repository that one can use for
96           * local artifact resolution. In the second case, the result needs to precisely obey the path information of the
97           * repository's layout to allow pointing at artifacts within the repository. Unfortunately,
98           * DefaultRepositoryLayout does not correctly describe the layout of a local repository which unlike a remote
99           * repository never uses timestamps in the filename of a snapshot artifact. The discrepancy gets notable when a
100          * remotely resolved snapshot artifact gets passed into pathOf(). So producing a proper local artifact path
101          * using DefaultRepositoryLayout requires us to enforce usage of the artifact's base version. This
102          * transformation however contradicts the other use case of precisely obeying the repository's layout. The below
103          * flag tries to detect which use case applies to make both plugins happy.
104          */
105         realLocalRepo = (layout instanceof DefaultRepositoryLayout) && "local".equals(delegate.getId());
106     }
107 
108     @Override
109     public LocalRepository getRepository() {
110         return repo;
111     }
112 
113     @Override
114     public String getPathForLocalArtifact(Artifact artifact) {
115         if (realLocalRepo) {
116             return delegate.pathOf(RepositoryUtils.toArtifact(artifact.setVersion(artifact.getBaseVersion())));
117         }
118         return delegate.pathOf(RepositoryUtils.toArtifact(artifact));
119     }
120 
121     @Override
122     public String getPathForRemoteArtifact(Artifact artifact, RemoteRepository repository, String context) {
123         return delegate.pathOf(RepositoryUtils.toArtifact(artifact));
124     }
125 
126     @Override
127     public String getPathForLocalMetadata(Metadata metadata) {
128         return delegate.pathOfLocalRepositoryMetadata(new ArtifactMetadataAdapter(metadata), delegate);
129     }
130 
131     @Override
132     public String getPathForRemoteMetadata(Metadata metadata, RemoteRepository repository, String context) {
133         return delegate.pathOfLocalRepositoryMetadata(
134                 new ArtifactMetadataAdapter(metadata), new ArtifactRepositoryAdapter(repository));
135     }
136 
137     @Override
138     public LocalArtifactResult find(RepositorySystemSession session, LocalArtifactRequest request) {
139         String path = getPathForLocalArtifact(request.getArtifact());
140         File file = new File(getRepository().getBasedir(), path);
141 
142         LocalArtifactResult result = new LocalArtifactResult(request);
143         if (file.isFile()) {
144             result.setFile(file);
145             result.setAvailable(true);
146         }
147 
148         return result;
149     }
150 
151     @Override
152     public LocalMetadataResult find(RepositorySystemSession session, LocalMetadataRequest request) {
153         Metadata metadata = request.getMetadata();
154 
155         String path;
156         if (request.getRepository() == null) {
157             path = getPathForLocalMetadata(metadata);
158         } else {
159             path = getPathForRemoteMetadata(metadata, request.getRepository(), request.getContext());
160         }
161 
162         File file = new File(getRepository().getBasedir(), path);
163 
164         LocalMetadataResult result = new LocalMetadataResult(request);
165         if (file.isFile()) {
166             result.setFile(file);
167         }
168 
169         return result;
170     }
171 
172     @Override
173     public void add(RepositorySystemSession session, LocalArtifactRegistration request) {
174         // noop
175     }
176 
177     @Override
178     public void add(RepositorySystemSession session, LocalMetadataRegistration request) {
179         // noop
180     }
181 
182     static class ArtifactMetadataAdapter implements ArtifactMetadata {
183 
184         private final Metadata metadata;
185 
186         ArtifactMetadataAdapter(Metadata metadata) {
187             this.metadata = metadata;
188         }
189 
190         @Override
191         public boolean storedInArtifactVersionDirectory() {
192             return !metadata.getVersion().isEmpty();
193         }
194 
195         @Override
196         public boolean storedInGroupDirectory() {
197             return metadata.getArtifactId().isEmpty();
198         }
199 
200         @Override
201         public String getGroupId() {
202             return nullify(metadata.getGroupId());
203         }
204 
205         @Override
206         public String getArtifactId() {
207             return nullify(metadata.getArtifactId());
208         }
209 
210         @Override
211         public String getBaseVersion() {
212             return nullify(metadata.getVersion());
213         }
214 
215         private String nullify(String str) {
216             return (str == null || str.isEmpty()) ? null : str;
217         }
218 
219         @Override
220         public Object getKey() {
221             return metadata.toString();
222         }
223 
224         @Override
225         public String getRemoteFilename() {
226             return metadata.getType();
227         }
228 
229         @Override
230         public String getLocalFilename(ArtifactRepository repository) {
231             return insertRepositoryKey(getRemoteFilename(), repository.getKey());
232         }
233 
234         private String insertRepositoryKey(String filename, String repositoryKey) {
235             String result;
236             int idx = filename.indexOf('.');
237             if (idx < 0) {
238                 result = filename + '-' + repositoryKey;
239             } else {
240                 result = filename.substring(0, idx) + '-' + repositoryKey + filename.substring(idx);
241             }
242             return result;
243         }
244 
245         @Override
246         public void merge(org.apache.maven.repository.legacy.metadata.ArtifactMetadata metadata) {
247             // not used
248         }
249 
250         @Override
251         public void merge(ArtifactMetadata metadata) {
252             // not used
253         }
254 
255         @Override
256         public void storeInLocalRepository(ArtifactRepository localRepository, ArtifactRepository remoteRepository)
257                 throws RepositoryMetadataStoreException {
258             // not used
259         }
260 
261         @Override
262         public String extendedToString() {
263             return metadata.toString();
264         }
265     }
266 
267     static class ArtifactRepositoryAdapter implements ArtifactRepository {
268 
269         private final RemoteRepository repository;
270 
271         ArtifactRepositoryAdapter(RemoteRepository repository) {
272             this.repository = repository;
273         }
274 
275         @Override
276         public String pathOf(org.apache.maven.artifact.Artifact artifact) {
277             return null;
278         }
279 
280         @Override
281         public String pathOfRemoteRepositoryMetadata(ArtifactMetadata artifactMetadata) {
282             return null;
283         }
284 
285         @Override
286         public String pathOfLocalRepositoryMetadata(ArtifactMetadata metadata, ArtifactRepository repository) {
287             return null;
288         }
289 
290         @Override
291         public String getUrl() {
292             return repository.getUrl();
293         }
294 
295         @Override
296         public void setUrl(String url) {}
297 
298         @Override
299         public String getBasedir() {
300             return null;
301         }
302 
303         @Override
304         public String getProtocol() {
305             return repository.getProtocol();
306         }
307 
308         @Override
309         public String getId() {
310             return repository.getId();
311         }
312 
313         @Override
314         public void setId(String id) {}
315 
316         @Override
317         public ArtifactRepositoryPolicy getSnapshots() {
318             return null;
319         }
320 
321         @Override
322         public void setSnapshotUpdatePolicy(ArtifactRepositoryPolicy policy) {}
323 
324         @Override
325         public ArtifactRepositoryPolicy getReleases() {
326             return null;
327         }
328 
329         @Override
330         public void setReleaseUpdatePolicy(ArtifactRepositoryPolicy policy) {}
331 
332         @Override
333         public ArtifactRepositoryLayout getLayout() {
334             return null;
335         }
336 
337         @Override
338         public void setLayout(ArtifactRepositoryLayout layout) {}
339 
340         @Override
341         public String getKey() {
342             return getId();
343         }
344 
345         @Override
346         public boolean isUniqueVersion() {
347             return true;
348         }
349 
350         @Override
351         public boolean isBlacklisted() {
352             return false;
353         }
354 
355         @Override
356         public void setBlacklisted(boolean blackListed) {}
357 
358         @Override
359         public org.apache.maven.artifact.Artifact find(org.apache.maven.artifact.Artifact artifact) {
360             return null;
361         }
362 
363         @Override
364         public List<String> findVersions(org.apache.maven.artifact.Artifact artifact) {
365             return Collections.emptyList();
366         }
367 
368         @Override
369         public boolean isProjectAware() {
370             return false;
371         }
372 
373         @Override
374         public void setAuthentication(Authentication authentication) {}
375 
376         @Override
377         public Authentication getAuthentication() {
378             return null;
379         }
380 
381         @Override
382         public void setProxy(Proxy proxy) {}
383 
384         @Override
385         public Proxy getProxy() {
386             return null;
387         }
388 
389         @Override
390         public List<ArtifactRepository> getMirroredRepositories() {
391             return Collections.emptyList();
392         }
393 
394         @Override
395         public void setMirroredRepositories(List<ArtifactRepository> mirroredRepositories) {}
396 
397         @Override
398         public boolean isBlocked() {
399             return false;
400         }
401 
402         @Override
403         public void setBlocked(boolean blocked) {}
404     }
405 }