提交 9e309777 编写于 作者: T Tijs Rademakers

Merge branch 'contribute' of https://github.com/balsarori/Activiti

......@@ -12,10 +12,13 @@
*/
package org.activiti.bpmn.converter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
......@@ -52,6 +55,8 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
childParserMap.put(humanPerformerParser.getElementName(), humanPerformerParser);
PotentialOwnerParser potentialOwnerParser = new PotentialOwnerParser();
childParserMap.put(potentialOwnerParser.getElementName(), potentialOwnerParser);
CustomIdentityLinkParser customIdentityLinkParser = new CustomIdentityLinkParser();
childParserMap.put(customIdentityLinkParser.getElementName(), customIdentityLinkParser);
}
public Class<? extends BaseElement> getBpmnElementType() {
......@@ -125,9 +130,56 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
protected boolean writeExtensionChildElements(BaseElement element, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
UserTask userTask = (UserTask) element;
didWriteExtensionStartElement = writeFormProperties(userTask, didWriteExtensionStartElement, xtw);
didWriteExtensionStartElement = writeCustomIdentities(element, didWriteExtensionStartElement, xtw);
return didWriteExtensionStartElement;
}
protected boolean writeCustomIdentities(BaseElement element, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
UserTask userTask = (UserTask) element;
if(userTask.getCustomUserIdentityLinks().size() == 0 && userTask.getCustomGroupIdentityLinks().size() == 0)
return didWriteExtensionStartElement;
if (didWriteExtensionStartElement == false) {
xtw.writeStartElement(ELEMENT_EXTENSIONS);
didWriteExtensionStartElement = true;
}
Set<String> identityLinkTypes = new HashSet<String>();
identityLinkTypes.addAll(userTask.getCustomUserIdentityLinks().keySet());
identityLinkTypes.addAll(userTask.getCustomGroupIdentityLinks().keySet());
for (String identityType : identityLinkTypes) {
writeCustomIdentities(userTask, identityType, userTask.getCustomUserIdentityLinks().get(identityType), userTask.getCustomGroupIdentityLinks().get(identityType), xtw);
}
return didWriteExtensionStartElement;
}
protected void writeCustomIdentities(UserTask userTask,String identityType, Set<String> users, Set<String> groups, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ACTIVITI_EXTENSIONS_PREFIX, ELEMENT_CUSTOM_RESOURCE, ACTIVITI_EXTENSIONS_NAMESPACE);
xtw.writeAttribute(ACTIVITI_EXTENSIONS_PREFIX, ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_NAME, identityType);
List<String> identityList = new ArrayList<String>();
if(users!=null)
for(String userId: users){
identityList.add("user("+userId+")");
}
if(groups!=null)
for(String groupId: groups){
identityList.add("group("+groupId+")");
}
String delimitedString = convertToDelimitedString(identityList);
xtw.writeStartElement(ELEMENT_RESOURCE_ASSIGNMENT);
xtw.writeStartElement(ELEMENT_FORMAL_EXPRESSION);
xtw.writeCharacters(delimitedString);
xtw.writeEndElement(); // End ELEMENT_CUSTOM_RESOURCE
xtw.writeEndElement(); // End ELEMENT_RESOURCE_ASSIGNMENT
xtw.writeEndElement(); // End ELEMENT_FORMAL_EXPRESSION
}
@Override
protected void writeAdditionalChildElements(BaseElement element, BpmnModel model, XMLStreamWriter xtw) throws Exception {
}
......@@ -140,9 +192,9 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
String resourceElement = XMLStreamReaderUtil.moveDown(xtr);
if (StringUtils.isNotEmpty(resourceElement) && "resourceAssignmentExpression".equals(resourceElement)) {
if (StringUtils.isNotEmpty(resourceElement) && ELEMENT_RESOURCE_ASSIGNMENT.equals(resourceElement)) {
String expression = XMLStreamReaderUtil.moveDown(xtr);
if (StringUtils.isNotEmpty(expression) && "formalExpression".equals(expression)) {
if (StringUtils.isNotEmpty(expression) && ELEMENT_FORMAL_EXPRESSION.equals(expression)) {
((UserTask) parentElement).setAssignee(xtr.getElementText());
}
}
......@@ -161,9 +213,9 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
String resourceElement = XMLStreamReaderUtil.moveDown(xtr);
if (StringUtils.isNotEmpty(resourceElement) && "resourceAssignmentExpression".equals(resourceElement)) {
if (StringUtils.isNotEmpty(resourceElement) && ELEMENT_RESOURCE_ASSIGNMENT.equals(resourceElement)) {
String expression = XMLStreamReaderUtil.moveDown(xtr);
if (StringUtils.isNotEmpty(expression) && "formalExpression".equals(expression)) {
if (StringUtils.isNotEmpty(expression) && ELEMENT_FORMAL_EXPRESSION.equals(expression)) {
List<String> assignmentList = CommaSplitter.splitCommas(xtr.getElementText());
......@@ -190,4 +242,46 @@ public class UserTaskXMLConverter extends BaseBpmnXMLConverter {
}
}
}
public class CustomIdentityLinkParser extends BaseChildElementParser {
public String getElementName() {
return ELEMENT_CUSTOM_RESOURCE;
}
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
String identityLinkType = xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_NAME);
if(identityLinkType == null) return;
String resourceElement = XMLStreamReaderUtil.moveDown(xtr);
if (StringUtils.isNotEmpty(resourceElement) && ELEMENT_RESOURCE_ASSIGNMENT.equals(resourceElement)) {
String expression = XMLStreamReaderUtil.moveDown(xtr);
if (StringUtils.isNotEmpty(expression) && ELEMENT_FORMAL_EXPRESSION.equals(expression)) {
List<String> assignmentList = CommaSplitter.splitCommas(xtr.getElementText());
for (String assignmentValue : assignmentList) {
if (assignmentValue == null)
continue;
assignmentValue = assignmentValue.trim();
if (assignmentValue.length() == 0)
continue;
String userPrefix = "user(";
String groupPrefix = "group(";
if (assignmentValue.startsWith(userPrefix)) {
assignmentValue = assignmentValue.substring(userPrefix.length(), assignmentValue.length() - 1).trim();
((UserTask) parentElement).addCustomUserIdentityLink(assignmentValue, identityLinkType);
} else if (assignmentValue.startsWith(groupPrefix)) {
assignmentValue = assignmentValue.substring(groupPrefix.length(), assignmentValue.length() - 1).trim();
((UserTask) parentElement).addCustomGroupIdentityLink(assignmentValue, identityLinkType);
} else {
((UserTask) parentElement).addCustomGroupIdentityLink(assignmentValue, identityLinkType);
}
}
}
}
}
}
}
......@@ -55,6 +55,13 @@ public class UserTaskConverterTest extends AbstractConverterTest {
assertTrue(userTask.getCandidateGroups().contains("management"));
assertTrue(userTask.getCandidateGroups().contains("sales"));
assertEquals(1, userTask.getCustomUserIdentityLinks().size());
assertEquals(2, userTask.getCustomGroupIdentityLinks().size());
assertTrue(userTask.getCustomUserIdentityLinks().get("businessAdministrator").contains("kermit"));
assertTrue(userTask.getCustomGroupIdentityLinks().get("manager").contains("management"));
assertTrue(userTask.getCustomGroupIdentityLinks().get("businessAdministrator").contains("management"));
List<FormProperty> formProperties = userTask.getFormProperties();
assertEquals(3, formProperties.size());
FormProperty formProperty = formProperties.get(0);
......
......@@ -7,6 +7,16 @@
<sequenceFlow id="sid-AA1205FD-63BD-47BA-9FB3-AA9F7C1E31F0" sourceRef="usertask" targetRef="endEvent"></sequenceFlow>
<userTask id="usertask" name="User task" activiti:async="true" activiti:exclusive="false" activiti:assignee="kermit" activiti:candidateUsers="kermit,fozzie" activiti:candidateGroups="management,sales" activiti:dueDate="2012-11-01" activiti:formKey="testKey" activiti:priority="40">
<extensionElements>
<activiti:customResource activiti:name="businessAdministrator">
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</activiti:customResource>
<activiti:customResource activiti:name="manager">
<resourceAssignmentExpression>
<formalExpression>group(management)</formalExpression>
</resourceAssignmentExpression>
</activiti:customResource>
<activiti:formProperty id="formId" name="formName" type="string" expression="${expression}" variable="variable"></activiti:formProperty>
<activiti:formProperty id="formId2" name="anotherName" type="long"></activiti:formProperty>
<activiti:formProperty id="formId3" name="enumName" type="enum">
......@@ -47,4 +57,4 @@
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
\ No newline at end of file
</definitions>
......@@ -13,7 +13,12 @@
package org.activiti.bpmn.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Tijs Rademakers
......@@ -30,6 +35,9 @@ public class UserTask extends Task {
protected List<String> candidateGroups = new ArrayList<String>();
protected List<FormProperty> formProperties = new ArrayList<FormProperty>();
protected List<ActivitiListener> taskListeners = new ArrayList<ActivitiListener>();
protected Map<String, Set<String>> customUserIdentityLinks = new HashMap<String, Set<String>>();
protected Map<String, Set<String>> customGroupIdentityLinks = new HashMap<String, Set<String>>();
public String getAssignee() {
return assignee;
......@@ -92,6 +100,46 @@ public class UserTask extends Task {
this.taskListeners = taskListeners;
}
public void addCustomUserIdentityLink(String userId, String type){
Set<String> userIdentitySet = customUserIdentityLinks.get(type);
if(userIdentitySet == null){
userIdentitySet = new HashSet<String>();
customUserIdentityLinks.put(type, userIdentitySet);
}
userIdentitySet.add(userId);
}
public void addCustomGroupIdentityLink(String groupId, String type){
Set<String> groupIdentitySet = customGroupIdentityLinks.get(type);
if(groupIdentitySet == null){
groupIdentitySet = new HashSet<String>();
customGroupIdentityLinks.put(type, groupIdentitySet);
}
groupIdentitySet.add(groupId);
}
public Map<String, Set<String>> getCustomUserIdentityLinks() {
return customUserIdentityLinks;
}
public void setCustomUserIdentityLinks(
Map<String, Set<String>> customUserIdentityLinks) {
this.customUserIdentityLinks = customUserIdentityLinks;
}
public Map<String, Set<String>> getCustomGroupIdentityLinks() {
return customGroupIdentityLinks;
}
public void setCustomGroupIdentityLinks(
Map<String, Set<String>> customGroupIdentityLinks) {
this.customGroupIdentityLinks = customGroupIdentityLinks;
}
public UserTask clone() {
UserTask clone = new UserTask();
clone.setValues(this);
......@@ -110,6 +158,9 @@ public class UserTask extends Task {
setCandidateGroups(new ArrayList<String>(otherElement.getCandidateGroups()));
setCandidateUsers(new ArrayList<String>(otherElement.getCandidateUsers()));
setCustomGroupIdentityLinks(otherElement.customGroupIdentityLinks);
setCustomUserIdentityLinks(otherElement.customUserIdentityLinks);
formProperties = new ArrayList<FormProperty>();
if (otherElement.getFormProperties() != null && otherElement.getFormProperties().size() > 0) {
for (FormProperty property : otherElement.getFormProperties()) {
......
......@@ -12,17 +12,12 @@
*/
package org.activiti.engine.impl.bpmn.parser.handler;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.converter.util.CommaSplitter;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.ExtensionElement;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.Expression;
......@@ -43,9 +38,6 @@ import org.apache.commons.lang3.StringUtils;
public class UserTaskParseHandler extends AbstractActivityBpmnParseHandler<UserTask> {
public static final String PROPERTY_TASK_DEFINITION = "taskDefinition";
private static final String USER = "user";
private static final String GROUP = "group";
private static final String COMMA_SPACE = ", ";
public Class< ? extends BaseElement> getHandledType() {
return UserTask.class;
......@@ -119,7 +111,23 @@ public class UserTaskParseHandler extends AbstractActivityBpmnParseHandler<UserT
taskDefinition.setFormKeyExpression(expressionManager.createExpression(userTask.getFormKey()));
}
parseCustomIdentityLinks(bpmnParse, userTask, taskDefinition);
// CustomUserIdentityLinks
for (String customUserIdentityLinkType : userTask.getCustomUserIdentityLinks().keySet()) {
Set<Expression> userIdentityLinkExpression = new HashSet<Expression>();
for (String userIdentityLink : userTask.getCustomUserIdentityLinks().get(customUserIdentityLinkType)) {
userIdentityLinkExpression.add(expressionManager.createExpression(userIdentityLink));
}
taskDefinition.addCustomUserIdentityLinkExpression(customUserIdentityLinkType, userIdentityLinkExpression);
}
// CustomGroupIdentityLinks
for (String customGroupIdentityLinkType : userTask.getCustomGroupIdentityLinks().keySet()) {
Set<Expression> groupIdentityLinkExpression = new HashSet<Expression>();
for (String groupIdentityLink : userTask.getCustomGroupIdentityLinks().get(customGroupIdentityLinkType)) {
groupIdentityLinkExpression.add(expressionManager.createExpression(groupIdentityLink));
}
taskDefinition.addCustomGroupIdentityLinkExpression(customGroupIdentityLinkType, groupIdentityLinkExpression);
}
return taskDefinition;
}
......@@ -136,138 +144,4 @@ public class UserTaskParseHandler extends AbstractActivityBpmnParseHandler<UserT
}
return taskListener;
}
protected void parseCustomIdentityLinks(BpmnParse bpmnParse, UserTask userTask, TaskDefinition taskDefinition) {
Map<String, List<ExtensionElement>> extensionElements = userTask.getExtensionElements();
if (extensionElements != null) {
List<ExtensionElement> resourceLists = extensionElements.get(BpmnXMLConstants.ELEMENT_CUSTOM_RESOURCE);
if (resourceLists != null) {
for (ExtensionElement resourceList : resourceLists) {
String resourceType = resourceList.getAttributeValue(BpmnXMLConstants.ACTIVITI_EXTENSIONS_NAMESPACE, BpmnXMLConstants.ATTRIBUTE_NAME);
Map<String, String> resources = getResources(resourceType, userTask);
if (resources != null) {
// check for user type resources
Set<Expression> resourceExpression = convertToExpressions(false, bpmnParse, resources.get(USER));
if (resourceExpression != null) {
taskDefinition.addCustomUserIdentityLinkExpression(resourceType, resourceExpression);
}
// check for group type resources
resourceExpression = convertToExpressions(true, bpmnParse, resources.get(GROUP));
if (resourceExpression != null) {
taskDefinition.addCustomGroupIdentityLinkExpression(resourceType, resourceExpression);
}
}
}
}
}
}
protected Set<Expression> convertToExpressions(boolean isGroup, BpmnParse bpmnParse, String resourceExpression) {
ExpressionManager expressionManager = bpmnParse.getExpressionManager();
Set<Expression> resources = new HashSet<Expression>();
List<String> resourceList = CommaSplitter.splitCommas(resourceExpression);
if (null != resourceList) {
for (String resource : resourceList) {
resources.add(expressionManager.createExpression(resource));
}
}
return resources;
}
protected Map<String, String> getResources(String resourceType, UserTask userTask) {
Map<String, List<ExtensionElement>> extensions = userTask.getExtensionElements();
String resourceExpression = null;
if (extensions != null) {
// top level of resource extension - customResource element
List<ExtensionElement> resourceElements = extensions.get(BpmnXMLConstants.ELEMENT_CUSTOM_RESOURCE);
if (resourceElements != null) {
for (ExtensionElement resourceElement : resourceElements) {
// type of custom resource extension (e.g. businessAdministrator attribute)
if (resourceType.equals(resourceElement.getAttributeValue(BpmnXMLConstants.ACTIVITI_EXTENSIONS_NAMESPACE, BpmnXMLConstants.ATTRIBUTE_NAME))) {
if (resourceElement != null) {
// first child - resourceAssignmentExpression element
resourceElement = getChildElement(BpmnXMLConstants.ELEMENT_RESOURCE_ASSIGNMENT, resourceElement);
if (resourceElement != null) {
// second child - formalExpression element
resourceElement = getChildElement(BpmnXMLConstants.ELEMENT_FORMAL_EXPRESSION, resourceElement);
if (resourceElement != null) {
resourceExpression = resourceElement.getElementText();
}
}
}
}
}
}
}
return generateResourceLists(resourceExpression);
}
protected Map<String, String> generateResourceLists(String resourceExpression) {
Map<String, String> resourceLists = null;
if (resourceExpression != null) {
StringBuilder userExpression = new StringBuilder(50);
StringBuilder groupExpression = new StringBuilder(50);
List<String> assignmentList = CommaSplitter.splitCommas(resourceExpression);
for (String assignmentValue : assignmentList) {
assignmentValue = StringUtils.trimToNull(assignmentValue);
if (assignmentValue == null) {
continue;
}
if (assignmentValue.startsWith(USER)) {
List<String> userList =
CommaSplitter.splitCommas(assignmentValue.substring(USER.length() + 1,
assignmentValue.length() - 1).trim());
for (String user : userList) {
if (StringUtils.isNotEmpty(userExpression.toString())) {
userExpression.append(COMMA_SPACE);
}
userExpression.append(user);
}
} else if (assignmentValue.startsWith(GROUP)) {
List<String> groupList =
CommaSplitter.splitCommas(assignmentValue.substring(GROUP.length() + 1,
assignmentValue.length() - 1).trim());
for (String group : groupList) {
if (StringUtils.isNotEmpty(groupExpression.toString())) {
groupExpression.append(COMMA_SPACE);
}
groupExpression.append(group);
}
} else {
if (StringUtils.isNotEmpty(groupExpression.toString())) {
groupExpression.append(COMMA_SPACE);
}
groupExpression.append(assignmentValue);
}
}
resourceLists = new HashMap<String, String>();
resourceLists.put(USER, userExpression.toString());
resourceLists.put(GROUP, groupExpression.toString());
}
return resourceLists;
}
protected ExtensionElement getChildElement(String key, ExtensionElement element) {
if (element != null) {
List<ExtensionElement> extensionElements = element.getChildElements().get(key);
if (extensionElements != null) {
return extensionElements.get(0);
}
}
return null;
}
}
......@@ -145,9 +145,15 @@ public interface StencilConstants {
final String PROPERTY_USERTASK_ASSIGNMENT = "usertaskassignment";
final String PROPERTY_USERTASK_ASSIGNMENT_TYPE = "assignment_type";
final String PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION = "resourceassignmentexpr";
final String PROPERTY_USERTASK_OWNER = "owner";
final String PROPERTY_USERTASK_ASSIGNEE = "assignee";
final String PROPERTY_USERTASK_CANDIDATE_USERS = "candidateUsers";
final String PROPERTY_USERTASK_CANDIDATE_GROUPS = "candidateGroups";
final String PROPERTY_USERTASK_CUSTOM_IDENTITY_LINKS = "customidentitylinks";
final String PROPERTY_USERTASK_IDENTITY_TYPE = "identity_type";
final String PROPERTY_USERTASK_IDENTITY_LINK_TYPE = "identity_link_type";
final String PROPERTY_USERTASK_IDENTITY_LINK_EXPRESSION = "identitylinkexpr";
final String PROPERTY_SERVICETASK_CLASS = "servicetaskclass";
final String PROPERTY_SERVICETASK_EXPRESSION = "servicetaskexpression";
......
......@@ -12,8 +12,12 @@
*/
package org.activiti.editor.language.json.converter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.FlowElement;
......@@ -52,14 +56,22 @@ public class UserTaskJsonConverter extends BaseBpmnJsonConverter {
@Override
protected void convertElementToJson(ObjectNode propertiesNode, FlowElement flowElement) {
UserTask userTask = (UserTask) flowElement;
String owner = userTask.getOwner();
String assignee = userTask.getAssignee();
String candidateUsers = convertListToCommaSeparatedString(userTask.getCandidateUsers());
String candidateGroups = convertListToCommaSeparatedString(userTask.getCandidateGroups());
if (StringUtils.isNotEmpty(assignee) || StringUtils.isNotEmpty(candidateUsers) || StringUtils.isNotEmpty(candidateGroups)) {
if (StringUtils.isNotEmpty(owner) || StringUtils.isNotEmpty(assignee) || StringUtils.isNotEmpty(candidateUsers) || StringUtils.isNotEmpty(candidateGroups)) {
ObjectNode assignmentNode = objectMapper.createObjectNode();
ArrayNode itemsNode = objectMapper.createArrayNode();
if (StringUtils.isNotEmpty(owner)) {
ObjectNode assignmentItemNode = objectMapper.createObjectNode();
assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_TYPE, PROPERTY_USERTASK_OWNER);
assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, owner);
itemsNode.add(assignmentItemNode);
}
if (StringUtils.isNotEmpty(assignee)) {
ObjectNode assignmentItemNode = objectMapper.createObjectNode();
assignmentItemNode.put(PROPERTY_USERTASK_ASSIGNMENT_TYPE, PROPERTY_USERTASK_ASSIGNEE);
......@@ -84,8 +96,37 @@ public class UserTaskJsonConverter extends BaseBpmnJsonConverter {
assignmentNode.put("totalCount", itemsNode.size());
assignmentNode.put(EDITOR_PROPERTIES_GENERAL_ITEMS, itemsNode);
propertiesNode.put(PROPERTY_USERTASK_ASSIGNMENT, assignmentNode);
}
if(userTask.getCustomUserIdentityLinks().size() > 0 || userTask.getCustomGroupIdentityLinks().size() > 0){
ObjectNode customIdentityLinksNode = objectMapper.createObjectNode();
ArrayNode itemsNode = objectMapper.createArrayNode();
for(String linkType : userTask.getCustomUserIdentityLinks().keySet()){
ObjectNode identityItemNode = objectMapper.createObjectNode();
identityItemNode.put(PROPERTY_USERTASK_IDENTITY_TYPE, "user");
identityItemNode.put(PROPERTY_USERTASK_IDENTITY_LINK_TYPE, linkType);
String users = convertListToCommaSeparatedString(new ArrayList<String>(userTask.getCustomUserIdentityLinks().get(linkType)));
identityItemNode.put(PROPERTY_USERTASK_IDENTITY_LINK_EXPRESSION, users);
itemsNode.add(identityItemNode);
}
for(String linkType : userTask.getCustomGroupIdentityLinks().keySet()){
ObjectNode identityItemNode = objectMapper.createObjectNode();
identityItemNode.put(PROPERTY_USERTASK_IDENTITY_TYPE, "group");
identityItemNode.put(PROPERTY_USERTASK_IDENTITY_LINK_TYPE, linkType);
String groups = convertListToCommaSeparatedString(new ArrayList<String>(userTask.getCustomGroupIdentityLinks().get(linkType)));
identityItemNode.put(PROPERTY_USERTASK_IDENTITY_LINK_EXPRESSION, groups);
itemsNode.add(identityItemNode);
}
customIdentityLinksNode.put("totalCount", itemsNode.size());
customIdentityLinksNode.put(EDITOR_PROPERTIES_GENERAL_ITEMS, itemsNode);
propertiesNode.put(PROPERTY_USERTASK_CUSTOM_IDENTITY_LINKS, customIdentityLinksNode);
}
if (userTask.getPriority() != null) {
setPropertyValue(PROPERTY_PRIORITY, userTask.getPriority().toString(), propertiesNode);
}
......@@ -117,6 +158,8 @@ public class UserTaskJsonConverter extends BaseBpmnJsonConverter {
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_OWNER.equals(assignmentType)) {
task.setOwner(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)) {
......@@ -126,7 +169,42 @@ public class UserTaskJsonConverter extends BaseBpmnJsonConverter {
}
}
}
JsonNode customIdentityLinksNode = getProperty(PROPERTY_USERTASK_CUSTOM_IDENTITY_LINKS, elementNode);
if (customIdentityLinksNode != null) {
JsonNode itemsNode = customIdentityLinksNode.get(EDITOR_PROPERTIES_GENERAL_ITEMS);
if (itemsNode != null) {
Iterator<JsonNode> customIdentityLinksIterator = itemsNode.elements();
while (customIdentityLinksIterator.hasNext()) {
JsonNode customIdentityLinksItemNode = customIdentityLinksIterator.next();
if (customIdentityLinksItemNode.get(PROPERTY_USERTASK_IDENTITY_TYPE) != null && customIdentityLinksItemNode.get(PROPERTY_USERTASK_IDENTITY_LINK_TYPE) != null
&& customIdentityLinksItemNode.get(PROPERTY_USERTASK_IDENTITY_LINK_EXPRESSION) != null) {
String identityType = customIdentityLinksItemNode.get(PROPERTY_USERTASK_IDENTITY_TYPE).asText();
String identityLinkType = customIdentityLinksItemNode.get(PROPERTY_USERTASK_IDENTITY_LINK_TYPE).asText();
List<String> identitiesList = getValueAsList(PROPERTY_USERTASK_IDENTITY_LINK_EXPRESSION, customIdentityLinksItemNode);
if ("user".equals(identityType)) {
Set<String> users = task.getCustomUserIdentityLinks().get(identityLinkType);
if(users == null){
users = new HashSet<String>();
task.getCustomUserIdentityLinks().put(identityLinkType, users);
}
users.addAll(identitiesList);
}else if ("group".equals(identityType)) {
Set<String> groups = task.getCustomGroupIdentityLinks().get(identityLinkType);
if(groups == null){
groups = new HashSet<String>();
task.getCustomGroupIdentityLinks().put(identityLinkType, groups);
}
groups.addAll(identitiesList);
}
}
}
}
}
convertJsonToFormProperties(elementNode, task);
return task;
}
}
}
\ No newline at end of file
......@@ -49,7 +49,9 @@ public class UserTaskConverterTest extends AbstractConverterTest {
assertEquals("testKey", userTask.getFormKey());
assertEquals("40", userTask.getPriority());
assertEquals("2012-11-01", userTask.getDueDate());
assertEquals("defaultCategory", userTask.getCategory());
assertEquals("gonzo", userTask.getOwner());
assertEquals("kermit", userTask.getAssignee());
assertEquals(2, userTask.getCandidateUsers().size());
assertTrue(userTask.getCandidateUsers().contains("kermit"));
......@@ -58,6 +60,15 @@ public class UserTaskConverterTest extends AbstractConverterTest {
assertTrue(userTask.getCandidateGroups().contains("management"));
assertTrue(userTask.getCandidateGroups().contains("sales"));
assertEquals(2, userTask.getCustomUserIdentityLinks().size());
assertEquals(1, userTask.getCustomGroupIdentityLinks().size());
assertTrue(userTask.getCustomUserIdentityLinks().get("bizAdmin").contains("kermit"));
assertTrue(userTask.getCustomGroupIdentityLinks().get("bizAdmin").contains("management"));
assertTrue(userTask.getCustomGroupIdentityLinks().get("bizAdmin").contains("sales"));
assertTrue(userTask.getCustomUserIdentityLinks().get("manager").contains("fozzie"));
assertTrue(userTask.getCustomUserIdentityLinks().get("manager").contains("gonzo"));
List<FormProperty> formProperties = userTask.getFormProperties();
assertEquals(2, formProperties.size());
FormProperty formProperty = formProperties.get(0);
......
......@@ -39,6 +39,7 @@
"duedatedefinition" : "2012-11-01",
"exclusivedefinition" : "No",
"formkeydefinition" : "testKey",
"categoryDefinition" : "defaultCategory",
"formproperties" : { "items" : [ { "formproperty_expression" : "${expression}",
"formproperty_id" : "formId",
"formproperty_name" : "formName",
......@@ -62,6 +63,9 @@
"usertaskassignment" : { "items" : [ { "assignment_type" : "assignee",
"resourceassignmentexpr" : "kermit"
},
{ "assignment_type" : "owner",
"resourceassignmentexpr" : "gonzo"
},
{ "assignment_type" : "candidateUsers",
"resourceassignmentexpr" : "kermit,fozzie"
},
......@@ -69,6 +73,21 @@
"resourceassignmentexpr" : "management,sales"
}
],
"totalCount" : 4
},
"customidentitylinks" : { "items" : [ { "identity_type" : "user",
"identity_link_type" : "manager",
"identitylinkexpr" : "fozzie, gonzo"
},
{ "identity_type" : "user",
"identity_link_type" : "bizAdmin",
"identitylinkexpr" : "kermit"
},
{ "identity_type" : "group",
"identity_link_type" : "bizAdmin",
"identitylinkexpr" : "management,sales"
}
],
"totalCount" : 3
}
},
......
......@@ -100,7 +100,15 @@
"value" : "",
"description" : "Priority of the user task.",
"popular" : true
} ]
}, {
"id" : "categoryDefinition",
"type" : "String",
"title" : "Category",
"value" : "",
"description" : "Category of the user task.",
"popular" : true
}
]
}, {
"name" : "usertaskassignment",
"properties" : [ {
......@@ -136,6 +144,12 @@
"title_de" : "PotentialOwner",
"value" : "candidateGroups",
"refToView" : ""
}, {
"id" : "c4",
"title" : "Owner",
"title_de" : "Owner",
"value" : "owner",
"refToView" : ""
} ]
}, {
"id" : "resourceassignmentexpr",
......@@ -150,6 +164,55 @@
} ]
} ]
}, {
"name" : "customidentitylinks",
"properties" : [ {
"id" : "customidentitylinks",
"type" : "Complex",
"title" : "Identity Links",
"value" : "",
"description" : "Custom Assignment definition for the user task",
"popular" : true,
"complexItems" : [ {
"id" : "identity_type",
"name" : "Identity Type",
"type" : "Choice",
"value" : "",
"width" : 80,
"optional" : false,
"items" : [ {
"id" : "c1",
"title" : "User",
"title_de" : "User",
"value" : "user",
"refToView" : ""
}, {
"id" : "c2",
"title" : "Group",
"title_de" : "Group",
"value" : "group",
"refToView" : ""
}]
}, {
"id" : "identity_link_type",
"name" : "Identity Link Type",
"type" : "String",
"description" : "This defines the expression used for the resource assignment.",
"description_de" : "Definiert den Ausdruck, der fr die Zordung von Ressourcen genutzt wird.",
"value" : "",
"width" : 200,
"optional" : true
}, {
"id" : "identitylinkexpr",
"name" : "Resource assignment expression",
"type" : "String",
"description" : "This defines the expression used for the resource assignment.",
"description_de" : "Definiert den Ausdruck, der fr die Zordung von Ressourcen genutzt wird.",
"value" : "",
"width" : 200,
"optional" : true
} ]
} ]
}, {
"name" : "formdefinition",
"properties" : [ {
"id" : "formproperties",
......@@ -1225,7 +1288,7 @@
"view" : "activity/usertask.svg",
"icon" : "activity/list/type.user.png",
"groups" : [ "Activities" ],
"propertyPackages" : [ "elementbase", "baseattributes", "usertaskbase", "usertaskassignment", "formdefinition", "tasklistenersbase", "asynchronousbase", "loopcharacteristics", "activity" ],
"propertyPackages" : [ "elementbase", "baseattributes", "usertaskbase", "usertaskassignment", "customidentitylinks", "formdefinition", "tasklistenersbase", "asynchronousbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}, {
"type" : "node",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册