001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2008
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.shared.workflow;
034:
035: import com.flexive.shared.AbstractSelectableObjectWithName;
036: import com.flexive.shared.FxContext;
037: import com.flexive.shared.SelectableObjectWithName;
038: import com.flexive.shared.exceptions.FxApplicationException;
039: import com.flexive.shared.security.UserTicket;
040:
041: import java.io.Serializable;
042: import java.util.ArrayList;
043: import java.util.List;
044:
045: /**
046: * Workflow data beans.
047: *
048: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
049: */
050: public class Workflow extends AbstractSelectableObjectWithName
051: implements Serializable, SelectableObjectWithName {
052: private static final long serialVersionUID = 7057943902512439668L;
053:
054: protected String name = null;
055: protected String description = null;
056: protected long id = -1;
057: protected List<Step> steps = new ArrayList<Step>();
058: protected List<Route> routes = new ArrayList<Route>();
059:
060: /**
061: * Constructor.
062: *
063: * @param id the id of the workflow
064: * @param name the name of the workflow
065: * @param description a description
066: * @param steps the workflow steps
067: * @param routes the workflow routes
068: */
069: public Workflow(long id, String name, String description,
070: List<Step> steps, List<Route> routes) {
071: this .id = id;
072: this .name = name;
073: this .description = (description == null) ? "" : description;
074: this .steps = steps;
075: this .routes = routes;
076: }
077:
078: /**
079: * Default constructor.
080: */
081: protected Workflow() {
082: }
083:
084: /**
085: * Returns this workflow as an editable object.
086: *
087: * @return this workflow as an editable object.
088: */
089: public WorkflowEdit asEditable() {
090: return new WorkflowEdit(this );
091: }
092:
093: /**
094: * Returns the name of the workflow.
095: *
096: * @return the name of the workflow
097: */
098: public String getName() {
099: return this .name;
100: }
101:
102: /**
103: * Returns the description of the workflow.
104: *
105: * @return the description of the workflow, may be a empty String but is never null.
106: */
107: public String getDescription() {
108: return this .description;
109: }
110:
111: /**
112: * Returns the id of the workflow.
113: *
114: * @return the id of the workflow
115: */
116: public long getId() {
117: return this .id;
118: }
119:
120: /**
121: * Returns the individual steps of the workflow.
122: *
123: * @return the individual steps of the workflow.
124: */
125: public List<Step> getSteps() {
126: return steps;
127: }
128:
129: /**
130: * Return the workflow routes (connections between steps).
131: *
132: * @return the workflow routes (connections between steps).
133: */
134: public List<Route> getRoutes() {
135: return routes;
136: }
137:
138: /**
139: * Check if the given step is valid for this workflow
140: *
141: * @param stepId the step ID to be checked
142: * @return if the given step is valid for this workflow
143: */
144: public boolean isStepValid(long stepId) {
145: for (Step step : steps)
146: if (step.getId() == stepId)
147: return true;
148: return false;
149: }
150:
151: /**
152: * {@inheritDoc}
153: */
154: @Override
155: public String toString() {
156: return getName() + "(Id=" + getId() + ")";
157: }
158:
159: /**
160: * Get the live step of this workflow, will throw an exception if no live step is defined
161: *
162: * @return live step
163: * @throws FxApplicationException on errors
164: */
165: public Step getLiveStep() throws FxApplicationException {
166: for (Step s : steps)
167: if (s.isLiveStep())
168: return s;
169: throw new FxApplicationException(
170: "ex.workflow.noLiveStepDefined", getName());
171: }
172:
173: /**
174: * Is a Live step contained in this workflow?
175: *
176: * @return if a Live step exists
177: */
178: public boolean hasLiveStep() {
179: for (Step s : steps)
180: if (s.isLiveStep())
181: return true;
182: return false;
183: }
184:
185: /**
186: * Get a list of all possible targets for the given step id
187: *
188: * @param stepId source step id to get all targets for
189: * @return target steps
190: */
191: public List<Step> getTargets(long stepId) {
192: List<Step> res = new ArrayList<Step>(5);
193: UserTicket ticket = FxContext.get().getTicket();
194: for (Route r : getRoutes()) {
195: if (r.getFromStepId() == stepId) {
196: Step step = getStep(r.getToStepId());
197: if (ticket.isGlobalSupervisor()
198: || ticket.isInGroup(r.getGroupId()))
199: if (!res.contains(step))
200: res.add(step);
201: }
202: }
203: return res;
204: }
205:
206: /**
207: * Get the requested step from the internal list of steps
208: *
209: * @param stepId requested step id
210: * @return Step instance
211: */
212: private Step getStep(long stepId) {
213: for (Step s : steps)
214: if (s.getId() == stepId)
215: return s;
216: throw new FxApplicationException(
217: "ex.workflow.route.referencedStep", stepId)
218: .asRuntimeException();
219: }
220:
221: /**
222: * Check if a route from source to dest exists for the calling user
223: *
224: * @param source source step id
225: * @param dest destination step id
226: * @return does a valid route exist?
227: */
228: public boolean isRouteValid(long source, long dest) {
229: UserTicket ticket = FxContext.get().getTicket();
230: for (Route r : getRoutes()) {
231: if (r.getFromStepId() == source && r.getToStepId() == dest) {
232: if (ticket.isGlobalSupervisor()
233: || ticket.isInGroup(r.getGroupId()))
234: return true;
235: }
236: }
237: return false;
238: }
239: }
|