This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
The following commit(s) were added to refs/heads/master by this push:
new 43cae03d [MRESOLVER-302] Addendum (#360)
43cae03d is described below
commit 43cae03da0f877068aa4bfd6e5fd29ce2fc0eeb4
Author: Tamas Cservenak <[email protected]>
AuthorDate: Fri Nov 10 00:49:51 2023 +0100
[MRESOLVER-302] Addendum (#360)
Changes:
* rename closeable session to lessen repetition in source
* defer creation of LRM to ctor of DefaultCloseableSession
* support chained LRM out of the box
* make AuthenticationContext not need session (as it does not use it
directly)
---
https://issues.apache.org/jira/browse/MRESOLVER-302
---
.../eclipse/aether/RepositorySystemSession.java | 57 +++++-
.../aether/repository/AuthenticationContext.java | 12 +-
.../aether/impl/RepositorySystemLifecycle.java | 12 +-
.../internal/impl/DefaultRepositorySystem.java | 1 +
.../impl/DefaultRepositorySystemLifecycle.java | 8 +-
...emSession.java => DefaultCloseableSession.java} | 37 +++-
.../impl/session/DefaultSessionBuilder.java | 191 ++++-----------------
.../repository/ChainedLocalRepositoryManager.java | 13 ++
pom.xml | 2 +-
src/site/markdown/configuration.md | 3 +-
10 files changed, 146 insertions(+), 190 deletions(-)
diff --git
a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
index 2f1ce20c..bf7a8f52 100644
---
a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
+++
b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
@@ -20,6 +20,7 @@ package org.eclipse.aether;
import java.io.Closeable;
import java.io.File;
+import java.util.List;
import java.util.Map;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
@@ -55,9 +56,12 @@ public interface RepositorySystemSession {
* Immutable session that is closeable, should be handled as a resource.
These session instances can be
* created with {@link SessionBuilder}.
*
+ * @noimplement This interface is not intended to be implemented by
clients.
+ * @noextend This interface is not intended to be extended by clients.
+ *
* @since TBD
*/
- interface CloseableRepositorySystemSession extends
RepositorySystemSession, Closeable {
+ interface CloseableSession extends RepositorySystemSession, Closeable {
/**
* Returns the ID of this closeable session instance. Each closeable
session has different ID, unique within
* repository system they were created with.
@@ -88,8 +92,11 @@ public interface RepositorySystemSession {
}
/**
- * Builder for building {@link CloseableRepositorySystemSession}
instances. Builder instances can be created with
- * {@link RepositorySystem#createSessionBuilder()} method.
+ * Builder for building {@link CloseableSession} instances. Builder
instances can be created with
+ * {@link RepositorySystem#createSessionBuilder()} method. Instances are
not thread-safe nor immutable.
+ *
+ * @noimplement This interface is not intended to be implemented by
clients.
+ * @noextend This interface is not intended to be extended by clients.
*
* @since TBD
*/
@@ -386,12 +393,48 @@ public interface RepositorySystemSession {
SessionBuilder setCache(RepositoryCache cache);
/**
- * Shortcut method to set up local repository manager.
+ * Shortcut method to set up local repository manager directly onto
builder. There must be at least one non-null
+ * {@link File} passed in this method. In case multiple files, session
builder will use chained local repository
+ * manager.
+ *
+ * @param baseDirectories The local repository base directories.
+ * @return This session for chaining, never {@code null}.
+ * @see #newLocalRepositoryManager(LocalRepository...)
+ */
+ SessionBuilder withLocalRepositoryBaseDirectories(File...
baseDirectories);
+
+ /**
+ * Shortcut method to set up local repository manager directly onto
builder. There must be at least one non-null
+ * {@link File} present in passed in list. In case multiple files,
session builder will use chained local
+ * repository manager.
+ *
+ * @param baseDirectories The local repository base directories.
+ * @return This session for chaining, never {@code null}.
+ * @see #newLocalRepositoryManager(LocalRepository...)
+ */
+ SessionBuilder withLocalRepositoryBaseDirectories(List<File>
baseDirectories);
+
+ /**
+ * Shortcut method to set up local repository manager directly onto
builder. There must be at least one non-null
+ * {@link LocalRepository} passed in this method. In case multiple
local repositories, session builder will
+ * use chained local repository manager.
+ *
+ * @param localRepositories The local repositories.
+ * @return This session for chaining, never {@code null}.
+ * @see #newLocalRepositoryManager(LocalRepository...)
+ */
+ SessionBuilder withLocalRepositories(LocalRepository...
localRepositories);
+
+ /**
+ * Shortcut method to set up local repository manager directly onto
builder. There must be at least one non-null
+ * {@link LocalRepository} present in passed in list. In case multiple
local repositories, session builder will
+ * use chained local repository manager.
*
- * @param basedir The local repository base directory, may be {@code
null} if none.
+ * @param localRepositories The local repositories.
* @return This session for chaining, never {@code null}.
+ * @see #newLocalRepositoryManager(LocalRepository...)
*/
- SessionBuilder withLocalRepository(File basedir);
+ SessionBuilder withLocalRepositories(List<LocalRepository>
localRepositories);
/**
* Shortcut method to shallow-copy passed in session into current
builder.
@@ -404,7 +447,7 @@ public interface RepositorySystemSession {
/**
* Creates a session instance.
*/
- CloseableRepositorySystemSession build();
+ CloseableSession build();
}
/**
diff --git
a/maven-resolver-api/src/main/java/org/eclipse/aether/repository/AuthenticationContext.java
b/maven-resolver-api/src/main/java/org/eclipse/aether/repository/AuthenticationContext.java
index feaf052f..28ea0187 100644
---
a/maven-resolver-api/src/main/java/org/eclipse/aether/repository/AuthenticationContext.java
+++
b/maven-resolver-api/src/main/java/org/eclipse/aether/repository/AuthenticationContext.java
@@ -142,7 +142,7 @@ public final class AuthenticationContext implements
Closeable {
/**
* Gets an authentication context for the specified repository.
*
- * @param session The repository system session during which the
repository is accessed, must not be {@code null}.
+ * @param session The repository system session during which the
repository is accessed, may be {@code null}.
* @param repository The repository for which to create an authentication
context, must not be {@code null}.
* @return An authentication context for the repository or {@code null} if
no authentication is configured for it.
*/
@@ -153,7 +153,7 @@ public final class AuthenticationContext implements
Closeable {
/**
* Gets an authentication context for the proxy of the specified
repository.
*
- * @param session The repository system session during which the
repository is accessed, must not be {@code null}.
+ * @param session The repository system session during which the
repository is accessed, may be {@code null}.
* @param repository The repository for whose proxy to create an
authentication context, must not be {@code null}.
* @return An authentication context for the proxy or {@code null} if no
proxy is set or no authentication is
* configured for it.
@@ -173,17 +173,17 @@ public final class AuthenticationContext implements
Closeable {
private AuthenticationContext(
RepositorySystemSession session, RemoteRepository repository,
Proxy proxy, Authentication auth) {
- this.session = requireNonNull(session, "repository system session
cannot be null");
- this.repository = repository;
+ this.session = session;
+ this.repository = requireNonNull(repository, "null repository");
this.proxy = proxy;
this.auth = auth;
authData = new HashMap<>();
}
/**
- * Gets the repository system session during which the authentication
happens.
+ * Gets the repository system session during which the authentication
happens (if within session).
*
- * @return The repository system session, never {@code null}.
+ * @return The repository system session, may be {@code null} if context
is created outside of session.
*/
public RepositorySystemSession getSession() {
return session;
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/RepositorySystemLifecycle.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/RepositorySystemLifecycle.java
index 3048ed7e..37f849c5 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/RepositorySystemLifecycle.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/RepositorySystemLifecycle.java
@@ -18,7 +18,7 @@
*/
package org.eclipse.aether.impl;
-import
org.eclipse.aether.RepositorySystemSession.CloseableRepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
/**
* Lifecycle managing component for repository system.
@@ -49,25 +49,25 @@ public interface RepositorySystemLifecycle {
*
* @since TBD
*/
- void sessionStarted(CloseableRepositorySystemSession session);
+ void sessionStarted(CloseableSession session);
/**
* Signals that passed in session was ended, it will not be used anymore.
Repository system
* will invoke the registered handlers for this session, if any. This
method throws if the passed in session
- * instance was not passed to method {@link
#sessionStarted(CloseableRepositorySystemSession)} beforehand.
+ * instance was not passed to method {@link
#sessionStarted(CloseableSession)} beforehand.
* <p>
* <em>Same session instance can be ended only once.</em>
*
* @since TBD
*/
- void sessionEnded(CloseableRepositorySystemSession session);
+ void sessionEnded(CloseableSession session);
/**
* Registers an "on session end" handler.
* <p>
- * Throws if session was not passed to {@link
#sessionStarted(CloseableRepositorySystemSession)} beforehand.
+ * Throws if session was not passed to {@link
#sessionStarted(CloseableSession)} beforehand.
*
* @since TBD
*/
- void addOnSessionEndedHandle(CloseableRepositorySystemSession session,
Runnable handler);
+ void addOnSessionEndedHandle(CloseableSession session, Runnable handler);
}
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
index 3769bcc5..eaba5959 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
@@ -356,6 +356,7 @@ public class DefaultRepositorySystem implements
RepositorySystem {
RepositorySystemSession session, LocalRepository localRepository) {
requireNonNull(session, "session cannot be null");
requireNonNull(localRepository, "localRepository cannot be null");
+ validateSystem();
try {
return localRepositoryProvider.newLocalRepositoryManager(session,
localRepository);
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemLifecycle.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemLifecycle.java
index 73a25c7a..2472bbb1 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemLifecycle.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemLifecycle.java
@@ -29,7 +29,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.aether.MultiRuntimeException;
-import
org.eclipse.aether.RepositorySystemSession.CloseableRepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
import org.eclipse.aether.impl.RepositorySystemLifecycle;
import static java.util.Objects.requireNonNull;
@@ -89,7 +89,7 @@ public class DefaultRepositorySystemLifecycle implements
RepositorySystemLifecyc
}
@Override
- public void sessionStarted(CloseableRepositorySystemSession session) {
+ public void sessionStarted(CloseableSession session) {
requireNonNull(session, "session cannot be null");
requireNotShutdown();
String sessionId = session.sessionId();
@@ -102,7 +102,7 @@ public class DefaultRepositorySystemLifecycle implements
RepositorySystemLifecyc
}
@Override
- public void sessionEnded(CloseableRepositorySystemSession session) {
+ public void sessionEnded(CloseableSession session) {
requireNonNull(session, "session cannot be null");
requireNotShutdown();
String sessionId = session.sessionId();
@@ -127,7 +127,7 @@ public class DefaultRepositorySystemLifecycle implements
RepositorySystemLifecyc
}
@Override
- public void addOnSessionEndedHandle(CloseableRepositorySystemSession
session, Runnable handler) {
+ public void addOnSessionEndedHandle(CloseableSession session, Runnable
handler) {
requireNonNull(session, "session cannot be null");
requireNonNull(handler, "handler cannot be null");
requireNotShutdown();
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultCloseableRepositorySystemSession.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultCloseableSession.java
similarity index 85%
rename from
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultCloseableRepositorySystemSession.java
rename to
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultCloseableSession.java
index a9bc520d..da7b45e7 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultCloseableRepositorySystemSession.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultCloseableSession.java
@@ -19,13 +19,14 @@
package org.eclipse.aether.internal.impl.session;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.aether.RepositoryCache;
import org.eclipse.aether.RepositoryListener;
import org.eclipse.aether.RepositorySystem;
-import
org.eclipse.aether.RepositorySystemSession.CloseableRepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
import org.eclipse.aether.SessionData;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.collection.DependencyGraphTransformer;
@@ -43,13 +44,15 @@ import org.eclipse.aether.repository.WorkspaceReader;
import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
import org.eclipse.aether.resolution.ResolutionErrorPolicy;
import org.eclipse.aether.transfer.TransferListener;
+import org.eclipse.aether.util.repository.ChainedLocalRepositoryManager;
import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
/**
- * A default implementation of repository system session that is immutable.
+ * A default implementation of repository system session that is immutable and
thread-safe.
*/
-public final class DefaultCloseableRepositorySystemSession implements
CloseableRepositorySystemSession {
+public final class DefaultCloseableSession implements CloseableSession {
private final String sessionId;
private final AtomicBoolean closed;
@@ -109,7 +112,7 @@ public final class DefaultCloseableRepositorySystemSession
implements CloseableR
private final RepositorySystemLifecycle repositorySystemLifecycle;
@SuppressWarnings("checkstyle:parameternumber")
- public DefaultCloseableRepositorySystemSession(
+ public DefaultCloseableSession(
String sessionId,
AtomicBoolean closed,
boolean offline,
@@ -120,6 +123,7 @@ public final class DefaultCloseableRepositorySystemSession
implements CloseableR
String artifactUpdatePolicy,
String metadataUpdatePolicy,
LocalRepositoryManager localRepositoryManager,
+ List<LocalRepository> localRepositories,
WorkspaceReader workspaceReader,
RepositoryListener repositoryListener,
TransferListener transferListener,
@@ -148,7 +152,6 @@ public final class DefaultCloseableRepositorySystemSession
implements CloseableR
this.checksumPolicy = checksumPolicy;
this.artifactUpdatePolicy = artifactUpdatePolicy;
this.metadataUpdatePolicy = metadataUpdatePolicy;
- this.localRepositoryManager = requireNonNull(localRepositoryManager);
this.workspaceReader = workspaceReader;
this.repositoryListener = repositoryListener;
this.transferListener = transferListener;
@@ -170,11 +173,35 @@ public final class
DefaultCloseableRepositorySystemSession implements CloseableR
this.repositorySystem = requireNonNull(repositorySystem);
this.repositorySystemLifecycle =
requireNonNull(repositorySystemLifecycle);
+ this.localRepositoryManager =
getOrCreateLocalRepositoryManager(localRepositoryManager, localRepositories);
+
if (closed == null) {
repositorySystemLifecycle.sessionStarted(this);
}
}
+ private LocalRepositoryManager getOrCreateLocalRepositoryManager(
+ LocalRepositoryManager localRepositoryManager,
List<LocalRepository> localRepositories) {
+ if (localRepositoryManager != null) {
+ return localRepositoryManager;
+ } else if (localRepositories != null) {
+ if (localRepositories.isEmpty()) {
+ throw new IllegalArgumentException("empty localRepositories");
+ } else if (localRepositories.size() == 1) {
+ return repositorySystem.newLocalRepositoryManager(this,
localRepositories.get(0));
+ } else {
+ LocalRepositoryManager head =
+ repositorySystem.newLocalRepositoryManager(this,
localRepositories.get(0));
+ List<LocalRepositoryManager> tail =
localRepositories.subList(1, localRepositories.size()).stream()
+ .map(l ->
repositorySystem.newLocalRepositoryManager(this, l))
+ .collect(toList());
+ return new ChainedLocalRepositoryManager(head, tail, this);
+ }
+ } else {
+ throw new IllegalStateException("No local repository manager or
local repositories set on session");
+ }
+ }
+
@Override
public String sessionId() {
return sessionId;
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultSessionBuilder.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultSessionBuilder.java
index 2077d87e..70911608 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultSessionBuilder.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/session/DefaultSessionBuilder.java
@@ -19,8 +19,9 @@
package org.eclipse.aether.internal.impl.session;
import java.io.File;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -29,6 +30,7 @@ import org.eclipse.aether.RepositoryCache;
import org.eclipse.aether.RepositoryListener;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
import org.eclipse.aether.SessionData;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
@@ -50,16 +52,12 @@ import org.eclipse.aether.resolution.ResolutionErrorPolicy;
import org.eclipse.aether.transfer.TransferListener;
import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
/**
- * A default implementation of session builder.
- * <p>
- * Note: while this class implements {@link RepositorySystemSession}, it
should NOT be used as such, it is just
- * an internal technical detail to allow this class some more functional
helper abilities, like
- * {@link #withLocalRepository(File)} method is, where "chicken or egg"
situation would be present. This class is
- * NOT immutable nor thread safe.
+ * A default implementation of session builder. Is not immutable nor
thread-safe.
*/
-public final class DefaultSessionBuilder implements SessionBuilder,
RepositorySystemSession {
+public final class DefaultSessionBuilder implements SessionBuilder {
private static final MirrorSelector NULL_MIRROR_SELECTOR = r -> null;
private static final ProxySelector NULL_PROXY_SELECTOR =
RemoteRepository::getProxy;
@@ -76,8 +74,6 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
private final AtomicBoolean closed;
- private final ArrayList<Runnable> onCloseHandler;
-
private boolean offline;
private boolean ignoreArtifactDescriptorRepositories;
@@ -94,6 +90,8 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
private LocalRepositoryManager localRepositoryManager;
+ private List<LocalRepository> localRepositories;
+
private WorkspaceReader workspaceReader;
private RepositoryListener repositoryListener;
@@ -137,149 +135,6 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
this.repositorySystemLifecycle =
requireNonNull(repositorySystemLifecycle);
this.sessionId = requireNonNull(sessionId);
this.closed = closed;
- this.onCloseHandler = new ArrayList<>();
- }
-
- @Override
- public boolean isOffline() {
- return offline;
- }
-
- @Override
- public boolean isIgnoreArtifactDescriptorRepositories() {
- return ignoreArtifactDescriptorRepositories;
- }
-
- @Override
- public ResolutionErrorPolicy getResolutionErrorPolicy() {
- return resolutionErrorPolicy;
- }
-
- @Override
- public ArtifactDescriptorPolicy getArtifactDescriptorPolicy() {
- return artifactDescriptorPolicy;
- }
-
- @Override
- public String getChecksumPolicy() {
- return checksumPolicy;
- }
-
- @Override
- public String getUpdatePolicy() {
- return getArtifactUpdatePolicy();
- }
-
- @Override
- public String getArtifactUpdatePolicy() {
- return artifactUpdatePolicy;
- }
-
- @Override
- public String getMetadataUpdatePolicy() {
- return metadataUpdatePolicy;
- }
-
- @Override
- public LocalRepository getLocalRepository() {
- return localRepositoryManager.getRepository();
- }
-
- @Override
- public LocalRepositoryManager getLocalRepositoryManager() {
- return localRepositoryManager;
- }
-
- @Override
- public WorkspaceReader getWorkspaceReader() {
- return workspaceReader;
- }
-
- @Override
- public RepositoryListener getRepositoryListener() {
- return repositoryListener;
- }
-
- @Override
- public TransferListener getTransferListener() {
- return transferListener;
- }
-
- @Override
- public Map<String, String> getSystemProperties() {
- return systemProperties;
- }
-
- @Override
- public Map<String, String> getUserProperties() {
- return userProperties;
- }
-
- @Override
- public Map<String, Object> getConfigProperties() {
- return configProperties;
- }
-
- @Override
- public MirrorSelector getMirrorSelector() {
- return mirrorSelector;
- }
-
- @Override
- public ProxySelector getProxySelector() {
- return proxySelector;
- }
-
- @Override
- public AuthenticationSelector getAuthenticationSelector() {
- return authenticationSelector;
- }
-
- @Override
- public ArtifactTypeRegistry getArtifactTypeRegistry() {
- return artifactTypeRegistry;
- }
-
- @Override
- public DependencyTraverser getDependencyTraverser() {
- return dependencyTraverser;
- }
-
- @Override
- public DependencyManager getDependencyManager() {
- return dependencyManager;
- }
-
- @Override
- public DependencySelector getDependencySelector() {
- return dependencySelector;
- }
-
- @Override
- public VersionFilter getVersionFilter() {
- return versionFilter;
- }
-
- @Override
- public DependencyGraphTransformer getDependencyGraphTransformer() {
- return dependencyGraphTransformer;
- }
-
- @Override
- public SessionData getData() {
- return data;
- }
-
- @Override
- public RepositoryCache getCache() {
- return cache;
- }
-
- @Override
- public boolean addOnSessionEndedHandler(Runnable handler) {
- requireNonNull(handler, "null handler");
- onCloseHandler.add(handler);
- return true;
}
@Override
@@ -485,9 +340,26 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
}
@Override
- public SessionBuilder withLocalRepository(File basedir) {
- LocalRepository localRepository = new LocalRepository(basedir,
"default");
- this.localRepositoryManager =
repositorySystem.newLocalRepositoryManager(this, localRepository);
+ public SessionBuilder withLocalRepositoryBaseDirectories(File...
baseDirectories) {
+ return
withLocalRepositoryBaseDirectories(Arrays.asList(baseDirectories));
+ }
+
+ @Override
+ public SessionBuilder withLocalRepositoryBaseDirectories(List<File>
baseDirectories) {
+ requireNonNull(baseDirectories, "null baseDirectories");
+ return withLocalRepositories(
+
baseDirectories.stream().map(LocalRepository::new).collect(toList()));
+ }
+
+ @Override
+ public SessionBuilder withLocalRepositories(LocalRepository...
localRepositories) {
+ return withLocalRepositories(Arrays.asList(localRepositories));
+ }
+
+ @Override
+ public SessionBuilder withLocalRepositories(List<LocalRepository>
localRepositories) {
+ requireNonNull(localRepositories, "null localRepositories");
+ this.localRepositories = localRepositories;
return this;
}
@@ -523,8 +395,8 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
}
@Override
- public CloseableRepositorySystemSession build() {
- CloseableRepositorySystemSession result = new
DefaultCloseableRepositorySystemSession(
+ public CloseableSession build() {
+ return new DefaultCloseableSession(
sessionId,
closed,
offline,
@@ -535,6 +407,7 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
artifactUpdatePolicy,
metadataUpdatePolicy,
localRepositoryManager,
+ localRepositories,
workspaceReader,
repositoryListener,
transferListener,
@@ -554,8 +427,6 @@ public final class DefaultSessionBuilder implements
SessionBuilder, RepositorySy
cache,
repositorySystem,
repositorySystemLifecycle);
- onCloseHandler.forEach(result::addOnSessionEndedHandler);
- return result;
}
@SuppressWarnings("checkstyle:magicnumber")
diff --git
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedLocalRepositoryManager.java
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedLocalRepositoryManager.java
index d53b560f..f9a7d3ba 100644
---
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedLocalRepositoryManager.java
+++
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedLocalRepositoryManager.java
@@ -35,6 +35,7 @@ import org.eclipse.aether.repository.LocalMetadataResult;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.LocalRepositoryManager;
import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.util.ConfigUtils;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
@@ -50,6 +51,10 @@ import static java.util.stream.Collectors.toList;
* @since 1.9.2
*/
public final class ChainedLocalRepositoryManager implements
LocalRepositoryManager {
+ public static final String IGNORE_TAIL_AVAILABILITY =
"aether.chainedLocalRepository.ignoreTailAvailability";
+
+ private static final boolean DEFAULT_IGNORE_TAIL_AVAILABILITY = true;
+
private final LocalRepositoryManager head;
private final List<LocalRepositoryManager> tail;
@@ -63,6 +68,14 @@ public final class ChainedLocalRepositoryManager implements
LocalRepositoryManag
this.ignoreTailAvailability = ignoreTailAvailability;
}
+ public ChainedLocalRepositoryManager(
+ LocalRepositoryManager head, List<LocalRepositoryManager> tail,
RepositorySystemSession session) {
+ this.head = requireNonNull(head, "head cannot be null");
+ this.tail = requireNonNull(tail, "tail cannot be null");
+ this.ignoreTailAvailability =
+ ConfigUtils.getBoolean(session,
DEFAULT_IGNORE_TAIL_AVAILABILITY, IGNORE_TAIL_AVAILABILITY);
+ }
+
@Override
public LocalRepository getRepository() {
return head.getRepository();
diff --git a/pom.xml b/pom.xml
index c429416c..0a0c11fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -101,7 +101,7 @@
<mavenVersion>4.0.0-alpha-8</mavenVersion>
<minimalMavenBuildVersion>[3.8.8,)</minimalMavenBuildVersion>
<!-- MRESOLVER-422: keep this in sync with Javadoc plugin configuration
(but cannot directly, as this below is range) -->
- <minimalJavaBuildVersion>[21.0.1,)</minimalJavaBuildVersion>
+ <minimalJavaBuildVersion>[21,)</minimalJavaBuildVersion>
<project.build.outputTimestamp>2023-11-02T11:01:10Z</project.build.outputTimestamp>
</properties>
diff --git a/src/site/markdown/configuration.md
b/src/site/markdown/configuration.md
index acd48b5f..e34f4e34 100644
--- a/src/site/markdown/configuration.md
+++ b/src/site/markdown/configuration.md
@@ -26,7 +26,8 @@ Option | Type | Description | Default Value | Supports Repo
ID Suffix
`aether.artifactResolver.postProcessor.trustedChecksums.checksumAlgorithms` |
String | Comma-separated list of checksum algorithms with which
`trustedChecksums` should operate (validate or record). | `"SHA-1"` | no
`aether.artifactResolver.postProcessor.trustedChecksums.failIfMissing` |
boolean | Makes `trustedChecksums` fail validation if a trusted checksum for an
artifact is missing. | `false` | no
`aether.artifactResolver.postProcessor.trustedChecksums.record` | boolean |
Makes `trustedChecksums` calculate and record checksums. | `false` | no
-`aether.artifactResolver.postProcessor.trustedChecksums.snapshots` | boolean |
Enables or disables snapshot processing in `trustedChecksums` post processor. |
`false` | no
+`aether.artifactResolver.postProcessor.trustedChecksums.snapshots` | boolean |
Enables or disables snapshot processing in `trustedChecksums` post processor. |
`false` | no
+`aether.chainedLocalRepository.ignoreTailAvailability` | boolean | When
chained local repository is used, whether the tail availability should be
ignored or not. | `true` | no
`aether.checksums.omitChecksumsForExtensions` | String | Comma-separated list
of extensions with leading dot (example `.asc`) that should have checksums
omitted. These are applied to sub-artifacts only. Note: to achieve 1.7.x
`aether.checksums.forSignature=true` behaviour, pass empty string as value for
this property. | `.asc,.sigstore` | no
`aether.checksums.algorithms` | String | Comma-separated list of checksum
algorithms with which checksums are validated (downloaded) and generated
(uploaded). Resolver by default supports following algorithms: `MD5`, `SHA-1`,
`SHA-256` and `SHA-512`. New algorithms can be added by implementing
`ChecksumAlgorithmFactory` component. | `"SHA-1,MD5"` | yes
`aether.conflictResolver.verbose` | boolean | Flag controlling the conflict
resolver's verbose mode. | `false` | no