001: /*
002: * This file is part of the WfMOpen project.
003: * Copyright (C) 2001-2004 Danet GmbH (www.danet.de), GS-AN.
004: * All rights reserved.
005: *
006: * This program is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation; either version 2 of the License, or
009: * (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * $Id: DefaultToolAgentContext.java,v 1.4 2006/12/12 10:02:35 drmlipp Exp $
021: *
022: * $Log: DefaultToolAgentContext.java,v $
023: * Revision 1.4 2006/12/12 10:02:35 drmlipp
024: * Added access to application id (for name scoping).
025: *
026: * Revision 1.3 2006/10/13 11:45:28 drmlipp
027: * Using ExceptionResult to pass exception information.
028: *
029: * Revision 1.2 2006/09/29 12:32:10 drmlipp
030: * Consistently using WfMOpen as projct name now.
031: *
032: * Revision 1.1.1.1 2004/08/18 15:17:38 drmlipp
033: * Update to 1.2
034: *
035: * Revision 1.1 2004/04/01 09:32:07 lipp
036: * Improved tool agent context implementtaion.
037: *
038: * Revision 1.2 2004/03/31 20:47:21 lipp
039: * Added processDirectory().
040: *
041: * Revision 1.1 2004/03/29 11:45:25 lipp
042: * Made engine context available to tool agents.
043: *
044: */
045: package de.danet.an.workflow.ejbs.admin;
046:
047: import java.io.IOException;
048: import java.io.ObjectInputStream;
049: import java.io.ObjectOutputStream;
050:
051: import java.util.Map;
052:
053: import java.rmi.RemoteException;
054:
055: import javax.ejb.Handle;
056:
057: import de.danet.an.workflow.omgcore.CannotCompleteException;
058: import de.danet.an.workflow.omgcore.InvalidDataException;
059: import de.danet.an.workflow.omgcore.TransitionNotAllowedException;
060:
061: import de.danet.an.workflow.api.Activity;
062: import de.danet.an.workflow.api.ActivityUniqueKey;
063: import de.danet.an.workflow.api.InvalidKeyException;
064:
065: import de.danet.an.workflow.ejbs.WorkflowEngine;
066: import de.danet.an.workflow.spis.aii.ToolAgentContext;
067: import de.danet.an.workflow.spis.aii.ResultProvider.ExceptionResult;
068:
069: /**
070: * This class provides an implementation of <code>EngineContext</code>.
071: *
072: * @author <a href="mailto:lipp@danet.de">Michael Lipp</a>
073: * @version $Revision: 1.4 $
074: */
075:
076: public class DefaultToolAgentContext implements ToolAgentContext {
077:
078: /** Class id. */
079: static final long serialVersionUID = 8131847475946175709L;
080:
081: private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
082: .getLog(DefaultToolAgentContext.class);
083:
084: private transient WorkflowEngine engine = null;
085: private transient Activity activity = null;
086: private String applicationId = null;
087:
088: private void writeObject(ObjectOutputStream out) throws IOException {
089: try {
090: out.writeObject(engine.getHandle());
091: out.writeObject(activity.uniqueKey());
092: } catch (RemoteException e) {
093: throw (IOException) (new IOException(
094: "Cannot get EJB handle: " + e.getMessage()))
095: .initCause(e);
096: }
097: }
098:
099: private void readObject(ObjectInputStream in) throws IOException {
100: ActivityUniqueKey auk = null;
101: try {
102: engine = (WorkflowEngine) ((Handle) in.readObject())
103: .getEJBObject();
104: auk = (ActivityUniqueKey) in.readObject();
105: activity = engine.processDirectory().lookupActivity(auk);
106: } catch (InvalidKeyException e) {
107: throw (IOException) (new IOException("Cannot find "
108: + auk.toString() + ": " + e.getMessage()))
109: .initCause(e);
110: } catch (ClassNotFoundException e) {
111: throw (IOException) (new IOException(
112: "Cannot get EJB from handle: " + e.getMessage()))
113: .initCause(e);
114: } catch (RemoteException e) {
115: throw (IOException) (new IOException(
116: "Cannot get EJB from handle: " + e.getMessage()))
117: .initCause(e);
118: }
119: }
120:
121: /**
122: * Creates an instance of <code>DefaultToolAgentContext</code>
123: * with all attributes initialized to the given values.
124: * @param wfe the workflow engine
125: * @param act the invoking activity
126: * @param applicationId the application id
127: */
128: public DefaultToolAgentContext(WorkflowEngine wfe, Activity act,
129: String applicationId) {
130: engine = wfe;
131: activity = act;
132: this .applicationId = applicationId;
133: }
134:
135: /* Comment copied from interface. */
136: public String applicationId() {
137: return applicationId;
138: }
139:
140: /* Comment copied from interface. */
141: public void finishActivity(Map map) throws InvalidDataException,
142: CannotCompleteException {
143: while (true) {
144: try {
145: engine.doFinish(activity, map);
146: break;
147: } catch (RemoteException e) {
148: logger.debug(
149: "Error while finishing activity (repeating): "
150: + e.getMessage(), e);
151: }
152: }
153: }
154:
155: /* Comment copied from interface. */
156: public void abandonActivity(String string)
157: throws TransitionNotAllowedException {
158: while (true) {
159: try {
160: engine.doAbandon(activity, new ExceptionResult(string));
161: break;
162: } catch (RemoteException e) {
163: logger.debug(
164: "Error while abandoning activity (repeating): "
165: + e.getMessage(), e);
166: }
167: }
168: }
169:
170: /* Comment copied from interface. */
171: public void abandonActivity(ExceptionResult result)
172: throws TransitionNotAllowedException {
173: while (true) {
174: try {
175: engine.doAbandon(activity, result);
176: break;
177: } catch (RemoteException e) {
178: logger.debug(
179: "Error while abandoning activity (repeating): "
180: + e.getMessage(), e);
181: }
182: }
183: }
184:
185: /* Comment copied from interface. */
186: public Activity lookupActivity(ActivityUniqueKey auk)
187: throws InvalidKeyException, RemoteException {
188: return engine.processDirectory().lookupActivity(auk);
189: }
190:
191: }
|