Add manifest DTD and JAXB support

Use JAXB2 to generate Java class from manifest DTD obtained
from manifest-format.txt.

(https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt)

Also added shade plugin so that JAXB will be built into a uberjar
for deployment

Change-Id: I907b7ad6fd45adcb2afcf5137a1ae3ae3eb53efc
diff --git a/pom.xml b/pom.xml
index 3b9cd58..acd413e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,7 @@
     <Gerrit-ApiType>plugin</Gerrit-ApiType>
     <Gerrit-ApiVersion>2.9.1</Gerrit-ApiVersion>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <jaxb2-basics-runtime.version>0.6.4</jaxb2-basics-runtime.version>
   </properties>
 
   <build>
@@ -67,6 +68,40 @@
           <encoding>UTF-8</encoding>
         </configuration>
       </plugin>
+      <!--  For code gen: DTD to Java class with JAXB -->
+      <!--  http://confluence.highsource.org/display/J2B/User+Guide -->
+      <plugin>
+        <groupId>org.jvnet.jaxb2.maven2</groupId>
+        <artifactId>maven-jaxb2-plugin</artifactId>
+        <version>0.7.0</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <schemaDirectory>src/main/resources/schemas</schemaDirectory>
+          <schemaLanguage>DTD</schemaLanguage>
+          <schemaIncludes>
+            <schemaInclude>*.dtd</schemaInclude>
+          </schemaIncludes>
+          <generatePackage>com.amd.gerrit.plugins.manifestsubscription.manifest</generatePackage>
+          <args>
+            <arg>-XtoString</arg>
+            <arg>-Xequals</arg>
+            <arg>-Xcopyable</arg>
+          </args>
+          <plugins>
+            <plugin>
+              <groupId>org.jvnet.jaxb2_commons</groupId>
+              <artifactId>jaxb2-basics</artifactId>
+              <version>${jaxb2-basics-runtime.version}</version>
+            </plugin>
+          </plugins>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
@@ -77,5 +112,11 @@
       <version>${Gerrit-ApiVersion}</version>
       <scope>provided</scope>
     </dependency>
+
+    <dependency>
+      <groupId>org.jvnet.jaxb2_commons</groupId>
+      <artifactId>jaxb2-basics-runtime</artifactId>
+      <version>${jaxb2-basics-runtime.version}</version>
+    </dependency>
   </dependencies>
 </project>
diff --git a/src/main/resources/schemas/manifest.dtd b/src/main/resources/schemas/manifest.dtd
new file mode 100644
index 0000000..b6db9e5
--- /dev/null
+++ b/src/main/resources/schemas/manifest.dtd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+    <!ELEMENT manifest (notice?,
+                        remote*,
+                        default?,
+                        manifest-server?,
+                        remove-project*,
+                        project*,
+                        extend-project*,
+                        repo-hooks?,
+                        include*)>
+
+    <!ELEMENT notice (#PCDATA)>
+
+    <!ELEMENT remote (EMPTY)>
+    <!ATTLIST remote name         ID    #REQUIRED>
+    <!ATTLIST remote alias        CDATA #IMPLIED>
+    <!ATTLIST remote fetch        CDATA #REQUIRED>
+    <!ATTLIST remote review       CDATA #IMPLIED>
+    <!ATTLIST remote revision     CDATA #IMPLIED>
+
+    <!ELEMENT default (EMPTY)>
+    <!ATTLIST default remote      IDREF #IMPLIED>
+    <!ATTLIST default revision    CDATA #IMPLIED>
+    <!ATTLIST default dest-branch CDATA #IMPLIED>
+    <!ATTLIST default sync-j      CDATA #IMPLIED>
+    <!ATTLIST default sync-c      CDATA #IMPLIED>
+    <!ATTLIST default sync-s      CDATA #IMPLIED>
+
+    <!ELEMENT manifest-server (EMPTY)>
+    <!ATTLIST manifest-server url CDATA #REQUIRED>
+
+    <!ELEMENT project (annotation*,
+                       project*,
+                       copyfile*,
+                       linkfile*)>
+    <!ATTLIST project name        CDATA #REQUIRED>
+    <!ATTLIST project path        CDATA #IMPLIED>
+    <!ATTLIST project remote      IDREF #IMPLIED>
+    <!ATTLIST project revision    CDATA #IMPLIED>
+    <!ATTLIST project dest-branch CDATA #IMPLIED>
+    <!ATTLIST project groups      CDATA #IMPLIED>
+    <!ATTLIST project sync-c      CDATA #IMPLIED>
+    <!ATTLIST project sync-s      CDATA #IMPLIED>
+    <!ATTLIST project upstream CDATA #IMPLIED>
+    <!ATTLIST project clone-depth CDATA #IMPLIED>
+    <!ATTLIST project force-path CDATA #IMPLIED>
+
+    <!ELEMENT annotation (EMPTY)>
+    <!ATTLIST annotation name  CDATA #REQUIRED>
+    <!ATTLIST annotation value CDATA #REQUIRED>
+    <!ATTLIST annotation keep  CDATA "true">
+
+    <!ELEMENT copyfile (EMPTY)>
+    <!ATTLIST copyfile src   CDATA #REQUIRED>
+    <!ATTLIST copyfile dest  CDATA #REQUIRED>
+
+    <!ELEMENT linkfile (EMPTY)>
+    <!ATTLIST linkfile src   CDATA #REQUIRED>
+    <!ATTLIST linkfile dest  CDATA #REQUIRED>
+
+    <!ELEMENT extend-project (EMPTY) >
+    <!ATTLIST extend-project name CDATA #REQUIRED>
+    <!ATTLIST extend-project path CDATA #IMPLIED>
+    <!ATTLIST extend-project groups CDATA #IMPLIED>
+
+    <!ELEMENT remove-project (EMPTY)>
+    <!ATTLIST remove-project name  CDATA #REQUIRED>
+
+    <!ELEMENT repo-hooks (EMPTY)>
+    <!ATTLIST repo-hooks in-project CDATA #REQUIRED>
+    <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>
+
+    <!ELEMENT include      (EMPTY)>
+    <!ATTLIST include name CDATA #REQUIRED>