Search in sources :

Example 11 with Artifact

use of org.eclipse.bpmn2.Artifact in project kie-wb-common by kiegroup.

the class Bpmn2JsonMarshaller method marshallSubProcess.

protected void marshallSubProcess(SubProcess subProcess, BPMNPlane plane, JsonGenerator generator, float xOffset, float yOffset, String preProcessingData, Definitions def, Map<String, Object> flowElementProperties) throws JsonGenerationException, IOException {
    Map<String, Object> properties = new LinkedHashMap<String, Object>(flowElementProperties);
    if (subProcess.getName() != null) {
        properties.put(NAME, StringEscapeUtils.unescapeXml(subProcess.getName()));
    } else {
        properties.put(NAME, "");
    }
    putDocumentationProperty(subProcess, properties);
    // overwrite name if elementname extension element is present
    String elementName = Utils.getMetaDataValue(subProcess.getExtensionValues(), "elementname");
    if (elementName != null) {
        properties.put(NAME, elementName);
    }
    if (subProcess instanceof AdHocSubProcess) {
        setAdHocSubProcessProperties((AdHocSubProcess) subProcess, properties);
    }
    // custom async
    String customAsyncMetaData = Utils.getMetaDataValue(subProcess.getExtensionValues(), "customAsync");
    String customAsync = (customAsyncMetaData != null && customAsyncMetaData.length() > 0) ? customAsyncMetaData : "false";
    properties.put(ISASYNC, customAsync);
    // data inputs
    String datainputset = marshallDataInputSet(subProcess, properties);
    // data outputs
    String dataoutputset = marshallDataOutputSet(subProcess, properties);
    // assignments
    StringBuilder associationBuff = new StringBuilder();
    List<DataInputAssociation> inputAssociations = subProcess.getDataInputAssociations();
    List<DataOutputAssociation> outputAssociations = subProcess.getDataOutputAssociations();
    marshallDataInputAssociations(associationBuff, inputAssociations);
    marshallDataOutputAssociations(associationBuff, outputAssociations);
    String assignmentString = associationBuff.toString();
    if (assignmentString.endsWith(",")) {
        assignmentString = assignmentString.substring(0, assignmentString.length() - 1);
    }
    properties.put(ASSIGNMENTS, assignmentString);
    setAssignmentsInfoProperty(null, datainputset, null, dataoutputset, assignmentString, properties);
    // on-entry and on-exit actions
    ScriptTypeListValue onEntryActions = getOnEntryActions(subProcess.getExtensionValues());
    ScriptTypeListValue onExitActions = getOnExitActions(subProcess.getExtensionValues());
    if (!onEntryActions.isEmpty()) {
        properties.put(ONENTRYACTIONS, new ScriptTypeListTypeSerializer().serialize(onEntryActions));
    }
    if (!onExitActions.isEmpty()) {
        properties.put(ONEXITACTIONS, new ScriptTypeListTypeSerializer().serialize(onExitActions));
    }
    // loop characteristics
    boolean haveValidLoopCharacteristics = false;
    if (subProcess.getLoopCharacteristics() != null && subProcess.getLoopCharacteristics() instanceof MultiInstanceLoopCharacteristics) {
        haveValidLoopCharacteristics = true;
        properties.put(MITRIGGER, "true");
        MultiInstanceLoopCharacteristics taskmi = (MultiInstanceLoopCharacteristics) subProcess.getLoopCharacteristics();
        if (taskmi.getLoopDataInputRef() != null) {
            ItemAwareElement iedatainput = taskmi.getLoopDataInputRef();
            List<DataInputAssociation> taskInputAssociations = subProcess.getDataInputAssociations();
            for (DataInputAssociation dia : taskInputAssociations) {
                if (dia.getTargetRef().equals(iedatainput)) {
                    properties.put(MULTIPLEINSTANCECOLLECTIONINPUT, dia.getSourceRef().get(0).getId());
                    break;
                }
            }
        }
        if (taskmi.getLoopDataOutputRef() != null) {
            ItemAwareElement iedataoutput = taskmi.getLoopDataOutputRef();
            List<DataOutputAssociation> taskOutputAssociations = subProcess.getDataOutputAssociations();
            for (DataOutputAssociation dout : taskOutputAssociations) {
                if (dout.getSourceRef().get(0).equals(iedataoutput)) {
                    properties.put(MULTIPLEINSTANCECOLLECTIONOUTPUT, dout.getTargetRef().getId());
                    break;
                }
            }
        }
        if (taskmi.getInputDataItem() != null) {
            List<DataInput> taskDataInputs = subProcess.getIoSpecification().getDataInputs();
            for (DataInput din : taskDataInputs) {
                if (din.getItemSubjectRef() == null) {
                    // for backward compatibility as the where only input supported
                    properties.put(MULTIPLEINSTANCEDATAINPUT, taskmi.getInputDataItem().getId());
                }
                if (din.getItemSubjectRef() != null && din.getItemSubjectRef().getId().equals(taskmi.getInputDataItem().getItemSubjectRef().getId())) {
                    properties.put(MULTIPLEINSTANCEDATAINPUT, din.getName());
                    break;
                }
            }
        }
        if (taskmi.getOutputDataItem() != null) {
            List<DataOutput> taskDataOutputs = subProcess.getIoSpecification().getDataOutputs();
            for (DataOutput dout : taskDataOutputs) {
                if (dout.getItemSubjectRef() == null) {
                    properties.put(MULTIPLEINSTANCEDATAOUTPUT, taskmi.getOutputDataItem().getId());
                    break;
                }
                if (dout.getItemSubjectRef() != null && dout.getItemSubjectRef().getId().equals(taskmi.getOutputDataItem().getItemSubjectRef().getId())) {
                    properties.put(MULTIPLEINSTANCEDATAOUTPUT, dout.getName());
                    break;
                }
            }
        }
        if (taskmi.getCompletionCondition() != null) {
            if (taskmi.getCompletionCondition() instanceof FormalExpression) {
                properties.put(MULTIPLEINSTANCECOMPLETIONCONDITION, ((FormalExpression) taskmi.getCompletionCondition()).getBody());
            }
        }
    }
    // properties
    List<Property> processProperties = subProcess.getProperties();
    if (processProperties != null && processProperties.size() > 0) {
        String propVal = "";
        for (int i = 0; i < processProperties.size(); i++) {
            Property p = processProperties.get(i);
            String pKPI = Utils.getMetaDataValue(p.getExtensionValues(), "customKPI");
            propVal += p.getId();
            // check the structureRef value
            if (p.getItemSubjectRef() != null && p.getItemSubjectRef().getStructureRef() != null) {
                propVal += ":" + p.getItemSubjectRef().getStructureRef();
            }
            if (pKPI != null && pKPI.length() > 0) {
                propVal += ":" + pKPI;
            }
            if (i != processProperties.size() - 1) {
                propVal += ",";
            }
        }
        properties.put(VARDEFS, propVal);
    }
    // simulation properties
    setSimulationProperties(subProcess.getId(), properties);
    marshallProperties(properties, generator);
    generator.writeObjectFieldStart("stencil");
    if (subProcess instanceof AdHocSubProcess) {
        generator.writeObjectField("id", "AdHocSubprocess");
    } else {
        if (subProcess.isTriggeredByEvent()) {
            generator.writeObjectField("id", "EventSubprocess");
        } else {
            if (haveValidLoopCharacteristics) {
                generator.writeObjectField("id", "MultipleInstanceSubprocess");
            } else {
                generator.writeObjectField("id", "Subprocess");
            }
        }
    }
    generator.writeEndObject();
    generator.writeArrayFieldStart("childShapes");
    Bounds bounds = ((BPMNShape) findDiagramElement(plane, subProcess)).getBounds();
    for (FlowElement flowElement : subProcess.getFlowElements()) {
        if (coordianteManipulation) {
            marshallFlowElement(flowElement, plane, generator, bounds.getX(), bounds.getY(), preProcessingData, def);
        } else {
            marshallFlowElement(flowElement, plane, generator, 0, 0, preProcessingData, def);
        }
    }
    for (Artifact artifact : subProcess.getArtifacts()) {
        if (coordianteManipulation) {
            marshallArtifact(artifact, plane, generator, bounds.getX(), bounds.getY(), preProcessingData, def);
        } else {
            marshallArtifact(artifact, plane, generator, 0, 0, preProcessingData, def);
        }
    }
    generator.writeEndArray();
    generator.writeArrayFieldStart("outgoing");
    for (BoundaryEvent boundaryEvent : subProcess.getBoundaryEventRefs()) {
        generator.writeStartObject();
        generator.writeObjectField("resourceId", boundaryEvent.getId());
        generator.writeEndObject();
    }
    for (SequenceFlow outgoing : subProcess.getOutgoing()) {
        generator.writeStartObject();
        generator.writeObjectField("resourceId", outgoing.getId());
        generator.writeEndObject();
    }
    Process process = (Process) plane.getBpmnElement();
    writeAssociations(process, subProcess.getId(), generator);
    // subprocess boundary events
    List<BoundaryEvent> boundaryEvents = new ArrayList<BoundaryEvent>();
    findBoundaryEvents(process, boundaryEvents);
    for (BoundaryEvent be : boundaryEvents) {
        if (be.getAttachedToRef().getId().equals(subProcess.getId())) {
            generator.writeStartObject();
            generator.writeObjectField("resourceId", be.getId());
            generator.writeEndObject();
        }
    }
    generator.writeEndArray();
    generator.writeObjectFieldStart("bounds");
    generator.writeObjectFieldStart("lowerRight");
    generator.writeObjectField("x", bounds.getX() + bounds.getWidth() - xOffset);
    generator.writeObjectField("y", bounds.getY() + bounds.getHeight() - yOffset);
    generator.writeEndObject();
    generator.writeObjectFieldStart("upperLeft");
    generator.writeObjectField("x", bounds.getX() - xOffset);
    generator.writeObjectField("y", bounds.getY() - yOffset);
    generator.writeEndObject();
    generator.writeEndObject();
}
Also used : DataOutput(org.eclipse.bpmn2.DataOutput) BoundaryEvent(org.eclipse.bpmn2.BoundaryEvent) SequenceFlow(org.eclipse.bpmn2.SequenceFlow) ArrayList(java.util.ArrayList) AdHocSubProcess(org.eclipse.bpmn2.AdHocSubProcess) Process(org.eclipse.bpmn2.Process) SubProcess(org.eclipse.bpmn2.SubProcess) LinkedHashMap(java.util.LinkedHashMap) AdHocSubProcess(org.eclipse.bpmn2.AdHocSubProcess) MultiInstanceLoopCharacteristics(org.eclipse.bpmn2.MultiInstanceLoopCharacteristics) DataOutputAssociation(org.eclipse.bpmn2.DataOutputAssociation) ScriptTypeListTypeSerializer(org.kie.workbench.common.stunner.bpmn.backend.marshall.json.oryx.property.ScriptTypeListTypeSerializer) Property(org.eclipse.bpmn2.Property) Bounds(org.eclipse.dd.dc.Bounds) ItemAwareElement(org.eclipse.bpmn2.ItemAwareElement) FormalExpression(org.eclipse.bpmn2.FormalExpression) BPMNShape(org.eclipse.bpmn2.di.BPMNShape) Point(org.eclipse.dd.dc.Point) Artifact(org.eclipse.bpmn2.Artifact) DataInput(org.eclipse.bpmn2.DataInput) FlowElement(org.eclipse.bpmn2.FlowElement) DataObject(org.eclipse.bpmn2.DataObject) DataInputAssociation(org.eclipse.bpmn2.DataInputAssociation) ScriptTypeListValue(org.kie.workbench.common.stunner.bpmn.definition.property.task.ScriptTypeListValue)

