Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
1575ce4
feat: Add SAST-DAST correlation command with ExternalFindings injecti…
Apr 16, 2026
9d0f5f2
refactor(correlate-sast-dast): extract helpers, add progress logging,…
Apr 21, 2026
ab429e7
feat: Add entitlement management to Aviator application
AnkitRathod29 Apr 27, 2026
26a9d7e
feat(correlate-sast-dast): persist correlation state, skip already-tr…
Apr 30, 2026
564fa7b
Merge remote-tracking branch 'neeta_repo/feat/sast-dast-correlation' …
May 4, 2026
699ae52
fix(correlate-sast-dast): add succeeded/skipped output fields, fix Is…
May 5, 2026
5b2d0c7
Add unit tests for correlation helpers and SastFprCorrelationRecorder
May 5, 2026
8999352
Merge remote-tracking branch 'neeta_repo/feat/sast-dast-correlation' …
kireetivar May 5, 2026
3cf1d6c
feat: Add bulkcorrelate SSC action for automated SAST-DAST correlatio…
kireetivar May 6, 2026
7e5c342
Remove test resource files and dependent test classes for correlation
May 6, 2026
36a51b0
Merge remote-tracking branch 'neeta_repo/feat/sast-dast-correlation' …
kireetivar May 7, 2026
0e0ac42
refactor: Address PR review comments - shorten long methods, rename a…
May 11, 2026
00538d7
fix: prefer FPR source file types over configured extension fallback
kireetivar May 11, 2026
bacf477
Merge remote-tracking branch 'neeta_repo/feat/sast-dast-correlation' …
kireetivar May 11, 2026
f1ac0d5
fix(aviator): record issue suppression state changes in audit history
kireetivar May 12, 2026
17f6742
Merge remote-tracking branch 'neeta_repo/feat/sast-dast-correlation' …
kireetivar May 12, 2026
095af1b
fix: Count only OK/SUCCESS correlation responses for succeeded field …
May 12, 2026
1b150db
fix: "aviator ssc audit" preflight issue counting for "--no-filterset…
kireetivar May 15, 2026
1d1ed02
Merge pull request #986 from ankit2995/ankit/multi-entitlement
rsenden May 15, 2026
dd20968
Merge pull request #992 from mneeta/feat/sast-dast-correlation
rsenden May 15, 2026
d5d59ea
Merge remote-tracking branch 'upstream/feat/v3.x/aviator/26.3' into p…
May 15, 2026
68833c4
Merge remote-tracking branch 'upstream/feat/v3.x/aviator/26.3' into p…
May 15, 2026
3013907
Merge remote-tracking branch 'upstream/feat/v3.x/aviator/26.3' into p…
May 15, 2026
2f66589
Merge pull request #996 from kireetivar/p/kireetivar/bulk_correlation
rsenden May 15, 2026
80595f8
Merge pull request #999 from kireetivar/p/kireetivar/fix_extension_fa…
rsenden May 15, 2026
c108e45
Merge pull request #1001 from kireetivar/p/kireetivar/suppress_aduit_…
rsenden May 15, 2026
0f19514
chore: Add description key for applicationId parameter in add-entitle…
May 15, 2026
59d994a
chore(fcli): align Aviator customer-facing text with new product naming
kireetivar May 15, 2026
7040110
chore: remove Aviator branding regression test
kireetivar May 15, 2026
c79932c
Merge pull request #1002 from kireetivar/p/kireetivar/fix_test
rsenden May 15, 2026
fc4ebc1
fix : Add the files modified during apply-remediation in stdout and i…
May 11, 2026
5174fb1
feat: Add modifiedFiles to apply-remediations output and differentiat…
May 13, 2026
5faf0ab
fix: Add pre-upload SSC tag validation to prevent silent audit result…
May 18, 2026
28a23ff
chore: Preserve Aviator correlation order and harden FPR index.xml pa…
May 19, 2026
eb0a7d9
chore(aviator): relax correlate parser requirements
May 19, 2026
84186fb
chore: change log level from warn to debug for semaphore timeout
May 19, 2026
4061cad
Soft warning when last_correlation_attribute is not present in SSC
May 19, 2026
ddf9f2b
revert: Remove PROCESSED_BY_AVIATOR_WITH_REMEDIATION — SSC 26.2 built…
May 20, 2026
125a539
chore: fix --exclude-filter in bulkcorrelate action
kireetivar May 22, 2026
788b864
Merge pull request #1013 from kireetivar/fix/exclude_filter
rsenden May 24, 2026
c908cac
Merge pull request #1006 from mneeta/fix/bug-fixes
rsenden May 24, 2026
474d974
Merge pull request #1003 from kireetivar/p/kireetivar/rename_aviator2
rsenden May 24, 2026
7a51ee3
Merge pull request #1004 from kireetivar/p/kireetivar/nofilter_fix
rsenden May 24, 2026
048edbf
Merge pull request #1005 from kireetivar/fix/correlation_inconsistency
rsenden May 24, 2026
2efba01
feat: Implement admin session validation in Aviator gRPC client
AnkitRathod29 May 25, 2026
9ff41eb
Merge pull request #1017 from ankit2995/ankit/admin-session-validation
rsenden May 26, 2026
a54beb1
chore: Fix native SpEL OffsetDateTime reflection metadata
kireetivar May 27, 2026
a0bfee6
Merge pull request #1018 from kireetivar/fix_fcli_bulk_binary
rsenden May 27, 2026
f19fce1
Merge branch 'dev/v3.x' into feat/v3.x/aviator/26.3
rsenden May 27, 2026
678b011
fix: fcli aviator ssc audit: Reject --skip-if-exceeding-quota with --…
May 29, 2026
dafd376
Merge remote-tracking branch 'upstream/feat/v3.x/aviator/26.3' into p…
May 29, 2026
9900cf0
chore: move aviator SSC invalid option coverage to functional tests
May 30, 2026
4a4fb3e
chore: Align Aviator exception handling with Aviator simple/technical…
May 30, 2026
526e587
Added reflectable for native EXE
Jun 2, 2026
96c5a1a
Used logger.warn instead of logger.progress
Jun 2, 2026
40b6753
Merge pull request #1019 from kireetivar/p/kireetivar/option_bug
rsenden Jun 3, 2026
5700eda
Merge pull request #1020 from kireetivar/p/kireetivar/ex_handle
rsenden Jun 3, 2026
e1a579f
feat: Add capability detection for SSC 26.2+ system-managed Aviator tags
Jun 3, 2026
367dcdc
Merge branch 'feat/v3.x/aviator/26.3' into prepare-command-upgraded-ssc
mneeta Jun 3, 2026
bec5013
Merge branch 'dev/v3.x' into feat/v3.x/aviator/26.3
Jun 4, 2026
e3712cc
Refactored long methods
Jun 5, 2026
02d0f53
Merge pull request #1025 from mneeta/prepare-command-upgraded-ssc
rsenden Jun 5, 2026
a950ade
Resolved build failure issue
Jun 6, 2026
5608ce8
Merge pull request #1031 from mneeta/prepare-command-upgraded-ssc
rsenden Jun 7, 2026
c535ae0
fix: FoD apply-remediation output shows only relevant fields
Jun 15, 2026
a9aa8a2
Merge pull request #1036 from mneeta/fix/fod-apply-remediation-output
rsenden Jun 15, 2026
13adc46
chore: align prompt line-numbering behavior and init comment mapping
kireetivar Jul 3, 2026
7f36617
chore; remove redudant AviatorConfigManager test
kireetivar Jul 3, 2026
5029edc
chore: add resource configuration for Aviator includes
kireetivar Jul 3, 2026
1698011
chore: add reflection configuration for LanguagesCommentConfig
kireetivar Jul 3, 2026
c097f9e
Merge pull request #1049 from kireetivar/kireetivar/chore_line_num
rsenden Jul 3, 2026
fa2b837
Merge branch 'dev/v3.x' of https://github.com/fortify/fcli into feat/…
Jul 6, 2026
e0d1c0d
Merge branch 'dev/v3.x' into feat/v3.x/aviator/26.4
rsenden Jul 13, 2026
be39c3e
feat: Aviator apply-remediations issue-id filtering for SSC/FoD (#1050)
kireetivar Jul 27, 2026
092252a
Merge branch 'dev/v3.x' into feat/v3.x/aviator/26.4
kireetivar Jul 29, 2026
6fd3c0c
chore: resolve remediations conflicts after merging dev/v3.x
kireetivar Jul 29, 2026
b1ab908
Merge pull request #1065 from fortify/kireetivar/temp/merge-dev-v3x-r…
rsenden Jul 30, 2026
1e1605c
chore: Merge Aviator connection diagnose command (#1062)
kireetivar Jul 31, 2026
88791cb
chore: aviator connection diagnose HTTPS-only URL validation and stag…
kireetivar Aug 5, 2026
6a6e4a3
chore: improve connection diagnostic summaries and logging
kireetivar Aug 5, 2026
2ee4add
Merge pull request #1069 from kireetivar/p/kireetivar/bug_fixes
rsenden Aug 7, 2026
a7dd50a
chore: read FVDL metadata from ZIP-backed FPR paths (#1074)
kireetivar Aug 17, 2026
50458c2
chore: Add --preview flag to preview aviator remediations before appl…
dhanwanthp Aug 28, 2026
64d5e72
feat: Add DAST audit command and related functionality (#1078)
ankit2995 Aug 31, 2026
20a9c36
fix: Add remediation description for each issue to --preview output a…
dhanwanthp Sep 1, 2026
70ed7df
Fix DAST audit eligibility and server tier handling (#1085)
ankit2995 Sep 1, 2026
18e87ef
Add bulk DAST audit action for SSC application versions (#1094)
kireetivar Sep 17, 2026
79c2f83
Improve bulk DAST audit selection and execution for SSC application v…
kireetivar Sep 23, 2026
b54fb50
fix: Fix SSC SAST-DAST correlation state handling (#1105)
ankit2995 Sep 23, 2026
8c28787
Backmerge dev/v3.x into Aviator 26.4 (#1107)
kireetivar Sep 28, 2026
ec1f7be
chore: Aviator fixes (#1112)
umadevis1 Sep 29, 2026
eff1b65
chore: Merge branch 'dev/v3.x' into feat/v3.x/aviator/26.4
kireetivar Sep 30, 2026
5238d70
Stop warning for built-in SSC Aviator tags in audit commands (#1111)
kireetivar Sep 30, 2026
5e69800
Harden Aviator FPR XML parsing against XXE (#1123)
kireetivar Oct 5, 2026
200dc5c
Merge remote-tracking branch 'upstream/dev/v3.x' into feat/v3.x/aviat…
kireetivar Oct 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@
"name":"com.fortify.cli.aviator.config.TagMappingConfig",
"allDeclaredFields":true,
"queryAllPublicMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setMapping","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$Mapping"] }, {"name":"setSuppression_exclusions","parameterTypes":["java.util.List"] }, {"name":"setTag_id","parameterTypes":["java.lang.String"] }]
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setDast","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping"] }, {"name":"setMapping","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$Mapping"] }, {"name":"setSast","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping"] }, {"name":"setSuppression_exclusions","parameterTypes":["java.util.List"] }, {"name":"setTag_id","parameterTypes":["java.lang.String"] }]
},
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$Mapping",
Expand Down Expand Up @@ -631,6 +631,13 @@
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$MappingCustomizer"
},
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping",
"allDeclaredConstructors":true,
"allDeclaredFields":true,
"queryAllPublicMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setMapping","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$Mapping"] }, {"name":"setSuppression_exclusions","parameterTypes":["java.util.List"] }, {"name":"setTag_id","parameterTypes":["java.lang.String"] }]
},
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$Result",
"allDeclaredConstructors": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"name":"com.fortify.cli.aviator.config.TagMappingConfig",
"allDeclaredFields":true,
"queryAllPublicMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setMapping","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$Mapping"] }, {"name":"setSuppression_exclusions","parameterTypes":["java.util.List"] }, {"name":"setTag_id","parameterTypes":["java.lang.String"] }]
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setDast","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping"] }, {"name":"setMapping","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$Mapping"] }, {"name":"setSast","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping"] }, {"name":"setSuppression_exclusions","parameterTypes":["java.util.List"] }, {"name":"setTag_id","parameterTypes":["java.lang.String"] }]
},
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$Mapping",
Expand Down Expand Up @@ -74,6 +74,13 @@
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$MappingCustomizer"
},
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping",
"allDeclaredConstructors":true,
"allDeclaredFields":true,
"queryAllPublicMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setMapping","parameterTypes":["com.fortify.cli.aviator.config.TagMappingConfig$Mapping"] }, {"name":"setSuppression_exclusions","parameterTypes":["java.util.List"] }, {"name":"setTag_id","parameterTypes":["java.lang.String"] }]
},
{
"name":"com.fortify.cli.aviator.config.TagMappingConfig$Result",
"allDeclaredConstructors": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class NativeReflectConfigTest {
private static final List<String> TAG_MAPPING_NESTED_CLASSES = List.of(
"com.fortify.cli.aviator.config.TagMappingConfig$SuppressionExclusion",
"com.fortify.cli.aviator.config.TagMappingConfig$Mapping",
"com.fortify.cli.aviator.config.TagMappingConfig$ProductMapping",
"com.fortify.cli.aviator.config.TagMappingConfig$Tier",
"com.fortify.cli.aviator.config.TagMappingConfig$Result");

Expand Down
2 changes: 2 additions & 0 deletions fcli-core/fcli-aviator-common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id("fcli.module-conventions")
id("java-library")
id("java-test-fixtures")
id("com.google.protobuf")
}

Expand All @@ -13,6 +14,7 @@ tasks.withType<JavaCompile>().configureEach { dependsOn("generateProto") }

dependencies {
implementation(project(":fcli-core:fcli-common-core"))
testFixturesImplementation(project(":fcli-core:fcli-common-core"))
implementation("org.yaml:snakeyaml:2.3")

// JAXB for XML object marshalling (used in FVDLProcessor legacy parser)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* Copyright 2021-2026 Open Text.
*
* The only warranties for products and services of Open Text
* and its affiliates and licensors ("Open Text") are as may
* be set forth in the express warranty statements accompanying
* such products and services. Nothing herein should be construed
* as constituting an additional warranty. Open Text shall not be
* liable for technical or editorial errors or omissions contained
* herein. The information contained herein is subject to change
* without notice.
*/
package com.fortify.cli.aviator._common.cli.mixin;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.fortify.cli.aviator._common.remediations_cache.IApplyRemediationsOptions;
import com.fortify.cli.aviator.fpr.remediation.RemediationExecutionMode;
import com.fortify.cli.aviator.fpr.utils.ISourceDecoder;
import com.fortify.cli.common.exception.FcliSimpleException;

import lombok.Getter;
import picocli.CommandLine.Mixin;
import picocli.CommandLine.Option;

/**
* Abstract base for apply-remediations options. Provides shared CLI options and validation template method.
* Product-specific subclasses declare source-selection mixins and implement validation hooks.
*/
@Getter
public abstract class AbstractApplyRemediationsOptionsMixin implements IApplyRemediationsOptions {
@Mixin
private SourceEncodingsMixin sourceEncodingsMixin = new SourceEncodingsMixin();

@Option(names = {"--source-dir"})
private String sourceCodeDirectory = System.getProperty("user.dir");

@Option(names = {"--issue-ids"}, split = ",")
private List<String> issueIds;

@Option(names = {"--preview"})
private boolean previewMode = false;

public RemediationExecutionMode executionMode() {
return previewMode ? RemediationExecutionMode.PREVIEW : RemediationExecutionMode.APPLY;
}

@Override
public ISourceDecoder getSourceDecoder() {
return sourceEncodingsMixin.getSourceDecoder();
}

/**
* Validates all options by calling validation hooks in order.
* Template method: ensures consistent validation sequence across SSC and FoD.
*/
@Override
public final void validate() {
validateSourceSelection();
validateSourceDir();
validateIssueIdsConstraints();
}

/** Hook for product-specific source selection validation (--from-cache vs online selection). */
protected abstract void validateSourceSelection();

/** Hook to determine if --from-cache is selected (needed for --issue-ids constraint validation). */
protected abstract boolean isCacheMode();

private void validateSourceDir() {
FcliSimpleException.throwIf(
StringUtils.isBlank(sourceCodeDirectory),
"--source-dir must specify a valid directory path");
Path path = Path.of(sourceCodeDirectory);
FcliSimpleException.throwIf(
!Files.exists(path) || !Files.isDirectory(path),
"--source-dir path does not exist or is not a directory: %s", sourceCodeDirectory);
FcliSimpleException.throwIf(
!Files.isReadable(path),
"--source-dir path is not accessible: %s", sourceCodeDirectory);
}

private void validateIssueIdsConstraints() {
FcliSimpleException.throwIf(
issueIds != null && !issueIds.isEmpty() && !isCacheMode(),
"--issue-ids can only be used with --from-cache; "
+ "create a cache with download-remediations-cache and rerun with --from-cache");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,8 @@ public TagMappingConfig getDefaultTagMappingConfig() {
}
return defaultTagMappingConfig;
}

public TagMappingConfig getDefaultDastTagMappingConfig() {
return getDefaultTagMappingConfig();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright 2021-2026 Open Text.
*
* The only warranties for products and services of Open Text
* and its affiliates and licensors ("Open Text") are as may
* be set forth in the express warranty statements accompanying
* such products and services. Nothing herein should be construed
* as constituting an additional warranty. Open Text shall not be
* liable for technical or editorial errors or omissions contained
* herein. The information contained herein is subject to change
* without notice.
*/
package com.fortify.cli.aviator._common.exception;

/**
* User-facing rejection of a non-{@code https} Aviator target scheme.
* <p>
* Typed so diagnose can map endpoint UX without parsing exception message text.
*/
public class UnsupportedAviatorUrlSchemeException extends AviatorSimpleException {
private static final long serialVersionUID = 1L;

public static final String STAGE_SUMMARY = "Unsupported URL scheme";
public static final String STAGE_GUIDANCE = "Use a supported Aviator URL (https://host[:port])";

private final String scheme;
private final String providedUrl;

public UnsupportedAviatorUrlSchemeException(String scheme, String providedUrl) {
super(STAGE_SUMMARY+" '"+scheme+"'. "+STAGE_GUIDANCE+". Provided URL: "+providedUrl);
this.scheme = scheme;
this.providedUrl = providedUrl;
}

public String getScheme() {
return scheme;
}

public String getProvidedUrl() {
return providedUrl;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright 2021-2026 Open Text.
*
* The only warranties for products and services of Open Text
* and its affiliates and licensors ("Open Text") are as may
* be set forth in the express warranty statements accompanying
* such products and services. Nothing herein should be construed
* as constituting an additional warranty. Open Text shall not be
* liable for technical or editorial errors or omissions contained
* herein. The information contained herein is subject to change
* without notice.
*/
package com.fortify.cli.aviator._common.output.cli.cmd;

import java.util.Set;

import com.fasterxml.jackson.databind.JsonNode;
import com.fortify.cli.aviator._common.cli.mixin.AbstractApplyRemediationsOptionsMixin;
import com.fortify.cli.aviator._common.remediations_cache.IRemediationsFprSource;
import com.fortify.cli.aviator._common.remediations_cache.RemediationsApplyHelper;
import com.fortify.cli.aviator._common.remediations_cache.RemediationsApplyHelper.ApplyResult;
import com.fortify.cli.aviator._common.util.AviatorIssueIdFilterUtils;
import com.fortify.cli.aviator.config.AviatorLoggerImpl;
import com.fortify.cli.common.output.cli.cmd.AbstractOutputCommand;
import com.fortify.cli.common.output.cli.cmd.IJsonNodeSupplier;
import com.fortify.cli.common.output.cli.mixin.OutputHelperMixins;
import com.fortify.cli.common.progress.cli.mixin.ProgressWriterFactoryMixin;
import com.fortify.cli.common.progress.helper.IProgressWriter;

import lombok.Getter;
import picocli.CommandLine.Mixin;

/**
* Abstract base command for applying remediations. Orchestrates validation, FPR source acquisition,
* and remediation application. Product-specific subclasses provide options mixin and implement hooks.
*/
public abstract class AbstractAviatorApplyRemediationsCommand extends AbstractOutputCommand
implements IJsonNodeSupplier {

@Getter @Mixin private OutputHelperMixins.DetailsNoQuery outputHelper;
@Mixin private ProgressWriterFactoryMixin progressWriterFactoryMixin;

/** Subclasses declare their product-specific options mixin (SSC or FoD). */
protected abstract AbstractApplyRemediationsOptionsMixin getApplyOptions();

@Override
public final JsonNode getJsonNode() {
AbstractApplyRemediationsOptionsMixin applyOptions = getApplyOptions();
applyOptions.validate();
Set<String> issueIdFilter = AviatorIssueIdFilterUtils.normalizeIssueIds(applyOptions.getIssueIds());
try (IProgressWriter progressWriter = progressWriterFactoryMixin.create()) {
AviatorLoggerImpl logger = new AviatorLoggerImpl(progressWriter);
try (IRemediationsFprSource fprSource = openFprSource(logger, progressWriter)) {
ApplyResult result = RemediationsApplyHelper.apply(fprSource, applyOptions, issueIdFilter, logger);
return buildResultNode(fprSource, result, issueIdFilter);
}
}
}

protected abstract IRemediationsFprSource openFprSource(AviatorLoggerImpl logger, IProgressWriter progressWriter);

protected abstract JsonNode buildResultNode(IRemediationsFprSource fprSource, ApplyResult result, Set<String> issueIdFilter);

@Override
public final boolean isSingular() { return true; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright 2021-2026 Open Text.
*
* The only warranties for products and services of Open Text
* and its affiliates and licensors ("Open Text") are as may
* be set forth in the express warranty statements accompanying
* such products and services. Nothing herein should be construed
* as constituting an additional warranty. Open Text shall not be
* liable for technical or editorial errors or omissions contained
* herein. The information contained herein is subject to change
* without notice.
*/
package com.fortify.cli.aviator._common.remediations_cache;

import java.nio.file.Path;
import java.util.List;

import com.fortify.cli.aviator._common.remediations_cache.RemediationsCacheReader.ResolvedFpr;
import com.fortify.cli.common.exception.FcliBugException;

/**
* Offline remediations source: ordered FPR paths from a remediations cache zip.
* Product identity (and thus artifact vs release id) comes from the validated entry model.
*/
public final class CacheRemediationsFprSource implements IRemediationsFprSource {
private final RemediationsCacheReader reader;

private CacheRemediationsFprSource(RemediationsCacheReader reader) {
this.reader = reader;
}

public static CacheRemediationsFprSource open(Path cacheZip, String expectedProduct) {
RemediationsCacheReader reader = RemediationsCacheReader.open(cacheZip);
try {
reader.requireProduct(expectedProduct);
return new CacheRemediationsFprSource(reader);
} catch (RuntimeException e) {
reader.close();
throw e;
}
}

public RemediationsCacheReader reader() {
return reader;
}

@Override
public void forEachEntry(EntryAction action) {
List<ResolvedFpr> units = reader.getOrderedResolvedFprs();
int total = units.size();
for (int i = 0; i < total; i++) {
ResolvedFpr unit = units.get(i);
RemediationsCacheEntry entry = unit.entry();
String label = entry.getPath() != null
? entry.getPath()
: unit.fprPath().getFileName().toString();
if (!action.accept(unit.fprPath(), label, productId(entry), i + 1, total)) {
break;
}
}
}

/**
* Id for progress/result lists: artifactId (SSC) or releaseId (FoD).
* Entries are validated before resolve, so exactly one product block is present.
*/
private static String productId(RemediationsCacheEntry entry) {
if (entry.getSscData() != null) {
return entry.getSscData().getArtifactId();
}
if (entry.getFodData() != null) {
return entry.getFodData().getReleaseId();
}
throw new FcliBugException(
"Remediations cache entry missing product data after validation: " + entry.getPath());
}

@Override
public void close() {
reader.close();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright 2021-2026 Open Text.
*
* The only warranties for products and services of Open Text
* and its affiliates and licensors ("Open Text") are as may
* be set forth in the express warranty statements accompanying
* such products and services. Nothing herein should be construed
* as constituting an additional warranty. Open Text shall not be
* liable for technical or editorial errors or omissions contained
* herein. The information contained herein is subject to change
* without notice.
*/
package com.fortify.cli.aviator._common.remediations_cache;

import java.util.List;

import com.fortify.cli.aviator.fpr.utils.ISourceDecoder;

/** Abstraction over the shared apply-remediations CLI options, allowing RemediationsApplyHelper
* to remain independent of concrete Picocli types. */
public interface IApplyRemediationsOptions {
String getSourceCodeDirectory();
List<String> getIssueIds();
ISourceDecoder getSourceDecoder();
boolean isPreviewMode();
void validate();
}
Loading
Loading