1 package org.eclipse.aether.internal.impl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.Map;
28 import java.util.Properties;
29
30 import org.eclipse.aether.RepositorySystemSession;
31 import org.eclipse.aether.artifact.Artifact;
32 import org.eclipse.aether.repository.LocalArtifactRegistration;
33 import org.eclipse.aether.repository.LocalArtifactRequest;
34 import org.eclipse.aether.repository.LocalArtifactResult;
35 import org.eclipse.aether.repository.RemoteRepository;
36 import org.eclipse.aether.spi.log.Logger;
37 import org.eclipse.aether.util.ConfigUtils;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 class EnhancedLocalRepositoryManager
59 extends SimpleLocalRepositoryManager
60 {
61
62 private static final String LOCAL_REPO_ID = "";
63
64 private final String trackingFilename;
65
66 private final TrackingFileManager trackingFileManager;
67
68 public EnhancedLocalRepositoryManager( File basedir, RepositorySystemSession session )
69 {
70 super( basedir, "enhanced" );
71 String filename = ConfigUtils.getString( session, "", "aether.enhancedLocalRepository.trackingFilename" );
72 if ( filename.length() <= 0 || filename.contains( "/" ) || filename.contains( "\\" )
73 || filename.contains( ".." ) )
74 {
75 filename = "_remote.repositories";
76 }
77 trackingFilename = filename;
78 trackingFileManager = new TrackingFileManager();
79 }
80
81 @Override
82 public EnhancedLocalRepositoryManager setLogger( Logger logger )
83 {
84 super.setLogger( logger );
85 trackingFileManager.setLogger( logger );
86 return this;
87 }
88
89 @Override
90 public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
91 {
92 String path = getPathForArtifact( request.getArtifact(), false );
93 File file = new File( getRepository().getBasedir(), path );
94
95 LocalArtifactResult result = new LocalArtifactResult( request );
96
97 if ( file.isFile() )
98 {
99 result.setFile( file );
100
101 Properties props = readRepos( file );
102
103 if ( props.get( getKey( file, LOCAL_REPO_ID ) ) != null )
104 {
105
106 result.setAvailable( true );
107 }
108 else
109 {
110 String context = request.getContext();
111 for ( RemoteRepository repository : request.getRepositories() )
112 {
113 if ( props.get( getKey( file, getRepositoryKey( repository, context ) ) ) != null )
114 {
115
116
117 result.setAvailable( true );
118 result.setRepository( repository );
119 break;
120 }
121 }
122 if ( !result.isAvailable() && !isTracked( props, file ) )
123 {
124
125
126
127
128 result.setAvailable( true );
129 }
130 }
131 }
132
133 return result;
134 }
135
136 @Override
137 public void add( RepositorySystemSession session, LocalArtifactRegistration request )
138 {
139 Collection<String> repositories;
140 if ( request.getRepository() == null )
141 {
142 repositories = Collections.singleton( LOCAL_REPO_ID );
143 }
144 else
145 {
146 repositories = getRepositoryKeys( request.getRepository(), request.getContexts() );
147 }
148 addArtifact( request.getArtifact(), repositories, request.getRepository() == null );
149 }
150
151 private Collection<String> getRepositoryKeys( RemoteRepository repository, Collection<String> contexts )
152 {
153 Collection<String> keys = new HashSet<String>();
154
155 if ( contexts != null )
156 {
157 for ( String context : contexts )
158 {
159 keys.add( getRepositoryKey( repository, context ) );
160 }
161 }
162
163 return keys;
164 }
165
166 private void addArtifact( Artifact artifact, Collection<String> repositories, boolean local )
167 {
168 if ( artifact == null )
169 {
170 throw new IllegalArgumentException( "artifact to register not specified" );
171 }
172 String path = getPathForArtifact( artifact, local );
173 File file = new File( getRepository().getBasedir(), path );
174 addRepo( file, repositories );
175 }
176
177 private Properties readRepos( File artifactFile )
178 {
179 File trackingFile = getTrackingFile( artifactFile );
180
181 Properties props = trackingFileManager.read( trackingFile );
182
183 return ( props != null ) ? props : new Properties();
184 }
185
186 private void addRepo( File artifactFile, Collection<String> repositories )
187 {
188 Map<String, String> updates = new HashMap<String, String>();
189 for ( String repository : repositories )
190 {
191 updates.put( getKey( artifactFile, repository ), "" );
192 }
193
194 File trackingFile = getTrackingFile( artifactFile );
195
196 trackingFileManager.update( trackingFile, updates );
197 }
198
199 private File getTrackingFile( File artifactFile )
200 {
201 return new File( artifactFile.getParentFile(), trackingFilename );
202 }
203
204 private String getKey( File file, String repository )
205 {
206 return file.getName() + '>' + repository;
207 }
208
209 private boolean isTracked( Properties props, File file )
210 {
211 if ( props != null )
212 {
213 String keyPrefix = file.getName() + '>';
214 for ( Object key : props.keySet() )
215 {
216 if ( key.toString().startsWith( keyPrefix ) )
217 {
218 return true;
219 }
220 }
221 }
222 return false;
223 }
224
225 }