diff --git a/engine/src/test/java/io/camunda/zeebe/engine/processing/deployment/DmnDeploymentTest.java b/engine/src/test/java/io/camunda/zeebe/engine/processing/deployment/DmnDeploymentTest.java index 85d42d801ace..73b363d7b1d0 100644 --- a/engine/src/test/java/io/camunda/zeebe/engine/processing/deployment/DmnDeploymentTest.java +++ b/engine/src/test/java/io/camunda/zeebe/engine/processing/deployment/DmnDeploymentTest.java @@ -44,6 +44,9 @@ public final class DmnDeploymentTest { "/dmn/decision-table-with-invalid-expression.dmn"; private static final String DMN_WITH_TWO_DECISIONS = "/dmn/drg-force-user.dmn"; + private static final String DMN_MISSING_DECISION_NAME = + "/dmn/decision-table-with-missing-decision-name.dmn"; + @Rule public final EngineRule engine = EngineRule.singlePartition(); @Rule @@ -118,6 +121,25 @@ public void shouldRejectInvalidDmnResource() { .contains("FEEL unary-tests: failed to parse expression"); } + @Test + public void shouldRejectDmnResourceWithMissingDecisionName() { + // when + final var deploymentEvent = + engine + .deployment() + .withXmlClasspathResource(DMN_MISSING_DECISION_NAME) + .expectRejection() + .deploy(); + + // then + Assertions.assertThat(deploymentEvent) + .hasIntent(DeploymentIntent.CREATE) + .hasRecordType(RecordType.COMMAND_REJECTION) + .hasRejectionType(RejectionType.INVALID_ARGUMENT); + + assertThat(deploymentEvent.getRejectionReason()).contains("because \"value\" is null"); + } + @Test public void shouldWriteDecisionRequirementsRecord() { // when diff --git a/engine/src/test/resources/dmn/decision-table-with-missing-decision-name.dmn b/engine/src/test/resources/dmn/decision-table-with-missing-decision-name.dmn new file mode 100644 index 000000000000..74c6e17cae97 --- /dev/null +++ b/engine/src/test/resources/dmn/decision-table-with-missing-decision-name.dmn @@ -0,0 +1,25 @@ + + + + + + + proposedLoan.loanRoles.percentResponsible + + + + + "Approve","Decline","Review" + + + + + + + + "Approve" + + + + + diff --git a/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRecord.java b/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRecord.java index 4e32b641ecf2..c51cef6001dd 100644 --- a/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRecord.java +++ b/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRecord.java @@ -21,15 +21,15 @@ public final class DecisionRecord extends UnifiedRecordValue implements DecisionRecordValue { - private final StringProperty decisionIdProp = new StringProperty("decisionId"); - private final StringProperty decisionNameProp = new StringProperty("decisionName"); - private final IntegerProperty versionProp = new IntegerProperty("version"); - private final LongProperty decisionKeyProp = new LongProperty("decisionKey"); + private final StringProperty decisionIdProp = new StringProperty("decisionId", ""); + private final StringProperty decisionNameProp = new StringProperty("decisionName", ""); + private final IntegerProperty versionProp = new IntegerProperty("version", -1); + private final LongProperty decisionKeyProp = new LongProperty("decisionKey", -1); private final StringProperty decisionRequirementsIdProp = - new StringProperty("decisionRequirementsId"); + new StringProperty("decisionRequirementsId", ""); private final LongProperty decisionRequirementsKeyProp = - new LongProperty("decisionRequirementsKey"); + new LongProperty("decisionRequirementsKey", -1); private final BooleanProperty isDuplicateProp = new BooleanProperty("isDuplicate", false); private final StringProperty tenantIdProp = diff --git a/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsMetadataRecord.java b/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsMetadataRecord.java index f7d32f157f29..eb2d2811a1ae 100644 --- a/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsMetadataRecord.java +++ b/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsMetadataRecord.java @@ -20,22 +20,23 @@ import io.camunda.zeebe.protocol.record.value.TenantOwned; import io.camunda.zeebe.protocol.record.value.deployment.DecisionRequirementsMetadataValue; import org.agrona.DirectBuffer; +import org.agrona.concurrent.UnsafeBuffer; public class DecisionRequirementsMetadataRecord extends UnifiedRecordValue implements DecisionRequirementsMetadataValue { private final StringProperty decisionRequirementsIdProp = - new StringProperty("decisionRequirementsId"); + new StringProperty("decisionRequirementsId", ""); private final StringProperty decisionRequirementsNameProp = - new StringProperty("decisionRequirementsName"); + new StringProperty("decisionRequirementsName", ""); private final IntegerProperty decisionRequirementsVersionProp = - new IntegerProperty("decisionRequirementsVersion"); + new IntegerProperty("decisionRequirementsVersion", -1); private final LongProperty decisionRequirementsKeyProp = - new LongProperty("decisionRequirementsKey"); - private final StringProperty namespaceProp = new StringProperty("namespace"); + new LongProperty("decisionRequirementsKey", -1); + private final StringProperty namespaceProp = new StringProperty("namespace", ""); - private final StringProperty resourceNameProp = new StringProperty("resourceName"); - private final BinaryProperty checksumProp = new BinaryProperty("checksum"); + private final StringProperty resourceNameProp = new StringProperty("resourceName", ""); + private final BinaryProperty checksumProp = new BinaryProperty("checksum", new UnsafeBuffer()); private final BooleanProperty isDuplicateProp = new BooleanProperty("isDuplicate", false); private final StringProperty tenantIdProp = diff --git a/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsRecord.java b/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsRecord.java index 651f41091d83..ee9608362cbb 100644 --- a/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsRecord.java +++ b/protocol-impl/src/main/java/io/camunda/zeebe/protocol/impl/record/value/deployment/DecisionRequirementsRecord.java @@ -19,23 +19,24 @@ import io.camunda.zeebe.protocol.record.value.TenantOwned; import io.camunda.zeebe.protocol.record.value.deployment.DecisionRequirementsRecordValue; import org.agrona.DirectBuffer; +import org.agrona.concurrent.UnsafeBuffer; public final class DecisionRequirementsRecord extends UnifiedRecordValue implements DecisionRequirementsRecordValue { private final StringProperty decisionRequirementsIdProp = - new StringProperty("decisionRequirementsId"); + new StringProperty("decisionRequirementsId", ""); private final StringProperty decisionRequirementsNameProp = - new StringProperty("decisionRequirementsName"); + new StringProperty("decisionRequirementsName", ""); private final IntegerProperty decisionRequirementsVersionProp = - new IntegerProperty("decisionRequirementsVersion"); + new IntegerProperty("decisionRequirementsVersion", -1); private final LongProperty decisionRequirementsKeyProp = - new LongProperty("decisionRequirementsKey"); + new LongProperty("decisionRequirementsKey", -1); private final StringProperty namespaceProp = new StringProperty("namespace", ""); - private final StringProperty resourceNameProp = new StringProperty("resourceName"); - private final BinaryProperty checksumProp = new BinaryProperty("checksum"); - private final BinaryProperty resourceProp = new BinaryProperty("resource"); + private final StringProperty resourceNameProp = new StringProperty("resourceName", ""); + private final BinaryProperty checksumProp = new BinaryProperty("checksum", new UnsafeBuffer()); + private final BinaryProperty resourceProp = new BinaryProperty("resource", new UnsafeBuffer()); private final StringProperty tenantIdProp = new StringProperty("tenantId", TenantOwned.DEFAULT_TENANT_IDENTIFIER);