You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by pu...@apache.org on 2018/03/09 18:20:52 UTC

[06/22] incubator-rya git commit: RYA-448 Implement JAXB marshalling code for the Query Manager's XML configuration file.

RYA-448 Implement JAXB marshalling code for the Query Manager's XML configuration file.



Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/c1ccde80
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/c1ccde80
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/c1ccde80

Branch: refs/heads/master
Commit: c1ccde80bbd898f6051da8bdedacac3c53e14539
Parents: 9e8a27c
Author: kchilton2 <ke...@gmail.com>
Authored: Tue Jan 23 15:50:17 2018 -0500
Committer: Valiyil <Pu...@parsons.com>
Committed: Fri Mar 9 12:59:41 2018 -0500

----------------------------------------------------------------------
 extras/rya.streams/query-manager/pom.xml        | 52 ++++++++++++-
 .../query-manager/src/license/header.txt        | 16 ++++
 .../src/main/config/configuration.xml           | 51 ++++++++++++
 .../xml/QueryManagerConfigUnmarshaller.java     | 78 +++++++++++++++++++
 .../src/main/xsd/QueryManagerConfig.xsd         | 81 ++++++++++++++++++++
 .../xml/QueryManagerConfigMarshallerTest.java   | 78 +++++++++++++++++++
 6 files changed, 355 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c1ccde80/extras/rya.streams/query-manager/pom.xml
----------------------------------------------------------------------
diff --git a/extras/rya.streams/query-manager/pom.xml b/extras/rya.streams/query-manager/pom.xml
index 3a13c6a..76e521d 100644
--- a/extras/rya.streams/query-manager/pom.xml
+++ b/extras/rya.streams/query-manager/pom.xml
@@ -48,7 +48,57 @@ under the License.
         </dependency>
     </dependencies>
     <build>
+        <!-- Add the XSD directory as a resource so that it will be packaged in the jar. 
+           - Required so that the marshalling code is able to find the schema it is 
+           - validating XML against. -->
+        <resources>
+            <resource>
+                <directory>src/main/xsd</directory>
+            </resource>
+        </resources>
+    
         <plugins>
+            <!-- Generate the XML marshalling java code from the XSD file defining its structure. -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>jaxb2-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>xjc</id>
+                        <goals>
+                            <goal>xjc</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <packageName>org.apache.rya.streams.querymanager.xml</packageName>
+                </configuration>
+            </plugin>
+         
+            <!-- Ensure the generated java source contains the lisence header. -->   
+            <plugin>
+                <groupId>com.mycila</groupId>
+                <artifactId>license-maven-plugin</artifactId>
+                <configuration>
+                    <header>${project.basedir}/src/license/header.txt</header>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>update-generated-source-headers</id>
+                        <configuration>
+                            <basedir>${project.build.directory}/generated-sources/jaxb</basedir>
+                            <mapping>
+                                <sun-jaxb.episode>XML_STYLE</sun-jaxb.episode>
+                            </mapping>
+                        </configuration>
+                        <phase>process-sources</phase>
+                        <goals>
+                            <goal>format</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
@@ -71,4 +121,4 @@ under the License.
             </plugin>
         </plugins>
      </build>
