1 package za.org.coefficient.events; 2 3 import java.util.ArrayList ; 4 import java.util.List ; 5 6 import javax.jms.*; 7 import javax.naming.InitialContext ; 8 9 import net.sf.hibernate.util.HibernateUtil; 10 import za.org.coefficient.core.Constants; 11 12 17 public class CoefficientEvents { 18 21 private static boolean RUN_AS_EJB = true; 22 25 private static EJBEventInvoker ejbInvoker; 26 29 private static WebappEventInvoker webappInvoker; 30 31 34 static { 35 if(HibernateUtil.usingDataSource()) { 36 RUN_AS_EJB = true; 37 ejbInvoker = new EJBEventInvoker(); 38 } else { 39 RUN_AS_EJB = false; 40 webappInvoker = new WebappEventInvoker(); 41 } 42 } 43 44 48 public static void publishEvent(CoefficientEvent event){ 49 if (RUN_AS_EJB) ejbInvoker.publishEvent(event); 50 else webappInvoker.publishEvent(event); 51 } 52 53 public static void registerEventHandler(Class eventType, CoefficientEventHandler handler){ 54 if (RUN_AS_EJB) ejbInvoker.registerEventHandler(eventType, handler); 55 else webappInvoker.registerEventHandler(eventType, handler); 56 } 57 } 58 59 64 final class WebappEventInvoker implements Runnable { 65 private EventDispatcher dispatcher = new EventDispatcher(); 66 private CoefficientEvent event; 67 public void run(){ 68 dispatcher.dispatchEvent(event); 69 } 70 synchronized void publishEvent(CoefficientEvent event){ 71 this.event = event; 72 new Thread (this).run(); 73 } 74 synchronized void registerEventHandler(Class eventType, CoefficientEventHandler handler){ 75 EventHandlerRegistry.getInstance().registerEventHandler(eventType, handler); 76 } 77 } 78 79 85 final class EJBEventInvoker{ 86 private InitialContext ctx = null; 87 private QueueConnection queueConnection = null; 88 private QueueSession queueSession = null; 89 private QueueSender queueSender = null; 90 private boolean connected = false; 91 private void init() { 92 try { 93 ctx = new InitialContext (); 95 QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ctx.lookup(Constants.JMS_CONNECTION_FACTORY); 97 queueConnection = connectionFactory.createQueueConnection(); 99 queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 101 Queue queue = (Queue) ctx.lookup(Constants.JMS_EVENTS_QUEUE); 103 queueSender = queueSession.createSender(queue); 105 connected = true; 106 } catch (Exception e) { 107 connected = false; 109 e.printStackTrace(); 110 } finally { 111 try { 112 if (ctx != null) ctx.close(); 113 } catch (Exception e) { 114 e.printStackTrace(); 115 } 116 } 117 } 118 void publishEvent(CoefficientEvent event){ 119 if(!connected) { 120 init(); 121 if(!connected) { 122 throw new RuntimeException ("EJBEventInvoker: The Events queue cannot be found!"); 123 } 124 } 125 try { 126 ObjectMessage message = queueSession.createObjectMessage(); 127 message.setObject(event); 128 queueSender.send(message); 129 } catch (Exception e) { 130 System.out.println("EJBEventInvoker: Could not send Event. " + e); 131 e.printStackTrace(); 132 } 133 } 134 void registerEventHandler(Class eventType, CoefficientEventHandler handler){ 135 if(!connected) { 136 init(); 137 if(!connected) { 138 throw new RuntimeException ("EJBEventInvoker: The Events registry cannot be found!"); 139 } 140 } 141 try { 142 ObjectMessage message = queueSession.createObjectMessage(); 143 ArrayList data = new ArrayList (2); 144 data.add(eventType); 145 data.add(handler); 146 message.setObject(data); 147 queueSender.send(message); 148 } catch (Exception e) { 149 System.out.println("EJBEventInvoker: Could not register handler. " + e); 150 e.printStackTrace(); 151 } 152 } 153 154 } 155 | Popular Tags |