Getting DMN decision variable list in java

177 views Asked by At

Given an xml file containing a some DMN decisions, I need to retrieve all of to the variable names process them. If i can't do this then I can't know what the name of the variables given by the user are, just the value. I've been using the camunda java library and it doens't seem very straight forward


<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn">
    <decision id="decision" name="Dish">
        <decisionTable id="decisionTable">
            <input id="input1" label="Season">
                <inputExpression id="inputExpression1" typeRef="string">
                    <text>season</text>
                </inputExpression>
            </input>
            <input id="InputClause_0hmkumv" label="How many guests">
                <inputExpression id="LiteralExpression_0m7s53h" typeRef="integer">
                    <text>guestCount</text>
                </inputExpression>
            </input>
            <output id="output1" label="Dish" name="desiredDish" typeRef="string" />
            <rule id="row-950612891-1">
                <inputEntry id="UnaryTests_0c1o054">
                    <text><![CDATA["Fall"]]></text>
                </inputEntry>
                <inputEntry id="UnaryTests_1lod0sz">
                    <text><![CDATA[<= 8]]></text>
                </inputEntry>
                <outputEntry id="LiteralExpression_065u3ym">
                    <text><![CDATA["Spareribs"]]></text>
                </outputEntry>
            </rule>
            <rule id="row-950612891-2">
                <inputEntry id="UnaryTests_0u1z4ho">
                    <text><![CDATA["Winter"]]></text>
                </inputEntry>
                <inputEntry id="UnaryTests_1euytqf">
                    <text><![CDATA[<= 8]]></text>
                </inputEntry>
                <outputEntry id="LiteralExpression_198frve">
                    <text><![CDATA["Roastbeef"]]></text>
                </outputEntry>
            </rule>
            <rule id="row-950612891-3">
                <inputEntry id="UnaryTests_1vn9t5c">
                    <text><![CDATA["Spring"]]></text>
                </inputEntry>
                <inputEntry id="UnaryTests_1bbbmvu">
                    <text><![CDATA[<= 4]]></text>
                </inputEntry>
                <outputEntry id="LiteralExpression_1bewepn">
                    <text><![CDATA["Dry Aged Gourmet Steak"]]></text>
                </outputEntry>
            </rule>
            <rule id="row-950612891-4">
                <description>Save money</description>
                <inputEntry id="UnaryTests_0ogofox">
                    <text><![CDATA["Spring"]]></text>
                </inputEntry>
                <inputEntry id="UnaryTests_0c60gjz">
                    <text>[5..8]</text>
                </inputEntry>
                <outputEntry id="LiteralExpression_1lahvj7">
                    <text><![CDATA["Steak"]]></text>
                </outputEntry>
            </rule>
            <rule id="row-950612891-5">
                <description>Less effort</description>
                <inputEntry id="UnaryTests_1774yme">
                    <text><![CDATA["Fall", "Winter", "Spring"]]></text>
                </inputEntry>
                <inputEntry id="UnaryTests_01rn17i">
                    <text><![CDATA[> 8]]></text>
                </inputEntry>
                <outputEntry id="LiteralExpression_0jpd7hr">
                    <text><![CDATA["Stew"]]></text>
                </outputEntry>
            </rule>
            <rule id="row-950612891-6">
                <description>Hey, why not!?</description>
                <inputEntry id="UnaryTests_0ifdx8k">
                    <text><![CDATA["Summer"]]></text>
                </inputEntry>
                <inputEntry id="UnaryTests_0c8ym7l">
                    <text></text>
                </inputEntry>
                <outputEntry id="LiteralExpression_08d4mb6">
                    <text><![CDATA["Light Salad and a nice Steak"]]></text>
                </outputEntry>
            </rule>
        </decisionTable>
    </decision>
</definitions>```


above is the following dmn file I took from the internet.
It contains 2 variables; Season and guestCount
I already knew this so in my java file I simply did 
        VariableMap variables = Variables
                .putValue("season", season)
                .putValue("guestCount", guestCount);```

But what if I didn't do this? Every example i come accross on camunda's github already has the names of the variables hard-coded into the example. No example I saw fetched the number and the name of these variables. Do you know if there is any built-in function for the camunda-engine in java?

Went online trying to see some examples of people fetching these automatically from a java file. Asked AI to help me only to be given List<DecisionInputImpl> decisionInputs = decisionDefinition.getInputs(); Where the path of their "DecisionInputImpl" was non-existent (example of non existent path : import org.camunda.bpm.engine.DecisionService;) scoured the forums and saw someone advise someone else to do a rest something but I didn't really understood

2

There are 2 answers

0
joniboy On BEST ANSWER

I have found an answer to my question. This works with camunda name schemes. I don't know if it is a definitive answer but it works well enough for me. Here is the signature of the java fuction

    public List<String> recupererInputs(InputStream inputStream){
    DmnModelInstance dmnModelInstance = Dmn.readModelFromStream(inputStream);
    DecisionTable decisionTable = dmnModelInstance.getModelElementById("decisionTable");
    List<String> expressions = new ArrayList<>();
    Collection<Input> inputs = decisionTable.getInputs();
    inputs.stream().forEach(input->{
        // chaque variable dans "input" sera mise dans expressions. Cela facilitera la manipulation après
        InputExpression inputExpression = input.getInputExpression();
        expressions.add(inputExpression.getText().getTextContent());
    });
    return expressions;
}

the 'inputStream' in question is the Stream made from the dmn file in my local machine. Once I had all the names of the variables, I only had to associate them with the values passed by the user and then it went smoothly enough.

1
Lho Ben On

To retrieve the variable names from a DMN file using the Camunda Java library, you can use the following approach. Note that the Camunda DMN API does not provide a direct method to fetch variable names, so you need to navigate through the DMN model and extract the information.

Assuming you have a DecisionDefinition object, you can use the following code to retrieve the variable names

import org.camunda.bpm.engine.DecisionService;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.DecisionDefinition;
import org.camunda.bpm.model.dmn.Dmn;
import org.camunda.bpm.model.dmn.DmnModelInstance;
import org.camunda.bpm.model.dmn.instance.Decision;
import org.camunda.bpm.model.dmn.instance.Input;
import org.camunda.bpm.model.dmn.instance.InputExpression;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class DMNVariableExtractor {

    public static List<String> getVariableNames(DecisionDefinition decisionDefinition, RepositoryService repositoryService) {
        // Get the DMN model instance for the decision definition
        DmnModelInstance dmnModelInstance = repositoryService.getDmnModelInstance(decisionDefinition.getId());

        // Get the decision element from the model
        Decision decision = dmnModelInstance.getModelElementsByType(Decision.class).iterator().next();

        // Get the input elements (representing the variables)
        Collection<Input> inputs = decision.getChildElementsByType(Input.class);

        // Extract variable names from the input elements
        List<String> variableNames = inputs.stream()
                .map(input -> {
                    InputExpression inputExpression = input.getChildElementsByType(InputExpression.class).iterator().next();
                    return inputExpression.getTextContent();
                })
                .collect(Collectors.toList());

        return variableNames;
    }

    public static void main(String[] args) {
        // Assuming you have a DecisionService and RepositoryService instance
        DecisionService decisionService = ...; // Initialize your DecisionService
        RepositoryService repositoryService = ...; // Initialize your RepositoryService

        // Assuming you have a DecisionDefinition instance
        DecisionDefinition decisionDefinition = decisionService.createDecisionDefinitionQuery().singleResult();

        // Get the variable names
        List<String> variableNames = getVariableNames(decisionDefinition, repositoryService);
    }
}