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.eclipse.aether.internal.impl;
20  
21  import java.nio.file.Files;
22  import java.nio.file.Path;
23  import java.util.Objects;
24  
25  import org.eclipse.aether.RepositorySystemSession;
26  import org.eclipse.aether.artifact.Artifact;
27  import org.eclipse.aether.metadata.Metadata;
28  import org.eclipse.aether.repository.LocalArtifactRegistration;
29  import org.eclipse.aether.repository.LocalArtifactRequest;
30  import org.eclipse.aether.repository.LocalArtifactResult;
31  import org.eclipse.aether.repository.LocalMetadataRegistration;
32  import org.eclipse.aether.repository.LocalMetadataRequest;
33  import org.eclipse.aether.repository.LocalMetadataResult;
34  import org.eclipse.aether.repository.LocalRepository;
35  import org.eclipse.aether.repository.LocalRepositoryManager;
36  import org.eclipse.aether.repository.RemoteRepository;
37  import org.eclipse.aether.repository.RepositoryKeyFunction;
38  import org.eclipse.aether.util.repository.RepositoryIdHelper;
39  
40  import static java.util.Objects.requireNonNull;
41  
42  /**
43   * A local repository manager that realizes the classical Maven 2.0 local repository.
44   */
45  class SimpleLocalRepositoryManager implements LocalRepositoryManager {
46  
47      protected final LocalRepository repository;
48  
49      protected final LocalPathComposer localPathComposer;
50  
51      protected final RepositoryKeyFunction simpleRepositoryKeyFunction;
52  
53      SimpleLocalRepositoryManager(Path basePath, String type, LocalPathComposer localPathComposer) {
54          requireNonNull(basePath, "base directory cannot be null");
55          repository = new LocalRepository(basePath.toAbsolutePath(), type);
56          this.localPathComposer = requireNonNull(localPathComposer);
57          this.simpleRepositoryKeyFunction =
58                  RepositoryIdHelper.getRepositoryKeyFunction(RepositoryIdHelper.RepositoryKeyType.SIMPLE.name());
59      }
60  
61      @Override
62      public LocalRepository getRepository() {
63          return repository;
64      }
65  
66      @Override
67      public String getPathForLocalArtifact(Artifact artifact) {
68          requireNonNull(artifact, "artifact cannot be null");
69          return localPathComposer.getPathForArtifact(artifact, true);
70      }
71  
72      @Override
73      public String getPathForRemoteArtifact(Artifact artifact, RemoteRepository repository, String context) {
74          requireNonNull(artifact, "artifact cannot be null");
75          requireNonNull(repository, "repository cannot be null");
76          return localPathComposer.getPathForArtifact(artifact, false);
77      }
78  
79      @Override
80      public String getPathForLocalMetadata(Metadata metadata) {
81          requireNonNull(metadata, "metadata cannot be null");
82          return localPathComposer.getPathForMetadata(metadata, LocalRepository.ID);
83      }
84  
85      @Override
86      public String getPathForRemoteMetadata(Metadata metadata, RemoteRepository repository, String context) {
87          requireNonNull(metadata, "metadata cannot be null");
88          requireNonNull(repository, "repository cannot be null");
89          return localPathComposer.getPathForMetadata(metadata, simpleRepositoryKeyFunction.apply(repository, context));
90      }
91  
92      @Override
93      public LocalArtifactResult find(RepositorySystemSession session, LocalArtifactRequest request) {
94          requireNonNull(session, "session cannot be null");
95          requireNonNull(request, "request cannot be null");
96          Artifact artifact = request.getArtifact();
97          LocalArtifactResult result = new LocalArtifactResult(request);
98  
99          Path filePath;
100 
101         // Local repository CANNOT have timestamped installed, they are created only during deploy
102         if (Objects.equals(artifact.getVersion(), artifact.getBaseVersion())) {
103             filePath = getAbsolutePathForLocalArtifact(artifact);
104             if (Files.isRegularFile(filePath)) {
105                 result.setPath(filePath);
106                 result.setAvailable(true);
107             }
108         }
109 
110         if (!result.isAvailable()) {
111             for (RemoteRepository repository : request.getRepositories()) {
112                 filePath = getAbsolutePathForRemoteArtifact(artifact, repository, request.getContext());
113                 if (Files.isRegularFile(filePath)) {
114                     result.setPath(filePath);
115                     result.setAvailable(true);
116                     break;
117                 }
118             }
119         }
120 
121         return result;
122     }
123 
124     @Override
125     public void add(RepositorySystemSession session, LocalArtifactRegistration request) {
126         requireNonNull(session, "session cannot be null");
127         requireNonNull(request, "request cannot be null");
128         // noop
129     }
130 
131     @Override
132     public LocalMetadataResult find(RepositorySystemSession session, LocalMetadataRequest request) {
133         requireNonNull(session, "session cannot be null");
134         requireNonNull(request, "request cannot be null");
135         LocalMetadataResult result = new LocalMetadataResult(request);
136 
137         String path;
138 
139         Metadata metadata = request.getMetadata();
140         String context = request.getContext();
141         RemoteRepository remote = request.getRepository();
142 
143         if (remote != null) {
144             path = getPathForRemoteMetadata(metadata, remote, context);
145         } else {
146             path = getPathForLocalMetadata(metadata);
147         }
148 
149         Path filePath = getRepository().getBasePath().resolve(path);
150         if (Files.isRegularFile(filePath)) {
151             result.setPath(filePath);
152         }
153 
154         return result;
155     }
156 
157     @Override
158     public void add(RepositorySystemSession session, LocalMetadataRegistration request) {
159         requireNonNull(session, "session cannot be null");
160         requireNonNull(request, "request cannot be null");
161         // noop
162     }
163 
164     @Override
165     public String toString() {
166         return String.valueOf(getRepository());
167     }
168 }