Example 12 with Artifact

use of org.eclipse.bpmn2.Artifact in project kie-wb-common by kiegroup.

the class Bpmn2JsonMarshaller method writeAssociations.

private void writeAssociations(Process process, String elementId, JsonGenerator generator) throws IOException {
    for (Artifact artifact : process.getArtifacts()) {
        if (artifact instanceof Association) {
            Association association = (Association) artifact;
            if (association.getSourceRef().getId().equals(elementId)) {
                generator.writeStartObject();
                generator.writeObjectField("resourceId", association.getId());
                generator.writeEndObject();
            }
        }
    }
}
Also used : Association(org.eclipse.bpmn2.Association) DataOutputAssociation(org.eclipse.bpmn2.DataOutputAssociation) DataInputAssociation(org.eclipse.bpmn2.DataInputAssociation) Artifact(org.eclipse.bpmn2.Artifact)

Example 13 with Artifact

use of org.eclipse.bpmn2.Artifact in project kie-wb-common by kiegroup.

the class Processes method addChildElement.

static void addChildElement(BasePropertyWriter p, Map<String, BasePropertyWriter> childElements, FlowElementsContainer process, Collection<ElementParameters> simulationParameters, List<ItemDefinition> itemDefinitions, List<RootElement> rootElements) {
    childElements.put(p.getElement().getId(), p);
    if (p.getElement() instanceof FlowElement) {
        // otherwise they will be drawn at an incorrect position on load
        if ((p instanceof BoundaryEventPropertyWriter) || (p instanceof DataObjectPropertyWriter)) {
            process.getFlowElements().add((FlowElement) p.getElement());
        } else {
            process.getFlowElements().add(0, (FlowElement) p.getElement());
        }
    } else if (p.getElement() instanceof Artifact) {
        if (process instanceof Process) {
            ((Process) process).getArtifacts().add((Artifact) p.getElement());
        } else if (process instanceof SubProcess) {
            ((SubProcess) process).getArtifacts().add((Artifact) p.getElement());
        }
    }
    if (p instanceof PropertyWriter) {
        ElementParameters sp = ((PropertyWriter) p).getSimulationParameters();
        if (sp != null) {
            simulationParameters.add(sp);
        }
    }
    itemDefinitions.addAll(p.getItemDefinitions());
    rootElements.addAll(p.getRootElements());
    rootElements.addAll(p.getInterfaces());
    if (p instanceof DataObjectPropertyWriter) {
        maybeAddDataObjects(process, ((DataObjectPropertyWriter) p).getDataObjects());
    }
}
Also used : SubProcess(org.eclipse.bpmn2.SubProcess) ElementParameters(bpsim.ElementParameters) FlowElement(org.eclipse.bpmn2.FlowElement) Process(org.eclipse.bpmn2.Process) SubProcess(org.eclipse.bpmn2.SubProcess) Artifact(org.eclipse.bpmn2.Artifact)

