resolveArtifacts( RepositorySystemSession session,
Collection extends ArtifactRequest> requests )
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2012 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -22,6 +22,7 @@
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
+import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
import org.eclipse.aether.internal.impl.DefaultDependencyCollector;
import org.eclipse.aether.internal.impl.DefaultDeployer;
import org.eclipse.aether.internal.impl.DefaultFileProcessor;
@@ -32,13 +33,20 @@
import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
+import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
import org.eclipse.aether.internal.impl.DefaultSyncContextFactory;
+import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
+import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
-import org.eclipse.aether.internal.impl.Slf4jLoggerFactory;
+import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory;
+import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
+import org.eclipse.aether.spi.connector.transport.TransporterProvider;
import org.eclipse.aether.spi.io.FileProcessor;
import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
import org.eclipse.aether.spi.locator.Service;
@@ -48,8 +56,8 @@
/**
* A simple service locator that is already setup with all components from this library. To acquire a complete
* repository system, clients need to add an artifact descriptor reader, a version resolver, a version range resolver
- * and optionally some repository connectors to access remote repositories. Once the locator is fully populated, the
- * repository system can be created like this:
+ * and optionally some repository connector and transporter factories to access remote repositories. Once the locator is
+ * fully populated, the repository system can be created like this:
*
*
* RepositorySystem repoSystem = serviceLocator.getService( RepositorySystem.class );
@@ -194,6 +202,10 @@
addService( Deployer.class, DefaultDeployer.class );
addService( Installer.class, DefaultInstaller.class );
addService( MetadataResolver.class, DefaultMetadataResolver.class );
+ addService( RepositoryLayoutProvider.class, DefaultRepositoryLayoutProvider.class );
+ addService( RepositoryLayoutFactory.class, Maven2RepositoryLayoutFactory.class );
+ addService( TransporterProvider.class, DefaultTransporterProvider.class );
+ addService( ChecksumPolicyProvider.class, DefaultChecksumPolicyProvider.class );
addService( RepositoryConnectorProvider.class, DefaultRepositoryConnectorProvider.class );
addService( RemoteRepositoryManager.class, DefaultRemoteRepositoryManager.class );
addService( UpdateCheckManager.class, DefaultUpdateCheckManager.class );
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/DependencyCollector.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/DependencyCollector.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/DependencyCollector.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/DependencyCollector.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,16 +17,31 @@
import org.eclipse.aether.collection.DependencyCollectionException;
/**
- * This collector fulfills the contract of
- * {@link RepositorySystem#collectDependencies(RepositorySystemSession, CollectRequest)}.
+ * Given a collection of direct dependencies, recursively gathers their transitive dependencies and calculates the
+ * dependency graph.
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface DependencyCollector
{
/**
+ * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+ * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+ * artifact files. The supplied session carries various hooks to customize the dependency graph that must be invoked
+ * throughout the operation.
+ *
+ * @param session The repository session, must not be {@code null}.
+ * @param request The collection request, must not be {@code null}.
+ * @return The collection result, never {@code null}.
+ * @throws DependencyCollectionException If the dependency tree could not be built.
+ * @see RepositorySystemSession#getDependencyTraverser()
+ * @see RepositorySystemSession#getDependencyManager()
+ * @see RepositorySystemSession#getDependencySelector()
+ * @see RepositorySystemSession#getVersionFilter()
+ * @see RepositorySystemSession#getDependencyGraphTransformer()
* @see RepositorySystem#collectDependencies(RepositorySystemSession, CollectRequest)
*/
CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request )
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/Deployer.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/Deployer.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/Deployer.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/Deployer.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,8 +17,11 @@
import org.eclipse.aether.deployment.DeploymentException;
/**
+ * Publishes artifacts to a remote repository.
+ *
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface Deployer
{
@@ -31,6 +34,7 @@
* @return The deployment result, never {@code null}.
* @throws DeploymentException If any artifact/metadata from the request could not be deployed.
* @see RepositorySystem#deploy(RepositorySystemSession, DeployRequest)
+ * @see MetadataGeneratorFactory#newInstance(RepositorySystemSession, DeployRequest)
*/
DeployResult deploy( RepositorySystemSession session, DeployRequest request )
throws DeploymentException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java 1970-01-01 00:00:00.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java 2015-01-14 12:56:17.000000000 +0000
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2014 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.impl.guice;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.eclipse.aether.RepositoryListener;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.impl.ArtifactResolver;
+import org.eclipse.aether.impl.DependencyCollector;
+import org.eclipse.aether.impl.Deployer;
+import org.eclipse.aether.impl.Installer;
+import org.eclipse.aether.impl.LocalRepositoryProvider;
+import org.eclipse.aether.impl.MetadataResolver;
+import org.eclipse.aether.impl.OfflineController;
+import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.eclipse.aether.impl.RepositoryConnectorProvider;
+import org.eclipse.aether.impl.RepositoryEventDispatcher;
+import org.eclipse.aether.impl.SyncContextFactory;
+import org.eclipse.aether.impl.UpdateCheckManager;
+import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
+import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
+import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
+import org.eclipse.aether.internal.impl.DefaultDependencyCollector;
+import org.eclipse.aether.internal.impl.DefaultDeployer;
+import org.eclipse.aether.internal.impl.DefaultFileProcessor;
+import org.eclipse.aether.internal.impl.DefaultInstaller;
+import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider;
+import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
+import org.eclipse.aether.internal.impl.DefaultOfflineController;
+import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
+import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
+import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
+import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
+import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
+import org.eclipse.aether.internal.impl.DefaultSyncContextFactory;
+import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
+import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
+import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
+import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
+import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
+import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
+import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory;
+import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
+import org.eclipse.aether.spi.connector.transport.TransporterProvider;
+import org.eclipse.aether.spi.io.FileProcessor;
+import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+import org.eclipse.aether.spi.log.LoggerFactory;
+import org.eclipse.aether.spi.log.NullLoggerFactory;
+import org.slf4j.ILoggerFactory;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.name.Names;
+
+/**
+ * A ready-made Guice module that sets up bindings
+ * for all components from this library. To acquire a complete repository system, clients need to bind an artifact
+ * descriptor reader, a version resolver, a version range resolver, zero or more metadata generator factories, some
+ * repository connector and transporter factories to access remote repositories.
+ *
+ * @noextend This class must not be extended by clients and will eventually be marked {@code final} without prior
+ * notice.
+ */
+public class AetherModule
+ extends AbstractModule
+{
+
+ /**
+ * Creates a new instance of this Guice module, typically for invoking
+ * {@link com.google.inject.Binder#install(com.google.inject.Module)}.
+ */
+ public AetherModule()
+ {
+ }
+
+ /**
+ * Configures Guice with bindings for Aether components provided by this library.
+ */
+ @Override
+ protected void configure()
+ {
+ bind( RepositorySystem.class ) //
+ .to( DefaultRepositorySystem.class ).in( Singleton.class );
+ bind( ArtifactResolver.class ) //
+ .to( DefaultArtifactResolver.class ).in( Singleton.class );
+ bind( DependencyCollector.class ) //
+ .to( DefaultDependencyCollector.class ).in( Singleton.class );
+ bind( Deployer.class ) //
+ .to( DefaultDeployer.class ).in( Singleton.class );
+ bind( Installer.class ) //
+ .to( DefaultInstaller.class ).in( Singleton.class );
+ bind( MetadataResolver.class ) //
+ .to( DefaultMetadataResolver.class ).in( Singleton.class );
+ bind( RepositoryLayoutProvider.class ) //
+ .to( DefaultRepositoryLayoutProvider.class ).in( Singleton.class );
+ bind( RepositoryLayoutFactory.class ).annotatedWith( Names.named( "maven2" ) ) //
+ .to( Maven2RepositoryLayoutFactory.class ).in( Singleton.class );
+ bind( TransporterProvider.class ) //
+ .to( DefaultTransporterProvider.class ).in( Singleton.class );
+ bind( ChecksumPolicyProvider.class ) //
+ .to( DefaultChecksumPolicyProvider.class ).in( Singleton.class );
+ bind( RepositoryConnectorProvider.class ) //
+ .to( DefaultRepositoryConnectorProvider.class ).in( Singleton.class );
+ bind( RemoteRepositoryManager.class ) //
+ .to( DefaultRemoteRepositoryManager.class ).in( Singleton.class );
+ bind( UpdateCheckManager.class ) //
+ .to( DefaultUpdateCheckManager.class ).in( Singleton.class );
+ bind( UpdatePolicyAnalyzer.class ) //
+ .to( DefaultUpdatePolicyAnalyzer.class ).in( Singleton.class );
+ bind( FileProcessor.class ) //
+ .to( DefaultFileProcessor.class ).in( Singleton.class );
+ bind( SyncContextFactory.class ) //
+ .to( DefaultSyncContextFactory.class ).in( Singleton.class );
+ bind( RepositoryEventDispatcher.class ) //
+ .to( DefaultRepositoryEventDispatcher.class ).in( Singleton.class );
+ bind( OfflineController.class ) //
+ .to( DefaultOfflineController.class ).in( Singleton.class );
+ bind( LocalRepositoryProvider.class ) //
+ .to( DefaultLocalRepositoryProvider.class ).in( Singleton.class );
+ bind( LocalRepositoryManagerFactory.class ).annotatedWith( Names.named( "simple" ) ) //
+ .to( SimpleLocalRepositoryManagerFactory.class ).in( Singleton.class );
+ bind( LocalRepositoryManagerFactory.class ).annotatedWith( Names.named( "enhanced" ) ) //
+ .to( EnhancedLocalRepositoryManagerFactory.class ).in( Singleton.class );
+ if ( Slf4jLoggerFactory.isSlf4jAvailable() )
+ {
+ bindSlf4j();
+ }
+ else
+ {
+ bind( LoggerFactory.class ) //
+ .toInstance( NullLoggerFactory.INSTANCE );
+ }
+
+ }
+
+ private void bindSlf4j()
+ {
+ install( new Slf4jModule() );
+ }
+
+ @Provides
+ @Singleton
+ Set provideLocalRepositoryManagerFactories( @Named( "simple" ) LocalRepositoryManagerFactory simple,
+ @Named( "enhanced" ) LocalRepositoryManagerFactory enhanced )
+ {
+ Set factories = new HashSet();
+ factories.add( simple );
+ factories.add( enhanced );
+ return Collections.unmodifiableSet( factories );
+ }
+
+ @Provides
+ @Singleton
+ Set provideRepositoryLayoutFactories( @Named( "maven2" ) RepositoryLayoutFactory maven2 )
+ {
+ Set factories = new HashSet();
+ factories.add( maven2 );
+ return Collections.unmodifiableSet( factories );
+ }
+
+ @Provides
+ @Singleton
+ Set providesRepositoryListeners()
+ {
+ return Collections.emptySet();
+ }
+
+ private static class Slf4jModule
+ extends AbstractModule
+ {
+
+ @Override
+ protected void configure()
+ {
+ bind( LoggerFactory.class ) //
+ .to( Slf4jLoggerFactory.class );
+ }
+
+ @Provides
+ @Singleton
+ ILoggerFactory getLoggerFactory()
+ {
+ return org.slf4j.LoggerFactory.getILoggerFactory();
+ }
+
+ }
+
+}
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/package-info.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/package-info.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/package-info.java 1970-01-01 00:00:00.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/guice/package-info.java 2015-01-14 12:56:17.000000000 +0000
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+/**
+ * The integration with the dependency injection framework Google Guice.
+ */
+package org.eclipse.aether.impl.guice;
+
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/Installer.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/Installer.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/Installer.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/Installer.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,8 +17,11 @@
import org.eclipse.aether.installation.InstallationException;
/**
+ * Publishes artifacts to the local repository.
+ *
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface Installer
{
@@ -31,6 +34,7 @@
* @return The installation result, never {@code null}.
* @throws InstallationException If any artifact/metadata from the request could not be installed.
* @see RepositorySystem#install(RepositorySystemSession, InstallRequest)
+ * @see MetadataGeneratorFactory#newInstance(RepositorySystemSession, InstallRequest)
*/
InstallResult install( RepositorySystemSession session, InstallRequest request )
throws InstallationException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/LocalRepositoryProvider.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/LocalRepositoryProvider.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/LocalRepositoryProvider.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/LocalRepositoryProvider.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2013 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.aether.impl;
+import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.LocalRepositoryManager;
@@ -20,10 +21,24 @@
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface LocalRepositoryProvider
{
+ /**
+ * Creates a new manager for the specified local repository. If the specified local repository has no type, the
+ * default local repository type of the system will be used. Note: It is expected that this method
+ * invocation is one of the last steps of setting up a new session, in particular any configuration properties
+ * should have been set already.
+ *
+ * @param session The repository system session from which to configure the manager, must not be {@code null}.
+ * @param localRepository The local repository to create a manager for, must not be {@code null}.
+ * @return The local repository manager, never {@code null}.
+ * @throws NoLocalRepositoryManagerException If the specified repository type is not recognized or no base directory
+ * is given.
+ * @see RepositorySystem#newLocalRepositoryManager(RepositorySystemSession, LocalRepository)
+ */
LocalRepositoryManager newLocalRepositoryManager( RepositorySystemSession session, LocalRepository localRepository )
throws NoLocalRepositoryManagerException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGeneratorFactory.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGeneratorFactory.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGeneratorFactory.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGeneratorFactory.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,6 +17,8 @@
/**
* A factory to create metadata generators. Metadata generators can contribute additional metadata during the
* installation/deployment of artifacts.
+ *
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface MetadataGeneratorFactory
{
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGenerator.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGenerator.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGenerator.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataGenerator.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,6 +17,8 @@
/**
* A metadata generator that participates in the installation/deployment of artifacts.
+ *
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface MetadataGenerator
{
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataResolver.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataResolver.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataResolver.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/MetadataResolver.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -13,19 +13,31 @@
import java.util.Collection;
import java.util.List;
+import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.metadata.Metadata;
import org.eclipse.aether.resolution.MetadataRequest;
import org.eclipse.aether.resolution.MetadataResult;
/**
+ * Resolves metadata, that is gets a local filesystem path to their binary contents.
+ *
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface MetadataResolver
{
/**
- * Resolves the paths for a collection of metadata. Metadata will be downloaded if necessary.
+ * Resolves the paths for a collection of metadata. Metadata will be downloaded to the local repository if
+ * necessary, e.g. because it hasn't been cached yet or the cache is deemed outdated.
+ *
+ * @param session The repository session, must not be {@code null}.
+ * @param requests The resolution requests, must not be {@code null}.
+ * @return The resolution results (in request order), never {@code null}.
+ * @see Metadata#getFile()
+ * @see RepositorySystem#resolveMetadata(RepositorySystemSession, Collection)
*/
List resolveMetadata( RepositorySystemSession session,
Collection extends MetadataRequest> requests );
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/OfflineController.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/OfflineController.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/OfflineController.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/OfflineController.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012 Sonatype, Inc.
+ * Copyright (c) 2012, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -19,16 +19,24 @@
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface OfflineController
{
/**
- * Determines whether the specified repository is accessible according to the offline policy of the given session.
+ * Determines whether the specified repository is accessible if the system was in offline mode. A simple
+ * implementation might unconditionally throw {@link RepositoryOfflineException} to block all remote repository
+ * access when in offline mode. More sophisticated implementations might inspect
+ * {@link RepositorySystemSession#getConfigProperties() configuration properties} of the session to check for some
+ * kind of whitelist that allows certain remote repositories even when offline. At any rate, the session's current
+ * {@link RepositorySystemSession#isOffline() offline state} is irrelevant to the outcome of the check.
*
- * @param session The repository session during which the check is made, must not be {@code null}
- * @param repository The remote repository to check for accessibility, must not be {@code null}.
- * @throws RepositoryOfflineException If the session forbids access to the repository.
+ * @param session The repository session during which the check is made, must not be {@code null}.
+ * @param repository The remote repository to check for offline access, must not be {@code null}.
+ * @throws RepositoryOfflineException If the repository is not accessible in offline mode. If the method returns
+ * normally, the repository is considered accessible even in offline mode.
+ * @see RepositorySystemSession#isOffline()
*/
void checkOffline( RepositorySystemSession session, RemoteRepository repository )
throws RepositoryOfflineException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/package-info.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/package-info.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/package-info.java 1970-01-01 00:00:00.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/package-info.java 2015-01-14 12:56:17.000000000 +0000
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+/**
+ * The provisional interfaces defining the various sub components that implement the repository system. Aether Core
+ * provides stock implementations for most of these components but not all. To obtain a complete/runnable repository
+ * system, the application needs to provide implementations of the following component contracts:
+ * {@link org.eclipse.aether.impl.ArtifactDescriptorReader}, {@link org.eclipse.aether.impl.VersionResolver},
+ * {@link org.eclipse.aether.impl.VersionRangeResolver} and potentially
+ * {@link org.eclipse.aether.impl.MetadataGeneratorFactory}. Said components basically define the file format of the
+ * metadata that is used to reason about an artifact's dependencies and available versions.
+ */
+package org.eclipse.aether.impl;
+
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/RemoteRepositoryManager.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/RemoteRepositoryManager.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/RemoteRepositoryManager.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/RemoteRepositoryManager.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2012 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,16 +17,46 @@
import org.eclipse.aether.repository.RepositoryPolicy;
/**
+ * Helps dealing with remote repository definitions.
+ *
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface RemoteRepositoryManager
{
+ /**
+ * Aggregates repository definitions by merging duplicate repositories and optionally applies mirror, proxy and
+ * authentication settings from the supplied session.
+ *
+ * @param session The repository session during which the repositories will be accessed, must not be {@code null}.
+ * @param dominantRepositories The current list of remote repositories to merge the new definitions into, must not
+ * be {@code null}.
+ * @param recessiveRepositories The remote repositories to merge into the existing list, must not be {@code null}.
+ * @param recessiveIsRaw {@code true} if the recessive repository definitions have not yet been subjected to mirror,
+ * proxy and authentication settings, {@code false} otherwise.
+ * @return The aggregated list of remote repositories, never {@code null}.
+ * @see RepositorySystemSession#getMirrorSelector()
+ * @see RepositorySystemSession#getProxySelector()
+ * @see RepositorySystemSession#getAuthenticationSelector()
+ */
List aggregateRepositories( RepositorySystemSession session,
List dominantRepositories,
List recessiveRepositories, boolean recessiveIsRaw );
+ /**
+ * Gets the effective repository policy for the specified remote repository by merging the applicable
+ * snapshot/release policy of the repository with global settings from the supplied session.
+ *
+ * @param session The repository session during which the repository will be accessed, must not be {@code null}.
+ * @param repository The remote repository to determine the effective policy for, must not be {@code null}.
+ * @param releases {@code true} if the policy for release artifacts needs to be considered, {@code false} if not.
+ * @param snapshots {@code true} if the policy for snapshot artifacts needs to be considered, {@code false} if not.
+ * @return The effective repository policy, never {@code null}.
+ * @see RepositorySystemSession#getChecksumPolicy()
+ * @see RepositorySystemSession#getUpdatePolicy()
+ */
RepositoryPolicy getPolicy( RepositorySystemSession session, RemoteRepository repository, boolean releases,
boolean snapshots );
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryConnectorProvider.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryConnectorProvider.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryConnectorProvider.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryConnectorProvider.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012 Sonatype, Inc.
+ * Copyright (c) 2012, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -20,10 +20,20 @@
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface RepositoryConnectorProvider
{
+ /**
+ * Tries to create a repository connector for the specified remote repository.
+ *
+ * @param session The repository system session from which to configure the connector, must not be {@code null}.
+ * @param repository The remote repository to create a connector for, must not be {@code null}.
+ * @return The connector for the given repository, never {@code null}.
+ * @throws NoRepositoryConnectorException If no available factory can create a connector for the specified remote
+ * repository.
+ */
RepositoryConnector newRepositoryConnector( RepositorySystemSession session, RemoteRepository repository )
throws NoRepositoryConnectorException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryEventDispatcher.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryEventDispatcher.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryEventDispatcher.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/RepositoryEventDispatcher.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,6 +17,7 @@
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface RepositoryEventDispatcher
{
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/SyncContextFactory.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/SyncContextFactory.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/SyncContextFactory.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/SyncContextFactory.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,12 +10,15 @@
*******************************************************************************/
package org.eclipse.aether.impl;
+import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.SyncContext;
/**
* A factory to create synchronization contexts. A synchronization context is used to coordinate concurrent access to
* artifacts or metadata.
+ *
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface SyncContextFactory
{
@@ -27,6 +30,7 @@
* @param shared A flag indicating whether access to the artifacts/metadata associated with the new context can be
* shared among concurrent readers or whether access needs to be exclusive to the calling thread.
* @return The synchronization context, never {@code null}.
+ * @see RepositorySystem#newSyncContext(RepositorySystemSession, boolean)
*/
SyncContext newInstance( RepositorySystemSession session, boolean shared );
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheck.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheck.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheck.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheck.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -19,6 +19,7 @@
* A request to check if an update of an artifact/metadata from a remote repository is needed.
*
* @see UpdateCheckManager
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public final class UpdateCheck
{
@@ -42,6 +43,13 @@
private E exception;
/**
+ * Creates an uninitialized update check request.
+ */
+ public UpdateCheck()
+ {
+ }
+
+ /**
* Gets the last-modified timestamp of the corresponding item produced by a local installation. If non-zero, a
* remote update will be surpressed if the local item is up-to-date, even if the remote item has not been cached
* locally.
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheckManager.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheckManager.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheckManager.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdateCheckManager.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2012 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -21,6 +21,7 @@
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface UpdateCheckManager
{
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdatePolicyAnalyzer.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdatePolicyAnalyzer.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdatePolicyAnalyzer.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/UpdatePolicyAnalyzer.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2012 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -17,6 +17,7 @@
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface UpdatePolicyAnalyzer
{
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionRangeResolver.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionRangeResolver.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionRangeResolver.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionRangeResolver.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,19 +10,35 @@
*******************************************************************************/
package org.eclipse.aether.impl;
+import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResolutionException;
import org.eclipse.aether.resolution.VersionRangeResult;
/**
+ * Parses and evaluates version ranges encountered in dependency declarations.
+ *
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface VersionRangeResolver
{
/**
* Expands a version range to a list of matching versions, in ascending order. For example, resolves "[3.8,4.0)" to
- * ["3.8", "3.8.1", "3.8.2"].
+ * "3.8", "3.8.1", "3.8.2". The returned list of versions is only dependent on the configured repositories and their
+ * contents, the list is not processed by the {@link RepositorySystemSession#getVersionFilter() session's version
+ * filter}.
+ *
+ * The supplied request may also refer to a single concrete version rather than a version range. In this case
+ * though, the result contains simply the (parsed) input version, regardless of the repositories and their contents.
+ *
+ * @param session The repository session, must not be {@code null}.
+ * @param request The version range request, must not be {@code null}.
+ * @return The version range result, never {@code null}.
+ * @throws VersionRangeResolutionException If the requested range could not be parsed. Note that an empty range does
+ * not raise an exception.
+ * @see RepositorySystem#resolveVersionRange(RepositorySystemSession, VersionRangeRequest)
*/
VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request )
throws VersionRangeResolutionException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionResolver.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionResolver.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionResolver.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/impl/VersionResolver.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,12 +10,16 @@
*******************************************************************************/
package org.eclipse.aether.impl;
+import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.resolution.VersionRequest;
import org.eclipse.aether.resolution.VersionResolutionException;
import org.eclipse.aether.resolution.VersionResult;
/**
+ * Evaluates artifact meta/pseudo versions.
+ *
+ * @provisional This type is provisional and can be changed, moved or removed without prior notice.
*/
public interface VersionResolver
{
@@ -28,6 +32,7 @@
* @param request The version request, must not be {@code null}
* @return The version result, never {@code null}.
* @throws VersionResolutionException If the metaversion could not be resolved.
+ * @see RepositorySystem#resolveVersion(RepositorySystemSession, VersionRequest)
*/
VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
throws VersionResolutionException;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java 1970-01-01 00:00:00.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java 2015-01-14 12:56:17.000000000 +0000
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.internal.impl;
+
+import org.eclipse.aether.spi.connector.checksum.ChecksumPolicy;
+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.ChecksumFailureException;
+import org.eclipse.aether.transfer.TransferResource;
+
+abstract class AbstractChecksumPolicy
+ implements ChecksumPolicy
+
+{
+
+ protected final Logger logger;
+
+ protected final TransferResource resource;
+
+ protected AbstractChecksumPolicy( LoggerFactory loggerFactory, TransferResource resource )
+ {
+ this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
+ this.resource = resource;
+ }
+
+ public boolean onChecksumMatch( String algorithm, int kind )
+ {
+ return true;
+ }
+
+ public void onChecksumMismatch( String algorithm, int kind, ChecksumFailureException exception )
+ throws ChecksumFailureException
+ {
+ if ( ( kind & KIND_UNOFFICIAL ) == 0 )
+ {
+ throw exception;
+ }
+ }
+
+ public void onChecksumError( String algorithm, int kind, ChecksumFailureException exception )
+ throws ChecksumFailureException
+ {
+ logger.debug( "Could not validate " + algorithm + " checksum for " + resource.getResourceName(), exception );
+ }
+
+ public void onNoMoreChecksums()
+ throws ChecksumFailureException
+ {
+ throw new ChecksumFailureException( "Checksum validation failed, no checksums available" );
+ }
+
+ public void onTransferRetry()
+ {
+ }
+
+}
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/CacheUtils.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/CacheUtils.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/CacheUtils.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/CacheUtils.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2013 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -22,7 +22,9 @@
import org.eclipse.aether.repository.WorkspaceRepository;
/**
+ * @deprecated To be deleted without replacement.
*/
+@Deprecated
public final class CacheUtils
{
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java 2015-01-14 12:56:17.000000000 +0000
@@ -23,6 +23,7 @@
import org.eclipse.aether.collection.DependencyManager;
import org.eclipse.aether.collection.DependencySelector;
import org.eclipse.aether.collection.DependencyTraverser;
+import org.eclipse.aether.collection.VersionFilter;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.repository.ArtifactRepository;
@@ -155,9 +156,9 @@
}
public Object toKey( Artifact artifact, List repositories, DependencySelector selector,
- DependencyManager manager, DependencyTraverser traverser )
+ DependencyManager manager, DependencyTraverser traverser, VersionFilter filter )
{
- return new GraphKey( artifact, repositories, selector, manager, traverser );
+ return new GraphKey( artifact, repositories, selector, manager, traverser, filter );
}
public List getChildren( Object key )
@@ -367,23 +368,27 @@
private final DependencyTraverser traverser;
+ private final VersionFilter filter;
+
private final int hashCode;
public GraphKey( Artifact artifact, List repositories, DependencySelector selector,
- DependencyManager manager, DependencyTraverser traverser )
+ DependencyManager manager, DependencyTraverser traverser, VersionFilter filter )
{
this.artifact = artifact;
this.repositories = repositories;
this.selector = selector;
this.manager = manager;
this.traverser = traverser;
+ this.filter = filter;
int hash = 17;
hash = hash * 31 + artifact.hashCode();
hash = hash * 31 + repositories.hashCode();
- hash = hash * 31 + selector.hashCode();
- hash = hash * 31 + manager.hashCode();
- hash = hash * 31 + traverser.hashCode();
+ hash = hash * 31 + hash( selector );
+ hash = hash * 31 + hash( manager );
+ hash = hash * 31 + hash( traverser );
+ hash = hash * 31 + hash( filter );
hashCode = hash;
}
@@ -400,8 +405,8 @@
}
GraphKey that = (GraphKey) obj;
return artifact.equals( that.artifact ) && repositories.equals( that.repositories )
- && selector.equals( that.selector ) && manager.equals( that.manager )
- && traverser.equals( that.traverser );
+ && eq( selector, that.selector ) && eq( manager, that.manager ) && eq( traverser, that.traverser )
+ && eq( filter, that.filter );
}
@Override
@@ -410,6 +415,16 @@
return hashCode;
}
+ private static boolean eq( T o1, T o2 )
+ {
+ return ( o1 != null ) ? o1.equals( o2 ) : o2 == null;
+ }
+
+ private static int hash( Object o )
+ {
+ return ( o != null ) ? o.hashCode() : 0;
+ }
+
}
}
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2012 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -22,13 +22,11 @@
import javax.inject.Inject;
import javax.inject.Named;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RepositoryEvent.EventType;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RequestTrace;
import org.eclipse.aether.SyncContext;
-import org.eclipse.aether.RepositoryEvent.EventType;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.ArtifactProperties;
import org.eclipse.aether.impl.ArtifactResolver;
@@ -73,36 +71,28 @@
/**
*/
@Named
-@Component( role = ArtifactResolver.class )
public class DefaultArtifactResolver
implements ArtifactResolver, Service
{
- @Requirement( role = LoggerFactory.class )
+ private static final String CONFIG_PROP_SNAPSHOT_NORMALIZATION = "aether.artifactResolver.snapshotNormalization";
+
private Logger logger = NullLoggerFactory.LOGGER;
- @Requirement
private FileProcessor fileProcessor;
- @Requirement
private RepositoryEventDispatcher repositoryEventDispatcher;
- @Requirement
private VersionResolver versionResolver;
- @Requirement
private UpdateCheckManager updateCheckManager;
- @Requirement
private RepositoryConnectorProvider repositoryConnectorProvider;
- @Requirement
private RemoteRepositoryManager remoteRepositoryManager;
- @Requirement
private SyncContextFactory syncContextFactory;
- @Requirement
private OfflineController offlineController;
public DefaultArtifactResolver()
@@ -147,12 +137,6 @@
return this;
}
- void setLogger( LoggerFactory loggerFactory )
- {
- // plexus support
- setLoggerFactory( loggerFactory );
- }
-
public DefaultArtifactResolver setFileProcessor( FileProcessor fileProcessor )
{
if ( fileProcessor == null )
@@ -389,6 +373,7 @@
logger.debug( "Verifying availability of " + local.getFile() + " from " + repos );
}
+ AtomicBoolean resolved = new AtomicBoolean( false );
Iterator groupIt = groups.iterator();
for ( RemoteRepository repo : repos )
{
@@ -399,7 +384,7 @@
try
{
- offlineController.checkOffline( session, repo );
+ Utils.checkOffline( session, offlineController, repo );
}
catch ( RepositoryOfflineException e )
{
@@ -427,7 +412,7 @@
groups.add( group );
groupIt = Collections. emptyList().iterator();
}
- group.items.add( new ResolutionItem( trace, artifact, result, local, repo ) );
+ group.items.add( new ResolutionItem( trace, artifact, resolved, result, local, repo ) );
}
}
@@ -488,7 +473,7 @@
throws ArtifactTransferException
{
if ( artifact.isSnapshot() && !artifact.getVersion().equals( artifact.getBaseVersion() )
- && ConfigUtils.getBoolean( session, true, "aether.artifactResolver.snapshotNormalization" ) )
+ && ConfigUtils.getBoolean( session, true, CONFIG_PROP_SNAPSHOT_NORMALIZATION ) )
{
String name = file.getName().replace( artifact.getVersion(), artifact.getBaseVersion() );
File dst = new File( file.getParent(), name );
@@ -568,6 +553,7 @@
ArtifactDownload download = new ArtifactDownload();
download.setArtifact( artifact );
download.setRequestContext( item.request.getRequestContext() );
+ download.setListener( SafeTransferListener.wrap( session, logger ) );
download.setTrace( item.trace );
if ( item.local.getFile() != null )
{
@@ -592,7 +578,7 @@
new UpdateCheck();
check.setItem( artifact );
check.setFile( download.getFile() );
- check.setFileValid( !download.isExistenceCheck() );
+ check.setFileValid( false );
check.setRepository( group.repository );
check.setPolicy( policy.getUpdatePolicy() );
item.updateCheck = check;
@@ -625,40 +611,44 @@
continue;
}
- if ( item.updateCheck != null )
- {
- item.updateCheck.setException( download.getException() );
- updateCheckManager.touchArtifact( session, item.updateCheck );
- }
-
+ Artifact artifact = download.getArtifact();
if ( download.getException() == null )
{
item.resolved.set( true );
item.result.setRepository( group.repository );
- Artifact artifact = download.getArtifact();
try
{
artifact = artifact.setFile( getFile( session, artifact, download.getFile() ) );
item.result.setArtifact( artifact );
+
+ lrm.add( session,
+ new LocalArtifactRegistration( artifact, group.repository, download.getSupportedContexts() ) );
}
catch ( ArtifactTransferException e )
{
+ download.setException( e );
item.result.addException( e );
- continue;
}
- lrm.add( session,
- new LocalArtifactRegistration( artifact, group.repository, download.getSupportedContexts() ) );
-
- artifactDownloaded( session, download.getTrace(), artifact, group.repository, null );
-
- artifactResolved( session, download.getTrace(), artifact, group.repository, null );
}
else
{
item.result.addException( download.getException() );
+ }
+
+ /*
+ * NOTE: Touch after registration with local repo to ensure concurrent resolution is not rejected with
+ * "already updated" via session data when actual update to local repo is still pending.
+ */
+ if ( item.updateCheck != null )
+ {
+ item.updateCheck.setException( download.getException() );
+ updateCheckManager.touchArtifact( session, item.updateCheck );
+ }
- artifactDownloaded( session, download.getTrace(), download.getArtifact(), group.repository,
- download.getException() );
+ artifactDownloaded( session, download.getTrace(), artifact, group.repository, download.getException() );
+ if ( download.getException() == null )
+ {
+ artifactResolved( session, download.getTrace(), artifact, group.repository, null );
}
}
}
@@ -757,12 +747,12 @@
UpdateCheck updateCheck;
- ResolutionItem( RequestTrace trace, Artifact artifact, ArtifactResult result, LocalArtifactResult local,
- RemoteRepository repository )
+ ResolutionItem( RequestTrace trace, Artifact artifact, AtomicBoolean resolved, ArtifactResult result,
+ LocalArtifactResult local, RemoteRepository repository )
{
this.trace = trace;
this.artifact = artifact;
- this.resolved = new AtomicBoolean( false );
+ this.resolved = resolved;
this.result = result;
this.request = result.getRequest();
this.local = local;
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultChecksumPolicyProvider.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultChecksumPolicyProvider.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultChecksumPolicyProvider.java 1970-01-01 00:00:00.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultChecksumPolicyProvider.java 2015-01-14 12:56:17.000000000 +0000
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2014 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.internal.impl;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.repository.RepositoryPolicy;
+import org.eclipse.aether.spi.connector.checksum.ChecksumPolicy;
+import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
+import org.eclipse.aether.spi.locator.Service;
+import org.eclipse.aether.spi.locator.ServiceLocator;
+import org.eclipse.aether.spi.log.LoggerFactory;
+import org.eclipse.aether.spi.log.NullLoggerFactory;
+import org.eclipse.aether.transfer.TransferResource;
+
+/**
+ */
+@Named
+public final class DefaultChecksumPolicyProvider
+ implements ChecksumPolicyProvider, Service
+{
+
+ private static final int ORDINAL_IGNORE = 0;
+
+ private static final int ORDINAL_WARN = 1;
+
+ private static final int ORDINAL_FAIL = 2;
+
+ private LoggerFactory loggerFactory = NullLoggerFactory.INSTANCE;
+
+ public DefaultChecksumPolicyProvider()
+ {
+ // enables default constructor
+ }
+
+ @Inject
+ DefaultChecksumPolicyProvider( LoggerFactory loggerFactory )
+ {
+ setLoggerFactory( loggerFactory );
+ }
+
+ public void initService( ServiceLocator locator )
+ {
+ setLoggerFactory( locator.getService( LoggerFactory.class ) );
+ }
+
+ public DefaultChecksumPolicyProvider setLoggerFactory( LoggerFactory loggerFactory )
+ {
+ this.loggerFactory = loggerFactory;
+ return this;
+ }
+
+ public ChecksumPolicy newChecksumPolicy( RepositorySystemSession session, RemoteRepository repository,
+ TransferResource resource, String policy )
+ {
+ if ( RepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( policy ) )
+ {
+ return null;
+ }
+ if ( RepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( policy ) )
+ {
+ return new FailChecksumPolicy( loggerFactory, resource );
+ }
+ return new WarnChecksumPolicy( loggerFactory, resource );
+ }
+
+ public String getEffectiveChecksumPolicy( RepositorySystemSession session, String policy1, String policy2 )
+ {
+ if ( policy1 != null && policy1.equals( policy2 ) )
+ {
+ return policy1;
+ }
+ int ordinal1 = ordinalOfPolicy( policy1 );
+ int ordinal2 = ordinalOfPolicy( policy2 );
+ if ( ordinal2 < ordinal1 )
+ {
+ return ( ordinal2 != ORDINAL_WARN ) ? policy2 : RepositoryPolicy.CHECKSUM_POLICY_WARN;
+ }
+ else
+ {
+ return ( ordinal1 != ORDINAL_WARN ) ? policy1 : RepositoryPolicy.CHECKSUM_POLICY_WARN;
+ }
+ }
+
+ private static int ordinalOfPolicy( String policy )
+ {
+ if ( RepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( policy ) )
+ {
+ return ORDINAL_FAIL;
+ }
+ else if ( RepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( policy ) )
+ {
+ return ORDINAL_IGNORE;
+ }
+ else
+ {
+ return ORDINAL_WARN;
+ }
+ }
+
+}
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Sonatype, Inc.
+ * Copyright (c) 2010, 2013 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -13,25 +13,30 @@
import java.util.List;
import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.collection.DependencyCollectionContext;
import org.eclipse.aether.graph.Dependency;
-/* * @see DefaultDependencyCollector
+/**
+ * @see DefaultDependencyCollector
*/
-class DefaultDependencyCollectionContext
+final class DefaultDependencyCollectionContext
implements DependencyCollectionContext
{
- private RepositorySystemSession session;
+ private final RepositorySystemSession session;
+
+ private Artifact artifact;
private Dependency dependency;
private List managedDependencies;
- public DefaultDependencyCollectionContext( RepositorySystemSession session, Dependency dependency,
- List managedDependencies )
+ public DefaultDependencyCollectionContext( RepositorySystemSession session, Artifact artifact,
+ Dependency dependency, List managedDependencies )
{
this.session = session;
+ this.artifact = ( dependency != null ) ? dependency.getArtifact() : artifact;
this.dependency = dependency;
this.managedDependencies = managedDependencies;
}
@@ -41,6 +46,11 @@
return session;
}
+ public Artifact getArtifact()
+ {
+ return artifact;
+ }
+
public Dependency getDependency()
{
return dependency;
@@ -53,6 +63,7 @@
public void set( Dependency dependency, List managedDependencies )
{
+ artifact = dependency.getArtifact();
this.dependency = dependency;
this.managedDependencies = managedDependencies;
}
diff -Nru eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java
--- eclipse-aether-0.9.0.M2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java 2013-02-16 19:52:37.000000000 +0000
+++ eclipse-aether-1.0.2/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java 2015-01-14 12:56:17.000000000 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2013 Sonatype, Inc.
+ * Copyright (c) 2010, 2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -21,8 +21,6 @@
import javax.inject.Inject;
import javax.inject.Named;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositoryException;
import org.eclipse.aether.RepositorySystemSession;
@@ -37,6 +35,7 @@
import org.eclipse.aether.collection.DependencyManager;
import org.eclipse.aether.collection.DependencySelector;
import org.eclipse.aether.collection.DependencyTraverser;
+import org.eclipse.aether.collection.VersionFilter;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
@@ -65,21 +64,20 @@
/**
*/
@Named
-@Component( role = DependencyCollector.class )
public class DefaultDependencyCollector
implements DependencyCollector, Service
{
- @Requirement( role = LoggerFactory.class )
+ private static final String CONFIG_PROP_MAX_EXCEPTIONS = "aether.dependencyCollector.maxExceptions";
+
+ private static final String CONFIG_PROP_MAX_CYCLES = "aether.dependencyCollector.maxCycles";
+
private Logger logger = NullLoggerFactory.LOGGER;
- @Requirement
private RemoteRepositoryManager remoteRepositoryManager;
- @Requirement
private ArtifactDescriptorReader descriptorReader;
- @Requirement
private VersionRangeResolver versionRangeResolver;
public DefaultDependencyCollector()
@@ -112,12 +110,6 @@
return this;
}
- void setLogger( LoggerFactory loggerFactory )
- {
- // plexus support
- setLoggerFactory( loggerFactory );
- }
-
public DefaultDependencyCollector setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
{
if ( remoteRepositoryManager == null )
@@ -134,7 +126,7 @@
{
throw new IllegalArgumentException( "artifact descriptor reader has not been specified" );
}
- this.descriptorReader = artifactDescriptorReader;
+ descriptorReader = artifactDescriptorReader;
return this;
}
@@ -160,6 +152,7 @@
DependencySelector depSelector = session.getDependencySelector();
DependencyManager depManager = session.getDependencyManager();
DependencyTraverser depTraverser = session.getDependencyTraverser();
+ VersionFilter verFilter = session.getVersionFilter();
Dependency root = request.getRoot();
List repositories = request.getRepositories();
@@ -169,22 +162,19 @@
Map stats = logger.isDebugEnabled() ? new LinkedHashMap() : null;
long time1 = System.currentTimeMillis();
- DefaultDependencyNode node = null;
+ DefaultDependencyNode node;
if ( root != null )
{
+ List extends Version> versions;
VersionRangeResult rangeResult;
try
{
VersionRangeRequest rangeRequest =
- new VersionRangeRequest( root.getArtifact(), request.getRepositories(), request.getRequestContext() );
+ new VersionRangeRequest( root.getArtifact(), request.getRepositories(),
+ request.getRequestContext() );
rangeRequest.setTrace( trace );
rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
-
- if ( rangeResult.getVersions().isEmpty() )
- {
- throw new VersionRangeResolutionException( rangeResult, "No versions available for "
- + root.getArtifact() + " within specified range" );
- }
+ versions = filterVersions( root, rangeResult, verFilter, new DefaultVersionFilterContext( session ) );
}
catch ( VersionRangeResolutionException e )
{
@@ -192,7 +182,7 @@
throw new DependencyCollectionException( result, e.getMessage() );
}
- Version version = rangeResult.getVersions().get( rangeResult.getVersions().size() - 1 );
+ Version version = versions.get( versions.size() - 1 );
root = root.setArtifact( root.getArtifact().setVersion( version.toString() ) );
ArtifactDescriptorResult descriptorResult;
@@ -222,9 +212,9 @@
if ( !session.isIgnoreArtifactDescriptorRepositories() )
{
- repositories =
- remoteRepositoryManager.aggregateRepositories( session, repositories,
- descriptorResult.getRepositories(), true );
+ repositories = remoteRepositoryManager.aggregateRepositories( session, repositories,
+ descriptorResult.getRepositories(),
+ true );
}
dependencies = mergeDeps( dependencies, descriptorResult.getDependencies() );
managedDependencies = mergeDeps( managedDependencies, descriptorResult.getManagedDependencies() );
@@ -244,7 +234,7 @@
result.setRoot( node );
- boolean traverse = ( root == null ) || depTraverser.traverseDependency( root );
+ boolean traverse = root == null || depTraverser == null || depTraverser.traverseDependency( root );
String errorPath = null;
if ( traverse && !dependencies.isEmpty() )
{
@@ -254,29 +244,38 @@
nodes.push( node );
DefaultDependencyCollectionContext context =
- new DefaultDependencyCollectionContext( session, root, managedDependencies );
+ new DefaultDependencyCollectionContext( session, request.getRootArtifact(), root, managedDependencies );
+
+ DefaultVersionFilterContext versionContext = new DefaultVersionFilterContext( session );
- Args args = new Args( result, session, trace, pool, nodes, context );
+ Args args = new Args( session, trace, pool, nodes, context, versionContext, request );
+ Results results = new Results( result, session );
- process( args, dependencies, repositories, depSelector.deriveChildSelector( context ),
- depManager.deriveChildManager( context ), depTraverser.deriveChildTraverser( context ) );
+ process( args, results, dependencies, repositories,
+ depSelector != null ? depSelector.deriveChildSelector( context ) : null,
+ depManager != null ? depManager.deriveChildManager( context ) : null,
+ depTraverser != null ? depTraverser.deriveChildTraverser( context ) : null,
+ verFilter != null ? verFilter.deriveChildFilter( context ) : null );
- errorPath = args.errorPath;
+ errorPath = results.errorPath;
}
long time2 = System.currentTimeMillis();
DependencyGraphTransformer transformer = session.getDependencyGraphTransformer();
- try
- {
- DefaultDependencyGraphTransformationContext context =
- new DefaultDependencyGraphTransformationContext( session );
- context.put( TransformationContextKeys.STATS, stats );
- result.setRoot( transformer.transformGraph( node, context ) );
- }
- catch ( RepositoryException e )
+ if ( transformer != null )
{
- result.addException( e );
+ try
+ {
+ DefaultDependencyGraphTransformationContext context =
+ new DefaultDependencyGraphTransformationContext( session );
+ context.put( TransformationContextKeys.STATS, stats );
+ result.setRoot( transformer.transformGraph( node, context ) );
+ }
+ catch ( RepositoryException e )
+ {
+ result.addException( e );
+ }
}
if ( stats != null )
@@ -299,7 +298,7 @@
return result;
}
- private RepositorySystemSession optimizeSession( RepositorySystemSession session )
+ private static RepositorySystemSession optimizeSession( RepositorySystemSession session )
{
DefaultRepositorySystemSession optimized = new DefaultRepositorySystemSession( session );
optimized.setArtifactTypeRegistry( CachingArtifactTypeRegistry.newInstance( session ) );
@@ -319,8 +318,9 @@
}
else
{
- result = new ArrayList( dominant.size() + recessive.size() );
- Collection ids = new HashSet();
+ int initialCapacity = dominant.size() + recessive.size();
+ result = new ArrayList( initialCapacity );
+ Collection ids = new HashSet(initialCapacity, 1.0f);
for ( Dependency dependency : dominant )
{
ids.add( getId( dependency.getArtifact() ) );
@@ -337,317 +337,355 @@
return result;
}
- private String getId( Artifact a )
+ private static String getId( Artifact a )
{
return a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getClassifier() + ':' + a.getExtension();
}
- private void process( final Args args, List dependencies, List repositories,
- DependencySelector depSelector, DependencyManager depManager, DependencyTraverser depTraverser )
+ private void process( final Args args, Results results, List dependencies,
+ List repositories, DependencySelector depSelector,
+ DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter )
{
- nextDependency: for ( Dependency dependency : dependencies )
+ for ( Dependency dependency : dependencies )
{
- boolean disableVersionManagement = false;
+ processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter,
+ dependency );
+ }
+ }
- List relocations = Collections.emptyList();
+ private void processDependency( Args args, Results results, List repositories,
+ DependencySelector depSelector, DependencyManager depManager,
+ DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency )
+ {
- thisDependency: while ( true )
- {
- if ( !depSelector.selectDependency( dependency ) )
- {
- continue nextDependency;
- }
+ List relocations = Collections.emptyList();
+ boolean disableVersionManagement = false;
+ processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter, dependency,
+ relocations, disableVersionManagement );
+ }
- DependencyManagement depMngt = depManager.manageDependency( dependency );
- int managedBits = 0;
- String premanagedVersion = null;
- String premanagedScope = null;
- Boolean premanagedOptional = null;
+ private void processDependency( Args args, Results results, List repositories,
+ DependencySelector depSelector, DependencyManager depManager,
+ DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency,
+ List relocations, boolean disableVersionManagement )
+ {
- if ( depMngt != null )
- {
- if ( depMngt.getVersion() != null && !disableVersionManagement )
- {
- Artifact artifact = dependency.getArtifact();
- premanagedVersion = artifact.getVersion();
- dependency = dependency.setArtifact( artifact.setVersion( depMngt.getVersion() ) );
- managedBits |= DependencyNode.MANAGED_VERSION;
- }
- if ( depMngt.getProperties() != null )
- {
- Artifact artifact = dependency.getArtifact();
- dependency = dependency.setArtifact( artifact.setProperties( depMngt.getProperties() ) );
- managedBits |= DependencyNode.MANAGED_PROPERTIES;
- }
- if ( depMngt.getScope() != null )
- {
- premanagedScope = dependency.getScope();
- dependency = dependency.setScope( depMngt.getScope() );
- managedBits |= DependencyNode.MANAGED_SCOPE;
- }
- if ( depMngt.getOptional() != null )
- {
- premanagedOptional = dependency.isOptional();
- dependency = dependency.setOptional( depMngt.getOptional() );
- managedBits |= DependencyNode.MANAGED_OPTIONAL;
- }
- if ( depMngt.getExclusions() != null )
- {
- dependency = dependency.setExclusions( depMngt.getExclusions() );
- managedBits |= DependencyNode.MANAGED_EXCLUSIONS;
- }
- }
- disableVersionManagement = false;
+ if ( depSelector != null && !depSelector.selectDependency( dependency ) )
+ {
+ return;
+ }
- boolean noDescriptor = isLackingDescriptor( dependency.getArtifact() );
+ PremanagedDependency preManaged =
+ PremanagedDependency.create( depManager, dependency, disableVersionManagement, args.premanagedState );
+ dependency = preManaged.managedDependency;
- boolean traverse = !noDescriptor && depTraverser.traverseDependency( dependency );
+ boolean noDescriptor = isLackingDescriptor( dependency.getArtifact() );
- VersionRangeResult rangeResult;
- try
- {
- VersionRangeRequest rangeRequest = new VersionRangeRequest();
- rangeRequest.setArtifact( dependency.getArtifact() );
- rangeRequest.setRepositories( repositories );
- rangeRequest.setRequestContext( args.result.getRequest().getRequestContext() );
- rangeRequest.setTrace( args.trace );
+ boolean traverse = !noDescriptor && ( depTraverser == null || depTraverser.traverseDependency( dependency ) );
- Object key = args.pool.toKey( rangeRequest );
- rangeResult = args.pool.getConstraint( key, rangeRequest );
- if ( rangeResult == null )
- {
- rangeResult = versionRangeResolver.resolveVersionRange( args.session, rangeRequest );
- args.pool.putConstraint( key, rangeResult );
- }
+ List extends Version> versions;
+ VersionRangeResult rangeResult;
+ try
+ {
+ VersionRangeRequest rangeRequest = createVersionRangeRequest( args, repositories, dependency );
- if ( rangeResult.getVersions().isEmpty() )
- {
- throw new VersionRangeResolutionException( rangeResult, "No versions available for "
- + dependency.getArtifact() + " within specified range" );
- }
- }
- catch ( VersionRangeResolutionException e )
- {
- addException( args, dependency, e );
- continue nextDependency;
- }
+ rangeResult = cachedResolveRangeResult( rangeRequest, args.pool, args.session );
- List versions = rangeResult.getVersions();
- for ( Version version : versions )
- {
- Artifact originalArtifact = dependency.getArtifact().setVersion( version.toString() );
- Dependency d = dependency.setArtifact( originalArtifact );
+ versions = filterVersions( dependency, rangeResult, verFilter, args.versionContext );
+ }
+ catch ( VersionRangeResolutionException e )
+ {
+ results.addException( dependency, e, args.nodes );
+ return;
+ }
- ArtifactDescriptorResult descriptorResult;
- {
- ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
- descriptorRequest.setArtifact( d.getArtifact() );
- descriptorRequest.setRepositories( repositories );
- descriptorRequest.setRequestContext( args.result.getRequest().getRequestContext() );
- descriptorRequest.setTrace( args.trace );
+ for ( Version version : versions )
+ {
+ Artifact originalArtifact = dependency.getArtifact().setVersion( version.toString() );
+ Dependency d = dependency.setArtifact( originalArtifact );
- if ( noDescriptor )
- {
- descriptorResult = new ArtifactDescriptorResult( descriptorRequest );
- }
- else
- {
- Object key = args.pool.toKey( descriptorRequest );
- descriptorResult = args.pool.getDescriptor( key, descriptorRequest );
- if ( descriptorResult == null )
- {
- try
- {
- descriptorResult =
- descriptorReader.readArtifactDescriptor( args.session, descriptorRequest );
- args.pool.putDescriptor( key, descriptorResult );
- }
- catch ( ArtifactDescriptorException e )
- {
- addException( args, d, e );
- args.pool.putDescriptor( key, e );
- continue;
- }
- }
- else if ( descriptorResult == DataPool.NO_DESCRIPTOR )
- {
- continue;
- }
- }
- }
+ ArtifactDescriptorRequest descriptorRequest = createArtifactDescriptorRequest( args, repositories, d );
- d = d.setArtifact( descriptorResult.getArtifact() );
+ final ArtifactDescriptorResult descriptorResult =
+ getArtifactDescriptorResult( args, results, noDescriptor, d, descriptorRequest );
+ if ( descriptorResult != null )
+ {
+ d = d.setArtifact( descriptorResult.getArtifact() );
- DependencyNode node = args.nodes.top();
+ DependencyNode node = args.nodes.top();
- DependencyNode cycleNode = args.nodes.find( d.getArtifact() );
- if ( cycleNode != null )
+ int cycleEntry = args.nodes.find( d.getArtifact() );
+ if ( cycleEntry >= 0 )
+ {
+ results.addCycle( args.nodes, cycleEntry, d );
+ DependencyNode cycleNode = args.nodes.get( cycleEntry );
+ if ( cycleNode.getDependency() != null )
{
- DefaultDependencyNode child = new DefaultDependencyNode( d );
- child.setChildren( cycleNode.getChildren() );
- child.setManagedBits( managedBits );
- if ( args.premanagedState )
- {
- child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_VERSION, premanagedVersion );
- child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_SCOPE, premanagedScope );
- child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_OPTIONAL, premanagedOptional );
- }
- child.setRelocations( relocations );
- child.setVersionConstraint( rangeResult.getVersionConstraint() );
- child.setVersion( version );
- child.setAliases( descriptorResult.getAliases() );
- child.setRepositories( cycleNode.getRepositories() );
- child.setRequestContext( cycleNode.getRequestContext() );
-
+ DefaultDependencyNode child =
+ createDependencyNode( relocations, preManaged, rangeResult, version, d, descriptorResult,
+ cycleNode );
node.getChildren().add( child );
-
continue;
}
+ }
- if ( !descriptorResult.getRelocations().isEmpty() )
- {
- relocations = descriptorResult.getRelocations();
-
- disableVersionManagement =
- originalArtifact.getGroupId().equals( d.getArtifact().getGroupId() )
- && originalArtifact.getArtifactId().equals( d.getArtifact().getArtifactId() );
-
- dependency = d;
- continue thisDependency;
- }
-
+ if ( !descriptorResult.getRelocations().isEmpty() )
+ {
+ boolean disableVersionManagementSubsequently =
+ originalArtifact.getGroupId().equals( d.getArtifact().getGroupId() )
+ && originalArtifact.getArtifactId().equals( d.getArtifact().getArtifactId() );
+
+ processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter, d,
+ descriptorResult.getRelocations(), disableVersionManagementSubsequently );
+ return;
+ }
+ else
+ {
d = args.pool.intern( d.setArtifact( args.pool.intern( d.getArtifact() ) ) );
List repos =
getRemoteRepositories( rangeResult.getRepository( version ), repositories );
- DefaultDependencyNode child = new DefaultDependencyNode( d );
- child.setManagedBits( managedBits );
- if ( args.premanagedState )
- {
- child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_VERSION, premanagedVersion );
- child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_SCOPE, premanagedScope );
- child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_OPTIONAL, premanagedOptional );
- }
- child.setRelocations( relocations );
- child.setVersionConstraint( rangeResult.getVersionConstraint() );
- child.setVersion( version );
- child.setAliases( descriptorResult.getAliases() );
- child.setRepositories( repos );
- child.setRequestContext( args.result.getRequest().getRequestContext() );
+ DefaultDependencyNode child =
+ createDependencyNode( relocations, preManaged, rangeResult, version, d,
+ descriptorResult.getAliases(), repos, args.request.getRequestContext() );
node.getChildren().add( child );
boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
if ( recurse )
{
- DefaultDependencyCollectionContext context = args.collectionContext;
- context.set( d, descriptorResult.getManagedDependencies() );
+ doRecurse( args, results, repositories, depSelector, depManager, depTraverser, verFilter, d,
+ descriptorResult, child );
+ }
+ }
+ }
+ else
+ {
+ DependencyNode node = args.nodes.top();
+ List repos =
+ getRemoteRepositories( rangeResult.getRepository( version ), repositories );
+ DefaultDependencyNode child =
+ createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
+ args.request.getRequestContext() );
+ node.getChildren().add( child );
+ }
+ }
+ }
- DependencySelector childSelector = depSelector.deriveChildSelector( context );
- DependencyManager childManager = depManager.deriveChildManager( context );
- DependencyTraverser childTraverser = depTraverser.deriveChildTraverser( context );
+ private void doRecurse( Args args, Results results, List repositories,
+ DependencySelector depSelector, DependencyManager depManager,
+ DependencyTraverser depTraverser, VersionFilter verFilter, Dependency d,
+ ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child )
+ {
+ DefaultDependencyCollectionContext context = args.collectionContext;
+ context.set( d, descriptorResult.getManagedDependencies() );
- List childRepos = null;
- if ( args.ignoreRepos )
- {
- childRepos = repositories;
- }
- else
- {
- childRepos =
- remoteRepositoryManager.aggregateRepositories( args.session, repositories,
- descriptorResult.getRepositories(), true );
- }
+ DependencySelector childSelector = depSelector != null ? depSelector.deriveChildSelector( context ) : null;
+ DependencyManager childManager = depManager != null ? depManager.deriveChildManager( context ) : null;
+ DependencyTraverser childTraverser = depTraverser != null ? depTraverser.deriveChildTraverser( context ) : null;
+ VersionFilter childFilter = verFilter != null ? verFilter.deriveChildFilter( context ) : null;
- Object key =
- args.pool.toKey( d.getArtifact(), childRepos, childSelector, childManager, childTraverser );
+ final List childRepos = args.ignoreRepos
+ ? repositories
+ : remoteRepositoryManager.aggregateRepositories( args.session, repositories,
+ descriptorResult.getRepositories(), true );
- List children = args.pool.getChildren( key );
- if ( children == null )
- {
- args.pool.putChildren( key, child.getChildren() );
+ Object key =
+ args.pool.toKey( d.getArtifact(), childRepos, childSelector, childManager, childTraverser, childFilter );
- args.nodes.push( child );
+ List children = args.pool.getChildren( key );
+ if ( children == null )
+ {
+ args.pool.putChildren( key, child.getChildren() );
- process( args, descriptorResult.getDependencies(), childRepos, childSelector, childManager,
- childTraverser );
+ args.nodes.push( child );
- args.nodes.pop();
- }
- else
- {
- child.setChildren( children );
- }
- }
- }
+ process( args, results, descriptorResult.getDependencies(), childRepos, childSelector, childManager,
+ childTraverser, childFilter );
- break;
- }
+ args.nodes.pop();
+ }
+ else
+ {
+ child.setChildren( children );
}
}
- private boolean isLackingDescriptor( Artifact artifact )
+ private ArtifactDescriptorResult getArtifactDescriptorResult( Args args, Results results, boolean noDescriptor,
+ Dependency d,
+ ArtifactDescriptorRequest descriptorRequest )
{
- return artifact.getProperty( ArtifactProperties.LOCAL_PATH, null ) != null;
+ return noDescriptor
+ ? new ArtifactDescriptorResult( descriptorRequest )
+ : resolveCachedArtifactDescriptor( args.pool, descriptorRequest, args.session, d, results, args );
}
- private void addException( Args args, Dependency dependency, Exception e )
+ private ArtifactDescriptorResult resolveCachedArtifactDescriptor( DataPool pool,
+ ArtifactDescriptorRequest descriptorRequest,
+ RepositorySystemSession session, Dependency d,
+ Results results, Args args )
{
- if ( args.maxExceptions < 0 || args.result.getExceptions().size() < args.maxExceptions )
+ Object key = pool.toKey( descriptorRequest );
+ ArtifactDescriptorResult descriptorResult = pool.getDescriptor( key, descriptorRequest );
+ if ( descriptorResult == null )
{
- args.result.addException( e );
- if ( args.errorPath == null )
+ try
{
- StringBuilder buffer = new StringBuilder( 256 );
- for ( int i = 0; i < args.nodes.size(); i++ )
- {
- if ( buffer.length() > 0 )
- {
- buffer.append( " -> " );
- }
- Dependency dep = args.nodes.get( i ).getDependency();
- if ( dep == null )
- {
- continue;
- }
- buffer.append( dep.getArtifact() );
- }
- if ( buffer.length() > 0 )
- {
- buffer.append( " -> " );
- }
- buffer.append( dependency.getArtifact() );
- args.errorPath = buffer.toString();
+ descriptorResult = descriptorReader.readArtifactDescriptor( session, descriptorRequest );
+ pool.putDescriptor( key, descriptorResult );
}
+ catch ( ArtifactDescriptorException e )
+ {
+ results.addException( d, e, args.nodes );
+ pool.putDescriptor( key, e );
+ return null;
+ }
+
}
+ else if ( descriptorResult == DataPool.NO_DESCRIPTOR )
+ {
+ return null;
+ }
+
+ return descriptorResult;
+ }
+
+ private static DefaultDependencyNode createDependencyNode( List relocations,
+ PremanagedDependency preManaged,
+ VersionRangeResult rangeResult, Version version,
+ Dependency d, Collection