You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2016/11/07 16:36:40 UTC

[20/50] [abbrv] activemq-artemis git commit: XML Tranform JMS Queue/Topic to new model

XML Tranform JMS Queue/Topic to new model


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/d70bf3ba
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/d70bf3ba
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/d70bf3ba

Branch: refs/heads/ARTEMIS-780
Commit: d70bf3bac49151fa3fbc5e7a0e7b33d5316af5f1
Parents: 4e378c1
Author: Martyn Taylor <mt...@redhat.com>
Authored: Tue Oct 25 14:15:34 2016 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Nov 7 11:28:07 2016 -0500

----------------------------------------------------------------------
 .../artemis/tools/migrate/config/Main.java      |  85 +++++
 .../config/XMLConfigurationMigration.java       | 330 ++++++++++++-------
 .../src/main/resources/META-INF/MANIFEST.MF     |   2 +-
 .../config/XMLConfigurationMigrationTest.java   |   9 +-
 artemis-tools/src/test/resources/broker.xml     |  13 +-
 5 files changed, 307 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d70bf3ba/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/Main.java
----------------------------------------------------------------------
diff --git a/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/Main.java b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/Main.java
new file mode 100644
index 0000000..c45d92a
--- /dev/null
+++ b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/Main.java
@@ -0,0 +1,85 @@
+/*
+ * 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
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.tools.migrate.config;
+
+import java.io.File;
+
+public class Main {
+
+   public static void main(String[] args) throws Exception {
+
+      if (args.length == 0) {
+         System.err.println("Invalid args");
+         printUsage();
+      } else {
+         File input = new File(args[0]);
+         if (input.isDirectory()) {
+            System.out.println("Scanning directory: " + input.getAbsolutePath());
+            recursiveTransform(input);
+         } else {
+            if (args.length != 2) {
+               System.err.println("Invalid args");
+               printUsage();
+            } else {
+               try {
+                  XMLConfigurationMigration migration = new XMLConfigurationMigration(input, new File(args[1]));
+               }
+               catch (Exception e) {
+                  // Unable to process file, move on.
+               }
+            }
+         }
+      }
+   }
+
+   private static void recursiveTransform(File root) throws Exception {
+      for (File file : root.listFiles()) {
+         scanAndTransform(file);
+      }
+   }
+
+   public static void scanAndTransform(File pFile) throws Exception {
+      try {
+         for (File f : pFile.listFiles()) {
+            if (f.isDirectory()) {
+               scanAndTransform(f);
+            } else {
+               try {
+                  if (f.getName().endsWith("xml")) {
+                     File file = new File(f.getAbsolutePath() + ".new");
+                     XMLConfigurationMigration migration = new XMLConfigurationMigration(f, file);
+                     if (migration.transform()) {
+                        File r = new File(f.getAbsolutePath());
+                        f.renameTo(new File(f.getAbsolutePath() + ".bk"));
+                        file.renameTo(r);
+                     }
+                  }
+               } catch (Exception e) {
+                  //Unable to process file, continue
+               }
+            }
+         }
+      } catch (NullPointerException e) {
+         System.out.println(pFile.getAbsoluteFile());
+      }
+   }
+
+   public static void printUsage() {
+      System.out.println("Please specify a directory to scan, or input and output file");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d70bf3ba/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigration.java
----------------------------------------------------------------------
diff --git a/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigration.java b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigration.java
index 90be53c..f5811a6 100644
--- a/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigration.java
+++ b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigration.java
@@ -26,9 +26,12 @@ import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 import java.io.File;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
@@ -41,83 +44,97 @@ import org.w3c.dom.NodeList;
 
 public class XMLConfigurationMigration {
 
-   private static XMLConfigurationMigration migration;
+   // Attributes
+   private static final String xPathAttrName = "@name";
+
+   // JMS XPaths
+   private static final String xPathJMS = "/configuration/jms";
+
+   private static final String xPathJMSQueues = "/configuration/jms/queue";
+
+   private static final String xPathJMSTopics = "/configuration/jms/topic";
+
+   // Core Queue XPaths
+   private static final String xPathQueues = "/configuration/core/queues";
+
+   private static final String xPathQueue = "/configuration/core/queues/queue";
+
+   private static final String xPathAddress = "address";
+
+   private static final String xPathFilter = "filter/@string";
+
+   private static final String xPathSelector = "selector/@string";
+
+   private static final String xPathDurable = "durable";
+
+   private static final String jmsQueuePrefix = "jms.queue.";
+
+   private static final String jmsTopicPrefix = "jms.topic.";
+
+   private final Map<String, Address> jmsQueueAddresses = new HashMap<>();
+
+   private final Map<String, Address> jmsTopicAddresses = new HashMap<>();
+
+   private final Map<String, Address> coreAddresses = new HashMap<>();
+
+   private final Map<String, Address> aliases = new HashMap<>();
 
    private final Document document;
 
-   public static void main(String[] args) throws Exception {
+   private final File input;
 
-      if (args.length == 0) {
-         System.err.println("Invalid args");
-         printUsage();
-      } else {
-         File input = new File(args[0]);
-         if (input.isDirectory()) {
-            System.out.println("Scanning directory: " + input.getAbsolutePath());
-            recursiveTransform(input);
-         } else {
-            if (args.length != 2) {
-               System.err.println("Invalid args");
-               printUsage();
-            } else {
-               transform(input, new File(args[1]));
-            }
-         }
-      }
-   }
+   private final File output;
 
-   private static void recursiveTransform(File root) throws Exception {
-      for (File file : root.listFiles()) {
-         scanAndTransform(file);
-      }
-   }
+   private final Node coreElement;
+
+   private final XPath xPath;
+
+   public XMLConfigurationMigration(File input, File output) throws Exception {
+
+      this.input = input;
+      this.output = output;
 
-   public static void scanAndTransform(File pFile) throws Exception {
       try {
-         for (File f : pFile.listFiles()) {
-            if (f.isDirectory()) {
-               scanAndTransform(f);
-            } else {
-               try {
-                  if (f.getName().endsWith("xml")) {
-                     File file = new File(f.getAbsolutePath() + ".new");
-                     if (transform(f, file)) {
-                        File r = new File(f.getAbsolutePath());
-
-                        f.renameTo(new File(f.getAbsolutePath() + ".bk"));
-                        file.renameTo(r);
-                     }
-                  }
-               } catch (Exception e) {
-                  //continue
-               }
-            }
+         if (!input.exists()) {
+            throw new Exception("Input file not found: " + input);
+         }
+
+         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+         factory.setIgnoringElementContentWhitespace(true);
+
+         DocumentBuilder db = factory.newDocumentBuilder();
+         this.document = db.parse(this.input);
+
+         xPath = XPathFactory.newInstance().newXPath();
+         coreElement = (Node) xPath.evaluate("/configuration/core", document, XPathConstants.NODE);
+
+         if (coreElement == null) {
+            throw new Exception("Not a artemis config");
          }
-      } catch (NullPointerException e) {
-         System.out.println(pFile.getAbsoluteFile());
+      }
+      catch (Exception e) {
+         throw new Exception(e);
       }
    }
 
-   public static void printUsage() {
-      System.out.println("Please specify a directory to scan, or input and output file");
-   }
+   public boolean transform() throws Exception {
+      try {
 
-   public static boolean transform(File input, File output) throws Exception {
+         boolean queuesChanged = convertQueuesToAddresses();
+         boolean jmsChanged = convertJMSToAddresses();
 
-      migration = new XMLConfigurationMigration(input);
-      try {
-         if (!input.exists()) {
-            System.err.println("Input file not found: " + input);
-         }
+         writeAddressesToDocument();
+         document.normalize();
 
-         if (migration.convertQueuesToAddresses()) {
+         if (queuesChanged || jmsChanged) {
             Properties properties = new Properties();
             properties.put(OutputKeys.INDENT, "yes");
             properties.put("{http://xml.apache.org/xslt}indent-amount", "3");
             properties.put(OutputKeys.ENCODING, "UTF-8");
-            migration.write(output, properties);
+            write(output, properties);
             return true;
          }
+
       } catch (Exception e) {
          System.err.println("Error tranforming document");
          e.printStackTrace();
@@ -125,97 +142,147 @@ public class XMLConfigurationMigration {
       return false;
    }
 
-   public XMLConfigurationMigration(File input) throws Exception {
-      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-      factory.setIgnoringElementContentWhitespace(true);
+   public boolean convertQueuesToAddresses() throws Exception {
 
-      DocumentBuilder db = factory.newDocumentBuilder();
-      this.document = db.parse(input);
-   }
+      Node coreQueuesElement = getNode(xPathQueues);
+      if (coreQueuesElement == null) {
+         return false;
+      }
 
-   public boolean convertQueuesToAddresses() throws Exception {
+      NodeList coreQueueElements = getNodeList(xPathQueue);
+      for (int i = 0; i < coreQueueElements.getLength(); i++) {
+         Node queueNode = coreQueueElements.item(i);
+
+         Queue queue = new Queue();
+         queue.setName(getString(queueNode, xPathAttrName));
+         queue.setDurable(getString(queueNode, xPathDurable));
+         queue.setFilter(getString(queueNode, xPathFilter));
 
-      Map<String, Address> addresses = new HashMap<>();
+         String addressName = getString(queueNode, xPathAddress);
 
-      String xPathQueues = "/configuration/core/queues";
-      String xPathQueue = "/configuration/core/queues/queue";
-      String xPathAttrName = "@name";
-      String xPathAddress = "address";
-      String xPathFilter = "filter/@string";
-      String xPathDurable = "durable";
+         Address address;
+         if (coreAddresses.containsKey(addressName)) {
+            address = coreAddresses.get(addressName);
+         } else {
+            address = new Address();
+            address.setName(addressName);
+            coreAddresses.put(addressName, address);
+         }
+         address.getQueues().add(queue);
+      }
+
+      // Remove Core Queues Element from Core
+      Node queues = getNode(xPathQueues);
+      if (queues != null) {
+         coreElement.removeChild(queues);
+      }
 
-      XPath xPath = XPathFactory.newInstance().newXPath();
+      return true;
+   }
 
-      NodeList xpathResult = (NodeList) xPath.evaluate(xPathQueue, document, XPathConstants.NODESET);
-      if (xpathResult == null || xpathResult.getLength() == 0) {
-         // doesn't require change
+   public boolean convertJMSToAddresses() throws Exception {
+      Node jmsElement = getNode(xPathJMS);
+      if (jmsElement == null) {
          return false;
       }
 
-      for (int i = 0; i < xpathResult.getLength(); i++) {
-         Node queueNode = xpathResult.item(i);
+      NodeList jmsQueueElements = getNodeList(xPathJMSQueues);
+      for (int i = 0; i < jmsQueueElements.getLength(); i++) {
+         Node jmsQueueElement = jmsQueueElements.item(i);
+         String name = jmsQueuePrefix + getString(jmsQueueElement, xPathAttrName);
+
+         Address address;
+         if (jmsQueueAddresses.containsKey(name)) {
+            address = jmsQueueAddresses.get(name);
+         }
+         else {
+            address = new Address();
+            address.setName(name);
+            address.setRoutingType("anycast");
+            jmsQueueAddresses.put(name, address);
+         }
 
          Queue queue = new Queue();
-         queue.setName(xPath.evaluate(xPathAttrName, queueNode, XPathConstants.STRING).toString());
-         queue.setDurable(xPath.evaluate(xPathDurable, queueNode, XPathConstants.STRING).toString());
-         queue.setFilter(xPath.evaluate(xPathFilter, queueNode, XPathConstants.STRING).toString());
+         queue.setName(name);
+         queue.setDurable(getString(jmsQueueElement, xPathDurable));
+         queue.setFilter(getString(jmsQueueElement, xPathSelector));
+         address.getQueues().add(queue);
+      }
 
-         String addressName = xPath.evaluate(xPathAddress, queueNode, XPathConstants.STRING).toString();
-         Address address;
+      NodeList jmsTopicElements = getNodeList(xPathJMSTopics);
+      for (int i = 0; i < jmsTopicElements.getLength(); i++) {
+         Node jmsTopicElement = jmsTopicElements.item(i);
+         String name = jmsTopicPrefix + getString(jmsTopicElement, xPathAttrName);
 
-         if (addresses.containsKey(addressName)) {
-            address = addresses.get(addressName);
-         } else {
+         Address address;
+         if (jmsTopicAddresses.containsKey(name)) {
+            address = jmsTopicAddresses.get(name);
+         }
+         else {
             address = new Address();
-            address.setName(addressName);
-            addresses.put(addressName, address);
+            address.setName(name);
+            address.setRoutingType("multicast");
+            jmsTopicAddresses.put(name, address);
          }
+
+         Queue queue = new Queue();
+         queue.setName(name);
          address.getQueues().add(queue);
       }
 
-      Node queues = ((Node) xPath.evaluate(xPathQueues, document, XPathConstants.NODE));
+      jmsElement.getParentNode().removeChild(jmsElement);
+      return true;
+   }
+
+   public void writeAddressesToDocument() {
 
-      if (queues != null) {
-         Node core = queues.getParentNode();
-         core.removeChild(queues);
-
-         Element a = document.createElement("addresses");
-         for (Address addr : addresses.values()) {
-            Element eAddr = document.createElement("address");
-            eAddr.setAttribute("name", addr.getName());
-            eAddr.setAttribute("type", addr.getRoutingType());
-
-            if (addr.getQueues().size() > 0) {
-               Element eQueues = document.createElement("queues");
-               for (Queue queue : addr.getQueues()) {
-                  Element eQueue = document.createElement("queue");
-                  eQueue.setAttribute("name", queue.getName());
-                  eQueue.setAttribute("max-consumers", addr.getDefaultMaxConsumers());
-                  eQueue.setAttribute("delete-on-no-consumers", addr.getDefaultDeleteOnNoConsumers());
-
-                  if (queue.getDurable() != null && !queue.getDurable().isEmpty()) {
-                     Element eDurable = document.createElement("durable");
-                     eDurable.setTextContent(queue.getDurable());
-                     eQueue.appendChild(eDurable);
-                  }
-
-                  if (queue.getFilter() != null && !queue.getFilter().isEmpty()) {
-                     Element eFilter = document.createElement("filter");
-                     eFilter.setAttribute("string", queue.getFilter());
-                     eQueue.appendChild(eFilter);
-                  }
-
-                  eQueues.appendChild(eQueue);
+      Element addressElement = document.createElement("addresses");
+
+      writeAddressListToDoc("=   JMS Queues   =", jmsQueueAddresses.values(), addressElement);
+      writeAddressListToDoc("=   JMS Topics   =", jmsTopicAddresses.values(), addressElement);
+      writeAddressListToDoc("=   Core Queues  =", coreAddresses.values(), addressElement);
+
+      coreElement.appendChild(addressElement);
+
+   }
+
+   private void writeAddressListToDoc(String comment, Collection<Address> addresses, Node addressElement) {
+      if (addresses.isEmpty()) return;
+
+      addressElement.appendChild(document.createComment("=================="));
+      addressElement.appendChild(document.createComment(comment));
+      addressElement.appendChild(document.createComment("=================="));
+      for (Address addr : addresses) {
+         Element eAddr = document.createElement("address");
+         eAddr.setAttribute("name", addr.getName());
+         eAddr.setAttribute("type", addr.getRoutingType());
+
+         if (addr.getQueues().size() > 0) {
+            Element eQueues = document.createElement("queues");
+            for (Queue queue : addr.getQueues()) {
+               Element eQueue = document.createElement("queue");
+               eQueue.setAttribute("name", queue.getName());
+               eQueue.setAttribute("max-consumers", addr.getDefaultMaxConsumers());
+               eQueue.setAttribute("delete-on-no-consumers", addr.getDefaultDeleteOnNoConsumers());
+
+               if (queue.getDurable() != null && !queue.getDurable().isEmpty()) {
+                  Element eDurable = document.createElement("durable");
+                  eDurable.setTextContent(queue.getDurable());
+                  eQueue.appendChild(eDurable);
                }
-               eAddr.appendChild(eQueues);
+
+               if (queue.getFilter() != null && !queue.getFilter().isEmpty()) {
+                  Element eFilter = document.createElement("filter");
+                  eFilter.setAttribute("string", queue.getFilter());
+                  eQueue.appendChild(eFilter);
+               }
+
+               eQueues.appendChild(eQueue);
             }
-            a.appendChild(eAddr);
+            eAddr.appendChild(eQueues);
          }
-         core.appendChild(a);
+         addressElement.appendChild(eAddr);
       }
-
-      document.normalize();
-      return true;
    }
 
    public void write(File output, Properties outputProperties) throws TransformerException {
@@ -224,4 +291,17 @@ public class XMLConfigurationMigration {
       StreamResult streamResult = new StreamResult(output);
       transformer.transform(new DOMSource(document), streamResult);
    }
+
+   private String getString(Node node, String xPathQuery) throws XPathExpressionException {
+      return xPath.evaluate(xPathQuery, node, XPathConstants.STRING).toString();
+   }
+
+   private NodeList getNodeList(String xPathQuery) throws XPathExpressionException {
+      return (NodeList) xPath.evaluate(xPathQuery, document, XPathConstants.NODESET);
+   }
+
+   private Node getNode(String xPathQuery) throws XPathExpressionException {
+      return (Node) xPath.evaluate(xPathQuery, document, XPathConstants.NODE);
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d70bf3ba/artemis-tools/src/main/resources/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/artemis-tools/src/main/resources/META-INF/MANIFEST.MF b/artemis-tools/src/main/resources/META-INF/MANIFEST.MF
index 72543bf..fc08aed 100644
--- a/artemis-tools/src/main/resources/META-INF/MANIFEST.MF
+++ b/artemis-tools/src/main/resources/META-INF/MANIFEST.MF
@@ -1,2 +1,2 @@
 Manifest-Version: 1.0
-Main-Class: org.apache.activemq.artemis.tools.migrate.config.XMLConfigurationMigration
+Main-Class: org.apache.activemq.artemis.tools.migrate.config.Main

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d70bf3ba/artemis-tools/src/test/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigrationTest.java
----------------------------------------------------------------------
diff --git a/artemis-tools/src/test/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigrationTest.java b/artemis-tools/src/test/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigrationTest.java
index f68e9c2..e653920 100644
--- a/artemis-tools/src/test/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigrationTest.java
+++ b/artemis-tools/src/test/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigrationTest.java
@@ -27,10 +27,11 @@ public class XMLConfigurationMigrationTest {
    @Test
    public void testQueuesReplacedWithAddresses() throws Exception {
       File brokerXml = new File(this.getClass().getClassLoader().getResource("broker.xml").toURI());
-      XMLConfigurationMigration tool = new XMLConfigurationMigration(brokerXml);
-
       File output = new File("target/out.xml");
-      tool.convertQueuesToAddresses();
+
+      XMLConfigurationMigration tool = new XMLConfigurationMigration(brokerXml, output);
+
+      tool.transform();
 
       Properties properties = new Properties();
       properties.put(OutputKeys.INDENT, "yes");
@@ -42,6 +43,6 @@ public class XMLConfigurationMigrationTest {
    @Test
    public void scanAndReplaceTest() throws Exception {
       File dir = new File(this.getClass().getClassLoader().getResource("replace").getPath());
-      XMLConfigurationMigration.scanAndTransform(dir);
+      Main.scanAndTransform(dir);
    }
 }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d70bf3ba/artemis-tools/src/test/resources/broker.xml
----------------------------------------------------------------------
diff --git a/artemis-tools/src/test/resources/broker.xml b/artemis-tools/src/test/resources/broker.xml
index bd33d59..488be74 100644
--- a/artemis-tools/src/test/resources/broker.xml
+++ b/artemis-tools/src/test/resources/broker.xml
@@ -18,8 +18,17 @@
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
    <jms xmlns="urn:activemq:jms">
-      <!--the queue used by the example-->
-      <queue name="exampleQueue"/>
+      <queue name="queue1">
+         <durable>true</durable>
+         <selector string="car='red'" />
+      </queue>
+
+      <queue name="queue2"/>
+      <queue name="queue3"/>
+
+      <topic name="topic1"/>
+      <topic name="topic2"/>
+      <topic name="topic3"/>
    </jms>
 
    <core xmlns="urn:activemq:core">