/* 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.editor.language.json.converter; import java.util.Iterator; import java.util.Map; import java.util.logging.Level; import org.activiti.bpmn.model.BaseElement; import org.activiti.bpmn.model.FlowElement; import org.activiti.bpmn.model.UserTask; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.ObjectNode; /** * @author Tijs Rademakers */ public class UserTaskJsonConverter extends BaseBpmnJsonConverter { public static void fillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap, Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) { fillJsonTypes(convertersToBpmnMap); fillBpmnTypes(convertersToJsonMap); } public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) { convertersToBpmnMap.put(STENCIL_TASK_USER, UserTaskJsonConverter.class); } public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) { convertersToJsonMap.put(UserTask.class, UserTaskJsonConverter.class); } @Override protected String getStencilId(FlowElement flowElement) { return STENCIL_TASK_USER; } @Override protected void convertElementToJson(ObjectNode propertiesNode, FlowElement flowElement) { UserTask userTask = (UserTask) flowElement; String assignee = userTask.getAssignee(); String candidateUsers = convertListToCommaSeparatedString(userTask.getCandidateUsers()); String candidateGroups = convertListToCommaSeparatedString(userTask.getCandidateGroups()); if (StringUtils.isNotEmpty(assignee) || StringUtils.isNotEmpty(candidateUsers) || StringUtils.isNotEmpty(candidateGroups)) { ObjectNode assignmentNode = objectMapper.createObjectNode(); ArrayNode itemsNode = objectMapper.createArrayNode(); if (StringUtils.isNotEmpty(assignee)) { ObjectNode assignmentItemNode = objectMapper.createObjectNode(); assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_TYPE, PROPERTY_USERTASK_ASSIGNEE); assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignee); itemsNode.add(assignmentItemNode); } if (StringUtils.isNotEmpty(candidateUsers)) { ObjectNode assignmentItemNode = objectMapper.createObjectNode(); assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_TYPE, PROPERTY_USERTASK_CANDIDATE_USERS); assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, candidateUsers); itemsNode.add(assignmentItemNode); } if (StringUtils.isNotEmpty(candidateGroups)) { ObjectNode assignmentItemNode = objectMapper.createObjectNode(); assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_TYPE, PROPERTY_USERTASK_CANDIDATE_GROUPS); assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, candidateGroups); itemsNode.add(assignmentItemNode); } assignmentNode.put("totalCount", itemsNode.size()); assignmentNode.put(EDITOR_PROPERTIES_GENERAL_ITEMS, itemsNode); propertiesNode.put(PROPERTY_USERTASK_ASSIGNMENT, assignmentNode); } if (userTask.getPriority() != null) { setPropertyValue(PROPERTY_USERTASK_PRIORITY, userTask.getPriority().toString(), propertiesNode); } setPropertyValue(PROPERTY_USERTASK_FORMKEY, userTask.getFormKey(), propertiesNode); setPropertyValue(PROPERTY_USERTASK_DUEDATE, userTask.getDueDate(), propertiesNode); addFormProperties(userTask.getFormProperties(), propertiesNode); } @Override protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) { UserTask task = new UserTask(); String priority = getPropertyValueAsString(PROPERTY_USERTASK_PRIORITY, elementNode); if (StringUtils.isNotEmpty(priority)) { try { task.setPriority(Integer.valueOf(priority)); } catch(Exception e) { LOGGER.log(Level.INFO, "priority is not a number " + priority); } } task.setFormKey(getPropertyValueAsString(PROPERTY_USERTASK_FORMKEY, elementNode)); task.setDueDate(getPropertyValueAsString(PROPERTY_USERTASK_DUEDATE, elementNode)); JsonNode assignmentNode = getProperty(PROPERTY_USERTASK_ASSIGNMENT, elementNode); if (assignmentNode != null) { JsonNode itemsNode = assignmentNode.get(EDITOR_PROPERTIES_GENERAL_ITEMS); if (itemsNode != null) { Iterator<JsonNode> assignmentIterator = itemsNode.getElements(); while (assignmentIterator.hasNext()) { JsonNode assignmentItemNode = assignmentIterator.next(); if (assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_TYPE) != null && assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION) != null) { String assignmentType = assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_TYPE).asText(); if (PROPERTY_USERTASK_ASSIGNEE.equals(assignmentType)) { task.setAssignee(assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION).asText()); } else if (PROPERTY_USERTASK_CANDIDATE_USERS.equals(assignmentType)) { task.setCandidateUsers(getValueAsList(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignmentItemNode)); } else if (PROPERTY_USERTASK_CANDIDATE_GROUPS.equals(assignmentType)) { task.setCandidateGroups(getValueAsList(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignmentItemNode)); } } } } } convertJsonToFormProperties(elementNode, task); return task; } }