Skip to content
Snippets Groups Projects
Commit 192d250a authored by Jonas Blatt's avatar Jonas Blatt :ant:
Browse files

Extend parser to handle information requirements

parent 95585e36
No related branches found
No related tags found
No related merge requests found
......@@ -16,6 +16,7 @@ public class VDmnDefinitionImpl extends AbstractVDmnElement implements VDmnDefin
private VDmnDefinitionImpl() {
dmnDecisions = new ArrayList<>();
dmnInputData = new ArrayList<>();
}
@Override
......
......@@ -5,6 +5,7 @@ import de.unikoblenz.fgbks.core.dmn.domain.common.RowNumber;
import de.unikoblenz.fgbks.core.dmn.domain.ids.DecisionId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.DecisionTableId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.DefinitionId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.InputDataId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.InputEntryId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.InputExpressionId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.InputId;
......@@ -16,19 +17,25 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnDecisionImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnDecisionTableImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnDefinitionImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnDefinitionImpl.Builder;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnInputColumnImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnInputDataImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnInputValueImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnOutputColumnImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnOutputValueImpl;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.impl.VDmnRuleImpl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import org.camunda.bpm.model.dmn.DmnModelInstance;
import org.camunda.bpm.model.dmn.instance.Decision;
import org.camunda.bpm.model.dmn.instance.DecisionTable;
import org.camunda.bpm.model.dmn.instance.InformationRequirement;
import org.camunda.bpm.model.dmn.instance.Input;
import org.camunda.bpm.model.dmn.instance.InputData;
import org.camunda.bpm.model.dmn.instance.InputEntry;
import org.camunda.bpm.model.dmn.instance.Output;
import org.camunda.bpm.model.dmn.instance.OutputEntry;
......@@ -46,164 +53,225 @@ public class SimpleVDmnParser implements DmnModelInstanceWrapper {
VDmnDefinitionImpl.Builder definitionBuilder =
VDmnDefinitionImpl.getBuilder()
.withDefinitionId(new DefinitionId(dmnModel.getDefinitions().getId()));
// maps for builder of input data and decisions
Map<InputDataId, VDmnInputDataImpl.Builder> inputDataBuilderMap = new HashMap<>();
Map<DecisionId, VDmnDecisionImpl.Builder> decisionBuilderMap = new HashMap<>();
// Add all input Data
buildAllInputData(dmnModel, definitionBuilder, inputDataBuilderMap);
// add all decisions
buildAllDecisions(dmnModel, definitionBuilder, decisionBuilderMap);
// map information Requirements
buildInformationRequirements(dmnModel, inputDataBuilderMap, decisionBuilderMap);
// Build input Data
inputDataBuilderMap.values().forEach(AbstractBuilder::build);
// Build decisionTable
decisionBuilderMap.values().forEach(AbstractBuilder::build);
// Build definition
return definitionBuilder.build();
}
private void buildAllInputData(
DmnModelInstance dmnModel,
Builder definitionBuilder,
Map<InputDataId, VDmnInputDataImpl.Builder> inputDataBuilder) {
for (InputData inputData : dmnModel.getModelElementsByType(InputData.class)) {
InputDataId id = new InputDataId(inputData.getId());
VDmnInputDataImpl.Builder indaBuilder = VDmnInputDataImpl.getBuilder().withInputDataId(id);
// add Name, if present
if (inputData.getName() != null) {
indaBuilder.withName(inputData.getName());
}
definitionBuilder.addDmnInputDataFromBuilder(indaBuilder);
inputDataBuilder.put(id, indaBuilder);
}
}
private void buildAllDecisions(
DmnModelInstance dmnModel,
Builder definitionBuilder,
Map<DecisionId, VDmnDecisionImpl.Builder> decisionBuilderMap) {
// Iterate for all decisions
for (Decision decision : dmnModel.getModelElementsByType(Decision.class)) {
DecisionId id = new DecisionId(decision.getId());
// Create Builder for DmnDecision
VDmnDecisionImpl.Builder decisionBuilder =
VDmnDecisionImpl.getBuilder().withDecisionId(new DecisionId(decision.getId()));
VDmnDecisionImpl.Builder decisionBuilder = VDmnDecisionImpl.getBuilder().withDecisionId(id);
decisionBuilderMap.put(id, decisionBuilder);
// Add name, if present
if (decision.getName() != null) {
decisionBuilder.withName(decision.getName());
}
// Add DmnDecisionBuilder to definitionBuilder
definitionBuilder.addDmnDecisionFromBuilder(decisionBuilder);
// Get the decisionTable
DecisionTable decisionTable =
new ArrayList<>(decision.getChildElementsByType(DecisionTable.class)).get(0);
// Create Builder for DmnDecisionTable
VDmnDecisionTableImpl.Builder decisionTableBuilder =
VDmnDecisionTableImpl.getBuilder()
.withDecisionTableId(new DecisionTableId(decisionTable.getId()))
.withHitPolicy(decisionTable.getHitPolicy());
// Add DmnDecisionTableBuilder to decisionBuilder
decisionBuilder.withDmnDecisionTableFromBuilder(decisionTableBuilder);
// Build the DecisionTable
buildDecisionTable(decision, decisionBuilder);
}
}
// Create input columns
List<VDmnInputColumnImpl.Builder> inputColumnBuilders =
new ArrayList<>(decisionTable.getInputs().size());
for (Input inputCol : decisionTable.getInputs()) {
VTypeRef type = VTypeRef.getTypeRefFromName(inputCol.getInputExpression().getTypeRef());
VDmnInputColumnImpl.Builder builder =
VDmnInputColumnImpl.getBuilder()
.withInputId(new InputId(inputCol.getId()))
.withInputExpressionId(new InputExpressionId(inputCol.getInputExpression().getId()))
.withTypeRef(type);
// name
if (inputCol.getInputExpression().getText() != null) {
builder.withName(inputCol.getInputExpression().getText().getTextContent());
}
// label
if (inputCol.getLabel() != null) {
builder.withLabel(inputCol.getLabel());
}
// Add Builder to builder list
inputColumnBuilders.add(builder);
// Add predefined values to model
if (type == VTypeRef.STRING && inputCol.getInputValues() != null) {
inputColumnBuilders
.get(inputColumnBuilders.size() - 1)
.addPredefinedInputValues(
inputCol
.getInputValues()
.getText()
.getTextContent()
.replace("\"", "")
.split(","));
}
decisionTableBuilder.addDmnInputColumnFromBuilder(
inputColumnBuilders.get(inputColumnBuilders.size() - 1));
private void buildDecisionTable(Decision decision, VDmnDecisionImpl.Builder decisionBuilder) {
// Get the decisionTable
DecisionTable decisionTable =
new ArrayList<>(decision.getChildElementsByType(DecisionTable.class)).get(0);
// Create Builder for DmnDecisionTable
VDmnDecisionTableImpl.Builder decisionTableBuilder =
VDmnDecisionTableImpl.getBuilder()
.withDecisionTableId(new DecisionTableId(decisionTable.getId()))
.withHitPolicy(decisionTable.getHitPolicy());
// Add DmnDecisionTableBuilder to decisionBuilder
decisionBuilder.withDmnDecisionTableFromBuilder(decisionTableBuilder);
// Create input columns
List<VDmnInputColumnImpl.Builder> inputColumnBuilders =
new ArrayList<>(decisionTable.getInputs().size());
for (Input inputCol : decisionTable.getInputs()) {
VTypeRef type = VTypeRef.getTypeRefFromName(inputCol.getInputExpression().getTypeRef());
VDmnInputColumnImpl.Builder builder =
VDmnInputColumnImpl.getBuilder()
.withInputId(new InputId(inputCol.getId()))
.withInputExpressionId(new InputExpressionId(inputCol.getInputExpression().getId()))
.withTypeRef(type);
// name
if (inputCol.getInputExpression().getText() != null) {
builder.withName(inputCol.getInputExpression().getText().getTextContent());
}
// label
if (inputCol.getLabel() != null) {
builder.withLabel(inputCol.getLabel());
}
// Add Builder to builder list
inputColumnBuilders.add(builder);
// Add predefined values to model
if (type == VTypeRef.STRING && inputCol.getInputValues() != null) {
inputColumnBuilders
.get(inputColumnBuilders.size() - 1)
.addPredefinedInputValues(
inputCol.getInputValues().getText().getTextContent().replace("\"", "").split(","));
}
decisionTableBuilder.addDmnInputColumnFromBuilder(
inputColumnBuilders.get(inputColumnBuilders.size() - 1));
}
// Create output columns
List<VDmnOutputColumnImpl.Builder> outputColumnBuilders =
new ArrayList<>(decisionTable.getOutputs().size());
for (Output outputCol : decisionTable.getOutputs()) {
VTypeRef type = VTypeRef.getTypeRefFromName(outputCol.getTypeRef());
VDmnOutputColumnImpl.Builder builder =
VDmnOutputColumnImpl.getBuilder()
.withOutputId(new OutputId(outputCol.getId()))
.withTypeRef(VTypeRef.getTypeRefFromName(outputCol.getTypeRef()));
// name
if (outputCol.getName() != null) {
builder.withName(outputCol.getName());
}
// label
if (outputCol.getLabel() != null) {
builder.withLabel(outputCol.getLabel());
}
// Add Builder to builder list
outputColumnBuilders.add(builder);
// Add predefined values to model
if (type == VTypeRef.STRING && outputCol.getOutputValues() != null) {
outputColumnBuilders
.get(outputColumnBuilders.size() - 1)
.addPredefinedInputValues(
outputCol
.getOutputValues()
.getText()
.getTextContent()
.replace("\"", "")
.split(","));
}
decisionTableBuilder.addDmnOutputColumnFromBuilder(
outputColumnBuilders.get(outputColumnBuilders.size() - 1));
}
// Create output columns
List<VDmnOutputColumnImpl.Builder> outputColumnBuilders =
new ArrayList<>(decisionTable.getOutputs().size());
for (Output outputCol : decisionTable.getOutputs()) {
VTypeRef type = VTypeRef.getTypeRefFromName(outputCol.getTypeRef());
VDmnOutputColumnImpl.Builder builder =
VDmnOutputColumnImpl.getBuilder()
.withOutputId(new OutputId(outputCol.getId()))
.withTypeRef(VTypeRef.getTypeRefFromName(outputCol.getTypeRef()));
// name
if (outputCol.getName() != null) {
builder.withName(outputCol.getName());
}
// label
if (outputCol.getLabel() != null) {
builder.withLabel(outputCol.getLabel());
}
// Add Builder to builder list
outputColumnBuilders.add(builder);
// Add predefined values to model
if (type == VTypeRef.STRING && outputCol.getOutputValues() != null) {
outputColumnBuilders
.get(outputColumnBuilders.size() - 1)
.addPredefinedInputValues(
outputCol
.getOutputValues()
.getText()
.getTextContent()
.replace("\"", "")
.split(","));
}
decisionTableBuilder.addDmnOutputColumnFromBuilder(
outputColumnBuilders.get(outputColumnBuilders.size() - 1));
// Create rows
Long rowCount = 0L;
for (Rule rule : decisionTable.getRules()) {
// Create Builder for rule
VDmnRuleImpl.Builder dmnRuleBuilder =
VDmnRuleImpl.getBuilder()
.withRuleId(new RuleId(rule.getId()))
.withRowNumber(new RowNumber(++rowCount));
// Add row to Decision
decisionTableBuilder.addRuleFromBuilder(dmnRuleBuilder);
// Input Entries
Collection<InputEntry> inputElements = rule.getChildElementsByType(InputEntry.class);
int x;
x = 0;
for (InputEntry inputEntry : inputElements) {
// create Input Value
VDmnInputValueImpl.Builder vInputValueBuilder =
VDmnInputValueImpl.getBuilder()
.withInputEntryId(new InputEntryId(inputEntry.getId()))
.withDescription(
inputEntry.getDescription() == null
? ""
: inputEntry.getDescription().getTextContent())
.withText(inputEntry.getText().getTextContent());
// Add Input value to rule
dmnRuleBuilder.addInputValueFromBuilder(vInputValueBuilder);
// Add Input value to input column
inputColumnBuilders.get(x++).addValueFromBuilder(vInputValueBuilder);
// build Value
vInputValueBuilder.build();
}
// Create rows
Long rowCount = 0L;
for (Rule rule : decisionTable.getRules()) {
// Create Builder for rule
VDmnRuleImpl.Builder dmnRuleBuilder =
VDmnRuleImpl.getBuilder()
.withRuleId(new RuleId(rule.getId()))
.withRowNumber(new RowNumber(++rowCount));
// Add row to Decision
decisionTableBuilder.addRuleFromBuilder(dmnRuleBuilder);
// Output Entries
Collection<OutputEntry> outputElements = rule.getChildElementsByType(OutputEntry.class);
x = 0;
for (OutputEntry outputEntry : outputElements) {
// create Output Value
VDmnOutputValueImpl.Builder vOutputValueBuilder =
VDmnOutputValueImpl.getBuilder()
.withOutputEntryId(new OutputEntryId(outputEntry.getId()))
.withDescription(
outputEntry.getDescription() == null
? ""
: outputEntry.getDescription().getTextContent())
.withText(outputEntry.getText().getTextContent());
// Add Output value to rule
dmnRuleBuilder.addOutputValueFromBuilder(vOutputValueBuilder);
// Add Output value to input column
outputColumnBuilders.get(x++).addValueFromBuilder(vOutputValueBuilder);
// build Value
vOutputValueBuilder.build();
}
// build rule
dmnRuleBuilder.build();
}
// build cols
inputColumnBuilders.forEach(AbstractBuilder::build);
outputColumnBuilders.forEach(AbstractBuilder::build);
// Input Entries
Collection<InputEntry> inputElements = rule.getChildElementsByType(InputEntry.class);
int x;
x = 0;
for (InputEntry inputEntry : inputElements) {
// create Input Value
VDmnInputValueImpl.Builder vInputValueBuilder =
VDmnInputValueImpl.getBuilder()
.withInputEntryId(new InputEntryId(inputEntry.getId()))
.withDescription(
inputEntry.getDescription() == null
? ""
: inputEntry.getDescription().getTextContent())
.withText(inputEntry.getText().getTextContent());
// Add Input value to rule
dmnRuleBuilder.addInputValueFromBuilder(vInputValueBuilder);
// Add Input value to input column
inputColumnBuilders.get(x++).addValueFromBuilder(vInputValueBuilder);
// build Value
vInputValueBuilder.build();
}
// Build decisionTable
decisionTableBuilder.build();
}
// Output Entries
Collection<OutputEntry> outputElements = rule.getChildElementsByType(OutputEntry.class);
x = 0;
for (OutputEntry outputEntry : outputElements) {
// create Output Value
VDmnOutputValueImpl.Builder vOutputValueBuilder =
VDmnOutputValueImpl.getBuilder()
.withOutputEntryId(new OutputEntryId(outputEntry.getId()))
.withDescription(
outputEntry.getDescription() == null
? ""
: outputEntry.getDescription().getTextContent())
.withText(outputEntry.getText().getTextContent());
// Add Output value to rule
dmnRuleBuilder.addOutputValueFromBuilder(vOutputValueBuilder);
// Add Output value to input column
outputColumnBuilders.get(x++).addValueFromBuilder(vOutputValueBuilder);
// build Value
vOutputValueBuilder.build();
private void buildInformationRequirements(
DmnModelInstance dmnModel,
Map<InputDataId, VDmnInputDataImpl.Builder> inputDataBuilderMap,
Map<DecisionId, VDmnDecisionImpl.Builder> decisionBuilderMap) {
// for all decisions
for (Decision decision : dmnModel.getModelElementsByType(Decision.class)) {
// get builder of Decison
VDmnDecisionImpl.Builder decisionBuilder =
decisionBuilderMap.get(new DecisionId(decision.getId()));
// for all information requirements
for (InformationRequirement ir : decision.getInformationRequirements()) {
if (ir.getRequiredInput() != null) {
inputDataBuilderMap
.get(new InputDataId(ir.getRequiredInput().getId()))
.addInformationProvidingDecisionsFromBuilder(decisionBuilder);
}
if (ir.getRequiredDecision() != null) {
decisionBuilderMap
.get(new DecisionId(ir.getRequiredDecision().getId()))
.addInformationProvidingDecisionsFromBuilder(decisionBuilder);
}
// build rule
dmnRuleBuilder.build();
}
// build cols
inputColumnBuilders.forEach(AbstractBuilder::build);
outputColumnBuilders.forEach(AbstractBuilder::build);
// Build decisionTable
decisionTableBuilder.build();
// Build decisionTable
decisionBuilder.build();
}
return definitionBuilder.build();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment