001: /*--
002:
003: Copyright (C) 2002-2005 Adrian Price.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The names "OBE" and "Open Business Engine" must not be used to
019: endorse or promote products derived from this software without prior
020: written permission. For written permission, please contact
021: adrianprice@sourceforge.net.
022:
023: 4. Products derived from this software may not be called "OBE" or
024: "Open Business Engine", nor may "OBE" or "Open Business Engine"
025: appear in their name, without prior written permission from
026: Adrian Price (adrianprice@users.sourceforge.net).
027:
028: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
029: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
030: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
032: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
034: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
035: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
036: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
037: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
038: POSSIBILITY OF SUCH DAMAGE.
039:
040: For more information on OBE, please see
041: <http://obe.sourceforge.net/>.
042:
043: */
044:
045: package org.obe.runtime.evaluator;
046:
047: import org.apache.commons.logging.Log;
048: import org.apache.commons.logging.LogFactory;
049: import org.obe.client.api.repository.RepositoryException;
050: import org.obe.engine.EngineContext;
051: import org.obe.spi.model.WorkItem;
052: import org.obe.xpdl.model.misc.RedefinableHeader;
053: import org.obe.xpdl.model.workflow.WorkflowProcess;
054:
055: import java.security.Principal;
056: import java.util.Date;
057:
058: /**
059: * Implements WfMC-prescribed functions available to scripted expressions.
060: * These functions were described in the WPDL specification: XPDL makes no
061: * mention of them.
062: *
063: * @author Adrian Price
064: */
065: public class WfMCFunctions {
066: private static final Log _logger = LogFactory
067: .getLog(WfMCFunctions.class);
068:
069: /**
070: * <em>Not implemented - do not call</em>.
071: */
072: public static Principal[] alternateOf(Principal p) {
073: // TODO: implement WfMCFunctions.alternateOf
074: throw new UnsupportedOperationException("alternateOf");
075: }
076:
077: /**
078: * <em>Not implemented - do not call</em>.
079: */
080: public static Principal coordinatorOf(Principal p) {
081: // TODO: implement WfMCFunctions.coordinatorOf
082: throw new UnsupportedOperationException("coordinatorOf");
083: }
084:
085: /**
086: * <em>Not implemented - do not call</em>.
087: */
088: public static Principal managerOf(Principal p) {
089: // TODO: implement WfMCFunctions.managerOf
090: throw new UnsupportedOperationException("managerOf");
091: }
092:
093: /**
094: * <em>Not implemented - do not call</em>.
095: */
096: public static Principal[] super iorOf(Principal p) {
097: // TODO: implement WfMCFunctions.superiorOf
098: throw new UnsupportedOperationException("superiorOf");
099: }
100:
101: /**
102: * <em>Not implemented - do not call</em>.
103: */
104: public static Date currentDate() {
105: return new Date();
106: }
107:
108: /**
109: * <em>Not implemented - do not call</em>.
110: */
111: public static Principal currentActor() {
112: // TODO: implement WfMCFunctions.currentActor
113: throw new UnsupportedOperationException("currentActor");
114: }
115:
116: /**
117: * Returns the principal who is responsible for the currently executing workflow.
118: *
119: * @return The responsible principal.
120: */
121: public static Principal currentResponsible() {
122: Principal principal = null;
123: EngineContext ctx = EngineContext.peekContext();
124: if (ctx != null) {
125: WorkflowProcess workflow = ctx.getWorkflow();
126: if (workflow != null) {
127: String[] responsibles = null;
128: RedefinableHeader rh = workflow.getRedefinableHeader();
129: if (rh != null)
130: responsibles = rh.getResponsible();
131: if (responsibles == null || responsibles.length == 0) {
132: rh = workflow.getPackage().getRedefinableHeader();
133: if (rh != null)
134: responsibles = rh.getResponsible();
135: }
136: if (responsibles != null && responsibles.length > 0) {
137: try {
138: principal = ctx.getServiceManager()
139: .getSecurityRealm().findPrincipal(
140: responsibles[0]);
141: } catch (RepositoryException e) {
142: _logger.error(
143: "currentResponsible: undefined principal '"
144: + responsibles[0] + '\'', e);
145: }
146: }
147: }
148: }
149: return principal;
150: }
151:
152: /**
153: * <em>Not implemented - do not call</em>.
154: */
155: public static Principal performerOfLast() {
156: // TODO: implement WfMCFunctions.performerOfLast
157: throw new UnsupportedOperationException("performerOfLast");
158: }
159:
160: /**
161: * Returns the principal who is performing the current work item, if any.
162: *
163: * @return The principal representing the current work item performer.
164: */
165: public static Principal currentPerformer() {
166: Principal principal = null;
167: EngineContext ctx = EngineContext.peekContext();
168: if (ctx != null) {
169: WorkItem workItem = ctx.getWorkItem();
170: if (workItem != null) {
171: String performer = workItem.getPerformer();
172: if (performer != null) {
173: try {
174: principal = ctx.getServiceManager()
175: .getSecurityRealm().findPrincipal(
176: performer);
177: } catch (RepositoryException e) {
178: _logger.error(
179: "currentPerformer: undefined principal '"
180: + performer + '\'', e);
181: }
182: }
183: }
184: }
185: return principal;
186: }
187:
188: /**
189: * N.B. Although the service methods are all static, JXPath expects a
190: * public no-args constructor.
191: */
192: public WfMCFunctions() {
193: }
194: }
|