All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.yaoqiang.bpmn.model.elements.activities.SubProcess Maven / Gradle / Ivy

package org.yaoqiang.bpmn.model.elements.activities;

import java.util.ArrayList;
import java.util.List;

import org.yaoqiang.bpmn.model.elements.XMLAttribute;
import org.yaoqiang.bpmn.model.elements.XMLElement;
import org.yaoqiang.bpmn.model.elements.artifacts.Artifacts;
import org.yaoqiang.bpmn.model.elements.core.common.FlowElement;
import org.yaoqiang.bpmn.model.elements.core.common.FlowElements;
import org.yaoqiang.bpmn.model.elements.core.common.FlowElementsContainer;
import org.yaoqiang.bpmn.model.elements.core.common.FlowNode;
import org.yaoqiang.bpmn.model.elements.core.common.SequenceFlow;
import org.yaoqiang.bpmn.model.elements.events.CompensateEventDefinition;
import org.yaoqiang.bpmn.model.elements.events.StartEvent;
import org.yaoqiang.bpmn.model.elements.process.LaneSets;

/**
 * SubProcess
 * 
 * @author Shi Yaoqiang([email protected])
 */
public class SubProcess extends Activity implements FlowElementsContainer {

	private static final long serialVersionUID = -1614514029751956052L;

	public SubProcess(String name) {
		this((FlowElements) null);
		setName(name);
	}

	public SubProcess(String name, boolean triggeredByEvent) {
		this((FlowElements) null);
		setName(name);
		setTriggeredByEvent(triggeredByEvent);
	}

	public SubProcess(FlowElements parent) {
		super(parent, "subProcess");
	}

	public SubProcess(FlowElements parent, String name) {
		super(parent, name);
	}

	protected void fillStructure() {
		XMLAttribute attrTriggeredByEvent = new XMLAttribute(this, "triggeredByEvent", Boolean.FALSE.toString());
		LaneSets refLaneSets = new LaneSets(this);
		FlowElements refFlowElements = new FlowElements(this);
		Artifacts refArtifacts = new Artifacts(this);

		super.fillStructure();
		add(attrTriggeredByEvent);
		add(refLaneSets);
		add(refFlowElements);
		add(refArtifacts);
	}

	public final boolean isTriggeredByEvent() {
		return Boolean.parseBoolean(get("triggeredByEvent").toValue());
	}

	public final FlowElement getFlowElement(String id) {
		return (FlowElement) getFlowElements().getFlowElement(id);
	}

	public final List getFlowElementList() {
		return getFlowElements().getXMLElements();
	}

	public final FlowElements getFlowElements() {
		return (FlowElements) get("flowElements");
	}

	public final List getFlowNodes() {
		List flowNodes = new ArrayList();
		for (XMLElement flowElement : getFlowElementList()) {
			if (flowElement instanceof FlowNode) {
				flowNodes.add((FlowNode) flowElement);
			}
		}
		return flowNodes;
	}

	public final List getSequenceFlows() {
		List sequenceFlows = new ArrayList();
		for (XMLElement flowElement : getFlowElementList()) {
			if (flowElement instanceof SequenceFlow) {
				sequenceFlows.add((SequenceFlow) flowElement);
			}
		}
		return sequenceFlows;
	}

	public final Artifacts getArtifacts() {
		return (Artifacts) get("artifacts");
	}

	public boolean hasCompensationEventSubProcess() {
		for (XMLElement el : getFlowElementList()) {
			if (el instanceof SubProcess && ((SubProcess) el).isTriggeredByEvent()) {
				for (XMLElement e : ((SubProcess) el).getFlowElementList()) {
					if (e instanceof StartEvent && ((StartEvent) e).getEventDefinition() instanceof CompensateEventDefinition) {
						return true;
					}
				}
			}
		}
		return false;
	}

	public final void addFlowElements(FlowElements flowElements) {
		for (XMLElement flowElement : flowElements.getXMLElements()) {
			getFlowElements().add(flowElement);
		}
		flowElements.clear();
	}

	public final void addArtifacts(Artifacts artifacts) {
		for (XMLElement arti : artifacts.getXMLElements()) {
			getArtifacts().add(arti);
		}
		artifacts.clear();
	}

	public final void setTriggeredByEvent(boolean triggeredByEvent) {
		set("triggeredByEvent", String.valueOf(triggeredByEvent));
	}

	public final XMLElement generateFlowElement(String type) {
		FlowElements flowElements = getFlowElements();
		flowElements.setType(type);
		XMLElement el = flowElements.generateNewElement();
		return el;
	}

	public final void addFlowElement(XMLElement el) {
		getFlowElements().add(el);
	}

	public final void addArtifact(XMLElement artifact) {
		getArtifacts().add(artifact);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy