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>