View Javadoc
1   package org.eclipse.aether.internal.impl;
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 static java.util.Objects.requireNonNull;
25  
26  import java.util.Objects;
27  import java.util.SortedSet;
28  import java.util.TreeSet;
29  
30  import org.eclipse.aether.RepositorySystemSession;
31  import org.eclipse.aether.artifact.Artifact;
32  import org.eclipse.aether.metadata.Metadata;
33  import org.eclipse.aether.repository.LocalArtifactRegistration;
34  import org.eclipse.aether.repository.LocalArtifactRequest;
35  import org.eclipse.aether.repository.LocalArtifactResult;
36  import org.eclipse.aether.repository.LocalMetadataRegistration;
37  import org.eclipse.aether.repository.LocalMetadataRequest;
38  import org.eclipse.aether.repository.LocalMetadataResult;
39  import org.eclipse.aether.repository.LocalRepository;
40  import org.eclipse.aether.repository.LocalRepositoryManager;
41  import org.eclipse.aether.repository.RemoteRepository;
42  import org.eclipse.aether.util.StringDigestUtil;
43  
44  /**
45   * A local repository manager that realizes the classical Maven 2.0 local repository.
46   */
47  class SimpleLocalRepositoryManager
48          implements LocalRepositoryManager
49  {
50  
51      private final LocalRepository repository;
52  
53      private final LocalPathComposer localPathComposer;
54  
55      SimpleLocalRepositoryManager( File basedir, String type, LocalPathComposer localPathComposer )
56      {
57          requireNonNull( basedir, "base directory cannot be null" );
58          repository = new LocalRepository( basedir.getAbsoluteFile(), type );
59          this.localPathComposer = requireNonNull( localPathComposer );
60      }
61  
62      @Override
63      public LocalRepository getRepository()
64      {
65          return repository;
66      }
67  
68      @Override
69      public String getPathForLocalArtifact( Artifact artifact )
70      {
71          requireNonNull( artifact, "artifact cannot be null" );
72          return localPathComposer.getPathForArtifact( artifact, true );
73      }
74  
75      @Override
76      public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
77      {
78          requireNonNull( artifact, "artifact cannot be null" );
79          requireNonNull( repository, "repository cannot be null" );
80          return localPathComposer.getPathForArtifact( artifact, false );
81      }
82  
83      @Override
84      public String getPathForLocalMetadata( Metadata metadata )
85      {
86          requireNonNull( metadata, "metadata cannot be null" );
87          return localPathComposer.getPathForMetadata( metadata, "local" );
88      }
89  
90      @Override
91      public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
92      {
93          requireNonNull( metadata, "metadata cannot be null" );
94          requireNonNull( repository, "repository cannot be null" );
95          return localPathComposer.getPathForMetadata( metadata, getRepositoryKey( repository, context ) );
96      }
97  
98      /**
99       * Returns {@link RemoteRepository#getId()}, unless {@link RemoteRepository#isRepositoryManager()} returns
100      * {@code true}, in which case this method creates unique identifier based on ID and current configuration
101      * of the remote repository (as it may change).
102      */
103     protected String getRepositoryKey( RemoteRepository repository, String context )
104     {
105         String key;
106 
107         if ( repository.isRepositoryManager() )
108         {
109             // repository serves dynamic contents, take request parameters into account for key
110 
111             StringBuilder buffer = new StringBuilder( 128 );
112 
113             buffer.append( repository.getId() );
114 
115             buffer.append( '-' );
116 
117             SortedSet<String> subKeys = new TreeSet<>();
118             for ( RemoteRepository mirroredRepo : repository.getMirroredRepositories() )
119             {
120                 subKeys.add( mirroredRepo.getId() );
121             }
122 
123             StringDigestUtil sha1 = StringDigestUtil.sha1();
124             sha1.update( context );
125             for ( String subKey : subKeys )
126             {
127                 sha1.update( subKey );
128             }
129             buffer.append( sha1.digest() );
130 
131             key = buffer.toString();
132         }
133         else
134         {
135             // repository serves static contents, its id is sufficient as key
136 
137             key = repository.getId();
138         }
139 
140         return key;
141     }
142 
143     @Override
144     public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
145     {
146         requireNonNull( session, "session cannot be null" );
147         requireNonNull( request, "request cannot be null" );
148         Artifact artifact = request.getArtifact();
149         LocalArtifactResult result = new LocalArtifactResult( request );
150 
151         String path;
152         File file;
153 
154         // Local repository CANNOT have timestamped installed, they are created only during deploy
155         if ( Objects.equals( artifact.getVersion(), artifact.getBaseVersion() ) )
156         {
157             path = getPathForLocalArtifact( artifact );
158             file = new File( getRepository().getBasedir(), path );
159             if ( file.isFile() )
160             {
161                 result.setFile( file );
162                 result.setAvailable( true );
163             }
164         }
165 
166         if ( !result.isAvailable() )
167         {
168             for ( RemoteRepository repository : request.getRepositories() )
169             {
170                 path = getPathForRemoteArtifact( artifact, repository, request.getContext() );
171                 file = new File( getRepository().getBasedir(), path );
172                 if ( file.isFile() )
173                 {
174                     result.setFile( file );
175                     result.setAvailable( true );
176                     break;
177                 }
178             }
179 
180         }
181 
182         return result;
183     }
184 
185     @Override
186     public void add( RepositorySystemSession session, LocalArtifactRegistration request )
187     {
188         requireNonNull( session, "session cannot be null" );
189         requireNonNull( request, "request cannot be null" );
190         // noop
191     }
192 
193     @Override
194     public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
195     {
196         requireNonNull( session, "session cannot be null" );
197         requireNonNull( request, "request cannot be null" );
198         LocalMetadataResult result = new LocalMetadataResult( request );
199 
200         String path;
201 
202         Metadata metadata = request.getMetadata();
203         String context = request.getContext();
204         RemoteRepository remote = request.getRepository();
205 
206         if ( remote != null )
207         {
208             path = getPathForRemoteMetadata( metadata, remote, context );
209         }
210         else
211         {
212             path = getPathForLocalMetadata( metadata );
213         }
214 
215         File file = new File( getRepository().getBasedir(), path );
216         if ( file.isFile() )
217         {
218             result.setFile( file );
219         }
220 
221         return result;
222     }
223 
224     @Override
225     public void add( RepositorySystemSession session, LocalMetadataRegistration request )
226     {
227         requireNonNull( session, "session cannot be null" );
228         requireNonNull( request, "request cannot be null" );
229         // noop
230     }
231 
232     @Override
233     public String toString()
234     {
235         return String.valueOf( getRepository() );
236     }
237 }