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: SimpleApplicationAgent.java,v 1.2 2006/09/29 12:32:09 drmlipp Exp $
021: *
022: * $Log: SimpleApplicationAgent.java,v $
023: * Revision 1.2 2006/09/29 12:32:09 drmlipp
024: * Consistently using WfMOpen as projct name now.
025: *
026: * Revision 1.1.1.1 2004/08/18 15:17:39 drmlipp
027: * Update to 1.2
028: *
029: * Revision 1.2 2004/04/08 09:34:54 lipp
030: * Clarified documentation of package structure.
031: *
032: * Revision 1.1 2004/02/19 17:55:54 lipp
033: * Initial version of waittool.
034: *
035: */
036: package de.danet.an.workflow.tools.util;
037:
038: import java.rmi.RemoteException;
039:
040: import de.danet.an.util.EJBUtil;
041: import de.danet.an.util.ResourceNotAvailableException;
042:
043: import de.danet.an.workflow.api.Activity;
044: import de.danet.an.workflow.api.ActivityUniqueKey;
045: import de.danet.an.workflow.api.InvalidKeyException;
046:
047: import de.danet.an.workflow.spis.aii.ApplicationNotStoppedException;
048: import de.danet.an.workflow.spis.aii.ToolAgent;
049:
050: /**
051: * This is a base class for writing agents for applications that have
052: * a life cycle exceeding a single tool agent invocation, and have only
053: * state information that can efficiently be persisted as a binary
054: * large object in an RDBMs.<P>
055: *
056: * An example for such an application is the wait tool (see <i>User
057: * Manual</i>). A wait tool (or "wait application") is created by one
058: * tool agent invocation. Then another tool agent invocation waits
059: * for the completion of the wait, while yet another tool agent
060: * invocation may cause the wait tool to complete prematurely. The
061: * wait tool has state that is controlled by the tool agents and a
062: * timer provided by the enviroment. Its state is therefore completely
063: * serializable (no open sockets, tool controlled threads etc.).<P>
064: *
065: * This base class mainly provides access to the {@link
066: * SimpleApplicationDirectory application directory} that does all the
067: * important work.
068: *
069: * @author <a href="mailto:lipp@danet.de">Michael Lipp</a>
070: * @version $Revision: 1.2 $
071: */
072:
073: public abstract class SimpleApplicationAgent implements ToolAgent {
074:
075: private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
076: .getLog(SimpleApplicationAgent.class);
077:
078: /** Application directory. */
079: private SimpleApplicationDirectoryLocal applDirCache = null;
080:
081: /**
082: * Creates an instance of <code>SimpleApplicationAgent</code>
083: * with all attributes initialized to default values.
084: */
085: public SimpleApplicationAgent() {
086: }
087:
088: /**
089: * Return the application directory.
090: * @return the application directory
091: * @throws ResourceNotAvailableException if an application
092: * directory EJB cannot be instantiated
093: */
094: protected SimpleApplicationDirectoryLocal applicationDirectory()
095: throws ResourceNotAvailableException {
096: if (applDirCache == null) {
097: applDirCache = (SimpleApplicationDirectoryLocal) EJBUtil
098: .createSession(
099: SimpleApplicationDirectoryLocalHome.class,
100: "java:comp/env/ejb/SimpleApplicationDirectoryLocal");
101: }
102: return applDirCache;
103: }
104:
105: /**
106: * Terminates execution of the given activity. This base
107: * implementation simply removes the application instance fom the
108: * application directory.
109: *
110: * @param activity the activity to be canceled
111: * @throws ApplicationNotStoppedException if execution cannot be
112: * terminated (see {@link ApplicationNotStoppedException
113: * <code>ApplicationNotStoppedException</code>}).
114: * workflow engine should retry the tool invocation
115: * @throws RemoteException if a temporary problem occurs and the
116: * workflow engine should retry the tool invocation
117: */
118: public void terminate(Activity activity)
119: throws ApplicationNotStoppedException, RemoteException {
120: ActivityUniqueKey auk = null;
121: try {
122: auk = activity.uniqueKey();
123: SimpleApplicationInfo info = applicationDirectory()
124: .infoByActivity(auk);
125: applicationDirectory().removeInstance(info.id());
126: } catch (InvalidKeyException e) {
127: logger.debug("No application instance for " + auk
128: + " already removed(?): " + e.getMessage());
129: }
130: }
131: }
|