/* 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. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.engine.test.json; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.history.HistoricVariableInstance; import org.activiti.engine.impl.history.HistoryLevel; import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.test.Deployment; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; /** * @author Tijs Rademakers * @author Tim Stephenson */ public class JsonTest extends PluggableActivitiTestCase { public static final String MY_JSON_OBJ = "myJsonObj"; public static final String BIG_JSON_OBJ = "bigJsonObj"; protected ObjectMapper objectMapper = new ObjectMapper(); @Override protected void setUp() throws Exception { super.setUp(); } @Deployment public void testJsonObjectAvailable() { Map<String, Object> vars = new HashMap<String, Object>(); ObjectNode varNode = objectMapper.createObjectNode(); varNode.put("var", "myValue"); vars.put(MY_JSON_OBJ, varNode); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testJsonAvailableProcess", vars); // Check JSON has been parsed as expected ObjectNode value = (ObjectNode) runtimeService.getVariable(processInstance.getId(), MY_JSON_OBJ); assertNotNull(value); assertEquals("myValue", value.get("var").asText()); ObjectNode var2Node = objectMapper.createObjectNode(); var2Node.put("var", "myValue"); var2Node.put("var2", "myOtherValue"); runtimeService.setVariable(processInstance.getId(), MY_JSON_OBJ, var2Node); // Check JSON has been updated as expected value = (ObjectNode) runtimeService.getVariable(processInstance.getId(), MY_JSON_OBJ); assertNotNull(value); assertEquals("myValue", value.get("var").asText()); assertEquals("myOtherValue", value.get("var2").asText()); Task task = taskService.createTaskQuery().active().singleResult(); assertNotNull(task); ObjectNode var3Node = objectMapper.createObjectNode(); var3Node.put("var", "myValue"); var3Node.put("var2", "myOtherValue"); var3Node.put("var3", "myThirdValue"); vars = new HashMap<String, Object>(); vars.put(MY_JSON_OBJ, var3Node); vars.put(BIG_JSON_OBJ, createBigJsonObject()); taskService.complete(task.getId(), vars); value = (ObjectNode) runtimeService.getVariable(processInstance.getId(), MY_JSON_OBJ); assertNotNull(value); assertEquals("myValue", value.get("var").asText()); assertEquals("myOtherValue", value.get("var2").asText()); assertEquals("myThirdValue", value.get("var3").asText()); value = (ObjectNode) runtimeService.getVariable(processInstance.getId(), BIG_JSON_OBJ); assertNotNull(value); assertEquals(createBigJsonObject().toString(), value.toString()); task = taskService.createTaskQuery().active().singleResult(); assertNotNull(task); assertEquals("userTaskSuccess", task.getTaskDefinitionKey()); if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) { List<HistoricVariableInstance> historicVariableInstances = historyService.createHistoricVariableInstanceQuery() .processInstanceId(processInstance.getProcessInstanceId()).orderByVariableName().asc().list(); assertEquals(2, historicVariableInstances.size()); assertEquals(BIG_JSON_OBJ, historicVariableInstances.get(0).getVariableName()); value = (ObjectNode) historicVariableInstances.get(0).getValue(); assertNotNull(value); assertEquals(createBigJsonObject().toString(), value.toString()); assertEquals(MY_JSON_OBJ, historicVariableInstances.get(1).getVariableName()); value = (ObjectNode) historicVariableInstances.get(1).getValue(); assertNotNull(value); assertEquals("myValue", value.get("var").asText()); assertEquals("myOtherValue", value.get("var2").asText()); assertEquals("myThirdValue", value.get("var3").asText()); } // It should be possible do remove a json variable runtimeService.removeVariable(processInstance.getId(), MY_JSON_OBJ); assertNull(runtimeService.getVariable(processInstance.getId(), MY_JSON_OBJ)); // It should be possible do remove a longJson variable runtimeService.removeVariable(processInstance.getId(), BIG_JSON_OBJ); assertNull(runtimeService.getVariable(processInstance.getId(), BIG_JSON_OBJ)); } @Deployment public void testJsonArrayAvailable() { Map<String, Object> vars = new HashMap<String, Object>(); ArrayNode varArray = objectMapper.createArrayNode(); ObjectNode varNode = objectMapper.createObjectNode(); varNode.put("var", "myValue"); varArray.add(varNode); vars.put("myJsonArr", varArray); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testJsonAvailableProcess", vars); // Check JSON has been parsed as expected ArrayNode value = (ArrayNode) runtimeService.getVariable(processInstance.getId(), "myJsonArr"); assertNotNull(value); assertEquals("myValue", value.get(0).get("var").asText()); ArrayNode varArray2 = objectMapper.createArrayNode(); varNode = objectMapper.createObjectNode(); varNode.put("var", "myValue"); varArray2.add(varNode); varNode = objectMapper.createObjectNode(); varNode.put("var", "myOtherValue"); varArray2.add(varNode); runtimeService.setVariable(processInstance.getId(), "myJsonArr", varArray2); // Check JSON has been updated as expected value = (ArrayNode) runtimeService.getVariable(processInstance.getId(), "myJsonArr"); assertNotNull(value); assertEquals("myValue", value.get(0).get("var").asText()); assertEquals("myOtherValue", value.get(1).get("var").asText()); Task task = taskService.createTaskQuery().active().singleResult(); assertNotNull(task); ArrayNode varArray3 = objectMapper.createArrayNode(); varNode = objectMapper.createObjectNode(); varNode.put("var", "myValue"); varArray3.add(varNode); varNode = objectMapper.createObjectNode(); varNode.put("var", "myOtherValue"); varArray3.add(varNode); varNode = objectMapper.createObjectNode(); varNode.put("var", "myThirdValue"); varArray3.add(varNode); vars = new HashMap<String, Object>(); vars.put("myJsonArr", varArray3); taskService.complete(task.getId(), vars); value = (ArrayNode) runtimeService.getVariable(processInstance.getId(), "myJsonArr"); assertNotNull(value); assertEquals("myValue", value.get(0).get("var").asText()); assertEquals("myOtherValue", value.get(1).get("var").asText()); assertEquals("myThirdValue", value.get(2).get("var").asText()); task = taskService.createTaskQuery().active().singleResult(); assertNotNull(task); assertEquals("userTaskSuccess", task.getTaskDefinitionKey()); if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) { HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery() .processInstanceId(processInstance.getProcessInstanceId()).singleResult(); value = (ArrayNode) historicVariableInstance.getValue(); assertNotNull(value); assertEquals("myValue", value.get(0).get("var").asText()); assertEquals("myOtherValue", value.get(1).get("var").asText()); assertEquals("myThirdValue", value.get(2).get("var").asText()); } } protected ObjectNode createBigJsonObject() { ObjectNode valueNode = objectMapper.createObjectNode(); for (int i = 0; i < 1000; i++) { ObjectNode childNode = objectMapper.createObjectNode(); childNode.put("test", "this is a simple test text"); childNode.put("test2", "this is a simple test2 text"); childNode.put("test3", "this is a simple test3 text"); childNode.put("test4", "this is a simple test4 text"); valueNode.put("var" + i, childNode); } return valueNode; } }