/* * Copyright 2014 Effektif GmbH. * * 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 com.effektif.workflow.api.workflow; import java.util.ArrayList; import java.util.List; import com.effektif.workflow.api.bpmn.BpmnReader; import com.effektif.workflow.api.bpmn.BpmnWriter; import com.effektif.workflow.api.types.DataType; /** * @author Tom Baeyens */ public abstract class Scope extends Element { protected List<Activity> activities; protected List<Transition> transitions; protected List<Variable> variables; protected List<Timer> timers; @Override public void readBpmn(BpmnReader r) { r.readScope(); super.readBpmn(r); } @Override public void writeBpmn(BpmnWriter w) { super.writeBpmn(w); w.writeScope(); } public List<Activity> getActivities() { return this.activities; } public void setActivities(List<Activity> activities) { this.activities = activities; } public Scope activity(String id, Activity activity) { activity.setId(id); activity(activity); return this; } public Scope activity(Activity activity) { if (this.activities==null) { this.activities = new ArrayList<>(); } this.activities.add(activity); if (activity.outgoingTransitions!=null) { for (Transition outgoingTransition: activity.outgoingTransitions) { outgoingTransition.fromId = activity.id; } if (!hasOutgoingTransitionsToNext(activity)) { if (activity.outgoingTransitions!=null) { transitions(activity.outgoingTransitions); activity.outgoingTransitions = null; } } } int previousIndex = this.activities.size()-2; Activity previousActivity = previousIndex>=0 ? this.activities.get(previousIndex) : null; if (previousActivity!=null && hasOutgoingTransitionsToNext(previousActivity)) { for (Transition outgoingTransition: previousActivity.outgoingTransitions) { if (outgoingTransition.isToNext()) { outgoingTransition.toId = activity.id; outgoingTransition.isToNext = null; } } transitions(previousActivity.outgoingTransitions); previousActivity.outgoingTransitions = null; } return this; } /** * Returns the activity with the given ID, or null if not found. */ public Activity findActivity(String activityId) { if (activities == null || activityId == null) { return null; } for (Activity activity : activities) { if (activityId.equals(activity.getId())) { return activity; } } return null; } /** * Returns the transition with the given ID, or null if not found. */ public Transition findTransition(String transitionId) { if (activities == null || transitionId == null) { return null; } for (Transition transition : transitions) { if (transitionId.equals(transition.getId())) { return transition; } } return null; } private boolean hasOutgoingTransitionsToNext(Activity activity) { if (activity.outgoingTransitions==null) { return false; } for (Transition outgoingTransition: activity.outgoingTransitions) { if (outgoingTransition.isToNext()) { return true; } } return false; } public List<Transition> getTransitions() { return this.transitions; } public void setTransitions(List<Transition> transitions) { this.transitions = transitions; } public Scope transition(String id, Transition transition) { transition.setId(id); transition(transition); return this; } public Scope transition(Transition transition) { if (this.transitions==null) { this.transitions = new ArrayList<>(); } this.transitions.add(transition); return this; } public Scope transitions(List<Transition> transitions) { if (transitions!=null) { for (Transition transition: transitions) { transition(transition); } } return this; } public List<Variable> getVariables() { return this.variables; } public void setVariables(List<Variable> variables) { this.variables = variables; } public Scope variable(String id, DataType type) { Variable variable = new Variable(); variable.setId(id); variable.setType(type); variable(variable); return this; } public Scope variable(Variable variable) { if (this.variables==null) { this.variables = new ArrayList<>(); } this.variables.add(variable); return this; } public List<Timer> getTimers() { return this.timers; } public void setTimers(List<Timer> timers) { this.timers = timers; } public Scope timer(Timer timer) { if (this.timers==null) { this.timers = new ArrayList<>(); } this.timers.add(timer); return this; } }