Example 14 with Artifact

use of org.eclipse.bpmn2.Artifact in project kie-wb-common by kiegroup.

the class ProcessesTest method setUp.

@Before
public void setUp() {
    when(propertyWriter.getRootElements()).thenReturn(propertyWriterRootElements);
    when(propertyWriter.getSimulationParameters()).thenReturn(propertyWriterElementParameters);
    when(propertyWriter.getItemDefinitions()).thenReturn(propertyWriterItemDefinitions);
    when(boundaryEventPropertyWriter.getRootElements()).thenReturn(propertyWriterRootElements);
    when(boundaryEventPropertyWriter.getSimulationParameters()).thenReturn(propertyWriterElementParameters);
    when(boundaryEventPropertyWriter.getItemDefinitions()).thenReturn(propertyWriterItemDefinitions);
    flowElement = new FlowElementImpl() {
    };
    flowElement.setId(ELEMENT_ID);
    artifact = new ArtifactImpl() {
    };
    artifact.setId(ELEMENT_ID);
    when(process.getFlowElements()).thenReturn(flowElements);
    when(process.getArtifacts()).thenReturn(artifacts);
    when(subProcess.getFlowElements()).thenReturn(flowElements);
    when(subProcess.getArtifacts()).thenReturn(artifacts);
}
Also used : ArtifactImpl(org.eclipse.bpmn2.impl.ArtifactImpl) FlowElementImpl(org.eclipse.bpmn2.impl.FlowElementImpl) Before(org.junit.Before)

