From ad1c49a56835a2bb5d1ac891c1c62ed1d18a6e85 Mon Sep 17 00:00:00 2001 From: Jonas Blatt <jonasblatt@uni-koblenz.de> Date: Sat, 14 Sep 2019 19:09:16 +0200 Subject: [PATCH] First try for DMN Parser --- .../de/unikoblenz/fgbks/api/test/TestApi.java | 7 ++- .../fgbks/base/builder/DefaultBuilder.java | 4 +- .../fgbks/core/dmn/domain/ids/AbstractId.java | 5 ++ .../core/dmn/domain/ids/DefinitionId.java | 12 ++++ .../core/dmn/domain/values/VDmnDecision.java | 5 +- .../dmn/domain/values/VDmnDefinition.java | 11 ++++ .../domain/values/impl/VDmnDecisionImpl.java | 33 +++++++---- .../values/impl/VDmnDefinitionImpl.java | 57 +++++++++++++++++++ .../parser/DmnModelInstanceWrapper.java | 9 +++ .../domain/values/parser/SimpleParser.java | 29 ++++++++++ .../core/dmn/utils/DmnObjectContainer.java | 40 +++++++++++++ .../fgbks/core/dmn/utils/DmnService.java | 25 +++----- .../dmn/verification/VerificationService.java | 4 ++ 13 files changed, 208 insertions(+), 33 deletions(-) create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/DefinitionId.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDefinition.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDefinitionImpl.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/DmnModelInstanceWrapper.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/SimpleParser.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnObjectContainer.java diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java index 32e8965f..3fc96655 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java @@ -1,5 +1,6 @@ package de.unikoblenz.fgbks.api.test; +import de.unikoblenz.fgbks.core.dmn.utils.DmnObjectContainer; import de.unikoblenz.fgbks.core.dmn.utils.DmnService; import de.unikoblenz.fgbks.core.dmn.verification.VerificationService; import javax.inject.Inject; @@ -18,6 +19,8 @@ public class TestApi { private static Logger LOGGER = LoggerFactory.getLogger(TestApi.class.getSimpleName()); + @Inject private DmnService dmnService; + @Inject private VerificationService verificationService; @GET @@ -31,8 +34,8 @@ public class TestApi { @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.TEXT_XML) public String xx(String payload) { - DmnService dmnService = DmnService.getDmnServiceFromXml(payload); - dmnService.x(); + DmnObjectContainer container = dmnService.getDmnServiceFromXml(payload); + container.x(); return "yes"; } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/builder/DefaultBuilder.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/builder/DefaultBuilder.java index 26397bf9..59bbb7d6 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/builder/DefaultBuilder.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/builder/DefaultBuilder.java @@ -2,6 +2,7 @@ package de.unikoblenz.fgbks.base.builder; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -51,7 +52,8 @@ public class DefaultBuilder<E> extends AbstractBuilder<E, DefaultBuilder<E>> { @Override protected E newInstance() { Class<?> directSubclass = getClass(); - while (directSubclass.getSuperclass() != DefaultBuilder.class) { + while (directSubclass.getSuperclass() != DefaultBuilder.class + && !Modifier.isAbstract(directSubclass.getSuperclass().getModifiers())) { directSubclass = directSubclass.getSuperclass(); } Type genericSuperclass = directSubclass.getGenericSuperclass(); diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/AbstractId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/AbstractId.java index e97c5081..eaa62aaa 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/AbstractId.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/AbstractId.java @@ -16,4 +16,9 @@ public abstract class AbstractId extends AbstractStringValueObject { protected Integer getMaxLength() { return 100; } + + @Override + public String toString() { + return this.getClassName() + ": " + this.getValue(); + } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/DefinitionId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/DefinitionId.java new file mode 100644 index 00000000..9a35b398 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/ids/DefinitionId.java @@ -0,0 +1,12 @@ +package de.unikoblenz.fgbks.core.dmn.domain.ids; + +public class DefinitionId extends AbstractId { + + public DefinitionId(DefinitionId initialValue) { + this(initialValue.getValue()); + } + + public DefinitionId(String initialValue) { + super(initialValue); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDecision.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDecision.java index f908e84b..7abff8a0 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDecision.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDecision.java @@ -1,11 +1,12 @@ package de.unikoblenz.fgbks.core.dmn.domain.values; import de.unikoblenz.fgbks.core.dmn.domain.ids.DecisionId; -import java.util.List; public interface VDmnDecision extends VDmnElement { + VDmnDefinition getDmnDefinition(); + DecisionId getDecisionId(); - List<VDmnDecisionTable> getDmnDecisionTables(); + VDmnDecisionTable getDmnDecisionTable(); } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDefinition.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDefinition.java new file mode 100644 index 00000000..d911997f --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/VDmnDefinition.java @@ -0,0 +1,11 @@ +package de.unikoblenz.fgbks.core.dmn.domain.values; + +import de.unikoblenz.fgbks.core.dmn.domain.ids.DefinitionId; +import java.util.List; + +public interface VDmnDefinition extends VDmnElement { + + DefinitionId getDefinitionId(); + + List<VDmnDecision> getDmnDecisions(); +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDecisionImpl.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDecisionImpl.java index 1995c88c..62d955b6 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDecisionImpl.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDecisionImpl.java @@ -3,18 +3,20 @@ package de.unikoblenz.fgbks.core.dmn.domain.values.impl; import de.unikoblenz.fgbks.core.dmn.domain.ids.DecisionId; import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDecision; import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDecisionTable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDefinition; import org.apache.commons.lang3.Validate; public class VDmnDecisionImpl implements VDmnDecision { + private VDmnDefinition dmnDefinition; private DecisionId decisionId; - private List<VDmnDecisionTable> dmnDecisionTables; + private VDmnDecisionTable dmnDecisionTable; - private VDmnDecisionImpl() { - dmnDecisionTables = new ArrayList<>(); + private VDmnDecisionImpl() {} + + @Override + public VDmnDefinition getDmnDefinition() { + return dmnDefinition; } @Override @@ -23,8 +25,8 @@ public class VDmnDecisionImpl implements VDmnDecision { } @Override - public List<VDmnDecisionTable> getDmnDecisionTables() { - return Collections.unmodifiableList(dmnDecisionTables); + public VDmnDecisionTable getDmnDecisionTable() { + return dmnDecisionTable; } public static Builder getBuilder() { @@ -33,19 +35,24 @@ public class VDmnDecisionImpl implements VDmnDecision { public class Builder extends DmnElementBuilder<VDmnDecisionImpl> { + public Builder withDmnDefinition(VDmnDefinition dmnDefinition) { + value.dmnDefinition = dmnDefinition; + return this; + } + public Builder withDecisionId(DecisionId decisionId) { value.decisionId = decisionId; return this; } - public Builder addDmnDecisionTable(VDmnDecisionTable dmnDecisionTable) { - value.dmnDecisionTables.add(Validate.notNull(dmnDecisionTable)); + public Builder withDmnDecisionTable(VDmnDecisionTable dmnDecisionTable) { + value.dmnDecisionTable = dmnDecisionTable; return this; } - public Builder addDmnDecisionTableFromBuilder( + public Builder withDmnDecisionTableFromBuilder( VDmnDecisionTableImpl.Builder dmnDecisionTableBuilder) { - addDmnDecisionTable(dmnDecisionTableBuilder.getUnbuildValue()); + withDmnDecisionTable(dmnDecisionTableBuilder.getUnbuildValue()); dmnDecisionTableBuilder.withDmnDecision(value); return this; } @@ -53,7 +60,9 @@ public class VDmnDecisionImpl implements VDmnDecision { @Override protected void validate() { super.validate(); + Validate.notNull(value.dmnDefinition); Validate.notNull(value.decisionId); + Validate.notNull(value.dmnDecisionTable); } } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDefinitionImpl.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDefinitionImpl.java new file mode 100644 index 00000000..a54dcfde --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/impl/VDmnDefinitionImpl.java @@ -0,0 +1,57 @@ +package de.unikoblenz.fgbks.core.dmn.domain.values.impl; + +import de.unikoblenz.fgbks.core.dmn.domain.ids.DefinitionId; +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDecision; +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDefinition; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.Validate; + +public class VDmnDefinitionImpl implements VDmnDefinition { + + private DefinitionId definitionId; + private List<VDmnDecision> dmnDecisions; + + private VDmnDefinitionImpl() { + dmnDecisions = new ArrayList<>(); + } + + @Override + public DefinitionId getDefinitionId() { + return definitionId; + } + + @Override + public List<VDmnDecision> getDmnDecisions() { + return dmnDecisions; + } + + public static Builder getBuilder() { + return new VDmnDefinitionImpl().new Builder(); + } + + public class Builder extends DmnElementBuilder<VDmnDefinitionImpl> { + + public Builder withDefinitionId(DefinitionId definitionId) { + value.definitionId = definitionId; + return this; + } + + public Builder addDmnDecision(VDmnDecision dmnDecision) { + value.dmnDecisions.add(Validate.notNull(dmnDecision)); + return this; + } + + public Builder addDmnDecisionFromBuilder(VDmnDecisionImpl.Builder dmnDecisionBuilder) { + addDmnDecision(dmnDecisionBuilder.getUnbuildValue()); + dmnDecisionBuilder.withDmnDefinition(value); + return this; + } + + @Override + protected void validate() { + super.validate(); + Validate.notNull(value.definitionId); + } + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/DmnModelInstanceWrapper.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/DmnModelInstanceWrapper.java new file mode 100644 index 00000000..1169ea35 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/DmnModelInstanceWrapper.java @@ -0,0 +1,9 @@ +package de.unikoblenz.fgbks.core.dmn.domain.values.parser; + +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDefinition; +import org.camunda.bpm.model.dmn.DmnModelInstance; + +public interface DmnModelInstanceWrapper { + + VDmnDefinition getVDmnDefinition(DmnModelInstance dmnModelInstance); +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/SimpleParser.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/SimpleParser.java new file mode 100644 index 00000000..224df4ab --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/values/parser/SimpleParser.java @@ -0,0 +1,29 @@ +package de.unikoblenz.fgbks.core.dmn.domain.values.parser; + +import de.unikoblenz.fgbks.core.dmn.domain.ids.DecisionId; +import de.unikoblenz.fgbks.core.dmn.domain.ids.DefinitionId; +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDefinition; +import de.unikoblenz.fgbks.core.dmn.domain.values.impl.VDmnDecisionImpl; +import de.unikoblenz.fgbks.core.dmn.domain.values.impl.VDmnDefinitionImpl; +import javax.inject.Singleton; +import org.camunda.bpm.model.dmn.DmnModelInstance; +import org.camunda.bpm.model.dmn.instance.Decision; + +@Singleton +public class SimpleParser implements DmnModelInstanceWrapper { + + @Override + public VDmnDefinition getVDmnDefinition(DmnModelInstance dmnModel) { + VDmnDefinitionImpl.Builder definitionBuilder = + VDmnDefinitionImpl.getBuilder() + .withDefinitionId(new DefinitionId(dmnModel.getDefinitions().getId())); + for (Decision x : dmnModel.getModelElementsByType(Decision.class)) { + VDmnDecisionImpl.Builder vDmnDecisionBuilder = + VDmnDecisionImpl.getBuilder().withDecisionId(new DecisionId(x.getId())); + definitionBuilder.addDmnDecisionFromBuilder(vDmnDecisionBuilder); + + x.getId(); + } + return definitionBuilder.build(); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnObjectContainer.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnObjectContainer.java new file mode 100644 index 00000000..171a0126 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnObjectContainer.java @@ -0,0 +1,40 @@ +package de.unikoblenz.fgbks.core.dmn.utils; + +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDefinition; +import java.util.List; +import org.camunda.bpm.dmn.engine.DmnDecision; +import org.camunda.bpm.model.dmn.DmnModelInstance; +import org.camunda.bpm.model.dmn.instance.Decision; + +public class DmnObjectContainer { + + private final List<DmnDecision> dmnDecisions; + private final DmnModelInstance dmnModel; + private final VDmnDefinition vDmnDefinition; + + public List<DmnDecision> getDmnDecisions() { + return dmnDecisions; + } + + public DmnModelInstance getDmnModel() { + return dmnModel; + } + + public VDmnDefinition getvDmnDefinition() { + return vDmnDefinition; + } + + public DmnObjectContainer( + List<DmnDecision> dmnDecisions, DmnModelInstance dmnModel, VDmnDefinition vDmnDefinition) { + this.dmnDecisions = dmnDecisions; + this.dmnModel = dmnModel; + this.vDmnDefinition = vDmnDefinition; + } + + // TODO: delete! + public void x() { + dmnModel.getModelElementsByType(Decision.class).stream() + .map(a -> a.getId()) + .forEach(System.out::println); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java index 3d970676..7a55bd9c 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java @@ -1,20 +1,23 @@ package de.unikoblenz.fgbks.core.dmn.utils; +import de.unikoblenz.fgbks.core.dmn.domain.values.VDmnDefinition; +import de.unikoblenz.fgbks.core.dmn.domain.values.parser.SimpleParser; import java.nio.charset.Charset; import java.util.List; +import javax.inject.Inject; +import javax.inject.Singleton; import org.apache.commons.io.IOUtils; import org.camunda.bpm.dmn.engine.DmnDecision; import org.camunda.bpm.dmn.engine.DmnEngineConfiguration; import org.camunda.bpm.model.dmn.DmnModelInstance; import org.camunda.bpm.model.dmn.impl.DmnParser; -import org.camunda.bpm.model.dmn.instance.Decision; +@Singleton public class DmnService { - private final List<DmnDecision> dmnDecisions; - private final DmnModelInstance dmnModel; + @Inject SimpleParser simpleDmnParser; - public static DmnService getDmnServiceFromXml(String dmnXmlString) { + public DmnObjectContainer getDmnServiceFromXml(String dmnXmlString) { List<DmnDecision> dmnDecisions = DmnEngineConfiguration.createDefaultDmnEngineConfiguration() .buildEngine() @@ -23,17 +26,7 @@ public class DmnService { new DmnParser() .parseModelFromStream(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset())); - return new DmnService(dmnDecisions, dmnModel); - } - - private DmnService(List<DmnDecision> dmnDecisionsDmnModelInstance, DmnModelInstance dmnModel) { - this.dmnModel = dmnModel; - this.dmnDecisions = dmnDecisionsDmnModelInstance; - } - - public void x() { - dmnModel.getModelElementsByType(Decision.class).stream() - .map(a -> a.getId()) - .forEach(System.out::println); + VDmnDefinition vDmnDefinition = simpleDmnParser.getVDmnDefinition(dmnModel); + return new DmnObjectContainer(dmnDecisions, dmnModel, vDmnDefinition); } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationService.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationService.java index 92fe6969..7d2c54ae 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationService.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationService.java @@ -1,5 +1,6 @@ package de.unikoblenz.fgbks.core.dmn.verification; +import de.unikoblenz.fgbks.core.dmn.domain.values.parser.SimpleParser; import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult; import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet; import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet.Builder; @@ -16,6 +17,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; @@ -33,6 +35,8 @@ public class VerificationService { private ExecutorService executor; private Set<Class<?>> verifierClasses; + @Inject private SimpleParser parser; + protected VerificationService() { Config config = ConfigProvider.getConfig(); int maxThreads = -- GitLab