Search in sources :

Example 6 with Rule

use of org.camunda.bpm.model.dmn.instance.Rule in project camunda-engine-dmn by camunda.

the class DefaultDmnTransform method transformDecisionTable.

protected DmnDecisionTableImpl transformDecisionTable(DecisionTable decisionTable) {
    DmnElementTransformHandler<DecisionTable, DmnDecisionTableImpl> handler = handlerRegistry.getHandler(DecisionTable.class);
    DmnDecisionTableImpl dmnDecisionTable = handler.handleElement(this, decisionTable);
    for (Input input : decisionTable.getInputs()) {
        parent = dmnDecisionTable;
        this.decisionTable = dmnDecisionTable;
        DmnDecisionTableInputImpl dmnInput = transformDecisionTableInput(input);
        if (dmnInput != null) {
            dmnDecisionTable.getInputs().add(dmnInput);
            notifyTransformListeners(input, dmnInput);
        }
    }
    boolean needsName = decisionTable.getOutputs().size() > 1;
    Set<String> usedNames = new HashSet<String>();
    for (Output output : decisionTable.getOutputs()) {
        parent = dmnDecisionTable;
        this.decisionTable = dmnDecisionTable;
        DmnDecisionTableOutputImpl dmnOutput = transformDecisionTableOutput(output);
        if (dmnOutput != null) {
            // validate output name
            String outputName = dmnOutput.getOutputName();
            if (needsName && outputName == null) {
                throw LOG.compoundOutputsShouldHaveAnOutputName(dmnDecisionTable, dmnOutput);
            }
            if (usedNames.contains(outputName)) {
                throw LOG.compoundOutputWithDuplicateName(dmnDecisionTable, dmnOutput);
            }
            usedNames.add(outputName);
            dmnDecisionTable.getOutputs().add(dmnOutput);
            notifyTransformListeners(output, dmnOutput);
        }
    }
    for (Rule rule : decisionTable.getRules()) {
        parent = dmnDecisionTable;
        this.decisionTable = dmnDecisionTable;
        DmnDecisionTableRuleImpl dmnRule = transformDecisionTableRule(rule);
        if (dmnRule != null) {
            dmnDecisionTable.getRules().add(dmnRule);
            notifyTransformListeners(rule, dmnRule);
        }
    }
    return dmnDecisionTable;
}
Also used : DmnDecisionTableImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableImpl) DmnDecisionTableInputImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableInputImpl) DmnDecisionTableOutputImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableOutputImpl) DecisionTable(org.camunda.bpm.model.dmn.instance.DecisionTable) Input(org.camunda.bpm.model.dmn.instance.Input) Output(org.camunda.bpm.model.dmn.instance.Output) DmnDecisionTableRuleImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableRuleImpl) Rule(org.camunda.bpm.model.dmn.instance.Rule) HashSet(java.util.HashSet)

Example 7 with Rule

use of org.camunda.bpm.model.dmn.instance.Rule in project camunda-engine-dmn by camunda.

the class DefaultDmnTransform method transformDecisionTableRule.

