From e80038ffdadc9e29550c7afe0762d3e14e23b4b9 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Fri, 8 Apr 2016 15:57:50 +1000 Subject: [PATCH] refactor(ZNTA-938): update webhook to use queue --- docs/release-notes.md | 8 +- .../configuration/jms-messaging.md | 7 +- etc/scripts/standalone.cli.messaging.config | 1 + .../src/test/resources/conf/standalone.xml | 4 + .../resources/conf/standalone_wildfly.xml | 1 + .../configuration/standalone-zanata.xml | 4 + .../configuration/standalone-zanata.xml | 1 + .../org/zanata/events/WebhookJmsEvent.java | 45 ++++++++++ .../EmailQueueMessageReceiver.java | 69 ++------------- .../notification/JmsResourcesProducer.java | 23 ++++- ...eamPermissionChangeJmsPayloadHandler.java} | 6 +- .../notification/NotificationManager.java | 23 ++++- .../notification/QueueMessageReceiver.java | 87 +++++++++++++++++++ .../WebhookJmsPayloadHandler.java | 64 ++++++++++++++ .../WebhookQueueMessageReceiver.java | 64 ++++++++++++++ .../notification/WebhookQueueSender.java | 33 +++++++ .../service/impl/DocumentServiceImpl.java | 10 ++- .../main/webapp-jboss/WEB-INF/jboss-web.xml | 5 ++ .../EmailQueueMessageReceiverTest.java | 3 +- ...ermissionChangeJmsPayloadHandlerTest.java} | 7 +- .../standalone-arquillian-wildfly.xml | 1 + .../arquillian/standalone-arquillian.xml | 4 + 22 files changed, 384 insertions(+), 86 deletions(-) create mode 100644 zanata-war/src/main/java/org/zanata/events/WebhookJmsEvent.java rename zanata-war/src/main/java/org/zanata/notification/{LanguageTeamPermissionChangeJmsMessagePayloadHandler.java => LanguageTeamPermissionChangeJmsPayloadHandler.java} (95%) create mode 100644 zanata-war/src/main/java/org/zanata/notification/QueueMessageReceiver.java create mode 100644 zanata-war/src/main/java/org/zanata/notification/WebhookJmsPayloadHandler.java create mode 100644 zanata-war/src/main/java/org/zanata/notification/WebhookQueueMessageReceiver.java create mode 100644 zanata-war/src/main/java/org/zanata/notification/WebhookQueueSender.java rename zanata-war/src/test/java/org/zanata/notification/{LanguageTeamPermissionChangeJmsMessagePayloadHandlerTest.java => LanguageTeamPermissionChangeJmsPayloadHandlerTest.java} (91%) diff --git a/docs/release-notes.md b/docs/release-notes.md index a1a63bc191..29300ae2f1 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,6 +1,10 @@ ## 3.9 +
New Features
+* [ZNTA-938](https://zanata.atlassian.net/browse/ZNTA-938) - Webhook event for translation update by user.
Infrastructure Changes
+* Recommended platform: JBoss EAP 6 (6.4.6.GA or later). +* Alternative platform: WildFly version 10.x. * [ZNTA-530](https://zanata.atlassian.net/browse/ZNTA-530) - Replace Seam 2 with CDI * In WildFly or EAP `standalone.xml`, please make sure the Weld extension is present in the `extensions` section like this: @@ -33,10 +37,6 @@ * [ZNTA-928](https://zanata.atlassian.net/browse/ZNTA-928) - Readonly project doesn't have "lock" icon in UI * [ZNTA-793](https://zanata.atlassian.net/browse/ZNTA-793) - Remove unused method in TranslationMemoryAction -
Infrastructure Changes
-* Recommended platform: JBoss EAP 6 (6.4.6.GA or later). -* Alternative platform: WildFly version 10.x. - ----------------------- ## 3.8.4
Bug fixes
diff --git a/docs/user-guide/system-admin/configuration/jms-messaging.md b/docs/user-guide/system-admin/configuration/jms-messaging.md index a406ac1b0b..4ebe5f2c11 100644 --- a/docs/user-guide/system-admin/configuration/jms-messaging.md +++ b/docs/user-guide/system-admin/configuration/jms-messaging.md @@ -53,6 +53,10 @@ EAP 6: true + + + true + @@ -83,11 +87,12 @@ or (Wildfly 10, EAP 7): + ``` -The only Zanata-specific change here is the addition of the JMS queue "MailsQueue" - the mdb configuration is simply copied from `standalone-full.xml`. +The only Zanata-specific change here is the addition of the JMS queue "MailsQueue" and "WebhookQueue" - the mdb configuration is simply copied from `standalone-full.xml`. Restart your server to ensure changes are applied. diff --git a/etc/scripts/standalone.cli.messaging.config b/etc/scripts/standalone.cli.messaging.config index 492e21c3b7..5edb1ef983 100644 --- a/etc/scripts/standalone.cli.messaging.config +++ b/etc/scripts/standalone.cli.messaging.config @@ -8,5 +8,6 @@ connect batch jms-queue add --queue-address=MailsQueue --durable=true --entries=["java:/jms/queue/MailsQueue"] +jms-queue add --queue-address=WebhookQueue --durable=true --entries=["java:/jms/queue/WebhookQueue"] run-batch diff --git a/functional-test/src/test/resources/conf/standalone.xml b/functional-test/src/test/resources/conf/standalone.xml index 34a76e1185..a3465b99d8 100644 --- a/functional-test/src/test/resources/conf/standalone.xml +++ b/functional-test/src/test/resources/conf/standalone.xml @@ -341,6 +341,10 @@ + + + true + true diff --git a/functional-test/src/test/resources/conf/standalone_wildfly.xml b/functional-test/src/test/resources/conf/standalone_wildfly.xml index 24d0a82b35..31d718aac0 100644 --- a/functional-test/src/test/resources/conf/standalone_wildfly.xml +++ b/functional-test/src/test/resources/conf/standalone_wildfly.xml @@ -378,6 +378,7 @@ + diff --git a/zanata-overlay/distros/eap-6/standalone/configuration/standalone-zanata.xml b/zanata-overlay/distros/eap-6/standalone/configuration/standalone-zanata.xml index 3c50e13cfe..cf4c5d9e20 100644 --- a/zanata-overlay/distros/eap-6/standalone/configuration/standalone-zanata.xml +++ b/zanata-overlay/distros/eap-6/standalone/configuration/standalone-zanata.xml @@ -377,6 +377,10 @@ + + + true + true diff --git a/zanata-overlay/distros/wildfly/standalone/configuration/standalone-zanata.xml b/zanata-overlay/distros/wildfly/standalone/configuration/standalone-zanata.xml index 8e8c842ff5..73a216d709 100644 --- a/zanata-overlay/distros/wildfly/standalone/configuration/standalone-zanata.xml +++ b/zanata-overlay/distros/wildfly/standalone/configuration/standalone-zanata.xml @@ -434,6 +434,7 @@ + diff --git a/zanata-war/src/main/java/org/zanata/events/WebhookJmsEvent.java b/zanata-war/src/main/java/org/zanata/events/WebhookJmsEvent.java new file mode 100644 index 0000000000..7d2cd7e02b --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/events/WebhookJmsEvent.java @@ -0,0 +1,45 @@ +/* + * Copyright 2016, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ + +package org.zanata.events; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * A wrapper for JMS event for all webhook + * + * @author Alex Engaeng@redhat.com + */ +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class WebhookJmsEvent implements Serializable { + + private WebhookEventType event; + + private String url; + + private String secret; +} diff --git a/zanata-war/src/main/java/org/zanata/notification/EmailQueueMessageReceiver.java b/zanata-war/src/main/java/org/zanata/notification/EmailQueueMessageReceiver.java index e825527feb..1c4eb9cdf8 100644 --- a/zanata-war/src/main/java/org/zanata/notification/EmailQueueMessageReceiver.java +++ b/zanata-war/src/main/java/org/zanata/notification/EmailQueueMessageReceiver.java @@ -20,16 +20,10 @@ */ package org.zanata.notification; -import java.io.Serializable; -import java.util.Collections; import java.util.Map; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.ObjectMessage; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -37,15 +31,8 @@ import lombok.extern.slf4j.Slf4j; import javax.inject.Inject; -import javax.inject.Named; import org.zanata.events.LanguageTeamPermissionChangedEvent; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableMap; - -import static com.google.common.base.Strings.nullToEmpty; -import static org.zanata.notification.NotificationManager.MessagePropertiesKey; - /** * JMS EmailsQueue consumer. It will base on * org.zanata.notification.NotificationManager.MessagePropertiesKey#objectType @@ -68,62 +55,16 @@ @Slf4j @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PROTECTED) -public class EmailQueueMessageReceiver implements MessageListener { - - private static Map handlers = Collections - .emptyMap(); - +public class EmailQueueMessageReceiver extends QueueMessageReceiver { @Inject - private LanguageTeamPermissionChangeJmsMessagePayloadHandler languageTeamHandler; + private LanguageTeamPermissionChangeJmsPayloadHandler languageTeamHandler; @Override - public void onMessage(Message message) { - if (message instanceof ObjectMessage) { - try { - String objectType = - nullToEmpty( - message.getStringProperty( - MessagePropertiesKey.objectType.name())); - - JmsMessagePayloadHandler jmsMessagePayloadHandler = - getHandlers().get(objectType); - if (jmsMessagePayloadHandler != null) { - log.debug("found handler for message object type [{}]", - objectType); - jmsMessagePayloadHandler.handle(((ObjectMessage) message) - .getObject()); - } else { - log.warn("can not find handler for message:{}", message); - } - - } catch (JMSException e) { - log.warn("error handling jms message: {}", message); - Throwables.propagate(e); - } catch (Throwable e) { - log.warn("error handling jms message: {}", message, e); - } - } - } - - public Map getHandlers() { + protected Map getHandlers() { if (handlers.isEmpty()) { - synchronized (this) { - if (handlers.isEmpty()) { - handlers = - ImmutableMap - . builder() - .put(LanguageTeamPermissionChangedEvent.class - .getCanonicalName(), - languageTeamHandler) - .build(); - } - } - log.info("email queue payload handlers: {}", handlers); + addHandler(LanguageTeamPermissionChangedEvent.class + .getCanonicalName(), languageTeamHandler); } return handlers; } - - public static interface JmsMessagePayloadHandler { - void handle(Serializable data); - } } diff --git a/zanata-war/src/main/java/org/zanata/notification/JmsResourcesProducer.java b/zanata-war/src/main/java/org/zanata/notification/JmsResourcesProducer.java index 5b5798b4b0..7a64b37be0 100644 --- a/zanata-war/src/main/java/org/zanata/notification/JmsResourcesProducer.java +++ b/zanata-war/src/main/java/org/zanata/notification/JmsResourcesProducer.java @@ -66,6 +66,9 @@ public class JmsResourcesProducer { @Resource(lookup = "jms/queue/MailsQueue") private Queue mailQueue; + @Resource(lookup = "jms/queue/WebhookQueue") + private Queue webhookQueue; + @Produces @RequestScoped @InVMJMS public QueueConnection createJMSConnection() throws JMSException { QueueConnection queueConnection = @@ -103,7 +106,15 @@ public QueueSender createEmailQueueSender(@InVMJMS return session.createSender(mailQueue); } - public void closeQueueSender(@Disposes @EmailQueueSender QueueSender queueSender) { + @Produces + @WebhookQueueSender + public QueueSender createWebhookQueueSender(@InVMJMS + QueueSession session) throws JMSException { + return session.createSender(webhookQueue); + } + + public void closeEmailQueueSender( + @Disposes @EmailQueueSender QueueSender queueSender) { try { log.debug("________ closing email queue sender"); queueSender.close(); @@ -112,5 +123,15 @@ public void closeQueueSender(@Disposes @EmailQueueSender QueueSender queueSender } } + public void closeWebhookQueueSender( + @Disposes @WebhookQueueSender QueueSender queueSender) { + try { + log.debug("________ closing webhook queue sender"); + queueSender.close(); + } catch (JMSException e) { + throw Throwables.propagate(e); + } + } + } diff --git a/zanata-war/src/main/java/org/zanata/notification/LanguageTeamPermissionChangeJmsMessagePayloadHandler.java b/zanata-war/src/main/java/org/zanata/notification/LanguageTeamPermissionChangeJmsPayloadHandler.java similarity index 95% rename from zanata-war/src/main/java/org/zanata/notification/LanguageTeamPermissionChangeJmsMessagePayloadHandler.java rename to zanata-war/src/main/java/org/zanata/notification/LanguageTeamPermissionChangeJmsPayloadHandler.java index 126d5217c6..894124d13e 100644 --- a/zanata-war/src/main/java/org/zanata/notification/LanguageTeamPermissionChangeJmsMessagePayloadHandler.java +++ b/zanata-war/src/main/java/org/zanata/notification/LanguageTeamPermissionChangeJmsPayloadHandler.java @@ -26,7 +26,7 @@ import javax.inject.Inject; import javax.inject.Named; -import org.zanata.ApplicationConfiguration; + import org.zanata.email.Addresses; import org.zanata.email.EmailBuilder; import org.zanata.email.LanguageTeamPermissionChangeEmailStrategy; @@ -56,8 +56,8 @@ @Slf4j @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PROTECTED) -public class LanguageTeamPermissionChangeJmsMessagePayloadHandler implements - EmailQueueMessageReceiver.JmsMessagePayloadHandler { +public class LanguageTeamPermissionChangeJmsPayloadHandler implements + QueueMessageReceiver.JmsPayloadHandler { @Inject private EmailBuilder emailBuilder; diff --git a/zanata-war/src/main/java/org/zanata/notification/NotificationManager.java b/zanata-war/src/main/java/org/zanata/notification/NotificationManager.java index 28c1d9865e..69152be919 100644 --- a/zanata-war/src/main/java/org/zanata/notification/NotificationManager.java +++ b/zanata-war/src/main/java/org/zanata/notification/NotificationManager.java @@ -32,6 +32,9 @@ import org.zanata.events.LanguageTeamPermissionChangedEvent; import com.google.common.base.Throwables; +import org.zanata.events.WebhookJmsEvent; + +import java.io.Serializable; /** * Centralized place to handle all events that needs to send out notifications. @@ -46,13 +49,25 @@ public class NotificationManager { public void onLanguageTeamPermissionChanged( final @Observes LanguageTeamPermissionChangedEvent event, final @InVMJMS QueueSession queueSession, - final @EmailQueueSender QueueSender mailQueueSender) { + final @EmailQueueSender QueueSender queueSender) { + queueEvent(event, queueSession, queueSender); + } + + public void onWebhookJmsFire( + final @Observes WebhookJmsEvent event, + final @InVMJMS QueueSession queueSession, + final @WebhookQueueSender QueueSender queueSender) { + queueEvent(event, queueSession, queueSender); + } + + private void queueEvent(Serializable event, QueueSession queueSession, + QueueSender queueSender) { try { ObjectMessage message = - queueSession.createObjectMessage(event); + queueSession.createObjectMessage(event); message.setObjectProperty(MessagePropertiesKey.objectType.name(), - event.getClass().getCanonicalName()); - mailQueueSender.send(message); + event.getClass().getCanonicalName()); + queueSender.send(message); } catch (JMSException e) { throw Throwables.propagate(e); } diff --git a/zanata-war/src/main/java/org/zanata/notification/QueueMessageReceiver.java b/zanata-war/src/main/java/org/zanata/notification/QueueMessageReceiver.java new file mode 100644 index 0000000000..cda411f9d4 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/notification/QueueMessageReceiver.java @@ -0,0 +1,87 @@ +/* + * Copyright 2016, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ + +package org.zanata.notification; + +import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.MessageListener; +import javax.jms.ObjectMessage; +import java.io.Serializable; +import java.util.Collections; +import java.util.Map; + +import static com.google.common.base.Strings.nullToEmpty; + +/** + * @author Alex Engaeng@redhat.com + */ +@Slf4j +public abstract class QueueMessageReceiver implements MessageListener { + protected static Map handlers = Collections + .emptyMap(); + + public static interface JmsPayloadHandler { + void handle(Serializable data); + } + + protected abstract Map getHandlers(); + + protected void addHandler(String name, JmsPayloadHandler handler) { + synchronized (this) { + handlers = + ImmutableMap.builder() + .put(name, handler) + .build(); + } + log.info("added handlers: {}", handlers); + } + + @Override + public void onMessage(Message message) { + if (message instanceof ObjectMessage) { + try { + String objectType = + nullToEmpty( + message.getStringProperty( + NotificationManager.MessagePropertiesKey.objectType.name())); + + JmsPayloadHandler handler = getHandlers().get(objectType); + if (handler != null) { + log.debug("found handler for message object type [{}]", + objectType); + handler.handle(((ObjectMessage) message).getObject()); + } else { + log.warn("can not find handler for message:{}", message); + } + } catch (JMSException e) { + log.warn("error handling jms message: {}", message); + Throwables.propagate(e); + } catch (Throwable e) { + log.warn("error handling jms message: {}", message, e); + } + } + } +} diff --git a/zanata-war/src/main/java/org/zanata/notification/WebhookJmsPayloadHandler.java b/zanata-war/src/main/java/org/zanata/notification/WebhookJmsPayloadHandler.java new file mode 100644 index 0000000000..e9e273e153 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/notification/WebhookJmsPayloadHandler.java @@ -0,0 +1,64 @@ +/* + * Copyright 2016, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ + +package org.zanata.notification; + +import com.google.common.base.Optional; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.zanata.events.WebhookJmsEvent; +import org.zanata.service.impl.WebHooksPublisher; + +import javax.inject.Named; +import java.io.Serializable; + +/** + * Handles all webhook event (WebhookJmsEvent) to fire out. + * + * @see WebhookJmsEvent + * @see WebhookQueueMessageReceiver + * + * @author Alex Engaeng@redhat.com + */ +@Named("webhookJmsPayloadHandler") +@javax.enterprise.context.Dependent +@Slf4j +@NoArgsConstructor +public class WebhookJmsPayloadHandler implements + QueueMessageReceiver.JmsPayloadHandler { + + @Override + public void handle(Serializable data) { + if (!(data instanceof WebhookJmsEvent)) { + log.error("can not handle data other than type {}", + WebhookJmsEvent.class); + return; + } + + WebhookJmsEvent jmsEvent = WebhookJmsEvent.class.cast(data); + log.debug("webhook jmsEvent:{}", jmsEvent); + + WebHooksPublisher.publish(jmsEvent.getUrl(), jmsEvent.getEvent(), + Optional.fromNullable(jmsEvent.getSecret())); + } +} diff --git a/zanata-war/src/main/java/org/zanata/notification/WebhookQueueMessageReceiver.java b/zanata-war/src/main/java/org/zanata/notification/WebhookQueueMessageReceiver.java new file mode 100644 index 0000000000..9d4e810d39 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/notification/WebhookQueueMessageReceiver.java @@ -0,0 +1,64 @@ +/* + * Copyright 2016, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ +package org.zanata.notification; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.zanata.events.WebhookEventType; +import org.zanata.events.WebhookJmsEvent; + +import javax.ejb.ActivationConfigProperty; +import javax.ejb.MessageDriven; +import javax.inject.Inject; +import java.util.Map; + +/** + * @author Alex Engaeng@redhat.com + */ +@MessageDriven(activationConfig = { + @ActivationConfigProperty( + propertyName = "destinationType", + propertyValue = "javax.jms.Queue" + ), + @ActivationConfigProperty( + propertyName = "destination", + propertyValue = "jms/queue/WebhookQueue" + ) +}) +@Slf4j +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public class WebhookQueueMessageReceiver extends QueueMessageReceiver { + + @Inject + private WebhookJmsPayloadHandler webhookJmsPayloadHandler; + + @Override + protected Map getHandlers() { + if (handlers.isEmpty()) { + addHandler(WebhookJmsEvent.class.getCanonicalName(), + webhookJmsPayloadHandler); + } + return handlers; + } +} diff --git a/zanata-war/src/main/java/org/zanata/notification/WebhookQueueSender.java b/zanata-war/src/main/java/org/zanata/notification/WebhookQueueSender.java new file mode 100644 index 0000000000..0da9d35e23 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/notification/WebhookQueueSender.java @@ -0,0 +1,33 @@ +/* + * Copyright 2016, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ +package org.zanata.notification; + +import javax.inject.Qualifier; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD}) +public @interface WebhookQueueSender { +} diff --git a/zanata-war/src/main/java/org/zanata/service/impl/DocumentServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/DocumentServiceImpl.java index a55fd409c0..d25772e21d 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/DocumentServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/DocumentServiceImpl.java @@ -24,7 +24,6 @@ import java.util.Set; import java.util.concurrent.Future; -import com.google.common.base.Optional; import com.google.common.collect.Lists; import javax.enterprise.context.RequestScoped; @@ -42,6 +41,7 @@ import org.zanata.events.DocumentMilestoneEvent; import org.zanata.events.DocumentStatisticUpdatedEvent; import org.zanata.events.DocumentUploadedEvent; +import org.zanata.events.WebhookJmsEvent; import org.zanata.i18n.Messages; import org.zanata.lock.Lock; import org.zanata.model.HAccount; @@ -123,6 +123,9 @@ public class DocumentServiceImpl implements DocumentService { @Inject private Event documentUploadedEvent; + @Inject + private Event webhookJmsEventEvent; + @Override @Transactional public HDocument saveDocument(String projectSlug, String iterationSlug, @@ -287,8 +290,9 @@ private void processWebHookDocumentMilestoneEvent( public void publishDocumentMilestoneEvent(WebHook webHook, DocumentMilestoneEvent milestoneEvent) { - WebHooksPublisher.publish(webHook.getUrl(), milestoneEvent, - Optional.fromNullable(webHook.getSecret())); + webhookJmsEventEvent.fire( + new WebhookJmsEvent(milestoneEvent, webHook.getUrl(), + webHook.getSecret())); log.info("firing webhook: {}:{}:{}:{}", webHook.getUrl(), milestoneEvent.getProject(), milestoneEvent.getVersion(), milestoneEvent.getDocId()); diff --git a/zanata-war/src/main/webapp-jboss/WEB-INF/jboss-web.xml b/zanata-war/src/main/webapp-jboss/WEB-INF/jboss-web.xml index 790a99bbf6..cd869c695f 100644 --- a/zanata-war/src/main/webapp-jboss/WEB-INF/jboss-web.xml +++ b/zanata-war/src/main/webapp-jboss/WEB-INF/jboss-web.xml @@ -31,6 +31,11 @@ in case changes are required for production deployment (eg cfengine). java:/jms/queue/MailsQueue + + queue/WebhookQueue + java:/jms/queue/WebhookQueue + + zanata org.zanata.security.negotiation.CustomNegotiationAuthenticator diff --git a/zanata-war/src/test/java/org/zanata/notification/EmailQueueMessageReceiverTest.java b/zanata-war/src/test/java/org/zanata/notification/EmailQueueMessageReceiverTest.java index f1bc46ab77..00964aa075 100644 --- a/zanata-war/src/test/java/org/zanata/notification/EmailQueueMessageReceiverTest.java +++ b/zanata-war/src/test/java/org/zanata/notification/EmailQueueMessageReceiverTest.java @@ -10,7 +10,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.zanata.events.LanguageTeamPermissionChangedEvent; @@ -21,7 +20,7 @@ public class EmailQueueMessageReceiverTest { private EmailQueueMessageReceiver receiver; @Mock - private LanguageTeamPermissionChangeJmsMessagePayloadHandler languageTeamHandler; + private LanguageTeamPermissionChangeJmsPayloadHandler languageTeamHandler; @Before public void setUp() throws Exception { diff --git a/zanata-war/src/test/java/org/zanata/notification/LanguageTeamPermissionChangeJmsMessagePayloadHandlerTest.java b/zanata-war/src/test/java/org/zanata/notification/LanguageTeamPermissionChangeJmsPayloadHandlerTest.java similarity index 91% rename from zanata-war/src/test/java/org/zanata/notification/LanguageTeamPermissionChangeJmsMessagePayloadHandlerTest.java rename to zanata-war/src/test/java/org/zanata/notification/LanguageTeamPermissionChangeJmsPayloadHandlerTest.java index d42e6e870d..854762c011 100644 --- a/zanata-war/src/test/java/org/zanata/notification/LanguageTeamPermissionChangeJmsMessagePayloadHandlerTest.java +++ b/zanata-war/src/test/java/org/zanata/notification/LanguageTeamPermissionChangeJmsPayloadHandlerTest.java @@ -15,15 +15,14 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.zanata.ApplicationConfiguration; import org.zanata.common.LocaleId; import org.zanata.email.EmailBuilder; import org.zanata.email.LanguageTeamPermissionChangeEmailStrategy; import org.zanata.events.LanguageTeamPermissionChangedEvent; import org.zanata.i18n.Messages; -public class LanguageTeamPermissionChangeJmsMessagePayloadHandlerTest { - private LanguageTeamPermissionChangeJmsMessagePayloadHandler handler; +public class LanguageTeamPermissionChangeJmsPayloadHandlerTest { + private LanguageTeamPermissionChangeJmsPayloadHandler handler; @Mock private EmailBuilder emailBuilder; @@ -34,7 +33,7 @@ public class LanguageTeamPermissionChangeJmsMessagePayloadHandlerTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); handler = - new LanguageTeamPermissionChangeJmsMessagePayloadHandler( + new LanguageTeamPermissionChangeJmsPayloadHandler( emailBuilder, new Messages(Locale.ENGLISH), "http://localhost"); } diff --git a/zanata-war/src/test/resources/arquillian/standalone-arquillian-wildfly.xml b/zanata-war/src/test/resources/arquillian/standalone-arquillian-wildfly.xml index 9f87e70a57..c654107e79 100644 --- a/zanata-war/src/test/resources/arquillian/standalone-arquillian-wildfly.xml +++ b/zanata-war/src/test/resources/arquillian/standalone-arquillian-wildfly.xml @@ -388,6 +388,7 @@ + diff --git a/zanata-war/src/test/resources/arquillian/standalone-arquillian.xml b/zanata-war/src/test/resources/arquillian/standalone-arquillian.xml index c1168664f9..35b2d2bf4e 100644 --- a/zanata-war/src/test/resources/arquillian/standalone-arquillian.xml +++ b/zanata-war/src/test/resources/arquillian/standalone-arquillian.xml @@ -356,6 +356,10 @@ true + + + true + true