From 4b5aa4e8d70c0a3ad31c1b78e4cfae12bbc2aca0 Mon Sep 17 00:00:00 2001 From: Mary Dickson Date: Tue, 28 Apr 2026 09:14:06 -0700 Subject: [PATCH] feat(sdk): add shorthand enum constants for policy types Add PolicyEnums utility class with readable constant aliases for verbose protobuf enum names so developers can write PolicyEnums.OPERATOR_IN instead of SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN. Constants added for SubjectMappingOperatorEnum, ConditionBooleanTypeEnum, AttributeRuleTypeEnum, and ActiveStateEnum. Examples updated to use the new shorthand via static imports. Companion to opentdf/platform#3408 (Go SDK equivalent). Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Mary Dickson --- .../io/opentdf/platform/CreateAttribute.java | 6 +- .../platform/CreateSubjectConditionSet.java | 8 +-- .../platform/CreateSubjectMapping.java | 10 +-- .../io/opentdf/platform/sdk/PolicyEnums.java | 69 +++++++++++++++++++ .../opentdf/platform/sdk/PolicyEnumsTest.java | 61 ++++++++++++++++ 5 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 sdk/src/main/java/io/opentdf/platform/sdk/PolicyEnums.java create mode 100644 sdk/src/test/java/io/opentdf/platform/sdk/PolicyEnumsTest.java diff --git a/examples/src/main/java/io/opentdf/platform/CreateAttribute.java b/examples/src/main/java/io/opentdf/platform/CreateAttribute.java index bd38a02f..7a5ddc6d 100644 --- a/examples/src/main/java/io/opentdf/platform/CreateAttribute.java +++ b/examples/src/main/java/io/opentdf/platform/CreateAttribute.java @@ -1,12 +1,12 @@ package io.opentdf.platform; import com.connectrpc.ResponseMessageKt; -import io.opentdf.platform.policy.AttributeRuleTypeEnum; import io.opentdf.platform.policy.Namespace; import io.opentdf.platform.policy.attributes.CreateAttributeRequest; import io.opentdf.platform.policy.attributes.CreateAttributeResponse; import io.opentdf.platform.policy.namespaces.GetNamespaceRequest; import io.opentdf.platform.sdk.*; +import static io.opentdf.platform.sdk.PolicyEnums.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -51,9 +51,7 @@ public static void main(String[] args) { CreateAttributeRequest.newBuilder() .setNamespaceId(namespace.getId()) .setName("test-attribute") - .setRule( - AttributeRuleTypeEnum.forNumber( - AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF_VALUE)) + .setRule(RULE_ALL_OF) .addAllValues(Arrays.asList("test1", "test2")) .build(); diff --git a/examples/src/main/java/io/opentdf/platform/CreateSubjectConditionSet.java b/examples/src/main/java/io/opentdf/platform/CreateSubjectConditionSet.java index 8d7241ea..1f1db5f1 100644 --- a/examples/src/main/java/io/opentdf/platform/CreateSubjectConditionSet.java +++ b/examples/src/main/java/io/opentdf/platform/CreateSubjectConditionSet.java @@ -2,11 +2,10 @@ import com.connectrpc.ResponseMessageKt; import io.opentdf.platform.policy.Condition; -import io.opentdf.platform.policy.ConditionBooleanTypeEnum; import io.opentdf.platform.policy.ConditionGroup; import io.opentdf.platform.policy.SubjectConditionSet; -import io.opentdf.platform.policy.SubjectMappingOperatorEnum; import io.opentdf.platform.policy.SubjectSet; +import static io.opentdf.platform.sdk.PolicyEnums.*; import io.opentdf.platform.policy.subjectmapping.CreateSubjectConditionSetRequest; import io.opentdf.platform.policy.subjectmapping.CreateSubjectConditionSetResponse; import io.opentdf.platform.policy.subjectmapping.SubjectConditionSetCreate; @@ -39,12 +38,11 @@ public static void main(String[] args) { SubjectSet.newBuilder() .addConditionGroups( ConditionGroup.newBuilder() - .setBooleanOperator(ConditionBooleanTypeEnum.CONDITION_BOOLEAN_TYPE_ENUM_AND) + .setBooleanOperator(BOOLEAN_AND) .addConditions( Condition.newBuilder() .setSubjectExternalSelectorValue(".myfield") - .setOperator( - SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN) + .setOperator(OPERATOR_IN) .addSubjectExternalValues("myvalue"))); CreateSubjectConditionSetRequest createSubjectConditionSetRequest = diff --git a/examples/src/main/java/io/opentdf/platform/CreateSubjectMapping.java b/examples/src/main/java/io/opentdf/platform/CreateSubjectMapping.java index 9a1b6657..3f00f352 100644 --- a/examples/src/main/java/io/opentdf/platform/CreateSubjectMapping.java +++ b/examples/src/main/java/io/opentdf/platform/CreateSubjectMapping.java @@ -4,13 +4,12 @@ import io.opentdf.platform.policy.Action; import io.opentdf.platform.policy.Attribute; import io.opentdf.platform.policy.Condition; -import io.opentdf.platform.policy.ConditionBooleanTypeEnum; import io.opentdf.platform.policy.ConditionGroup; import io.opentdf.platform.policy.Namespace; import io.opentdf.platform.policy.SubjectConditionSet; import io.opentdf.platform.policy.SubjectMapping; -import io.opentdf.platform.policy.SubjectMappingOperatorEnum; import io.opentdf.platform.policy.SubjectSet; +import static io.opentdf.platform.sdk.PolicyEnums.*; import io.opentdf.platform.policy.attributes.GetAttributeRequest; import io.opentdf.platform.policy.namespaces.GetNamespaceRequest; import io.opentdf.platform.policy.subjectmapping.CreateSubjectConditionSetRequest; @@ -100,14 +99,11 @@ public static void main(String[] args) { SubjectSet.newBuilder() .addConditionGroups( ConditionGroup.newBuilder() - .setBooleanOperator( - ConditionBooleanTypeEnum.CONDITION_BOOLEAN_TYPE_ENUM_AND) + .setBooleanOperator(BOOLEAN_AND) .addConditions( Condition.newBuilder() .setSubjectExternalSelectorValue(".myfield") - .setOperator( - SubjectMappingOperatorEnum - .SUBJECT_MAPPING_OPERATOR_ENUM_IN) + .setOperator(OPERATOR_IN) .addSubjectExternalValues("myvalue"))))) .build(); diff --git a/sdk/src/main/java/io/opentdf/platform/sdk/PolicyEnums.java b/sdk/src/main/java/io/opentdf/platform/sdk/PolicyEnums.java new file mode 100644 index 00000000..5c426cf8 --- /dev/null +++ b/sdk/src/main/java/io/opentdf/platform/sdk/PolicyEnums.java @@ -0,0 +1,69 @@ +package io.opentdf.platform.sdk; + +import io.opentdf.platform.common.ActiveStateEnum; +import io.opentdf.platform.policy.AttributeRuleTypeEnum; +import io.opentdf.platform.policy.ConditionBooleanTypeEnum; +import io.opentdf.platform.policy.SubjectMappingOperatorEnum; + +/** + * Shorthand constants for commonly used policy enum values. + * + *