protected DmnDecisionTableRuleImpl transformDecisionTableRule(Rule rule) {
    DmnElementTransformHandler<Rule, DmnDecisionTableRuleImpl> handler = handlerRegistry.getHandler(Rule.class);
    DmnDecisionTableRuleImpl dmnRule = handler.handleElement(this, rule);
    // validate rule id
    if (dmnRule.getId() == null) {
        throw LOG.decisionTableRuleIdIsMissing(decision, dmnRule);
    }
    List<DmnDecisionTableInputImpl> inputs = this.decisionTable.getInputs();
    List<InputEntry> inputEntries = new ArrayList<InputEntry>(rule.getInputEntries());
    if (inputs.size() != inputEntries.size()) {
        throw LOG.differentNumberOfInputsAndInputEntries(inputs.size(), inputEntries.size(), dmnRule);
    }
    for (InputEntry inputEntry : inputEntries) {
        parent = dmnRule;
        DmnExpressionImpl condition = transformInputEntry(inputEntry);
        dmnRule.getConditions().add(condition);
    }
    List<DmnDecisionTableOutputImpl> outputs = this.decisionTable.getOutputs();
    List<OutputEntry> outputEntries = new ArrayList<OutputEntry>(rule.getOutputEntries());
    if (outputs.size() != outputEntries.size()) {
        throw LOG.differentNumberOfOutputsAndOutputEntries(outputs.size(), outputEntries.size(), dmnRule);
    }
    for (OutputEntry outputEntry : outputEntries) {
        parent = dmnRule;
        DmnExpressionImpl conclusion = transformOutputEntry(outputEntry);
        dmnRule.getConclusions().add(conclusion);
    }
    return dmnRule;
}
Also used : OutputEntry(org.camunda.bpm.model.dmn.instance.OutputEntry) ArrayList(java.util.ArrayList) InputEntry(org.camunda.bpm.model.dmn.instance.InputEntry) DmnDecisionTableInputImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableInputImpl) DmnDecisionTableOutputImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableOutputImpl) DmnExpressionImpl(org.camunda.bpm.dmn.engine.impl.DmnExpressionImpl) DmnDecisionTableRuleImpl(org.camunda.bpm.dmn.engine.impl.DmnDecisionTableRuleImpl) Rule(org.camunda.bpm.model.dmn.instance.Rule)

Example 8 with Rule

use of org.camunda.bpm.model.dmn.instance.Rule in project camunda-bpm-platform by camunda.

the class DmnModelElementInstanceCmdTest method testRepositoryService.

@Deployment(resources = "org/camunda/bpm/engine/test/repository/one.dmn")
public void testRepositoryService() {
    String decisionDefinitionId = repositoryService.createDecisionDefinitionQuery().decisionDefinitionKey(DECISION_KEY).singleResult().getId();
    DmnModelInstance modelInstance = repositoryService.getDmnModelInstance(decisionDefinitionId);
    assertNotNull(modelInstance);
    Collection<Decision> decisions = modelInstance.getModelElementsByType(Decision.class);
    assertEquals(1, decisions.size());
    Collection<DecisionTable> decisionTables = modelInstance.getModelElementsByType(DecisionTable.class);
    assertEquals(1, decisionTables.size());
    Collection<Input> inputs = modelInstance.getModelElementsByType(Input.class);
    assertEquals(1, inputs.size());
    Collection<Output> outputs = modelInstance.getModelElementsByType(Output.class);
    assertEquals(1, outputs.size());
    Collection<Rule> rules = modelInstance.getModelElementsByType(Rule.class);
    assertEquals(2, rules.size());
}
Also used : DecisionTable(org.camunda.bpm.model.dmn.instance.DecisionTable) Input(org.camunda.bpm.model.dmn.instance.Input) Output(org.camunda.bpm.model.dmn.instance.Output) Rule(org.camunda.bpm.model.dmn.instance.Rule) Decision(org.camunda.bpm.model.dmn.instance.Decision) DmnModelInstance(org.camunda.bpm.model.dmn.DmnModelInstance) Deployment(org.camunda.bpm.engine.test.Deployment)

Example 9 with Rule

use of org.camunda.bpm.model.dmn.instance.Rule in project camunda-dmn-model by camunda.

the class ExampleTestCompatibility method shouldWriteElements.