Aggregations

Artifact (org.eclipse.bpmn2.Artifact)12 SubProcess (org.eclipse.bpmn2.SubProcess)10 AdHocSubProcess (org.eclipse.bpmn2.AdHocSubProcess)9 Process (org.eclipse.bpmn2.Process)9 DataInputAssociation (org.eclipse.bpmn2.DataInputAssociation)8 DataOutputAssociation (org.eclipse.bpmn2.DataOutputAssociation)8 ArrayList (java.util.ArrayList)7 Association (org.eclipse.bpmn2.Association)7 FlowElement (org.eclipse.bpmn2.FlowElement)7 DataObject (org.eclipse.bpmn2.DataObject)5 SequenceFlow (org.eclipse.bpmn2.SequenceFlow)5 BoundaryEvent (org.eclipse.bpmn2.BoundaryEvent)4 RootElement (org.eclipse.bpmn2.RootElement)4 FlowNode (org.eclipse.bpmn2.FlowNode)3 Group (org.eclipse.bpmn2.Group)3 Lane (org.eclipse.bpmn2.Lane)3 Bounds (org.eclipse.dd.dc.Bounds)3 SimpleFeatureMapEntry (org.eclipse.emf.ecore.impl.EStructuralFeatureImpl.SimpleFeatureMapEntry)3 LinkedHashMap (java.util.LinkedHashMap)2 List (java.util.List)2