You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2018/03/05 22:34:47 UTC
[1/3] maven-resolver git commit: [MRESOLVER-35] Move dependency
collector and friends to subpackage in maven-resolver-impl
Repository: maven-resolver
Updated Branches:
refs/heads/master 90dfc9c00 -> 142469e78
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java
deleted file mode 100644
index 72c4602..0000000
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java
+++ /dev/null
@@ -1,569 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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 static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.aether.DefaultRepositorySystemSession;
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.artifact.ArtifactProperties;
-import org.eclipse.aether.artifact.DefaultArtifact;
-import org.eclipse.aether.collection.CollectRequest;
-import org.eclipse.aether.collection.CollectResult;
-import org.eclipse.aether.collection.DependencyCollectionContext;
-import org.eclipse.aether.collection.DependencyCollectionException;
-import org.eclipse.aether.collection.DependencyManagement;
-import org.eclipse.aether.collection.DependencyManager;
-import org.eclipse.aether.graph.Dependency;
-import org.eclipse.aether.graph.DependencyCycle;
-import org.eclipse.aether.graph.DependencyNode;
-import org.eclipse.aether.graph.Exclusion;
-import org.eclipse.aether.impl.ArtifactDescriptorReader;
-import org.eclipse.aether.internal.test.util.DependencyGraphParser;
-import org.eclipse.aether.internal.test.util.TestLoggerFactory;
-import org.eclipse.aether.internal.test.util.TestUtils;
-import org.eclipse.aether.repository.RemoteRepository;
-import org.eclipse.aether.resolution.ArtifactDescriptorException;
-import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
-import org.eclipse.aether.resolution.ArtifactDescriptorResult;
-import org.eclipse.aether.util.artifact.ArtifactIdUtils;
-import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
-import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
-import org.eclipse.aether.util.graph.version.HighestVersionFilter;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- */
-public class DefaultDependencyCollectorTest
-{
-
- private DefaultDependencyCollector collector;
-
- private DefaultRepositorySystemSession session;
-
- private DependencyGraphParser parser;
-
- private RemoteRepository repository;
-
- private IniArtifactDescriptorReader newReader( String prefix )
- {
- return new IniArtifactDescriptorReader( "artifact-descriptions/" + prefix );
- }
-
- private Dependency newDep( String coords )
- {
- return newDep( coords, "" );
- }
-
- private Dependency newDep( String coords, String scope )
- {
- return new Dependency( new DefaultArtifact( coords ), scope );
- }
-
- @Before
- public void setup()
- throws IOException
- {
- session = TestUtils.newSession();
-
- collector = new DefaultDependencyCollector();
- collector.setArtifactDescriptorReader( newReader( "" ) );
- collector.setVersionRangeResolver( new StubVersionRangeResolver() );
- collector.setRemoteRepositoryManager( new StubRemoteRepositoryManager() );
- collector.setLoggerFactory( new TestLoggerFactory() );
-
- parser = new DependencyGraphParser( "artifact-descriptions/" );
-
- repository = new RemoteRepository.Builder( "id", "default", "file:///" ).build();
- }
-
- private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual )
- {
- assertEqualSubtree( expected, actual, new LinkedList<DependencyNode>() );
- }
-
- private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual,
- LinkedList<DependencyNode> parents )
- {
- assertEquals( "path: " + parents, expected.getDependency(), actual.getDependency() );
-
- if ( actual.getDependency() != null )
- {
- Artifact artifact = actual.getDependency().getArtifact();
- for ( DependencyNode parent : parents )
- {
- if ( parent.getDependency() != null && artifact.equals( parent.getDependency().getArtifact() ) )
- {
- return;
- }
- }
- }
-
- parents.addLast( expected );
-
- assertEquals( "path: " + parents + ", expected: " + expected.getChildren() + ", actual: "
- + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() );
-
- Iterator<DependencyNode> iterator1 = expected.getChildren().iterator();
- Iterator<DependencyNode> iterator2 = actual.getChildren().iterator();
-
- while ( iterator1.hasNext() )
- {
- assertEqualSubtree( iterator1.next(), iterator2.next(), parents );
- }
-
- parents.removeLast();
- }
-
- private Dependency dep( DependencyNode root, int... coords )
- {
- return path( root, coords ).getDependency();
- }
-
- private DependencyNode path( DependencyNode root, int... coords )
- {
- try
- {
- DependencyNode node = root;
- for ( int coord : coords )
- {
- node = node.getChildren().get( coord );
- }
-
- return node;
- }
- catch ( IndexOutOfBoundsException e )
- {
- throw new IllegalArgumentException( "illegal coordinates for child", e );
- }
- catch ( NullPointerException e )
- {
- throw new IllegalArgumentException( "illegal coordinates for child", e );
- }
- }
-
- @Test
- public void testSimpleCollection()
- throws IOException, DependencyCollectionException
- {
- Dependency dependency = newDep( "gid:aid:ext:ver", "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( "gid:aid2:ext:ver", "compile" );
- assertEquals( expect, root.getChildren().get( 0 ).getDependency() );
- }
-
- @Test
- public void testMissingDependencyDescription()
- throws IOException
- {
- CollectRequest request =
- new CollectRequest( newDep( "missing:description:ext:ver" ), Arrays.asList( repository ) );
- try
- {
- collector.collectDependencies( session, request );
- fail( "expected exception" );
- }
- catch ( DependencyCollectionException e )
- {
- CollectResult result = e.getResult();
- assertSame( request, result.getRequest() );
- assertNotNull( result.getExceptions() );
- assertEquals( 1, result.getExceptions().size() );
-
- assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException );
-
- assertEquals( request.getRoot(), result.getRoot().getDependency() );
- }
- }
-
- @Test
- public void testDuplicates()
- throws IOException, DependencyCollectionException
- {
- Dependency dependency = newDep( "duplicate:transitive:ext:dependency" );
- 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( 2, root.getChildren().size() );
-
- Dependency dep = newDep( "gid:aid:ext:ver", "compile" );
- assertEquals( dep, dep( root, 0 ) );
-
- dep = newDep( "gid:aid2:ext:ver", "compile" );
- assertEquals( dep, dep( root, 1 ) );
- assertEquals( dep, dep( root, 0, 0 ) );
- assertEquals( dep( root, 1 ), dep( root, 0, 0 ) );
- }
-
- @Test
- public void testEqualSubtree()
- throws IOException, DependencyCollectionException
- {
- DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" );
- Dependency dependency = root.getDependency();
- CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
-
- CollectResult result = collector.collectDependencies( session, request );
- assertEqualSubtree( root, result.getRoot() );
- }
-
- @Test
- public void testCyclicDependencies()
- throws Exception
- {
- DependencyNode root = parser.parseResource( "cycle.txt" );
- CollectRequest request = new CollectRequest( root.getDependency(), Arrays.asList( repository ) );
- CollectResult result = collector.collectDependencies( session, request );
- assertEqualSubtree( root, result.getRoot() );
- }
-
- @Test
- public void testCyclicDependenciesBig()
- throws Exception
- {
- CollectRequest request = new CollectRequest( newDep( "1:2:pom:5.50-SNAPSHOT" ), Arrays.asList( repository ) );
- collector.setArtifactDescriptorReader( newReader( "cycle-big/" ) );
- CollectResult result = collector.collectDependencies( session, request );
- assertNotNull( result.getRoot() );
- // we only care about the performance here, this test must not hang or run out of mem
- }
-
- @Test
- public void testCyclicProjects()
- throws Exception
- {
- CollectRequest request = new CollectRequest( newDep( "test:a:2" ), Arrays.asList( repository ) );
- collector.setArtifactDescriptorReader( newReader( "versionless-cycle/" ) );
- CollectResult result = collector.collectDependencies( session, request );
- DependencyNode root = result.getRoot();
- DependencyNode a1 = path( root, 0, 0 );
- assertEquals( "a", a1.getArtifact().getArtifactId() );
- assertEquals( "1", a1.getArtifact().getVersion() );
- for ( DependencyNode child : a1.getChildren() )
- {
- assertFalse( "1".equals( child.getArtifact().getVersion() ) );
- }
-
- assertEquals( 1, result.getCycles().size() );
- DependencyCycle cycle = result.getCycles().get( 0 );
- assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() );
- assertEquals( Arrays.asList( root.getDependency(), path( root, 0 ).getDependency(), a1.getDependency() ),
- cycle.getCyclicDependencies() );
- }
-
- @Test
- public void testCyclicProjects_ConsiderLabelOfRootlessGraph()
- throws Exception
- {
- Dependency dep = newDep( "gid:aid:ver", "compile" );
- CollectRequest request =
- new CollectRequest().addDependency( dep ).addRepository( repository ).setRootArtifact( dep.getArtifact() );
- CollectResult result = collector.collectDependencies( session, request );
- DependencyNode root = result.getRoot();
- DependencyNode a1 = root.getChildren().get( 0 );
- assertEquals( "aid", a1.getArtifact().getArtifactId() );
- assertEquals( "ver", a1.getArtifact().getVersion() );
- DependencyNode a2 = a1.getChildren().get( 0 );
- assertEquals( "aid2", a2.getArtifact().getArtifactId() );
- assertEquals( "ver", a2.getArtifact().getVersion() );
-
- assertEquals( 1, result.getCycles().size() );
- DependencyCycle cycle = result.getCycles().get( 0 );
- assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() );
- assertEquals( Arrays.asList( new Dependency( dep.getArtifact(), null ), a1.getDependency() ),
- cycle.getCyclicDependencies() );
- }
-
- @Test
- public void testPartialResultOnError()
- throws IOException
- {
- DependencyNode root = parser.parseResource( "expectedPartialSubtreeOnError.txt" );
-
- Dependency dependency = root.getDependency();
- CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
-
- CollectResult result;
- try
- {
- result = collector.collectDependencies( session, request );
- fail( "expected exception " );
- }
- catch ( DependencyCollectionException e )
- {
- result = e.getResult();
-
- assertSame( request, result.getRequest() );
- assertNotNull( result.getExceptions() );
- assertEquals( 1, result.getExceptions().size() );
-
- assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException );
-
- assertEqualSubtree( root, result.getRoot() );
- }
- }
-
- @Test
- public void testCollectMultipleDependencies()
- throws IOException, DependencyCollectionException
- {
- Dependency root1 = newDep( "gid:aid:ext:ver", "compile" );
- Dependency root2 = newDep( "gid:aid2:ext:ver", "compile" );
- List<Dependency> dependencies = Arrays.asList( root1, root2 );
- CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository ) );
- CollectResult result = collector.collectDependencies( session, request );
-
- assertEquals( 0, result.getExceptions().size() );
- assertEquals( 2, result.getRoot().getChildren().size() );
- assertEquals( root1, dep( result.getRoot(), 0 ) );
-
- assertEquals( 1, path( result.getRoot(), 0 ).getChildren().size() );
- assertEquals( root2, dep( result.getRoot(), 0, 0 ) );
-
- assertEquals( 0, path( result.getRoot(), 1 ).getChildren().size() );
- assertEquals( root2, dep( result.getRoot(), 1 ) );
- }
-
- @Test
- public void testArtifactDescriptorResolutionNotRestrictedToRepoHostingSelectedVersion()
- throws Exception
- {
- RemoteRepository repo2 = new RemoteRepository.Builder( "test", "default", "file:///" ).build();
-
- final List<RemoteRepository> repos = new ArrayList<RemoteRepository>();
-
- collector.setArtifactDescriptorReader( new ArtifactDescriptorReader()
- {
- public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
- ArtifactDescriptorRequest request )
- throws ArtifactDescriptorException
- {
- repos.addAll( request.getRepositories() );
- return new ArtifactDescriptorResult( request );
- }
- } );
-
- List<Dependency> dependencies = Arrays.asList( newDep( "verrange:parent:jar:1[1,)", "compile" ) );
- CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository, repo2 ) );
- CollectResult result = collector.collectDependencies( session, request );
-
- assertEquals( 0, result.getExceptions().size() );
- assertEquals( 2, repos.size() );
- assertEquals( "id", repos.get( 0 ).getId() );
- assertEquals( "test", repos.get( 1 ).getId() );
- }
-
- @Test
- public void testManagedVersionScope()
- throws IOException, DependencyCollectionException
- {
- Dependency dependency = newDep( "managed:aid:ext:ver" );
- CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
-
- session.setDependencyManager( new ClassicDependencyManager() );
-
- CollectResult result = collector.collectDependencies( session, request );
-
- assertEquals( 0, result.getExceptions().size() );
-
- DependencyNode root = result.getRoot();
-
- assertEquals( dependency, dep( root ) );
- assertEquals( dependency.getArtifact(), dep( root ).getArtifact() );
-
- assertEquals( 1, root.getChildren().size() );
- Dependency expect = newDep( "gid:aid:ext:ver", "compile" );
- assertEquals( expect, dep( root, 0 ) );
-
- assertEquals( 1, path( root, 0 ).getChildren().size() );
- expect = newDep( "gid:aid2:ext:managedVersion", "managedScope" );
- assertEquals( expect, dep( root, 0, 0 ) );
- }
-
- @Test
- public void testDependencyManagement()
- throws IOException, DependencyCollectionException
- {
- collector.setArtifactDescriptorReader( newReader( "managed/" ) );
-
- DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" );
- TestDependencyManager depMgmt = new TestDependencyManager();
- depMgmt.add( dep( root, 0 ), "managed", null, null );
- depMgmt.add( dep( root, 0, 1 ), "managed", "managed", null );
- depMgmt.add( dep( root, 1 ), null, null, "managed" );
- session.setDependencyManager( depMgmt );
-
- // collect result will differ from expectedSubtreeComparisonResult.txt
- // set localPath -> no dependency traversal
- CollectRequest request = new CollectRequest( dep( root ), Arrays.asList( repository ) );
- CollectResult result = collector.collectDependencies( session, request );
-
- DependencyNode node = result.getRoot();
- assertEquals( "managed", dep( node, 0, 1 ).getArtifact().getVersion() );
- assertEquals( "managed", dep( node, 0, 1 ).getScope() );
-
- assertEquals( "managed", dep( node, 1 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) );
- assertEquals( "managed", dep( node, 0, 0 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) );
- }
-
- @Test
- public void testDependencyManagement_VerboseMode()
- throws Exception
- {
- String depId = "gid:aid2:ext";
- TestDependencyManager depMgmt = new TestDependencyManager();
- depMgmt.version( depId, "managedVersion" );
- depMgmt.scope( depId, "managedScope" );
- depMgmt.optional( depId, Boolean.TRUE );
- depMgmt.path( depId, "managedPath" );
- depMgmt.exclusions( depId, new Exclusion( "gid", "aid", "*", "*" ) );
- session.setDependencyManager( depMgmt );
- session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, Boolean.TRUE );
-
- CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:ver" ) );
- CollectResult result = collector.collectDependencies( session, request );
- DependencyNode node = result.getRoot().getChildren().get( 0 );
- assertEquals( DependencyNode.MANAGED_VERSION | DependencyNode.MANAGED_SCOPE | DependencyNode.MANAGED_OPTIONAL
- | DependencyNode.MANAGED_PROPERTIES | DependencyNode.MANAGED_EXCLUSIONS, node.getManagedBits() );
- assertEquals( "ver", DependencyManagerUtils.getPremanagedVersion( node ) );
- assertEquals( "compile", DependencyManagerUtils.getPremanagedScope( node ) );
- assertEquals( Boolean.FALSE, DependencyManagerUtils.getPremanagedOptional( node ) );
- }
-
- @Test
- public void testVersionFilter()
- throws Exception
- {
- session.setVersionFilter( new HighestVersionFilter() );
- CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:1" ) );
- CollectResult result = collector.collectDependencies( session, request );
- assertEquals( 1, result.getRoot().getChildren().size() );
- }
-
- static class TestDependencyManager
- implements DependencyManager
- {
-
- private Map<String, String> versions = new HashMap<String, String>();
-
- private Map<String, String> scopes = new HashMap<String, String>();
-
- private Map<String, Boolean> optionals = new HashMap<String, Boolean>();
-
- private Map<String, String> paths = new HashMap<String, String>();
-
- private Map<String, Collection<Exclusion>> exclusions = new HashMap<String, Collection<Exclusion>>();
-
- public void add( Dependency d, String version, String scope, String localPath )
- {
- String id = toKey( d );
- version( id, version );
- scope( id, scope );
- path( id, localPath );
- }
-
- public void version( String id, String version )
- {
- versions.put( id, version );
- }
-
- public void scope( String id, String scope )
- {
- scopes.put( id, scope );
- }
-
- public void optional( String id, Boolean optional )
- {
- optionals.put( id, optional );
- }
-
- public void path( String id, String path )
- {
- paths.put( id, path );
- }
-
- public void exclusions( String id, Exclusion... exclusions )
- {
- this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null );
- }
-
- public DependencyManagement manageDependency( Dependency d )
- {
- String id = toKey( d );
- DependencyManagement mgmt = new DependencyManagement();
- mgmt.setVersion( versions.get( id ) );
- mgmt.setScope( scopes.get( id ) );
- mgmt.setOptional( optionals.get( id ) );
- String path = paths.get( id );
- if ( path != null )
- {
- mgmt.setProperties( Collections.singletonMap( ArtifactProperties.LOCAL_PATH, path ) );
- }
- mgmt.setExclusions( exclusions.get( id ) );
- return mgmt;
- }
-
- private String toKey( Dependency dependency )
- {
- return ArtifactIdUtils.toVersionlessId( dependency.getArtifact() );
- }
-
- public DependencyManager deriveChildManager( DependencyCollectionContext context )
- {
- return this;
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
index 1836a04..ef3d062 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
@@ -27,7 +27,7 @@ import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.util.StringUtils;
-class StubRemoteRepositoryManager
+public class StubRemoteRepositoryManager
implements RemoteRepositoryManager
{
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DataPoolTest.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DataPoolTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DataPoolTest.java
new file mode 100644
index 0000000..6b26f33
--- /dev/null
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DataPoolTest.java
@@ -0,0 +1,66 @@
+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 static org.junit.Assert.*;
+
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.artifact.DefaultArtifact;
+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.junit.Test;
+
+public class DataPoolTest
+{
+
+ private DataPool newDataPool()
+ {
+ return new DataPool( new DefaultRepositorySystemSession() );
+ }
+
+ @Test
+ public void testArtifactDescriptorCaching()
+ {
+ ArtifactDescriptorRequest request = new ArtifactDescriptorRequest();
+ request.setArtifact( new DefaultArtifact( "gid:aid:1" ) );
+ ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
+ result.setArtifact( new DefaultArtifact( "gid:aid:2" ) );
+ result.addRelocation( request.getArtifact() );
+ result.addDependency( new Dependency( new DefaultArtifact( "gid:dep:3" ), "compile" ) );
+ 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" ) );
+
+ DataPool pool = newDataPool();
+ Object key = pool.toKey( request );
+ 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() );
+ assertEquals( result.getManagedDependencies(), cached.getManagedDependencies() );
+ assertEquals( result.getRepositories(), cached.getRepositories() );
+ assertEquals( result.getAliases(), cached.getAliases() );
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
new file mode 100644
index 0000000..dc89d9b
--- /dev/null
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
@@ -0,0 +1,572 @@
+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 static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.ArtifactProperties;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionContext;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.collection.DependencyManagement;
+import org.eclipse.aether.collection.DependencyManager;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyCycle;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.Exclusion;
+import org.eclipse.aether.impl.ArtifactDescriptorReader;
+import org.eclipse.aether.internal.impl.IniArtifactDescriptorReader;
+import org.eclipse.aether.internal.impl.StubRemoteRepositoryManager;
+import org.eclipse.aether.internal.impl.StubVersionRangeResolver;
+import org.eclipse.aether.internal.test.util.DependencyGraphParser;
+import org.eclipse.aether.internal.test.util.TestLoggerFactory;
+import org.eclipse.aether.internal.test.util.TestUtils;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactDescriptorException;
+import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
+import org.eclipse.aether.resolution.ArtifactDescriptorResult;
+import org.eclipse.aether.util.artifact.ArtifactIdUtils;
+import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
+import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
+import org.eclipse.aether.util.graph.version.HighestVersionFilter;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class DefaultDependencyCollectorTest
+{
+
+ private DefaultDependencyCollector collector;
+
+ private DefaultRepositorySystemSession session;
+
+ private DependencyGraphParser parser;
+
+ private RemoteRepository repository;
+
+ private IniArtifactDescriptorReader newReader( String prefix )
+ {
+ return new IniArtifactDescriptorReader( "artifact-descriptions/" + prefix );
+ }
+
+ private Dependency newDep( String coords )
+ {
+ return newDep( coords, "" );
+ }
+
+ private Dependency newDep( String coords, String scope )
+ {
+ return new Dependency( new DefaultArtifact( coords ), scope );
+ }
+
+ @Before
+ public void setup()
+ throws IOException
+ {
+ session = TestUtils.newSession();
+
+ collector = new DefaultDependencyCollector();
+ collector.setArtifactDescriptorReader( newReader( "" ) );
+ collector.setVersionRangeResolver( new StubVersionRangeResolver() );
+ collector.setRemoteRepositoryManager( new StubRemoteRepositoryManager() );
+ collector.setLoggerFactory( new TestLoggerFactory() );
+
+ parser = new DependencyGraphParser( "artifact-descriptions/" );
+
+ repository = new RemoteRepository.Builder( "id", "default", "file:///" ).build();
+ }
+
+ private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual )
+ {
+ assertEqualSubtree( expected, actual, new LinkedList<DependencyNode>() );
+ }
+
+ private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual,
+ LinkedList<DependencyNode> parents )
+ {
+ assertEquals( "path: " + parents, expected.getDependency(), actual.getDependency() );
+
+ if ( actual.getDependency() != null )
+ {
+ Artifact artifact = actual.getDependency().getArtifact();
+ for ( DependencyNode parent : parents )
+ {
+ if ( parent.getDependency() != null && artifact.equals( parent.getDependency().getArtifact() ) )
+ {
+ return;
+ }
+ }
+ }
+
+ parents.addLast( expected );
+
+ assertEquals( "path: " + parents + ", expected: " + expected.getChildren() + ", actual: "
+ + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() );
+
+ Iterator<DependencyNode> iterator1 = expected.getChildren().iterator();
+ Iterator<DependencyNode> iterator2 = actual.getChildren().iterator();
+
+ while ( iterator1.hasNext() )
+ {
+ assertEqualSubtree( iterator1.next(), iterator2.next(), parents );
+ }
+
+ parents.removeLast();
+ }
+
+ private Dependency dep( DependencyNode root, int... coords )
+ {
+ return path( root, coords ).getDependency();
+ }
+
+ private DependencyNode path( DependencyNode root, int... coords )
+ {
+ try
+ {
+ DependencyNode node = root;
+ for ( int coord : coords )
+ {
+ node = node.getChildren().get( coord );
+ }
+
+ return node;
+ }
+ catch ( IndexOutOfBoundsException e )
+ {
+ throw new IllegalArgumentException( "illegal coordinates for child", e );
+ }
+ catch ( NullPointerException e )
+ {
+ throw new IllegalArgumentException( "illegal coordinates for child", e );
+ }
+ }
+
+ @Test
+ public void testSimpleCollection()
+ throws IOException, DependencyCollectionException
+ {
+ Dependency dependency = newDep( "gid:aid:ext:ver", "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( "gid:aid2:ext:ver", "compile" );
+ assertEquals( expect, root.getChildren().get( 0 ).getDependency() );
+ }
+
+ @Test
+ public void testMissingDependencyDescription()
+ throws IOException
+ {
+ CollectRequest request =
+ new CollectRequest( newDep( "missing:description:ext:ver" ), Arrays.asList( repository ) );
+ try
+ {
+ collector.collectDependencies( session, request );
+ fail( "expected exception" );
+ }
+ catch ( DependencyCollectionException e )
+ {
+ CollectResult result = e.getResult();
+ assertSame( request, result.getRequest() );
+ assertNotNull( result.getExceptions() );
+ assertEquals( 1, result.getExceptions().size() );
+
+ assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException );
+
+ assertEquals( request.getRoot(), result.getRoot().getDependency() );
+ }
+ }
+
+ @Test
+ public void testDuplicates()
+ throws IOException, DependencyCollectionException
+ {
+ Dependency dependency = newDep( "duplicate:transitive:ext:dependency" );
+ 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( 2, root.getChildren().size() );
+
+ Dependency dep = newDep( "gid:aid:ext:ver", "compile" );
+ assertEquals( dep, dep( root, 0 ) );
+
+ dep = newDep( "gid:aid2:ext:ver", "compile" );
+ assertEquals( dep, dep( root, 1 ) );
+ assertEquals( dep, dep( root, 0, 0 ) );
+ assertEquals( dep( root, 1 ), dep( root, 0, 0 ) );
+ }
+
+ @Test
+ public void testEqualSubtree()
+ throws IOException, DependencyCollectionException
+ {
+ DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" );
+ Dependency dependency = root.getDependency();
+ CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+
+ CollectResult result = collector.collectDependencies( session, request );
+ assertEqualSubtree( root, result.getRoot() );
+ }
+
+ @Test
+ public void testCyclicDependencies()
+ throws Exception
+ {
+ DependencyNode root = parser.parseResource( "cycle.txt" );
+ CollectRequest request = new CollectRequest( root.getDependency(), Arrays.asList( repository ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ assertEqualSubtree( root, result.getRoot() );
+ }
+
+ @Test
+ public void testCyclicDependenciesBig()
+ throws Exception
+ {
+ CollectRequest request = new CollectRequest( newDep( "1:2:pom:5.50-SNAPSHOT" ), Arrays.asList( repository ) );
+ collector.setArtifactDescriptorReader( newReader( "cycle-big/" ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ assertNotNull( result.getRoot() );
+ // we only care about the performance here, this test must not hang or run out of mem
+ }
+
+ @Test
+ public void testCyclicProjects()
+ throws Exception
+ {
+ CollectRequest request = new CollectRequest( newDep( "test:a:2" ), Arrays.asList( repository ) );
+ collector.setArtifactDescriptorReader( newReader( "versionless-cycle/" ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ DependencyNode root = result.getRoot();
+ DependencyNode a1 = path( root, 0, 0 );
+ assertEquals( "a", a1.getArtifact().getArtifactId() );
+ assertEquals( "1", a1.getArtifact().getVersion() );
+ for ( DependencyNode child : a1.getChildren() )
+ {
+ assertFalse( "1".equals( child.getArtifact().getVersion() ) );
+ }
+
+ assertEquals( 1, result.getCycles().size() );
+ DependencyCycle cycle = result.getCycles().get( 0 );
+ assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() );
+ assertEquals( Arrays.asList( root.getDependency(), path( root, 0 ).getDependency(), a1.getDependency() ),
+ cycle.getCyclicDependencies() );
+ }
+
+ @Test
+ public void testCyclicProjects_ConsiderLabelOfRootlessGraph()
+ throws Exception
+ {
+ Dependency dep = newDep( "gid:aid:ver", "compile" );
+ CollectRequest request =
+ new CollectRequest().addDependency( dep ).addRepository( repository ).setRootArtifact( dep.getArtifact() );
+ CollectResult result = collector.collectDependencies( session, request );
+ DependencyNode root = result.getRoot();
+ DependencyNode a1 = root.getChildren().get( 0 );
+ assertEquals( "aid", a1.getArtifact().getArtifactId() );
+ assertEquals( "ver", a1.getArtifact().getVersion() );
+ DependencyNode a2 = a1.getChildren().get( 0 );
+ assertEquals( "aid2", a2.getArtifact().getArtifactId() );
+ assertEquals( "ver", a2.getArtifact().getVersion() );
+
+ assertEquals( 1, result.getCycles().size() );
+ DependencyCycle cycle = result.getCycles().get( 0 );
+ assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() );
+ assertEquals( Arrays.asList( new Dependency( dep.getArtifact(), null ), a1.getDependency() ),
+ cycle.getCyclicDependencies() );
+ }
+
+ @Test
+ public void testPartialResultOnError()
+ throws IOException
+ {
+ DependencyNode root = parser.parseResource( "expectedPartialSubtreeOnError.txt" );
+
+ Dependency dependency = root.getDependency();
+ CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+
+ CollectResult result;
+ try
+ {
+ result = collector.collectDependencies( session, request );
+ fail( "expected exception " );
+ }
+ catch ( DependencyCollectionException e )
+ {
+ result = e.getResult();
+
+ assertSame( request, result.getRequest() );
+ assertNotNull( result.getExceptions() );
+ assertEquals( 1, result.getExceptions().size() );
+
+ assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException );
+
+ assertEqualSubtree( root, result.getRoot() );
+ }
+ }
+
+ @Test
+ public void testCollectMultipleDependencies()
+ throws IOException, DependencyCollectionException
+ {
+ Dependency root1 = newDep( "gid:aid:ext:ver", "compile" );
+ Dependency root2 = newDep( "gid:aid2:ext:ver", "compile" );
+ List<Dependency> dependencies = Arrays.asList( root1, root2 );
+ CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository ) );
+ CollectResult result = collector.collectDependencies( session, request );
+
+ assertEquals( 0, result.getExceptions().size() );
+ assertEquals( 2, result.getRoot().getChildren().size() );
+ assertEquals( root1, dep( result.getRoot(), 0 ) );
+
+ assertEquals( 1, path( result.getRoot(), 0 ).getChildren().size() );
+ assertEquals( root2, dep( result.getRoot(), 0, 0 ) );
+
+ assertEquals( 0, path( result.getRoot(), 1 ).getChildren().size() );
+ assertEquals( root2, dep( result.getRoot(), 1 ) );
+ }
+
+ @Test
+ public void testArtifactDescriptorResolutionNotRestrictedToRepoHostingSelectedVersion()
+ throws Exception
+ {
+ RemoteRepository repo2 = new RemoteRepository.Builder( "test", "default", "file:///" ).build();
+
+ final List<RemoteRepository> repos = new ArrayList<RemoteRepository>();
+
+ collector.setArtifactDescriptorReader( new ArtifactDescriptorReader()
+ {
+ public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
+ ArtifactDescriptorRequest request )
+ throws ArtifactDescriptorException
+ {
+ repos.addAll( request.getRepositories() );
+ return new ArtifactDescriptorResult( request );
+ }
+ } );
+
+ List<Dependency> dependencies = Arrays.asList( newDep( "verrange:parent:jar:1[1,)", "compile" ) );
+ CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository, repo2 ) );
+ CollectResult result = collector.collectDependencies( session, request );
+
+ assertEquals( 0, result.getExceptions().size() );
+ assertEquals( 2, repos.size() );
+ assertEquals( "id", repos.get( 0 ).getId() );
+ assertEquals( "test", repos.get( 1 ).getId() );
+ }
+
+ @Test
+ public void testManagedVersionScope()
+ throws IOException, DependencyCollectionException
+ {
+ Dependency dependency = newDep( "managed:aid:ext:ver" );
+ CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+
+ session.setDependencyManager( new ClassicDependencyManager() );
+
+ CollectResult result = collector.collectDependencies( session, request );
+
+ assertEquals( 0, result.getExceptions().size() );
+
+ DependencyNode root = result.getRoot();
+
+ assertEquals( dependency, dep( root ) );
+ assertEquals( dependency.getArtifact(), dep( root ).getArtifact() );
+
+ assertEquals( 1, root.getChildren().size() );
+ Dependency expect = newDep( "gid:aid:ext:ver", "compile" );
+ assertEquals( expect, dep( root, 0 ) );
+
+ assertEquals( 1, path( root, 0 ).getChildren().size() );
+ expect = newDep( "gid:aid2:ext:managedVersion", "managedScope" );
+ assertEquals( expect, dep( root, 0, 0 ) );
+ }
+
+ @Test
+ public void testDependencyManagement()
+ throws IOException, DependencyCollectionException
+ {
+ collector.setArtifactDescriptorReader( newReader( "managed/" ) );
+
+ DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" );
+ TestDependencyManager depMgmt = new TestDependencyManager();
+ depMgmt.add( dep( root, 0 ), "managed", null, null );
+ depMgmt.add( dep( root, 0, 1 ), "managed", "managed", null );
+ depMgmt.add( dep( root, 1 ), null, null, "managed" );
+ session.setDependencyManager( depMgmt );
+
+ // collect result will differ from expectedSubtreeComparisonResult.txt
+ // set localPath -> no dependency traversal
+ CollectRequest request = new CollectRequest( dep( root ), Arrays.asList( repository ) );
+ CollectResult result = collector.collectDependencies( session, request );
+
+ DependencyNode node = result.getRoot();
+ assertEquals( "managed", dep( node, 0, 1 ).getArtifact().getVersion() );
+ assertEquals( "managed", dep( node, 0, 1 ).getScope() );
+
+ assertEquals( "managed", dep( node, 1 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) );
+ assertEquals( "managed", dep( node, 0, 0 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) );
+ }
+
+ @Test
+ public void testDependencyManagement_VerboseMode()
+ throws Exception
+ {
+ String depId = "gid:aid2:ext";
+ TestDependencyManager depMgmt = new TestDependencyManager();
+ depMgmt.version( depId, "managedVersion" );
+ depMgmt.scope( depId, "managedScope" );
+ depMgmt.optional( depId, Boolean.TRUE );
+ depMgmt.path( depId, "managedPath" );
+ depMgmt.exclusions( depId, new Exclusion( "gid", "aid", "*", "*" ) );
+ session.setDependencyManager( depMgmt );
+ session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, Boolean.TRUE );
+
+ CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:ver" ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ DependencyNode node = result.getRoot().getChildren().get( 0 );
+ assertEquals( DependencyNode.MANAGED_VERSION | DependencyNode.MANAGED_SCOPE | DependencyNode.MANAGED_OPTIONAL
+ | DependencyNode.MANAGED_PROPERTIES | DependencyNode.MANAGED_EXCLUSIONS, node.getManagedBits() );
+ assertEquals( "ver", DependencyManagerUtils.getPremanagedVersion( node ) );
+ assertEquals( "compile", DependencyManagerUtils.getPremanagedScope( node ) );
+ assertEquals( Boolean.FALSE, DependencyManagerUtils.getPremanagedOptional( node ) );
+ }
+
+ @Test
+ public void testVersionFilter()
+ throws Exception
+ {
+ session.setVersionFilter( new HighestVersionFilter() );
+ CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:1" ) );
+ CollectResult result = collector.collectDependencies( session, request );
+ assertEquals( 1, result.getRoot().getChildren().size() );
+ }
+
+ static class TestDependencyManager
+ implements DependencyManager
+ {
+
+ private Map<String, String> versions = new HashMap<String, String>();
+
+ private Map<String, String> scopes = new HashMap<String, String>();
+
+ private Map<String, Boolean> optionals = new HashMap<String, Boolean>();
+
+ private Map<String, String> paths = new HashMap<String, String>();
+
+ private Map<String, Collection<Exclusion>> exclusions = new HashMap<String, Collection<Exclusion>>();
+
+ public void add( Dependency d, String version, String scope, String localPath )
+ {
+ String id = toKey( d );
+ version( id, version );
+ scope( id, scope );
+ path( id, localPath );
+ }
+
+ public void version( String id, String version )
+ {
+ versions.put( id, version );
+ }
+
+ public void scope( String id, String scope )
+ {
+ scopes.put( id, scope );
+ }
+
+ public void optional( String id, Boolean optional )
+ {
+ optionals.put( id, optional );
+ }
+
+ public void path( String id, String path )
+ {
+ paths.put( id, path );
+ }
+
+ public void exclusions( String id, Exclusion... exclusions )
+ {
+ this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null );
+ }
+
+ public DependencyManagement manageDependency( Dependency d )
+ {
+ String id = toKey( d );
+ DependencyManagement mgmt = new DependencyManagement();
+ mgmt.setVersion( versions.get( id ) );
+ mgmt.setScope( scopes.get( id ) );
+ mgmt.setOptional( optionals.get( id ) );
+ String path = paths.get( id );
+ if ( path != null )
+ {
+ mgmt.setProperties( Collections.singletonMap( ArtifactProperties.LOCAL_PATH, path ) );
+ }
+ mgmt.setExclusions( exclusions.get( id ) );
+ return mgmt;
+ }
+
+ private String toKey( Dependency dependency )
+ {
+ return ArtifactIdUtils.toVersionlessId( dependency.getArtifact() );
+ }
+
+ public DependencyManager deriveChildManager( DependencyCollectionContext context )
+ {
+ return this;
+ }
+
+ }
+
+}
[3/3] maven-resolver git commit: [MRESOLVER-35] Move dependency
collector and friends to subpackage in maven-resolver-impl
Posted by mi...@apache.org.
[MRESOLVER-35] Move dependency collector and friends to subpackage in maven-resolver-impl
This closes #12
Project: http://git-wip-us.apache.org/repos/asf/maven-resolver/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-resolver/commit/142469e7
Tree: http://git-wip-us.apache.org/repos/asf/maven-resolver/tree/142469e7
Diff: http://git-wip-us.apache.org/repos/asf/maven-resolver/diff/142469e7
Branch: refs/heads/master
Commit: 142469e78633de0d27ba0a75f1c440587a604307
Parents: 90dfc9c
Author: Sylwester Lachiewicz <sl...@gmail.com>
Authored: Mon Mar 5 21:45:43 2018 +0100
Committer: Michael Osipov <mi...@apache.org>
Committed: Mon Mar 5 23:28:48 2018 +0100
----------------------------------------------------------------------
.../aether/impl/DefaultServiceLocator.java | 2 +-
.../eclipse/aether/impl/guice/AetherModule.java | 2 +-
.../impl/CachingArtifactTypeRegistry.java | 69 --
.../eclipse/aether/internal/impl/DataPool.java | 439 ---------
.../DefaultDependencyCollectionContext.java | 86 --
.../impl/DefaultDependencyCollector.java | 896 -------------------
.../internal/impl/DefaultDependencyCycle.java | 87 --
...ultDependencyGraphTransformationContext.java | 74 --
.../impl/DefaultVersionFilterContext.java | 217 -----
.../eclipse/aether/internal/impl/NodeStack.java | 124 ---
.../aether/internal/impl/ObjectPool.java | 52 --
.../collect/CachingArtifactTypeRegistry.java | 69 ++
.../aether/internal/impl/collect/DataPool.java | 439 +++++++++
.../DefaultDependencyCollectionContext.java | 86 ++
.../collect/DefaultDependencyCollector.java | 896 +++++++++++++++++++
.../impl/collect/DefaultDependencyCycle.java | 87 ++
...ultDependencyGraphTransformationContext.java | 74 ++
.../collect/DefaultVersionFilterContext.java | 217 +++++
.../aether/internal/impl/collect/NodeStack.java | 124 +++
.../internal/impl/collect/ObjectPool.java | 52 ++
.../internal/impl/collect/package-info.java | 23 +
.../aether/internal/impl/DataPoolTest.java | 66 --
.../impl/DefaultDependencyCollectorTest.java | 569 ------------
.../impl/StubRemoteRepositoryManager.java | 2 +-
.../internal/impl/collect/DataPoolTest.java | 66 ++
.../collect/DefaultDependencyCollectorTest.java | 572 ++++++++++++
26 files changed, 2708 insertions(+), 2682 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
index 809d802..7d30cb3 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
@@ -33,7 +33,7 @@ import static java.util.Objects.requireNonNull;
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.collect.DefaultDependencyCollector;
import org.eclipse.aether.internal.impl.DefaultDeployer;
import org.eclipse.aether.internal.impl.DefaultFileProcessor;
import org.eclipse.aether.internal.impl.DefaultInstaller;
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
index a19e423..3fb7451 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
@@ -43,7 +43,7 @@ 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.collect.DefaultDependencyCollector;
import org.eclipse.aether.internal.impl.DefaultDeployer;
import org.eclipse.aether.internal.impl.DefaultFileProcessor;
import org.eclipse.aether.internal.impl.DefaultInstaller;
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/CachingArtifactTypeRegistry.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/CachingArtifactTypeRegistry.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/CachingArtifactTypeRegistry.java
deleted file mode 100644
index bde4103..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/CachingArtifactTypeRegistry.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.HashMap;
-import java.util.Map;
-
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.artifact.ArtifactType;
-import org.eclipse.aether.artifact.ArtifactTypeRegistry;
-
-/**
- * A short-lived artifact type registry that caches results from a presumedly slower type registry.
- */
-class CachingArtifactTypeRegistry
- implements ArtifactTypeRegistry
-{
-
- private final ArtifactTypeRegistry delegate;
-
- private final Map<String, ArtifactType> types;
-
- public static ArtifactTypeRegistry newInstance( RepositorySystemSession session )
- {
- return newInstance( session.getArtifactTypeRegistry() );
- }
-
- public static ArtifactTypeRegistry newInstance( ArtifactTypeRegistry delegate )
- {
- return ( delegate != null ) ? new CachingArtifactTypeRegistry( delegate ) : null;
- }
-
- private CachingArtifactTypeRegistry( ArtifactTypeRegistry delegate )
- {
- this.delegate = delegate;
- types = new HashMap<String, ArtifactType>();
- }
-
- public ArtifactType get( String typeId )
- {
- ArtifactType type = types.get( typeId );
-
- if ( type == null )
- {
- type = delegate.get( typeId );
- types.put( typeId, type );
- }
-
- return type;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java
deleted file mode 100644
index 80c87c7..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DataPool.java
+++ /dev/null
@@ -1,439 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import org.eclipse.aether.RepositoryCache;
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.artifact.Artifact;
-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;
-import org.eclipse.aether.repository.RemoteRepository;
-import org.eclipse.aether.resolution.ArtifactDescriptorException;
-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.version.Version;
-import org.eclipse.aether.version.VersionConstraint;
-
-/**
- */
-final class DataPool
-{
-
- private static final String ARTIFACT_POOL = DataPool.class.getName() + "$Artifact";
-
- private static final String DEPENDENCY_POOL = DataPool.class.getName() + "$Dependency";
-
- private static final String DESCRIPTORS = DataPool.class.getName() + "$Descriptors";
-
- public static final ArtifactDescriptorResult NO_DESCRIPTOR =
- new ArtifactDescriptorResult( new ArtifactDescriptorRequest() );
-
- private ObjectPool<Artifact> artifacts;
-
- private ObjectPool<Dependency> dependencies;
-
- private Map<Object, Descriptor> descriptors;
-
- private Map<Object, Constraint> constraints = new HashMap<Object, Constraint>();
-
- private Map<Object, List<DependencyNode>> nodes = new HashMap<Object, List<DependencyNode>>( 256 );
-
- @SuppressWarnings( "unchecked" )
- DataPool( RepositorySystemSession session )
- {
- RepositoryCache cache = session.getCache();
-
- if ( cache != null )
- {
- artifacts = (ObjectPool<Artifact>) cache.get( session, ARTIFACT_POOL );
- dependencies = (ObjectPool<Dependency>) cache.get( session, DEPENDENCY_POOL );
- descriptors = (Map<Object, Descriptor>) cache.get( session, DESCRIPTORS );
- }
-
- if ( artifacts == null )
- {
- artifacts = new ObjectPool<Artifact>();
- if ( cache != null )
- {
- cache.put( session, ARTIFACT_POOL, artifacts );
- }
- }
-
- if ( dependencies == null )
- {
- dependencies = new ObjectPool<Dependency>();
- if ( cache != null )
- {
- cache.put( session, DEPENDENCY_POOL, dependencies );
- }
- }
-
- if ( descriptors == null )
- {
- descriptors = Collections.synchronizedMap( new WeakHashMap<Object, Descriptor>( 256 ) );
- if ( cache != null )
- {
- cache.put( session, DESCRIPTORS, descriptors );
- }
- }
- }
-
- public Artifact intern( Artifact artifact )
- {
- return artifacts.intern( artifact );
- }
-
- public Dependency intern( Dependency dependency )
- {
- return dependencies.intern( dependency );
- }
-
- public Object toKey( ArtifactDescriptorRequest request )
- {
- return request.getArtifact();
- }
-
- public ArtifactDescriptorResult getDescriptor( Object key, ArtifactDescriptorRequest request )
- {
- Descriptor descriptor = descriptors.get( key );
- if ( descriptor != null )
- {
- return descriptor.toResult( request );
- }
- return null;
- }
-
- public void putDescriptor( Object key, ArtifactDescriptorResult result )
- {
- descriptors.put( key, new GoodDescriptor( result ) );
- }
-
- public void putDescriptor( Object key, ArtifactDescriptorException e )
- {
- descriptors.put( key, BadDescriptor.INSTANCE );
- }
-
- public Object toKey( VersionRangeRequest request )
- {
- return new ConstraintKey( request );
- }
-
- public VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
- {
- Constraint constraint = constraints.get( key );
- if ( constraint != null )
- {
- return constraint.toResult( request );
- }
- return null;
- }
-
- public void putConstraint( Object key, VersionRangeResult result )
- {
- constraints.put( key, new Constraint( result ) );
- }
-
- public Object toKey( Artifact artifact, List<RemoteRepository> repositories, DependencySelector selector,
- DependencyManager manager, DependencyTraverser traverser, VersionFilter filter )
- {
- return new GraphKey( artifact, repositories, selector, manager, traverser, filter );
- }
-
- public List<DependencyNode> getChildren( Object key )
- {
- return nodes.get( key );
- }
-
- public void putChildren( Object key, List<DependencyNode> children )
- {
- nodes.put( key, children );
- }
-
- abstract static class Descriptor
- {
-
- public abstract ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request );
-
- }
-
- static final class GoodDescriptor
- extends Descriptor
- {
-
- final Artifact artifact;
-
- final List<Artifact> relocations;
-
- final Collection<Artifact> aliases;
-
- final List<RemoteRepository> repositories;
-
- final List<Dependency> dependencies;
-
- final List<Dependency> managedDependencies;
-
- GoodDescriptor( ArtifactDescriptorResult result )
- {
- artifact = result.getArtifact();
- relocations = result.getRelocations();
- aliases = result.getAliases();
- dependencies = result.getDependencies();
- managedDependencies = result.getManagedDependencies();
- repositories = result.getRepositories();
- }
-
- public ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request )
- {
- 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 ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request )
- {
- return NO_DESCRIPTOR;
- }
-
- }
-
- static final class Constraint
- {
-
- final VersionRepo[] repositories;
-
- final VersionConstraint versionConstraint;
-
- Constraint( VersionRangeResult result )
- {
- versionConstraint = result.getVersionConstraint();
- List<Version> versions = result.getVersions();
- repositories = new VersionRepo[versions.size()];
- int i = 0;
- for ( Version version : versions )
- {
- repositories[i++] = new VersionRepo( version, result.getRepository( version ) );
- }
- }
-
- public VersionRangeResult toResult( VersionRangeRequest request )
- {
- VersionRangeResult result = new VersionRangeResult( request );
- for ( VersionRepo vr : repositories )
- {
- result.addVersion( vr.version );
- result.setRepository( vr.version, vr.repo );
- }
- result.setVersionConstraint( versionConstraint );
- return result;
- }
-
- static final class VersionRepo
- {
-
- final Version version;
-
- final ArtifactRepository repo;
-
- VersionRepo( Version version, ArtifactRepository repo )
- {
- this.version = version;
- this.repo = repo;
- }
-
- }
-
- }
-
- static final class ConstraintKey
- {
-
- private final Artifact artifact;
-
- private final List<RemoteRepository> repositories;
-
- private final int hashCode;
-
- ConstraintKey( VersionRangeRequest request )
- {
- artifact = request.getArtifact();
- repositories = request.getRepositories();
- hashCode = artifact.hashCode();
- }
-
- @Override
- public boolean equals( Object obj )
- {
- if ( obj == this )
- {
- return true;
- }
- else if ( !( obj instanceof ConstraintKey ) )
- {
- return false;
- }
- ConstraintKey that = (ConstraintKey) obj;
- return artifact.equals( that.artifact ) && equals( repositories, that.repositories );
- }
-
- private static boolean equals( List<RemoteRepository> repos1, List<RemoteRepository> repos2 )
- {
- if ( repos1.size() != repos2.size() )
- {
- return false;
- }
- for ( int i = 0, n = repos1.size(); i < n; i++ )
- {
- RemoteRepository repo1 = repos1.get( i );
- RemoteRepository repo2 = repos2.get( i );
- if ( repo1.isRepositoryManager() != repo2.isRepositoryManager() )
- {
- return false;
- }
- if ( repo1.isRepositoryManager() )
- {
- if ( !equals( repo1.getMirroredRepositories(), repo2.getMirroredRepositories() ) )
- {
- return false;
- }
- }
- else if ( !repo1.getUrl().equals( repo2.getUrl() ) )
- {
- return false;
- }
- else if ( repo1.getPolicy( true ).isEnabled() != repo2.getPolicy( true ).isEnabled() )
- {
- return false;
- }
- else if ( repo1.getPolicy( false ).isEnabled() != repo2.getPolicy( false ).isEnabled() )
- {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public int hashCode()
- {
- return hashCode;
- }
-
- }
-
- static final class GraphKey
- {
-
- private final Artifact artifact;
-
- private final List<RemoteRepository> repositories;
-
- private final DependencySelector selector;
-
- private final DependencyManager manager;
-
- private final DependencyTraverser traverser;
-
- private final VersionFilter filter;
-
- private final int hashCode;
-
- GraphKey( Artifact artifact, List<RemoteRepository> repositories, DependencySelector selector,
- 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 + hash( selector );
- hash = hash * 31 + hash( manager );
- hash = hash * 31 + hash( traverser );
- hash = hash * 31 + hash( filter );
- hashCode = hash;
- }
-
- @Override
- public boolean equals( Object obj )
- {
- if ( obj == this )
- {
- return true;
- }
- else if ( !( obj instanceof GraphKey ) )
- {
- return false;
- }
- GraphKey that = (GraphKey) obj;
- return artifact.equals( that.artifact ) && repositories.equals( that.repositories )
- && eq( selector, that.selector ) && eq( manager, that.manager ) && eq( traverser, that.traverser )
- && eq( filter, that.filter );
- }
-
- @Override
- public int hashCode()
- {
- return hashCode;
- }
-
- private static <T> 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;
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java
deleted file mode 100644
index ede0655..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectionContext.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.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
- */
-final class DefaultDependencyCollectionContext
- implements DependencyCollectionContext
-{
-
- private final RepositorySystemSession session;
-
- private Artifact artifact;
-
- private Dependency dependency;
-
- private List<Dependency> managedDependencies;
-
- DefaultDependencyCollectionContext( RepositorySystemSession session, Artifact artifact,
- Dependency dependency, List<Dependency> managedDependencies )
- {
- this.session = session;
- this.artifact = ( dependency != null ) ? dependency.getArtifact() : artifact;
- this.dependency = dependency;
- this.managedDependencies = managedDependencies;
- }
-
- public RepositorySystemSession getSession()
- {
- return session;
- }
-
- public Artifact getArtifact()
- {
- return artifact;
- }
-
- public Dependency getDependency()
- {
- return dependency;
- }
-
- public List<Dependency> getManagedDependencies()
- {
- return managedDependencies;
- }
-
- public void set( Dependency dependency, List<Dependency> managedDependencies )
- {
- artifact = dependency.getArtifact();
- this.dependency = dependency;
- this.managedDependencies = managedDependencies;
- }
-
- @Override
- public String toString()
- {
- return String.valueOf( getDependency() );
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java
deleted file mode 100644
index 074b83c..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java
+++ /dev/null
@@ -1,896 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import static java.util.Objects.requireNonNull;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.eclipse.aether.DefaultRepositorySystemSession;
-import org.eclipse.aether.RepositoryException;
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.RequestTrace;
-import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.artifact.ArtifactProperties;
-import org.eclipse.aether.collection.CollectRequest;
-import org.eclipse.aether.collection.CollectResult;
-import org.eclipse.aether.collection.DependencyCollectionException;
-import org.eclipse.aether.collection.DependencyGraphTransformer;
-import org.eclipse.aether.collection.DependencyManagement;
-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;
-import org.eclipse.aether.graph.Exclusion;
-import org.eclipse.aether.impl.ArtifactDescriptorReader;
-import org.eclipse.aether.impl.DependencyCollector;
-import org.eclipse.aether.impl.RemoteRepositoryManager;
-import org.eclipse.aether.impl.VersionRangeResolver;
-import org.eclipse.aether.repository.ArtifactRepository;
-import org.eclipse.aether.repository.RemoteRepository;
-import org.eclipse.aether.resolution.ArtifactDescriptorException;
-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.spi.locator.Service;
-import org.eclipse.aether.spi.locator.ServiceLocator;
-import org.eclipse.aether.spi.log.Logger;
-import org.eclipse.aether.spi.log.LoggerFactory;
-import org.eclipse.aether.spi.log.NullLoggerFactory;
-import org.eclipse.aether.util.ConfigUtils;
-import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
-import org.eclipse.aether.util.graph.transformer.TransformationContextKeys;
-import org.eclipse.aether.version.Version;
-
-/**
- */
-@Named
-public class DefaultDependencyCollector
- implements DependencyCollector, Service
-{
-
- 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;
-
- private RemoteRepositoryManager remoteRepositoryManager;
-
- private ArtifactDescriptorReader descriptorReader;
-
- private VersionRangeResolver versionRangeResolver;
-
- public DefaultDependencyCollector()
- {
- // enables default constructor
- }
-
- @Inject
- DefaultDependencyCollector( RemoteRepositoryManager remoteRepositoryManager,
- ArtifactDescriptorReader artifactDescriptorReader,
- VersionRangeResolver versionRangeResolver, LoggerFactory loggerFactory )
- {
- setRemoteRepositoryManager( remoteRepositoryManager );
- setArtifactDescriptorReader( artifactDescriptorReader );
- setVersionRangeResolver( versionRangeResolver );
- setLoggerFactory( loggerFactory );
- }
-
- public void initService( ServiceLocator locator )
- {
- setLoggerFactory( locator.getService( LoggerFactory.class ) );
- setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) );
- setArtifactDescriptorReader( locator.getService( ArtifactDescriptorReader.class ) );
- setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) );
- }
-
- public DefaultDependencyCollector setLoggerFactory( LoggerFactory loggerFactory )
- {
- this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
- return this;
- }
-
- public DefaultDependencyCollector setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
- {
- this.remoteRepositoryManager = requireNonNull( remoteRepositoryManager, "remote repository provider cannot be null" );
- return this;
- }
-
- public DefaultDependencyCollector setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader )
- {
- descriptorReader = requireNonNull( artifactDescriptorReader, "artifact descriptor reader cannot be null" );
- return this;
- }
-
- public DefaultDependencyCollector setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
- {
- this.versionRangeResolver = requireNonNull( versionRangeResolver, "version range resolver cannot be null" );
- return this;
- }
-
- public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request )
- throws DependencyCollectionException
- {
- session = optimizeSession( session );
-
- RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
-
- CollectResult result = new CollectResult( request );
-
- DependencySelector depSelector = session.getDependencySelector();
- DependencyManager depManager = session.getDependencyManager();
- DependencyTraverser depTraverser = session.getDependencyTraverser();
- VersionFilter verFilter = session.getVersionFilter();
-
- Dependency root = request.getRoot();
- List<RemoteRepository> repositories = request.getRepositories();
- List<Dependency> dependencies = request.getDependencies();
- List<Dependency> managedDependencies = request.getManagedDependencies();
-
- Map<String, Object> stats = logger.isDebugEnabled() ? new LinkedHashMap<String, Object>() : null;
- long time1 = System.nanoTime();
-
- DefaultDependencyNode node;
- if ( root != null )
- {
- List<? extends Version> versions;
- VersionRangeResult rangeResult;
- try
- {
- VersionRangeRequest rangeRequest =
- new VersionRangeRequest( root.getArtifact(), request.getRepositories(),
- request.getRequestContext() );
- rangeRequest.setTrace( trace );
- rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
- versions = filterVersions( root, rangeResult, verFilter, new DefaultVersionFilterContext( session ) );
- }
- catch ( VersionRangeResolutionException e )
- {
- result.addException( e );
- throw new DependencyCollectionException( result, e.getMessage() );
- }
-
- Version version = versions.get( versions.size() - 1 );
- root = root.setArtifact( root.getArtifact().setVersion( version.toString() ) );
-
- ArtifactDescriptorResult descriptorResult;
- try
- {
- ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
- descriptorRequest.setArtifact( root.getArtifact() );
- descriptorRequest.setRepositories( request.getRepositories() );
- descriptorRequest.setRequestContext( request.getRequestContext() );
- descriptorRequest.setTrace( trace );
- if ( isLackingDescriptor( root.getArtifact() ) )
- {
- descriptorResult = new ArtifactDescriptorResult( descriptorRequest );
- }
- else
- {
- descriptorResult = descriptorReader.readArtifactDescriptor( session, descriptorRequest );
- }
- }
- catch ( ArtifactDescriptorException e )
- {
- result.addException( e );
- throw new DependencyCollectionException( result, e.getMessage() );
- }
-
- root = root.setArtifact( descriptorResult.getArtifact() );
-
- if ( !session.isIgnoreArtifactDescriptorRepositories() )
- {
- repositories = remoteRepositoryManager.aggregateRepositories( session, repositories,
- descriptorResult.getRepositories(),
- true );
- }
- dependencies = mergeDeps( dependencies, descriptorResult.getDependencies() );
- managedDependencies = mergeDeps( managedDependencies, descriptorResult.getManagedDependencies() );
-
- node = new DefaultDependencyNode( root );
- node.setRequestContext( request.getRequestContext() );
- node.setRelocations( descriptorResult.getRelocations() );
- node.setVersionConstraint( rangeResult.getVersionConstraint() );
- node.setVersion( version );
- node.setAliases( descriptorResult.getAliases() );
- node.setRepositories( request.getRepositories() );
- }
- else
- {
- node = new DefaultDependencyNode( request.getRootArtifact() );
- node.setRequestContext( request.getRequestContext() );
- node.setRepositories( request.getRepositories() );
- }
-
- result.setRoot( node );
-
- boolean traverse = root == null || depTraverser == null || depTraverser.traverseDependency( root );
- String errorPath = null;
- if ( traverse && !dependencies.isEmpty() )
- {
- DataPool pool = new DataPool( session );
-
- NodeStack nodes = new NodeStack();
- nodes.push( node );
-
- DefaultDependencyCollectionContext context =
- new DefaultDependencyCollectionContext( session, request.getRootArtifact(), root, managedDependencies );
-
- DefaultVersionFilterContext versionContext = new DefaultVersionFilterContext( session );
-
- Args args = new Args( session, trace, pool, nodes, context, versionContext, request );
- Results results = new Results( result, session );
-
- 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 = results.errorPath;
- }
-
- long time2 = System.nanoTime();
-
- DependencyGraphTransformer transformer = session.getDependencyGraphTransformer();
- if ( transformer != null )
- {
- 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 )
- {
- long time3 = System.nanoTime();
- stats.put( "DefaultDependencyCollector.collectTime", time2 - time1 );
- stats.put( "DefaultDependencyCollector.transformTime", time3 - time2 );
- logger.debug( "Dependency collection stats: " + stats );
- }
-
- if ( errorPath != null )
- {
- throw new DependencyCollectionException( result, "Failed to collect dependencies at " + errorPath );
- }
- if ( !result.getExceptions().isEmpty() )
- {
- throw new DependencyCollectionException( result );
- }
-
- return result;
- }
-
- private static RepositorySystemSession optimizeSession( RepositorySystemSession session )
- {
- DefaultRepositorySystemSession optimized = new DefaultRepositorySystemSession( session );
- optimized.setArtifactTypeRegistry( CachingArtifactTypeRegistry.newInstance( session ) );
- return optimized;
- }
-
- private List<Dependency> mergeDeps( List<Dependency> dominant, List<Dependency> recessive )
- {
- List<Dependency> result;
- if ( dominant == null || dominant.isEmpty() )
- {
- result = recessive;
- }
- else if ( recessive == null || recessive.isEmpty() )
- {
- result = dominant;
- }
- else
- {
- int initialCapacity = dominant.size() + recessive.size();
- result = new ArrayList<Dependency>( initialCapacity );
- Collection<String> ids = new HashSet<String>( initialCapacity, 1.0f );
- for ( Dependency dependency : dominant )
- {
- ids.add( getId( dependency.getArtifact() ) );
- result.add( dependency );
- }
- for ( Dependency dependency : recessive )
- {
- if ( !ids.contains( getId( dependency.getArtifact() ) ) )
- {
- result.add( dependency );
- }
- }
- }
- return result;
- }
-
- private static String getId( Artifact a )
- {
- return a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getClassifier() + ':' + a.getExtension();
- }
-
- private void process( final Args args, Results results, List<Dependency> dependencies,
- List<RemoteRepository> repositories, DependencySelector depSelector,
- DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter )
- {
- for ( Dependency dependency : dependencies )
- {
- processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter,
- dependency );
- }
- }
-
- private void processDependency( Args args, Results results, List<RemoteRepository> repositories,
- DependencySelector depSelector, DependencyManager depManager,
- DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency )
- {
-
- List<Artifact> relocations = Collections.emptyList();
- boolean disableVersionManagement = false;
- processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter, dependency,
- relocations, disableVersionManagement );
- }
-
- private void processDependency( Args args, Results results, List<RemoteRepository> repositories,
- DependencySelector depSelector, DependencyManager depManager,
- DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency,
- List<Artifact> relocations, boolean disableVersionManagement )
- {
-
- if ( depSelector != null && !depSelector.selectDependency( dependency ) )
- {
- return;
- }
-
- PremanagedDependency preManaged =
- PremanagedDependency.create( depManager, dependency, disableVersionManagement, args.premanagedState );
- dependency = preManaged.managedDependency;
-
- boolean noDescriptor = isLackingDescriptor( dependency.getArtifact() );
-
- boolean traverse = !noDescriptor && ( depTraverser == null || depTraverser.traverseDependency( dependency ) );
-
- List<? extends Version> versions;
- VersionRangeResult rangeResult;
- try
- {
- VersionRangeRequest rangeRequest = createVersionRangeRequest( args, repositories, dependency );
-
- rangeResult = cachedResolveRangeResult( rangeRequest, args.pool, args.session );
-
- versions = filterVersions( dependency, rangeResult, verFilter, args.versionContext );
- }
- catch ( VersionRangeResolutionException e )
- {
- results.addException( dependency, e, args.nodes );
- return;
- }
-
- for ( Version version : versions )
- {
- Artifact originalArtifact = dependency.getArtifact().setVersion( version.toString() );
- Dependency d = dependency.setArtifact( originalArtifact );
-
- ArtifactDescriptorRequest descriptorRequest = createArtifactDescriptorRequest( args, repositories, d );
-
- final ArtifactDescriptorResult descriptorResult =
- getArtifactDescriptorResult( args, results, noDescriptor, d, descriptorRequest );
- if ( descriptorResult != null )
- {
- d = d.setArtifact( descriptorResult.getArtifact() );
-
- DependencyNode node = args.nodes.top();
-
- 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 =
- createDependencyNode( relocations, preManaged, rangeResult, version, d, descriptorResult,
- cycleNode );
- node.getChildren().add( child );
- continue;
- }
- }
-
- 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<RemoteRepository> repos =
- getRemoteRepositories( rangeResult.getRepository( version ), repositories );
-
- 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 )
- {
- doRecurse( args, results, repositories, depSelector, depManager, depTraverser, verFilter, d,
- descriptorResult, child );
- }
- }
- }
- else
- {
- DependencyNode node = args.nodes.top();
- List<RemoteRepository> repos =
- getRemoteRepositories( rangeResult.getRepository( version ), repositories );
- DefaultDependencyNode child =
- createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
- args.request.getRequestContext() );
- node.getChildren().add( child );
- }
- }
- }
-
- private void doRecurse( Args args, Results results, List<RemoteRepository> repositories,
- DependencySelector depSelector, DependencyManager depManager,
- DependencyTraverser depTraverser, VersionFilter verFilter, Dependency d,
- ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child )
- {
- DefaultDependencyCollectionContext context = args.collectionContext;
- context.set( d, descriptorResult.getManagedDependencies() );
-
- 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;
-
- final List<RemoteRepository> childRepos =
- args.ignoreRepos
- ? repositories
- : remoteRepositoryManager.aggregateRepositories( args.session, repositories,
- descriptorResult.getRepositories(), true );
-
- Object key =
- args.pool.toKey( d.getArtifact(), childRepos, childSelector, childManager, childTraverser, childFilter );
-
- List<DependencyNode> children = args.pool.getChildren( key );
- if ( children == null )
- {
- args.pool.putChildren( key, child.getChildren() );
-
- args.nodes.push( child );
-
- process( args, results, descriptorResult.getDependencies(), childRepos, childSelector, childManager,
- childTraverser, childFilter );
-
- args.nodes.pop();
- }
- else
- {
- child.setChildren( children );
- }
- }
-
- private ArtifactDescriptorResult getArtifactDescriptorResult( Args args, Results results, boolean noDescriptor,
- Dependency d,
- ArtifactDescriptorRequest descriptorRequest )
- {
- return noDescriptor
- ? new ArtifactDescriptorResult( descriptorRequest )
- : resolveCachedArtifactDescriptor( args.pool, descriptorRequest, args.session, d, results, args );
-
- }
-
- private ArtifactDescriptorResult resolveCachedArtifactDescriptor( DataPool pool,
- ArtifactDescriptorRequest descriptorRequest,
- RepositorySystemSession session, Dependency d,
- Results results, Args args )
- {
- Object key = pool.toKey( descriptorRequest );
- ArtifactDescriptorResult descriptorResult = pool.getDescriptor( key, descriptorRequest );
- if ( descriptorResult == null )
- {
- try
- {
- 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<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 );
- return child;
- }
-
- private static DefaultDependencyNode createDependencyNode( List<Artifact> relocations,
- PremanagedDependency preManaged,
- VersionRangeResult rangeResult, Version version,
- Dependency d, ArtifactDescriptorResult descriptorResult,
- DependencyNode cycleNode )
- {
- DefaultDependencyNode child =
- createDependencyNode( relocations, preManaged, rangeResult, version, d, descriptorResult.getAliases(),
- cycleNode.getRepositories(), cycleNode.getRequestContext() );
- child.setChildren( cycleNode.getChildren() );
- return child;
- }
-
- private 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;
- }
-
- private 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;
- }
-
- private VersionRangeResult cachedResolveRangeResult( VersionRangeRequest rangeRequest, DataPool pool,
- RepositorySystemSession session )
- throws VersionRangeResolutionException
- {
- Object key = pool.toKey( rangeRequest );
- VersionRangeResult rangeResult = pool.getConstraint( key, rangeRequest );
- if ( rangeResult == null )
- {
- rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
- pool.putConstraint( key, rangeResult );
- }
- return rangeResult;
- }
-
- private static boolean isLackingDescriptor( Artifact artifact )
- {
- return artifact.getProperty( ArtifactProperties.LOCAL_PATH, null ) != null;
- }
-
- private 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;
- }
-
- private 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 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;
-
- Args( RepositorySystemSession session, RequestTrace trace, DataPool pool, NodeStack nodes,
- DefaultDependencyCollectionContext collectionContext, DefaultVersionFilterContext versionContext,
- CollectRequest request )
- {
- 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;
- }
-
- }
-
- static class Results
- {
-
- private final CollectResult result;
-
- final int maxExceptions;
-
- final int maxCycles;
-
- String errorPath;
-
- Results( CollectResult result, RepositorySystemSession session )
- {
- this.result = result;
- this.maxExceptions = ConfigUtils.getInteger( session, 50, CONFIG_PROP_MAX_EXCEPTIONS );
- this.maxCycles = ConfigUtils.getInteger( session, 10, 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 ) );
- }
- }
-
- }
-
- static class PremanagedDependency
- {
-
- final String premanagedVersion;
-
- final String premanagedScope;
-
- final Boolean premanagedOptional;
-
- /**
- * @since 1.1.0
- */
- final Collection<Exclusion> premanagedExclusions;
-
- /**
- * @since 1.1.0
- */
- final Map<String, String> premanagedProperties;
-
- final int managedBits;
-
- final Dependency managedDependency;
-
- final boolean premanagedState;
-
- 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<Exclusion>( premanagedExclusions ) )
- : null;
-
- this.premanagedProperties =
- premanagedProperties != null
- ? Collections.unmodifiableMap( new HashMap<String, String>( 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 );
- }
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCycle.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCycle.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCycle.java
deleted file mode 100644
index d14428a..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCycle.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.aether.graph.Dependency;
-import org.eclipse.aether.graph.DependencyCycle;
-import org.eclipse.aether.graph.DependencyNode;
-import org.eclipse.aether.util.artifact.ArtifactIdUtils;
-
-/**
- * @see DefaultDependencyCollector
- */
-final class DefaultDependencyCycle
- implements DependencyCycle
-{
-
- private final List<Dependency> dependencies;
-
- private final int cycleEntry;
-
- DefaultDependencyCycle( NodeStack nodes, int cycleEntry, Dependency dependency )
- {
- // skip root node unless it actually has a dependency or is considered the cycle entry (due to its label)
- int offset = ( cycleEntry > 0 && nodes.get( 0 ).getDependency() == null ) ? 1 : 0;
- Dependency[] dependencies = new Dependency[nodes.size() - offset + 1];
- for ( int i = 0, n = dependencies.length - 1; i < n; i++ )
- {
- DependencyNode node = nodes.get( i + offset );
- dependencies[i] = node.getDependency();
- // when cycle starts at root artifact as opposed to root dependency, synthesize a dependency
- if ( dependencies[i] == null )
- {
- dependencies[i] = new Dependency( node.getArtifact(), null );
- }
- }
- dependencies[dependencies.length - 1] = dependency;
- this.dependencies = Collections.unmodifiableList( Arrays.asList( dependencies ) );
- this.cycleEntry = cycleEntry;
- }
-
- public List<Dependency> getPrecedingDependencies()
- {
- return dependencies.subList( 0, cycleEntry );
- }
-
- public List<Dependency> getCyclicDependencies()
- {
- return dependencies.subList( cycleEntry, dependencies.size() );
- }
-
- @Override
- public String toString()
- {
- StringBuilder buffer = new StringBuilder( 256 );
- for ( int i = 0, n = dependencies.size(); i < n; i++ )
- {
- if ( i > 0 )
- {
- buffer.append( " -> " );
- }
- buffer.append( ArtifactIdUtils.toVersionlessId( dependencies.get( i ).getArtifact() ) );
- }
- return buffer.toString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyGraphTransformationContext.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyGraphTransformationContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyGraphTransformationContext.java
deleted file mode 100644
index bfa9d55..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyGraphTransformationContext.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.HashMap;
-import java.util.Map;
-import static java.util.Objects.requireNonNull;
-
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.collection.DependencyGraphTransformationContext;
-
-/**
- */
-class DefaultDependencyGraphTransformationContext
- implements DependencyGraphTransformationContext
-{
-
- private final RepositorySystemSession session;
-
- private final Map<Object, Object> map;
-
- DefaultDependencyGraphTransformationContext( RepositorySystemSession session )
- {
- this.session = session;
- this.map = new HashMap<Object, Object>();
- }
-
- public RepositorySystemSession getSession()
- {
- return session;
- }
-
- public Object get( Object key )
- {
- return map.get( requireNonNull( key, "key cannot be null" ) );
- }
-
- public Object put( Object key, Object value )
- {
- requireNonNull( key, "key cannot be null" );
- if ( value != null )
- {
- return map.put( key, value );
- }
- else
- {
- return map.remove( key );
- }
- }
-
- @Override
- public String toString()
- {
- return String.valueOf( map );
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultVersionFilterContext.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultVersionFilterContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultVersionFilterContext.java
deleted file mode 100644
index 4c26d74..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultVersionFilterContext.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.Collections;
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.collection.VersionFilter;
-import org.eclipse.aether.graph.Dependency;
-import org.eclipse.aether.repository.ArtifactRepository;
-import org.eclipse.aether.repository.RemoteRepository;
-import org.eclipse.aether.resolution.VersionRangeResult;
-import org.eclipse.aether.version.Version;
-import org.eclipse.aether.version.VersionConstraint;
-
-/**
- * @see DefaultDependencyCollector
- */
-final class DefaultVersionFilterContext
- implements VersionFilter.VersionFilterContext
-{
-
- private final Iterator<Version> EMPTY = Collections.<Version>emptySet().iterator();
-
- private final RepositorySystemSession session;
-
- private Dependency dependency;
-
- VersionRangeResult result;
-
- int count;
-
- byte[] deleted = new byte[64];
-
- DefaultVersionFilterContext( RepositorySystemSession session )
- {
- this.session = session;
- }
-
- public void set( Dependency dependency, VersionRangeResult result )
- {
- this.dependency = dependency;
- this.result = result;
- count = result.getVersions().size();
- if ( deleted.length < count )
- {
- deleted = new byte[count];
- }
- else
- {
- for ( int i = count - 1; i >= 0; i-- )
- {
- deleted[i] = (byte) 0;
- }
- }
- }
-
- public List<Version> get()
- {
- if ( count == result.getVersions().size() )
- {
- return result.getVersions();
- }
- if ( count <= 1 )
- {
- if ( count <= 0 )
- {
- return Collections.emptyList();
- }
- return Collections.singletonList( iterator().next() );
- }
- List<Version> versions = new ArrayList<Version>( count );
- for ( Version version : this )
- {
- versions.add( version );
- }
- return versions;
- }
-
- public RepositorySystemSession getSession()
- {
- return session;
- }
-
- public Dependency getDependency()
- {
- return dependency;
- }
-
- public VersionConstraint getVersionConstraint()
- {
- return result.getVersionConstraint();
- }
-
- public int getCount()
- {
- return count;
- }
-
- public ArtifactRepository getRepository( Version version )
- {
- return result.getRepository( version );
- }
-
- public List<RemoteRepository> getRepositories()
- {
- return Collections.unmodifiableList( result.getRequest().getRepositories() );
- }
-
- public Iterator<Version> iterator()
- {
- return ( count > 0 ) ? new VersionIterator() : EMPTY;
- }
-
- @Override
- public String toString()
- {
- return dependency + " " + result.getVersions();
- }
-
- private class VersionIterator
- implements Iterator<Version>
- {
-
- private final List<Version> versions;
-
- private final int size;
-
- private int count;
-
- private int index;
-
- private int next;
-
- VersionIterator()
- {
- count = DefaultVersionFilterContext.this.count;
- index = -1;
- next = 0;
- versions = result.getVersions();
- size = versions.size();
- advance();
- }
-
- private void advance()
- {
- for ( next = index + 1; next < size && deleted[next] != (byte) 0; next++ )
- {
- // just advancing index
- }
- }
-
- public boolean hasNext()
- {
- return next < size;
- }
-
- public Version next()
- {
- if ( count != DefaultVersionFilterContext.this.count )
- {
- throw new ConcurrentModificationException();
- }
- if ( next >= size )
- {
- throw new NoSuchElementException();
- }
- index = next;
- advance();
- return versions.get( index );
- }
-
- public void remove()
- {
- if ( count != DefaultVersionFilterContext.this.count )
- {
- throw new ConcurrentModificationException();
- }
- if ( index < 0 || deleted[index] == (byte) 1 )
- {
- throw new IllegalStateException();
- }
- deleted[index] = (byte) 1;
- count = --DefaultVersionFilterContext.this.count;
- }
-
- @Override
- public String toString()
- {
- return ( index < 0 ) ? "null" : String.valueOf( versions.get( index ) );
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/NodeStack.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/NodeStack.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/NodeStack.java
deleted file mode 100644
index b0e0cd3..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/NodeStack.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.Arrays;
-
-import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.graph.DependencyNode;
-
-/**
- * @see DefaultDependencyCollector
- */
-final class NodeStack
-{
-
- private DependencyNode[] nodes = new DependencyNode[96];
-
- private int size;
-
- public DependencyNode top()
- {
- if ( size <= 0 )
- {
- throw new IllegalStateException( "stack empty" );
- }
- return nodes[size - 1];
- }
-
- public void push( DependencyNode node )
- {
- if ( size >= nodes.length )
- {
- DependencyNode[] tmp = new DependencyNode[size + 64];
- System.arraycopy( nodes, 0, tmp, 0, nodes.length );
- nodes = tmp;
- }
- nodes[size++] = node;
- }
-
- public void pop()
- {
- if ( size <= 0 )
- {
- throw new IllegalStateException( "stack empty" );
- }
- size--;
- }
-
- public int find( Artifact artifact )
- {
- for ( int i = size - 1; i >= 0; i-- )
- {
- DependencyNode node = nodes[i];
-
- Artifact a = node.getArtifact();
- if ( a == null )
- {
- break;
- }
-
- if ( !a.getArtifactId().equals( artifact.getArtifactId() ) )
- {
- continue;
- }
- if ( !a.getGroupId().equals( artifact.getGroupId() ) )
- {
- continue;
- }
- if ( !a.getExtension().equals( artifact.getExtension() ) )
- {
- continue;
- }
- if ( !a.getClassifier().equals( artifact.getClassifier() ) )
- {
- continue;
- }
- /*
- * NOTE: While a:1 and a:2 are technically different artifacts, we want to consider the path a:2 -> b:2 ->
- * a:1 a cycle in the current context. The artifacts themselves might not form a cycle but their producing
- * projects surely do. Furthermore, conflict resolution will always have to consider a:1 a loser (otherwise
- * its ancestor a:2 would get pruned and so would a:1) so there is no point in building the sub graph of
- * a:1.
- */
-
- return i;
- }
-
- return -1;
- }
-
- public int size()
- {
- return size;
- }
-
- public DependencyNode get( int index )
- {
- return nodes[index];
- }
-
- @Override
- public String toString()
- {
- return Arrays.toString( nodes );
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/ObjectPool.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/ObjectPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/ObjectPool.java
deleted file mode 100644
index 2307f7f..0000000
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/ObjectPool.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-/**
- * Pool of immutable object instances, used to avoid excessive memory consumption of (dirty) dependency graph which
- * tends to have many duplicate artifacts/dependencies.
- */
-class ObjectPool<T>
-{
-
- private final Map<Object, Reference<T>> objects = new WeakHashMap<Object, Reference<T>>( 256 );
-
- public synchronized T intern( T object )
- {
- Reference<T> pooledRef = objects.get( object );
- if ( pooledRef != null )
- {
- T pooled = pooledRef.get();
- if ( pooled != null )
- {
- return pooled;
- }
- }
-
- objects.put( object, new WeakReference<T>( object ) );
- return object;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java
new file mode 100644
index 0000000..cbd023e
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry.java
@@ -0,0 +1,69 @@
+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.HashMap;
+import java.util.Map;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.ArtifactType;
+import org.eclipse.aether.artifact.ArtifactTypeRegistry;
+
+/**
+ * A short-lived artifact type registry that caches results from a presumedly slower type registry.
+ */
+class CachingArtifactTypeRegistry
+ implements ArtifactTypeRegistry
+{
+
+ private final ArtifactTypeRegistry delegate;
+
+ private final Map<String, ArtifactType> types;
+
+ public static ArtifactTypeRegistry newInstance( RepositorySystemSession session )
+ {
+ return newInstance( session.getArtifactTypeRegistry() );
+ }
+
+ public static ArtifactTypeRegistry newInstance( ArtifactTypeRegistry delegate )
+ {
+ return ( delegate != null ) ? new CachingArtifactTypeRegistry( delegate ) : null;
+ }
+
+ private CachingArtifactTypeRegistry( ArtifactTypeRegistry delegate )
+ {
+ this.delegate = delegate;
+ types = new HashMap<String, ArtifactType>();
+ }
+
+ public ArtifactType get( String typeId )
+ {
+ ArtifactType type = types.get( typeId );
+
+ if ( type == null )
+ {
+ type = delegate.get( typeId );
+ types.put( typeId, type );
+ }
+
+ return type;
+ }
+
+}
[2/3] maven-resolver git commit: [MRESOLVER-35] Move dependency
collector and friends to subpackage in maven-resolver-impl
Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
new file mode 100644
index 0000000..a8a8e9e
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java
@@ -0,0 +1,439 @@
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.aether.RepositoryCache;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+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;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactDescriptorException;
+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.version.Version;
+import org.eclipse.aether.version.VersionConstraint;
+
+/**
+ */
+final class DataPool
+{
+
+ private static final String ARTIFACT_POOL = DataPool.class.getName() + "$Artifact";
+
+ private static final String DEPENDENCY_POOL = DataPool.class.getName() + "$Dependency";
+
+ private static final String DESCRIPTORS = DataPool.class.getName() + "$Descriptors";
+
+ public static final ArtifactDescriptorResult NO_DESCRIPTOR =
+ new ArtifactDescriptorResult( new ArtifactDescriptorRequest() );
+
+ private ObjectPool<Artifact> artifacts;
+
+ private ObjectPool<Dependency> dependencies;
+
+ private Map<Object, Descriptor> descriptors;
+
+ private Map<Object, Constraint> constraints = new HashMap<Object, Constraint>();
+
+ private Map<Object, List<DependencyNode>> nodes = new HashMap<Object, List<DependencyNode>>( 256 );
+
+ @SuppressWarnings( "unchecked" )
+ DataPool( RepositorySystemSession session )
+ {
+ RepositoryCache cache = session.getCache();
+
+ if ( cache != null )
+ {
+ artifacts = (ObjectPool<Artifact>) cache.get( session, ARTIFACT_POOL );
+ dependencies = (ObjectPool<Dependency>) cache.get( session, DEPENDENCY_POOL );
+ descriptors = (Map<Object, Descriptor>) cache.get( session, DESCRIPTORS );
+ }
+
+ if ( artifacts == null )
+ {
+ artifacts = new ObjectPool<Artifact>();
+ if ( cache != null )
+ {
+ cache.put( session, ARTIFACT_POOL, artifacts );
+ }
+ }
+
+ if ( dependencies == null )
+ {
+ dependencies = new ObjectPool<Dependency>();
+ if ( cache != null )
+ {
+ cache.put( session, DEPENDENCY_POOL, dependencies );
+ }
+ }
+
+ if ( descriptors == null )
+ {
+ descriptors = Collections.synchronizedMap( new WeakHashMap<Object, Descriptor>( 256 ) );
+ if ( cache != null )
+ {
+ cache.put( session, DESCRIPTORS, descriptors );
+ }
+ }
+ }
+
+ public Artifact intern( Artifact artifact )
+ {
+ return artifacts.intern( artifact );
+ }
+
+ public Dependency intern( Dependency dependency )
+ {
+ return dependencies.intern( dependency );
+ }
+
+ public Object toKey( ArtifactDescriptorRequest request )
+ {
+ return request.getArtifact();
+ }
+
+ public ArtifactDescriptorResult getDescriptor( Object key, ArtifactDescriptorRequest request )
+ {
+ Descriptor descriptor = descriptors.get( key );
+ if ( descriptor != null )
+ {
+ return descriptor.toResult( request );
+ }
+ return null;
+ }
+
+ public void putDescriptor( Object key, ArtifactDescriptorResult result )
+ {
+ descriptors.put( key, new GoodDescriptor( result ) );
+ }
+
+ public void putDescriptor( Object key, ArtifactDescriptorException e )
+ {
+ descriptors.put( key, BadDescriptor.INSTANCE );
+ }
+
+ public Object toKey( VersionRangeRequest request )
+ {
+ return new ConstraintKey( request );
+ }
+
+ public VersionRangeResult getConstraint( Object key, VersionRangeRequest request )
+ {
+ Constraint constraint = constraints.get( key );
+ if ( constraint != null )
+ {
+ return constraint.toResult( request );
+ }
+ return null;
+ }
+
+ public void putConstraint( Object key, VersionRangeResult result )
+ {
+ constraints.put( key, new Constraint( result ) );
+ }
+
+ public Object toKey( Artifact artifact, List<RemoteRepository> repositories, DependencySelector selector,
+ DependencyManager manager, DependencyTraverser traverser, VersionFilter filter )
+ {
+ return new GraphKey( artifact, repositories, selector, manager, traverser, filter );
+ }
+
+ public List<DependencyNode> getChildren( Object key )
+ {
+ return nodes.get( key );
+ }
+
+ public void putChildren( Object key, List<DependencyNode> children )
+ {
+ nodes.put( key, children );
+ }
+
+ abstract static class Descriptor
+ {
+
+ public abstract ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request );
+
+ }
+
+ static final class GoodDescriptor
+ extends Descriptor
+ {
+
+ final Artifact artifact;
+
+ final List<Artifact> relocations;
+
+ final Collection<Artifact> aliases;
+
+ final List<RemoteRepository> repositories;
+
+ final List<Dependency> dependencies;
+
+ final List<Dependency> managedDependencies;
+
+ GoodDescriptor( ArtifactDescriptorResult result )
+ {
+ artifact = result.getArtifact();
+ relocations = result.getRelocations();
+ aliases = result.getAliases();
+ dependencies = result.getDependencies();
+ managedDependencies = result.getManagedDependencies();
+ repositories = result.getRepositories();
+ }
+
+ public ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request )
+ {
+ 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 ArtifactDescriptorResult toResult( ArtifactDescriptorRequest request )
+ {
+ return NO_DESCRIPTOR;
+ }
+
+ }
+
+ static final class Constraint
+ {
+
+ final VersionRepo[] repositories;
+
+ final VersionConstraint versionConstraint;
+
+ Constraint( VersionRangeResult result )
+ {
+ versionConstraint = result.getVersionConstraint();
+ List<Version> versions = result.getVersions();
+ repositories = new VersionRepo[versions.size()];
+ int i = 0;
+ for ( Version version : versions )
+ {
+ repositories[i++] = new VersionRepo( version, result.getRepository( version ) );
+ }
+ }
+
+ public VersionRangeResult toResult( VersionRangeRequest request )
+ {
+ VersionRangeResult result = new VersionRangeResult( request );
+ for ( VersionRepo vr : repositories )
+ {
+ result.addVersion( vr.version );
+ result.setRepository( vr.version, vr.repo );
+ }
+ result.setVersionConstraint( versionConstraint );
+ return result;
+ }
+
+ static final class VersionRepo
+ {
+
+ final Version version;
+
+ final ArtifactRepository repo;
+
+ VersionRepo( Version version, ArtifactRepository repo )
+ {
+ this.version = version;
+ this.repo = repo;
+ }
+
+ }
+
+ }
+
+ static final class ConstraintKey
+ {
+
+ private final Artifact artifact;
+
+ private final List<RemoteRepository> repositories;
+
+ private final int hashCode;
+
+ ConstraintKey( VersionRangeRequest request )
+ {
+ artifact = request.getArtifact();
+ repositories = request.getRepositories();
+ hashCode = artifact.hashCode();
+ }
+
+ @Override
+ public boolean equals( Object obj )
+ {
+ if ( obj == this )
+ {
+ return true;
+ }
+ else if ( !( obj instanceof ConstraintKey ) )
+ {
+ return false;
+ }
+ ConstraintKey that = (ConstraintKey) obj;
+ return artifact.equals( that.artifact ) && equals( repositories, that.repositories );
+ }
+
+ private static boolean equals( List<RemoteRepository> repos1, List<RemoteRepository> repos2 )
+ {
+ if ( repos1.size() != repos2.size() )
+ {
+ return false;
+ }
+ for ( int i = 0, n = repos1.size(); i < n; i++ )
+ {
+ RemoteRepository repo1 = repos1.get( i );
+ RemoteRepository repo2 = repos2.get( i );
+ if ( repo1.isRepositoryManager() != repo2.isRepositoryManager() )
+ {
+ return false;
+ }
+ if ( repo1.isRepositoryManager() )
+ {
+ if ( !equals( repo1.getMirroredRepositories(), repo2.getMirroredRepositories() ) )
+ {
+ return false;
+ }
+ }
+ else if ( !repo1.getUrl().equals( repo2.getUrl() ) )
+ {
+ return false;
+ }
+ else if ( repo1.getPolicy( true ).isEnabled() != repo2.getPolicy( true ).isEnabled() )
+ {
+ return false;
+ }
+ else if ( repo1.getPolicy( false ).isEnabled() != repo2.getPolicy( false ).isEnabled() )
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return hashCode;
+ }
+
+ }
+
+ static final class GraphKey
+ {
+
+ private final Artifact artifact;
+
+ private final List<RemoteRepository> repositories;
+
+ private final DependencySelector selector;
+
+ private final DependencyManager manager;
+
+ private final DependencyTraverser traverser;
+
+ private final VersionFilter filter;
+
+ private final int hashCode;
+
+ GraphKey( Artifact artifact, List<RemoteRepository> repositories, DependencySelector selector,
+ 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 + hash( selector );
+ hash = hash * 31 + hash( manager );
+ hash = hash * 31 + hash( traverser );
+ hash = hash * 31 + hash( filter );
+ hashCode = hash;
+ }
+
+ @Override
+ public boolean equals( Object obj )
+ {
+ if ( obj == this )
+ {
+ return true;
+ }
+ else if ( !( obj instanceof GraphKey ) )
+ {
+ return false;
+ }
+ GraphKey that = (GraphKey) obj;
+ return artifact.equals( that.artifact ) && repositories.equals( that.repositories )
+ && eq( selector, that.selector ) && eq( manager, that.manager ) && eq( traverser, that.traverser )
+ && eq( filter, that.filter );
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return hashCode;
+ }
+
+ private static <T> 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;
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java
new file mode 100644
index 0000000..3bf4fe1
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext.java
@@ -0,0 +1,86 @@
+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.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
+ */
+final class DefaultDependencyCollectionContext
+ implements DependencyCollectionContext
+{
+
+ private final RepositorySystemSession session;
+
+ private Artifact artifact;
+
+ private Dependency dependency;
+
+ private List<Dependency> managedDependencies;
+
+ DefaultDependencyCollectionContext( RepositorySystemSession session, Artifact artifact,
+ Dependency dependency, List<Dependency> managedDependencies )
+ {
+ this.session = session;
+ this.artifact = ( dependency != null ) ? dependency.getArtifact() : artifact;
+ this.dependency = dependency;
+ this.managedDependencies = managedDependencies;
+ }
+
+ public RepositorySystemSession getSession()
+ {
+ return session;
+ }
+
+ public Artifact getArtifact()
+ {
+ return artifact;
+ }
+
+ public Dependency getDependency()
+ {
+ return dependency;
+ }
+
+ public List<Dependency> getManagedDependencies()
+ {
+ return managedDependencies;
+ }
+
+ public void set( Dependency dependency, List<Dependency> managedDependencies )
+ {
+ artifact = dependency.getArtifact();
+ this.dependency = dependency;
+ this.managedDependencies = managedDependencies;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf( getDependency() );
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
new file mode 100644
index 0000000..f96d923
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
@@ -0,0 +1,896 @@
+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.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import static java.util.Objects.requireNonNull;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.ArtifactProperties;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.collection.DependencyGraphTransformer;
+import org.eclipse.aether.collection.DependencyManagement;
+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;
+import org.eclipse.aether.graph.Exclusion;
+import org.eclipse.aether.impl.ArtifactDescriptorReader;
+import org.eclipse.aether.impl.DependencyCollector;
+import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.repository.ArtifactRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactDescriptorException;
+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.spi.locator.Service;
+import org.eclipse.aether.spi.locator.ServiceLocator;
+import org.eclipse.aether.spi.log.Logger;
+import org.eclipse.aether.spi.log.LoggerFactory;
+import org.eclipse.aether.spi.log.NullLoggerFactory;
+import org.eclipse.aether.util.ConfigUtils;
+import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
+import org.eclipse.aether.util.graph.transformer.TransformationContextKeys;
+import org.eclipse.aether.version.Version;
+
+/**
+ */
+@Named
+public class DefaultDependencyCollector
+ implements DependencyCollector, Service
+{
+
+ 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;
+
+ private RemoteRepositoryManager remoteRepositoryManager;
+
+ private ArtifactDescriptorReader descriptorReader;
+
+ private VersionRangeResolver versionRangeResolver;
+
+ public DefaultDependencyCollector()
+ {
+ // enables default constructor
+ }
+
+ @Inject
+ DefaultDependencyCollector( RemoteRepositoryManager remoteRepositoryManager,
+ ArtifactDescriptorReader artifactDescriptorReader,
+ VersionRangeResolver versionRangeResolver, LoggerFactory loggerFactory )
+ {
+ setRemoteRepositoryManager( remoteRepositoryManager );
+ setArtifactDescriptorReader( artifactDescriptorReader );
+ setVersionRangeResolver( versionRangeResolver );
+ setLoggerFactory( loggerFactory );
+ }
+
+ public void initService( ServiceLocator locator )
+ {
+ setLoggerFactory( locator.getService( LoggerFactory.class ) );
+ setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) );
+ setArtifactDescriptorReader( locator.getService( ArtifactDescriptorReader.class ) );
+ setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) );
+ }
+
+ public DefaultDependencyCollector setLoggerFactory( LoggerFactory loggerFactory )
+ {
+ this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
+ return this;
+ }
+
+ public DefaultDependencyCollector setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
+ {
+ this.remoteRepositoryManager = requireNonNull( remoteRepositoryManager, "remote repository provider cannot be null" );
+ return this;
+ }
+
+ public DefaultDependencyCollector setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader )
+ {
+ descriptorReader = requireNonNull( artifactDescriptorReader, "artifact descriptor reader cannot be null" );
+ return this;
+ }
+
+ public DefaultDependencyCollector setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
+ {
+ this.versionRangeResolver = requireNonNull( versionRangeResolver, "version range resolver cannot be null" );
+ return this;
+ }
+
+ public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request )
+ throws DependencyCollectionException
+ {
+ session = optimizeSession( session );
+
+ RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
+
+ CollectResult result = new CollectResult( request );
+
+ DependencySelector depSelector = session.getDependencySelector();
+ DependencyManager depManager = session.getDependencyManager();
+ DependencyTraverser depTraverser = session.getDependencyTraverser();
+ VersionFilter verFilter = session.getVersionFilter();
+
+ Dependency root = request.getRoot();
+ List<RemoteRepository> repositories = request.getRepositories();
+ List<Dependency> dependencies = request.getDependencies();
+ List<Dependency> managedDependencies = request.getManagedDependencies();
+
+ Map<String, Object> stats = logger.isDebugEnabled() ? new LinkedHashMap<String, Object>() : null;
+ long time1 = System.nanoTime();
+
+ DefaultDependencyNode node;
+ if ( root != null )
+ {
+ List<? extends Version> versions;
+ VersionRangeResult rangeResult;
+ try
+ {
+ VersionRangeRequest rangeRequest =
+ new VersionRangeRequest( root.getArtifact(), request.getRepositories(),
+ request.getRequestContext() );
+ rangeRequest.setTrace( trace );
+ rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
+ versions = filterVersions( root, rangeResult, verFilter, new DefaultVersionFilterContext( session ) );
+ }
+ catch ( VersionRangeResolutionException e )
+ {
+ result.addException( e );
+ throw new DependencyCollectionException( result, e.getMessage() );
+ }
+
+ Version version = versions.get( versions.size() - 1 );
+ root = root.setArtifact( root.getArtifact().setVersion( version.toString() ) );
+
+ ArtifactDescriptorResult descriptorResult;
+ try
+ {
+ ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest();
+ descriptorRequest.setArtifact( root.getArtifact() );
+ descriptorRequest.setRepositories( request.getRepositories() );
+ descriptorRequest.setRequestContext( request.getRequestContext() );
+ descriptorRequest.setTrace( trace );
+ if ( isLackingDescriptor( root.getArtifact() ) )
+ {
+ descriptorResult = new ArtifactDescriptorResult( descriptorRequest );
+ }
+ else
+ {
+ descriptorResult = descriptorReader.readArtifactDescriptor( session, descriptorRequest );
+ }
+ }
+ catch ( ArtifactDescriptorException e )
+ {
+ result.addException( e );
+ throw new DependencyCollectionException( result, e.getMessage() );
+ }
+
+ root = root.setArtifact( descriptorResult.getArtifact() );
+
+ if ( !session.isIgnoreArtifactDescriptorRepositories() )
+ {
+ repositories = remoteRepositoryManager.aggregateRepositories( session, repositories,
+ descriptorResult.getRepositories(),
+ true );
+ }
+ dependencies = mergeDeps( dependencies, descriptorResult.getDependencies() );
+ managedDependencies = mergeDeps( managedDependencies, descriptorResult.getManagedDependencies() );
+
+ node = new DefaultDependencyNode( root );
+ node.setRequestContext( request.getRequestContext() );
+ node.setRelocations( descriptorResult.getRelocations() );
+ node.setVersionConstraint( rangeResult.getVersionConstraint() );
+ node.setVersion( version );
+ node.setAliases( descriptorResult.getAliases() );
+ node.setRepositories( request.getRepositories() );
+ }
+ else
+ {
+ node = new DefaultDependencyNode( request.getRootArtifact() );
+ node.setRequestContext( request.getRequestContext() );
+ node.setRepositories( request.getRepositories() );
+ }
+
+ result.setRoot( node );
+
+ boolean traverse = root == null || depTraverser == null || depTraverser.traverseDependency( root );
+ String errorPath = null;
+ if ( traverse && !dependencies.isEmpty() )
+ {
+ DataPool pool = new DataPool( session );
+
+ NodeStack nodes = new NodeStack();
+ nodes.push( node );
+
+ DefaultDependencyCollectionContext context =
+ new DefaultDependencyCollectionContext( session, request.getRootArtifact(), root, managedDependencies );
+
+ DefaultVersionFilterContext versionContext = new DefaultVersionFilterContext( session );
+
+ Args args = new Args( session, trace, pool, nodes, context, versionContext, request );
+ Results results = new Results( result, session );
+
+ 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 = results.errorPath;
+ }
+
+ long time2 = System.nanoTime();
+
+ DependencyGraphTransformer transformer = session.getDependencyGraphTransformer();
+ if ( transformer != null )
+ {
+ 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 )
+ {
+ long time3 = System.nanoTime();
+ stats.put( "DefaultDependencyCollector.collectTime", time2 - time1 );
+ stats.put( "DefaultDependencyCollector.transformTime", time3 - time2 );
+ logger.debug( "Dependency collection stats: " + stats );
+ }
+
+ if ( errorPath != null )
+ {
+ throw new DependencyCollectionException( result, "Failed to collect dependencies at " + errorPath );
+ }
+ if ( !result.getExceptions().isEmpty() )
+ {
+ throw new DependencyCollectionException( result );
+ }
+
+ return result;
+ }
+
+ private static RepositorySystemSession optimizeSession( RepositorySystemSession session )
+ {
+ DefaultRepositorySystemSession optimized = new DefaultRepositorySystemSession( session );
+ optimized.setArtifactTypeRegistry( CachingArtifactTypeRegistry.newInstance( session ) );
+ return optimized;
+ }
+
+ private List<Dependency> mergeDeps( List<Dependency> dominant, List<Dependency> recessive )
+ {
+ List<Dependency> result;
+ if ( dominant == null || dominant.isEmpty() )
+ {
+ result = recessive;
+ }
+ else if ( recessive == null || recessive.isEmpty() )
+ {
+ result = dominant;
+ }
+ else
+ {
+ int initialCapacity = dominant.size() + recessive.size();
+ result = new ArrayList<Dependency>( initialCapacity );
+ Collection<String> ids = new HashSet<String>( initialCapacity, 1.0f );
+ for ( Dependency dependency : dominant )
+ {
+ ids.add( getId( dependency.getArtifact() ) );
+ result.add( dependency );
+ }
+ for ( Dependency dependency : recessive )
+ {
+ if ( !ids.contains( getId( dependency.getArtifact() ) ) )
+ {
+ result.add( dependency );
+ }
+ }
+ }
+ return result;
+ }
+
+ private static String getId( Artifact a )
+ {
+ return a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getClassifier() + ':' + a.getExtension();
+ }
+
+ private void process( final Args args, Results results, List<Dependency> dependencies,
+ List<RemoteRepository> repositories, DependencySelector depSelector,
+ DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter )
+ {
+ for ( Dependency dependency : dependencies )
+ {
+ processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter,
+ dependency );
+ }
+ }
+
+ private void processDependency( Args args, Results results, List<RemoteRepository> repositories,
+ DependencySelector depSelector, DependencyManager depManager,
+ DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency )
+ {
+
+ List<Artifact> relocations = Collections.emptyList();
+ boolean disableVersionManagement = false;
+ processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter, dependency,
+ relocations, disableVersionManagement );
+ }
+
+ private void processDependency( Args args, Results results, List<RemoteRepository> repositories,
+ DependencySelector depSelector, DependencyManager depManager,
+ DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency,
+ List<Artifact> relocations, boolean disableVersionManagement )
+ {
+
+ if ( depSelector != null && !depSelector.selectDependency( dependency ) )
+ {
+ return;
+ }
+
+ PremanagedDependency preManaged =
+ PremanagedDependency.create( depManager, dependency, disableVersionManagement, args.premanagedState );
+ dependency = preManaged.managedDependency;
+
+ boolean noDescriptor = isLackingDescriptor( dependency.getArtifact() );
+
+ boolean traverse = !noDescriptor && ( depTraverser == null || depTraverser.traverseDependency( dependency ) );
+
+ List<? extends Version> versions;
+ VersionRangeResult rangeResult;
+ try
+ {
+ VersionRangeRequest rangeRequest = createVersionRangeRequest( args, repositories, dependency );
+
+ rangeResult = cachedResolveRangeResult( rangeRequest, args.pool, args.session );
+
+ versions = filterVersions( dependency, rangeResult, verFilter, args.versionContext );
+ }
+ catch ( VersionRangeResolutionException e )
+ {
+ results.addException( dependency, e, args.nodes );
+ return;
+ }
+
+ for ( Version version : versions )
+ {
+ Artifact originalArtifact = dependency.getArtifact().setVersion( version.toString() );
+ Dependency d = dependency.setArtifact( originalArtifact );
+
+ ArtifactDescriptorRequest descriptorRequest = createArtifactDescriptorRequest( args, repositories, d );
+
+ final ArtifactDescriptorResult descriptorResult =
+ getArtifactDescriptorResult( args, results, noDescriptor, d, descriptorRequest );
+ if ( descriptorResult != null )
+ {
+ d = d.setArtifact( descriptorResult.getArtifact() );
+
+ DependencyNode node = args.nodes.top();
+
+ 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 =
+ createDependencyNode( relocations, preManaged, rangeResult, version, d, descriptorResult,
+ cycleNode );
+ node.getChildren().add( child );
+ continue;
+ }
+ }
+
+ 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<RemoteRepository> repos =
+ getRemoteRepositories( rangeResult.getRepository( version ), repositories );
+
+ 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 )
+ {
+ doRecurse( args, results, repositories, depSelector, depManager, depTraverser, verFilter, d,
+ descriptorResult, child );
+ }
+ }
+ }
+ else
+ {
+ DependencyNode node = args.nodes.top();
+ List<RemoteRepository> repos =
+ getRemoteRepositories( rangeResult.getRepository( version ), repositories );
+ DefaultDependencyNode child =
+ createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
+ args.request.getRequestContext() );
+ node.getChildren().add( child );
+ }
+ }
+ }
+
+ private void doRecurse( Args args, Results results, List<RemoteRepository> repositories,
+ DependencySelector depSelector, DependencyManager depManager,
+ DependencyTraverser depTraverser, VersionFilter verFilter, Dependency d,
+ ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child )
+ {
+ DefaultDependencyCollectionContext context = args.collectionContext;
+ context.set( d, descriptorResult.getManagedDependencies() );
+
+ 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;
+
+ final List<RemoteRepository> childRepos =
+ args.ignoreRepos
+ ? repositories
+ : remoteRepositoryManager.aggregateRepositories( args.session, repositories,
+ descriptorResult.getRepositories(), true );
+
+ Object key =
+ args.pool.toKey( d.getArtifact(), childRepos, childSelector, childManager, childTraverser, childFilter );
+
+ List<DependencyNode> children = args.pool.getChildren( key );
+ if ( children == null )
+ {
+ args.pool.putChildren( key, child.getChildren() );
+
+ args.nodes.push( child );
+
+ process( args, results, descriptorResult.getDependencies(), childRepos, childSelector, childManager,
+ childTraverser, childFilter );
+
+ args.nodes.pop();
+ }
+ else
+ {
+ child.setChildren( children );
+ }
+ }
+
+ private ArtifactDescriptorResult getArtifactDescriptorResult( Args args, Results results, boolean noDescriptor,
+ Dependency d,
+ ArtifactDescriptorRequest descriptorRequest )
+ {
+ return noDescriptor
+ ? new ArtifactDescriptorResult( descriptorRequest )
+ : resolveCachedArtifactDescriptor( args.pool, descriptorRequest, args.session, d, results, args );
+
+ }
+
+ private ArtifactDescriptorResult resolveCachedArtifactDescriptor( DataPool pool,
+ ArtifactDescriptorRequest descriptorRequest,
+ RepositorySystemSession session, Dependency d,
+ Results results, Args args )
+ {
+ Object key = pool.toKey( descriptorRequest );
+ ArtifactDescriptorResult descriptorResult = pool.getDescriptor( key, descriptorRequest );
+ if ( descriptorResult == null )
+ {
+ try
+ {
+ 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<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 );
+ return child;
+ }
+
+ private static DefaultDependencyNode createDependencyNode( List<Artifact> relocations,
+ PremanagedDependency preManaged,
+ VersionRangeResult rangeResult, Version version,
+ Dependency d, ArtifactDescriptorResult descriptorResult,
+ DependencyNode cycleNode )
+ {
+ DefaultDependencyNode child =
+ createDependencyNode( relocations, preManaged, rangeResult, version, d, descriptorResult.getAliases(),
+ cycleNode.getRepositories(), cycleNode.getRequestContext() );
+ child.setChildren( cycleNode.getChildren() );
+ return child;
+ }
+
+ private 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;
+ }
+
+ private 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;
+ }
+
+ private VersionRangeResult cachedResolveRangeResult( VersionRangeRequest rangeRequest, DataPool pool,
+ RepositorySystemSession session )
+ throws VersionRangeResolutionException
+ {
+ Object key = pool.toKey( rangeRequest );
+ VersionRangeResult rangeResult = pool.getConstraint( key, rangeRequest );
+ if ( rangeResult == null )
+ {
+ rangeResult = versionRangeResolver.resolveVersionRange( session, rangeRequest );
+ pool.putConstraint( key, rangeResult );
+ }
+ return rangeResult;
+ }
+
+ private static boolean isLackingDescriptor( Artifact artifact )
+ {
+ return artifact.getProperty( ArtifactProperties.LOCAL_PATH, null ) != null;
+ }
+
+ private 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;
+ }
+
+ private 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 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;
+
+ Args( RepositorySystemSession session, RequestTrace trace, DataPool pool, NodeStack nodes,
+ DefaultDependencyCollectionContext collectionContext, DefaultVersionFilterContext versionContext,
+ CollectRequest request )
+ {
+ 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;
+ }
+
+ }
+
+ static class Results
+ {
+
+ private final CollectResult result;
+
+ final int maxExceptions;
+
+ final int maxCycles;
+
+ String errorPath;
+
+ Results( CollectResult result, RepositorySystemSession session )
+ {
+ this.result = result;
+ this.maxExceptions = ConfigUtils.getInteger( session, 50, CONFIG_PROP_MAX_EXCEPTIONS );
+ this.maxCycles = ConfigUtils.getInteger( session, 10, 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 ) );
+ }
+ }
+
+ }
+
+ static class PremanagedDependency
+ {
+
+ final String premanagedVersion;
+
+ final String premanagedScope;
+
+ final Boolean premanagedOptional;
+
+ /**
+ * @since 1.1.0
+ */
+ final Collection<Exclusion> premanagedExclusions;
+
+ /**
+ * @since 1.1.0
+ */
+ final Map<String, String> premanagedProperties;
+
+ final int managedBits;
+
+ final Dependency managedDependency;
+
+ final boolean premanagedState;
+
+ 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<Exclusion>( premanagedExclusions ) )
+ : null;
+
+ this.premanagedProperties =
+ premanagedProperties != null
+ ? Collections.unmodifiableMap( new HashMap<String, String>( 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 );
+ }
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java
new file mode 100644
index 0000000..15e1835
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle.java
@@ -0,0 +1,87 @@
+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.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyCycle;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.util.artifact.ArtifactIdUtils;
+
+/**
+ * @see DefaultDependencyCollector
+ */
+final class DefaultDependencyCycle
+ implements DependencyCycle
+{
+
+ private final List<Dependency> dependencies;
+
+ private final int cycleEntry;
+
+ DefaultDependencyCycle( NodeStack nodes, int cycleEntry, Dependency dependency )
+ {
+ // skip root node unless it actually has a dependency or is considered the cycle entry (due to its label)
+ int offset = ( cycleEntry > 0 && nodes.get( 0 ).getDependency() == null ) ? 1 : 0;
+ Dependency[] dependencies = new Dependency[nodes.size() - offset + 1];
+ for ( int i = 0, n = dependencies.length - 1; i < n; i++ )
+ {
+ DependencyNode node = nodes.get( i + offset );
+ dependencies[i] = node.getDependency();
+ // when cycle starts at root artifact as opposed to root dependency, synthesize a dependency
+ if ( dependencies[i] == null )
+ {
+ dependencies[i] = new Dependency( node.getArtifact(), null );
+ }
+ }
+ dependencies[dependencies.length - 1] = dependency;
+ this.dependencies = Collections.unmodifiableList( Arrays.asList( dependencies ) );
+ this.cycleEntry = cycleEntry;
+ }
+
+ public List<Dependency> getPrecedingDependencies()
+ {
+ return dependencies.subList( 0, cycleEntry );
+ }
+
+ public List<Dependency> getCyclicDependencies()
+ {
+ return dependencies.subList( cycleEntry, dependencies.size() );
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder buffer = new StringBuilder( 256 );
+ for ( int i = 0, n = dependencies.size(); i < n; i++ )
+ {
+ if ( i > 0 )
+ {
+ buffer.append( " -> " );
+ }
+ buffer.append( ArtifactIdUtils.toVersionlessId( dependencies.get( i ).getArtifact() ) );
+ }
+ return buffer.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java
new file mode 100644
index 0000000..c2b3585
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext.java
@@ -0,0 +1,74 @@
+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.HashMap;
+import java.util.Map;
+import static java.util.Objects.requireNonNull;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.collection.DependencyGraphTransformationContext;
+
+/**
+ */
+class DefaultDependencyGraphTransformationContext
+ implements DependencyGraphTransformationContext
+{
+
+ private final RepositorySystemSession session;
+
+ private final Map<Object, Object> map;
+
+ DefaultDependencyGraphTransformationContext( RepositorySystemSession session )
+ {
+ this.session = session;
+ this.map = new HashMap<Object, Object>();
+ }
+
+ public RepositorySystemSession getSession()
+ {
+ return session;
+ }
+
+ public Object get( Object key )
+ {
+ return map.get( requireNonNull( key, "key cannot be null" ) );
+ }
+
+ public Object put( Object key, Object value )
+ {
+ requireNonNull( key, "key cannot be null" );
+ if ( value != null )
+ {
+ return map.put( key, value );
+ }
+ else
+ {
+ return map.remove( key );
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf( map );
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java
new file mode 100644
index 0000000..684b7da
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext.java
@@ -0,0 +1,217 @@
+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.Collections;
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.collection.VersionFilter;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.repository.ArtifactRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.VersionRangeResult;
+import org.eclipse.aether.version.Version;
+import org.eclipse.aether.version.VersionConstraint;
+
+/**
+ * @see DefaultDependencyCollector
+ */
+final class DefaultVersionFilterContext
+ implements VersionFilter.VersionFilterContext
+{
+
+ private final Iterator<Version> EMPTY = Collections.<Version>emptySet().iterator();
+
+ private final RepositorySystemSession session;
+
+ private Dependency dependency;
+
+ VersionRangeResult result;
+
+ int count;
+
+ byte[] deleted = new byte[64];
+
+ DefaultVersionFilterContext( RepositorySystemSession session )
+ {
+ this.session = session;
+ }
+
+ public void set( Dependency dependency, VersionRangeResult result )
+ {
+ this.dependency = dependency;
+ this.result = result;
+ count = result.getVersions().size();
+ if ( deleted.length < count )
+ {
+ deleted = new byte[count];
+ }
+ else
+ {
+ for ( int i = count - 1; i >= 0; i-- )
+ {
+ deleted[i] = (byte) 0;
+ }
+ }
+ }
+
+ public List<Version> get()
+ {
+ if ( count == result.getVersions().size() )
+ {
+ return result.getVersions();
+ }
+ if ( count <= 1 )
+ {
+ if ( count <= 0 )
+ {
+ return Collections.emptyList();
+ }
+ return Collections.singletonList( iterator().next() );
+ }
+ List<Version> versions = new ArrayList<Version>( count );
+ for ( Version version : this )
+ {
+ versions.add( version );
+ }
+ return versions;
+ }
+
+ public RepositorySystemSession getSession()
+ {
+ return session;
+ }
+
+ public Dependency getDependency()
+ {
+ return dependency;
+ }
+
+ public VersionConstraint getVersionConstraint()
+ {
+ return result.getVersionConstraint();
+ }
+
+ public int getCount()
+ {
+ return count;
+ }
+
+ public ArtifactRepository getRepository( Version version )
+ {
+ return result.getRepository( version );
+ }
+
+ public List<RemoteRepository> getRepositories()
+ {
+ return Collections.unmodifiableList( result.getRequest().getRepositories() );
+ }
+
+ public Iterator<Version> iterator()
+ {
+ return ( count > 0 ) ? new VersionIterator() : EMPTY;
+ }
+
+ @Override
+ public String toString()
+ {
+ return dependency + " " + result.getVersions();
+ }
+
+ private class VersionIterator
+ implements Iterator<Version>
+ {
+
+ private final List<Version> versions;
+
+ private final int size;
+
+ private int count;
+
+ private int index;
+
+ private int next;
+
+ VersionIterator()
+ {
+ count = DefaultVersionFilterContext.this.count;
+ index = -1;
+ next = 0;
+ versions = result.getVersions();
+ size = versions.size();
+ advance();
+ }
+
+ private void advance()
+ {
+ for ( next = index + 1; next < size && deleted[next] != (byte) 0; next++ )
+ {
+ // just advancing index
+ }
+ }
+
+ public boolean hasNext()
+ {
+ return next < size;
+ }
+
+ public Version next()
+ {
+ if ( count != DefaultVersionFilterContext.this.count )
+ {
+ throw new ConcurrentModificationException();
+ }
+ if ( next >= size )
+ {
+ throw new NoSuchElementException();
+ }
+ index = next;
+ advance();
+ return versions.get( index );
+ }
+
+ public void remove()
+ {
+ if ( count != DefaultVersionFilterContext.this.count )
+ {
+ throw new ConcurrentModificationException();
+ }
+ if ( index < 0 || deleted[index] == (byte) 1 )
+ {
+ throw new IllegalStateException();
+ }
+ deleted[index] = (byte) 1;
+ count = --DefaultVersionFilterContext.this.count;
+ }
+
+ @Override
+ public String toString()
+ {
+ return ( index < 0 ) ? "null" : String.valueOf( versions.get( index ) );
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NodeStack.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NodeStack.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NodeStack.java
new file mode 100644
index 0000000..a7cbc78
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/NodeStack.java
@@ -0,0 +1,124 @@
+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.Arrays;
+
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.graph.DependencyNode;
+
+/**
+ * @see DefaultDependencyCollector
+ */
+final class NodeStack
+{
+
+ private DependencyNode[] nodes = new DependencyNode[96];
+
+ private int size;
+
+ public DependencyNode top()
+ {
+ if ( size <= 0 )
+ {
+ throw new IllegalStateException( "stack empty" );
+ }
+ return nodes[size - 1];
+ }
+
+ public void push( DependencyNode node )
+ {
+ if ( size >= nodes.length )
+ {
+ DependencyNode[] tmp = new DependencyNode[size + 64];
+ System.arraycopy( nodes, 0, tmp, 0, nodes.length );
+ nodes = tmp;
+ }
+ nodes[size++] = node;
+ }
+
+ public void pop()
+ {
+ if ( size <= 0 )
+ {
+ throw new IllegalStateException( "stack empty" );
+ }
+ size--;
+ }
+
+ public int find( Artifact artifact )
+ {
+ for ( int i = size - 1; i >= 0; i-- )
+ {
+ DependencyNode node = nodes[i];
+
+ Artifact a = node.getArtifact();
+ if ( a == null )
+ {
+ break;
+ }
+
+ if ( !a.getArtifactId().equals( artifact.getArtifactId() ) )
+ {
+ continue;
+ }
+ if ( !a.getGroupId().equals( artifact.getGroupId() ) )
+ {
+ continue;
+ }
+ if ( !a.getExtension().equals( artifact.getExtension() ) )
+ {
+ continue;
+ }
+ if ( !a.getClassifier().equals( artifact.getClassifier() ) )
+ {
+ continue;
+ }
+ /*
+ * NOTE: While a:1 and a:2 are technically different artifacts, we want to consider the path a:2 -> b:2 ->
+ * a:1 a cycle in the current context. The artifacts themselves might not form a cycle but their producing
+ * projects surely do. Furthermore, conflict resolution will always have to consider a:1 a loser (otherwise
+ * its ancestor a:2 would get pruned and so would a:1) so there is no point in building the sub graph of
+ * a:1.
+ */
+
+ return i;
+ }
+
+ return -1;
+ }
+
+ public int size()
+ {
+ return size;
+ }
+
+ public DependencyNode get( int index )
+ {
+ return nodes[index];
+ }
+
+ @Override
+ public String toString()
+ {
+ return Arrays.toString( nodes );
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/ObjectPool.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/ObjectPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/ObjectPool.java
new file mode 100644
index 0000000..acb62c5
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/ObjectPool.java
@@ -0,0 +1,52 @@
+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.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+/**
+ * Pool of immutable object instances, used to avoid excessive memory consumption of (dirty) dependency graph which
+ * tends to have many duplicate artifacts/dependencies.
+ */
+class ObjectPool<T>
+{
+
+ private final Map<Object, Reference<T>> objects = new WeakHashMap<Object, Reference<T>>( 256 );
+
+ public synchronized T intern( T object )
+ {
+ Reference<T> pooledRef = objects.get( object );
+ if ( pooledRef != null )
+ {
+ T pooled = pooledRef.get();
+ if ( pooled != null )
+ {
+ return pooled;
+ }
+ }
+
+ objects.put( object, new WeakReference<T>( object ) );
+ return object;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/package-info.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/package-info.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/package-info.java
new file mode 100644
index 0000000..85baeed
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/package-info.java
@@ -0,0 +1,23 @@
+// CHECKSTYLE_OFF: RegexpHeader
+/**
+ * Internal helper classes for dependency collector.
+ */
+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.
+ */
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/142469e7/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DataPoolTest.java
----------------------------------------------------------------------
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DataPoolTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DataPoolTest.java
deleted file mode 100644
index 43651f6..0000000
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DataPoolTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.eclipse.aether.internal.impl;
-
-/*
- * 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 static org.junit.Assert.*;
-
-import org.eclipse.aether.DefaultRepositorySystemSession;
-import org.eclipse.aether.artifact.DefaultArtifact;
-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.junit.Test;
-
-public class DataPoolTest
-{
-
- private DataPool newDataPool()
- {
- return new DataPool( new DefaultRepositorySystemSession() );
- }
-
- @Test
- public void testArtifactDescriptorCaching()
- {
- ArtifactDescriptorRequest request = new ArtifactDescriptorRequest();
- request.setArtifact( new DefaultArtifact( "gid:aid:1" ) );
- ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
- result.setArtifact( new DefaultArtifact( "gid:aid:2" ) );
- result.addRelocation( request.getArtifact() );
- result.addDependency( new Dependency( new DefaultArtifact( "gid:dep:3" ), "compile" ) );
- 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" ) );
-
- DataPool pool = newDataPool();
- Object key = pool.toKey( request );
- 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() );
- assertEquals( result.getManagedDependencies(), cached.getManagedDependencies() );
- assertEquals( result.getRepositories(), cached.getRepositories() );
- assertEquals( result.getAliases(), cached.getAliases() );
- }
-
-}