@Test
public void shouldWriteElements() throws Exception {
    modelInstance = Dmn.createEmptyModel();
    // Definitions
    Definitions definitions = generateNamedElement(Definitions.class, "definitions");
    definitions.setNamespace(TEST_NAMESPACE);
    modelInstance.setDocumentElement(definitions);
    // Decision
    Decision decision = generateNamedElement(Decision.class, "Check Order");
    definitions.addChildElement(decision);
    // Decision table
    DecisionTable decisionTable = generateElement(DecisionTable.class);
    decision.addChildElement(decisionTable);
    // 1. Input clause
    Input input = generateElement(Input.class, 1);
    input.setLabel("Customer Status");
    InputExpression inputExpression = generateElement(InputExpression.class, 1);
    inputExpression.setTypeRef("string");
    Text text = generateElement(Text.class);
    text.setTextContent("status");
    inputExpression.setText(text);
    input.setInputExpression(inputExpression);
    InputValues inputValues = generateElement(InputValues.class);
    text = generateElement(Text.class);
    text.setTextContent("\"bronze\",\"silver\",\"gold\"");
    inputValues.setText(text);
    input.setInputValues(inputValues);
    decisionTable.getInputs().add(input);
    // 2. Input clause
    input = generateElement(Input.class, 2);
    input.setLabel("Order Sum");
    inputExpression = generateElement(InputExpression.class, 2);
    inputExpression.setTypeRef("double");
    text = generateElement(Text.class);
    text.setTextContent("sum");
    inputExpression.setText(text);
    input.setInputExpression(inputExpression);
    decisionTable.getInputs().add(input);
    // 1. Output clause
    Output output = generateElement(Output.class, 1);
    output.setLabel("Check Result");
    output.setName("result");
    output.setTypeRef("string");
    OutputValues outputValues = generateElement(OutputValues.class);
    text = generateElement(Text.class);
    text.setTextContent("\"ok\",\"notok\"");
    outputValues.setText(text);
    output.setOutputValues(outputValues);
    decisionTable.getOutputs().add(output);
    // 2. Output clause
    output = generateElement(Output.class, 2);
    output.setLabel("Reason");
    output.setName("reason");
    output.setTypeRef("string");
    decisionTable.getOutputs().add(output);
    // 1. Rule
    Rule rule = generateElement(Rule.class, 1);
    InputEntry inputEntry = generateElement(InputEntry.class, 1);
    text = generateElement(Text.class);
    text.setTextContent("\"bronze\"");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    inputEntry = generateElement(InputEntry.class, 2);
    text = generateElement(Text.class);
    text.setTextContent("");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    OutputEntry outputEntry = generateElement(OutputEntry.class, 1);
    text = generateElement(Text.class);
    text.setTextContent("\"notok\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    outputEntry = generateElement(OutputEntry.class, 2);
    text = generateElement(Text.class);
    text.getDomElement().addCDataSection("\"work on your status first, as bronze you're not going to get anything\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    decisionTable.getRules().add(rule);
    // 2. Rule
    rule = generateElement(Rule.class, 2);
    inputEntry = generateElement(InputEntry.class, 3);
    text = generateElement(Text.class);
    text.setTextContent("\"silver\"");
    rule.getInputEntries().add(inputEntry);
    inputEntry.setText(text);
    inputEntry = generateElement(InputEntry.class, 4);
    text = generateElement(Text.class);
    text.getDomElement().addCDataSection("< 1000");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    outputEntry = generateElement(OutputEntry.class, 3);
    text = generateElement(Text.class);
    text.setTextContent("\"ok\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    outputEntry = generateElement(OutputEntry.class, 4);
    text = generateElement(Text.class);
    text.setTextContent("\"you little fish will get what you want\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    decisionTable.getRules().add(rule);
    // 3. Rule
    rule = generateElement(Rule.class, 3);
    inputEntry = generateElement(InputEntry.class, 5);
    text = generateElement(Text.class);
    text.setTextContent("\"silver\"");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    inputEntry = generateElement(InputEntry.class, 6);
    text = generateElement(Text.class);
    text.getDomElement().addCDataSection(">= 1000");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    outputEntry = generateElement(OutputEntry.class, 5);
    text = generateElement(Text.class);
    text.setTextContent("\"notok\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    outputEntry = generateElement(OutputEntry.class, 6);
    text = generateElement(Text.class);
    text.setTextContent("\"you took too much man, you took too much!\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    decisionTable.getRules().add(rule);
    // 4. Rule
    rule = generateElement(Rule.class, 4);
    inputEntry = generateElement(InputEntry.class, 7);
    text = generateElement(Text.class);
    text.setTextContent("\"gold\"");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    inputEntry = generateElement(InputEntry.class, 8);
    text = generateElement(Text.class);
    text.setTextContent("");
    inputEntry.setText(text);
    rule.getInputEntries().add(inputEntry);
    outputEntry = generateElement(OutputEntry.class, 7);
    text = generateElement(Text.class);
    text.setTextContent("\"ok\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    outputEntry = generateElement(OutputEntry.class, 8);
    text = generateElement(Text.class);
    text.setTextContent("\"you get anything you want\"");
    outputEntry.setText(text);
    rule.getOutputEntries().add(outputEntry);
    decisionTable.getRules().add(rule);
    assertModelEqualsFile(EXAMPLE_DMN);
}
Also used : DecisionTable(org.camunda.bpm.model.dmn.instance.DecisionTable) InputValues(org.camunda.bpm.model.dmn.instance.InputValues) Input(org.camunda.bpm.model.dmn.instance.Input) OutputEntry(org.camunda.bpm.model.dmn.instance.OutputEntry) OutputValues(org.camunda.bpm.model.dmn.instance.OutputValues) Definitions(org.camunda.bpm.model.dmn.instance.Definitions) Output(org.camunda.bpm.model.dmn.instance.Output) Text(org.camunda.bpm.model.dmn.instance.Text) Rule(org.camunda.bpm.model.dmn.instance.Rule) InputExpression(org.camunda.bpm.model.dmn.instance.InputExpression) Decision(org.camunda.bpm.model.dmn.instance.Decision) InputEntry(org.camunda.bpm.model.dmn.instance.InputEntry) Test(org.junit.Test)

Example 10 with Rule

use of org.camunda.bpm.model.dmn.instance.Rule in project camunda-dmn-model by camunda.

the class ExampleTestCompatibility method shouldGetElements.

@Test
public void shouldGetElements() {
    // Definitions
    Definitions definitions = modelInstance.getDefinitions();
    assertThat(definitions).isNotNull();
    assertThat(definitions.getId()).isEqualTo("definitions");
    assertThat(definitions.getName()).isEqualTo("definitions");
    assertThat(definitions.getNamespace()).isEqualTo(TEST_NAMESPACE);
    assertElementIsEqualToId(definitions, "definitions");
    // Imports
    Collection<Import> imports = definitions.getImports();
    assertThat(imports).isEmpty();
    // Item definitions
    Collection<ItemDefinition> itemDefinitions = definitions.getItemDefinitions();
    assertThat(itemDefinitions).isEmpty();
    // DRG elements
    Collection<DrgElement> drgElements = definitions.getDrgElements();
    assertThat(drgElements).isNotEmpty().hasSize(1);
    // Decision
    Decision decision = (Decision) drgElements.iterator().next();
    assertThat(decision).isNotNull();
    assertThat(decision.getId()).isEqualTo("decision");
    assertThat(decision.getName()).isEqualTo("Check Order");
    assertElementIsEqualToId(decision, "decision");
    // Decision table
    DecisionTable decisionTable = (DecisionTable) decision.getExpression();
    assertThat(decisionTable).isNotNull();
    assertThat(decisionTable.getId()).isEqualTo("decisionTable");
    assertElementIsEqualToId(decisionTable, "decisionTable");
    // Input clauses
    List<Input> inputs = new ArrayList<Input>(decisionTable.getInputs());
    assertThat(inputs).hasSize(2);
    Iterator<Input> inputIterator = inputs.iterator();
    // 1. Input clause
    Input input = inputIterator.next();
    assertThat(input.getId()).isEqualTo("input1");
    assertThat(input.getLabel()).isEqualTo("Customer Status");
    InputExpression inputExpression = input.getInputExpression();
    assertThat(inputExpression.getId()).isEqualTo("inputExpression1");
    assertThat(inputExpression.getTypeRef()).isEqualTo("string");
    assertThat(inputExpression.getText().getTextContent()).isEqualTo("status");
    InputValues inputValues = input.getInputValues();
    assertThat(inputValues.getText().getTextContent()).isEqualTo("\"bronze\",\"silver\",\"gold\"");
    // 2. Input clause
    input = inputIterator.next();
    assertThat(input.getId()).isEqualTo("input2");
    assertThat(input.getLabel()).isEqualTo("Order Sum");
    inputExpression = input.getInputExpression();
    assertThat(inputExpression.getId()).isEqualTo("inputExpression2");
    assertThat(inputExpression.getTypeRef()).isEqualTo("double");
    // Output clause
    List<Output> outputs = new ArrayList<Output>(decisionTable.getOutputs());
    assertThat(outputs).hasSize(2);
    // 1. Output clause
    Output output = outputs.get(0);
    assertThat(output.getId()).isEqualTo("output1");
    assertThat(output.getLabel()).isEqualTo("Check Result");
    assertThat(output.getName()).isEqualTo("result");
    assertThat(output.getTypeRef()).isEqualTo("string");
    OutputValues outputValues = output.getOutputValues();
    assertThat(outputValues.getText().getTextContent()).isEqualTo("\"ok\",\"notok\"");
    // 2. Output clause
    output = outputs.get(1);
    assertThat(output.getId()).isEqualTo("output2");
    assertThat(output.getLabel()).isEqualTo("Reason");
    assertThat(output.getName()).isEqualTo("reason");
    assertThat(output.getTypeRef()).isEqualTo("string");
    // Rules
    List<Rule> rules = new ArrayList<Rule>(decisionTable.getRules());
    // 1. Rule
    Rule rule = rules.get(0);
    assertThat(rule.getId()).isEqualTo("rule1");
    List<InputEntry> inputEntries = new ArrayList<InputEntry>(rule.getInputEntries());
    assertThat(inputEntries).hasSize(2);
    assertThat(inputEntries.get(0).getText().getTextContent()).isEqualTo("\"bronze\"");
    assertThat(inputEntries.get(1).getText().getTextContent()).isEmpty();
    List<OutputEntry> outputEntries = new ArrayList<OutputEntry>(rule.getOutputEntries());
    assertThat(outputEntries).hasSize(2);
    assertThat(outputEntries.get(0).getText().getTextContent()).isEqualTo("\"notok\"");
    assertThat(outputEntries.get(1).getText().getTextContent()).isEqualTo("\"work on your status first, as bronze you're not going to get anything\"");
    // 2. Rule
    rule = rules.get(1);
    assertThat(rule.getId()).isEqualTo("rule2");
    inputEntries = new ArrayList<InputEntry>(rule.getInputEntries());
    assertThat(inputEntries).hasSize(2);
    assertThat(inputEntries.get(0).getText().getTextContent()).isEqualTo("\"silver\"");
    assertThat(inputEntries.get(1).getText().getTextContent()).isEqualTo("< 1000");
    outputEntries = new ArrayList<OutputEntry>(rule.getOutputEntries());
    assertThat(outputEntries).hasSize(2);
    assertThat(outputEntries.get(0).getText().getTextContent()).isEqualTo("\"ok\"");
    assertThat(outputEntries.get(1).getText().getTextContent()).isEqualTo("\"you little fish will get what you want\"");
    // 3. Rule
    rule = rules.get(2);
    assertThat(rule.getId()).isEqualTo("rule3");
    inputEntries = new ArrayList<InputEntry>(rule.getInputEntries());
    assertThat(inputEntries).hasSize(2);
    assertThat(inputEntries.get(0).getText().getTextContent()).isEqualTo("\"silver\"");
    assertThat(inputEntries.get(1).getText().getTextContent()).isEqualTo(">= 1000");
    outputEntries = new ArrayList<OutputEntry>(rule.getOutputEntries());
    assertThat(outputEntries).hasSize(2);
    assertThat(outputEntries.get(0).getText().getTextContent()).isEqualTo("\"notok\"");
    assertThat(outputEntries.get(1).getText().getTextContent()).isEqualTo("\"you took too much man, you took too much!\"");
    // 4. Rule
    rule = rules.get(3);
    assertThat(rule.getId()).isEqualTo("rule4");
    inputEntries = new ArrayList<InputEntry>(rule.getInputEntries());
    assertThat(inputEntries).hasSize(2);
    assertThat(inputEntries.get(0).getText().getTextContent()).isEqualTo("\"gold\"");
    assertThat(inputEntries.get(1).getText().getTextContent()).isEmpty();
    outputEntries = new ArrayList<OutputEntry>(rule.getOutputEntries());
    assertThat(outputEntries).hasSize(2);
    assertThat(outputEntries.get(0).getText().getTextContent()).isEqualTo("\"ok\"");
    assertThat(outputEntries.get(1).getText().getTextContent()).isEqualTo("\"you get anything you want\"");
    // Element collections
    Collection<ElementCollection> elementCollections = definitions.getElementCollections();
    assertThat(elementCollections).isEmpty();
    // Business contexts
    Collection<BusinessContextElement> businessContextElements = definitions.getBusinessContextElements();
    assertThat(businessContextElements).isEmpty();
}
Also used : Import(org.camunda.bpm.model.dmn.instance.Import) OutputEntry(org.camunda.bpm.model.dmn.instance.OutputEntry) ItemDefinition(org.camunda.bpm.model.dmn.instance.ItemDefinition) ArrayList(java.util.ArrayList) BusinessContextElement(org.camunda.bpm.model.dmn.instance.BusinessContextElement) DecisionTable(org.camunda.bpm.model.dmn.instance.DecisionTable) InputValues(org.camunda.bpm.model.dmn.instance.InputValues) Input(org.camunda.bpm.model.dmn.instance.Input) Output(org.camunda.bpm.model.dmn.instance.Output) ElementCollection(org.camunda.bpm.model.dmn.instance.ElementCollection) Definitions(org.camunda.bpm.model.dmn.instance.Definitions) InputExpression(org.camunda.bpm.model.dmn.instance.InputExpression) Decision(org.camunda.bpm.model.dmn.instance.Decision) InputEntry(org.camunda.bpm.model.dmn.instance.InputEntry) DrgElement(org.camunda.bpm.model.dmn.instance.DrgElement) OutputValues(org.camunda.bpm.model.dmn.instance.OutputValues) Rule(org.camunda.bpm.model.dmn.instance.Rule) Test(org.junit.Test)

Aggregations

Rule (org.camunda.bpm.model.dmn.instance.Rule)12 DecisionTable (org.camunda.bpm.model.dmn.instance.DecisionTable)9 Input (org.camunda.bpm.model.dmn.instance.Input)8 InputEntry (org.camunda.bpm.model.dmn.instance.InputEntry)8 Output (org.camunda.bpm.model.dmn.instance.Output)8 Test (org.junit.Test)8 Decision (org.camunda.bpm.model.dmn.instance.Decision)7 OutputEntry (org.camunda.bpm.model.dmn.instance.OutputEntry)7 Definitions (org.camunda.bpm.model.dmn.instance.Definitions)6 InputExpression (org.camunda.bpm.model.dmn.instance.InputExpression)5 InputValues (org.camunda.bpm.model.dmn.instance.InputValues)5 OutputValues (org.camunda.bpm.model.dmn.instance.OutputValues)5 ArrayList (java.util.ArrayList)3 DmnDecisionTableRuleImpl (org.camunda.bpm.dmn.engine.impl.DmnDecisionTableRuleImpl)3 Text (org.camunda.bpm.model.dmn.instance.Text)3 DmnDecisionTableInputImpl (org.camunda.bpm.dmn.engine.impl.DmnDecisionTableInputImpl)2 DmnDecisionTableOutputImpl (org.camunda.bpm.dmn.engine.impl.DmnDecisionTableOutputImpl)2 BusinessContextElement (org.camunda.bpm.model.dmn.instance.BusinessContextElement)2 DrgElement (org.camunda.bpm.model.dmn.instance.DrgElement)2 ElementCollection (org.camunda.bpm.model.dmn.instance.ElementCollection)2