Skip to content

Commit 669c5a7

Browse files
authored
Dependency tree changes for CI builds scan (#459)
1 parent 4737d40 commit 669c5a7

File tree

6 files changed

+69
-46
lines changed

6 files changed

+69
-46
lines changed

build-info-extractor-npm/src/main/java/org/jfrog/build/extractor/npm/extractor/NpmBuildInfoExtractor.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,13 @@ private Build createBuild(List<Dependency> dependencies, String moduleId) {
283283

284284
/**
285285
* Populate the dependencies map for the specified scope by:
286-
* 1. Create npm dependencies tree from root node of 'npm ls' command tree. Populate each node with name, version and scope.
286+
* 1. Create npm dependency tree from root node of 'npm ls' command tree. Populate each node with name, version and scope.
287287
* 2. For each dependency, retrieve sha1 and md5 from Artifactory. Use the producer-consumer mechanism to parallelize it.
288288
*/
289-
private void populateDependenciesMap(Map<String, Dependency> dependencies, Map<String, Dependency> previousBuildDependencies, JsonNode npmDependenciesTree, NpmScope scope) throws Exception {
289+
private void populateDependenciesMap(Map<String, Dependency> dependencies, Map<String, Dependency> previousBuildDependencies, JsonNode npmDependencyTree, NpmScope scope) throws Exception {
290290
// Set of packages that could not be found in Artifactory.
291291
Set<NpmPackageInfo> badPackages = Collections.synchronizedSet(new HashSet<>());
292-
DefaultMutableTreeNode rootNode = NpmDependencyTree.createDependenciesTree(npmDependenciesTree, scope);
292+
DefaultMutableTreeNode rootNode = NpmDependencyTree.createDependencyTree(npmDependencyTree, scope);
293293
try (ArtifactoryDependenciesClient dependenciesClient = dependenciesClientBuilder.build()) {
294294
// Create producer Runnable.
295295
ProducerRunnableBase[] producerRunnable = new ProducerRunnableBase[]{new NpmExtractorProducer(rootNode)};

build-info-extractor-npm/src/main/java/org/jfrog/build/extractor/npm/extractor/NpmDependencyTree.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.apache.commons.lang3.ArrayUtils;
66
import org.jfrog.build.extractor.npm.types.NpmPackageInfo;
77
import org.jfrog.build.extractor.npm.types.NpmScope;
8-
import org.jfrog.build.extractor.scan.DependenciesTree;
8+
import org.jfrog.build.extractor.scan.DependencyTree;
99
import org.jfrog.build.extractor.scan.Scope;
1010

1111
import java.util.HashSet;
@@ -19,16 +19,16 @@
1919
public class NpmDependencyTree {
2020

2121
/**
22-
* Create a npm dependencies tree from the results of 'npm ls' command.
22+
* Create a npm dependency tree from the results of 'npm ls' command.
2323
*
2424
* @param npmList - Results of 'npm ls' command.
2525
* @return Tree of npm PackageInfos.
2626
* @see NpmPackageInfo
2727
*/
28-
public static DependenciesTree createDependenciesTree(JsonNode npmList, NpmScope scope) {
29-
DependenciesTree rootNode = new DependenciesTree();
28+
public static DependencyTree createDependencyTree(JsonNode npmList, NpmScope scope) {
29+
DependencyTree rootNode = new DependencyTree();
3030
populateDependenciesTree(rootNode, npmList.get("dependencies"), new String[]{npmList.get("name").asText() + ":" + npmList.get("version").asText()}, scope);
31-
for (DependenciesTree child : rootNode.getChildren()) {
31+
for (DependencyTree child : rootNode.getChildren()) {
3232
NpmPackageInfo packageInfo = (NpmPackageInfo) child.getUserObject();
3333
child.setScopes(getScopes(packageInfo.getName(), packageInfo.getScope()));
3434
}
@@ -42,7 +42,7 @@ public static DependenciesTree createDependenciesTree(JsonNode npmList, NpmScope
4242
* @param dependencies - The dependencies json object generated by npm ls.
4343
* @param pathToRoot - A path-to-root dependency list. The structure of each dependency in the list is 'dependency-name:dependency-version'.
4444
*/
45-
private static void populateDependenciesTree(DependenciesTree scanTreeNode, JsonNode dependencies, String[] pathToRoot, NpmScope scope) {
45+
private static void populateDependenciesTree(DependencyTree scanTreeNode, JsonNode dependencies, String[] pathToRoot, NpmScope scope) {
4646
if (dependencies == null || pathToRoot == null) {
4747
return;
4848
}
@@ -56,12 +56,12 @@ private static void populateDependenciesTree(DependenciesTree scanTreeNode, Json
5656
});
5757
}
5858

59-
private static void addSubtree(Map.Entry<String, JsonNode> stringJsonNodeEntry, DependenciesTree node, String name, String version, String[] pathToRoot, NpmScope scope) {
59+
private static void addSubtree(Map.Entry<String, JsonNode> stringJsonNodeEntry, DependencyTree node, String name, String version, String[] pathToRoot, NpmScope scope) {
6060
JsonNode jsonNode = stringJsonNodeEntry.getValue();
6161
String devScope = scope.toString();
6262
NpmPackageInfo npmPackageInfo = new NpmPackageInfo(name, version, devScope, pathToRoot);
6363
JsonNode childDependencies = jsonNode.get("dependencies");
64-
DependenciesTree childTreeNode = new DependenciesTree(npmPackageInfo);
64+
DependencyTree childTreeNode = new DependencyTree(npmPackageInfo);
6565
populateDependenciesTree(childTreeNode, childDependencies, ArrayUtils.insert(0, pathToRoot, npmPackageInfo.toString()), scope); // Mutual recursive call
6666
node.add(childTreeNode);
6767
}

build-info-extractor-npm/src/main/java/org/jfrog/build/extractor/npm/extractor/NpmExtractorProducer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.Enumeration;
99

1010
/**
11-
* Traverse over the dependencies tree of 'NpmPackageInfo's. If a node is legal - Produce it.
11+
* Traverse over the dependency tree of 'NpmPackageInfo's. If a node is legal - Produce it.
1212
*
1313
* @author Yahav Itzhak
1414
*/

build-info-extractor/src/main/java/org/jfrog/build/extractor/scan/DependenciesTree.java build-info-extractor/src/main/java/org/jfrog/build/extractor/scan/DependencyTree.java

+39-26
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,37 @@
11
package org.jfrog.build.extractor.scan;
22

33
import javax.swing.tree.DefaultMutableTreeNode;
4-
import java.util.Comparator;
5-
import java.util.HashSet;
6-
import java.util.Set;
7-
import java.util.Vector;
4+
import java.util.*;
85

96
/**
10-
* Dependencies tree for Xray scan. Used in 'Eclipse' and 'Idea' Xray plugins.
7+
* Dependency tree for Xray scan. Used in 'Eclipse' and 'Idea' Xray plugins.
118
*
129
* @author yahavi
1310
*/
14-
public class DependenciesTree extends DefaultMutableTreeNode {
11+
public class DependencyTree extends DefaultMutableTreeNode {
1512

16-
private Set<Issue> issues = new HashSet<>();
1713
private Set<License> licenses = new HashSet<>();
14+
private Set<Issue> issues = new HashSet<>();
1815
private Set<Scope> scopes = new HashSet<>();
19-
private GeneralInfo generalInfo;
2016
private Issue topIssue = new Issue();
17+
private GeneralInfo generalInfo;
2118

22-
public DependenciesTree() {
19+
public DependencyTree() {
2320
super();
2421
}
2522

26-
public DependenciesTree(Object userObject) {
23+
public DependencyTree(Object userObject) {
2724
super(userObject);
2825
}
2926

30-
public void setIssues(Set<Issue> issues) {
31-
this.issues = issues;
32-
}
33-
3427
public void setLicenses(Set<License> licenses) {
3528
this.licenses = licenses;
3629
}
3730

31+
public void setIssues(Set<Issue> issues) {
32+
this.issues = issues;
33+
}
34+
3835
public void setScopes(Set<Scope> scopes) {
3936
this.scopes = scopes;
4037
}
@@ -44,23 +41,23 @@ public void setGeneralInfo(GeneralInfo generalInfo) {
4441
this.generalInfo = generalInfo;
4542
}
4643

47-
@SuppressWarnings("unused")
48-
public GeneralInfo getGeneralInfo() {
49-
return generalInfo;
44+
public Set<License> getLicenses() {
45+
return licenses;
5046
}
5147

5248
public Set<Issue> getIssues() {
5349
return issues;
5450
}
5551

56-
public Set<License> getLicenses() {
57-
return licenses;
58-
}
59-
6052
public Set<Scope> getScopes() {
6153
return scopes;
6254
}
6355

56+
@SuppressWarnings("unused")
57+
public GeneralInfo getGeneralInfo() {
58+
return generalInfo;
59+
}
60+
6461
/**
6562
* @return top severity issue of the current node and its ancestors
6663
*/
@@ -81,7 +78,7 @@ public int getIssueCount() {
8178
* @return Node's children
8279
*/
8380
@SuppressWarnings({"WeakerAccess", "unchecked"})
84-
public Vector<DependenciesTree> getChildren() {
81+
public Vector<DependencyTree> getChildren() {
8582
return children != null ? children : new Vector<>();
8683
}
8784

@@ -111,11 +108,11 @@ private void setIssuesComponent() {
111108

112109
private void sortChildren() {
113110
getChildren().sort(Comparator
114-
.comparing(DependenciesTree::getTopIssue, Comparator.comparing(Issue::getSeverity))
115-
.thenComparing(DependenciesTree::getIssueCount)
116-
.thenComparing(DependenciesTree::getChildCount)
111+
.comparing(DependencyTree::getTopIssue, Comparator.comparing(Issue::getSeverity))
112+
.thenComparing(DependencyTree::getIssueCount)
113+
.thenComparing(DependencyTree::getChildCount)
117114
.reversed()
118-
.thenComparing(DependenciesTree::toString));
115+
.thenComparing(DependencyTree::toString));
119116
}
120117

121118
private void setTopIssue() {
@@ -128,4 +125,20 @@ private void setTopIssue() {
128125
}
129126
});
130127
}
128+
129+
/**
130+
* Recursively, collect all scopes and licenses.
131+
*
132+
* @param allScopes - Out - All dependency tree scopes
133+
* @param allLicenses - Out - All dependency tree licenses
134+
*/
135+
@SuppressWarnings("unused")
136+
public void collectAllScopesAndLicenses(Set<Scope> allScopes, Set<License> allLicenses) {
137+
Enumeration<?> enumeration = breadthFirstEnumeration();
138+
while (enumeration.hasMoreElements()) {
139+
DependencyTree child = (DependencyTree) enumeration.nextElement();
140+
allScopes.addAll(child.getScopes());
141+
allLicenses.addAll(child.getLicenses());
142+
}
143+
}
131144
}

build-info-extractor/src/main/java/org/jfrog/build/extractor/scan/GeneralInfo.java

+10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class GeneralInfo implements Serializable {
1818
private String groupId = "";
1919
private String artifactId = "";
2020
private String version = "";
21+
private String sha1 = "";
2122

2223
@SuppressWarnings("WeakerAccess")
2324
public GeneralInfo() {
@@ -77,6 +78,10 @@ public String getPkgType() {
7778
return pkgType;
7879
}
7980

81+
public String getSha1() {
82+
return sha1;
83+
}
84+
8085
@SuppressWarnings("unused")
8186
public GeneralInfo componentId(String componentId) {
8287
this.componentId = componentId;
@@ -114,6 +119,11 @@ public GeneralInfo pkgType(String pkgType) {
114119
return this;
115120
}
116121

122+
public GeneralInfo sha1(String sha1) {
123+
this.sha1 = sha1;
124+
return this;
125+
}
126+
117127
private boolean isValid() {
118128
int colonCount = StringUtils.countMatches(componentId, ":");
119129
return colonCount == 1 || colonCount == 2;

build-info-extractor/src/test/java/org/jfrog/build/extractor/scan/DependenciesTreeTest.java build-info-extractor/src/test/java/org/jfrog/build/extractor/scan/DependencyTreeTest.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@
1616
/**
1717
* @author yahavi
1818
*/
19-
public class DependenciesTreeTest {
19+
public class DependencyTreeTest {
2020

21-
private DependenciesTree root, one, two, three, four, five;
21+
private DependencyTree root, one, two, three, four, five;
2222

2323
/**
2424
* Build an empty tree with 5 nodes
2525
*/
2626
@BeforeClass
2727
public void init() {
28-
root = new DependenciesTree("0");
29-
one = new DependenciesTree("1");
30-
two = new DependenciesTree("2");
31-
three = new DependenciesTree("3");
32-
four = new DependenciesTree("4");
33-
five = new DependenciesTree("5");
28+
root = new DependencyTree("0");
29+
one = new DependencyTree("1");
30+
two = new DependencyTree("2");
31+
three = new DependencyTree("3");
32+
four = new DependencyTree("4");
33+
five = new DependencyTree("5");
3434
root.add(one); // 0 -> 1
3535
root.add(two); // 0 -> 2
3636
two.add(three); // 2 -> 3

0 commit comments

Comments
 (0)