These aliases provide a more readable alternative to the verbose protobuf + * enum names. Use them anywhere the corresponding enum type is accepted. + * + *

{@code
+ * // Before
+ * Condition.newBuilder()
+ *     .setOperator(SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN);
+ *
+ * // After (with static import)
+ * import static io.opentdf.platform.sdk.PolicyEnums.*;
+ * Condition.newBuilder()
+ *     .setOperator(OPERATOR_IN);
+ * }
+ */ +public final class PolicyEnums { + + private PolicyEnums() {} + + // --- Subject Mapping Operators --- + + public static final SubjectMappingOperatorEnum OPERATOR_IN = + SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN; + + public static final SubjectMappingOperatorEnum OPERATOR_NOT_IN = + SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_NOT_IN; + + public static final SubjectMappingOperatorEnum OPERATOR_IN_CONTAINS = + SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN_CONTAINS; + + // --- Condition Boolean Types --- + + public static final ConditionBooleanTypeEnum BOOLEAN_AND = + ConditionBooleanTypeEnum.CONDITION_BOOLEAN_TYPE_ENUM_AND; + + public static final ConditionBooleanTypeEnum BOOLEAN_OR = + ConditionBooleanTypeEnum.CONDITION_BOOLEAN_TYPE_ENUM_OR; + + // --- Attribute Rule Types --- + + public static final AttributeRuleTypeEnum RULE_ALL_OF = + AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF; + + public static final AttributeRuleTypeEnum RULE_ANY_OF = + AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_ANY_OF; + + public static final AttributeRuleTypeEnum RULE_HIERARCHY = + AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_HIERARCHY; + + // --- Active States --- + + public static final ActiveStateEnum STATE_ACTIVE = + ActiveStateEnum.ACTIVE_STATE_ENUM_ACTIVE; + + public static final ActiveStateEnum STATE_INACTIVE = + ActiveStateEnum.ACTIVE_STATE_ENUM_INACTIVE; + + public static final ActiveStateEnum STATE_ANY = + ActiveStateEnum.ACTIVE_STATE_ENUM_ANY; +} diff --git a/sdk/src/test/java/io/opentdf/platform/sdk/PolicyEnumsTest.java b/sdk/src/test/java/io/opentdf/platform/sdk/PolicyEnumsTest.java new file mode 100644 index 00000000..4136ff9b --- /dev/null +++ b/sdk/src/test/java/io/opentdf/platform/sdk/PolicyEnumsTest.java @@ -0,0 +1,61 @@ +package io.opentdf.platform.sdk; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import io.opentdf.platform.common.ActiveStateEnum; +import io.opentdf.platform.policy.AttributeRuleTypeEnum; +import io.opentdf.platform.policy.ConditionBooleanTypeEnum; +import io.opentdf.platform.policy.SubjectMappingOperatorEnum; +import org.junit.jupiter.api.Test; + +class PolicyEnumsTest { + + @Test + void operatorConstants() { + assertEquals( + SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN, + PolicyEnums.OPERATOR_IN); + assertEquals( + SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_NOT_IN, + PolicyEnums.OPERATOR_NOT_IN); + assertEquals( + SubjectMappingOperatorEnum.SUBJECT_MAPPING_OPERATOR_ENUM_IN_CONTAINS, + PolicyEnums.OPERATOR_IN_CONTAINS); + } + + @Test + void booleanConstants() { + assertEquals( + ConditionBooleanTypeEnum.CONDITION_BOOLEAN_TYPE_ENUM_AND, + PolicyEnums.BOOLEAN_AND); + assertEquals( + ConditionBooleanTypeEnum.CONDITION_BOOLEAN_TYPE_ENUM_OR, + PolicyEnums.BOOLEAN_OR); + } + + @Test + void ruleConstants() { + assertEquals( + AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF, + PolicyEnums.RULE_ALL_OF); + assertEquals( + AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_ANY_OF, + PolicyEnums.RULE_ANY_OF); + assertEquals( + AttributeRuleTypeEnum.ATTRIBUTE_RULE_TYPE_ENUM_HIERARCHY, + PolicyEnums.RULE_HIERARCHY); + } + + @Test + void stateConstants() { + assertEquals( + ActiveStateEnum.ACTIVE_STATE_ENUM_ACTIVE, + PolicyEnums.STATE_ACTIVE); + assertEquals( + ActiveStateEnum.ACTIVE_STATE_ENUM_INACTIVE, + PolicyEnums.STATE_INACTIVE); + assertEquals( + ActiveStateEnum.ACTIVE_STATE_ENUM_ANY, + PolicyEnums.STATE_ANY); + } +}