https://issues.apache.org/jira/browse/AMQCLI-2

Adding the first version of JAXB classes generated from the Artemis
import schema.  There is also a marshaller class and unit test to
demonstrate streaming to an XML file when marshalling instead of writing
the entire file at once. This will need some work but is a good starting
point.

Also Artemis is currently a SNAPSHOT dependency as we need to work off
the newest code in master.
diff --git a/activemq-kahadb-exporter/pom.xml b/activemq-kahadb-exporter/pom.xml
index 45e8e81..9335e2e 100644
--- a/activemq-kahadb-exporter/pom.xml
+++ b/activemq-kahadb-exporter/pom.xml
@@ -15,7 +15,8 @@
   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">
+<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">
   <parent>
     <groupId>org.apache.activemq</groupId>
     <artifactId>activemq-cli-tools</artifactId>
@@ -31,7 +32,6 @@
     <dependency>
       <groupId>org.apache.activemq</groupId>
       <artifactId>activemq-kahadb-store</artifactId>
-      <version>${activemq-version}</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
@@ -47,7 +47,95 @@
 
   <build>
     <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>unpack-client</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.activemq</groupId>
+                  <artifactId>artemis-cli</artifactId>
+                  <version>${artemis-version}</version>
+                  <type>jar</type>
+                  <overWrite>true</overWrite>
+                  <outputDirectory>${project.build.directory}/artemis-cli</outputDirectory>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${project.build.directory}/artemis-cli/schema</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>${project.basedir}/src/main/resources</directory>
+                  <includes>
+                    <include>artemis-import-export.xjb</include>
+                  </includes>
+                  <filtering>false</filtering>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>jaxb2-maven-plugin</artifactId>
+        <version>${jaxb2-maven-plugin-version}</version>
+        <executions>
+          <execution>
+            <id>xjc</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>xjc</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <xjbSources>
+            <xjbSource>${project.build.directory}/artemis-cli/schema/artemis-import-export.xjb</xjbSource>
+          </xjbSources>
+          <sources>
+            <source>${project.build.directory}/artemis-cli/schema/artemis-import-export.xsd</source>
+          </sources>
+          <packageName>org.apache.activemq.cli.schema</packageName>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <configuration>
+              <sources>
+                <source>${project.build.directory}/generated-sources/jaxb</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
-
 </project>
