protected CustomUserTask findCustomUserTask(UserTask userTask) { CustomUserTask result = null; if (userTask.isExtended()) { final List<CustomUserTask> customUserTasks = ExtensionUtil.getCustomUserTasks( ActivitiUiUtil.getProjectFromDiagram(getDiagramTypeProvider().getDiagram())); for (final CustomUserTask customUserTask : customUserTasks) { if (userTask.getExtensionId().equals(customUserTask.getId())) { result = customUserTask; break; } } } return result; }
@SuppressWarnings({"rawtypes", "unchecked"}) protected void drawFlowElements( Collection<FlowElement> elementList, Map<String, GraphicInfo> locationMap, ContainerShape parentShape, Process process) { final IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider(); List<FlowElement> noDIList = new ArrayList<FlowElement>(); for (FlowElement flowElement : elementList) { if (flowElement instanceof SequenceFlow) { continue; } AddContext context = new AddContext(new AreaContext(), flowElement); IAddFeature addFeature = featureProvider.getAddFeature(context); if (addFeature == null) { System.out.println("Element not supported: " + flowElement); return; } GraphicInfo graphicInfo = locationMap.get(flowElement.getId()); if (graphicInfo == null) { noDIList.add(flowElement); } else { context.setNewObject(flowElement); context.setSize((int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); ContainerShape parentContainer = null; if (parentShape instanceof Diagram) { parentContainer = getParentContainer(flowElement.getId(), process, (Diagram) parentShape); } else { parentContainer = parentShape; } context.setTargetContainer(parentContainer); if (parentContainer instanceof Diagram == false) { Point location = getLocation(parentContainer); context.setLocation( (int) graphicInfo.getX() - location.x, (int) graphicInfo.getY() - location.y); } else { context.setLocation((int) graphicInfo.getX(), (int) graphicInfo.getY()); } if (flowElement instanceof ServiceTask) { ServiceTask serviceTask = (ServiceTask) flowElement; if (serviceTask.isExtended()) { CustomServiceTask targetTask = findCustomServiceTask(serviceTask); if (targetTask != null) { for (FieldExtension field : serviceTask.getFieldExtensions()) { CustomProperty customFieldProperty = new CustomProperty(); customFieldProperty.setName(field.getFieldName()); if (StringUtils.isNotEmpty(field.getExpression())) { customFieldProperty.setSimpleValue(field.getExpression()); } else { customFieldProperty.setSimpleValue(field.getStringValue()); } serviceTask.getCustomProperties().add(customFieldProperty); } serviceTask.getFieldExtensions().clear(); } } } else if (flowElement instanceof UserTask) { UserTask userTask = (UserTask) flowElement; if (userTask.isExtended()) { CustomUserTask targetTask = findCustomUserTask(userTask); if (targetTask != null) { final List<Class<CustomUserTask>> classHierarchy = new ArrayList<Class<CustomUserTask>>(); final List<String> fieldInfoObjects = new ArrayList<String>(); Class clazz = targetTask.getClass(); classHierarchy.add(clazz); boolean hierarchyOpen = true; while (hierarchyOpen) { clazz = clazz.getSuperclass(); if (CustomUserTask.class.isAssignableFrom(clazz)) { classHierarchy.add(clazz); } else { hierarchyOpen = false; } } for (final Class<CustomUserTask> currentClass : classHierarchy) { for (final Field field : currentClass.getDeclaredFields()) { if (field.isAnnotationPresent(Property.class)) { fieldInfoObjects.add(field.getName()); } } } for (String fieldName : userTask.getExtensionElements().keySet()) { if (fieldInfoObjects.contains(fieldName)) { CustomProperty customFieldProperty = new CustomProperty(); customFieldProperty.setName(fieldName); customFieldProperty.setSimpleValue( userTask.getExtensionElements().get(fieldName).get(0).getElementText()); userTask.getCustomProperties().add(customFieldProperty); } } for (String fieldName : fieldInfoObjects) { userTask.getExtensionElements().remove(fieldName); } } } } if (flowElement instanceof BoundaryEvent) { BoundaryEvent boundaryEvent = (BoundaryEvent) flowElement; if (boundaryEvent.getAttachedToRef() != null) { ContainerShape container = (ContainerShape) featureProvider.getPictogramElementForBusinessObject( boundaryEvent.getAttachedToRef()); if (container != null) { AddContext boundaryContext = new AddContext(new AreaContext(), boundaryEvent); boundaryContext.setTargetContainer(container); Point location = getLocation(container); boundaryContext.setLocation( (int) graphicInfo.getX() - location.x, (int) graphicInfo.getY() - location.y); if (addFeature.canAdd(boundaryContext)) { addFeature.add(boundaryContext); } } } } else if (addFeature.canAdd(context)) { PictogramElement newContainer = addFeature.add(context); featureProvider.link(newContainer, new Object[] {flowElement}); if (flowElement instanceof SubProcess) { drawFlowElements( ((SubProcess) flowElement).getFlowElements(), locationMap, (ContainerShape) newContainer, process); } } } } for (FlowElement flowElement : noDIList) { if (flowElement instanceof BoundaryEvent) { ((BoundaryEvent) flowElement).getAttachedToRef().getBoundaryEvents().remove(flowElement); } else { // do not remove Data Objects if (flowElement instanceof DataObject == false) { elementList.remove(flowElement); } } } }