Skip to content

Commit

Permalink
[MRESOLVER-483] Classpath generation bugfix (#421)
Browse files Browse the repository at this point in the history
Rework whole class to use Streams and fix the bug.

---

https://issues.apache.org/jira/browse/MRESOLVER-483
  • Loading branch information
cstamas authored Jan 27, 2024
1 parent aeaf666 commit ecce107
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;

import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;

import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;

/**
Expand Down Expand Up @@ -116,51 +117,27 @@ static List<DependencyNode> getNodesWithDependencies(List<DependencyNode> nodes)
}

static List<Dependency> getDependencies(List<DependencyNode> nodes, boolean includeUnresolved) {
List<Dependency> dependencies = new ArrayList<>(nodes.size());
for (DependencyNode node : getNodesWithDependencies(nodes)) {
Dependency dependency = node.getDependency();
if (includeUnresolved || dependency.getArtifact().getFile() != null) {
dependencies.add(dependency);
}
}
return dependencies;
return getNodesWithDependencies(nodes).stream()
.filter(d -> includeUnresolved || d.getArtifact().getFile() != null)
.map(DependencyNode::getDependency)
.collect(toList());
}

static List<Artifact> getArtifacts(List<DependencyNode> nodes, boolean includeUnresolved) {
List<Artifact> artifacts = new ArrayList<>(nodes.size());
for (DependencyNode node : getNodesWithDependencies(nodes)) {
Artifact artifact = node.getDependency().getArtifact();
if (includeUnresolved || artifact.getFile() != null) {
artifacts.add(artifact);
}
}

return artifacts;
return getNodesWithDependencies(nodes).stream()
.map(d -> d.getDependency().getArtifact())
.filter(artifact -> includeUnresolved || artifact.getFile() != null)
.collect(toList());
}

static List<File> getFiles(List<DependencyNode> nodes) {
List<File> files = new ArrayList<>(nodes.size());
for (DependencyNode node : getNodesWithDependencies(nodes)) {
File file = node.getDependency().getArtifact().getFile();
if (file != null) {
files.add(file);
}
}
return files;
return getNodesWithDependencies(nodes).stream()
.map(d -> d.getDependency().getArtifact().getFile())
.filter(Objects::nonNull)
.collect(toList());
}

static String getClassPath(List<DependencyNode> nodes) {
StringBuilder buffer = new StringBuilder(1024);
for (Iterator<DependencyNode> it = getNodesWithDependencies(nodes).iterator(); it.hasNext(); ) {
DependencyNode node = it.next();
Artifact artifact = node.getDependency().getArtifact();
if (artifact.getFile() != null) {
buffer.append(artifact.getFile().getAbsolutePath());
if (it.hasNext()) {
buffer.append(File.pathSeparatorChar);
}
}
}
return buffer.toString();
return getFiles(nodes).stream().map(File::getAbsolutePath).collect(joining(File.pathSeparator));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,17 @@
*/
package org.eclipse.aether.util.graph.visitor;

import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;

import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.graph.DependencyVisitor;
import org.eclipse.aether.internal.test.util.DependencyGraphParser;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -107,4 +115,107 @@ void testLevelOrderDuplicateSuppression() throws Exception {

assertSequence(nodeListGenerator.getNodes(), "a", "b", "d", "c", "e");
}

@Test
void testEmptyResolvedClassPath() throws Exception {
DependencyNode root = parse("simple.txt");

NodeListGenerator nodeListGenerator = new NodeListGenerator();
LevelOrderDependencyNodeConsumerVisitor visitor =
new LevelOrderDependencyNodeConsumerVisitor(nodeListGenerator);
root.accept(visitor);

assertEquals(5, nodeListGenerator.getNodes().size());
assertEquals(0, nodeListGenerator.getDependencies(false).size());
assertEquals(5, nodeListGenerator.getDependencies(true).size());
assertEquals(0, nodeListGenerator.getArtifacts(false).size());
assertEquals(5, nodeListGenerator.getArtifacts(true).size());
assertEquals(0, nodeListGenerator.getFiles().size());
assertEquals("", nodeListGenerator.getClassPath());
}

@Test
void testFullyResolvedClassPath() throws Exception {
DependencyNode root = parse("simple.txt");
DependencyVisitor fileSetter = new DependencyVisitor() {
@Override
public boolean visitEnter(DependencyNode node) {
node.setArtifact(node.getArtifact()
.setFile(new File(node.getDependency().getArtifact().getArtifactId())));
return true;
}

@Override
public boolean visitLeave(DependencyNode node) {
return true;
}
};
root.accept(fileSetter);

NodeListGenerator nodeListGenerator = new NodeListGenerator();
LevelOrderDependencyNodeConsumerVisitor visitor =
new LevelOrderDependencyNodeConsumerVisitor(nodeListGenerator);
root.accept(visitor);

Set<String> fileNames = nodeListGenerator.getNodes().stream()
.map(n -> n.getArtifact().getFile())
.filter(Objects::nonNull)
.map(File::getName)
.collect(Collectors.toSet());
String classPath = nodeListGenerator.getClassPath();
String[] splitClassPath = classPath.split(File.pathSeparator);
Set<String> classPathNames =
Arrays.stream(splitClassPath).map(File::new).map(File::getName).collect(Collectors.toSet());

assertEquals(5, nodeListGenerator.getNodes().size());
assertEquals(5, nodeListGenerator.getDependencies(false).size());
assertEquals(5, nodeListGenerator.getDependencies(true).size());
assertEquals(5, nodeListGenerator.getArtifacts(false).size());
assertEquals(5, nodeListGenerator.getArtifacts(true).size());
assertEquals(5, nodeListGenerator.getFiles().size());
assertEquals(fileNames, classPathNames);
}

@Test
void testIncompletelyResolvedEmptyClassPath() throws Exception {
DependencyNode root = parse("simple.txt");
AtomicBoolean alternator = new AtomicBoolean(false);
HashSet<String> fileNames = new HashSet<>();
DependencyVisitor fileSetter = new DependencyVisitor() {
@Override
public boolean visitEnter(DependencyNode node) {
alternator.set(!alternator.get());
if (alternator.get()) {
String fileName = node.getDependency().getArtifact().getArtifactId();
fileNames.add(fileName);
node.setArtifact(node.getArtifact().setFile(new File(fileName)));
}
return true;
}

@Override
public boolean visitLeave(DependencyNode node) {
return true;
}
};
root.accept(fileSetter);

NodeListGenerator nodeListGenerator = new NodeListGenerator();
LevelOrderDependencyNodeConsumerVisitor visitor =
new LevelOrderDependencyNodeConsumerVisitor(nodeListGenerator);
root.accept(visitor);

String classPath = nodeListGenerator.getClassPath();
String[] splitClassPath = classPath.split(File.pathSeparator);
Set<String> classPathNames =
Arrays.stream(splitClassPath).map(File::new).map(File::getName).collect(Collectors.toSet());

assertEquals(5, nodeListGenerator.getNodes().size());
assertEquals(3, nodeListGenerator.getDependencies(false).size());
assertEquals(5, nodeListGenerator.getDependencies(true).size());
assertEquals(3, nodeListGenerator.getArtifacts(false).size());
assertEquals(5, nodeListGenerator.getArtifacts(true).size());
assertEquals(3, nodeListGenerator.getFiles().size());
assertEquals(fileNames, classPathNames);
}
}

0 comments on commit ecce107

Please sign in to comment.