This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/master by this push:
     new 9a7620f  ARTEMIS-2770 Update diverts using the management API
     new 0c3ced6  This closes #3148
9a7620f is described below

commit 9a7620fd71d9d2372605f638bf235ce3562484a4
Author: brusdev <[email protected]>
AuthorDate: Fri May 22 18:46:54 2020 +0200

    ARTEMIS-2770 Update diverts using the management API
---
 .../core/ActiveMQDivertDoesNotExistException.java  |  27 +++---
 .../artemis/api/core/ActiveMQExceptionType.java    |   6 ++
 .../apache/activemq/artemis/logs/AuditLogger.java  |   8 ++
 .../api/core/management/ActiveMQServerControl.java |  11 +++
 .../management/impl/ActiveMQServerControlImpl.java |  33 +++++++
 .../core/management/impl/DivertControlImpl.java    |  26 ++---
 .../core/postoffice/impl/DivertBinding.java        |   8 +-
 .../artemis/core/server/ActiveMQMessageBundle.java |   4 +
 .../artemis/core/server/ActiveMQServer.java        |   4 +-
 .../activemq/artemis/core/server/Divert.java       |  12 +++
 .../core/server/impl/ActiveMQServerImpl.java       |  52 ++++++++--
 .../artemis/core/server/impl/DivertImpl.java       |  47 +++++++--
 .../core/server/impl/ServiceRegistryImpl.java      |   3 +-
 .../core/server/management/ManagementService.java  |   3 +-
 .../management/impl/ManagementServiceImpl.java     |   9 +-
 .../server/transformer/RegisteredTransformer.java  |  51 ++++++++++
 .../server/group/impl/ClusteredResetMockTest.java  |   3 +-
 .../management/ActiveMQServerControlTest.java      | 105 +++++++++++++++++++++
 .../ActiveMQServerControlUsingCoreTest.java        |  10 ++
 19 files changed, 366 insertions(+), 56 deletions(-)

diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQDivertDoesNotExistException.java
similarity index 63%
copy from 
artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
copy to 
artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQDivertDoesNotExistException.java
index f51f4b0..7c4b961 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQDivertDoesNotExistException.java
@@ -14,23 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.core.server;
+package org.apache.activemq.artemis.api.core;
 
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.server.transformer.Transformer;
-
-public interface Divert extends Bindable {
-
-   Filter getFilter();
-
-   boolean isExclusive();
-
-   SimpleString getUniqueName();
-
-   SimpleString getRoutingName();
+/**
+ * An operation failed because an address exists on the server.
+ */
+public final class ActiveMQDivertDoesNotExistException extends 
ActiveMQException {
 
-   Transformer getTransformer();
+   public ActiveMQDivertDoesNotExistException() {
+      super(ActiveMQExceptionType.DIVERT_DOES_NOT_EXIST);
+   }
 
-   SimpleString getForwardAddress();
+   public ActiveMQDivertDoesNotExistException(String msg) {
+      super(ActiveMQExceptionType.DIVERT_DOES_NOT_EXIST, msg);
+   }
 }
diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
index 0314901..8bb51c3 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
@@ -261,6 +261,12 @@ public enum ActiveMQExceptionType {
       public ActiveMQException createException(String msg) {
          return new ActiveMQReplicationTimeooutException(msg);
       }
+   },
+   DIVERT_DOES_NOT_EXIST(221) {
+      @Override
+      public ActiveMQException createException(String msg) {
+         return new ActiveMQDivertDoesNotExistException(msg);
+      }
    };
    private static final Map<Integer, ActiveMQExceptionType> TYPE_MAP;
 
diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index 94d2a5d..2e97449 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2662,4 +2662,12 @@ public interface AuditLogger extends BasicLogger {
    @LogMessage(level = Logger.Level.INFO)
    @Message(id = 601726, value = "User {0} failed to browse messages from 
queue {1}", format = Message.Format.MESSAGE_FORMAT)
    void browseMessagesFailure(String user, String queueName);
+
+   static void updateDivert(Object source, Object... args) {
+      LOGGER.updateDivert(getCaller(), source, arrayToString(args));
+   }
+
+   @LogMessage(level = Logger.Level.INFO)
+   @Message(id = 601727, value = "User {0} is updating a divert on target 
resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
+   void updateDivert(String user, Object source, Object... args);
 }
diff --git 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
index f01050a..b4e6c3a 100644
--- 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
+++ 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
@@ -1573,6 +1573,17 @@ public interface ActiveMQServerControl {
                      @Parameter(name = "transformerPropertiesAsJSON", desc = 
"Configuration properties of the divert's transformer in JSON form") String 
transformerPropertiesAsJSON,
                      @Parameter(name = "routingType", desc = "How should the 
routing-type on the diverted messages be set?") String routingType) throws 
Exception;
 
+   /**
+    * update a divert
+    */
+   @Operation(desc = "Update a divert", impact = MBeanOperationInfo.ACTION)
+   void updateDivert(@Parameter(name = "name", desc = "Name of the queue") 
String name,
+                     @Parameter(name = "forwardingAddress", desc = "Address to 
divert to") String forwardingAddress,
+                     @Parameter(name = "filterString", desc = "Filter of the 
divert") String filterString,
+                     @Parameter(name = "transformerClassName", desc = "Class 
name of the divert's transformer") String transformerClassName,
+                     @Parameter(name = "transformerProperties", desc = 
"Configuration properties of the divert's transformer") Map<String, String> 
transformerProperties,
+                     @Parameter(name = "routingType", desc = "How should the 
routing-type on the diverted messages be set?") String routingType) throws 
Exception;
+
    @Operation(desc = "Destroy a Divert", impact = MBeanOperationInfo.ACTION)
    void destroyDivert(@Parameter(name = "name", desc = "Name of the divert") 
String name) throws Exception;
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index deb5fe2..d72611c 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -97,6 +97,7 @@ import 
org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.ConnectorServiceFactory;
 import org.apache.activemq.artemis.core.server.Consumer;
 import 
org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType;
+import org.apache.activemq.artemis.core.server.Divert;
 import org.apache.activemq.artemis.core.server.JournalType;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.server.ServerConsumer;
@@ -3416,6 +3417,38 @@ public class ActiveMQServerControlImpl extends 
AbstractControl implements Active
    }
 
    @Override
+   public void updateDivert(final String name,
+                            final String forwardingAddress,
+                            final String filterString,
+                            final String transformerClassName,
+                            final Map<String, String> transformerProperties,
+                            final String routingType) throws Exception {
+      if (AuditLogger.isEnabled()) {
+         AuditLogger.updateDivert(this.server, name, forwardingAddress, 
filterString,
+                                  transformerClassName, transformerProperties, 
routingType);
+      }
+      checkStarted();
+
+      clearIO();
+
+      try {
+         TransformerConfiguration transformerConfiguration = 
transformerClassName == null ? null :
+            new 
TransformerConfiguration(transformerClassName).setProperties(transformerProperties);
+
+         DivertConfiguration config = new 
DivertConfiguration().setName(name).setForwardingAddress(forwardingAddress).
+            
setFilterString(filterString).setTransformerConfiguration(transformerConfiguration).
+            
setRoutingType(ComponentConfigurationRoutingType.valueOf(routingType));
+
+         final Divert divert = server.updateDivert(config);
+         if (divert == null) {
+            throw 
ActiveMQMessageBundle.BUNDLE.divertDoesNotExist(config.getName());
+         }
+      } finally {
+         blockOnIO();
+      }
+   }
+
+   @Override
    public void destroyDivert(final String name) throws Exception {
       if (AuditLogger.isEnabled()) {
          AuditLogger.destroyDivert(this.server, name);
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
index 6252439..5ede913 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
@@ -19,14 +19,17 @@ package org.apache.activemq.artemis.core.management.impl;
 import javax.management.MBeanAttributeInfo;
 import javax.management.MBeanOperationInfo;
 
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.activemq.artemis.api.core.JsonUtil;
 import org.apache.activemq.artemis.api.core.management.DivertControl;
 import org.apache.activemq.artemis.api.core.management.ResourceNames;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
+import org.apache.activemq.artemis.core.filter.Filter;
 import org.apache.activemq.artemis.core.persistence.StorageManager;
 import org.apache.activemq.artemis.core.server.Divert;
+import 
org.apache.activemq.artemis.core.server.transformer.RegisteredTransformer;
+import org.apache.activemq.artemis.core.server.transformer.Transformer;
 import org.apache.activemq.artemis.logs.AuditLogger;
 
 public class DivertControlImpl extends AbstractControl implements 
DivertControl {
@@ -37,8 +40,6 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
 
    private final Divert divert;
 
-   private final DivertConfiguration configuration;
-
    private final String internalNamingPrefix;
 
    // Static --------------------------------------------------------
@@ -49,11 +50,9 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
 
    public DivertControlImpl(final Divert divert,
                             final StorageManager storageManager,
-                            final DivertConfiguration configuration,
                             final String internalNamingPrefix) throws 
Exception {
       super(DivertControl.class, storageManager);
       this.divert = divert;
-      this.configuration = configuration;
       this.internalNamingPrefix = internalNamingPrefix;
    }
 
@@ -64,7 +63,7 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
       }
       clearIO();
       try {
-         return configuration.getAddress();
+         return divert.getAddress().toString();
       } finally {
          blockOnIO();
       }
@@ -77,7 +76,8 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
       }
       clearIO();
       try {
-         return configuration.getFilterString();
+         Filter filter = divert.getFilter();
+         return filter != null ? filter.getFilterString().toString() : null;
       } finally {
          blockOnIO();
       }
@@ -90,7 +90,7 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
       }
       clearIO();
       try {
-         return configuration.getForwardingAddress();
+         return divert.getForwardAddress().toString();
       } finally {
          blockOnIO();
       }
@@ -116,7 +116,9 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
       }
       clearIO();
       try {
-         return configuration.getTransformerConfiguration() == null ? null : 
configuration.getTransformerConfiguration().getClassName();
+         Transformer transformer = divert.getTransformer();
+         return transformer != null ? (transformer instanceof 
RegisteredTransformer ?
+            ((RegisteredTransformer)transformer).getTransformer() : 
transformer).getClass().getName() : null;
       } finally {
          blockOnIO();
       }
@@ -137,7 +139,9 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
       }
       clearIO();
       try {
-         return configuration.getTransformerConfiguration() == null ? null : 
configuration.getTransformerConfiguration().getProperties();
+         Transformer transformer = divert.getTransformer();
+         return transformer != null && transformer instanceof 
RegisteredTransformer ?
+            ((RegisteredTransformer)transformer).getProperties() : 
Collections.emptyMap();
       } finally {
          blockOnIO();
       }
@@ -150,7 +154,7 @@ public class DivertControlImpl extends AbstractControl 
implements DivertControl
       }
       clearIO();
       try {
-         return configuration.getRoutingType().toString();
+         return divert.getRoutingType().toString();
       } finally {
          blockOnIO();
       }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
index 8f4ab48..f12d8af 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
@@ -31,8 +31,6 @@ public class DivertBinding implements Binding {
 
    private final Divert divert;
 
-   private final Filter filter;
-
    private final SimpleString uniqueName;
 
    private final SimpleString routingName;
@@ -48,8 +46,6 @@ public class DivertBinding implements Binding {
 
       this.divert = divert;
 
-      filter = divert.getFilter();
-
       uniqueName = divert.getUniqueName();
 
       routingName = divert.getRoutingName();
@@ -64,7 +60,7 @@ public class DivertBinding implements Binding {
 
    @Override
    public Filter getFilter() {
-      return filter;
+      return divert.getFilter();
    }
 
    @Override
@@ -129,7 +125,7 @@ public class DivertBinding implements Binding {
          ", divert=" +
          divert +
          ", filter=" +
-         filter +
+         divert.getFilter() +
          ", uniqueName=" +
          uniqueName +
          ", routingName=" +
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
index 53bf020..d96eb98 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
@@ -26,6 +26,7 @@ import 
org.apache.activemq.artemis.api.core.ActiveMQClusterSecurityException;
 import 
org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException;
 import org.apache.activemq.artemis.api.core.ActiveMQDeleteAddressException;
 import org.apache.activemq.artemis.api.core.ActiveMQDisconnectedException;
+import 
org.apache.activemq.artemis.api.core.ActiveMQDivertDoesNotExistException;
 import org.apache.activemq.artemis.api.core.ActiveMQDuplicateMetaDataException;
 import org.apache.activemq.artemis.api.core.ActiveMQException;
 import org.apache.activemq.artemis.api.core.ActiveMQIOErrorException;
@@ -488,4 +489,7 @@ public interface ActiveMQMessageBundle {
 
    @Message(id = 229230, value = "Failed to bind acceptor {0} to {1}", format 
= Message.Format.MESSAGE_FORMAT)
    IllegalStateException failedToBind(String acceptor, String hostPort, @Cause 
Exception e);
+
+   @Message(id = 229231, value = "Divert Does Not Exist: {0}", format = 
Message.Format.MESSAGE_FORMAT)
+   ActiveMQDivertDoesNotExistException divertDoesNotExist(String divert);
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
index 52d9a62..5934bc5 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
@@ -664,7 +664,9 @@ public interface ActiveMQServer extends ServiceComponent {
 
    FederationManager getFederationManager();
 
-   void deployDivert(DivertConfiguration config) throws Exception;
+   Divert deployDivert(DivertConfiguration config) throws Exception;
+
+   Divert updateDivert(DivertConfiguration config) throws Exception;
 
    void destroyDivert(SimpleString name) throws Exception;
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
index f51f4b0..99767bf 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
@@ -22,6 +22,8 @@ import 
org.apache.activemq.artemis.core.server.transformer.Transformer;
 
 public interface Divert extends Bindable {
 
+   SimpleString getAddress();
+
    Filter getFilter();
 
    boolean isExclusive();
@@ -33,4 +35,14 @@ public interface Divert extends Bindable {
    Transformer getTransformer();
 
    SimpleString getForwardAddress();
+
+   ComponentConfigurationRoutingType getRoutingType();
+
+   void setFilter(Filter filter);
+
+   void setTransformer(Transformer transformer);
+
+   void setForwardAddress(SimpleString forwardAddress);
+
+   void setRoutingType(ComponentConfigurationRoutingType routingType);
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 1f3413b..bf6c48e 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -2544,7 +2544,7 @@ public class ActiveMQServerImpl implements ActiveMQServer 
{
 
 
    @Override
-   public void deployDivert(DivertConfiguration config) throws Exception {
+   public Divert deployDivert(DivertConfiguration config) throws Exception {
       if (config.getName() == null) {
          throw ActiveMQMessageBundle.BUNDLE.divertWithNoName();
       }
@@ -2552,13 +2552,13 @@ public class ActiveMQServerImpl implements 
ActiveMQServer {
       if (config.getAddress() == null) {
          ActiveMQServerLogger.LOGGER.divertWithNoAddress();
 
-         return;
+         return null;
       }
 
       if (config.getForwardingAddress() == null) {
          ActiveMQServerLogger.LOGGER.divertWithNoForwardingAddress();
 
-         return;
+         return null;
       }
 
       SimpleString sName = new SimpleString(config.getName());
@@ -2566,7 +2566,7 @@ public class ActiveMQServerImpl implements ActiveMQServer 
{
       if (postOffice.getBinding(sName) != null) {
          ActiveMQServerLogger.LOGGER.divertBindingAlreadyExists(sName);
 
-         return;
+         return null;
       }
 
       SimpleString sAddress = new SimpleString(config.getAddress());
@@ -2575,13 +2575,53 @@ public class ActiveMQServerImpl implements 
ActiveMQServer {
 
       Filter filter = FilterImpl.createFilter(config.getFilterString());
 
-      Divert divert = new DivertImpl(new 
SimpleString(config.getForwardingAddress()), sName, new 
SimpleString(config.getRoutingName()), config.isExclusive(), filter, 
transformer, postOffice, storageManager, config.getRoutingType());
+      Divert divert = new DivertImpl(sName, sAddress, new 
SimpleString(config.getForwardingAddress()),
+                                     new 
SimpleString(config.getRoutingName()), config.isExclusive(),
+                                     filter, transformer, postOffice, 
storageManager, config.getRoutingType());
 
       Binding binding = new DivertBinding(storageManager.generateID(), 
sAddress, divert);
 
       postOffice.addBinding(binding);
 
-      managementService.registerDivert(divert, config);
+      managementService.registerDivert(divert);
+
+      return divert;
+   }
+
+   @Override
+   public Divert updateDivert(DivertConfiguration config) throws Exception {
+      final DivertBinding divertBinding = (DivertBinding) 
postOffice.getBinding(SimpleString.toSimpleString(config.getName()));
+      if (divertBinding == null) {
+         return null;
+      }
+
+      final Divert divert = divertBinding.getDivert();
+
+      Filter filter = FilterImpl.createFilter(config.getFilterString());
+      if (filter != null && !filter.equals(divert.getFilter())) {
+         divert.setFilter(filter);
+      }
+
+      if (config.getTransformerConfiguration() != null) {
+         
getServiceRegistry().removeDivertTransformer(divert.getUniqueName().toString());
+         Transformer transformer = getServiceRegistry().getDivertTransformer(
+            config.getName(), config.getTransformerConfiguration());
+         divert.setTransformer(transformer);
+      }
+
+      if (config.getForwardingAddress() != null) {
+         SimpleString forwardAddress = 
SimpleString.toSimpleString(config.getForwardingAddress());
+
+         if (!forwardAddress.equals(config)) {
+            divert.setForwardAddress(forwardAddress);
+         }
+      }
+
+      if (config.getRoutingType() != null && divert.getRoutingType() != 
config.getRoutingType()) {
+         divert.setRoutingType(config.getRoutingType());
+      }
+
+      return divert;
    }
 
    @Override
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
index 1bf6123..6831f17 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
@@ -37,7 +37,9 @@ public class DivertImpl implements Divert {
 
    private final PostOffice postOffice;
 
-   private final SimpleString forwardAddress;
+   private final SimpleString address;
+
+   private volatile SimpleString forwardAddress;
 
    private final SimpleString uniqueName;
 
@@ -45,16 +47,17 @@ public class DivertImpl implements Divert {
 
    private final boolean exclusive;
 
-   private final Filter filter;
+   private volatile Filter filter;
 
-   private final Transformer transformer;
+   private volatile Transformer transformer;
 
    private final StorageManager storageManager;
 
-   private final ComponentConfigurationRoutingType routingType;
+   private volatile ComponentConfigurationRoutingType routingType;
 
-   public DivertImpl(final SimpleString forwardAddress,
-                     final SimpleString uniqueName,
+   public DivertImpl(final SimpleString uniqueName,
+                     final SimpleString address,
+                     final SimpleString forwardAddress,
                      final SimpleString routingName,
                      final boolean exclusive,
                      final Filter filter,
@@ -62,6 +65,8 @@ public class DivertImpl implements Divert {
                      final PostOffice postOffice,
                      final StorageManager storageManager,
                      final ComponentConfigurationRoutingType routingType) {
+      this.address = address;
+
       this.forwardAddress = forwardAddress;
 
       this.uniqueName = uniqueName;
@@ -154,6 +159,11 @@ public class DivertImpl implements Divert {
    }
 
    @Override
+   public SimpleString getAddress() {
+      return address;
+   }
+
+   @Override
    public Filter getFilter() {
       return filter;
    }
@@ -168,6 +178,31 @@ public class DivertImpl implements Divert {
       return forwardAddress;
    }
 
+   @Override
+   public ComponentConfigurationRoutingType getRoutingType() {
+      return routingType;
+   }
+
+   @Override
+   public void setFilter(Filter filter) {
+      this.filter = filter;
+   }
+
+   @Override
+   public void setTransformer(Transformer transformer) {
+      this.transformer = transformer;
+   }
+
+   @Override
+   public void setForwardAddress(SimpleString forwardAddress) {
+      this.forwardAddress = forwardAddress;
+   }
+
+   @Override
+   public void setRoutingType(ComponentConfigurationRoutingType routingType) {
+      this.routingType = routingType;
+   }
+
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
index 601c90c..1597e08 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
@@ -34,6 +34,7 @@ import 
org.apache.activemq.artemis.core.config.TransformerConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 import org.apache.activemq.artemis.core.server.ConnectorServiceFactory;
 import org.apache.activemq.artemis.core.server.ServiceRegistry;
+import 
org.apache.activemq.artemis.core.server.transformer.RegisteredTransformer;
 import org.apache.activemq.artemis.core.server.transformer.Transformer;
 import org.apache.activemq.artemis.spi.core.remoting.AcceptorFactory;
 import org.apache.activemq.artemis.utils.ClassloadingUtil;
@@ -249,7 +250,7 @@ public class ServiceRegistryImpl implements ServiceRegistry 
{
 
       if (transformerConfiguration != null && 
transformerConfiguration.getClassName() != null) {
          try {
-            transformer = loadClass(transformerConfiguration.getClassName());
+            transformer = new 
RegisteredTransformer(loadClass(transformerConfiguration.getClassName()));
             
transformer.init(Collections.unmodifiableMap(transformerConfiguration.getProperties()));
          } catch (Exception e) {
             throw 
ActiveMQMessageBundle.BUNDLE.errorCreatingTransformerClass(e, 
transformerConfiguration.getClassName());
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
index 528920f..41eb5c8 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
@@ -30,7 +30,6 @@ import 
org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
 import org.apache.activemq.artemis.core.config.BridgeConfiguration;
 import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
 import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
 import 
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
 import org.apache.activemq.artemis.core.messagecounter.MessageCounterManager;
 import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -104,7 +103,7 @@ public interface ManagementService extends 
NotificationService, ActiveMQComponen
 
    void unregisterAcceptors();
 
-   void registerDivert(Divert divert, DivertConfiguration config) throws 
Exception;
+   void registerDivert(Divert divert) throws Exception;
 
    void unregisterDivert(SimpleString name, SimpleString address) throws 
Exception;
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index 63467e4..c6b1f67 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -57,7 +57,6 @@ import 
org.apache.activemq.artemis.api.core.management.ResourceNames;
 import org.apache.activemq.artemis.core.config.BridgeConfiguration;
 import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
 import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
 import org.apache.activemq.artemis.core.management.impl.AcceptorControlImpl;
 import 
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
 import org.apache.activemq.artemis.core.management.impl.AddressControlImpl;
@@ -289,11 +288,11 @@ public class ManagementServiceImpl implements 
ManagementService {
    }
 
    @Override
-   public synchronized void registerDivert(final Divert divert, final 
DivertConfiguration config) throws Exception {
-      ObjectName objectName = 
objectNameBuilder.getDivertObjectName(divert.getUniqueName().toString(), 
config.getAddress());
-      DivertControl divertControl = new DivertControlImpl(divert, 
storageManager, config, messagingServer.getInternalNamingPrefix());
+   public synchronized void registerDivert(final Divert divert) throws 
Exception {
+      ObjectName objectName = 
objectNameBuilder.getDivertObjectName(divert.getUniqueName().toString(), 
divert.getAddress().toString());
+      DivertControl divertControl = new DivertControlImpl(divert, 
storageManager, messagingServer.getInternalNamingPrefix());
       registerInJMX(objectName, divertControl);
-      registerInRegistry(ResourceNames.DIVERT + config.getName(), 
divertControl);
+      registerInRegistry(ResourceNames.DIVERT + divert.getUniqueName(), 
divertControl);
 
       if (logger.isDebugEnabled()) {
          logger.debug("registered divert " + objectName);
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/RegisteredTransformer.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/RegisteredTransformer.java
new file mode 100644
index 0000000..d2b7d59
--- /dev/null
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/RegisteredTransformer.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.core.server.transformer;
+
+import java.util.Map;
+
+import org.apache.activemq.artemis.api.core.Message;
+
+public class RegisteredTransformer implements Transformer {
+
+   private final Transformer transformer;
+
+   private Map<String, String> properties;
+
+   public Transformer getTransformer() {
+      return transformer;
+   }
+   public Map<String, String> getProperties() {
+      return properties;
+   }
+
+   public RegisteredTransformer(Transformer transformer) {
+      this.transformer = transformer;
+   }
+
+   @Override
+   public void init(Map<String, String> properties) {
+      this.properties = properties;
+      this.transformer.init(properties);
+   }
+
+   @Override
+   public Message transform(Message message) {
+      return transformer.transform(message);
+   }
+}
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
index 6a2dd15..d464c5e 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
@@ -33,7 +33,6 @@ import 
org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
 import org.apache.activemq.artemis.core.config.BridgeConfiguration;
 import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
 import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
 import 
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
 import org.apache.activemq.artemis.core.messagecounter.MessageCounterManager;
 import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -278,7 +277,7 @@ public class ClusteredResetMockTest extends 
ActiveMQTestBase {
       }
 
       @Override
-      public void registerDivert(Divert divert, DivertConfiguration config) 
throws Exception {
+      public void registerDivert(Divert divert) throws Exception {
 
       }
 
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
index a94f631..de33d71 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
@@ -34,6 +34,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
+import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
 import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
 import org.apache.activemq.artemis.api.core.JsonUtil;
 import org.apache.activemq.artemis.api.core.QueueConfiguration;
@@ -1321,6 +1322,110 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
    }
 
    @Test
+   public void testCreateAndUpdateDivert() throws Exception {
+      String address = RandomUtil.randomString();
+      String name = RandomUtil.randomString();
+      String routingName = RandomUtil.randomString();
+      String forwardingAddress = RandomUtil.randomString();
+      String updatedForwardingAddress = RandomUtil.randomString();
+
+      ActiveMQServerControl serverControl = createManagementControl();
+
+      checkNoResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, 
address));
+      assertEquals(0, serverControl.getDivertNames().length);
+
+      serverControl.createDivert(name.toString(), routingName, address, 
forwardingAddress, true, null, null);
+
+      checkResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, 
address));
+      DivertControl divertControl = 
ManagementControlHelper.createDivertControl(name.toString(), address, 
mbeanServer);
+      assertEquals(name.toString(), divertControl.getUniqueName());
+      assertEquals(address, divertControl.getAddress());
+      assertEquals(forwardingAddress, divertControl.getForwardingAddress());
+      assertEquals(routingName, divertControl.getRoutingName());
+      assertTrue(divertControl.isExclusive());
+      assertNull(divertControl.getFilter());
+      assertNull(divertControl.getTransformerClassName());
+      String[] divertNames = serverControl.getDivertNames();
+      assertEquals(1, divertNames.length);
+      assertEquals(name, divertNames[0]);
+
+      // check that a message sent to the address is diverted exclusively
+      ServerLocator locator = createInVMNonHALocator();
+
+      ClientSessionFactory csf = createSessionFactory(locator);
+      ClientSession session = csf.createSession();
+
+      String updatedDivertQueue = RandomUtil.randomString();
+      String divertQueue = RandomUtil.randomString();
+      String queue = RandomUtil.randomString();
+      if (legacyCreateQueue) {
+         session.createQueue(updatedForwardingAddress, RoutingType.ANYCAST, 
updatedDivertQueue);
+         session.createQueue(forwardingAddress, RoutingType.ANYCAST, 
divertQueue);
+         session.createQueue(address, RoutingType.ANYCAST, queue);
+      } else {
+         session.createQueue(new 
QueueConfiguration(updatedDivertQueue).setAddress(updatedForwardingAddress).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+         session.createQueue(new 
QueueConfiguration(divertQueue).setAddress(forwardingAddress).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+         session.createQueue(new 
QueueConfiguration(queue).setAddress(address).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+      }
+
+      ClientProducer producer = session.createProducer(address);
+      ClientMessage message = session.createMessage(false);
+      String text = RandomUtil.randomString();
+      message.putStringProperty("prop", text);
+      producer.send(message);
+
+      ClientConsumer consumer = session.createConsumer(queue);
+      ClientConsumer divertedConsumer = session.createConsumer(divertQueue);
+      ClientConsumer updatedDivertedConsumer = 
session.createConsumer(updatedDivertQueue);
+
+      session.start();
+
+      assertNull(consumer.receiveImmediate());
+      message = divertedConsumer.receive(5000);
+      assertNotNull(message);
+      assertEquals(text, message.getStringProperty("prop"));
+      assertNull(updatedDivertedConsumer.receiveImmediate());
+
+      serverControl.updateDivert(name.toString(), updatedForwardingAddress, 
null, null, null, ActiveMQDefaultConfiguration.getDefaultDivertRoutingType());
+
+      checkResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, 
address));
+      divertControl = 
ManagementControlHelper.createDivertControl(name.toString(), address, 
mbeanServer);
+      assertEquals(name.toString(), divertControl.getUniqueName());
+      assertEquals(address, divertControl.getAddress());
+      assertEquals(updatedForwardingAddress, 
divertControl.getForwardingAddress());
+      assertEquals(routingName, divertControl.getRoutingName());
+      assertTrue(divertControl.isExclusive());
+      assertNull(divertControl.getFilter());
+      assertNull(divertControl.getTransformerClassName());
+      divertNames = serverControl.getDivertNames();
+      assertEquals(1, divertNames.length);
+      assertEquals(name, divertNames[0]);
+
+      // check that a message is no longer exclusively diverted
+      message = session.createMessage(false);
+      String text2 = RandomUtil.randomString();
+      message.putStringProperty("prop", text2);
+      producer.send(message);
+
+      assertNull(consumer.receiveImmediate());
+      assertNull(divertedConsumer.receiveImmediate());
+      message = updatedDivertedConsumer.receive(5000);
+      assertNotNull(message);
+      assertEquals(text2, message.getStringProperty("prop"));
+
+      consumer.close();
+      divertedConsumer.close();
+      updatedDivertedConsumer.close();
+      session.deleteQueue(queue);
+      session.deleteQueue(divertQueue);
+      session.deleteQueue(updatedDivertQueue);
+      session.close();
+
+      locator.close();
+
+   }
+
+   @Test
    public void testCreateAndDestroyBridge() throws Exception {
       String name = RandomUtil.randomString();
       String sourceAddress = RandomUtil.randomString();
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
index 1903978..0b4c674 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
@@ -1239,6 +1239,16 @@ public class ActiveMQServerControlUsingCoreTest extends 
ActiveMQServerControlTes
          }
 
          @Override
+         public void updateDivert(String name,
+                                  String forwardingAddress,
+                                  String filterString,
+                                  String transformerClassName,
+                                  Map<String, String> transformerProperties,
+                                  String routingType) throws Exception {
+            proxy.invokeOperation("updateDivert", name, forwardingAddress, 
filterString, transformerClassName, transformerProperties, routingType);
+         }
+
+         @Override
          public void destroyDivert(String name) throws Exception {
             proxy.invokeOperation("destroyDivert", name);
          }

Reply via email to