Skip to content
This repository was archived by the owner on Sep 17, 2020. It is now read-only.

Commit 7648117

Browse files
authored
Merge pull request #19 from volkovs/mojo-pom
Supporting pom type and transitive dependencies (#17)
2 parents 84e74ab + 7dc7781 commit 7648117

File tree

2 files changed

+58
-27
lines changed

2 files changed

+58
-27
lines changed

huntbugs-maven-plugin/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
<artifactId>maven-core</artifactId>
2525
<version>3.2.1</version>
2626
</dependency>
27+
<dependency>
28+
<groupId>org.apache.maven.shared</groupId>
29+
<artifactId>maven-dependency-tree</artifactId>
30+
<version>2.1</version>
31+
</dependency>
2732
<dependency>
2833
<groupId>org.apache.maven.plugin-tools</groupId>
2934
<artifactId>maven-plugin-annotations</artifactId>

huntbugs-maven-plugin/src/main/java/one/util/huntbugs/maven/plugin/HuntBugsMojo.java

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
*/
1616
package one.util.huntbugs.maven.plugin;
1717

18+
import com.strobel.assembler.metadata.ClasspathTypeLoader;
19+
import com.strobel.assembler.metadata.CompositeTypeLoader;
20+
import com.strobel.assembler.metadata.ITypeLoader;
21+
import com.strobel.assembler.metadata.JarTypeLoader;
1822
import one.util.huntbugs.analysis.AnalysisOptions;
1923
import one.util.huntbugs.analysis.Context;
2024
import one.util.huntbugs.analysis.HuntBugsResult;
@@ -25,22 +29,23 @@
2529
import one.util.huntbugs.repo.DirRepository;
2630
import one.util.huntbugs.repo.Repository;
2731
import one.util.huntbugs.warning.Warning;
28-
2932
import org.apache.maven.artifact.Artifact;
3033
import org.apache.maven.artifact.repository.ArtifactRepository;
34+
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
35+
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
3136
import org.apache.maven.execution.MavenSession;
3237
import org.apache.maven.plugin.AbstractMojo;
3338
import org.apache.maven.plugin.MojoExecutionException;
3439
import org.apache.maven.plugin.MojoFailureException;
40+
import org.apache.maven.plugins.annotations.Component;
3541
import org.apache.maven.plugins.annotations.LifecyclePhase;
3642
import org.apache.maven.plugins.annotations.Mojo;
3743
import org.apache.maven.plugins.annotations.Parameter;
3844
import org.apache.maven.project.MavenProject;
39-
40-
import com.strobel.assembler.metadata.ClasspathTypeLoader;
41-
import com.strobel.assembler.metadata.CompositeTypeLoader;
42-
import com.strobel.assembler.metadata.ITypeLoader;
43-
import com.strobel.assembler.metadata.JarTypeLoader;
45+
import org.apache.maven.shared.dependency.tree.DependencyNode;
46+
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
47+
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
48+
import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor;
4449

4550
import java.io.File;
4651
import java.io.IOException;
@@ -49,7 +54,6 @@
4954
import java.util.ArrayList;
5055
import java.util.Arrays;
5156
import java.util.List;
52-
import java.util.Set;
5357
import java.util.jar.JarFile;
5458

5559
/**
@@ -101,7 +105,10 @@ public class HuntBugsMojo extends AbstractMojo {
101105

102106
@Parameter( defaultValue = "${session}", readonly = true, required = true )
103107
private MavenSession session;
104-
108+
109+
@Component
110+
private DependencyTreeBuilder treeBuilder;
111+
105112
@Override
106113
public void execute() throws MojoExecutionException {
107114
try {
@@ -125,26 +132,27 @@ private Repository constructRepository() throws IOException {
125132
getLog().info("HuntBugs: +dir " + classesDirectory);
126133
}
127134

135+
// collecting project dependencies including pom and transitive dependencies
136+
ArtifactFilter artifactFilter = new ScopeArtifactFilter("compile");
137+
DependencyNode rootNode;
138+
try {
139+
rootNode = treeBuilder.buildDependencyTree(project, session.getLocalRepository(), artifactFilter);
140+
} catch (DependencyTreeBuilderException e) {
141+
throw new RuntimeException(e);
142+
}
143+
CollectingDependencyNodeVisitor visitor = new CollectingDependencyNodeVisitor();
144+
rootNode.accept(visitor);
145+
146+
// converting dependencies to type loaders
147+
List<DependencyNode> nodes = visitor.getNodes();
128148
List<ITypeLoader> deps = new ArrayList<>();
129-
ArtifactRepository localRepository = session.getLocalRepository();
149+
for (DependencyNode dependencyNode : nodes) {
150+
int state = dependencyNode.getState();
130151

131-
Set<Artifact> dependencyArtifacts = project.getDependencyArtifacts();
132-
if (dependencyArtifacts != null) {
133-
for (Artifact art : dependencyArtifacts) {
134-
if (art.getScope().equals("compile")) {
135-
File f = localRepository.find(art).getFile();
136-
if (f != null) {
137-
Path path = f.toPath();
138-
if (!quiet) {
139-
getLog().info("HuntBugs: +dep " + path);
140-
}
141-
if (Files.isRegularFile(path) && art.getType().equals("jar")) {
142-
deps.add(new JarTypeLoader(new JarFile(path.toFile())));
143-
} else if (Files.isDirectory(path)) {
144-
deps.add(new ClasspathTypeLoader(path.toString()));
145-
}
146-
}
147-
}
152+
// checking that transitive dependency is NOT excluded
153+
if (state == DependencyNode.INCLUDED) {
154+
Artifact artifact = dependencyNode.getArtifact();
155+
addDependency(artifact, deps);
148156
}
149157
}
150158

@@ -155,7 +163,25 @@ private Repository constructRepository() throws IOException {
155163
return new CompositeRepository(
156164
Arrays.asList(repo, new AuxRepository(new CompositeTypeLoader(deps.toArray(new ITypeLoader[0])))));
157165
}
158-
166+
167+
private void addDependency(Artifact art, List<ITypeLoader> deps) throws IOException {
168+
if ("compile".equals(art.getScope())) {
169+
ArtifactRepository localRepository = session.getLocalRepository();
170+
File f = localRepository.find(art).getFile();
171+
if (f != null) {
172+
Path path = f.toPath();
173+
if (!quiet) {
174+
getLog().info("HuntBugs: +dep " + path);
175+
}
176+
if (Files.isRegularFile(path) && art.getType().equals("jar")) {
177+
deps.add(new JarTypeLoader(new JarFile(path.toFile())));
178+
} else if (Files.isDirectory(path)) {
179+
deps.add(new ClasspathTypeLoader(path.toString()));
180+
}
181+
}
182+
}
183+
}
184+
159185
private AnalysisOptions constructOptions() {
160186
AnalysisOptions options = new AnalysisOptions();
161187
options.minScore = minScore;

0 commit comments

Comments
 (0)