001: /*
002: * ====================================================================
003: *
004: * XFLOW - Process Management System
005: * Copyright (C) 2003 Rob Tan
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions, and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions, and the disclaimer that follows
017: * these conditions in the documentation and/or other materials
018: * provided with the distribution.
019: *
020: * 3. The name "XFlow" must not be used to endorse or promote products
021: * derived from this software without prior written permission. For
022: * written permission, please contact rcktan@yahoo.com
023: *
024: * 4. Products derived from this software may not be called "XFlow", nor
025: * may "XFlow" appear in their name, without prior written permission
026: * from the XFlow Project Management (rcktan@yahoo.com)
027: *
028: * In addition, we request (but do not require) that you include in the
029: * end-user documentation provided with the redistribution and/or in the
030: * software itself an acknowledgement equivalent to the following:
031: * "This product includes software developed by the
032: * XFlow Project (http://xflow.sourceforge.net/)."
033: * Alternatively, the acknowledgment may be graphical using the logos
034: * available at http://xflow.sourceforge.net/
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE XFLOW AUTHORS OR THE PROJECT
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: * ====================================================================
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the XFlow Project and was originally
052: * created by Rob Tan (rcktan@yahoo.com)
053: * For more information on the XFlow Project, please see:
054: * <http://xflow.sourceforge.net/>.
055: * ====================================================================
056: */
057:
058: package xflow.server.controller;
059:
060: import java.io.*;
061: import java.util.*;
062: import java.lang.*;
063: import java.sql.*;
064: import javax.ejb.*;
065: import javax.jms.*;
066: import javax.naming.*;
067: import org.apache.log4j.Logger;
068: import xflow.common.*;
069: import xflow.protocol.*;
070: import xflow.security.*;
071: import xflow.util.*;
072:
073: public class WorkflowEngine implements MessageDrivenBean,
074: MessageListener {
075:
076: private static Logger log = Logger.getLogger(WorkflowEngine.class);
077: private Authenticator authenticator = null;
078:
079: private MessageDrivenContext ctx = null;
080: private QueueConnection conn;
081: private QueueSession session;
082:
083: public WorkflowEngine() {
084: log.info("WorkflowEngine.constructor, this=" + hashCode());
085: log.debug("constructor.StackTrace",
086: new Throwable("constructor"));
087: Persistence.init();
088: }
089:
090: public void setMessageDrivenContext(MessageDrivenContext ctx) {
091: this .ctx = ctx;
092: log.info("WorkflowEngine.setMessageDrivenContext, this="
093: + hashCode());
094: }
095:
096: public void ejbCreate() {
097: log.info("WorkflowEngine.ejbCreate, this=" + hashCode());
098: try {
099: setupPTP();
100: } catch (Exception e) {
101: log.error("Failed to init WorkflowEngine", e);
102: throw new EJBException("Failed to init WorkflowEngine", e);
103: }
104: }
105:
106: public void ejbRemove() {
107:
108: log.info("WorkflowEngine.ejbRemove, this=" + hashCode());
109: ctx = null;
110: try {
111: if (session != null) {
112: session.close();
113: }
114: if (conn != null) {
115: conn.close();
116: }
117: } catch (JMSException e) {
118: log.error("ejbRemove error", e);
119: }
120: }
121:
122: public void onMessage(Message msg) {
123:
124: log.info("WorkflowEngine.onMessage, this=" + hashCode());
125: try {
126: Queue dest = (Queue) msg.getJMSReplyTo();
127: log.info("Reply queue is: " + dest.getQueueName());
128: String procName = msg.getStringProperty("ReplyName");
129: log.info("procName = " + procName);
130:
131: BytesMessage bytesMessage = (BytesMessage) msg;
132: byte[] barr = new byte[10000];
133: bytesMessage.readBytes(barr);
134:
135: ByteArrayInputStream in = new ByteArrayInputStream(barr);
136: ObjectInputStream sin = new ObjectInputStream(in);
137: Request obj = (Request) sin.readObject();
138:
139: // Authenticate the request
140: String userName = obj.user.getName();
141: String password = obj.user.getPassword();
142: log.info("userName = " + userName + " password = "
143: + password);
144: if (authenticator.authenticate(userName, password) == false) {
145: // Authentication failed
146: Response authFailedResponse = new Response();
147: authFailedResponse.responseCode = Response.FAILURE;
148: authFailedResponse.message = "Authentication failed for "
149: + userName;
150: sendReply(procName, dest, authFailedResponse);
151: } else {
152: // Authentication succeeded -- proceed in servicing the request
153: Response response = obj.service();
154: sendReply(procName, dest, response);
155: }
156: } catch (Throwable t) {
157: log.error("onMessage error", t);
158: }
159:
160: }
161:
162: private void setupPTP() throws JMSException, NamingException,
163: ClassNotFoundException, InstantiationException,
164: IllegalAccessException {
165:
166: InitialContext iniCtx = new InitialContext();
167: Object tmp = iniCtx
168: .lookup(XflowConstants.XFLOW_CONNECTION_FACTORY);
169: //Object tmp = iniCtx.lookup("java:comp/env/jms/QCF");
170: QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;
171: conn = qcf.createQueueConnection();
172: session = conn.createQueueSession(false,
173: QueueSession.AUTO_ACKNOWLEDGE);
174: conn.start();
175:
176: String authClassName = (String) iniCtx
177: .lookup("java:comp/env/authenticator");
178: log.info("Authenticator is: " + authClassName);
179: authenticator = (Authenticator) Class.forName(authClassName)
180: .newInstance();
181: }
182:
183: private void sendReply(String procName, Queue dest, Response resp)
184: throws JMSException, IOException {
185:
186: log.info("WorkflowEngine.sendReply, this=" + hashCode()
187: + ", dest=" + dest);
188: QueueSender sender = session.createSender(dest);
189:
190: ByteArrayOutputStream out = new ByteArrayOutputStream();
191: ObjectOutputStream s = new ObjectOutputStream(out);
192: s.writeObject(resp);
193: s.flush();
194: byte[] barr = out.toByteArray();
195:
196: BytesMessage m = session.createBytesMessage();
197: m.writeBytes(barr);
198:
199: System.out.println("Setting ReplyName to: " + procName);
200: m.setStringProperty("ReplyName", procName);
201:
202: sender.send(m);
203: sender.close();
204: }
205: }
|