2626import java .io .FileNotFoundException ;
2727import java .io .IOException ;
2828import java .io .UncheckedIOException ;
29+ import java .net .URI ;
2930import java .nio .charset .StandardCharsets ;
3031import java .nio .file .Files ;
3132import java .nio .file .Path ;
3435import java .util .HashMap ;
3536import java .util .List ;
3637import java .util .concurrent .ConcurrentHashMap ;
38+ import java .util .concurrent .ConcurrentMap ;
3739
3840import org .eclipse .aether .RepositorySystemSession ;
3941import org .eclipse .aether .artifact .Artifact ;
4042import org .eclipse .aether .metadata .Metadata ;
4143import org .eclipse .aether .repository .RemoteRepository ;
44+ import org .eclipse .aether .spi .connector .checksum .ChecksumAlgorithmFactory ;
4245import org .eclipse .aether .spi .connector .filter .RemoteRepositoryFilter ;
4346import org .eclipse .aether .spi .connector .layout .RepositoryLayout ;
4447import org .eclipse .aether .spi .connector .layout .RepositoryLayoutProvider ;
@@ -85,16 +88,22 @@ public final class PrefixesRemoteRepositoryFilterSource extends RemoteRepository
8588
8689 private final RepositoryLayoutProvider repositoryLayoutProvider ;
8790
88- private final ConcurrentHashMap <RemoteRepository , Node > prefixes ;
89-
90- private final ConcurrentHashMap <RemoteRepository , RepositoryLayout > layouts ;
91-
9291 @ Inject
9392 public PrefixesRemoteRepositoryFilterSource (RepositoryLayoutProvider repositoryLayoutProvider ) {
9493 super (NAME );
9594 this .repositoryLayoutProvider = requireNonNull (repositoryLayoutProvider );
96- this .prefixes = new ConcurrentHashMap <>();
97- this .layouts = new ConcurrentHashMap <>();
95+ }
96+
97+ @ SuppressWarnings ("unchecked" )
98+ private ConcurrentMap <RemoteRepository , Node > prefixes (RepositorySystemSession session ) {
99+ return (ConcurrentMap <RemoteRepository , Node >)
100+ session .getData ().computeIfAbsent (getClass ().getName () + ".prefixes" , ConcurrentHashMap ::new );
101+ }
102+
103+ @ SuppressWarnings ("unchecked" )
104+ private ConcurrentMap <RemoteRepository , RepositoryLayout > layouts (RepositorySystemSession session ) {
105+ return (ConcurrentMap <RemoteRepository , RepositoryLayout >)
106+ session .getData ().computeIfAbsent (getClass ().getName () + ".layouts" , ConcurrentHashMap ::new );
98107 }
99108
100109 @ Override
@@ -106,25 +115,26 @@ public RemoteRepositoryFilter getRemoteRepositoryFilter(RepositorySystemSession
106115 }
107116
108117 /**
109- * Caches layout instances for remote repository. In case of unknown layout it returns {@code null }.
118+ * Caches layout instances for remote repository. In case of unknown layout it returns {@link #NOT_SUPPORTED }.
110119 *
111- * @return the layout instance of {@code null } if layout not supported.
120+ * @return the layout instance of {@link #NOT_SUPPORTED } if layout not supported.
112121 */
113122 private RepositoryLayout cacheLayout (RepositorySystemSession session , RemoteRepository remoteRepository ) {
114- return layouts .computeIfAbsent (remoteRepository , r -> {
123+ return layouts ( session ) .computeIfAbsent (remoteRepository , r -> {
115124 try {
116125 return repositoryLayoutProvider .newRepositoryLayout (session , remoteRepository );
117126 } catch (NoRepositoryLayoutException e ) {
118- return null ;
127+ return NOT_SUPPORTED ;
119128 }
120129 });
121130 }
122131
123132 /**
124133 * Caches prefixes instances for remote repository.
125134 */
126- private Node cacheNode (Path basedir , RemoteRepository remoteRepository ) {
127- return prefixes .computeIfAbsent (remoteRepository , r -> loadRepositoryPrefixes (basedir , remoteRepository ));
135+ private Node cacheNode (RepositorySystemSession session , Path basedir , RemoteRepository remoteRepository ) {
136+ return prefixes (session )
137+ .computeIfAbsent (remoteRepository , r -> loadRepositoryPrefixes (basedir , remoteRepository ));
128138 }
129139
130140 /**
@@ -173,7 +183,7 @@ private PrefixesFilter(RepositorySystemSession session, Path basedir) {
173183 @ Override
174184 public Result acceptArtifact (RemoteRepository remoteRepository , Artifact artifact ) {
175185 RepositoryLayout repositoryLayout = cacheLayout (session , remoteRepository );
176- if (repositoryLayout == null ) {
186+ if (repositoryLayout == NOT_SUPPORTED ) {
177187 return new SimpleResult (true , "Unsupported layout: " + remoteRepository );
178188 }
179189 return acceptPrefix (
@@ -184,7 +194,7 @@ public Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifac
184194 @ Override
185195 public Result acceptMetadata (RemoteRepository remoteRepository , Metadata metadata ) {
186196 RepositoryLayout repositoryLayout = cacheLayout (session , remoteRepository );
187- if (repositoryLayout == null ) {
197+ if (repositoryLayout == NOT_SUPPORTED ) {
188198 return new SimpleResult (true , "Unsupported layout: " + remoteRepository );
189199 }
190200 return acceptPrefix (
@@ -193,7 +203,7 @@ public Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadat
193203 }
194204
195205 private Result acceptPrefix (RemoteRepository remoteRepository , String path ) {
196- Node root = cacheNode (basedir , remoteRepository );
206+ Node root = cacheNode (session , basedir , remoteRepository );
197207 if (NOT_PRESENT_NODE == root ) {
198208 return NOT_PRESENT_RESULT ;
199209 }
@@ -222,6 +232,38 @@ private Result acceptPrefix(RemoteRepository remoteRepository, String path) {
222232 private static final RemoteRepositoryFilter .Result NOT_PRESENT_RESULT =
223233 new SimpleResult (true , "Prefix file not present" );
224234
235+ private static final RepositoryLayout NOT_SUPPORTED = new RepositoryLayout () {
236+ @ Override
237+ public List <ChecksumAlgorithmFactory > getChecksumAlgorithmFactories () {
238+ throw new UnsupportedOperationException ();
239+ }
240+
241+ @ Override
242+ public boolean hasChecksums (Artifact artifact ) {
243+ throw new UnsupportedOperationException ();
244+ }
245+
246+ @ Override
247+ public URI getLocation (Artifact artifact , boolean upload ) {
248+ throw new UnsupportedOperationException ();
249+ }
250+
251+ @ Override
252+ public URI getLocation (Metadata metadata , boolean upload ) {
253+ throw new UnsupportedOperationException ();
254+ }
255+
256+ @ Override
257+ public List <ChecksumLocation > getChecksumLocations (Artifact artifact , boolean upload , URI location ) {
258+ throw new UnsupportedOperationException ();
259+ }
260+
261+ @ Override
262+ public List <ChecksumLocation > getChecksumLocations (Metadata metadata , boolean upload , URI location ) {
263+ throw new UnsupportedOperationException ();
264+ }
265+ };
266+
225267 private static class Node {
226268 private final String name ;
227269
0 commit comments