KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > ipanema > asyncinvoke > AsyncInvokerBaseBean


1 /*
2  * Created on Mar 25, 2005
3  */

4 package com.nightlabs.ipanema.asyncinvoke;
5
6 import javax.jms.ObjectMessage JavaDoc;
7 import javax.naming.InitialContext JavaDoc;
8 import javax.naming.NameNotFoundException JavaDoc;
9 import javax.security.auth.login.LoginContext JavaDoc;
10
11 import org.apache.log4j.Logger;
12
13 import com.nightlabs.ipanema.servermanager.IpanemaServerManager;
14 import com.nightlabs.ipanema.servermanager.IpanemaServerManagerFactory;
15 import com.nightlabs.ipanema.servermanager.j2ee.SecurityReflector;
16
17 /**
18  * @author Marco Schulze - marco at nightlabs dot de
19  */

20 public abstract class AsyncInvokerBaseBean
21 implements javax.ejb.MessageDrivenBean JavaDoc, javax.jms.MessageListener JavaDoc
22 {
23     protected Logger logger = Logger.getLogger(this.getClass());
24
25     protected javax.ejb.MessageDrivenContext JavaDoc messageContext = null;
26
27     /**
28      * Required method for container to set context.
29      * @generated
30      */

31     public void setMessageDrivenContext(
32             javax.ejb.MessageDrivenContext JavaDoc messageContext)
33             throws javax.ejb.EJBException JavaDoc
34     {
35         this.messageContext = messageContext;
36     }
37
38     /**
39      * Required creation method for message-driven beans.
40      *
41      * @ejb.create-method
42      * @generated
43      */

44     public void ejbCreate()
45     {
46         //no specific action required for message-driven beans
47
}
48
49     /**
50      * Required removal method for message-driven beans.
51      * @generated
52      */

53     public void ejbRemove()
54     {
55         messageContext = null;
56     }
57
58
59     public void onMessage(javax.jms.Message JavaDoc message)
60     {
61         try {
62             if (!(message instanceof ObjectMessage JavaDoc)) {
63                 logger.error("Message is not an instance of ObjectMessage: " + message);
64                 return;
65             }
66
67             Object JavaDoc obj = ((ObjectMessage JavaDoc)message).getObject();
68             if (!(obj instanceof AsyncInvokeEnvelope)) {
69                 logger.error("Object wrapped in ObjectMessage is not an instance of AsyncInvokeEnvelope: " + message);
70                 return;
71             }
72
73             InitialContext JavaDoc initCtxNotAuthenticated = new InitialContext JavaDoc();
74
75             logger.info("*****************************************************************");
76             logger.info("*****************************************************************");
77             logger.info("*****************************************************************");
78
79             // we need to wait for the system to be up, ready and running
80
// wait max 5 min for the IpanemaServerManagerFactory to pop up in JNDI
81
long startDT = System.currentTimeMillis();
82             IpanemaServerManagerFactory ismf = null;
83             do {
84                 logger.info("-----------------------------------------------------------------");
85
86                 if (System.currentTimeMillis() - startDT > 5 * 60 * 1000)
87                     throw new IllegalStateException JavaDoc("IpanemaServerManagerFactory did not pop up in JNDI within timeout (hardcoded 5 min)!");
88
89                 try {
90                     ismf = (IpanemaServerManagerFactory) initCtxNotAuthenticated.lookup(IpanemaServerManagerFactory.JNDI_NAME);
91                 } catch (NameNotFoundException JavaDoc x) {
92                     // ignore
93
ismf = null;
94                 }
95
96                 if (ismf == null)
97                     try { Thread.sleep(3000); } catch (InterruptedException JavaDoc x) { }
98
99             } while (ismf == null);
100
101             startDT = System.currentTimeMillis();
102             do {
103                 logger.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
104
105                 if (System.currentTimeMillis() - startDT > 10 * 60 * 1000)
106                     throw new IllegalStateException JavaDoc("IpanemaServer did not start within timeout (hardcoded 10 min)!");
107
108                 if (!ismf.isUpAndRunning())
109                     try { Thread.sleep(3000); } catch (InterruptedException JavaDoc x) { }
110
111             } while (!ismf.isUpAndRunning());
112
113             logger.info("*****************************************************************");
114             logger.info("*****************************************************************");
115
116             AsyncInvokeEnvelope envelope = (AsyncInvokeEnvelope) obj;
117
118             Invocation invocation = envelope.getInvocation();
119
120             SecurityReflector.UserDescriptor caller = envelope.getCaller();
121             LoginContext JavaDoc loginContext;
122             IpanemaServerManager ism = ismf.getIpanemaServerManager();
123             try {
124                 loginContext = new LoginContext JavaDoc(
125                         "ipanema", new AuthCallbackHandler(ism, envelope));
126
127 // Hashtable props = new Properties();
128
// String initialContextFactory = ismf.getInitialContextFactory(localServer.getJ2eeServerType(), true);
129
// props.put(InitialContext.INITIAL_CONTEXT_FACTORY, initialContextFactory);
130
// props.put(InitialContext.PROVIDER_URL, localServer.getInitialContextURL());
131
// props.put(InitialContext.SECURITY_PRINCIPAL, caller.getUserID() + '@' + caller.getOrganisationID());
132
// props.put(InitialContext.SECURITY_CREDENTIALS, ism.ipanemaSecurity_createTempUserPassword(caller.getOrganisationID(), caller.getUserID()));
133
// props.put(InitialContext.SECURITY_PROTOCOL, "ipanema");
134

135                 loginContext.login();
136                 try {
137                     AsyncInvokerDelegateLocal invokerDelegate = null;
138
139                     try {
140                         invokerDelegate = AsyncInvokerDelegateUtil.getLocalHome().create();
141                     } catch (Exception JavaDoc x) {
142                         logger.fatal("Obtaining stateless session bean AsyncInvokerDelegateLocal failed!", x);
143                         messageContext.setRollbackOnly();
144                     }
145
146                     if (invokerDelegate != null)
147                         doInvoke(envelope, invokerDelegate);
148
149                 } finally {
150                     loginContext.logout();
151                 }
152
153             } finally {
154                 ism.close();
155             }
156
157         } catch (Throwable JavaDoc x) {
158             logger.fatal("Processing message failed!", x);
159             messageContext.setRollbackOnly();
160         }
161     }
162
163     protected abstract void doInvoke(AsyncInvokeEnvelope envelope, AsyncInvokerDelegateLocal invokerDelegate);
164 }
165
Popular Tags