Skip to content

Commit 5d44b95

Browse files
authored
Merge pull request #47 from CheckmarxDev/feature/AST-7569_triage_wrapper
triage show and update added
2 parents 682ce1e + 33ef4d3 commit 5d44b95

File tree

5 files changed

+184
-3
lines changed

5 files changed

+184
-3
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.checkmarx.ast.predicate;
2+
3+
import com.checkmarx.ast.project.Project;
4+
import com.fasterxml.jackson.annotation.JsonCreator;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.annotation.JsonInclude;
7+
import com.fasterxml.jackson.annotation.JsonProperty;
8+
import com.fasterxml.jackson.core.JsonParser;
9+
import com.fasterxml.jackson.core.JsonProcessingException;
10+
import com.fasterxml.jackson.databind.JavaType;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
13+
import com.fasterxml.jackson.databind.type.TypeFactory;
14+
import lombok.Value;
15+
import org.apache.commons.lang3.StringUtils;
16+
17+
import java.io.IOException;
18+
import java.util.List;
19+
20+
@Value
21+
@JsonDeserialize()
22+
@JsonInclude(JsonInclude.Include.NON_NULL)
23+
@JsonIgnoreProperties(ignoreUnknown = true)
24+
public class Predicate{
25+
26+
String ID;
27+
String SimilarityID;
28+
String ProjectID;
29+
String State;
30+
String Severity;
31+
String Comment;
32+
String CreatedAt;
33+
String UpdatedAt;
34+
35+
@JsonCreator
36+
public Predicate(@JsonProperty("ID") String id, @JsonProperty("SimilarityID") String similarityID,
37+
@JsonProperty("ProjectID") String projectID, @JsonProperty("State") String state,
38+
@JsonProperty("Severity") String severity, @JsonProperty("Comment") String comment,
39+
@JsonProperty("CreatedAt") String CreatedAt, @JsonProperty("UpdatedAt") String UpdatedAt) {
40+
this.ID = id;
41+
this.SimilarityID = similarityID;
42+
this.ProjectID = projectID;
43+
this.State = state;
44+
this.Severity = severity;
45+
this.Comment = comment;
46+
this.CreatedAt = CreatedAt;
47+
this.UpdatedAt = UpdatedAt;
48+
}
49+
50+
public static <T> T fromLine(String line) {
51+
return parse(line, TypeFactory.defaultInstance().constructType(Predicate.class));
52+
}
53+
54+
public static <T> List<T> listFromLine(String line) {
55+
return parse(line, TypeFactory.defaultInstance().constructCollectionType(List.class, Predicate.class));
56+
}
57+
58+
protected static <T> T parse(String line, JavaType type) {
59+
T result = null;
60+
if (!StringUtils.isBlank(line) && isValidJSON(line)) {
61+
try {
62+
result = new ObjectMapper().readValue(line, type);
63+
} catch (JsonProcessingException ignored) {
64+
65+
}
66+
}
67+
return result;
68+
}
69+
70+
private static boolean isValidJSON(final String json) {
71+
boolean valid = false;
72+
try {
73+
final JsonParser parser = new ObjectMapper().createParser(json);
74+
//noinspection StatementWithEmptyBody
75+
while (parser.nextToken() != null) {
76+
}
77+
valid = true;
78+
} catch (IOException ignored) {
79+
}
80+
return valid;
81+
}
82+
83+
}

