diff --git a/aether-api/src/main/java/org/eclipse/aether/graph/DefaultDependencyNode.java b/aether-api/src/main/java/org/eclipse/aether/graph/DefaultDependencyNode.java index 6d5b1e5e2054bab57ce572ba0b722a4365ff849d..72537caf8741ec4575aed6cbd9b9f051869f27be 100644 --- a/aether-api/src/main/java/org/eclipse/aether/graph/DefaultDependencyNode.java +++ b/aether-api/src/main/java/org/eclipse/aether/graph/DefaultDependencyNode.java @@ -112,11 +112,6 @@ public final class DefaultDependencyNode return children; } - /** - * Sets the child nodes of this node. - * - * @param children The child nodes, may be {@code null} - */ public void setChildren( List children ) { if ( children == null ) diff --git a/aether-api/src/main/java/org/eclipse/aether/graph/DependencyNode.java b/aether-api/src/main/java/org/eclipse/aether/graph/DependencyNode.java index 63cd61e4819fa356c19395928d173b1d2812acc8..c983c3caa539a523c950713ca1f459e954b55ae1 100644 --- a/aether-api/src/main/java/org/eclipse/aether/graph/DependencyNode.java +++ b/aether-api/src/main/java/org/eclipse/aether/graph/DependencyNode.java @@ -33,12 +33,22 @@ public interface DependencyNode { /** - * Gets the child nodes of this node. + * Gets the child nodes of this node. To conserve memory, dependency nodes with equal dependencies may share the + * same child list instance. Hence clients mutating the child list need to be aware that these changes might affect + * more than this node. Where this is not desired, the child list should be copied before mutation if the client + * cannot be sure whether it might be shared with other nodes in the graph. * * @return The child nodes of this node, never {@code null}. */ List getChildren(); + /** + * Sets the child nodes of this node. + * + * @param children The child nodes, may be {@code null} + */ + void setChildren( List children ); + /** * Gets the dependency associated with this node. Note: For dependency graphs that have been constructed * without a root dependency, this method will yield {@code null} when invoked on the graph's root node. The root diff --git a/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java b/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java index 9d5c9f5c084fd942b99927f9ae82a844ffa2183a..6f4b56133516a67e0d9e5145e94b6da23d82d00b 100644 --- a/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java +++ b/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDependencyCollector.java @@ -454,7 +454,7 @@ public class DefaultDependencyCollector if ( cycleNode != null ) { DefaultDependencyNode child = new DefaultDependencyNode( d ); - child.setChildren( new ArrayList( cycleNode.getChildren() ) ); + child.setChildren( cycleNode.getChildren() ); child.setPremanagedScope( premanagedScope ); child.setPremanagedVersion( premanagedVersion ); child.setRelocations( relocations ); @@ -537,7 +537,7 @@ public class DefaultDependencyCollector } else { - child.setChildren( new ArrayList( children ) ); + child.setChildren( children ); } } } diff --git a/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java b/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java index d5fe152db33ad7f14d1b66f8fbb6c39165210437..949e779e876e59eb60514a511fc6d3c5feaf33b5 100644 --- a/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java +++ b/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDependencyCollectorTest.java @@ -24,7 +24,6 @@ import java.util.Map; 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; @@ -385,28 +384,6 @@ public class DefaultDependencyCollectorTest assertEquals( "managed", dep( node, 0, 0 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); } - @Test - public void testDiamondWithSharedSinkNode() - throws Exception - { - CollectRequest request = new CollectRequest(); - request.addDependency( new Dependency( new DefaultArtifact( "test:a:1" ), "compile" ) ); - request.addDependency( new Dependency( new DefaultArtifact( "test:b:1" ), "compile" ) ); - request.addRepository( repository ); - collector.setArtifactDescriptorReader( new IniArtifactDescriptorReader( "artifact-descriptions/diamond/" ) ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode root = result.getRoot(); - assertNotNull( root ); - assertEquals( 2, root.getChildren().size() ); - assertEquals( 1, root.getChildren().get( 0 ).getChildren().size() ); - assertEquals( 1, root.getChildren().get( 1 ).getChildren().size() ); - assertSame( root.getChildren().get( 0 ).getChildren().get( 0 ), - root.getChildren().get( 1 ).getChildren().get( 0 ) ); - root.getChildren().get( 0 ).getChildren().remove( 0 ); - assertEquals( 0, root.getChildren().get( 0 ).getChildren().size() ); - assertEquals( 1, root.getChildren().get( 1 ).getChildren().size() ); - } - /* */ public class TestDependencyManager implements DependencyManager diff --git a/aether-impl/src/test/resources/artifact-descriptions/diamond/test_a_1_jar.ini b/aether-impl/src/test/resources/artifact-descriptions/diamond/test_a_1_jar.ini deleted file mode 100644 index df1ec140ba4db9ae52c5e2718bc056e25b3306a1..0000000000000000000000000000000000000000 --- a/aether-impl/src/test/resources/artifact-descriptions/diamond/test_a_1_jar.ini +++ /dev/null @@ -1,2 +0,0 @@ -[dependencies] -test:x:jar:1 diff --git a/aether-impl/src/test/resources/artifact-descriptions/diamond/test_b_1_jar.ini b/aether-impl/src/test/resources/artifact-descriptions/diamond/test_b_1_jar.ini deleted file mode 100644 index 4d6e5c7b320d2bda0c0d6c4f6bfab29a6375c719..0000000000000000000000000000000000000000 --- a/aether-impl/src/test/resources/artifact-descriptions/diamond/test_b_1_jar.ini +++ /dev/null @@ -1,2 +0,0 @@ -[relocation] -test:a:jar:1 diff --git a/aether-impl/src/test/resources/artifact-descriptions/diamond/test_x_1_jar.ini b/aether-impl/src/test/resources/artifact-descriptions/diamond/test_x_1_jar.ini deleted file mode 100644 index 61a252c23574c08eb413399efb90a2103e9b51f2..0000000000000000000000000000000000000000 --- a/aether-impl/src/test/resources/artifact-descriptions/diamond/test_x_1_jar.ini +++ /dev/null @@ -1 +0,0 @@ -[dependencies]