You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by GitBox <gi...@apache.org> on 2022/04/15 13:44:14 UTC

[GitHub] [maven-resolver] michael-o commented on a diff in pull request #168: [MRESOLVER-253] Dynamic LRM

michael-o commented on code in PR #168:
URL: https://github.com/apache/maven-resolver/pull/168#discussion_r851271040


##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposer.java:
##########
@@ -0,0 +1,68 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Composes prefixes for {@link EnhancedLocalRepositoryManager}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposer

Review Comment:
   Akin to the other PR: `DynamicLocalPathPrefixComposer`? Otherwise it is not clear what kind of prefix is calculated.



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposer.java:
##########
@@ -0,0 +1,68 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Composes prefixes for {@link EnhancedLocalRepositoryManager}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposer
+{
+    /**
+     * Gets the path prefix for a locally installed artifact.
+     *
+     * @param artifact The artifact for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalArtifact( Artifact artifact );
+
+    /**
+     * Gets the path prefix for an artifact cached from a remote repository.
+     *
+     * @param artifact   The artifact for which to determine the prefix, must not be {@code null}.
+     * @param repository The source repository of the artifact, must not be {@code null}.
+     * @param context    The resolution context in which the artifact is being requested, may be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context );
+
+    /**
+     * Gets the path prefix for locally installed metadata.
+     *
+     * @param metadata The metadata for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalMetadata( Metadata metadata );
+
+    /**
+     * Gets the path prefix for metadata cached from a remote repository.
+     *
+     * @param metadata   The metadata for which to determine the prefix, must not be {@code null}.
+     * @param repository The source repository of the metadata, must not be {@code null}.
+     * @param context    The resolution context in which the metadata is being requested, may be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context );

Review Comment:
   `PathPrefix`



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SplitDynamicPrefixComposerFactory.java:
##########
@@ -0,0 +1,85 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Split composer: splits to localPrefix (locally built and installed) and remotePrefix (cache). Cache is further

Review Comment:
   `(cached)`



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposerFactorySupport.java:
##########
@@ -0,0 +1,81 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.util.ConfigUtils;
+
+/**
+ * Support class for {@link DynamicPrefixComposerFactory} implementations.
+ *
+ * @since TBD
+ */
+public abstract class DynamicPrefixComposerFactorySupport implements DynamicPrefixComposerFactory
+{
+    @Override
+    public DynamicPrefixComposer createComposer( RepositorySystemSession session )
+    {

Review Comment:
   Null test?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposerFactorySupport.java:
##########
@@ -0,0 +1,81 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.util.ConfigUtils;
+
+/**
+ * Support class for {@link DynamicPrefixComposerFactory} implementations.
+ *
+ * @since TBD
+ */
+public abstract class DynamicPrefixComposerFactorySupport implements DynamicPrefixComposerFactory
+{
+    @Override
+    public DynamicPrefixComposer createComposer( RepositorySystemSession session )
+    {
+        String localPrefix = ConfigUtils.getString(
+                session, "installed", "aether.enhancedLocalRepository.localPrefix" );
+        String remotePrefix = ConfigUtils.getString(
+                session, "cached", "aether.enhancedLocalRepository.remotePrefix" );
+        String releasePrefix = ConfigUtils.getString(
+                session, "release", "aether.enhancedLocalRepository.releasePrefix" );
+        String snapshotPrefix = ConfigUtils.getString(
+                session, "snapshot", "aether.enhancedLocalRepository.snapshotPrefix" );
+
+        return dpCreateComposer( session, localPrefix, remotePrefix, releasePrefix, snapshotPrefix );
+    }
+
+    protected abstract DynamicPrefixComposer dpCreateComposer( RepositorySystemSession session, String localPrefix,
+                                                               String remotePrefix, String releasePrefix,
+                                                               String snapshotPrefix );
+
+    /**
+     * Support class for composers.
+     */
+    protected abstract static class DynamicPrefixComposerSupport implements DynamicPrefixComposer
+    {
+        protected final String localPrefix;
+
+        protected final String remotePrefix;
+
+        protected final String releasePrefix;
+
+        protected final String snapshotPrefix;
+
+        protected DynamicPrefixComposerSupport( String localPrefix,
+                                                String remotePrefix,
+                                                String releasePrefix,
+                                                String snapshotPrefix )
+        {
+            this.localPrefix = localPrefix;
+            this.remotePrefix = remotePrefix;
+            this.releasePrefix = releasePrefix;
+            this.snapshotPrefix = snapshotPrefix;
+        }
+    }
+
+    protected static boolean isSnapshot( Metadata metadata )
+    {
+        return metadata.getVersion() != null && metadata.getVersion().endsWith( "SNAPSHOT" );

Review Comment:
   Why not `getNature()`?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposerFactory.java:
##########
@@ -0,0 +1,38 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.RepositorySystemSession;
+
+/**
+ * Creates instances of {@link DynamicPrefixComposer}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposerFactory

Review Comment:
   Adjust



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposer.java:
##########
@@ -0,0 +1,68 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Composes prefixes for {@link EnhancedLocalRepositoryManager}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposer
+{
+    /**
+     * Gets the path prefix for a locally installed artifact.
+     *
+     * @param artifact The artifact for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalArtifact( Artifact artifact );
+
+    /**
+     * Gets the path prefix for an artifact cached from a remote repository.
+     *
+     * @param artifact   The artifact for which to determine the prefix, must not be {@code null}.
+     * @param repository The source repository of the artifact, must not be {@code null}.
+     * @param context    The resolution context in which the artifact is being requested, may be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context );

Review Comment:
   `PathPrefix`



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposer.java:
##########
@@ -0,0 +1,68 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Composes prefixes for {@link EnhancedLocalRepositoryManager}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposer
+{
+    /**
+     * Gets the path prefix for a locally installed artifact.
+     *
+     * @param artifact The artifact for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalArtifact( Artifact artifact );

Review Comment:
   `PathPrefix`



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposer.java:
##########
@@ -0,0 +1,68 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Composes prefixes for {@link EnhancedLocalRepositoryManager}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposer
+{
+    /**
+     * Gets the path prefix for a locally installed artifact.
+     *
+     * @param artifact The artifact for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalArtifact( Artifact artifact );
+
+    /**
+     * Gets the path prefix for an artifact cached from a remote repository.
+     *
+     * @param artifact   The artifact for which to determine the prefix, must not be {@code null}.
+     * @param repository The source repository of the artifact, must not be {@code null}.
+     * @param context    The resolution context in which the artifact is being requested, may be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context );

Review Comment:
   What is this context?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposerFactory.java:
##########
@@ -0,0 +1,38 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.RepositorySystemSession;
+
+/**
+ * Creates instances of {@link DynamicPrefixComposer}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposerFactory
+{
+    /**
+     * Creates {@link DynamicPrefixComposer} instance out of whatever configuration it finds in passed in session.
+     *
+     * @param session The repository session.

Review Comment:
   Never null?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DynamicPrefixComposer.java:
##########
@@ -0,0 +1,68 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Composes prefixes for {@link EnhancedLocalRepositoryManager}.
+ *
+ * @since TBD
+ */
+public interface DynamicPrefixComposer
+{
+    /**
+     * Gets the path prefix for a locally installed artifact.
+     *
+     * @param artifact The artifact for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalArtifact( Artifact artifact );
+
+    /**
+     * Gets the path prefix for an artifact cached from a remote repository.
+     *
+     * @param artifact   The artifact for which to determine the prefix, must not be {@code null}.
+     * @param repository The source repository of the artifact, must not be {@code null}.
+     * @param context    The resolution context in which the artifact is being requested, may be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context );
+
+    /**
+     * Gets the path prefix for locally installed metadata.
+     *
+     * @param metadata The metadata for which to determine the prefix, must not be {@code null}.
+     * @return The prefix, may be {@code null} (note: {@code null}s and empty strings are treated equally).
+     */
+    String getPrefixForLocalMetadata( Metadata metadata );

Review Comment:
   `PathPrefix`



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java:
##########
@@ -104,8 +176,8 @@ public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactR
             }
             else
             {
-                String context = request.getContext();
-                for ( RemoteRepository repository : request.getRepositories() )
+                String context = result.getRequest().getContext();
+                for ( RemoteRepository repository : result.getRequest().getRepositories() )

Review Comment:
   Why this change?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SplitDynamicPrefixComposerFactory.java:
##########
@@ -0,0 +1,85 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Split composer: splits to localPrefix (locally built and installed) and remotePrefix (cache). Cache is further
+ * split by release or snapshots.
+ *
+ * @since TBD
+ */
+@Singleton
+@Named( SplitDynamicPrefixComposerFactory.NAME )
+public final class SplitDynamicPrefixComposerFactory extends DynamicPrefixComposerFactorySupport
+{
+    public static final String NAME = "split";
+
+    @Override
+    protected DynamicPrefixComposer dpCreateComposer( RepositorySystemSession session, String localPrefix,
+                                                      String remotePrefix, String releasePrefix, String snapshotPrefix )
+    {
+        return new SplitDynamicPrefixComposer( localPrefix, remotePrefix, releasePrefix, snapshotPrefix );
+    }
+
+    private static final class SplitDynamicPrefixComposer extends DynamicPrefixComposerSupport
+    {
+        private SplitDynamicPrefixComposer( String localPrefix,
+                                            String remotePrefix,
+                                            String releasePrefix,
+                                            String snapshotPrefix )
+        {
+            super( localPrefix, remotePrefix, releasePrefix, snapshotPrefix );
+        }
+
+        @Override
+        public String getPrefixForLocalArtifact( Artifact artifact )
+        {
+            return localPrefix;
+        }
+
+        @Override
+        public String getPrefixForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
+        {
+            return remotePrefix + "/"
+                    + ( artifact.isSnapshot() ? snapshotPrefix : releasePrefix );
+        }
+
+        @Override
+        public String getPrefixForLocalMetadata( Metadata metadata )
+        {
+            return localPrefix;

Review Comment:
   Why is snapshot not evaluated for local items?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java:
##########
@@ -142,7 +212,17 @@ public void add( RepositorySystemSession session, LocalArtifactRegistration requ
         {
             repositories = getRepositoryKeys( request.getRepository(), request.getContexts() );
         }
-        addArtifact( request.getArtifact(), repositories, request.getRepository() == null );
+        if ( request.getRepository() == null )
+        {
+            addArtifact( request.getArtifact(), repositories, null, null );
+        }
+        else
+        {
+            for ( String context : request.getContexts() )
+            {
+                addArtifact( request.getArtifact(), repositories, request.getRepository(), context );

Review Comment:
   What if `getRepository()` is null, but `getContexts()` is empty?



##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SplitDynamicPrefixComposerFactory.java:
##########
@@ -0,0 +1,85 @@
+package org.eclipse.aether.internal.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Split composer: splits to localPrefix (locally built and installed) and remotePrefix (cache). Cache is further
+ * split by release or snapshots.
+ *
+ * @since TBD
+ */
+@Singleton
+@Named( SplitDynamicPrefixComposerFactory.NAME )
+public final class SplitDynamicPrefixComposerFactory extends DynamicPrefixComposerFactorySupport
+{
+    public static final String NAME = "split";
+
+    @Override
+    protected DynamicPrefixComposer dpCreateComposer( RepositorySystemSession session, String localPrefix,
+                                                      String remotePrefix, String releasePrefix, String snapshotPrefix )
+    {
+        return new SplitDynamicPrefixComposer( localPrefix, remotePrefix, releasePrefix, snapshotPrefix );
+    }
+
+    private static final class SplitDynamicPrefixComposer extends DynamicPrefixComposerSupport
+    {
+        private SplitDynamicPrefixComposer( String localPrefix,
+                                            String remotePrefix,
+                                            String releasePrefix,
+                                            String snapshotPrefix )
+        {
+            super( localPrefix, remotePrefix, releasePrefix, snapshotPrefix );
+        }
+
+        @Override
+        public String getPrefixForLocalArtifact( Artifact artifact )
+        {
+            return localPrefix;

Review Comment:
   Why is snapshot not evaluated for local items?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@maven.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org