super.writePlanItemDefinitionSpecificAttributes(serviceTask, xtw); if (StringUtils.isNotEmpty(serviceTask.getType())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_TYPE, serviceTask.getType()); switch (serviceTask.getType()) { case ServiceTask.JAVA_TASK: if (StringUtils.isNotEmpty(serviceTask.getImplementation())) { if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(serviceTask.getImplementationType())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_CLASS, serviceTask.getImplementation()); } else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equals(serviceTask.getImplementationType())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_EXPRESSION, serviceTask.getImplementation()); } else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(serviceTask.getImplementationType())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_DELEGATE_EXPRESSION, serviceTask.getImplementation()); if (StringUtils.isNotEmpty(serviceTask.getResultVariableName())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_RESULT_VARIABLE_NAME, serviceTask.getResultVariableName()); if (StringUtils.isNotEmpty(serviceTask.getImplementation())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_CLASS, serviceTask.getImplementation()); if (StringUtils.isNotBlank(serviceTask.getImplementationType())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_SCRIPT_FORMAT, serviceTask.getImplementationType()); if (StringUtils.isNotEmpty(serviceTask.getResultVariableName())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_RESULT_VARIABLE_NAME, serviceTask.getResultVariableName());
@Override public PlanItemDelegateExpressionActivityBehavior createPlanItemDelegateExpressionActivityBehavior(PlanItem planItem, ServiceTask task) { return new PlanItemDelegateExpressionActivityBehavior(task.getImplementation(), task.getFieldExtensions()); }
@Override public PlanItemExpressionActivityBehavior createPlanItemExpressionActivityBehavior(PlanItem planItem, ServiceTask task) { return new PlanItemExpressionActivityBehavior(task.getImplementation(), task.getResultVariableName()); }
@Override protected void executePlanItemParse(CmmnParserImpl cmmnParser, CmmnParseResult cmmnParseResult, PlanItem planItem, ServiceTask serviceTask) { CmmnActivityBehaviorFactory activityBehaviorFactory = cmmnParser.getActivityBehaviorFactory(); switch (serviceTask.getType()) { case HttpServiceTask.HTTP_TASK: planItem.setBehavior(activityBehaviorFactory.createHttpActivityBehavior(planItem, serviceTask)); break; default: // java task type was not set in the version <= 6.2.0 that's why we have to assume that default service task type is java if (StringUtils.isNotEmpty(serviceTask.getImplementation())) { if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(serviceTask.getImplementationType())) { planItem.setBehavior(activityBehaviorFactory.createCmmnClassDelegate(planItem, serviceTask)); } else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equals(serviceTask.getImplementationType())) { planItem.setBehavior(activityBehaviorFactory.createPlanItemExpressionActivityBehavior(planItem, serviceTask)); } else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(serviceTask.getImplementationType())) { planItem.setBehavior(activityBehaviorFactory.createPlanItemDelegateExpressionActivityBehavior(planItem, serviceTask)); } } break; } }
switch (type) { case ServiceTask.JAVA_TASK: ServiceTask serviceTask = new ServiceTask(); serviceTask.setType(ServiceTask.JAVA_TASK); serviceTask.setImplementation(className); serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); serviceTask.setImplementation(expression); serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION); serviceTask.setImplementation(delegateExpression); serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); serviceTask.setResultVariableName(xtr.getAttributeValue(CmmnXmlConstants.FLOWABLE_EXTENSIONS_NAMESPACE, CmmnXmlConstants.ATTRIBUTE_RESULT_VARIABLE_NAME)); task = serviceTask; break;
@Override public CmmnActivityBehavior createHttpActivityBehavior(PlanItem planItem, ServiceTask task) { try { Class<?> theClass = null; FieldExtension behaviorExtension = null; for (FieldExtension fieldExtension : task.getFieldExtensions()) { if ("httpActivityBehaviorClass".equals(fieldExtension.getFieldName()) && StringUtils.isNotEmpty(fieldExtension.getStringValue())) { theClass = Class.forName(fieldExtension.getStringValue()); behaviorExtension = fieldExtension; break; } } if (behaviorExtension != null) { task.getFieldExtensions().remove(behaviorExtension); } // Default Http behavior class if (theClass == null) { theClass = Class.forName("org.flowable.http.cmmn.impl.CmmnHttpActivityBehaviorImpl"); } return (CmmnActivityBehavior) classDelegateFactory.defaultInstantiateDelegate(theClass, task); } catch (ClassNotFoundException e) { throw new FlowableException("Could not find org.flowable.http.HttpActivityBehavior: ", e); } }
protected void processElements(List<PlanItem> planItemList, CmmnModel model, ArrayNode elementArray, ArrayNode flowArray, GraphicInfo diagramInfo) { for (PlanItem planItem : planItemList) { ObjectNode elementNode = objectMapper.createObjectNode(); elementNode.put("id", planItem.getId()); elementNode.put("name", planItem.getName()); GraphicInfo graphicInfo = model.getGraphicInfo(planItem.getId()); if (graphicInfo != null) { fillGraphicInfo(elementNode, graphicInfo, true); fillDiagramInfo(graphicInfo, diagramInfo); } PlanItemDefinition planItemDefinition = planItem.getPlanItemDefinition(); String className = planItemDefinition.getClass().getSimpleName(); elementNode.put("type", className); if (planItemDefinition instanceof ServiceTask) { ServiceTask serviceTask = (ServiceTask) planItemDefinition; if (HttpServiceTask.HTTP_TASK.equals(serviceTask.getType())) { elementNode.put("taskType", "http"); } } elementArray.add(elementNode); processCriteria(planItem.getEntryCriteria(), "EntryCriterion", model, elementArray); processCriteria(planItem.getExitCriteria(), "ExitCriterion", model, elementArray); if (planItemDefinition instanceof Stage) { Stage stage = (Stage) planItemDefinition; processElements(stage.getPlanItems(), model, elementArray, flowArray, diagramInfo); } } }
((ServiceTask) currentCmmnElement).getFieldExtensions().add(extension);
@Override public CmmnClassDelegate createCmmnClassDelegate(PlanItem planItem, ServiceTask task) { return classDelegateFactory.create(task.getImplementation(), task.getFieldExtensions()); }
protected static Object defaultInstantiateDelegate(String className, ServiceTask serviceTask) { Object object = ReflectUtil.instantiate(className); for (FieldExtension extension : serviceTask.getFieldExtensions()) { String value; if (StringUtils.isEmpty(extension.getStringValue())) { value = extension.getExpression(); } else { value = extension.getStringValue(); } ReflectUtil.invokeSetterOrField(object, extension.getFieldName(), value, false); } if (serviceTask != null) { ReflectUtil.invokeSetterOrField(object, "serviceTask", serviceTask, false); } return object; }