From 02bd0d4f684c9d25784d016a087f1ee0a629f9c5 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:07:14 +0200 Subject: [PATCH 01/17] Add notify step to release.yml (AST-000) --- .github/workflows/release.yml | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 17f35b0c..3c78c513 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,6 +35,9 @@ on: jobs: release: runs-on: ubuntu-latest + outputs: + TAG_NAME: ${{ steps.set_tag_name.outputs.TAG_NAME }} + CLI_VERSION: ${{ steps.extract_cli_version.outputs.CLI_VERSION }} steps: - name: Checkout uses: actions/checkout@v4 @@ -49,6 +52,7 @@ jobs: ./.github/scripts/update_cli.sh ${{ inputs.cliTag }} - name: Tag + id: set_tag_name run: | echo ${{ inputs.tag }} tag=${{ inputs.tag }} @@ -58,6 +62,7 @@ jobs: git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" git tag -a "${tag}" -m "${message}" git push origin "${tag}" + echo "::set-output name=TAG_NAME::${tag}" - name: Cache local Maven repository uses: actions/cache@v4 @@ -77,9 +82,7 @@ jobs: server-password: MAVEN_PASSWORD gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE - - - name: Update the POM version. run: mvn -B versions:set -DnewVersion='${{ env.RELEASE_VERSION }}' --file pom.xml -DskipTests @@ -91,6 +94,14 @@ jobs: fi echo "AID_PROP=${prop}" >> $GITHUB_ENV + - name: Extract CLI version + id: extract_cli_version + run: | + CLI_VERSION=$(./src/main/resources/cx-linux version | grep -Eo '^[0-9]+\.[0-9]+\.[0-9]+') + echo "CLI version being packed is $CLI_VERSION" + echo "CLI_VERSION=$CLI_VERSION" >> $GITHUB_ENV + echo "::set-output name=CLI_VERSION::$CLI_VERSION" + - name: Publish package run: mvn --batch-mode deploy -DskipTests ${{ env.AID_PROP }} env: @@ -104,3 +115,16 @@ jobs: generate_release_notes: true tag_name: ${{ inputs.tag }} prerelease: ${{ inputs.dev }} + + notify: + if: inputs.dev == false || input.tag == 'test-notify' + needs: release + uses: Checkmarx/plugins-release-workflow/.github/workflows/release-notify.yml@main + with: + product_name: Java Wrapper + release_version: ${{ needs.release.outputs.TAG_NAME }} + cli_release_version: ${{ needs.release.outputs.CLI_VERSION }} + release_author: "Phoenix Team" + release_url: https://github.com/CheckmarxDev/ast-cli-java-wrapper/releases/tag/${{ needs.release.outputs.TAG_NAME }} + jira_product_name: JAVA_WRAPPER + secrets: inherit \ No newline at end of file From 7b83ab297dc43cde5a68dc6e55fc1e0bf8b1534e Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:10:18 +0200 Subject: [PATCH 02/17] fix input to inputs --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3c78c513..5b705a3d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -117,7 +117,7 @@ jobs: prerelease: ${{ inputs.dev }} notify: - if: inputs.dev == false || input.tag == 'test-notify' + if: inputs.dev == false || inputs.tag == 'test-notify' needs: release uses: Checkmarx/plugins-release-workflow/.github/workflows/release-notify.yml@main with: From 0ba5b97f04bb1de1857a062adbe2976f0729ed24 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:17:16 +0200 Subject: [PATCH 03/17] fix input to inputs --- .github/workflows/release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5b705a3d..9ff7d2fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,6 @@ jobs: release: runs-on: ubuntu-latest outputs: - TAG_NAME: ${{ steps.set_tag_name.outputs.TAG_NAME }} CLI_VERSION: ${{ steps.extract_cli_version.outputs.CLI_VERSION }} steps: - name: Checkout @@ -62,7 +61,7 @@ jobs: git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" git tag -a "${tag}" -m "${message}" git push origin "${tag}" - echo "::set-output name=TAG_NAME::${tag}" + echo "::set-output name=TAG_NAME::${env.RELEASE_VERSION}" - name: Cache local Maven repository uses: actions/cache@v4 From 60a9a7580e9a92d9cf6190a41e7391ea533c17e2 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:22:53 +0200 Subject: [PATCH 04/17] fix input to inputs --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ff7d2fd..236c0232 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -116,7 +116,7 @@ jobs: prerelease: ${{ inputs.dev }} notify: - if: inputs.dev == false || inputs.tag == 'test-notify' + if: inputs.dev == false || inputs.tag == 'test-notify1' needs: release uses: Checkmarx/plugins-release-workflow/.github/workflows/release-notify.yml@main with: From 697d54bb345e8b2638efe07dc00d507db9e447a7 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:23:50 +0200 Subject: [PATCH 05/17] fix input to inputs --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 236c0232..6bdb7101 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -116,7 +116,7 @@ jobs: prerelease: ${{ inputs.dev }} notify: - if: inputs.dev == false || inputs.tag == 'test-notify1' + if: inputs.dev == false || inputs.tag == 'test-notifyy' needs: release uses: Checkmarx/plugins-release-workflow/.github/workflows/release-notify.yml@main with: From b5f8bb80821b9b5d4c790d597c4476f6d1ed0074 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:25:50 +0200 Subject: [PATCH 06/17] fix input to inputs --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6bdb7101..3dea618a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,6 +37,7 @@ jobs: runs-on: ubuntu-latest outputs: CLI_VERSION: ${{ steps.extract_cli_version.outputs.CLI_VERSION }} + TAG_NAME: ${{ steps.set_tag_name.outputs.TAG_NAME }} steps: - name: Checkout uses: actions/checkout@v4 From d2145a217da1b0d2595bd37f4c5f99c509ff4352 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:27:40 +0200 Subject: [PATCH 07/17] fix input to inputs --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3dea618a..82b8196a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,7 +62,7 @@ jobs: git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" git tag -a "${tag}" -m "${message}" git push origin "${tag}" - echo "::set-output name=TAG_NAME::${env.RELEASE_VERSION}" + echo "::set-output name=TAG_NAME::${{ inputs.tag }}" - name: Cache local Maven repository uses: actions/cache@v4 From 7b6f2e867d963cf2eba4722e43781ac822426428 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Wed, 29 Jan 2025 11:33:57 +0200 Subject: [PATCH 08/17] change if condition to notify job --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 82b8196a..70882f4b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -117,7 +117,7 @@ jobs: prerelease: ${{ inputs.dev }} notify: - if: inputs.dev == false || inputs.tag == 'test-notifyy' + if: inputs.dev == false needs: release uses: Checkmarx/plugins-release-workflow/.github/workflows/release-notify.yml@main with: From 52846dab9c9b8cacde079cd3034c52427b60079f Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Mon, 10 Feb 2025 14:26:32 +0200 Subject: [PATCH 09/17] Add custom states support --- .../checkmarx/ast/predicate/CustomState.java | 63 +++++++++++++++++++ .../checkmarx/ast/predicate/Predicate.java | 21 ++++++- .../checkmarx/ast/wrapper/CxConstants.java | 1 + .../com/checkmarx/ast/wrapper/CxWrapper.java | 18 +++++- .../com/checkmarx/ast/wrapper/Execution.java | 24 ++++--- 5 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/checkmarx/ast/predicate/CustomState.java diff --git a/src/main/java/com/checkmarx/ast/predicate/CustomState.java b/src/main/java/com/checkmarx/ast/predicate/CustomState.java new file mode 100644 index 00000000..c9041238 --- /dev/null +++ b/src/main/java/com/checkmarx/ast/predicate/CustomState.java @@ -0,0 +1,63 @@ +package com.checkmarx.ast.predicate; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.type.TypeFactory; +import lombok.Value; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.util.List; + +@Value +@JsonDeserialize() +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class CustomState { + private Long id; + private String name; + private String type; + + public CustomState(@JsonProperty("id") Long id, + @JsonProperty("name") String name, + @JsonProperty("type") String type) { + this.id = id; + this.name = name; + this.type = type; + } + + public static T fromLine(String line) { + return parse(line, TypeFactory.defaultInstance().constructType(CustomState.class)); + } + + public static List listFromLine(String line) { + return parse(line, TypeFactory.defaultInstance().constructCollectionType(List.class, CustomState.class)); + } + + protected static T parse(String line, JavaType type) { + T result = null; + try { + if (!StringUtils.isBlank(line) && isValidJSON(line)) { + result = new ObjectMapper().readValue(line, type); + + } + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + private static boolean isValidJSON(final String json) { + try { + final ObjectMapper mapper = new ObjectMapper(); + mapper.readTree(json); + return true; + } catch (IOException e) { + return false; + } + } +} diff --git a/src/main/java/com/checkmarx/ast/predicate/Predicate.java b/src/main/java/com/checkmarx/ast/predicate/Predicate.java index 4a5a6373..a6fccf55 100644 --- a/src/main/java/com/checkmarx/ast/predicate/Predicate.java +++ b/src/main/java/com/checkmarx/ast/predicate/Predicate.java @@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; import java.io.IOException; +import java.lang.reflect.Field; import java.util.List; @Value @@ -29,13 +30,14 @@ public class Predicate { String createdBy; String createdAt; String updatedAt; + Long stateId; @JsonCreator public Predicate(@JsonProperty("ID") String id, @JsonProperty("SimilarityID") String similarityId, @JsonProperty("ProjectID") String projectId, @JsonProperty("State") String state, @JsonProperty("Severity") String severity, @JsonProperty("Comment") String comment, @JsonProperty("CreatedBy") String createdBy, @JsonProperty("CreatedAt") String createdAt, - @JsonProperty("UpdatedAt") String updatedAt) { + @JsonProperty("UpdatedAt") String updatedAt, @JsonProperty("StateId") Long stateId) { this.id = id; this.similarityId = similarityId; this.projectId = projectId; @@ -45,6 +47,7 @@ public Predicate(@JsonProperty("ID") String id, @JsonProperty("SimilarityID") St this.createdBy = createdBy; this.createdAt = createdAt; this.updatedAt = updatedAt; + this.stateId = stateId; } public static T fromLine(String line) { @@ -68,6 +71,22 @@ protected static T parse(String line, JavaType type) { return result; } + public static boolean validator(List arguments, Object parsedLine) { + { + for (Field field : parsedLine.getClass().getDeclaredFields()) { + field.setAccessible(true); + try { + if (field.get(parsedLine) == null && field.getName().equals("stateId")) { + return false; + } + } catch (IllegalAccessException e) { + return false; + } + } + return true; + } + } + private static boolean isValidJSON(final String json) { try { final ObjectMapper mapper = new ObjectMapper(); diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java index a192b603..0eaa72c7 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java @@ -32,6 +32,7 @@ public final class CxConstants { static final String SUB_CMD_CANCEL = "cancel"; static final String CMD_TRIAGE = "triage"; static final String SUB_CMD_UPDATE = "update"; + static final String SUB_CMD_GET_STATES = "get-states"; static final String CMD_RESULT = "results"; static final String FORMAT = "--format"; static final String SCAN_INFO_FORMAT = "--scan-info-format"; diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java index c72e1bd5..d4ef5830 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java @@ -4,6 +4,7 @@ import com.checkmarx.ast.codebashing.CodeBashing; import com.checkmarx.ast.kicsRealtimeResults.KicsRealtimeResults; import com.checkmarx.ast.learnMore.LearnMore; +import com.checkmarx.ast.predicate.CustomState; import com.checkmarx.ast.predicate.Predicate; import com.checkmarx.ast.project.Project; import com.checkmarx.ast.remediation.KicsRemediation; @@ -23,6 +24,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; @@ -161,7 +163,17 @@ public List triageShow(@NonNull UUID projectId, String similarityId, arguments.addAll(jsonArguments()); - return Execution.executeCommand(withConfigArguments(arguments), logger, Predicate::listFromLine); + return Execution.executeCommand(withConfigArguments(arguments), logger, Predicate::listFromLine, Predicate::validator); + } + + public List triageGetStates() throws IOException, InterruptedException, CxException { + this.logger.info("Executing 'triage get-states' command using the CLI."); + + List arguments = new ArrayList<>(); + arguments.add(CxConstants.CMD_TRIAGE); + arguments.add(CxConstants.SUB_CMD_SHOW); + + return Execution.executeCommand(withConfigArguments(arguments), logger, CustomState::listFromLine); } public void triageUpdate(@NonNull UUID projectId, String similarityId, String scanType, String state, String comment, String severity) throws IOException, InterruptedException, CxException { @@ -232,7 +244,9 @@ public ScanResult ScanAsca(String fileSource, boolean ascaLatestVersion, String appendAgentToArguments(agent, arguments); - return Execution.executeCommand(withConfigArguments(arguments), logger, ScanResult::fromLine); + return Execution.executeCommand(withConfigArguments(arguments), logger, ScanResult::fromLine, + (args, ignored) -> + (args.size() >= 3 && args.get(1).equals(CxConstants.CMD_SCAN) && args.get(2).equals(CxConstants.SUB_CMD_ASCA))); } private static void appendAgentToArguments(String agent, List arguments) { diff --git a/src/main/java/com/checkmarx/ast/wrapper/Execution.java b/src/main/java/com/checkmarx/ast/wrapper/Execution.java index 56aa48ef..3fdb1321 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/Execution.java +++ b/src/main/java/com/checkmarx/ast/wrapper/Execution.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.function.BiFunction; import java.util.function.Function; public final class Execution { @@ -42,32 +43,39 @@ static T executeCommand(List arguments, Logger logger, Function lineParser) throws IOException, InterruptedException, CxException { + return executeCommand(arguments, logger, lineParser, null); + } + + static T executeCommand(List arguments, + Logger logger, + Function lineParser, + BiFunction, T, Boolean> customValidator) + throws IOException, InterruptedException, CxException { Process process = buildProcess(arguments); try (BufferedReader br = getReader(process)) { T executionResult = null; String line; - StringBuilder stringBuilder = new StringBuilder(); + StringBuilder output = new StringBuilder(); while ((line = br.readLine()) != null) { logger.info(line); - stringBuilder.append(line).append(LINE_SEPARATOR); + output.append(line).append(LINE_SEPARATOR); T parsedLine = lineParser.apply(line); if (parsedLine != null) { - if (areAllFieldsNotNull(parsedLine) || isAscaRequest(arguments)) { - executionResult = parsedLine; + if (Objects.isNull(customValidator)) { + executionResult = areAllFieldsNotNull(parsedLine) ? parsedLine : null; + } else { + executionResult = (areAllFieldsNotNull(parsedLine) || customValidator.apply(arguments, parsedLine)) ? parsedLine : null; } } } process.waitFor(); if (process.exitValue() != 0) { - throw new CxException(process.exitValue(), stringBuilder.toString()); + throw new CxException(process.exitValue(), output.toString()); } return executionResult; } } - public static boolean isAscaRequest(List arguments) { - return (arguments.size() >= 3 && arguments.get(1).equals("scan") && arguments.get(2).equals("asca")); - } private static boolean areAllFieldsNotNull(Object obj) { for (Field field : obj.getClass().getDeclaredFields()) { From 350f5cf17ace901c94229e005a801c8602a59eed Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Mon, 10 Feb 2025 15:34:33 +0200 Subject: [PATCH 10/17] Add custom states support --- .../checkmarx/ast/wrapper/CxConstants.java | 1 + .../com/checkmarx/ast/wrapper/CxWrapper.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java index 0eaa72c7..92b653de 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java @@ -45,6 +45,7 @@ public final class CxConstants { static final String STATE = "--state"; static final String COMMENT = "--comment"; static final String SEVERITY = "--severity"; + static final String CUSTOM_STATE_ID = "--custom-state-id"; static final String REPORT_FORMAT = "--report-format"; static final String OUTPUT_NAME = "--output-name"; static final String OUTPUT_PATH = "--output-path"; diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java index d4ef5830..a9ab4fd0 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java @@ -177,8 +177,15 @@ public List triageGetStates() throws IOException, InterruptedExceptio } public void triageUpdate(@NonNull UUID projectId, String similarityId, String scanType, String state, String comment, String severity) throws IOException, InterruptedException, CxException { + triageUpdate(projectId, similarityId, scanType, state, comment, severity, null); + } + + public void triageUpdate(@NonNull UUID projectId, String similarityId, String scanType, String state, String comment, String severity, String customStateId) throws IOException, InterruptedException, CxException { this.logger.info("Executing 'triage update' command using the CLI."); - this.logger.info("Updating the similarityId {} with state {} and severity {}.", similarityId, state, severity); + this.logger.info("Updating the similarityId {} with state {} with customStateId {} and severity {}.", similarityId, state, customStateId, severity); + + boolean emptyState = state == null || state.isEmpty(); + boolean emptyCustomStateId = customStateId == null || customStateId.isEmpty(); List arguments = new ArrayList<>(); arguments.add(CxConstants.CMD_TRIAGE); @@ -189,8 +196,14 @@ public void triageUpdate(@NonNull UUID projectId, String similarityId, String sc arguments.add(similarityId); arguments.add(CxConstants.SCAN_TYPE); arguments.add(scanType); - arguments.add(CxConstants.STATE); - arguments.add(state); + if (!emptyState) { + arguments.add(CxConstants.STATE); + arguments.add(state); + } + if (!emptyCustomStateId) { + arguments.add(CxConstants.CUSTOM_STATE_ID); + arguments.add(customStateId); + } if (!StringUtils.isBlank(comment)) { arguments.add(CxConstants.COMMENT); arguments.add(comment); From a8bce6ebe016e048ee878d17432e2056044bb1f6 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Mon, 10 Feb 2025 17:18:30 +0200 Subject: [PATCH 11/17] Add tests --- .../checkmarx/ast/predicate/CustomState.java | 32 ++----------------- .../checkmarx/ast/wrapper/CxConstants.java | 1 + .../com/checkmarx/ast/wrapper/CxWrapper.java | 7 ++-- .../com/checkmarx/ast/wrapper/Execution.java | 2 +- .../java/com/checkmarx/ast/PredicateTest.java | 8 +++++ 5 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/predicate/CustomState.java b/src/main/java/com/checkmarx/ast/predicate/CustomState.java index c9041238..88eb5647 100644 --- a/src/main/java/com/checkmarx/ast/predicate/CustomState.java +++ b/src/main/java/com/checkmarx/ast/predicate/CustomState.java @@ -1,16 +1,13 @@ package com.checkmarx.ast.predicate; +import com.checkmarx.ast.utils.JsonParser; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.type.TypeFactory; import lombok.Value; -import org.apache.commons.lang3.StringUtils; -import java.io.IOException; import java.util.List; @Value @@ -31,33 +28,10 @@ public CustomState(@JsonProperty("id") Long id, } public static T fromLine(String line) { - return parse(line, TypeFactory.defaultInstance().constructType(CustomState.class)); + return JsonParser.parse(line, TypeFactory.defaultInstance().constructType(CustomState.class)); } public static List listFromLine(String line) { - return parse(line, TypeFactory.defaultInstance().constructCollectionType(List.class, CustomState.class)); - } - - protected static T parse(String line, JavaType type) { - T result = null; - try { - if (!StringUtils.isBlank(line) && isValidJSON(line)) { - result = new ObjectMapper().readValue(line, type); - - } - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - private static boolean isValidJSON(final String json) { - try { - final ObjectMapper mapper = new ObjectMapper(); - mapper.readTree(json); - return true; - } catch (IOException e) { - return false; - } + return JsonParser.parse(line, TypeFactory.defaultInstance().constructCollectionType(List.class, CustomState.class)); } } diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java index 92b653de..889bbb65 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java @@ -33,6 +33,7 @@ public final class CxConstants { static final String CMD_TRIAGE = "triage"; static final String SUB_CMD_UPDATE = "update"; static final String SUB_CMD_GET_STATES = "get-states"; + static final String ALL_STATES_FLAG = "--all"; static final String CMD_RESULT = "results"; static final String FORMAT = "--format"; static final String SCAN_INFO_FORMAT = "--scan-info-format"; diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java index a9ab4fd0..47c8a3f1 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java @@ -166,12 +166,15 @@ public List triageShow(@NonNull UUID projectId, String similarityId, return Execution.executeCommand(withConfigArguments(arguments), logger, Predicate::listFromLine, Predicate::validator); } - public List triageGetStates() throws IOException, InterruptedException, CxException { + public List triageGetStates(boolean all) throws IOException, InterruptedException, CxException { this.logger.info("Executing 'triage get-states' command using the CLI."); List arguments = new ArrayList<>(); arguments.add(CxConstants.CMD_TRIAGE); - arguments.add(CxConstants.SUB_CMD_SHOW); + arguments.add(CxConstants.SUB_CMD_GET_STATES); + if (all) { + arguments.add(CxConstants.ALL_STATES_FLAG); + } return Execution.executeCommand(withConfigArguments(arguments), logger, CustomState::listFromLine); } diff --git a/src/main/java/com/checkmarx/ast/wrapper/Execution.java b/src/main/java/com/checkmarx/ast/wrapper/Execution.java index 3fdb1321..07d52ff5 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/Execution.java +++ b/src/main/java/com/checkmarx/ast/wrapper/Execution.java @@ -64,7 +64,7 @@ static T executeCommand(List arguments, if (Objects.isNull(customValidator)) { executionResult = areAllFieldsNotNull(parsedLine) ? parsedLine : null; } else { - executionResult = (areAllFieldsNotNull(parsedLine) || customValidator.apply(arguments, parsedLine)) ? parsedLine : null; + executionResult = (customValidator.apply(arguments, parsedLine) || areAllFieldsNotNull(parsedLine)) ? parsedLine : null; } } } diff --git a/src/test/java/com/checkmarx/ast/PredicateTest.java b/src/test/java/com/checkmarx/ast/PredicateTest.java index 9004402b..c64628a5 100644 --- a/src/test/java/com/checkmarx/ast/PredicateTest.java +++ b/src/test/java/com/checkmarx/ast/PredicateTest.java @@ -5,6 +5,7 @@ import com.checkmarx.ast.results.result.Result; import com.checkmarx.ast.scan.Scan; import com.checkmarx.ast.wrapper.CxConstants; +import org.junit.Ignore; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -44,4 +45,11 @@ void testTriage() throws Exception { Assertions.fail("Triage update failed. Should not throw exception"); } } + + @Test + @Ignore("Ignore this tests until get states api will be in production") + void testGetStates() throws Exception { + List states = wrapper.triageGetStates(false); + Assertions.assertNotNull(states); + } } From 79585e964b061c49b80532a0aa4fe9de4509f052 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Tue, 11 Feb 2025 10:09:44 +0200 Subject: [PATCH 12/17] ignore added test --- src/test/java/com/checkmarx/ast/PredicateTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/checkmarx/ast/PredicateTest.java b/src/test/java/com/checkmarx/ast/PredicateTest.java index c64628a5..55d6b268 100644 --- a/src/test/java/com/checkmarx/ast/PredicateTest.java +++ b/src/test/java/com/checkmarx/ast/PredicateTest.java @@ -7,6 +7,7 @@ import com.checkmarx.ast.wrapper.CxConstants; import org.junit.Ignore; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.util.List; @@ -47,7 +48,7 @@ void testTriage() throws Exception { } @Test - @Ignore("Ignore this tests until get states api will be in production") + @Disabled("Ignore this tests until get states api will be in production") void testGetStates() throws Exception { List states = wrapper.triageGetStates(false); Assertions.assertNotNull(states); From a8444db3d418e5f9f8bb435585897bc1ace4d420 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Tue, 11 Feb 2025 12:23:10 +0200 Subject: [PATCH 13/17] refactor --- src/main/java/com/checkmarx/ast/predicate/CustomState.java | 6 +++--- src/main/java/com/checkmarx/ast/predicate/Predicate.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/predicate/CustomState.java b/src/main/java/com/checkmarx/ast/predicate/CustomState.java index 88eb5647..478d2549 100644 --- a/src/main/java/com/checkmarx/ast/predicate/CustomState.java +++ b/src/main/java/com/checkmarx/ast/predicate/CustomState.java @@ -15,9 +15,9 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class CustomState { - private Long id; - private String name; - private String type; + Long id; + String name; + String type; public CustomState(@JsonProperty("id") Long id, @JsonProperty("name") String name, diff --git a/src/main/java/com/checkmarx/ast/predicate/Predicate.java b/src/main/java/com/checkmarx/ast/predicate/Predicate.java index a6fccf55..c95d2d0d 100644 --- a/src/main/java/com/checkmarx/ast/predicate/Predicate.java +++ b/src/main/java/com/checkmarx/ast/predicate/Predicate.java @@ -76,7 +76,7 @@ public static boolean validator(List arguments, Object parsedLine) { for (Field field : parsedLine.getClass().getDeclaredFields()) { field.setAccessible(true); try { - if (field.get(parsedLine) == null && field.getName().equals("stateId")) { + if (field.get(parsedLine) == null && !field.getName().equals("stateId")) { return false; } } catch (IllegalAccessException e) { From 84a4899bbea038a610bdfeb3cbe7ddad0fe18da6 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Tue, 11 Feb 2025 13:27:24 +0200 Subject: [PATCH 14/17] refactor --- src/main/java/com/checkmarx/ast/wrapper/Execution.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/wrapper/Execution.java b/src/main/java/com/checkmarx/ast/wrapper/Execution.java index 07d52ff5..a60101c0 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/Execution.java +++ b/src/main/java/com/checkmarx/ast/wrapper/Execution.java @@ -43,7 +43,7 @@ static T executeCommand(List arguments, Logger logger, Function lineParser) throws IOException, InterruptedException, CxException { - return executeCommand(arguments, logger, lineParser, null); + return executeCommand(arguments, logger, lineParser, Execution::areAllFieldsNotNull); } static T executeCommand(List arguments, @@ -61,11 +61,7 @@ static T executeCommand(List arguments, output.append(line).append(LINE_SEPARATOR); T parsedLine = lineParser.apply(line); if (parsedLine != null) { - if (Objects.isNull(customValidator)) { - executionResult = areAllFieldsNotNull(parsedLine) ? parsedLine : null; - } else { - executionResult = (customValidator.apply(arguments, parsedLine) || areAllFieldsNotNull(parsedLine)) ? parsedLine : null; - } + executionResult = customValidator.apply(arguments, parsedLine) ? parsedLine : null; } } process.waitFor(); @@ -77,7 +73,7 @@ static T executeCommand(List arguments, } - private static boolean areAllFieldsNotNull(Object obj) { + private static boolean areAllFieldsNotNull(List arguments, Object obj) { for (Field field : obj.getClass().getDeclaredFields()) { field.setAccessible(true); try { From 2f0d8777d1c92f4069714618897569985552bb54 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Tue, 11 Feb 2025 14:50:09 +0200 Subject: [PATCH 15/17] Change stateId from Long to String --- src/main/java/com/checkmarx/ast/predicate/Predicate.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/predicate/Predicate.java b/src/main/java/com/checkmarx/ast/predicate/Predicate.java index c95d2d0d..2806391a 100644 --- a/src/main/java/com/checkmarx/ast/predicate/Predicate.java +++ b/src/main/java/com/checkmarx/ast/predicate/Predicate.java @@ -30,14 +30,14 @@ public class Predicate { String createdBy; String createdAt; String updatedAt; - Long stateId; + String stateId; @JsonCreator public Predicate(@JsonProperty("ID") String id, @JsonProperty("SimilarityID") String similarityId, @JsonProperty("ProjectID") String projectId, @JsonProperty("State") String state, @JsonProperty("Severity") String severity, @JsonProperty("Comment") String comment, @JsonProperty("CreatedBy") String createdBy, @JsonProperty("CreatedAt") String createdAt, - @JsonProperty("UpdatedAt") String updatedAt, @JsonProperty("StateId") Long stateId) { + @JsonProperty("UpdatedAt") String updatedAt, @JsonProperty("StateId") String stateId) { this.id = id; this.similarityId = similarityId; this.projectId = projectId; From 86aa9043ea96b22a3fe23b0a0299310e56b9f351 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Tue, 11 Feb 2025 15:15:49 +0200 Subject: [PATCH 16/17] revert if case in push satate in triage update command --- src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java index 47c8a3f1..d9c10fd4 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java @@ -199,10 +199,8 @@ public void triageUpdate(@NonNull UUID projectId, String similarityId, String sc arguments.add(similarityId); arguments.add(CxConstants.SCAN_TYPE); arguments.add(scanType); - if (!emptyState) { - arguments.add(CxConstants.STATE); - arguments.add(state); - } + arguments.add(CxConstants.STATE); + arguments.add(state); if (!emptyCustomStateId) { arguments.add(CxConstants.CUSTOM_STATE_ID); arguments.add(customStateId); From 48c4073fd390e7a872db5e506337105bd9adfe64 Mon Sep 17 00:00:00 2001 From: AlvoBen Date: Tue, 11 Feb 2025 15:18:43 +0200 Subject: [PATCH 17/17] Change id from Long to Integer --- src/main/java/com/checkmarx/ast/predicate/CustomState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/checkmarx/ast/predicate/CustomState.java b/src/main/java/com/checkmarx/ast/predicate/CustomState.java index 478d2549..e7d6177f 100644 --- a/src/main/java/com/checkmarx/ast/predicate/CustomState.java +++ b/src/main/java/com/checkmarx/ast/predicate/CustomState.java @@ -15,11 +15,11 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class CustomState { - Long id; + Integer id; String name; String type; - public CustomState(@JsonProperty("id") Long id, + public CustomState(@JsonProperty("id") Integer id, @JsonProperty("name") String name, @JsonProperty("type") String type) { this.id = id;