未验证 提交 c207cb32 编写于 作者: E Elias Ricken de Medeiros 提交者: GitHub

AAE-1665 Add missing ElResolvers to output mapping expressions (#3122)

In addition to MapResolver, other base resolver should be included as well, i.e. ListELResolver, JsonNodeELResolver
上级 4e03ed40
/* Licensed under the Apache License, Version 2.0 (the "License");
* 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.
......@@ -111,14 +111,17 @@ public class ExpressionManager {
protected ELResolver createElResolver(VariableScope variableScope) {
CompositeELResolver elResolver = new CompositeELResolver();
elResolver.add(new VariableScopeElResolver(variableScope));
if (beans != null) {
// ACT-1102: Also expose all beans in configuration when using
// standalone activiti, not
// in spring-context
elResolver.add(new ReadOnlyMapELResolver(beans));
}
addBaseResolvers(elResolver);
return elResolver;
}
private void addBaseResolvers(CompositeELResolver elResolver) {
elResolver.add(new ArrayELResolver());
elResolver.add(new ListELResolver());
elResolver.add(new MapELResolver());
......@@ -127,7 +130,6 @@ public class ExpressionManager {
"getFieldValue",
"setFieldValue")); // TODO: needs verification
elResolver.add(new BeanELResolver());
return elResolver;
}
public Map<Object, Object> getBeans() {
......@@ -139,7 +141,9 @@ public class ExpressionManager {
}
public ELContext getElContext(Map<String, Object> availableVariables) {
ELResolver elResolver = new ReadOnlyMapELResolver(new HashMap<>(availableVariables));
CompositeELResolver elResolver = new CompositeELResolver();
elResolver.add(new ReadOnlyMapELResolver(new HashMap<>(availableVariables)));
addBaseResolvers(elResolver);
return new ActivitiElContext(elResolver);
}
}
......@@ -3,6 +3,8 @@ package org.activiti.spring.boot;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
......@@ -10,7 +12,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.api.model.shared.event.VariableCreatedEvent;
import org.activiti.api.process.model.events.BPMNSequenceFlowTakenEvent;
import org.activiti.api.process.runtime.connector.Connector;
......@@ -18,7 +19,12 @@ import org.activiti.api.process.runtime.events.ProcessCompletedEvent;
import org.activiti.api.process.runtime.events.listener.BPMNElementEventListener;
import org.activiti.api.process.runtime.events.listener.ProcessRuntimeEventListener;
import org.activiti.api.runtime.shared.events.VariableEventListener;
import org.activiti.api.task.runtime.events.*;
import org.activiti.api.task.runtime.events.TaskCandidateGroupAddedEvent;
import org.activiti.api.task.runtime.events.TaskCandidateGroupRemovedEvent;
import org.activiti.api.task.runtime.events.TaskCandidateUserAddedEvent;
import org.activiti.api.task.runtime.events.TaskCandidateUserRemovedEvent;
import org.activiti.api.task.runtime.events.TaskCreatedEvent;
import org.activiti.api.task.runtime.events.TaskUpdatedEvent;
import org.activiti.api.task.runtime.events.listener.TaskRuntimeEventListener;
import org.activiti.core.common.spring.identity.ExtendedInMemoryUserDetailsManager;
import org.activiti.spring.boot.process.ProcessBaseRuntime;
......@@ -37,9 +43,9 @@ import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
@Configuration
@Import({ProcessCleanUpUtil.class,
TaskCleanUpUtil.class,
SecurityUtil.class,
@Import({ProcessCleanUpUtil.class,
TaskCleanUpUtil.class,
SecurityUtil.class,
ProcessBaseRuntime.class,
TaskBaseRuntime.class})
public class RuntimeTestConfiguration {
......@@ -193,7 +199,7 @@ public class RuntimeTestConfiguration {
public BPMNElementEventListener<BPMNSequenceFlowTakenEvent> sequenceFlowTakenEventListener() {
return sequenceFlowTakenEvent -> sequenceFlowTakenEvents.add(sequenceFlowTakenEvent);
}
@Bean
public VariableEventListener<VariableCreatedEvent> variableCreatedEventFromProcessInstanceListener() {
return variableCreatedEvent -> {
......@@ -253,7 +259,7 @@ public class RuntimeTestConfiguration {
"a static value"),
tuple(integerConstant,
10));
integrationContext.addOutBoundVariable("out_variable_name_1",
"outName");
integrationContext.addOutBoundVariable("out_variable_name_2",
......@@ -265,7 +271,7 @@ public class RuntimeTestConfiguration {
return integrationContext;
};
}
@Bean(name = "Variable Mapping Expression Connector.variableMappingExpressionActionName")
public Connector variableMappingExpressionActionName() {
return integrationContext -> {
......@@ -346,10 +352,17 @@ public class RuntimeTestConfiguration {
}
@Bean(name = "OutputMappingExpValueConnector.outputMappingExpValueActionName")
public Connector outputMappingValueExpressionActionName() {
public Connector outputMappingValueExpressionActionName() throws Exception {
JsonNode value = new ObjectMapper().readTree("{\n"
+ " \"city\": {\n"
+ " \"name\": \"London\",\n"
+ " \"place\": \"Tower of London\"\n"
+ " }\n"
+ "}");
return integrationContext -> {
integrationContext.addOutBoundVariable("outVariable1Name",
"value-set-in-connector");
"value-set-in-connector");
integrationContext.addOutBoundVariable("sightSeeing", value);
return integrationContext;
};
}
......
......@@ -129,7 +129,8 @@ public class ProcessRuntimeVariableMappingTest {
VariableInstance::getValue)
.containsOnly(
tuple("name", "John"),
tuple("outVar", "Resolved expression: value-set-in-connector"));
tuple("outVar", "Resolved expression: value-set-in-connector"),
tuple("outVarFromJsonExpression", "Tower of London"));
}
}
......@@ -16,6 +16,12 @@
"name": "outVar",
"type": "string",
"required": false
},
"outVarFromJsonExpressionId": {
"id": "outVarFromJsonExpressionId",
"name": "outVarFromJsonExpression",
"type": "string",
"required": false
}
},
"mappings": {
......@@ -24,6 +30,10 @@
"outVar": {
"type": "value",
"value": "Resolved expression: ${outVariable1Name}"
},
"outVarFromJsonExpression": {
"type": "value",
"value": "${sightSeeing.city.place}"
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册