From 87efa1cdb79eeaf3f203cc9bf4f3d9f8d0a299f8 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 4 May 2009 20:42:23 +0000 Subject: [PATCH] Event management git-svn-id: https://svn.argeo.org/slc/trunk@2396 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/pom.xml | 3 + .../slc/services/EventPublisherAspect.java | 57 +++++++++++ .../mvc/event/AddEventListenerController.java | 33 +++++++ .../web/mvc/event/PollEventController.java | 56 +++++++++++ .../event/RemoveEventListenerController.java | 33 +++++++ .../main/java/org/argeo/slc/jms/JmsAgent.java | 4 +- .../java/org/argeo/slc/jms/JmsAgentProxy.java | 3 +- .../argeo/slc/jms/JmsSlcEventListener.java | 94 +++++++++++++++++++ .../argeo/slc/jms/JmsSlcEventPublisher.java | 52 ++++++++++ .../slc/jms/JmsTransferNewExecution.java | 3 +- .../slc/jms/MarshallerMessageConverter.java | 10 ++ .../org/argeo/slc/activemq/destinations.xml | 6 +- .../org/argeo/slc/activemq/spring-agent.xml | 32 ------- runtime/org.argeo.slc.support.castor/pom.xml | 1 + .../resources/org/argeo/slc/castor/msg.xml | 20 ++++ .../argeo/slc/core/runtime/AbstractAgent.java | 1 + .../org/argeo/slc/msg/event/SlcEvent.java | 27 ++++++ .../argeo/slc/msg/event/SlcEventListener.java | 11 +++ .../msg/event/SlcEventListenerDescriptor.java | 35 +++++++ .../msg/event/SlcEventListenerRegister.java | 29 ++++++ .../slc/msg/event/SlcEventPublisher.java | 5 + .../META-INF/MANIFEST.MF | 1 + .../META-INF/spring/jms-osgi.xml | 3 + .../META-INF/spring/jms.xml | 18 ++++ .../META-INF/spring/services-osgi.xml | 3 + .../META-INF/spring/services.xml | 7 ++ .../META-INF/MANIFEST.MF | 6 ++ .../org.argeo.slc.webapp.war/WEB-INF/osgi.xml | 2 + .../WEB-INF/slc-service-servlet.xml | 25 ++++- 29 files changed, 540 insertions(+), 40 deletions(-) create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/EventPublisherAspect.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/AddEventListenerController.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/PollEventController.java create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/RemoveEventListenerController.java create mode 100644 runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventListener.java create mode 100644 runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventPublisher.java delete mode 100644 runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/spring-agent.xml create mode 100644 runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEvent.java create mode 100644 runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListener.java create mode 100644 runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerDescriptor.java create mode 100644 runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerRegister.java create mode 100644 runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventPublisher.java diff --git a/demo/pom.xml b/demo/pom.xml index f2d0b19e9..c7df955a2 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -20,6 +20,9 @@ org.argeo.slc.maven maven-argeo-osgi-plugin + + -clean + ${basedir}/site;in=*;ex=**/.svn/**,${basedir}/../server/org.argeo.slc.siteserver/bundles;in=*;ex=**/.svn/** diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/EventPublisherAspect.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/EventPublisherAspect.java new file mode 100644 index 000000000..ea0ce12c3 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/EventPublisherAspect.java @@ -0,0 +1,57 @@ +package org.argeo.slc.services; + +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.core.runtime.AbstractAgent; +import org.argeo.slc.msg.event.SlcEvent; +import org.argeo.slc.msg.event.SlcEventPublisher; +import org.argeo.slc.runtime.SlcAgentDescriptor; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; + +@Aspect +public class EventPublisherAspect { + private final static Log log = LogFactory + .getLog(EventPublisherAspect.class); + + private List eventPublishers; + + @After("execution(void org.argeo.slc.services.runtime.AgentService.register(..))") + public void registerAgent(JoinPoint jp) throws Throwable { + SlcAgentDescriptor agentDescriptor = (SlcAgentDescriptor) jp.getArgs()[0]; + SlcEvent event = new SlcEvent("agentRegistered"); + event.getHeaders().put(AbstractAgent.PROPERTY_SLC_AGENT_ID, + agentDescriptor.getUuid()); + publishEvent(event); + } + + @After("execution(void org.argeo.slc.services.runtime.AgentService.unregister(..))") + public void unregisterAgent(JoinPoint jp) throws Throwable { + SlcAgentDescriptor agentDescriptor = (SlcAgentDescriptor) jp.getArgs()[0]; + SlcEvent event = new SlcEvent("agentUnregistered"); + event.getHeaders().put(AbstractAgent.PROPERTY_SLC_AGENT_ID, + agentDescriptor.getUuid()); + publishEvent(event); + } + + public void setEventPublishers(List eventPublishers) { + this.eventPublishers = eventPublishers; + } + + protected void publishEvent(SlcEvent event) { + + for (Iterator it = eventPublishers.iterator(); it + .hasNext();) { + SlcEventPublisher eventPublisher = it.next(); + if (log.isTraceEnabled()) + log.debug("Publish event: " + + event.getHeaders().get(SlcEvent.EVENT_TYPE) + " to " + + eventPublisher); + eventPublisher.publish(event); + } + } +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/AddEventListenerController.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/AddEventListenerController.java new file mode 100644 index 000000000..d72d53bec --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/AddEventListenerController.java @@ -0,0 +1,33 @@ +package org.argeo.slc.web.mvc.event; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.msg.event.SlcEvent; +import org.argeo.slc.msg.event.SlcEventListenerDescriptor; +import org.argeo.slc.msg.event.SlcEventListenerRegister; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +public class AddEventListenerController extends AbstractServiceController { + + private SlcEventListenerRegister eventListenerRegister; + + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + String eventType = request.getParameter(SlcEvent.EVENT_TYPE); + String eventFilter = request.getParameter(SlcEvent.EVENT_FILTER); + + eventListenerRegister + .addEventListenerDescriptor(new SlcEventListenerDescriptor( + eventType, eventFilter)); + } + + public void setEventListenerRegister( + SlcEventListenerRegister eventListenerRegister) { + this.eventListenerRegister = eventListenerRegister; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/PollEventController.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/PollEventController.java new file mode 100644 index 000000000..0ebb2f646 --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/PollEventController.java @@ -0,0 +1,56 @@ +package org.argeo.slc.web.mvc.event; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.msg.event.SlcEvent; +import org.argeo.slc.msg.event.SlcEventListener; +import org.argeo.slc.msg.event.SlcEventListenerRegister; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +public class PollEventController extends AbstractServiceController { + private final static Log log = LogFactory.getLog(PollEventController.class); + + private SlcEventListener eventListener; + private SlcEventListenerRegister eventListenerRegister; + private Long defaultTimeout = 10000l; + + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + String timeoutStr = request.getParameter("timeout"); + + final Long timeout; + if (timeoutStr != null) + timeout = Long.parseLong(timeoutStr); + else + timeout = defaultTimeout; + + SlcEvent event = eventListener.listen(eventListenerRegister, timeout); + if (event != null) { + modelAndView.addObject("event", event); + + if (log.isTraceEnabled()) + log.debug("Received event: " + + event.getHeaders().get(SlcEvent.EVENT_TYPE)); + } + } + + public void setEventListener(SlcEventListener slcEventListener) { + this.eventListener = slcEventListener; + } + + public void setEventListenerRegister( + SlcEventListenerRegister eventListenerRegister) { + this.eventListenerRegister = eventListenerRegister; + } + + public void setDefaultTimeout(Long defaultTimeout) { + this.defaultTimeout = defaultTimeout; + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/RemoveEventListenerController.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/RemoveEventListenerController.java new file mode 100644 index 000000000..4d9f3624a --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/event/RemoveEventListenerController.java @@ -0,0 +1,33 @@ +package org.argeo.slc.web.mvc.event; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.msg.event.SlcEvent; +import org.argeo.slc.msg.event.SlcEventListenerDescriptor; +import org.argeo.slc.msg.event.SlcEventListenerRegister; +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +public class RemoveEventListenerController extends AbstractServiceController { + + private SlcEventListenerRegister eventListenerRegister; + + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + String eventType = request.getParameter(SlcEvent.EVENT_TYPE); + String eventFilter = request.getParameter(SlcEvent.EVENT_FILTER); + + eventListenerRegister + .removeEventListenerDescriptor(new SlcEventListenerDescriptor( + eventType, eventFilter)); + } + + public void setEventListenerRegister( + SlcEventListenerRegister eventListenerRegister) { + this.eventListenerRegister = eventListenerRegister; + } + +} diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java index e7899d1ae..85bdb1451 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java @@ -32,8 +32,6 @@ import org.springframework.jms.core.MessagePostProcessor; public class JmsAgent extends AbstractAgent implements SlcAgent, InitializingBean, DisposableBean, MessageListener { public final static String PROPERTY_QUERY = "query"; - public final static String PROPERTY_SLC_AGENT_ID = "slc_agentId"; - public final static String QUERY_PING_ALL = "pingAll"; private final static Log log = LogFactory.getLog(JmsAgent.class); @@ -159,7 +157,7 @@ public class JmsAgent extends AbstractAgent implements SlcAgent, public Message postProcessMessage(Message messageToSend) throws JMSException { messageToSend.setStringProperty(PROPERTY_QUERY, query); - messageToSend.setStringProperty(PROPERTY_SLC_AGENT_ID, + messageToSend.setStringProperty(AbstractAgent.PROPERTY_SLC_AGENT_ID, agentDescriptor.getUuid()); messageToSend.setJMSCorrelationID(correlationId); return messageToSend; diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java index 4029af0a9..7fa270a9b 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java @@ -12,6 +12,7 @@ import javax.jms.TextMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.slc.SlcException; +import org.argeo.slc.core.runtime.AbstractAgent; import org.argeo.slc.execution.ExecutionModuleDescriptor; import org.argeo.slc.msg.ExecutionAnswer; import org.argeo.slc.process.SlcExecution; @@ -175,7 +176,7 @@ public class JmsAgentProxy implements SlcAgent { msg = session.createTextMessage(); else msg = toMessage(body, session); - msg.setStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID, agentUuid); + msg.setStringProperty(AbstractAgent.PROPERTY_SLC_AGENT_ID, agentUuid); msg.setStringProperty(JmsAgent.PROPERTY_QUERY, query); msg.setJMSCorrelationID(correlationId); setArguments(msg); diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventListener.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventListener.java new file mode 100644 index 000000000..a05a367b4 --- /dev/null +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventListener.java @@ -0,0 +1,94 @@ +package org.argeo.slc.jms; + +import java.util.List; + +import javax.jms.ConnectionFactory; +import javax.jms.Destination; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.argeo.slc.msg.event.SlcEvent; +import org.argeo.slc.msg.event.SlcEventListener; +import org.argeo.slc.msg.event.SlcEventListenerDescriptor; +import org.argeo.slc.msg.event.SlcEventListenerRegister; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.support.converter.MessageConverter; + +public class JmsSlcEventListener implements SlcEventListener { + private final static Log log = LogFactory.getLog(JmsSlcEventListener.class); + + private Destination eventsDestination; + private ConnectionFactory jmsConnectionFactory; + private MessageConverter messageConverter; + + public SlcEvent listen(SlcEventListenerRegister register, Long timeout) { + JmsTemplate jmsTemplate = new JmsTemplate(jmsConnectionFactory); + jmsTemplate.setMessageConverter(messageConverter); + jmsTemplate.setReceiveTimeout(timeout); + + List descriptors = register + .getDescriptorsCopy(); + + if (descriptors.size() == 0) { + // No listeners, just waiting + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + // silent + } + return null; + } else { + String selector = createSelector(descriptors); + + if (log.isTraceEnabled()) + log.debug("Selector: " + selector); + + Object obj = jmsTemplate.receiveSelectedAndConvert( + eventsDestination, selector); + + if (obj == null) + return null; + else + return (SlcEvent) obj; + } + } + + /** Returns null if no filter */ + protected String createSelector(List descriptors) { + if (descriptors.size() == 0) + throw new SlcException("No listeners, cannot generate JMS selector"); + + StringBuffer buf = new StringBuffer(256); + Boolean first = true; + for (SlcEventListenerDescriptor descriptor : descriptors) { + if (first) + first = false; + else + buf.append(" OR "); + + buf.append('('); + buf.append(SlcEvent.EVENT_TYPE).append("=").append('\'').append( + descriptor.getEventType()).append('\''); + if (descriptor.getFilter() != null) { + buf.append(" AND "); + buf.append('(').append(descriptor.getFilter()).append(')'); + } + buf.append(')'); + } + return buf.toString(); + } + + public void setEventsDestination(Destination eventsDestination) { + this.eventsDestination = eventsDestination; + } + + public void setJmsConnectionFactory(ConnectionFactory jmsConnectionFactory) { + this.jmsConnectionFactory = jmsConnectionFactory; + } + + public void setMessageConverter(MessageConverter messageConverter) { + this.messageConverter = messageConverter; + } + +} diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventPublisher.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventPublisher.java new file mode 100644 index 000000000..bcf13325c --- /dev/null +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsSlcEventPublisher.java @@ -0,0 +1,52 @@ +package org.argeo.slc.jms; + +import java.util.Map; + +import javax.jms.Destination; +import javax.jms.JMSException; +import javax.jms.Message; + +import org.argeo.slc.msg.event.SlcEvent; +import org.argeo.slc.msg.event.SlcEventPublisher; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.core.MessagePostProcessor; + +public class JmsSlcEventPublisher implements SlcEventPublisher { + private Destination eventsDestination; + private JmsTemplate jmsTemplate; + + public void publish(final SlcEvent event) { + jmsTemplate.convertAndSend(eventsDestination, event, + new MessagePostProcessor() { + + public Message postProcessMessage(Message message) + throws JMSException { + Map headers = event.getHeaders(); + for (String key : headers.keySet()) { + message.setStringProperty(key, headers.get(key)); + } + return message; + } + }); + // jmsTemplate.send(eventsDestination, new MessageCreator() { + // public Message createMessage(Session session) throws JMSException { + // TextMessage msg = session.createTextMessage(); + // // TODO: remove workaround when upgrading to ActiveMQ 5.3 + // // Workaround for + // // https://issues.apache.org/activemq/browse/AMQ-2046 + // msg.setText(""); + // + // return msg; + // } + // }); + } + + public void setEventsDestination(Destination eventsDestination) { + this.eventsDestination = eventsDestination; + } + + public void setJmsTemplate(JmsTemplate jmsTemplate) { + this.jmsTemplate = jmsTemplate; + } + +} diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java index 74f1eb231..68295e8cf 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTransferNewExecution.java @@ -4,6 +4,7 @@ import javax.jms.Message; import javax.jms.MessageListener; import org.argeo.slc.SlcException; +import org.argeo.slc.core.runtime.AbstractAgent; import org.argeo.slc.msg.MsgHandler; import org.argeo.slc.process.SlcExecution; import org.argeo.slc.runtime.SlcAgent; @@ -19,7 +20,7 @@ public class JmsTransferNewExecution implements MessageListener { public void onMessage(final Message message) { try { String agentId = message - .getStringProperty(JmsAgent.PROPERTY_SLC_AGENT_ID); + .getStringProperty(AbstractAgent.PROPERTY_SLC_AGENT_ID); final SlcAgent agent = agentFactory.getAgent(agentId); final SlcExecution slcExecution = (SlcExecution) messageConverter .fromMessage(message); diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/MarshallerMessageConverter.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/MarshallerMessageConverter.java index b42602606..31e635445 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/MarshallerMessageConverter.java +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/MarshallerMessageConverter.java @@ -24,8 +24,13 @@ public class MarshallerMessageConverter implements MessageConverter { private Marshaller marshaller; private Unmarshaller unmarshaller; + /** @return the converted message or null if the message itself is null */ public Object fromMessage(Message message) throws JMSException, MessageConversionException { + if (message == null) { + return null; + } + if (log.isTraceEnabled()) { Enumeration names = message.getPropertyNames(); while (names.hasMoreElements()) { @@ -38,6 +43,11 @@ public class MarshallerMessageConverter implements MessageConverter { if (message instanceof TextMessage) { String text = ((TextMessage) message).getText(); + + if (text == null) + throw new SlcException( + "Cannot unmarshall message without body: " + message); + try { return unmarshaller.unmarshal(new StringSource(text)); } catch (Exception e) { diff --git a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml index eb84e02b0..967b0daf9 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml +++ b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml @@ -4,8 +4,10 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" default-lazy-init="false"> - - + + + diff --git a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/spring-agent.xml b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/spring-agent.xml deleted file mode 100644 index a6492a546..000000000 --- a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/spring-agent.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime/org.argeo.slc.support.castor/pom.xml b/runtime/org.argeo.slc.support.castor/pom.xml index 5fa3b3f9a..945dc6ec0 100644 --- a/runtime/org.argeo.slc.support.castor/pom.xml +++ b/runtime/org.argeo.slc.support.castor/pom.xml @@ -47,6 +47,7 @@ org.argeo.slc.core.execution;resolution:=optional, org.argeo.slc.msg;resolution:=optional, org.argeo.slc.msg.process;resolution:=optional, + org.argeo.slc.msg.event;resolution:=optional, org.argeo.slc.msg.test.tree;resolution:=optional, org.argeo.slc.detached;resolution:=optional, org.apache.xml.serialize diff --git a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml index 1d13dee7d..146c020e8 100644 --- a/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml +++ b/runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml @@ -151,5 +151,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java index c7a419c65..16f87e9a3 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java @@ -7,6 +7,7 @@ public abstract class AbstractAgent { // private final static Log log = LogFactory.getLog(AbstractAgent.class); private ExecutionModulesManager modulesManager; + public final static String PROPERTY_SLC_AGENT_ID = "slc_agentId"; public void runSlcExecution(final SlcExecution slcExecution) { modulesManager.process(slcExecution); diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEvent.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEvent.java new file mode 100644 index 000000000..695ec24bb --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEvent.java @@ -0,0 +1,27 @@ +package org.argeo.slc.msg.event; + +import java.util.HashMap; +import java.util.Map; + +public class SlcEvent { + public final static String EVENT_TYPE = "slc_eventType"; + public final static String EVENT_FILTER = "slc_eventFilter"; + + private Map headers = new HashMap(); + + public SlcEvent() { + } + + public SlcEvent(String eventType) { + headers.put(EVENT_TYPE, eventType); + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + +} diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListener.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListener.java new file mode 100644 index 000000000..75048f78e --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListener.java @@ -0,0 +1,11 @@ +package org.argeo.slc.msg.event; + +public interface SlcEventListener { + /** + * Blocks until an event is received or timeout is reached + * + * @return the event received or null if timeout was reached before + * receiving one + */ + public SlcEvent listen(SlcEventListenerRegister register, Long timeout); +} diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerDescriptor.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerDescriptor.java new file mode 100644 index 000000000..f3b7c5d65 --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerDescriptor.java @@ -0,0 +1,35 @@ +package org.argeo.slc.msg.event; + +import java.io.Serializable; + +public class SlcEventListenerDescriptor implements Serializable { + static final long serialVersionUID = 1l; + + private final String eventType; + private final String filter; + + public SlcEventListenerDescriptor(String eventType, String filter) { + super(); + this.eventType = eventType; + this.filter = filter; + } + + public String getEventType() { + return eventType; + } + + public String getFilter() { + return filter; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SlcEventListenerDescriptor) { + SlcEventListenerDescriptor eventListenerDescriptor = (SlcEventListenerDescriptor) obj; + return eventListenerDescriptor.getEventType() + .equals(getEventType()); + } + return false; + } + +} diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerRegister.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerRegister.java new file mode 100644 index 000000000..52aa8c3b0 --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventListenerRegister.java @@ -0,0 +1,29 @@ +package org.argeo.slc.msg.event; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +public class SlcEventListenerRegister implements Serializable { + static final long serialVersionUID = 1l; + + /** Synchronized */ + private List descriptors = new Vector(); + + public synchronized void addEventListenerDescriptor( + SlcEventListenerDescriptor eventListenerDescriptor) { + if (descriptors.contains(eventListenerDescriptor)) + descriptors.remove(eventListenerDescriptor); + descriptors.add(eventListenerDescriptor); + } + + public synchronized void removeEventListenerDescriptor( + SlcEventListenerDescriptor eventListenerDescriptor) { + descriptors.remove(eventListenerDescriptor); + } + + public synchronized List getDescriptorsCopy() { + return new ArrayList(descriptors); + } +} diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventPublisher.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventPublisher.java new file mode 100644 index 000000000..d7ab83001 --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/event/SlcEventPublisher.java @@ -0,0 +1,5 @@ +package org.argeo.slc.msg.event; + +public interface SlcEventPublisher { + public void publish(SlcEvent event); +} diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF index 1a263df56..58fb3ea78 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF @@ -7,6 +7,7 @@ Import-Package: javax.jms, Require-Bundle: org.argeo.slc.specs, org.argeo.slc.server, + org.argeo.slc.support.simple, org.argeo.slc.support.activemq, org.springframework.core, org.springframework.context, diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml index d644211cf..6ba1c5c42 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml @@ -18,4 +18,7 @@ bean-name="jmsTransactionManager" /> + + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml index d747ec676..d141b7f87 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml @@ -6,6 +6,18 @@ + + + + + + + + + + + + @@ -92,6 +104,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml index 45406600f..6f4602a26 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml @@ -17,6 +17,13 @@ + + + + + + + diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF index 9ba6c5a94..8e1837520 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF @@ -23,12 +23,18 @@ Import-Package: com.sun.xml.messaging.saaj.soap;optional=true, org.hibernate.jdbc, org.springframework.aop, org.springframework.aop.framework, + org.springframework.aop.scope, + net.sf.cglib.proxy, + net.sf.cglib.core, + net.sf.cglib.reflect, org.springframework.orm.hibernate3.support, org.springframework.osgi.web.context.support, org.springframework.oxm.castor, org.springframework.transaction, + org.springframework.beans.factory.support, org.springframework.web.context, org.springframework.web.context.support, + org.springframework.web.context.request, org.springframework.web.servlet, org.springframework.web.servlet.handler, org.springframework.web.servlet.view, diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/osgi.xml index 28612127b..461f88963 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/osgi.xml @@ -33,4 +33,6 @@ + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml index 0f913c85f..5f17ee8d2 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml @@ -1,7 +1,9 @@ + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> @@ -62,6 +64,27 @@ + + + + + + + + + + + + + + + + + + -- 2.39.2