1 4 package com.nightlabs.ipanema.asyncinvoke; 5 6 import java.io.IOException ; 7 8 import javax.ejb.CreateException ; 9 import javax.jms.JMSException ; 10 import javax.jms.Message ; 11 import javax.jms.Queue ; 12 import javax.jms.QueueConnection ; 13 import javax.jms.QueueConnectionFactory ; 14 import javax.jms.QueueSender ; 15 import javax.jms.QueueSession ; 16 import javax.jms.Session ; 17 import javax.naming.InitialContext ; 18 import javax.naming.NamingException ; 19 import javax.security.auth.callback.Callback ; 20 import javax.security.auth.callback.CallbackHandler ; 21 import javax.security.auth.callback.NameCallback ; 22 import javax.security.auth.callback.PasswordCallback ; 23 import javax.security.auth.callback.UnsupportedCallbackException ; 24 import javax.security.auth.login.LoginContext ; 25 import javax.security.auth.login.LoginException ; 26 27 import com.nightlabs.ipanema.base.IpanemaServerLocalLoginManager; 28 import com.nightlabs.ipanema.servermanager.j2ee.JMSConnectionFactoryLookup; 29 30 38 public class AsyncInvoke 39 { 40 protected static final String QUEUE_INVOCATION = "queue/ipanema/IpanemaBaseBean/AsyncInvokerInvocationQueue"; 41 protected static final String QUEUE_SUCCESSCALLBACK = "queue/ipanema/IpanemaBaseBean/AsyncInvokerSuccessCallbackQueue"; 42 protected static final String QUEUE_ERRORCALLBACK = "queue/ipanema/IpanemaBaseBean/AsyncInvokerErrorCallbackQueue"; 43 protected static final String QUEUE_UNDELIVERABLECALLBACK = "queue/ipanema/IpanemaBaseBean/AsyncInvokerUndeliverableCallbackQueue"; 44 45 private InitialContext initialContext = null; 46 47 public AsyncInvoke() 48 { 49 } 50 51 55 public void exec(Invocation invocation) 56 throws JMSException , NamingException , LoginException 57 { 58 exec(invocation, null, null, null); 59 } 60 61 65 public void exec( 66 Invocation invocation, SuccessCallback successCallback) 67 throws JMSException , NamingException , LoginException 68 { 69 exec(invocation, successCallback, null, null); 70 } 71 72 76 public void exec( 77 Invocation invocation, ErrorCallback errorCallback) 78 throws JMSException , NamingException , LoginException 79 { 80 exec(invocation, null, errorCallback, null); 81 } 82 83 87 public void exec( 88 Invocation invocation, UndeliverableCallback undeliverableCallback) 89 throws JMSException , NamingException , LoginException 90 { 91 exec(invocation, null, null, undeliverableCallback); 92 } 93 94 116 public void exec( 117 Invocation invocation, SuccessCallback successCallback, 118 ErrorCallback errorCallback, UndeliverableCallback undeliverableCallback) 119 throws JMSException , NamingException , LoginException 120 { 121 AsyncInvokeEnvelope envelope = new AsyncInvokeEnvelope( 122 invocation, successCallback, errorCallback, undeliverableCallback); 123 enqueue(QUEUE_INVOCATION, envelope); 124 } 125 126 protected static class AuthCallbackHandler implements CallbackHandler 127 { 128 private String userName; 129 private char[] password; 130 131 public AuthCallbackHandler(String userName, char[] password) { 132 this.userName = userName; 133 this.password = password; 134 } 135 136 139 public void handle(Callback [] callbacks) 140 throws IOException , 141 UnsupportedCallbackException 142 { 143 for (int i = 0; i < callbacks.length; ++i) { 144 Callback cb = callbacks[i]; 145 if (cb instanceof NameCallback ) { 146 ((NameCallback )cb).setName(userName); 147 } 148 else if (cb instanceof PasswordCallback ) { 149 ((PasswordCallback )cb).setPassword(password); 150 } 151 else throw new UnsupportedCallbackException (cb); 152 } 153 } 154 } 155 156 protected AuthCallbackHandler mqCallbackHandler = null; 157 158 protected void enqueue(String queueJNDIName, AsyncInvokeEnvelope envelope) 159 throws JMSException , NamingException , LoginException 160 { 161 if (initialContext == null) 162 initialContext = new InitialContext (); 163 164 if (mqCallbackHandler == null) { 165 IpanemaServerLocalLoginManager m = IpanemaServerLocalLoginManager.getIpanemaServerLocalLoginManager(initialContext); 166 167 mqCallbackHandler = new AuthCallbackHandler( 168 IpanemaServerLocalLoginManager.PRINCIPAL_LOCALQUEUEWRITER, 169 m.getPrincipal(IpanemaServerLocalLoginManager.PRINCIPAL_LOCALQUEUEWRITER).getPassword().toCharArray()); 170 } 171 172 LoginContext loginContext = new LoginContext ("ipanemaLocal", mqCallbackHandler); 173 loginContext.login(); 174 try { 175 QueueConnectionFactory connectionFactory = JMSConnectionFactoryLookup.lookupQueueConnectionFactory(initialContext); 176 177 QueueConnection connection = null; 178 QueueSession session = null; 179 QueueSender sender = null; 180 181 try { 182 connection = connectionFactory.createQueueConnection(); 183 session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 184 Queue queue = (Queue ) initialContext.lookup(queueJNDIName); 185 sender = session.createSender(queue); 186 187 Message message = session.createObjectMessage(envelope); 188 sender.send(message); 189 } finally { 190 if (sender != null) sender.close(); 191 if (session != null) session.close(); 192 if (connection != null) connection.close(); 193 } 194 } finally { 195 loginContext.logout(); 196 } 197 } 198 199 } 200 | Popular Tags |