Skip to content
Commits on Source (2)
language: java
sudo: false
dist: trusty
matrix:
include:
- os: linux
jdk: openjdk7
- os: linux
jdk: openjdk8
- os: linux
jdk: openjdk10
before_install:
# https://github.com/travis-ci/travis-ci/issues/8408
- unset _JAVA_OPTIONS
install: mvn clean dependency:go-offline -V
before_script: true
script:
- mvn verify
cache:
directories:
- "$HOME/.cache"
- "$HOME/.m2"
/*
/**
* 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
......@@ -17,34 +17,4 @@
* under the License.
*/
properties([buildDiscarder(logRotator(artifactNumToKeepStr: '5', numToKeepStr: env.BRANCH_NAME=='master'?'10':'5'))])
node('ubuntu') {
try {
stage('Checkout')
def MAVEN_BUILD=tool name: 'Maven 3.3.9', type: 'hudson.tasks.Maven$MavenInstallation'
echo "Driving build and unit tests using Maven $MAVEN_BUILD"
def JAVA7_HOME=tool name: 'JDK 1.7 (latest)', type: 'hudson.model.JDK'
echo "Running build and unit tests with Java $JAVA7_HOME"
dir('build') {
deleteDir()
}
dir('build') {
checkout scm
}
stage('Build/Test')
def WORK_DIR=pwd()
dir('build') {
try {
withEnv(["PATH+MAVEN=$MAVEN_BUILD/bin","PATH+JDK=$JAVA7_HOME/bin"]) {
sh "mvn clean verify -B -U -e -fae -V -Dmaven.test.failure.ignore=true -Dmaven.repo.local=$WORK_DIR/.repository"
}
} finally {
junit allowEmptyResults: true, testResults:'**/target/*-reports/*.xml'
archiveArtifacts allowEmptyArchive: true, artifacts: '**/target/rat.txt'
}
}
} finally {
emailext body: "See ${env.BUILD_URL}", recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'FailingTestSuspectsRecipientProvider'], [$class: 'FirstFailingBuildSuspectsRecipientProvider']], replyTo: 'dev@maven.apache.org', subject: "Maven Resolver Jenkinsfile finished with ${currentBuild.result}", to: 'notifications@maven.apache.org'
}
}
asfMavenTlpStdBuild()
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver</artifactId>
<version>1.1.1</version>
<version>1.3.1</version>
</parent>
<artifactId>maven-resolver-api</artifactId>
......@@ -36,7 +36,8 @@
</description>
<properties>
<AutomaticModuleName>org.apache.maven.resolver</AutomaticModuleName>
<Automatic-Module-Name>org.apache.maven.resolver</Automatic-Module-Name>
<Bundle-SymbolicName>${Automatic-Module-Name}.api</Bundle-SymbolicName>
</properties>
<dependencies>
......@@ -50,5 +51,29 @@
<artifactId>hamcrest-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${project.build.directory}/osgi/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
......@@ -36,6 +36,7 @@ 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.transform.FileTransformerManager;
/**
* A special repository system session to enable decorating or proxying another session. To do so, clients have to
......@@ -61,129 +62,160 @@ public abstract class AbstractForwardingRepositorySystemSession
*/
protected abstract RepositorySystemSession getSession();
@Override
public boolean isOffline()
{
return getSession().isOffline();
}
@Override
public boolean isIgnoreArtifactDescriptorRepositories()
{
return getSession().isIgnoreArtifactDescriptorRepositories();
}
@Override
public ResolutionErrorPolicy getResolutionErrorPolicy()
{
return getSession().getResolutionErrorPolicy();
}
@Override
public ArtifactDescriptorPolicy getArtifactDescriptorPolicy()
{
return getSession().getArtifactDescriptorPolicy();
}
@Override
public String getChecksumPolicy()
{
return getSession().getChecksumPolicy();
}
@Override
public String getUpdatePolicy()
{
return getSession().getUpdatePolicy();
}
@Override
public LocalRepository getLocalRepository()
{
return getSession().getLocalRepository();
}
@Override
public LocalRepositoryManager getLocalRepositoryManager()
{
return getSession().getLocalRepositoryManager();
}
@Override
public WorkspaceReader getWorkspaceReader()
{
return getSession().getWorkspaceReader();
}
@Override
public RepositoryListener getRepositoryListener()
{
return getSession().getRepositoryListener();
}
@Override
public TransferListener getTransferListener()
{
return getSession().getTransferListener();
}
@Override
public Map<String, String> getSystemProperties()
{
return getSession().getSystemProperties();
}
@Override
public Map<String, String> getUserProperties()
{
return getSession().getUserProperties();
}
@Override
public Map<String, Object> getConfigProperties()
{
return getSession().getConfigProperties();
}
@Override
public MirrorSelector getMirrorSelector()
{
return getSession().getMirrorSelector();
}
@Override
public ProxySelector getProxySelector()
{
return getSession().getProxySelector();
}
@Override
public AuthenticationSelector getAuthenticationSelector()
{
return getSession().getAuthenticationSelector();
}
@Override
public ArtifactTypeRegistry getArtifactTypeRegistry()
{
return getSession().getArtifactTypeRegistry();
}
@Override
public DependencyTraverser getDependencyTraverser()
{
return getSession().getDependencyTraverser();
}
@Override
public DependencyManager getDependencyManager()
{
return getSession().getDependencyManager();
}
@Override
public DependencySelector getDependencySelector()
{
return getSession().getDependencySelector();
}
@Override
public VersionFilter getVersionFilter()
{
return getSession().getVersionFilter();
}
@Override
public DependencyGraphTransformer getDependencyGraphTransformer()
{
return getSession().getDependencyGraphTransformer();
}
@Override
public SessionData getData()
{
return getSession().getData();
}
@Override
public RepositoryCache getCache()
{
return getSession().getCache();
}
@Override
public FileTransformerManager getFileTransformerManager()
{
return getSession().getFileTransformerManager();
}
}
......@@ -24,6 +24,9 @@ import java.util.HashMap;
import java.util.Map;
import static java.util.Objects.requireNonNull;
import java.util.Collection;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.ArtifactType;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.collection.DependencyGraphTransformer;
......@@ -44,6 +47,8 @@ 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.transform.FileTransformer;
import org.eclipse.aether.transform.FileTransformerManager;
/**
* A simple repository system session.
......@@ -73,6 +78,8 @@ public final class DefaultRepositorySystemSession
private LocalRepositoryManager localRepositoryManager;
private FileTransformerManager fileTransformerManager;
private WorkspaceReader workspaceReader;
private RepositoryListener repositoryListener;
......@@ -130,6 +137,7 @@ public final class DefaultRepositorySystemSession
proxySelector = NullProxySelector.INSTANCE;
authenticationSelector = NullAuthenticationSelector.INSTANCE;
artifactTypeRegistry = NullArtifactTypeRegistry.INSTANCE;
fileTransformerManager = NullFileTransformerManager.INSTANCE;
data = new DefaultSessionData();
}
......@@ -167,6 +175,7 @@ public final class DefaultRepositorySystemSession
setDependencySelector( session.getDependencySelector() );
setVersionFilter( session.getVersionFilter() );
setDependencyGraphTransformer( session.getDependencyGraphTransformer() );
setFileTransformerManager( session.getFileTransformerManager() );
setData( session.getData() );
setCache( session.getCache() );
}
......@@ -317,6 +326,23 @@ public final class DefaultRepositorySystemSession
return this;
}
@Override
public FileTransformerManager getFileTransformerManager()
{
return fileTransformerManager;
}
public DefaultRepositorySystemSession setFileTransformerManager( FileTransformerManager fileTransformerManager )
{
failIfReadOnly();
this.fileTransformerManager = fileTransformerManager;
if ( this.fileTransformerManager == null )
{
this.fileTransformerManager = NullFileTransformerManager.INSTANCE;
}
return this;
}
public WorkspaceReader getWorkspaceReader()
{
return workspaceReader;
......@@ -829,4 +855,15 @@ public final class DefaultRepositorySystemSession
}
static final class NullFileTransformerManager implements FileTransformerManager
{
public static final FileTransformerManager INSTANCE = new NullFileTransformerManager();
@Override
public Collection<FileTransformer> getTransformersForArtifact( Artifact artifact )
{
return Collections.emptyList();
}
}
}
......@@ -37,6 +37,7 @@ 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.transform.FileTransformerManager;
/**
* Defines settings and components that control the repository system. Once initialized, the session object itself is
......@@ -260,4 +261,11 @@ public interface RepositorySystemSession
*/
RepositoryCache getCache();
/**
* Get the file transformer manager
*
* @return the manager, never {@code null}
*/
FileTransformerManager getFileTransformerManager();
}
......@@ -33,6 +33,8 @@ import java.util.regex.Pattern;
public final class DefaultArtifact
extends AbstractArtifact
{
private static final Pattern COORDINATE_PATTERN =
Pattern.compile( "([^: ]+):([^: ]+)(:([^: ]*)(:([^: ]+))?)?:([^: ]+)" );
private final String groupId;
......@@ -70,8 +72,7 @@ public final class DefaultArtifact
*/
public DefaultArtifact( String coords, Map<String, String> properties )
{
Pattern p = Pattern.compile( "([^: ]+):([^: ]+)(:([^: ]*)(:([^: ]+))?)?:([^: ]+)" );
Matcher m = p.matcher( coords );
Matcher m = COORDINATE_PATTERN.matcher( coords );
if ( !m.matches() )
{
throw new IllegalArgumentException( "Bad artifact coordinates " + coords
......
package org.eclipse.aether.transform;
/*
* 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 java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.aether.artifact.Artifact;
/**
* Can transform a file while installing/deploying
*
* @author Robert Scholte
* @since 1.3.0
*/
public interface FileTransformer
{
/**
* Transform the target location
*
* @param artifact the original artifact
* @return the transformed artifact
*/
Artifact transformArtifact( Artifact artifact );
/**
* Transform the data
*
* @param file the file with the original data
* @return the transformed data
*/
InputStream transformData( File file ) throws IOException;
}
package org.eclipse.aether.transform;
/*
* 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 java.util.Collection;
import org.eclipse.aether.artifact.Artifact;
/**
* Manager the FileTransformers
*
* @author Robert Scholte
* @since 1.3.0
*/
public interface FileTransformerManager
{
/**
* <p>
* All transformers for this specific artifact. Be aware that if you want to create additional files, but also want
* to the original to be deployed, you must add an explicit transformer for that file too (one that doesn't
* transform the artifact and data).
* </p>
*
* <p><strong>IMPORTANT</strong> When using a fileTransformer, the content of the file is stored in memory to ensure
* that file content and checksums stay in sync!
* </p>
*
* @param artifact the artifact
* @return a collection of FileTransformers to apply on the artifact, never {@code null}
*/
Collection<FileTransformer> getTransformersForArtifact( Artifact artifact );
}
......@@ -18,10 +18,13 @@ package org.eclipse.aether;
* specific language governing permissions and limitations
* under the License.
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.junit.Assert.*;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
import org.eclipse.aether.repository.Authentication;
import org.eclipse.aether.repository.AuthenticationContext;
......@@ -29,6 +32,7 @@ import org.eclipse.aether.repository.AuthenticationDigest;
import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.RemoteRepository;
import org.junit.Test;
import org.mockito.Mockito;
/**
*/
......@@ -124,4 +128,20 @@ public class DefaultRepositorySystemSessionTest
}
}
@Test
public void testCopyRepositorySystemSession() throws Exception
{
RepositorySystemSession session = Mockito.mock( RepositorySystemSession.class, Mockito.RETURNS_MOCKS );
RepositorySystemSession newSession = new DefaultRepositorySystemSession( session );
Method[] methods = RepositorySystemSession.class.getMethods();
for ( Method method : methods )
{
assertEquals( method.getName(), method.invoke( session ) == null, method.invoke( newSession ) == null );
}
}
}
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver</artifactId>
<version>1.1.1</version>
<version>1.3.1</version>
</parent>
<artifactId>maven-resolver-connector-basic</artifactId>
......@@ -36,7 +36,8 @@
</description>
<properties>
<AutomaticModuleName>org.apache.maven.resolver.connector.basic</AutomaticModuleName>
<Automatic-Module-Name>org.apache.maven.resolver.connector.basic</Automatic-Module-Name>
<Bundle-SymbolicName>${Automatic-Module-Name}</Bundle-SymbolicName>
</properties>
<dependencies>
......@@ -58,6 +59,15 @@
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.sonatype.sisu</groupId>
<artifactId>sisu-guice</artifactId>
......@@ -87,6 +97,19 @@
<groupId>org.eclipse.sisu</groupId>
<artifactId>sisu-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${project.build.directory}/osgi/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
......@@ -19,15 +19,18 @@ package org.eclipse.aether.connector.basic;
* under the License.
*/
import static java.util.Objects.requireNonNull;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import static java.util.Objects.requireNonNull;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
......@@ -54,17 +57,19 @@ import org.eclipse.aether.spi.connector.transport.PutTask;
import org.eclipse.aether.spi.connector.transport.Transporter;
import org.eclipse.aether.spi.connector.transport.TransporterProvider;
import org.eclipse.aether.spi.io.FileProcessor;
import org.eclipse.aether.spi.log.Logger;
import org.eclipse.aether.transfer.ChecksumFailureException;
import org.eclipse.aether.transfer.NoRepositoryConnectorException;
import org.eclipse.aether.transfer.NoRepositoryLayoutException;
import org.eclipse.aether.transfer.NoTransporterException;
import org.eclipse.aether.transfer.TransferEvent;
import org.eclipse.aether.transfer.TransferResource;
import org.eclipse.aether.transform.FileTransformer;
import org.eclipse.aether.util.ChecksumUtils;
import org.eclipse.aether.util.ConfigUtils;
import org.eclipse.aether.util.concurrency.RunnableErrorForwarder;
import org.eclipse.aether.util.concurrency.WorkerThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*/
......@@ -80,7 +85,7 @@ final class BasicRepositoryConnector
private static final String CONFIG_PROP_SMART_CHECKSUMS = "aether.connector.smartChecksums";
private final Logger logger;
private static final Logger LOGGER = LoggerFactory.getLogger( BasicRepositoryConnector.class );
private final FileProcessor fileProcessor;
......@@ -108,8 +113,7 @@ final class BasicRepositoryConnector
BasicRepositoryConnector( RepositorySystemSession session, RemoteRepository repository,
TransporterProvider transporterProvider, RepositoryLayoutProvider layoutProvider,
ChecksumPolicyProvider checksumPolicyProvider, FileProcessor fileProcessor,
Logger logger )
ChecksumPolicyProvider checksumPolicyProvider, FileProcessor fileProcessor )
throws NoRepositoryConnectorException
{
try
......@@ -133,7 +137,6 @@ final class BasicRepositoryConnector
this.session = session;
this.repository = repository;
this.fileProcessor = fileProcessor;
this.logger = logger;
maxThreads = ConfigUtils.getInteger( session, 5, CONFIG_PROP_THREADS, "maven.artifact.threads" );
smartChecksums = ConfigUtils.getBoolean( session, true, CONFIG_PROP_SMART_CHECKSUMS );
......@@ -150,7 +153,7 @@ final class BasicRepositoryConnector
ConfigUtils.getInteger( session, ConfigurationProperties.DEFAULT_REQUEST_TIMEOUT,
ConfigurationProperties.REQUEST_TIMEOUT + '.' + repository.getId(),
ConfigurationProperties.REQUEST_TIMEOUT );
partialFileFactory = new PartialFile.Factory( resumeDownloads, resumeThreshold, requestTimeout, logger );
partialFileFactory = new PartialFile.Factory( resumeDownloads, resumeThreshold, requestTimeout );
}
private Executor getExecutor( Collection<?> artifacts, Collection<?> metadatas )
......@@ -280,7 +283,7 @@ final class BasicRepositoryConnector
List<RepositoryLayout.Checksum> checksums = layout.getChecksums( transfer.getArtifact(), true, location );
Runnable task = new PutTaskRunner( location, transfer.getFile(), checksums, listener );
Runnable task = new PutTaskRunner( location, transfer.getFile(), transfer.getFileTransformer(), checksums, listener );
task.run();
}
......@@ -403,7 +406,7 @@ final class BasicRepositoryConnector
super( path, listener );
this.file = requireNonNull( file, "destination file cannot be null" );
checksumValidator =
new ChecksumValidator( logger, file, fileProcessor, this, checksumPolicy, safe( checksums ) );
new ChecksumValidator( file, fileProcessor, this, checksumPolicy, safe( checksums ) );
}
public void checkRemoteAccess()
......@@ -438,7 +441,7 @@ final class BasicRepositoryConnector
PartialFile partFile = partialFileFactory.newInstance( file, this );
if ( partFile == null )
{
logger.debug( "Concurrent download of " + file + " just finished, skipping download" );
LOGGER.debug( "Concurrent download of {} just finished, skipping download", file );
return;
}
......@@ -496,24 +499,70 @@ final class BasicRepositoryConnector
private final File file;
private final FileTransformer fileTransformer;
private final Collection<RepositoryLayout.Checksum> checksums;
PutTaskRunner( URI path, File file, List<RepositoryLayout.Checksum> checksums,
TransferTransportListener<?> listener )
{
this( path, file, null, checksums, listener );
}
/**
* <strong>IMPORTANT</strong> When using a fileTransformer, the content of the file is stored in memory to
* ensure that file content and checksums stay in sync!
*
* @param path
* @param file
* @param fileTransformer
* @param checksums
* @param listener
*/
PutTaskRunner( URI path, File file, FileTransformer fileTransformer, List<RepositoryLayout.Checksum> checksums,
TransferTransportListener<?> listener )
{
super( path, listener );
this.file = requireNonNull( file, "source file cannot be null" );
this.fileTransformer = fileTransformer;
this.checksums = safe( checksums );
}
protected void runTask()
throws Exception
{
if ( fileTransformer != null )
{
// transform data once to byte array, ensure constant data for checksum
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
try ( InputStream transformData = fileTransformer.transformData( file ) )
{
for ( int read; ( read = transformData.read( buffer, 0, buffer.length ) ) != -1; )
{
baos.write( buffer, 0, read );
}
}
byte[] bytes = baos.toByteArray();
transporter.put( new PutTask( path ).setDataBytes( bytes ).setListener( listener ) );
uploadChecksums( file, bytes, path );
}
else
{
transporter.put( new PutTask( path ).setDataFile( file ).setListener( listener ) );
uploadChecksums( file, path );
uploadChecksums( file, null , path );
}
}
private void uploadChecksums( File file, URI location )
/**
*
* @param file source
* @param bytes transformed data from file or {@code null}
* @param location target
*/
private void uploadChecksums( File file, byte[] bytes, URI location )
{
if ( checksums.isEmpty() )
{
......@@ -521,12 +570,22 @@ final class BasicRepositoryConnector
}
try
{
Set<String> algos = new HashSet<String>();
Set<String> algos = new HashSet<>();
for ( RepositoryLayout.Checksum checksum : checksums )
{
algos.add( checksum.getAlgorithm() );
}
Map<String, Object> sumsByAlgo = ChecksumUtils.calc( file, algos );
Map<String, Object> sumsByAlgo;
if ( bytes != null )
{
sumsByAlgo = ChecksumUtils.calc( bytes, algos );
}
else
{
sumsByAlgo = ChecksumUtils.calc( file, algos );
}
for ( RepositoryLayout.Checksum checksum : checksums )
{
uploadChecksum( checksum.getLocation(), sumsByAlgo.get( checksum.getAlgorithm() ) );
......@@ -535,13 +594,13 @@ final class BasicRepositoryConnector
catch ( IOException e )
{
String msg = "Failed to upload checksums for " + file + ": " + e.getMessage();
if ( logger.isDebugEnabled() )
if ( LOGGER.isDebugEnabled() )
{
logger.warn( msg, e );
LOGGER.warn( msg, e );
}
else
{
logger.warn( msg );
LOGGER.warn( msg );
}
}
}
......@@ -559,13 +618,13 @@ final class BasicRepositoryConnector
catch ( Exception e )
{
String msg = "Failed to upload checksum " + location + ": " + e.getMessage();
if ( logger.isDebugEnabled() )
if ( LOGGER.isDebugEnabled() )
{
logger.warn( msg, e );
LOGGER.warn( msg, e );
}
else
{
logger.warn( msg );
LOGGER.warn( msg );
}
}
}
......
......@@ -34,9 +34,6 @@ import org.eclipse.aether.spi.connector.transport.TransporterProvider;
import org.eclipse.aether.spi.io.FileProcessor;
import org.eclipse.aether.spi.locator.Service;
import org.eclipse.aether.spi.locator.ServiceLocator;
import org.eclipse.aether.spi.log.Logger;
import org.eclipse.aether.spi.log.LoggerFactory;
import org.eclipse.aether.spi.log.NullLoggerFactory;
import org.eclipse.aether.transfer.NoRepositoryConnectorException;
/**
......@@ -48,9 +45,6 @@ import org.eclipse.aether.transfer.NoRepositoryConnectorException;
public final class BasicRepositoryConnectorFactory
implements RepositoryConnectorFactory, Service
{
private Logger logger = NullLoggerFactory.LOGGER;
private TransporterProvider transporterProvider;
private RepositoryLayoutProvider layoutProvider;
......@@ -73,37 +67,22 @@ public final class BasicRepositoryConnectorFactory
@Inject
BasicRepositoryConnectorFactory( TransporterProvider transporterProvider, RepositoryLayoutProvider layoutProvider,
ChecksumPolicyProvider checksumPolicyProvider, FileProcessor fileProcessor,
LoggerFactory loggerFactory )
ChecksumPolicyProvider checksumPolicyProvider, FileProcessor fileProcessor )
{
setTransporterProvider( transporterProvider );
setRepositoryLayoutProvider( layoutProvider );
setChecksumPolicyProvider( checksumPolicyProvider );
setFileProcessor( fileProcessor );
setLoggerFactory( loggerFactory );
}
public void initService( ServiceLocator locator )
{
setLoggerFactory( locator.getService( LoggerFactory.class ) );
setTransporterProvider( locator.getService( TransporterProvider.class ) );
setRepositoryLayoutProvider( locator.getService( RepositoryLayoutProvider.class ) );
setChecksumPolicyProvider( locator.getService( ChecksumPolicyProvider.class ) );
setFileProcessor( locator.getService( FileProcessor.class ) );
}
/**
* Sets the logger factory to use for this component.
*
* @param loggerFactory The logger factory to use, may be {@code null} to disable logging.
* @return This component for chaining, never {@code null}.
*/
public BasicRepositoryConnectorFactory setLoggerFactory( LoggerFactory loggerFactory )
{
this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, BasicRepositoryConnector.class );
return this;
}
/**
* Sets the transporter provider to use for this component.
*
......@@ -173,7 +152,7 @@ public final class BasicRepositoryConnectorFactory
throws NoRepositoryConnectorException
{
return new BasicRepositoryConnector( session, repository, transporterProvider, layoutProvider,
checksumPolicyProvider, fileProcessor, logger );
checksumPolicyProvider, fileProcessor );
}
}
......@@ -32,9 +32,10 @@ import java.util.UUID;
import org.eclipse.aether.spi.connector.checksum.ChecksumPolicy;
import org.eclipse.aether.spi.connector.layout.RepositoryLayout.Checksum;
import org.eclipse.aether.spi.io.FileProcessor;
import org.eclipse.aether.spi.log.Logger;
import org.eclipse.aether.transfer.ChecksumFailureException;
import org.eclipse.aether.util.ChecksumUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Performs checksum validation for a downloaded file.
......@@ -50,7 +51,7 @@ final class ChecksumValidator
}
private final Logger logger;
private static final Logger LOGGER = LoggerFactory.getLogger( ChecksumValidator.class );
private final File dataFile;
......@@ -66,11 +67,10 @@ final class ChecksumValidator
private final Map<File, Object> checksumFiles;
ChecksumValidator( Logger logger, File dataFile, FileProcessor fileProcessor,
ChecksumValidator( File dataFile, FileProcessor fileProcessor,
ChecksumFetcher checksumFetcher, ChecksumPolicy checksumPolicy,
Collection<Checksum> checksums )
{
this.logger = logger;
this.dataFile = dataFile;
this.tempFiles = new HashSet<File>();
this.fileProcessor = fileProcessor;
......@@ -213,7 +213,7 @@ final class ChecksumValidator
{
if ( !file.delete() && file.exists() )
{
logger.debug( "Could not delete temorary file " + file );
LOGGER.debug( "Could not delete temporary file {}", file );
}
}
tempFiles.clear();
......@@ -251,7 +251,7 @@ final class ChecksumValidator
}
catch ( IOException e )
{
logger.debug( "Failed to write checksum file " + checksumFile + ": " + e.getMessage(), e );
LOGGER.debug( "Failed to write checksum file {}: {}", checksumFile, e.getMessage(), e );
}
}
checksumFiles.clear();
......
......@@ -19,6 +19,9 @@ package org.eclipse.aether.connector.basic;
* under the License.
*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
......@@ -29,8 +32,6 @@ import java.nio.channels.OverlappingFileLockException;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.aether.spi.log.Logger;
/**
* A partially downloaded file with optional support for resume. If resume is enabled, a well-known location is used for
* the partial file in combination with a lock file to prevent concurrent requests from corrupting it (and wasting
......@@ -61,16 +62,16 @@ final class PartialFile
private final AtomicBoolean concurrent;
LockFile( File partFile, int requestTimeout, RemoteAccessChecker checker, Logger logger )
LockFile( File partFile, int requestTimeout, RemoteAccessChecker checker )
throws Exception
{
lockFile = new File( partFile.getPath() + EXT_LOCK );
concurrent = new AtomicBoolean( false );
lock = lock( lockFile, partFile, requestTimeout, checker, logger, concurrent );
lock = lock( lockFile, partFile, requestTimeout, checker, concurrent );
}
private static FileLock lock( File lockFile, File partFile, int requestTimeout, RemoteAccessChecker checker,
Logger logger, AtomicBoolean concurrent )
AtomicBoolean concurrent )
throws Exception
{
boolean interrupted = false;
......@@ -97,7 +98,7 @@ final class PartialFile
* at least knows about the file and is accessible to us.
*/
checker.checkRemoteAccess();
logger.debug( "Concurrent download of " + partFile + " in progress, awaiting completion" );
LOGGER.debug( "Concurrent download of {} in progress, awaiting completion", partFile );
}
lastLength = currentLength;
lastTime = currentTime;
......@@ -257,14 +258,13 @@ final class PartialFile
private final int requestTimeout;
private final Logger logger;
private static final Logger LOGGER = LoggerFactory.getLogger( Factory.class );
Factory( boolean resume, long resumeThreshold, int requestTimeout, Logger logger )
Factory( boolean resume, long resumeThreshold, int requestTimeout )
{
this.resume = resume;
this.resumeThreshold = resumeThreshold;
this.requestTimeout = requestTimeout;
this.logger = logger;
}
public PartialFile newInstance( File dstFile, RemoteAccessChecker checker )
......@@ -275,7 +275,7 @@ final class PartialFile
File partFile = new File( dstFile.getPath() + EXT_PART );
long reqTimestamp = System.currentTimeMillis();
LockFile lockFile = new LockFile( partFile, requestTimeout, checker, logger );
LockFile lockFile = new LockFile( partFile, requestTimeout, checker );
if ( lockFile.isConcurrent() && dstFile.lastModified() >= reqTimestamp - 100L )
{
lockFile.close();
......@@ -287,12 +287,12 @@ final class PartialFile
{
throw new IOException( partFile.exists() ? "Path exists but is not a file" : "Unknown error" );
}
return new PartialFile( partFile, lockFile, resumeThreshold, logger );
return new PartialFile( partFile, lockFile, resumeThreshold );
}
catch ( IOException e )
{
lockFile.close();
logger.debug( "Cannot create resumable file " + partFile.getAbsolutePath() + ": " + e );
LOGGER.debug( "Cannot create resumable file {}: {}", partFile.getAbsolutePath(), e.getMessage(), e );
// fall through and try non-resumable/temporary file location
}
}
......@@ -300,7 +300,7 @@ final class PartialFile
File tempFile =
File.createTempFile( dstFile.getName() + '-' + UUID.randomUUID().toString().replace( "-", "" ), ".tmp",
dstFile.getParentFile() );
return new PartialFile( tempFile, logger );
return new PartialFile( tempFile );
}
}
......@@ -311,19 +311,18 @@ final class PartialFile
private final long threshold;
private final Logger logger;
private static final Logger LOGGER = LoggerFactory.getLogger( PartialFile.class );
private PartialFile( File partFile, Logger logger )
private PartialFile( File partFile )
{
this( partFile, null, 0L, logger );
this( partFile, null, 0L );
}
private PartialFile( File partFile, LockFile lockFile, long threshold, Logger logger )
private PartialFile( File partFile, LockFile lockFile, long threshold )
{
this.partFile = partFile;
this.lockFile = lockFile;
this.threshold = threshold;
this.logger = logger;
}
public File getFile()
......@@ -342,7 +341,7 @@ final class PartialFile
{
if ( !partFile.delete() && partFile.exists() )
{
logger.debug( "Could not delete temorary file " + partFile );
LOGGER.debug( "Could not delete temporary file {}", partFile );
}
}
if ( lockFile != null )
......
......@@ -33,7 +33,6 @@ import java.util.Map;
import org.eclipse.aether.internal.test.util.TestFileProcessor;
import org.eclipse.aether.internal.test.util.TestFileUtils;
import org.eclipse.aether.internal.test.util.TestLoggerFactory;
import org.eclipse.aether.spi.connector.checksum.ChecksumPolicy;
import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
import org.eclipse.aether.transfer.ChecksumFailureException;
......@@ -196,8 +195,7 @@ public class ChecksumValidatorTest
private ChecksumValidator newValidator( String... algos )
{
return new ChecksumValidator( new TestLoggerFactory().getLogger( "" ), dataFile, new TestFileProcessor(),
fetcher, policy, newChecksums( algos ) );
return new ChecksumValidator( dataFile, new TestFileProcessor(), fetcher, policy, newChecksums( algos ) );
}
private Map<String, ?> checksums( String... algoDigestPairs )
......
......@@ -35,7 +35,6 @@ import java.util.Locale;
import java.util.concurrent.CountDownLatch;
import org.eclipse.aether.internal.test.util.TestFileUtils;
import org.eclipse.aether.internal.test.util.TestLoggerFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
......@@ -212,8 +211,7 @@ public class PartialFileTest
throws Exception
{
PartialFile.Factory factory =
new PartialFile.Factory( resumeThreshold >= 0L, resumeThreshold, requestTimeout,
new TestLoggerFactory().getLogger( "" ) );
new PartialFile.Factory( resumeThreshold >= 0L, resumeThreshold, requestTimeout );
PartialFile partFile = factory.newInstance( dstFile, remoteAccessChecker );
if ( partFile != null )
{
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-demos</artifactId>
<version>1.1.1</version>
<version>1.3.1</version>
</parent>
<artifactId>maven-resolver-demo-maven-plugin</artifactId>
......@@ -70,8 +70,15 @@
<artifactId>maven-resolver-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-util</artifactId>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
......@@ -98,6 +105,10 @@
<goal>clean</goal>
<goal>validate</goal>
</goals>
<properties>
<!-- e.g. ensure that Java7 picks up TLSv1.2 when connecting with Central -->
<https.protocols>${https.protocols}</https.protocols>
</properties>
</configuration>
<executions>
<execution>
......
......@@ -24,6 +24,9 @@ import java.util.List;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
......@@ -32,44 +35,39 @@ import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Resolves a single artifact (not including its transitive dependencies).
*
* @goal resolve-artifact
*/
@Mojo( name = "resolve-artifact", threadSafe = true )
public class ResolveArtifactMojo
extends AbstractMojo
{
private static final Logger LOGGER = LoggerFactory.getLogger( ResolveArtifactMojo.class );
/**
* The entry point to Maven Artifact Resolver, i.e. the component doing all the work.
*
* @component
*/
@Component
private RepositorySystem repoSystem;
/**
* The current repository/network configuration of Maven.
*
* @parameter default-value="${repositorySystemSession}"
* @readonly
*/
@Parameter( defaultValue = "${repositorySystemSession}", readonly = true )
private RepositorySystemSession repoSession;
/**
* The project's remote repositories to use for the resolution.
*
* @parameter default-value="${project.remoteProjectRepositories}"
* @readonly
*/
@Parameter( defaultValue = "${project.remotePluginRepositories}", readonly = true )
private List<RemoteRepository> remoteRepos;
/**
* The {@code <groupId>:<artifactId>[:<extension>[:<classifier>]]:<version>} of the artifact to resolve.
*
* @parameter property="resolver.artifactCoords"
*/
@Parameter ( property = "resolver.artifactCoords", readonly = true )
private String artifactCoords;
/**
......@@ -92,7 +90,7 @@ public class ResolveArtifactMojo
request.setArtifact( artifact );
request.setRepositories( remoteRepos );
getLog().info( "Resolving artifact " + artifact + " from " + remoteRepos );
LOGGER.info( "Resolving artifact {} from {}", artifact, remoteRepos );
ArtifactResult result;
try
......@@ -104,8 +102,8 @@ public class ResolveArtifactMojo
throw new MojoExecutionException( e.getMessage(), e );
}
getLog().info( "Resolved artifact " + artifact + " to " + result.getArtifact().getFile() + " from "
+ result.getRepository() );
LOGGER.info( "Resolved artifact {} to {} from {}", artifact, result.getArtifact().getFile(),
result.getRepository() );
}
}
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-demos</artifactId>
<version>1.1.1</version>
<version>1.3.1</version>
</parent>
<artifactId>maven-resolver-demo-snippets</artifactId>
......@@ -37,6 +37,7 @@
</description>
<properties>
<Automatic-Module-Name>org.apache.maven.resolver.demo.snippets</Automatic-Module-Name>
<mavenVersion>3.5.0</mavenVersion>
</properties>
......@@ -90,21 +91,32 @@
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.sisu</groupId>
<artifactId>org.eclipse.sisu.plexus</artifactId>
<version>${sisuVersion}</version>
<optional>true</optional>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model-builder</artifactId>
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.sisu</groupId>
<artifactId>org.eclipse.sisu.inject</artifactId>
</dependency>
<dependency>
<groupId>org.sonatype.sisu</groupId>
<artifactId>sisu-guice</artifactId>
<version>3.2.6</version>
<classifier>no_aop</classifier>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>