/* Copyright 2012-2015 SAP SE * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.aniketos.securebpmn.export.aslan.export; import java.util.List; import org.eclipse.bpmn2.ExclusiveGateway; import org.eclipse.bpmn2.FlowElement; import org.eclipse.bpmn2.Gateway; import org.eclipse.bpmn2.SequenceFlow; import org.eclipse.bpmn2.StartEvent; import org.eclipse.bpmn2.Task; /** * Creates the ASLan representation for a BPMN 2.0 ExclusiveGateway element. * */ public class ExclusiveGatewayExport { /** * Generates the ASLan representation of the provided ExclusiveGateway * element and sends the output to the provided AslanFileBuilder. * * @param exclusiveGateway * The ExclusiveGateway for which the representation should be * generated. * @param afb * The AslanFileBuilder the output is sent to. */ public static void createExclusiveGatewayElements( ExclusiveGateway exclusiveGateway, AslanFileBuilder afb) { final List<SequenceFlow> incoming = exclusiveGateway.getIncoming(); if (incoming.size() > 1) { // XOR-join final List<SequenceFlow> outgoing = exclusiveGateway.getOutgoing(); FlowElement successor = null; String auxFact = ""; if (outgoing.size() > 0) { successor = outgoing.get(0).getTargetRef(); auxFact += exclusiveGateway.getId() + "_to_" + successor.getId(); } int branchCounter = 1; for (SequenceFlow parentFlow : incoming) { final FlowElement predecessor = parentFlow.getSourceRef(); String lhs = ""; if (predecessor instanceof Task) { String natVar = afb.addNatVar(); lhs += "(" + natVar + ") := done(task(" + predecessor.getId() + "," + natVar + "))"; } else if (predecessor instanceof Gateway) { lhs += " := " + predecessor.getId() + "_to_" + exclusiveGateway.getId(); } else if (predecessor instanceof StartEvent) { lhs += " := start_event_" + predecessor.getId(); } if (lhs.length() > 0) { afb.addType("fact", auxFact); afb.addRule("step " + exclusiveGateway.getId() + "_branch" + branchCounter + lhs + " => " + auxFact); branchCounter++; } } } else { // XOR-split FlowElement predecessor = null; if (incoming.size() > 0) { predecessor = incoming.get(0).getSourceRef(); } else { // ExclusiveGateway not reachable return; } String lhs = ""; if (predecessor instanceof Task) { String natVar = afb.addNatVar(); lhs += "(" + natVar + ") := done(task(" + predecessor.getId() + "," + natVar + "))"; } else if (predecessor instanceof Gateway) { lhs += " := " + predecessor.getId() + "_to_" + exclusiveGateway.getId(); } else if (predecessor instanceof StartEvent) { lhs += " := start_event_" + predecessor.getId(); } int branchCounter = 1; for (SequenceFlow childFlow : exclusiveGateway.getOutgoing()) { final String auxFact = exclusiveGateway.getId() + "_to_" + childFlow.getTargetRef().getId(); afb.addType("fact", auxFact); afb.addRule("step " + exclusiveGateway.getId() + "_branch" + branchCounter + lhs + " => " + auxFact); branchCounter++; } } } }