diff --git a/activemq-kahadb-exporter/src/main/java/org/apache/activemq/cli/artemis/schema/ArtemisJournalMarshaller.java b/activemq-kahadb-exporter/src/main/java/org/apache/activemq/cli/artemis/schema/ArtemisJournalMarshaller.java
new file mode 100644
index 0000000..82e167b
--- /dev/null
+++ b/activemq-kahadb-exporter/src/main/java/org/apache/activemq/cli/artemis/schema/ArtemisJournalMarshaller.java
@@ -0,0 +1,100 @@
+/**
+ * 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.cli.artemis.schema;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.activemq.cli.schema.ActivemqJournalType;
+import org.apache.activemq.cli.schema.AddressBindingType;
+import org.apache.activemq.cli.schema.MessageType;
+import org.apache.activemq.cli.schema.ObjectFactory;
+import org.apache.activemq.cli.schema.QueueBindingType;
+
+/**
+ * Marshaller class to stream to a file
+ */
+public class ArtemisJournalMarshaller {
+
+    public final static String MESSAGE_ELEMENT = "message";
+    public final static String MESSAGES_ELEMENT = "messages";
+    public final static String BINDINGS_ELEMENT = "bindings";
+    public final static String ADDRESS_BINDING_ELEMENT = "address-binding";
+    public final static String QUEUE_BINDING_ELEMENT = "queue-binding";
+
+    private final ObjectFactory factory = new ObjectFactory();
+    private final JAXBContext context;
+    private final Marshaller marshaller;
+    private final XMLStreamWriter xmlWriter;
+    //Used for journal start
+    final JAXBElement<ActivemqJournalType> journalElement =
+            factory.createActivemqJournal(new ActivemqJournalType());
+
+    public ArtemisJournalMarshaller(final XMLStreamWriter xmlWriter) throws JAXBException {
+        this.context = JAXBContext.newInstance(ObjectFactory.class);
+        this.marshaller = context.createMarshaller();
+        this.marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
+        this.xmlWriter = xmlWriter;
+    }
+
+    public void appendJournalOpen() throws XMLStreamException {
+        xmlWriter.writeStartDocument();
+        xmlWriter.writeStartElement(journalElement.getName().toString());
+    }
+
+    public void appendJournalClose(boolean closeWriter) throws XMLStreamException {
+        xmlWriter.writeEndDocument();
+        if (closeWriter) {
+            xmlWriter.flush();
+            xmlWriter.close();
+        }
+    }
+
+    public void appendMessagesElement() throws XMLStreamException {
+        xmlWriter.writeStartElement(MESSAGES_ELEMENT);
+    }
+
+    public void appendBindingsElement() throws XMLStreamException {
+        xmlWriter.writeStartElement(BINDINGS_ELEMENT);
+    }
+
+    public void appendEndElement() throws XMLStreamException {
+        xmlWriter.writeEndElement();
+    }
+
+    public void appendMessage(final MessageType message) throws JAXBException {
+        marshaller.marshal(wrap(MESSAGE_ELEMENT, message), xmlWriter);
+    }
+
+    public void appendBinding(final AddressBindingType addressBinding) throws JAXBException {
+        marshaller.marshal(wrap(ADDRESS_BINDING_ELEMENT, addressBinding), xmlWriter);
+    }
+
+    public void appendBinding(final QueueBindingType queueBinding) throws JAXBException {
+        marshaller.marshal(wrap(QUEUE_BINDING_ELEMENT, queueBinding), xmlWriter);
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T> JAXBElement<T> wrap(String name, T object) {
+        return new JAXBElement<T>(QName.valueOf(name), (Class<T>) object.getClass(), object);
+    }
+}
diff --git a/activemq-kahadb-exporter/src/main/resources/artemis-import-export.xjb b/activemq-kahadb-exporter/src/main/resources/artemis-import-export.xjb
new file mode 100644
index 0000000..079eeb9
--- /dev/null
+++ b/activemq-kahadb-exporter/src/main/resources/artemis-import-export.xjb
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema"
+  extensionBindingPrefixes="xjc annox"
+  xmlns:annox="http://annox.dev.java.net" version="2.1">
+  <bindings schemaLocation="artemis-import-export.xsd" version="1.0">
+
+    <!-- Customize the package name -->
+    <schemaBindings>
+      <package name="org.apache.activemq.schema" />
+    </schemaBindings>
+
+    <!-- There is already a value field so map the value attribute to a new name -->
+    <bindings node="//xs:complexType[@name='propertyType']">
+      <bindings node=".//xs:attribute[@name='value']">
+        <property name="valueAttribute" />
+      </bindings>
+    </bindings>
+  </bindings>
+</bindings>
\ No newline at end of file
diff --git a/activemq-kahadb-exporter/src/test/java/org/apache/activemq/cli/artemis/schema/ArtemisJournalMarshallerTest.java b/activemq-kahadb-exporter/src/test/java/org/apache/activemq/cli/artemis/schema/ArtemisJournalMarshallerTest.java
new file mode 100644
index 0000000..e96422f
--- /dev/null
+++ b/activemq-kahadb-exporter/src/test/java/org/apache/activemq/cli/artemis/schema/ArtemisJournalMarshallerTest.java
@@ -0,0 +1,120 @@
+/**
+ * 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.cli.artemis.schema;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.activemq.cli.artemis.schema.ArtemisJournalMarshaller;
+import org.apache.activemq.cli.schema.ActivemqJournalType;
+import org.apache.activemq.cli.schema.AddressBindingType;
+import org.apache.activemq.cli.schema.MessageType;
+import org.apache.activemq.cli.schema.MessagesType;
+import org.apache.activemq.cli.schema.ObjectFactory;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class ArtemisJournalMarshallerTest {
+
+    @Rule
+    public TemporaryFolder tempFolder = new TemporaryFolder();
+
+    /**
+     * Test default marshaling of entire document at once
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testFullMarshal() throws Exception {
+
+        ObjectFactory factory = new ObjectFactory();
+
+        ActivemqJournalType journal = new ActivemqJournalType();
+        MessagesType messages = factory.createMessagesType();
+        for (int i = 0; i < 3; i++) {
+            MessageType message = factory.createMessageType();
+            message.setId((long) i);
+            messages.getMessage().add(message);
+        }
+        journal.setMessages(messages);
+
+        JAXBContext context = JAXBContext.newInstance(ActivemqJournalType.class);
+        Marshaller m = context.createMarshaller();
+        m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
+
+        File file = tempFolder.newFile();
+        JAXBElement<ActivemqJournalType> element = factory.createActivemqJournal(journal);
+        m.marshal(element, file);
+        validate(file);
+    }
+
+    /**
+     * Test stream marshal by appending one message at a time
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testStreamMarshal() throws Exception {
+        File file = tempFolder.newFile();
+
+        try(FileOutputStream fos = new FileOutputStream(file)) {
+            XMLStreamWriter xmlWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(fos);
+            ArtemisJournalMarshaller xmlMarshaller = new ArtemisJournalMarshaller(xmlWriter);
+
+            xmlMarshaller.appendJournalOpen();
+            xmlMarshaller.appendBindingsElement();
+            xmlMarshaller.appendBinding(new AddressBindingType());
+            xmlMarshaller.appendEndElement();
+            xmlMarshaller.appendMessagesElement();
+
+            //Marshal messages one at a time
+            for (int i = 0; i < 3; i++) {
+                MessageType message = new MessageType();
+                message.setId((long) i);
+                message.setTimestamp(System.currentTimeMillis());
+                xmlMarshaller.appendMessage(message);
+            }
+
+            xmlMarshaller.appendEndElement();
+            xmlMarshaller.appendJournalClose(true);
+        }
+
+        //This can be read as a stream as well but for the purpose of this test
+        //just read the whole thing in at once
+        validate(file);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void validate(File file) throws JAXBException {
+        JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
+        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+        JAXBElement<ActivemqJournalType> read = (JAXBElement<ActivemqJournalType>) jaxbUnmarshaller.unmarshal(file);
+        assertEquals(3, read.getValue().getMessages().getMessage().size());
+    }
+
+}
diff --git a/pom.xml b/pom.xml
index 5c56c3c..8be5dd3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,8 @@
   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">
+<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">
 
   <parent>
     <groupId>org.apache</groupId>
@@ -37,10 +38,15 @@
     <maven.compiler.target>1.8</maven.compiler.target>
 
     <activemq-version>5.14.3</activemq-version>
+    <artemis-version>2.0.0-SNAPSHOT</artemis-version>
 
     <!-- Test dependency versions -->
     <junit-version>4.12</junit-version>
     <mockito-version>1.10.19</mockito-version>
+    
+    <!-- Maven Plugins -->
+    <jaxb2-maven-plugin-version>2.2</jaxb2-maven-plugin-version>
+    <build-helper-plugin-version>3.0.0</build-helper-plugin-version>
   </properties>
 
   <url>http://activemq.apache.org</url>
@@ -61,6 +67,21 @@
 
   <dependencyManagement>
     <dependencies>
+
+      <!-- ActiveMQ -->
+      <dependency>
+        <groupId>org.apache.activemq</groupId>
+        <artifactId>activemq-kahadb-store</artifactId>
+        <version>${activemq-version}</version>
+      </dependency>
+
+      <!-- Artemis -->
+      <dependency>
+        <groupId>org.apache.activemq</groupId>
+        <artifactId>artemis-cli</artifactId>
+        <version>${artemis-version}</version>
+      </dependency>
+
       <!-- Test dependencies -->
       <dependency>
         <groupId>junit</groupId>