You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ma...@apache.org on 2016/11/01 10:21:57 UTC
[28/34] activemq-artemis git commit: ARTEMIS-790 Added Configuration
conversion tooL
ARTEMIS-790 Added Configuration conversion tooL
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/e1bc0a36
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/e1bc0a36
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/e1bc0a36
Branch: refs/heads/ARTEMIS-780
Commit: e1bc0a368e9ac284d625b637b3695870d8adf589
Parents: 54ad2bc
Author: Martyn Taylor <mt...@redhat.com>
Authored: Fri Oct 21 10:51:21 2016 +0100
Committer: Martyn Taylor <mt...@redhat.com>
Committed: Tue Nov 1 10:20:52 2016 +0000
----------------------------------------------------------------------
artemis-tools/pom.xml | 56 +
.../config/XMLConfigurationMigration.java | 237 ++
.../migrate/config/addressing/Address.java | 73 +
.../tools/migrate/config/addressing/Queue.java | 50 +
.../src/main/resources/META-INF/MANIFEST.MF | 2 +
.../config/XMLConfigurationMigrationTest.java | 47 +
.../test/resources/artemis-configuration.xsd | 2591 ++++++++++++++++++
.../src/test/resources/artemis-server.xsd | 46 +
artemis-tools/src/test/resources/broker.xml | 64 +
.../src/test/resources/replace/broker.xml | 64 +
.../src/test/resources/replace/broker2.xml | 64 +
pom.xml | 1 +
12 files changed, 3295 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e1bc0a36/artemis-tools/pom.xml
----------------------------------------------------------------------
diff --git a/artemis-tools/pom.xml b/artemis-tools/pom.xml
new file mode 100644
index 0000000..9ce22fd
--- /dev/null
+++ b/artemis-tools/pom.xml
@@ -0,0 +1,56 @@
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>artemis-pom</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ </parent>
+
+ <name>ActiveMQ Artemis Tools</name>
+ <groupId>org.apache.activemq.tools</groupId>
+ <artifactId>artemis-tools</artifactId>
+ <packaging>jar</packaging>
+
+ <properties>
+ <activemq.basedir>${project.basedir}/..</activemq.basedir>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e1bc0a36/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
new file mode 100644
index 0000000..56833ea
--- /dev/null
+++ b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigration.java
@@ -0,0 +1,237 @@
+/*
+ * 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 javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+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.XPathFactory;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.activemq.artemis.tools.migrate.config.addressing.Address;
+import org.apache.activemq.artemis.tools.migrate.config.addressing.Queue;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XMLConfigurationMigration {
+
+ private static XMLConfigurationMigration migration;
+
+ private final Document document;
+
+ 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 {
+ transform(input, new File(args[1]));
+ }
+ }
+ }
+ }
+
+ 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");
+ if (transform(f, file)) {
+ File r = new File(f.getAbsolutePath());
+
+ f.renameTo(new File(f.getAbsolutePath() + ".bk"));
+ file.renameTo(r);
+ }
+ }
+ }
+ catch (Exception e) {
+ //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");
+ }
+
+ public static boolean transform(File input, File output) throws Exception {
+
+ migration = new XMLConfigurationMigration(input);
+ try {
+ if (!input.exists()) {
+ System.err.println("Input file not found: " + input);
+ }
+
+ if (migration.convertQueuesToAddresses()) {
+ 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);
+ return true;
+ }
+ }
+ catch (Exception e)
+ {
+ System.err.println("Error tranforming document");
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ public XMLConfigurationMigration(File input) throws Exception {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setIgnoringElementContentWhitespace(true);
+
+ DocumentBuilder db = factory.newDocumentBuilder();
+ this.document = db.parse(input);
+ }
+
+ public boolean convertQueuesToAddresses() throws Exception {
+
+ Map<String, Address> addresses = new HashMap<>();
+
+ String xPathQueues = "/configuration/core/queues";
+ String xPathQueue = "/configuration/core/queues/queue";
+ String xPathAttrName = "@name";
+ String xPathAddress = "address";
+ String xPathFilter = "filter/@string";
+ String xPathDurable = "durable";
+
+ XPath xPath = XPathFactory.newInstance().newXPath();
+
+ NodeList xpathResult = (NodeList) xPath.evaluate(xPathQueue, document, XPathConstants.NODESET);
+ if (xpathResult == null || xpathResult.getLength() == 0) {
+ // doesn't require change
+ return false;
+ }
+
+ for (int i = 0; i < xpathResult.getLength(); i++) {
+ Node queueNode = xpathResult.item(i);
+
+ 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());
+
+ String addressName = xPath.evaluate(xPathAddress, queueNode, XPathConstants.STRING).toString();
+ Address address;
+
+ if (addresses.containsKey(addressName)) {
+ address = addresses.get(addressName);
+ }
+ else {
+ address = new Address();
+ address.setName(addressName);
+ addresses.put(addressName, address);
+ }
+ address.getQueues().add(queue);
+ }
+
+ Node queues = ((Node) xPath.evaluate(xPathQueues, document, XPathConstants.NODE));
+
+ 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);
+ }
+ eAddr.appendChild(eQueues);
+ }
+ a.appendChild(eAddr);
+ }
+ core.appendChild(a);
+ }
+
+ document.normalize();
+ return true;
+ }
+
+ public void write(File output, Properties outputProperties) throws TransformerException {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperties(outputProperties);
+ StreamResult streamResult = new StreamResult(output);
+ transformer.transform(new DOMSource(document), streamResult);
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e1bc0a36/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Address.java
----------------------------------------------------------------------
diff --git a/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Address.java b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Address.java
new file mode 100644
index 0000000..c483c75
--- /dev/null
+++ b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Address.java
@@ -0,0 +1,73 @@
+/*
+ * 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.addressing;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Address {
+
+ private String name;
+
+ private String routingType = "multicast";
+
+ private String defaultMaxConsumers = "-1";
+
+ private String defaultDeleteOnNoConsumers = "false";
+
+ private List<Queue> queues = new ArrayList<>();
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getRoutingType() {
+ return routingType;
+ }
+
+ public void setRoutingType(String routingType) {
+ this.routingType = routingType;
+ }
+
+ public String getDefaultMaxConsumers() {
+ return defaultMaxConsumers;
+ }
+
+ public void setDefaultMaxConsumers(String defaultMaxConsumers) {
+ this.defaultMaxConsumers = defaultMaxConsumers;
+ }
+
+ public String getDefaultDeleteOnNoConsumers() {
+ return defaultDeleteOnNoConsumers;
+ }
+
+ public void setDefaultDeleteOnNoConsumers(String defaultDeleteOnNoConsumers) {
+ this.defaultDeleteOnNoConsumers = defaultDeleteOnNoConsumers;
+ }
+
+ public List<Queue> getQueues() {
+ return queues;
+ }
+
+ public void setQueues(List<Queue> queues) {
+ this.queues = queues;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e1bc0a36/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Queue.java
----------------------------------------------------------------------
diff --git a/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Queue.java b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Queue.java
new file mode 100644
index 0000000..f88b8ef
--- /dev/null
+++ b/artemis-tools/src/main/java/org/apache/activemq/artemis/tools/migrate/config/addressing/Queue.java
@@ -0,0 +1,50 @@
+/*
+ * 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.addressing;
+
+public class Queue {
+
+ String name;
+
+ String filter;
+
+ String durable;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getFilter() {
+ return filter;
+ }
+
+ public void setFilter(String filter) {
+ this.filter = filter;
+ }
+
+ public String getDurable() {
+ return durable;
+ }
+
+ public void setDurable(String durable) {
+ this.durable = durable;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e1bc0a36/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
new file mode 100644
index 0000000..72543bf
--- /dev/null
+++ b/artemis-tools/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: org.apache.activemq.artemis.tools.migrate.config.XMLConfigurationMigration
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e1bc0a36/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
new file mode 100644
index 0000000..f68e9c2
--- /dev/null
+++ b/artemis-tools/src/test/java/org/apache/activemq/artemis/tools/migrate/config/XMLConfigurationMigrationTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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 javax.xml.transform.OutputKeys;
+import java.io.File;
+import java.util.Properties;
+
+import org.junit.Test;
+
+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();
+
+ 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");
+ tool.write(output, properties);
+ }
+
+ @Test
+ public void scanAndReplaceTest() throws Exception {
+ File dir = new File(this.getClass().getClassLoader().getResource("replace").getPath());
+ XMLConfigurationMigration.scanAndTransform(dir);
+ }
+}