![JAR search and dependency download from the Maven repository](/logo.png)
net.java.trueupdate.artifact.maven.MavenArtifactResolver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of trueupdate-artifact-maven Show documentation
Show all versions of trueupdate-artifact-maven Show documentation
Provides an artifact resolver which is based on a local Maven
repository and some optional remote Maven repositories.
The newest version!
/*
* Copyright (C) 2013 Schlichtherle IT Services & Stimulus Software.
* All rights reserved. Use is subject to license terms.
*/
package net.java.trueupdate.artifact.maven;
import net.java.trueupdate.artifact.spec.ArtifactDescriptor;
import net.java.trueupdate.artifact.spec.ArtifactResolver;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositoryException;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.impl.DefaultServiceLocator;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.*;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.spi.locator.ServiceLocator;
import org.eclipse.aether.spi.log.LoggerFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
import org.eclipse.aether.version.Version;
import javax.annotation.CheckForNull;
import javax.annotation.concurrent.Immutable;
import java.io.File;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.List;
import static java.util.Arrays.asList;
import static net.java.trueupdate.artifact.maven.ArtifactConverters.artifact;
import static net.java.trueupdate.artifact.maven.ArtifactConverters.updateRangeArtifact;
/**
* Resolves paths to described artifacts and their latest update by looking
* them up in a local repository and some optional remote repositories.
*
* @author Christian Schlichtherle
*/
@Immutable
public final class MavenArtifactResolver implements ArtifactResolver {
private final LocalRepository local;
private final List remotes;
private transient volatile ServiceLocator serviceLocator;
private transient volatile RepositorySystemSession repositorySystemSession;
public MavenArtifactResolver(final MavenParameters parameters) {
this.local = parameters.localRepository();
this.remotes = parameters.remoteRepositories();
}
@Override public File resolveArtifactFile(ArtifactDescriptor descriptor)
throws Exception {
return resolveArtifact(descriptor).getFile();
}
private Artifact resolveArtifact(ArtifactDescriptor descriptor)
throws RepositoryException {
return resolveArtifact(artifact(descriptor));
}
private Artifact resolveArtifact(final Artifact artifact)
throws RepositoryException {
final ArtifactResult artifactResult =
resolveArtifact(artifactRequest(artifact));
final @CheckForNull Artifact resolved = artifactResult.getArtifact();
if (null == resolved)
throw new ArtifactResolutionException(asList(artifactResult),
"Artifact not found.");
return resolved;
}
@Override public String resolveUpdateVersion(ArtifactDescriptor descriptor)
throws Exception {
return resolveUpdateArtifact(descriptor).getVersion();
}
private Artifact resolveUpdateArtifact(ArtifactDescriptor descriptor)
throws RepositoryException {
try {
return resolveUpdateArtifact(updateRangeArtifact(descriptor));
} catch (final VersionRangeResolutionException ex) {
// Try to throw a more specific exception, otherwise propagate ex.
resolveArtifact(descriptor);
throw ex;
}
}
private Artifact resolveUpdateArtifact(final Artifact updateRangeArtifact)
throws RepositoryException {
final VersionRangeResult result =
resolveVersionRange(versionRangeRequest(updateRangeArtifact));
final @CheckForNull Version highestVersion =
result.getHighestVersion();
if (null == highestVersion)
throw new VersionRangeResolutionException(result,
"Update artifact not found.");
return updateRangeArtifact.setVersion(highestVersion.toString());
}
private VersionRangeResult resolveVersionRange(VersionRangeRequest request)
throws VersionRangeResolutionException {
return repositorySystem().resolveVersionRange(repositorySystemSession(),
request);
}
private ArtifactResult resolveArtifact(ArtifactRequest request)
throws ArtifactResolutionException {
return repositorySystem().resolveArtifact(repositorySystemSession(),
request);
}
private VersionRangeRequest versionRangeRequest(Artifact artifact) {
return new VersionRangeRequest()
.setRepositories(remotes)
.setArtifact(artifact);
}
private ArtifactRequest artifactRequest(Artifact artifact) {
return new ArtifactRequest()
.setRepositories(remotes)
.setArtifact(artifact);
}
private RepositorySystemSession repositorySystemSession() {
final RepositorySystemSession rss = this.repositorySystemSession;
return null != rss
? rss
: (this.repositorySystemSession = newRepositorySystemSession());
}
private RepositorySystemSession newRepositorySystemSession() {
final LoggerFactory loggerFactory = loggerFactory();
final DefaultRepositorySystemSession session =
MavenRepositorySystemUtils
.newSession()
.setTransferListener(new LogTransferListener(loggerFactory))
.setRepositoryListener(new LogRepositoryListener(loggerFactory));
session.setLocalRepositoryManager(
repositorySystem().newLocalRepositoryManager(session, local));
return session;
}
private RepositorySystem repositorySystem() {
return serviceLocator().getService(RepositorySystem.class);
}
private LoggerFactory loggerFactory() {
return serviceLocator().getService(LoggerFactory.class);
}
private ServiceLocator serviceLocator() {
final ServiceLocator sl = this.serviceLocator;
return null != sl ? sl : (this.serviceLocator = newServiceLocator());
}
private static ServiceLocator newServiceLocator() {
final DefaultServiceLocator sl = MavenRepositorySystemUtils
.newServiceLocator()
.addService(RepositoryConnectorFactory.class,
BasicRepositoryConnectorFactory.class)
.addService(TransporterFactory.class,
HttpTransporterFactory.class);
sl.setErrorHandler(errorHandler());
return sl;
}
private static DefaultServiceLocator.ErrorHandler errorHandler() {
return new DefaultServiceLocator.ErrorHandler() {
@Override public void serviceCreationFailed(
Class> type,
Class> impl,
Throwable exception) {
throw new UndeclaredThrowableException(exception);
}
};
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy