From a865bf49084ea4bffc8aae8e3b5faa5ff9a9c579 Mon Sep 17 00:00:00 2001 From: David Waltermire Date: Thu, 23 Apr 2026 01:13:51 -0400 Subject: [PATCH 1/5] refactor: introduce IControlSelection/IControlMatching common interfaces OSCAL's select-control-by-id and matching assemblies have the same shape in both the profile and mapping-common modules, and the generator consolidates them into a single ProfileMatching/ProfileSelectControlById class. Introduce common interfaces so consumer code can use a neutral type instead of profile-specific names: - IControlSelection: getWithChildControls, getWithIds, getMatching - IControlMatching: getPattern - IProfileSelectControlById now extends IControlSelection with a covariant getMatching() returning List - AbstractProfileMatching implements IControlMatching, wired to the matching binding via extend-base-class --- .../lib/model/control/IControlMatching.java | 12 ++++++++++++ .../lib/model/control/IControlSelection.java | 18 ++++++++++++++++++ .../profile/AbstractProfileMatching.java | 11 +++++++++++ .../profile/IProfileSelectControlById.java | 8 +++----- .../oscal-metaschema-bindings.xml | 1 + 5 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java create mode 100644 src/main/java/dev/metaschema/oscal/lib/model/control/IControlSelection.java create mode 100644 src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java new file mode 100644 index 00000000..ca350ae1 --- /dev/null +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: none + * SPDX-License-Identifier: CC0-1.0 + */ + +package dev.metaschema.oscal.lib.model.control; + +public interface IControlMatching { + + String getPattern(); + +} diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/IControlSelection.java b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlSelection.java new file mode 100644 index 00000000..2dab7c46 --- /dev/null +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlSelection.java @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: none + * SPDX-License-Identifier: CC0-1.0 + */ + +package dev.metaschema.oscal.lib.model.control; + +import java.util.List; + +public interface IControlSelection { + + String getWithChildControls(); + + List getWithIds(); + + List getMatching(); + +} diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java new file mode 100644 index 00000000..0eb14bbd --- /dev/null +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: none + * SPDX-License-Identifier: CC0-1.0 + */ + +package dev.metaschema.oscal.lib.model.control.profile; + +import dev.metaschema.oscal.lib.model.control.IControlMatching; + +public abstract class AbstractProfileMatching implements IControlMatching { +} diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java index be598dfb..f0636c0b 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java @@ -8,13 +8,11 @@ import java.util.List; import dev.metaschema.oscal.lib.model.ProfileMatching; +import dev.metaschema.oscal.lib.model.control.IControlSelection; -public interface IProfileSelectControlById { - - String getWithChildControls(); - - List getWithIds(); +public interface IProfileSelectControlById extends IControlSelection { + @Override List getMatching(); } diff --git a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml index 86314b9b..b620c20d 100644 --- a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml +++ b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml @@ -65,6 +65,7 @@ ProfileMatching + dev.metaschema.oscal.lib.model.control.profile.AbstractProfileMatching From de7ec52c8c816e7d593141c06d7072108c12224e Mon Sep 17 00:00:00 2001 From: David Waltermire Date: Thu, 23 Apr 2026 01:32:38 -0400 Subject: [PATCH 2/5] refactor: rename shared/assessment select-control-by-id classes Rename the generated select-control-by-id classes in the binding config to reflect which OSCAL module each originates from, making the profile/mapping vs assessment distinction explicit: - ProfileSelectControlById -> ControlCommonSelectControlById (used by profile's InsertControls and mapping's GapSummary; generated from oscal_control-common_metaschema.xml) - SelectControlById -> AssessmentCommonSelectControlById (used by assessment-plan/assessment-results' ReviewedControls; generated from oscal_assessment-common_metaschema.xml, added as a new binding) Rename the hand-written supporting types in lockstep: - IProfileSelectControlById -> IControlCommonSelectControlById - AbstractProfileSelectControlById -> AbstractControlCommonSelectControlById Consumer references updated in IControlFilter, DefaultControlSelectionFilter, and their tests. --- ...a => AbstractControlCommonSelectControlById.java} | 8 ++++---- ...yId.java => IControlCommonSelectControlById.java} | 2 +- .../selection/DefaultControlSelectionFilter.java | 6 +++--- .../profile/resolver/selection/IControlFilter.java | 6 +++--- .../oscal-metaschema-bindings.xml | 12 ++++++++++-- .../selection/DefaultControlSelectionFilterTest.java | 6 +++--- .../lib/profile/resolver/selection/ImportTest.java | 4 ++-- 7 files changed, 26 insertions(+), 18 deletions(-) rename src/main/java/dev/metaschema/oscal/lib/model/control/profile/{AbstractProfileSelectControlById.java => AbstractControlCommonSelectControlById.java} (84%) rename src/main/java/dev/metaschema/oscal/lib/model/control/profile/{IProfileSelectControlById.java => IControlCommonSelectControlById.java} (81%) diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileSelectControlById.java b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractControlCommonSelectControlById.java similarity index 84% rename from src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileSelectControlById.java rename to src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractControlCommonSelectControlById.java index 76f5c74e..71b9319e 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileSelectControlById.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractControlCommonSelectControlById.java @@ -11,11 +11,11 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import dev.metaschema.oscal.lib.model.ControlCommonSelectControlById; import dev.metaschema.oscal.lib.model.ProfileMatching; -import dev.metaschema.oscal.lib.model.ProfileSelectControlById; import edu.umd.cs.findbugs.annotations.NonNull; -public abstract class AbstractProfileSelectControlById implements IProfileSelectControlById { +public abstract class AbstractControlCommonSelectControlById implements IControlCommonSelectControlById { // TODO: move implementation from profile resolver selection code here @NonNull @@ -53,8 +53,8 @@ public Builder matching(@NonNull Pattern pattern) { } @NonNull - public ProfileSelectControlById build() { - ProfileSelectControlById retval = new ProfileSelectControlById(); + public ControlCommonSelectControlById build() { + ControlCommonSelectControlById retval = new ControlCommonSelectControlById(); retval.setWithChildControls(withChildControls ? "yes" : "no"); retval.setWithIds(withIds); retval.setMatching(matching.stream() diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IControlCommonSelectControlById.java similarity index 81% rename from src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java rename to src/main/java/dev/metaschema/oscal/lib/model/control/profile/IControlCommonSelectControlById.java index f0636c0b..04b6b82d 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IProfileSelectControlById.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IControlCommonSelectControlById.java @@ -10,7 +10,7 @@ import dev.metaschema.oscal.lib.model.ProfileMatching; import dev.metaschema.oscal.lib.model.control.IControlSelection; -public interface IProfileSelectControlById extends IControlSelection { +public interface IControlCommonSelectControlById extends IControlSelection { @Override List getMatching(); diff --git a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java index 9649cca6..1035e085 100644 --- a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java +++ b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java @@ -19,7 +19,7 @@ import dev.metaschema.core.util.ObjectUtils; import dev.metaschema.oscal.lib.model.ProfileMatching; import dev.metaschema.oscal.lib.model.control.catalog.IControl; -import dev.metaschema.oscal.lib.model.control.profile.IProfileSelectControlById; +import dev.metaschema.oscal.lib.model.control.profile.IControlCommonSelectControlById; import dev.metaschema.oscal.lib.profile.resolver.ProfileResolutionEvaluationException; import edu.umd.cs.findbugs.annotations.NonNull; @@ -37,7 +37,7 @@ public class DefaultControlSelectionFilter implements IControlSelectionFilter { * a list of select criteria */ @SuppressWarnings("null") - public DefaultControlSelectionFilter(@NonNull List selections) { + public DefaultControlSelectionFilter(@NonNull List selections) { this.selections = selections.stream() // ignore null entries .filter(Objects::nonNull) @@ -132,7 +132,7 @@ private static class Selection { private final Set identifiers; private final List patterns; - public Selection(IProfileSelectControlById selection) { + public Selection(IControlCommonSelectControlById selection) { // process with-child-controls // default is "no" this.withChildControls = "yes".equals(selection.getWithChildControls()); diff --git a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java index c9fcfba8..4feea3ef 100644 --- a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java +++ b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java @@ -13,7 +13,7 @@ import dev.metaschema.oscal.lib.model.IncludeAll; import dev.metaschema.oscal.lib.model.ProfileImport; import dev.metaschema.oscal.lib.model.control.catalog.IControl; -import dev.metaschema.oscal.lib.model.control.profile.IProfileSelectControlById; +import dev.metaschema.oscal.lib.model.control.profile.IControlCommonSelectControlById; import edu.umd.cs.findbugs.annotations.NonNull; public interface IControlFilter { @@ -127,7 +127,7 @@ public Filter(@NonNull ProfileImport profileImport) { IncludeAll includeAll = profileImport.getIncludeAll(); if (includeAll == null) { - List includeSelections = profileImport.getIncludeControls(); + List includeSelections = profileImport.getIncludeControls(); if (includeSelections.isEmpty()) { this.inclusionFilter = IControlSelectionFilter.NONE_MATCH; } else { @@ -137,7 +137,7 @@ public Filter(@NonNull ProfileImport profileImport) { this.inclusionFilter = IControlSelectionFilter.ALL_MATCH; } - List excludeSelections = profileImport.getExcludeControls(); + List excludeSelections = profileImport.getExcludeControls(); if (excludeSelections.isEmpty()) { this.exclusionFilter = IControlSelectionFilter.NONE_MATCH; } else { diff --git a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml index b620c20d..f5ef3d8b 100644 --- a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml +++ b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml @@ -58,8 +58,8 @@ - ProfileSelectControlById - dev.metaschema.oscal.lib.model.control.profile.AbstractProfileSelectControlById + ControlCommonSelectControlById + dev.metaschema.oscal.lib.model.control.profile.AbstractControlCommonSelectControlById @@ -159,6 +159,14 @@ + + + + AssessmentCommonSelectControlById + + + diff --git a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java index 321c67ed..bad78a23 100644 --- a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java +++ b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java @@ -22,7 +22,7 @@ import dev.metaschema.core.util.ObjectUtils; import dev.metaschema.oscal.lib.model.ProfileMatching; import dev.metaschema.oscal.lib.model.control.catalog.IControl; -import dev.metaschema.oscal.lib.model.control.profile.IProfileSelectControlById; +import dev.metaschema.oscal.lib.model.control.profile.IControlCommonSelectControlById; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -35,13 +35,13 @@ class DefaultControlSelectionFilterTest { }; @Mock - private IProfileSelectControlById selectControlByIdA; + private IControlCommonSelectControlById selectControlByIdA; @Mock private ProfileMatching matchingA; @Mock private ProfileMatching matchingB; @Mock - private IProfileSelectControlById selectControlByIdB; + private IControlCommonSelectControlById selectControlByIdB; @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT") @NonNull diff --git a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java index 8edf53d3..0a562b62 100644 --- a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java +++ b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java @@ -25,7 +25,7 @@ import dev.metaschema.oscal.lib.model.Profile; import dev.metaschema.oscal.lib.model.ProfileImport; import dev.metaschema.oscal.lib.model.control.catalog.AbstractControl; -import dev.metaschema.oscal.lib.model.control.profile.AbstractProfileSelectControlById; +import dev.metaschema.oscal.lib.model.control.profile.AbstractControlCommonSelectControlById; import dev.metaschema.oscal.lib.profile.resolver.ProfileResolutionException; import edu.umd.cs.findbugs.annotations.NonNull; @@ -59,7 +59,7 @@ void test() throws ProfileResolutionException { ProfileImport profileImport = new ProfileImport(); profileImport.setIncludeAll(new IncludeAll()); profileImport.setExcludeControls(Collections.singletonList( - AbstractProfileSelectControlById.builder() + AbstractControlCommonSelectControlById.builder() .withId("control1") .build())); profileImport.setHref(cwd); From ef644ff8015fe56a1b9cc6fc66f8af9eb3286d38 Mon Sep 17 00:00:00 2001 From: David Waltermire Date: Thu, 23 Apr 2026 01:35:15 -0400 Subject: [PATCH 3/5] refactor: move control-common select types up from profile package IControlCommonSelectControlById and AbstractControlCommonSelectControlById are no longer profile-specific (they cover control-common-defined types shared between profile and mapping-common). Move them up from dev.metaschema.oscal.lib.model.control.profile to dev.metaschema.oscal.lib.model.control so the package placement matches the naming. Updates the binding's extend-base-class reference and all consumer imports. --- .../{profile => }/AbstractControlCommonSelectControlById.java | 2 +- .../control/{profile => }/IControlCommonSelectControlById.java | 3 +-- .../resolver/selection/DefaultControlSelectionFilter.java | 2 +- .../oscal/lib/profile/resolver/selection/IControlFilter.java | 2 +- src/main/metaschema-bindings/oscal-metaschema-bindings.xml | 2 +- .../resolver/selection/DefaultControlSelectionFilterTest.java | 2 +- .../oscal/lib/profile/resolver/selection/ImportTest.java | 2 +- 7 files changed, 7 insertions(+), 8 deletions(-) rename src/main/java/dev/metaschema/oscal/lib/model/control/{profile => }/AbstractControlCommonSelectControlById.java (97%) rename src/main/java/dev/metaschema/oscal/lib/model/control/{profile => }/IControlCommonSelectControlById.java (70%) diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractControlCommonSelectControlById.java b/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlCommonSelectControlById.java similarity index 97% rename from src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractControlCommonSelectControlById.java rename to src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlCommonSelectControlById.java index 71b9319e..21beb221 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractControlCommonSelectControlById.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlCommonSelectControlById.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: CC0-1.0 */ -package dev.metaschema.oscal.lib.model.control.profile; +package dev.metaschema.oscal.lib.model.control; import java.util.Collection; import java.util.LinkedList; diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IControlCommonSelectControlById.java b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlCommonSelectControlById.java similarity index 70% rename from src/main/java/dev/metaschema/oscal/lib/model/control/profile/IControlCommonSelectControlById.java rename to src/main/java/dev/metaschema/oscal/lib/model/control/IControlCommonSelectControlById.java index 04b6b82d..bb65a99c 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/IControlCommonSelectControlById.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlCommonSelectControlById.java @@ -3,12 +3,11 @@ * SPDX-License-Identifier: CC0-1.0 */ -package dev.metaschema.oscal.lib.model.control.profile; +package dev.metaschema.oscal.lib.model.control; import java.util.List; import dev.metaschema.oscal.lib.model.ProfileMatching; -import dev.metaschema.oscal.lib.model.control.IControlSelection; public interface IControlCommonSelectControlById extends IControlSelection { diff --git a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java index 1035e085..608d9b67 100644 --- a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java +++ b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilter.java @@ -18,8 +18,8 @@ import dev.metaschema.core.util.ObjectUtils; import dev.metaschema.oscal.lib.model.ProfileMatching; +import dev.metaschema.oscal.lib.model.control.IControlCommonSelectControlById; import dev.metaschema.oscal.lib.model.control.catalog.IControl; -import dev.metaschema.oscal.lib.model.control.profile.IControlCommonSelectControlById; import dev.metaschema.oscal.lib.profile.resolver.ProfileResolutionEvaluationException; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java index 4feea3ef..0f0f669f 100644 --- a/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java +++ b/src/main/java/dev/metaschema/oscal/lib/profile/resolver/selection/IControlFilter.java @@ -12,8 +12,8 @@ import dev.metaschema.core.util.ObjectUtils; import dev.metaschema.oscal.lib.model.IncludeAll; import dev.metaschema.oscal.lib.model.ProfileImport; +import dev.metaschema.oscal.lib.model.control.IControlCommonSelectControlById; import dev.metaschema.oscal.lib.model.control.catalog.IControl; -import dev.metaschema.oscal.lib.model.control.profile.IControlCommonSelectControlById; import edu.umd.cs.findbugs.annotations.NonNull; public interface IControlFilter { diff --git a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml index f5ef3d8b..8a53d8f5 100644 --- a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml +++ b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml @@ -59,7 +59,7 @@ ControlCommonSelectControlById - dev.metaschema.oscal.lib.model.control.profile.AbstractControlCommonSelectControlById + dev.metaschema.oscal.lib.model.control.AbstractControlCommonSelectControlById diff --git a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java index bad78a23..82857c52 100644 --- a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java +++ b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/DefaultControlSelectionFilterTest.java @@ -21,8 +21,8 @@ import dev.metaschema.core.util.ObjectUtils; import dev.metaschema.oscal.lib.model.ProfileMatching; +import dev.metaschema.oscal.lib.model.control.IControlCommonSelectControlById; import dev.metaschema.oscal.lib.model.control.catalog.IControl; -import dev.metaschema.oscal.lib.model.control.profile.IControlCommonSelectControlById; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; diff --git a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java index 0a562b62..1ed434cb 100644 --- a/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java +++ b/src/test/java/dev/metaschema/oscal/lib/profile/resolver/selection/ImportTest.java @@ -24,8 +24,8 @@ import dev.metaschema.oscal.lib.model.IncludeAll; import dev.metaschema.oscal.lib.model.Profile; import dev.metaschema.oscal.lib.model.ProfileImport; +import dev.metaschema.oscal.lib.model.control.AbstractControlCommonSelectControlById; import dev.metaschema.oscal.lib.model.control.catalog.AbstractControl; -import dev.metaschema.oscal.lib.model.control.profile.AbstractControlCommonSelectControlById; import dev.metaschema.oscal.lib.profile.resolver.ProfileResolutionException; import edu.umd.cs.findbugs.annotations.NonNull; From 43f5507529a41aa83c9664120bf50e10aac02c28 Mon Sep 17 00:00:00 2001 From: David Waltermire Date: Thu, 23 Apr 2026 01:38:29 -0400 Subject: [PATCH 4/5] refactor: rename AbstractProfileMatching to AbstractControlMatching The abstract base class applies to the control-common-defined matching assembly used by both profile and mapping-common, so the profile-specific name was misleading. Rename and move up to dev.metaschema.oscal.lib.model.control to match the IControlMatching interface's package and the sibling AbstractControlCommonSelectControlById placement. --- .../lib/model/control/AbstractControlMatching.java | 9 +++++++++ .../control/profile/AbstractProfileMatching.java | 11 ----------- .../metaschema-bindings/oscal-metaschema-bindings.xml | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) create mode 100644 src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java delete mode 100644 src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java b/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java new file mode 100644 index 00000000..26c5f87f --- /dev/null +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: none + * SPDX-License-Identifier: CC0-1.0 + */ + +package dev.metaschema.oscal.lib.model.control; + +public abstract class AbstractControlMatching implements IControlMatching { +} diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java b/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java deleted file mode 100644 index 0eb14bbd..00000000 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/profile/AbstractProfileMatching.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * SPDX-FileCopyrightText: none - * SPDX-License-Identifier: CC0-1.0 - */ - -package dev.metaschema.oscal.lib.model.control.profile; - -import dev.metaschema.oscal.lib.model.control.IControlMatching; - -public abstract class AbstractProfileMatching implements IControlMatching { -} diff --git a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml index 8a53d8f5..ff24a600 100644 --- a/src/main/metaschema-bindings/oscal-metaschema-bindings.xml +++ b/src/main/metaschema-bindings/oscal-metaschema-bindings.xml @@ -65,7 +65,7 @@ ProfileMatching - dev.metaschema.oscal.lib.model.control.profile.AbstractProfileMatching + dev.metaschema.oscal.lib.model.control.AbstractControlMatching From 315aa282cc21b837449ab41d186e45c4b871f872 Mon Sep 17 00:00:00 2001 From: David Waltermire Date: Thu, 23 Apr 2026 01:45:36 -0400 Subject: [PATCH 5/5] fix(pmd): add protected constructor and suppress implicit functional interface Satisfies the pmd-verify step in the Website CI job: - AbstractControlMatching: add protected no-arg constructor (AbstractClassWithoutAnyMethod) - IControlMatching: add @SuppressWarnings(PMD.ImplicitFunctionalInterface) since the interface is implemented by generated bean classes, not intended as a lambda target --- .../oscal/lib/model/control/AbstractControlMatching.java | 3 +++ .../metaschema/oscal/lib/model/control/IControlMatching.java | 1 + 2 files changed, 4 insertions(+) diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java b/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java index 26c5f87f..a52b4028 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/AbstractControlMatching.java @@ -6,4 +6,7 @@ package dev.metaschema.oscal.lib.model.control; public abstract class AbstractControlMatching implements IControlMatching { + protected AbstractControlMatching() { + // base class for generated matching bindings + } } diff --git a/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java index ca350ae1..b798b50c 100644 --- a/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java +++ b/src/main/java/dev/metaschema/oscal/lib/model/control/IControlMatching.java @@ -5,6 +5,7 @@ package dev.metaschema.oscal.lib.model.control; +@SuppressWarnings("PMD.ImplicitFunctionalInterface") public interface IControlMatching { String getPattern();