src/main/java/com/checkmarx/ast/wrapper/CxConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
@Data
1515
@Builder
16-
public class CxConfig {
16+
public class CxConfig {
1717

1818
private static final Pattern pattern = Pattern.compile("([^\"]\\S*|\".+?\")\\s*");
1919

src/main/java/com/checkmarx/ast/wrapper/CxConstants.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
public final class CxConstants {
44

55
public static final String SOURCE = "-s";
6-
public static final String VERBOSE = "-v";
76
public static final String PROJECT_NAME = "--project-name";
7+
public static final String SCAN_TYPE = "--scan-type";
88
public static final String SCAN_TYPES = "--scan-types";
99
public static final String SAST_PRESET_NAME = "--sast-preset-name";
1010
public static final String FILE_FILTER = "--file-filter";
11-
public static final String AGENT = "--agent";
1211
public static final String BRANCH = "--branch";
1312

13+
public static final String SAST = "sast";
14+
1415
static final String CLIENT_ID = "--client-id";
1516
static final String CLIENT_SECRET = "--client-secret";
1617
static final String API_KEY = "--apikey";
@@ -25,12 +26,18 @@ public final class CxConstants {
2526
static final String SUB_CMD_SHOW = "show";
2627
static final String SUB_CMD_LIST = "list";
2728
static final String SUB_CMD_CREATE = "create";
29+
static final String CMD_TRIAGE = "triage";
30+
static final String SUB_CMD_UPDATE = "update";
2831
static final String CMD_RESULT = "result";
2932
static final String FORMAT = "--format";
3033
static final String FORMAT_JSON = "json";
3134
static final String FILTER = "--filter";
3235
static final String SCAN_ID = "--scan-id";
3336
static final String PROJECT_ID = "--project-id";
37+
static final String SIMILARITY_ID = "--similarity-id";
38+
static final String STATE = "--state";
39+
static final String COMMENT = "--comment";
40+
static final String SEVERITY = "--severity";
3441
static final String REPORT_FORMAT = "--report-format";
3542
static final String OUTPUT_NAME = "--output-name";
3643
static final String OUTPUT_PATH = "--output-path";

src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.checkmarx.ast.wrapper;
22

3+
import com.checkmarx.ast.predicate.Predicate;
34
import com.checkmarx.ast.project.Project;
45
import com.checkmarx.ast.results.ReportFormat;
56
import com.checkmarx.ast.results.Results;
@@ -109,6 +110,46 @@ public Scan scanCreate(@NonNull Map<String, String> params, String additionalPar
109110
return Execution.executeCommand(withConfigArguments(arguments), logger, Scan::fromLine);
110111
}
111112

113+
public List<Predicate> triageShow(@NonNull UUID projectId, String similarityId, String scanType) throws IOException, InterruptedException, CxException {
114+
this.logger.info("initialized triage for project with id: {}", projectId);
115+
116+
List<String> arguments = new ArrayList<>();
117+
arguments.add(CxConstants.CMD_TRIAGE);
118+
arguments.add(CxConstants.SUB_CMD_SHOW);
119+
arguments.add(CxConstants.PROJECT_ID);
120+
arguments.add(projectId.toString());
121+
arguments.add(CxConstants.SIMILARITY_ID);
122+
arguments.add(similarityId);
123+
arguments.add(CxConstants.SCAN_TYPE);
124+
arguments.add(scanType);
125+
126+
arguments.addAll(jsonArguments());
127+
128+
return Execution.executeCommand(withConfigArguments(arguments), logger, Predicate::listFromLine);
129+
}
130+
131+
public void triageUpdate(@NonNull UUID projectId, String similarityId, String scanType, String state, String comment, String severity) throws IOException, InterruptedException, CxException {
132+
this.logger.info("initialized triage update project with id: {}", projectId);
133+
134+
List<String> arguments = new ArrayList<>();
135+
arguments.add(CxConstants.CMD_TRIAGE);
136+
arguments.add(CxConstants.SUB_CMD_UPDATE);
137+
arguments.add(CxConstants.PROJECT_ID);
138+
arguments.add(projectId.toString());
139+
arguments.add(CxConstants.SIMILARITY_ID);
140+
arguments.add(similarityId);
141+
arguments.add(CxConstants.SCAN_TYPE);
142+
arguments.add(scanType);
143+
arguments.add(CxConstants.STATE);
144+
arguments.add(state);
145+
arguments.add(CxConstants.COMMENT);
146+
arguments.add(comment);
147+
arguments.add(CxConstants.SEVERITY);
148+
arguments.add(severity);
149+
150+
Execution.executeCommand(withConfigArguments(arguments), logger, (line) -> null);
151+
}
152+
112153
public Project projectShow(@NonNull UUID projectId) throws IOException, InterruptedException, CxException {
113154
this.logger.info("initialized project retrieval for id: {}", projectId);
114155

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.checkmarx.ast;
2+
3+
import com.checkmarx.ast.predicate.Predicate;
4+
import com.checkmarx.ast.project.Project;
5+
import com.checkmarx.ast.results.Results;
6+
import com.checkmarx.ast.results.result.Result;
7+
import com.checkmarx.ast.scan.Scan;
8+
import com.checkmarx.ast.wrapper.CxConstants;
9+
import org.junit.Assert;
10+
import org.junit.Test;
11+
12+
import java.util.List;
13+
import java.util.UUID;
14+
15+
import static org.junit.Assert.fail;
16+
17+
public class PredicateTest extends BaseTest {
18+
19+
@Test
20+
public void testTriageShow() throws Exception {
21+
List<Scan> scanList = wrapper.scanList(String.format("statuses=Completed"));
22+
Scan scan = scanList.get(0);
23+
Assert.assertTrue(scanList.size() > 0);
24+
String scanId = scanList.get(0).getID();
25+
26+
Results results = wrapper.results(UUID.fromString(scanId));
27+
Result result = results.getResults().stream().filter(res -> res.getType().equalsIgnoreCase(CxConstants.SAST)).findFirst().get();
28+
29+
List<Predicate> predicates = wrapper.triageShow(UUID.fromString(scan.getProjectID()), result.getSimilarityId(), result.getType());
30+
31+
Assert.assertNotNull(predicates);
32+
}
33+
34+
@Test
35+
public void testTriageUpdate() throws Exception {
36+
List<Scan> scanList = wrapper.scanList(String.format("statuses=Completed"));
37+
Scan scan = scanList.get(0);
38+
Assert.assertTrue(scanList.size() > 0);
39+
String scanId = scanList.get(0).getID();
40+
41+
Results results = wrapper.results(UUID.fromString(scanId));
42+
Result result = results.getResults().stream().filter(res -> res.getType().equalsIgnoreCase(CxConstants.SAST)).findFirst().get();
43+
44+
try {
45+
wrapper.triageUpdate(UUID.fromString(scan.getProjectID()), result.getSimilarityId(), result.getType(), "confirmed", "Edited via Java Wrapper", "high");
46+
} catch (Exception e) {
47+
fail("Triage update failed. Should not throw exception");
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)