Skip to content
Commits on Source (4)
maven-resolver (1.4.1-1) unstable; urgency=medium
* Team upload.
* New upstream release
- Refreshed the patches
-- Emmanuel Bourg <ebourg@apache.org> Sun, 01 Sep 2019 22:45:51 +0200
maven-resolver (1.4.0-2) unstable; urgency=medium
* Team upload.
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver</artifactId>
<version>1.4.0</version>
<version>1.4.1</version>
</parent>
<artifactId>maven-resolver-api</artifactId>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver</artifactId>
<version>1.4.0</version>
<version>1.4.1</version>
</parent>
<artifactId>maven-resolver-connector-basic</artifactId>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-demos</artifactId>
<version>1.4.0</version>
<version>1.4.1</version>
</parent>
<artifactId>maven-resolver-demo-maven-plugin</artifactId>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-demos</artifactId>
<version>1.4.0</version>
<version>1.4.1</version>
</parent>
<artifactId>maven-resolver-demo-snippets</artifactId>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver</artifactId>
<version>1.4.0</version>
<version>1.4.1</version>
</parent>
<artifactId>maven-resolver-demos</artifactId>
......
......@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver</artifactId>
<version>1.4.0</version>
<version>1.4.1</version>
</parent>
<artifactId>maven-resolver-impl</artifactId>
......
package org.eclipse.aether.internal.impl.collect;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.concurrent.ExecutorService;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RequestTrace;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.util.ConfigUtils;
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
class Args
{
final RepositorySystemSession session;
final boolean ignoreRepos;
final boolean premanagedState;
final RequestTrace trace;
final DataPool pool;
final NodeStack nodes;
final DefaultDependencyCollectionContext collectionContext;
final DefaultVersionFilterContext versionContext;
final CollectRequest request;
final ExecutorService executor;
@SuppressWarnings( "checkstyle:parameternumber" )
Args( RepositorySystemSession session, RequestTrace trace, DataPool pool, NodeStack nodes,
DefaultDependencyCollectionContext collectionContext, DefaultVersionFilterContext versionContext,
CollectRequest request, ExecutorService executor )
{
this.session = session;
this.request = request;
this.ignoreRepos = session.isIgnoreArtifactDescriptorRepositories();
this.premanagedState = ConfigUtils.getBoolean( session, false, DependencyManagerUtils.CONFIG_PROP_VERBOSE );
this.trace = trace;
this.pool = pool;
this.nodes = nodes;
this.collectionContext = collectionContext;
this.versionContext = versionContext;
this.executor = executor;
}
}
......@@ -19,16 +19,13 @@ package org.eclipse.aether.internal.impl.collect;
* under the License.
*/
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.eclipse.aether.RepositoryCache;
import org.eclipse.aether.RepositorySystemSession;
......@@ -46,7 +43,6 @@ import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResult;
import org.eclipse.aether.util.concurrency.FutureResult;
import org.eclipse.aether.version.Version;
import org.eclipse.aether.version.VersionConstraint;
......@@ -61,8 +57,8 @@ final class DataPool
private static final String DESCRIPTORS = DataPool.class.getName() + "$Descriptors";
public static final Future<ArtifactDescriptorResult> NO_DESCRIPTOR =
new FutureResult<>( new ArtifactDescriptorResult( new ArtifactDescriptorRequest() ) );
static final ArtifactDescriptorResult NO_DESCRIPTOR =
new ArtifactDescriptorResult( new ArtifactDescriptorRequest() );
private ObjectPool<Artifact> artifacts;
......@@ -124,12 +120,12 @@ final class DataPool
return dependencies.intern( dependency );
}
public Object toKey( ArtifactDescriptorRequest request )
Object toKey( ArtifactDescriptorRequest request )
{
return request.getArtifact();
}
public Future<ArtifactDescriptorResult> getDescriptor( Object key, ArtifactDescriptorRequest request )
ArtifactDescriptorResult getDescriptor( Object key, ArtifactDescriptorRequest request )
{
Descriptor descriptor = descriptors.get( key );
if ( descriptor != null )
......@@ -139,22 +135,22 @@ final class DataPool
return null;
}
public void putDescriptor( Object key, Future<ArtifactDescriptorResult> futureResult )
void putDescriptor( Object key, ArtifactDescriptorResult result )
{
descriptors.put( key, new GoodDescriptor( futureResult ) );
descriptors.put( key, new GoodDescriptor( result ) );
}
public void putDescriptor( Object key, ArtifactDescriptorException exception )
void putDescriptor( Object key, ArtifactDescriptorException e )
{
descriptors.put( key, BadDescriptor.INSTANCE );
}
public Object toKey( VersionRangeRequest request )
Object toKey( VersionRangeRequest request )
{
return new ConstraintKey( request );
}
public VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
{
Constraint constraint = constraints.get( key );
if ( constraint != null )
......@@ -164,15 +160,15 @@ final class DataPool
return null;
}
public void putConstraint( Object key, VersionRangeResult result )
void putConstraint( Object key, VersionRangeResult result )
{
constraints.put( key, new Constraint( result ) );
}
public Object toKey( Artifact artifact, DefaultDependencyCollectionContext context )
public Object toKey( Artifact artifact, List<RemoteRepository> repositories, DependencySelector selector,
DependencyManager manager, DependencyTraverser traverser, VersionFilter filter )
{
return new GraphKey( artifact, context.getRepositories(), context.getDepSelector(),
context.getDepManager(), context.getDepTraverser(), context.getVerFilter() );
return new GraphKey( artifact, repositories, selector, manager, traverser, filter );
}
public List<DependencyNode> getChildren( Object key )
......@@ -187,78 +183,64 @@ final class DataPool
abstract static class Descriptor
{
public abstract Future<ArtifactDescriptorResult> toResult( ArtifactDescriptorRequest request );
public abstract ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request );
}
static final class GoodDescriptor
extends Descriptor
{
Future<ArtifactDescriptorResult> futureResult;
GoodDescriptor( Future<ArtifactDescriptorResult> futureResult )
{
this.futureResult = futureResult;
}
final Artifact artifact;
public Future<ArtifactDescriptorResult> toResult( final ArtifactDescriptorRequest request )
{
return new Future<ArtifactDescriptorResult>()
{
public boolean cancel( boolean mayInterruptIfRunning )
{
return futureResult.cancel( mayInterruptIfRunning );
}
final List<Artifact> relocations;
public boolean isCancelled()
{
return futureResult.isCancelled();
}
final Collection<Artifact> aliases;
public boolean isDone()
{
return futureResult.isDone();
}
final List<RemoteRepository> repositories;
public ArtifactDescriptorResult get()
throws InterruptedException, ExecutionException
{
ArtifactDescriptorResult result = futureResult.get();
return wrap( request, result );
}
public ArtifactDescriptorResult get( long timeout, TimeUnit unit )
throws InterruptedException, ExecutionException, TimeoutException
final List<Dependency> dependencies;
final List<Dependency> managedDependencies;
GoodDescriptor( ArtifactDescriptorResult result )
{
ArtifactDescriptorResult result = futureResult.get( timeout, unit );
return wrap( request, result );
}
};
artifact = result.getArtifact();
relocations = result.getRelocations();
aliases = result.getAliases();
dependencies = result.getDependencies();
managedDependencies = result.getManagedDependencies();
repositories = result.getRepositories();
}
private ArtifactDescriptorResult wrap( ArtifactDescriptorRequest request, ArtifactDescriptorResult result )
public ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request )
{
ArtifactDescriptorResult wrapped = new ArtifactDescriptorResult( request );
wrapped.setArtifact( result.getArtifact() );
wrapped.setRelocations( result.getRelocations() );
wrapped.setAliases( result.getAliases() );
wrapped.setDependencies( result.getDependencies() );
wrapped.setManagedDependencies( result.getManagedDependencies() );
wrapped.setRepositories( result.getRepositories() );
return wrapped;
ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
result.setArtifact( artifact );
result.setRelocations( relocations );
result.setAliases( aliases );
result.setDependencies( dependencies );
result.setManagedDependencies( managedDependencies );
result.setRepositories( repositories );
return result;
}
}
static final class BadDescriptor
extends Descriptor
{
static final BadDescriptor INSTANCE = new BadDescriptor();
public Future<ArtifactDescriptorResult> toResult( ArtifactDescriptorRequest request )
public ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request )
{
return NO_DESCRIPTOR;
}
}
static final class Constraint
private static final class Constraint
{
final VersionRepo[] repositories;
......@@ -276,7 +258,7 @@ final class DataPool
}
}
public VersionRangeResult toResult( VersionRangeRequest request )
VersionRangeResult toResult( VersionRangeRequest request )
{
VersionRangeResult result = new VersionRangeResult( request );
for ( VersionRepo vr : repositories )
......
......@@ -22,22 +22,14 @@ package org.eclipse.aether.internal.impl.collect;
import java.util.List;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RequestTrace;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.collection.CollectResult;
import org.eclipse.aether.collection.DependencyCollectionContext;
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.repository.RemoteRepository;
import org.eclipse.aether.version.Version;
/**
* @see DefaultDependencyCollector
*/
class DefaultDependencyCollectionContext
final class DefaultDependencyCollectionContext
implements DependencyCollectionContext
{
......@@ -48,28 +40,6 @@ class DefaultDependencyCollectionContext
private Dependency dependency;
private List<Dependency> managedDependencies;
private CollectResult collectResult;
private RequestTrace trace;
private Args args;
private Results results;
private List<Dependency> dependencies;
private List<RemoteRepository> repositories;
private DependencySelector depSelector;
private DependencyManager depManager;
private DependencyTraverser depTraverser;
private VersionFilter verFilter;
private Version version;
DefaultDependencyCollectionContext( RepositorySystemSession session, Artifact artifact,
Dependency dependency, List<Dependency> managedDependencies )
......@@ -80,34 +50,6 @@ class DefaultDependencyCollectionContext
this.managedDependencies = managedDependencies;
}
public void prepareDescent()
{
DependencySelector dependencySelector = session.getDependencySelector();
DependencyManager dependencyManager = session.getDependencyManager();
VersionFilter versionFilter = session.getVersionFilter();
setDepSelector( dependencySelector != null ? dependencySelector.deriveChildSelector( this ) : null );
setDepManager( dependencyManager != null ? dependencyManager.deriveChildManager( this ) : null );
setDepTraverser( depTraverser != null ? depTraverser.deriveChildTraverser( this ) : null );
setVerFilter( versionFilter != null ? versionFilter.deriveChildFilter( this ) : null );
}
public DefaultDependencyCollectionContext createChildContext()
{
DefaultDependencyCollectionContext childContext =
new DefaultDependencyCollectionContext( getSession(), getArtifact(),
getDependency(), getManagedDependencies() );
childContext.depSelector =
getDepSelector() != null ? getDepSelector().deriveChildSelector( this ) : null;
childContext.depManager =
getDepManager() != null ? getDepManager().deriveChildManager( this ) : null;
childContext.depTraverser =
getDepTraverser() != null ? getDepTraverser().deriveChildTraverser( this ) : null;
childContext.verFilter =
getVerFilter() != null ? getVerFilter().deriveChildFilter( this ) : null;
return childContext;
}
public RepositorySystemSession getSession()
{
return session;
......@@ -128,127 +70,13 @@ class DefaultDependencyCollectionContext
return managedDependencies;
}
public CollectResult getCollectResult()
{
return collectResult;
}
public void setCollectResult( CollectResult collectResult )
{
this.collectResult = collectResult;
}
public Args getArgs()
{
return args;
}
public void setArgs( Args args )
{
this.args = args;
}
public Results getResults()
{
return results;
}
public void setResults( Results results )
{
this.results = results;
}
public List<Dependency> getDependencies()
{
return dependencies;
}
public void setDependencies( List<Dependency> dependencies )
{
this.dependencies = dependencies;
}
public List<RemoteRepository> getRepositories()
{
return repositories;
}
public void setRepositories( List<RemoteRepository> repositories )
{
this.repositories = repositories;
}
public DependencySelector getDepSelector()
{
return depSelector;
}
public void setDepSelector( DependencySelector depSelector )
{
this.depSelector = depSelector;
}
public DependencyManager getDepManager()
{
return depManager;
}
public void setDepManager( DependencyManager depManager )
{
this.depManager = depManager;
}
public DependencyTraverser getDepTraverser()
{
return depTraverser;
}
public void setDepTraverser( DependencyTraverser depTraverser )
{
this.depTraverser = depTraverser;
}
public VersionFilter getVerFilter()
{
return verFilter;
}
public void setVerFilter( VersionFilter verFilter )
{
this.verFilter = verFilter;
}
public void setDependency( Dependency dependency )
public void set( Dependency dependency, List<Dependency> managedDependencies )
{
artifact = dependency.getArtifact();
this.dependency = dependency;
}
public void setManagedDependencies( List<Dependency> managedDependencies )
{
this.managedDependencies = managedDependencies;
}
public RequestTrace getTrace()
{
return trace;
}
public void setTrace( RequestTrace trace )
{
this.trace = trace;
}
public Version getVersion()
{
return version;
}
public void setVersion( Version version )
{
this.version = version;
}
@Override
public String toString()
{
......
package org.eclipse.aether.internal.impl.collect;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositoryException;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.ArtifactProperties;
import org.eclipse.aether.collection.VersionFilter;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.repository.ArtifactRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResolutionException;
import org.eclipse.aether.resolution.VersionRangeResult;
import org.eclipse.aether.version.Version;
/**
* Utility methods for dependency collection.
*
*/
public class DependencyCollectionUtils
{
@SuppressWarnings( "checkstyle:parameternumber" )
static DefaultDependencyNode addDependencyNode( DependencyNode parent, List<Artifact> relocations,
PremanagedDependency preManaged, VersionRangeResult rangeResult,
Version version, Dependency d, Collection<Artifact> aliases,
List<RemoteRepository> repos, String requestContext )
{
DefaultDependencyNode child = new DefaultDependencyNode( d );
preManaged.applyTo( child );
child.setRelocations( relocations );
child.setVersionConstraint( rangeResult.getVersionConstraint() );
child.setVersion( version );
child.setAliases( aliases );
child.setRepositories( repos );
child.setRequestContext( requestContext );
parent.getChildren().add( child );
return child;
}
@SuppressWarnings( "checkstyle:parameternumber" )
static DefaultDependencyNode createDependencyNode( DependencyNode parent, List<Artifact> relocations,
PremanagedDependency preManaged, VersionRangeResult rangeResult,
Version version, Dependency d,
ArtifactDescriptorResult descriptorResult,
DependencyNode cycleNode )
{
DefaultDependencyNode child =
addDependencyNode( parent, relocations, preManaged, rangeResult, version, d, descriptorResult.getAliases(),
cycleNode.getRepositories(), cycleNode.getRequestContext() );
child.setChildren( cycleNode.getChildren() );
return child;
}
static ArtifactDescriptorRequest createArtifactDescriptorRequest( Args args, List<RemoteRepository> repositories,
Dependency d )
{
ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
descriptorRequest.setArtifact( d.getArtifact() );
descriptorRequest.setRepositories( repositories );
descriptorRequest.setRequestContext( args.request.getRequestContext() );
descriptorRequest.setTrace( args.trace );
return descriptorRequest;
}
static VersionRangeRequest createVersionRangeRequest( Args args, List<RemoteRepository> repositories,
Dependency dependency )
{
VersionRangeRequest rangeRequest = new VersionRangeRequest();
rangeRequest.setArtifact( dependency.getArtifact() );
rangeRequest.setRepositories( repositories );
rangeRequest.setRequestContext( args.request.getRequestContext() );
rangeRequest.setTrace( args.trace );
return rangeRequest;
}
static boolean isLackingDescriptor( Artifact artifact )
{
return artifact.getProperty( ArtifactProperties.LOCAL_PATH, null ) != null;
}
static List<RemoteRepository> getRemoteRepositories( ArtifactRepository repository,
List<RemoteRepository> repositories )
{
if ( repository instanceof RemoteRepository )
{
return Collections.singletonList( (RemoteRepository) repository );
}
if ( repository != null )
{
return Collections.emptyList();
}
return repositories;
}
static List<? extends Version> filterVersions( Dependency dependency, VersionRangeResult rangeResult,
VersionFilter verFilter, DefaultVersionFilterContext verContext )
throws VersionRangeResolutionException
{
if ( rangeResult.getVersions().isEmpty() )
{
throw new VersionRangeResolutionException( rangeResult, "No versions available for "
+ dependency.getArtifact() + " within specified range" );
}
List<? extends Version> versions;
if ( verFilter != null && rangeResult.getVersionConstraint().getRange() != null )
{
verContext.set( dependency, rangeResult );
try
{
verFilter.filterVersions( verContext );
}
catch ( RepositoryException e )
{
throw new VersionRangeResolutionException( rangeResult, "Failed to filter versions for "
+ dependency.getArtifact() + ": " + e.getMessage(), e );
}
versions = verContext.get();
if ( versions.isEmpty() )
{
throw new VersionRangeResolutionException( rangeResult, "No acceptable versions for "
+ dependency.getArtifact() + ": " + rangeResult.getVersions() );
}
}
else
{
versions = rangeResult.getVersions();
}
return versions;
}
static RepositorySystemSession optimizeSession( RepositorySystemSession session )
{
DefaultRepositorySystemSession optimized = new DefaultRepositorySystemSession( session );
optimized.setArtifactTypeRegistry( CachingArtifactTypeRegistry.newInstance( session ) );
return optimized;
}
static String getId( Dependency d )
{
Artifact a = d.getArtifact();
return a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getClassifier() + ':' + a.getExtension();
}
}
package org.eclipse.aether.internal.impl.collect;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Future;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.aether.resolution.VersionRangeResult;
import org.eclipse.aether.version.Version;
class DependencyContext
{
Dependency origDependency;
DefaultDependencyCollectionContext context;
List<Artifact> relocations;
boolean disableVersionManagement;
Args args;
PremanagedDependency preManaged;
boolean traverse;
VersionRangeResult rangeResult;
Version version;
Artifact originalArtifact;
Dependency managedDependency;
Future<ArtifactDescriptorResult> futureDescriptorResult;
ArtifactDescriptorResult descriptorResult;
DependencyContext()
{
// empty
}
DependencyContext( DefaultDependencyCollectionContext context, Dependency dependency )
{
this.context = context;
this.origDependency = dependency;
this.relocations = Collections.emptyList();
this.disableVersionManagement = false;
this.args = context.getArgs();
}
}
\ No newline at end of file
package org.eclipse.aether.internal.impl.collect;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.collection.DependencyManagement;
import org.eclipse.aether.collection.DependencyManager;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.graph.Exclusion;
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
class PremanagedDependency
{
final String premanagedVersion;
final String premanagedScope;
final Boolean premanagedOptional;
/**
* @since 1.4.0
*/
final Collection<Exclusion> premanagedExclusions;
/**
* @since 1.4.0
*/
final Map<String, String> premanagedProperties;
final int managedBits;
final Dependency managedDependency;
final boolean premanagedState;
@SuppressWarnings( "checkstyle:parameternumber" )
PremanagedDependency( String premanagedVersion, String premanagedScope, Boolean premanagedOptional,
Collection<Exclusion> premanagedExclusions, Map<String, String> premanagedProperties,
int managedBits, Dependency managedDependency, boolean premanagedState )
{
this.premanagedVersion = premanagedVersion;
this.premanagedScope = premanagedScope;
this.premanagedOptional = premanagedOptional;
this.premanagedExclusions =
premanagedExclusions != null
? Collections.unmodifiableCollection( new ArrayList<>( premanagedExclusions ) )
: null;
this.premanagedProperties =
premanagedProperties != null
? Collections.unmodifiableMap( new HashMap<>( premanagedProperties ) )
: null;
this.managedBits = managedBits;
this.managedDependency = managedDependency;
this.premanagedState = premanagedState;
}
static PremanagedDependency create( DependencyManager depManager, Dependency dependency,
boolean disableVersionManagement, boolean premanagedState )
{
DependencyManagement depMngt = depManager != null ? depManager.manageDependency( dependency ) : null;
int managedBits = 0;
String premanagedVersion = null;
String premanagedScope = null;
Boolean premanagedOptional = null;
Collection<Exclusion> premanagedExclusions = null;
Map<String, String> premanagedProperties = null;
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();
premanagedProperties = artifact.getProperties();
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 )
{
premanagedExclusions = dependency.getExclusions();
dependency = dependency.setExclusions( depMngt.getExclusions() );
managedBits |= DependencyNode.MANAGED_EXCLUSIONS;
}
}
return new PremanagedDependency( premanagedVersion, premanagedScope, premanagedOptional,
premanagedExclusions, premanagedProperties, managedBits, dependency,
premanagedState );
}
public void applyTo( DefaultDependencyNode child )
{
child.setManagedBits( managedBits );
if ( 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.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_EXCLUSIONS, premanagedExclusions );
child.setData( DependencyManagerUtils.NODE_DATA_PREMANAGED_PROPERTIES, premanagedProperties );
}
}
}
package org.eclipse.aether.internal.impl.collect;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.collection.CollectResult;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.util.ConfigUtils;
class Results
{
private final CollectResult result;
private final int maxExceptions;
private final int maxCycles;
String errorPath;
@SuppressWarnings( { "checkstyle:magicnumber" } )
Results( CollectResult result, RepositorySystemSession session )
{
this.result = result;
maxExceptions = ConfigUtils.getInteger( session, 50, DefaultDependencyCollector.CONFIG_PROP_MAX_EXCEPTIONS );
maxCycles = ConfigUtils.getInteger( session, 10, DefaultDependencyCollector.CONFIG_PROP_MAX_CYCLES );
}
public void addException( Dependency dependency, Exception e, NodeStack nodes )
{
if ( maxExceptions < 0 || result.getExceptions().size() < maxExceptions )
{
result.addException( e );
if ( errorPath == null )
{
StringBuilder buffer = new StringBuilder( 256 );
for ( int i = 0; i < nodes.size(); i++ )
{
if ( buffer.length() > 0 )
{
buffer.append( " -> " );
}
Dependency dep = nodes.get( i ).getDependency();
if ( dep != null )
{
buffer.append( dep.getArtifact() );
}
}
if ( buffer.length() > 0 )
{
buffer.append( " -> " );
}
buffer.append( dependency.getArtifact() );
errorPath = buffer.toString();
}
}
}
public void addCycle( NodeStack nodes, int cycleEntry, Dependency dependency )
{
if ( maxCycles < 0 || result.getCycles().size() < maxCycles )
{
result.addCycle( new DefaultDependencyCycle( nodes, cycleEntry, dependency ) );
}
}
}
\ No newline at end of file
......@@ -18,11 +18,6 @@ package org.eclipse.aether.internal.impl.collect;
* specific language governing permissions and limitations
* under the License.
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
......@@ -30,9 +25,11 @@ import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.aether.util.concurrency.FutureResult;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class DataPoolTest
{
......@@ -42,7 +39,7 @@ public class DataPoolTest
}
@Test
public void testArtifactDescriptorCaching() throws InterruptedException, ExecutionException
public void testArtifactDescriptorCaching()
{
ArtifactDescriptorRequest request = new ArtifactDescriptorRequest();
request.setArtifact( new DefaultArtifact( "gid:aid:1" ) );
......@@ -53,14 +50,12 @@ public class DataPoolTest
result.addManagedDependency( new Dependency( new DefaultArtifact( "gid:mdep:3" ), "runtime" ) );
result.addRepository( new RemoteRepository.Builder( "test", "default", "http://localhost" ).build() );
result.addAlias( new DefaultArtifact( "gid:alias:4" ) );
Future<ArtifactDescriptorResult> futureResult = new FutureResult<>( result );
DataPool pool = newDataPool();
Object key = pool.toKey( request );
pool.putDescriptor( key, futureResult );
Future<ArtifactDescriptorResult> futureCached = pool.getDescriptor( key, request );
assertNotNull( futureCached );
ArtifactDescriptorResult cached = futureCached.get();
pool.putDescriptor( key, result );
ArtifactDescriptorResult cached = pool.getDescriptor( key, request );
assertNotNull( cached );
assertEquals( result.getArtifact(), cached.getArtifact() );
assertEquals( result.getRelocations(), cached.getRelocations() );
assertEquals( result.getDependencies(), cached.getDependencies() );
......
......@@ -68,7 +68,6 @@ import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
import org.eclipse.aether.util.graph.manager.DefaultDependencyManager;
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager;
import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
import org.eclipse.aether.util.graph.version.HighestVersionFilter;
import org.junit.Before;
import org.junit.Test;
......@@ -569,44 +568,6 @@ public class DefaultDependencyCollectorTest
assertEquals( 1, result.getRoot().getChildren().size() );
}
/**
* Tests that scope based dependency selection happens before dependency management.
* <p>
* This is not really correct (see MRESOLVER-9), but there are a number of tests
* in the Maven and Maven Integration Testing projects that currently rely on this
* behaviour.
*/
@Test
public void testSelectionBeforeManagement()
throws DependencyCollectionException
{
session.setDependencySelector( new ScopeDependencySelector( "provided", "test" ) );
session.setDependencyManager( new ClassicDependencyManager() );
Dependency dependency = newDep( "gid3:aid1:ext:1", "compile" );
CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
CollectResult result = collector.collectDependencies( session, request );
assertEquals( 0, result.getExceptions().size() );
DependencyNode root = result.getRoot();
Dependency newDependency = root.getDependency();
assertEquals( dependency, newDependency );
assertEquals( dependency.getArtifact(), newDependency.getArtifact() );
assertEquals( 1, root.getChildren().size() );
Dependency expect = newDep( "gid3:aid2:ext:1", "compile" );
DependencyNode childLevel1 = root.getChildren().get( 0 );
assertEquals( expect, childLevel1.getDependency() );
// With proper dependency management, the test scope of aid3 would
// be managed to compile, and we would get another child.
// Currently, the dependency gets filtered by ScopeDependencyManager.
assertEquals( 0, childLevel1.getChildren().size() );
}
static class TestDependencyManager
implements DependencyManager
{
......
[dependencies]
gid3:aid2:ext:1:compile
[managed-dependencies]
gid3:aid3:ext:1:compile:!optional