XSD validation for Lucene datastore
diff --git a/gora-lucene/src/main/java/org/apache/gora/lucene/store/LuceneStore.java b/gora-lucene/src/main/java/org/apache/gora/lucene/store/LuceneStore.java
index 4e749fb..433defa 100644
--- a/gora-lucene/src/main/java/org/apache/gora/lucene/store/LuceneStore.java
+++ b/gora-lucene/src/main/java/org/apache/gora/lucene/store/LuceneStore.java
@@ -26,8 +26,11 @@
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
+import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.SchemaFactory;
import org.apache.avro.Schema;
import org.apache.avro.Schema.Type;
import org.apache.avro.specific.SpecificDatumReader;
@@ -86,6 +89,7 @@
private static final Logger LOG = LoggerFactory.getLogger(LuceneStore.class);
private static final String DEFAULT_MAPPING_FILE = "gora-lucene-mapping.xml";
+ private static final String XSD_MAPPING_FILE = "gora-lucene.xsd";
private static final String LUCENE_VERSION_KEY = "gora.lucene.index.version";
private static final String DEFAULT_LUCENE_VERSION = "LATEST";
private static final String LUCENE_RAM_BUFFER_KEY = "gora.lucene.index.writer.rambuffer";
@@ -153,6 +157,9 @@
LuceneMapping mapping = new LuceneMapping();
+ javax.xml.validation.Schema newSchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
+ .newSchema(new StreamSource(getClass().getClassLoader().getResourceAsStream(XSD_MAPPING_FILE)));
+ newSchema.newValidator().validate(new StreamSource(getClass().getClassLoader().getResourceAsStream(filename)));
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document dom = db.parse(getClass().getClassLoader().getResourceAsStream(filename));
Element root = dom.getDocumentElement();
diff --git a/gora-lucene/src/test/conf/gora-lucene.xsd b/gora-lucene/src/test/conf/gora-lucene.xsd
new file mode 100644
index 0000000..f82f015
--- /dev/null
+++ b/gora-lucene/src/test/conf/gora-lucene.xsd
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="gora-otd" type="lucene-mapping"/>
+ <xs:complexType name="lucene-mapping">
+ <xs:sequence>
+ <xs:element name="class" type="class-mapping" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="class-mapping">
+ <xs:sequence>
+ <xs:element name="primarykey" type="primarykey-mapping"/>
+ <xs:element name="field" type="field-mapping" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="nameClass-types" use="required"/>
+ <xs:attribute name="keyClass" type="keyClass-types" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="primarykey-mapping">
+ <xs:attribute name="column" type="xs:string" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="field-mapping">
+ <xs:attribute name="name" type="fieldName-types" use="required"/>
+ <xs:attribute name="column" type="xs:string" use="required"/>
+ </xs:complexType>
+
+ <xs:simpleType name="keyClass-types">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="java.lang.String"/>
+ <xs:enumeration value="java.lang.Integer"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="nameClass-types">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="([\p{L}_$][\p{L}\p{N}_$]*\.)*[\p{L}_$][\p{L}\p{N}_$]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="fieldName-types">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-zA-Z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>