Skip to content

Commit

Permalink
fix(engine): resolving nested properties in DMN EL expression
Browse files Browse the repository at this point in the history
related to CAM-10232 and CAM-5520
  • Loading branch information
Mindaugas Plukas authored and ThorbenLindhauer committed Jun 26, 2019
1 parent 9d30d34 commit 5b476c0
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,18 @@ public class VariableContextElResolver extends ELResolver {

@Override
public Object getValue(ELContext context, Object base, Object property) {
VariableContext variableContext = (VariableContext) context.getContext(VariableContext.class);
if(variableContext != null) {
if(VAR_CTX_KEY.equals(property)) {
context.setPropertyResolved(true);
return variableContext;
}
TypedValue typedValue = variableContext.resolve((String) property);
if(typedValue != null) {
context.setPropertyResolved(true);
return unpack(typedValue);
if (base == null) {
VariableContext variableContext = (VariableContext) context.getContext(VariableContext.class);
if(variableContext != null) {
if(VAR_CTX_KEY.equals(property)) {
context.setPropertyResolved(true);
return variableContext;
}
TypedValue typedValue = variableContext.resolve((String) property);
if(typedValue != null) {
context.setPropertyResolved(true);
return unpack(typedValue);
}
}
}
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. Camunda licenses this file to you under the Apache License,
* Version 2.0; you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.camunda.bpm.engine.test.dmn.el;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.camunda.bpm.dmn.engine.DmnDecisionTableResult;
import org.camunda.bpm.engine.DecisionService;
import org.camunda.bpm.engine.test.Deployment;
import org.camunda.bpm.engine.test.ProcessEngineRule;
import org.camunda.bpm.engine.test.util.ProvidedProcessEngineRule;
import org.camunda.bpm.engine.variable.VariableMap;
import org.camunda.bpm.engine.variable.Variables;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

public class DmnExpressionLanguageTest {

private static final String JUEL_EXPRESSIONS_WITH_PROPERTIES_DMN =
"org/camunda/bpm/engine/test/dmn/el/DmnExpressionLanguageTest.dmn";

@Rule
public ProcessEngineRule engineRule = new ProvidedProcessEngineRule();

private DecisionService decisionService;

@Before
public void setUp() {
decisionService = engineRule.getDecisionService();
}

@Test
@Deployment(resources = JUEL_EXPRESSIONS_WITH_PROPERTIES_DMN)
public void testJuelDoesNotShadowInnerProperty() {
VariableMap inputs = Variables.createVariables();
inputs.putValue("testExpr", "TestProperty");

Map<String, Object> mapVar = new HashMap<>(1);
mapVar.put("b", "B_FROM_MAP");
inputs.putValue("a", mapVar);
inputs.putValue("b", "B_FROM_CONTEXT");

DmnDecisionTableResult result = decisionService.evaluateDecisionTableByKey("decision_1", inputs);

assertThat(result.getSingleEntry()).isEqualTo("B_FROM_MAP");
}

@Test
@Deployment(resources = JUEL_EXPRESSIONS_WITH_PROPERTIES_DMN)
public void testJuelResolvesListIndex() {
VariableMap inputs = Variables.createVariables();
inputs.putValue("testExpr", "TestListIndex");

List<String> listVar = new ArrayList<>(1);
listVar.add("0_FROM_LIST");
inputs.putValue("a", listVar);

DmnDecisionTableResult result = decisionService.evaluateDecisionTableByKey("decision_1", inputs);

assertThat(result.getSingleEntry()).isEqualTo("0_FROM_LIST");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd"
xmlns:camunda="http://camunda.org/schema/1.0/dmn"
id="testExpressions" name="testExpressions"
expressionLanguage="JUEL"
namespace="http://camunda.org/schema/1.0/dmn">
<decision id="decision_1" name="Decision 1">
<decisionTable id="decisionTable_1">
<input id="input_1" camunda:inputVariable="te">
<inputExpression id="inputExpression_1" typeRef="string">
<text>${testExpr}</text>
</inputExpression>
</input>
<output id="output_1" typeRef="string" />
<rule id="rule_1">
<inputEntry>
<text>${te == "TestProperty"}</text>
</inputEntry>
<outputEntry expressionLanguage="JUEL">
<text>${a.b}</text>
</outputEntry>
</rule>
<rule id="rule_2">
<inputEntry>
<text>${te == "TestListIndex"}</text>
</inputEntry>
<outputEntry expressionLanguage="JUEL">
<text>${a[0]}</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>

0 comments on commit 5b476c0

Please sign in to comment.