-</project>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c1ccde80/extras/rya.streams/query-manager/src/license/header.txt
----------------------------------------------------------------------
diff --git a/extras/rya.streams/query-manager/src/license/header.txt b/extras/rya.streams/query-manager/src/license/header.txt
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/extras/rya.streams/query-manager/src/license/header.txt
@@ -0,0 +1,16 @@
+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.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c1ccde80/extras/rya.streams/query-manager/src/main/config/configuration.xml
----------------------------------------------------------------------
diff --git a/extras/rya.streams/query-manager/src/main/config/configuration.xml b/extras/rya.streams/query-manager/src/main/config/configuration.xml
new file mode 100644
index 0000000..b78900e
--- /dev/null
+++ b/extras/rya.streams/query-manager/src/main/config/configuration.xml
@@ -0,0 +1,51 @@
+<?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.
+-->
+<queryManagerConfig>
+    <!-- A list of Query Change Log Sources. A source needs to be defined for
+       - every system that is used to manage Rya Streams Query Change Logs.
+       - The query manager will manage queries for all Rya instances whose
+       - change logs are stored within those sources.
+       -->
+    <queryChangeLogSources>
+        <queryChangeLogSource>
+            <kafka>
+                <hostname>[Kafka Broker Hostname]</hostname>
+                <port>[Kafka Broker Port]</port>
+            </kafka>
+        </queryChangeLogSource>
+    </queryChangeLogSources>
+    
+    <!-- This section defines performance related tuning values. Sensible
+       - default have been provided to simplify configuration. 
+       -->
+    <performanceTunning>
+        <!-- Indicates how frequently the Query Change Logs that are defined
+           - in the sources section of this configuration file are polled for
+           - updates. This value effects how much time may pass between the 
+           - state of a query changing and that change being represented by
+           - the execution engine.
+           -->
+        <queryChanngeLogDiscoveryPeriod>
+            <value>1</value>
+            <!-- Options: {MILLISECONDS, SECONDS, MINUTES} -->
+            <units>MINUTES</units>
+        </queryChanngeLogDiscoveryPeriod>
+    </performanceTunning>
+</queryManagerConfig>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c1ccde80/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigUnmarshaller.java
----------------------------------------------------------------------
diff --git a/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigUnmarshaller.java b/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigUnmarshaller.java
new file mode 100644
index 0000000..834f0b9
--- /dev/null
+++ b/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigUnmarshaller.java
@@ -0,0 +1,78 @@
+/**
+ * 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.rya.streams.querymanager.xml;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.Reader;
+import java.net.URL;
+
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.xml.sax.SAXException;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
+/**
+ * Validates and unmarshalls XML into a {@link QueryManagerConfig} object.
+ */
+@DefaultAnnotation(NonNull.class)
+public class QueryManagerConfigUnmarshaller {
+
+    /**
+     * The path within the project's jar file where the XSD resides.
+     */
+    private static final String XSD_PATH = "QueryManagerConfig.xsd";
+
+    /**
+     * Validates and unmarshalls XML into a {@link QueryManagerConfig} object.
+     *
+     * @param xmlReader - Reads the XML that will be unmarshalled. (not null)
+     * @return A {@link QueryManagerConfig} loaded with the XMLs values.
+     * @throws SAXException Could not load the schema the XML will be validated against.
+     * @throws JAXBException Could not unmarshal the XML into a POJO.
+     */
+    public static QueryManagerConfig unmarshall(final Reader xmlReader) throws JAXBException, SAXException {
+        requireNonNull(xmlReader);
+
+        // Get an input stream to the XSD file that is packaged inside of the jar.
+        final URL schemaURL = ClassLoader.getSystemResource(XSD_PATH);
+        if(schemaURL == null) {
+            throw new RuntimeException("The Class Loader was unable to find the following resource: " + XSD_PATH);
+        }
+
+        // Get the schema for the object.
+        final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+        final Schema schema = sf.newSchema(schemaURL);
+
+        // Configure the unmarhsaller to validate using the schema.
+        final JAXBContext context = JAXBContext.newInstance(QueryManagerConfig.class);
+        final Unmarshaller unmarshaller = context.createUnmarshaller();
+        unmarshaller.setSchema(schema);
+
+        // Perform the unmarshal.
+        return (QueryManagerConfig) unmarshaller.unmarshal(xmlReader);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c1ccde80/extras/rya.streams/query-manager/src/main/xsd/QueryManagerConfig.xsd
----------------------------------------------------------------------
diff --git a/extras/rya.streams/query-manager/src/main/xsd/QueryManagerConfig.xsd b/extras/rya.streams/query-manager/src/main/xsd/QueryManagerConfig.xsd
new file mode 100644
index 0000000..17d667f
--- /dev/null
+++ b/extras/rya.streams/query-manager/src/main/xsd/QueryManagerConfig.xsd
@@ -0,0 +1,81 @@
+<?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.
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+  <!-- Define the Query Manager's schema. -->
+  <xs:element name="queryManagerConfig">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="queryChangeLogSources">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="queryChangeLogSource" maxOccurs="unbounded">
+                <xs:complexType>
+                  <xs:choice>
+                    <xs:element name="kafka" type="kafka"/>
+                  </xs:choice>
+                </xs:complexType>
+              </xs:element>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element name="performanceTunning">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="queryChanngeLogDiscoveryPeriod">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element name="value" type="xs:positiveInteger"/>
+                    <xs:element name="units" type="timeUnits"/>
+                  </xs:sequence>
+                </xs:complexType>
+              </xs:element>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  
+  <!-- Defines the time units that may be specified. -->
+  <xs:simpleType name="timeUnits" final="restriction">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="MILLISECONDS"/>
+      <xs:enumeration value="SECONDS"/>
+      <xs:enumeration value="MINUTES"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <!-- Define what kafka connection information looks like. -->  
+  <xs:complexType name="kafka">
+    <xs:sequence>
+      <xs:element name="hostname" type="xs:string"/>
+      <xs:element name="port" type="tcpPort" />
+    </xs:sequence>
+  </xs:complexType>
+  
+  <!-- Define the legal range for a TCP port. -->
+  <xs:simpleType name="tcpPort">
+    <xs:restriction base="xs:int">
+      <xs:minInclusive value="0"/>
+      <xs:maxInclusive value="65535"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c1ccde80/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigMarshallerTest.java
----------------------------------------------------------------------
diff --git a/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigMarshallerTest.java b/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigMarshallerTest.java
new file mode 100644
index 0000000..bc8a040
--- /dev/null
+++ b/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/xml/QueryManagerConfigMarshallerTest.java
@@ -0,0 +1,78 @@
+/**
+ * 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.rya.streams.querymanager.xml;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.StringReader;
+
+import javax.xml.bind.UnmarshalException;
+
+import org.junit.Test;
+
+/**
+ * Unit tests the methods of {@link QueryManagerConfigUnmarshaller}.
+ */
+public class QueryManagerConfigMarshallerTest {
+
+    @Test
+    public void unmarshal_validXml() throws Exception {
+        final String xml =
+                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+                "<queryManagerConfig>\n" +
+                "    <queryChangeLogSources>\n" +
+                "        <queryChangeLogSource>\n" +
+                "            <kafka>\n" +
+                "                <hostname>localhost</hostname>\n" +
+                "                <port>6</port>\n" +
+                "            </kafka>\n" +
+                "        </queryChangeLogSource>\n" +
+                "    </queryChangeLogSources>\n" +
+                "    <performanceTunning>\n" +
+                "        <queryChanngeLogDiscoveryPeriod>\n" +
+                "            <value>1</value>\n" +
+                "            <units>MINUTES</units>\n" +
+                "        </queryChanngeLogDiscoveryPeriod>\n" +
+                "    </performanceTunning>\n" +
+                "</queryManagerConfig>";
+
+
+        final QueryManagerConfig config = QueryManagerConfigUnmarshaller.unmarshall(new StringReader(xml));
+        assertNotNull(config);
+    }
+
+    @Test(expected = UnmarshalException.class)
+    public void unmarshal_invalidXml() throws Exception {
+        final String xml =
+                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+                "<queryManagerConfig>\n" +
+                "    <queryChangeLogSources>\n" +
+                "        <queryChangeLogSource>\n" +
+                "            <kafka>\n" +
+                "                <hostname>localhost</hostname>\n" +
+                "                <port>6</port>\n" +
+                "            </kafka>\n" +
+                "        </queryChangeLogSource>\n" +
+                "    </queryChangeLogSources>\n" +
+                "</queryManagerConfig>";
+
+
+        QueryManagerConfigUnmarshaller.unmarshall(new StringReader(xml));
+    }
+}
\ No newline at end of file