KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > za > org > coefficient > events > CoefficientEvents


1 package za.org.coefficient.events;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.List JavaDoc;
5
6 import javax.jms.*;
7 import javax.naming.InitialContext JavaDoc;
8
9 import net.sf.hibernate.util.HibernateUtil;
10 import za.org.coefficient.core.Constants;
11
12 /**
13  * Class: CoefficientEvents
14  * Description: Utility class to publish events and register handlers
15  * @author tfogwill
16  */

17 public class CoefficientEvents {
18     /**
19      * Running as EJB, or in webapp
20      */

21     private static boolean RUN_AS_EJB = true;
22     /**
23      * Invoker to send Events and register handlers in EJB world
24      */

25     private static EJBEventInvoker ejbInvoker;
26     /**
27      * Invoker to send Events and register handlers in Webapp world
28      */

29     private static WebappEventInvoker webappInvoker;
30
31     /**
32      * Init
33      */

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     /**
45      * Utility method to publish events to the queue.
46      * @param event The event to be published
47      */

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 JavaDoc eventType, CoefficientEventHandler handler){
54         if (RUN_AS_EJB) ejbInvoker.registerEventHandler(eventType, handler);
55         else webappInvoker.registerEventHandler(eventType, handler);
56     }
57 }
58
59 /**
60  * Class: WebappEventInvoker
61  * Description: Register handlers and publish CoefficientEvents to the events queue in webapp deployments
62  * @author tfogwill
63  */

64 final class WebappEventInvoker implements Runnable JavaDoc{
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 JavaDoc(this).run();
73     }
74     synchronized void registerEventHandler(Class JavaDoc eventType, CoefficientEventHandler handler){
75         EventHandlerRegistry.getInstance().registerEventHandler(eventType, handler);
76     }
77 }
78
79 /**
80  *
81  * Class: EJBEventInvoker
82  * Description: Register handlers and publish CoefficientEvents the the events queue in EJB deployments
83  * @author tfogwill
84  */

85 final class EJBEventInvoker{
86     private InitialContext JavaDoc 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             // Locate the JNDI context root
94
ctx = new InitialContext JavaDoc();
95             // Get the connection factory
96
QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ctx.lookup(Constants.JMS_CONNECTION_FACTORY);
97             // Create the connection
98
queueConnection = connectionFactory.createQueueConnection();
99             // Create the session
100
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
101             // Look up the destination
102
Queue queue = (Queue) ctx.lookup(Constants.JMS_EVENTS_QUEUE);
103             // Create a publisher
104
queueSender = queueSession.createSender(queue);
105             connected = true;
106         } catch (Exception JavaDoc e) {
107             // connection failed
108
connected = false;
109             e.printStackTrace();
110         } finally {
111             try {
112                 if (ctx != null) ctx.close();
113             } catch (Exception JavaDoc e) {
114                 e.printStackTrace();
115             }
116         }
117     }
118     void publishEvent(CoefficientEvent event){
119         if(!connected) {
120             init();
121             if(!connected) {
122                 throw new RuntimeException JavaDoc("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 JavaDoc e) {
130             System.out.println("EJBEventInvoker: Could not send Event. " + e);
131             e.printStackTrace();
132         }
133     }
134     void registerEventHandler(Class JavaDoc eventType, CoefficientEventHandler handler){
135         if(!connected) {
136             init();
137             if(!connected) {
138                 throw new RuntimeException JavaDoc("EJBEventInvoker: The Events registry cannot be found!");
139             }
140         }
141         try {
142             ObjectMessage message = queueSession.createObjectMessage();
143             ArrayList JavaDoc data = new ArrayList JavaDoc(2);
144             data.add(eventType);
145             data.add(handler);
146             message.setObject(data);
147             queueSender.send(message);
148         } catch (Exception JavaDoc e) {
149             System.out.println("EJBEventInvoker: Could not register handler. " + e);
150             e.printStackTrace();
151         }
152     }
153
154 }
155
Popular Tags