]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventListener.java
a05a367b4886f83025e48cc4f2b900910be5835c
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.activemq / src / main / java / org / argeo / slc / jms / JmsSlcEventListener.java
1 package org.argeo.slc.jms;
2
3 import java.util.List;
4
5 import javax.jms.ConnectionFactory;
6 import javax.jms.Destination;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10 import org.argeo.slc.SlcException;
11 import org.argeo.slc.msg.event.SlcEvent;
12 import org.argeo.slc.msg.event.SlcEventListener;
13 import org.argeo.slc.msg.event.SlcEventListenerDescriptor;
14 import org.argeo.slc.msg.event.SlcEventListenerRegister;
15 import org.springframework.jms.core.JmsTemplate;
16 import org.springframework.jms.support.converter.MessageConverter;
17
18 public class JmsSlcEventListener implements SlcEventListener {
19 private final static Log log = LogFactory.getLog(JmsSlcEventListener.class);
20
21 private Destination eventsDestination;
22 private ConnectionFactory jmsConnectionFactory;
23 private MessageConverter messageConverter;
24
25 public SlcEvent listen(SlcEventListenerRegister register, Long timeout) {
26 JmsTemplate jmsTemplate = new JmsTemplate(jmsConnectionFactory);
27 jmsTemplate.setMessageConverter(messageConverter);
28 jmsTemplate.setReceiveTimeout(timeout);
29
30 List<SlcEventListenerDescriptor> descriptors = register
31 .getDescriptorsCopy();
32
33 if (descriptors.size() == 0) {
34 // No listeners, just waiting
35 try {
36 Thread.sleep(timeout);
37 } catch (InterruptedException e) {
38 // silent
39 }
40 return null;
41 } else {
42 String selector = createSelector(descriptors);
43
44 if (log.isTraceEnabled())
45 log.debug("Selector: " + selector);
46
47 Object obj = jmsTemplate.receiveSelectedAndConvert(
48 eventsDestination, selector);
49
50 if (obj == null)
51 return null;
52 else
53 return (SlcEvent) obj;
54 }
55 }
56
57 /** Returns null if no filter */
58 protected String createSelector(List<SlcEventListenerDescriptor> descriptors) {
59 if (descriptors.size() == 0)
60 throw new SlcException("No listeners, cannot generate JMS selector");
61
62 StringBuffer buf = new StringBuffer(256);
63 Boolean first = true;
64 for (SlcEventListenerDescriptor descriptor : descriptors) {
65 if (first)
66 first = false;
67 else
68 buf.append(" OR ");
69
70 buf.append('(');
71 buf.append(SlcEvent.EVENT_TYPE).append("=").append('\'').append(
72 descriptor.getEventType()).append('\'');
73 if (descriptor.getFilter() != null) {
74 buf.append(" AND ");
75 buf.append('(').append(descriptor.getFilter()).append(')');
76 }
77 buf.append(')');
78 }
79 return buf.toString();
80 }
81
82 public void setEventsDestination(Destination eventsDestination) {
83 this.eventsDestination = eventsDestination;
84 }
85
86 public void setJmsConnectionFactory(ConnectionFactory jmsConnectionFactory) {
87 this.jmsConnectionFactory = jmsConnectionFactory;
88 }
89
90 public void setMessageConverter(MessageConverter messageConverter) {
91 this.messageConverter = messageConverter;
92 }
93
94 }