You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2015/08/06 09:04:27 UTC

incubator-lens git commit: LENS-681 : Add XML validation on server side and error propagation to client

Repository: incubator-lens
Updated Branches:
  refs/heads/master f9b0b356d -> 4d81aaf46


LENS-681 : Add XML validation on server side and error propagation to client


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

Branch: refs/heads/master
Commit: 4d81aaf46b21168dbff48d14c99c651484c7cb92
Parents: f9b0b35
Author: Rajat Khandelwal <pr...@apache.org>
Authored: Thu Aug 6 12:33:34 2015 +0530
Committer: Amareshwari Sriramadasu <am...@apache.org>
Committed: Thu Aug 6 12:33:34 2015 +0530

----------------------------------------------------------------------
 .../java/org/apache/lens/api/APIResult.java     |  6 +-
 .../org/apache/lens/api/LensSessionHandle.java  |  4 +-
 .../lens/api/error/LensCommonErrorCode.java     |  4 +-
 .../apache/lens/api/jaxb/LensJAXBContext.java   | 91 ++++++++++++++++++++
 .../lens/api/jaxb/LensJAXBContextResolver.java  | 74 ++++++++++++++++
 .../api/jaxb/LensJAXBValidationException.java   | 31 +++++++
 .../apache/lens/api/result/LensAPIResult.java   | 11 ++-
 .../org/apache/lens/api/result/LensErrorTO.java |  8 +-
 .../api/result/LensJAXBContextResolver.java     | 77 -----------------
 lens-api/src/main/resources/cube-0.1.xsd        | 12 +--
 lens-api/src/main/resources/lens-errors.conf    | 79 +++++++++--------
 .../apache/lens/client/LensMetadataClient.java  | 18 +---
 .../apache/lens/examples/SampleMetastore.java   | 11 +--
 .../org/apache/lens/regression/util/Util.java   | 26 +++---
 .../java/org/apache/lens/server/LensServer.java |  4 +-
 .../LensJAXBValidationExceptionMapper.java      | 53 ++++++++++++
 .../lens/server/metastore/MetastoreApp.java     |  6 ++
 .../server/metastore/MetastoreResource.java     | 13 ++-
 .../lens/server/query/QueryServiceResource.java |  2 +-
 .../server/metastore/TestMetastoreService.java  | 43 ++++++++-
 .../server/query/QueryAPIErrorResponseTest.java | 47 +++++-----
 .../lens/server/query/TestQueryService.java     |  1 +
 22 files changed, 418 insertions(+), 203 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/APIResult.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/APIResult.java b/lens-api/src/main/java/org/apache/lens/api/APIResult.java
index 6b734a9..06c608a 100644
--- a/lens-api/src/main/java/org/apache/lens/api/APIResult.java
+++ b/lens-api/src/main/java/org/apache/lens/api/APIResult.java
@@ -25,6 +25,8 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.annotation.*;
 
+import org.apache.lens.api.jaxb.LensJAXBContext;
+
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -62,7 +64,7 @@ public class APIResult {
 
   static {
     try {
-      JAXB_CONTEXT = JAXBContext.newInstance(APIResult.class);
+      JAXB_CONTEXT = new LensJAXBContext(APIResult.class);
     } catch (JAXBException e) {
       throw new RuntimeException(e);
     }
@@ -71,7 +73,7 @@ public class APIResult {
   /**
    * API Result status.
    */
-  public static enum Status {
+  public enum Status {
 
     /**
      * The succeeded.

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/LensSessionHandle.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/LensSessionHandle.java b/lens-api/src/main/java/org/apache/lens/api/LensSessionHandle.java
index b3aa584..d4327a6 100644
--- a/lens-api/src/main/java/org/apache/lens/api/LensSessionHandle.java
+++ b/lens-api/src/main/java/org/apache/lens/api/LensSessionHandle.java
@@ -32,6 +32,8 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.lens.api.jaxb.LensJAXBContext;
+
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -77,7 +79,7 @@ public class LensSessionHandle {
 
   static {
     try {
-      JAXB_CONTEXT = JAXBContext.newInstance(LensSessionHandle.class);
+      JAXB_CONTEXT = new LensJAXBContext(LensSessionHandle.class);
     } catch (JAXBException e) {
       throw new RuntimeException(e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/error/LensCommonErrorCode.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/error/LensCommonErrorCode.java b/lens-api/src/main/java/org/apache/lens/api/error/LensCommonErrorCode.java
index 06343c2..754e6e1 100644
--- a/lens-api/src/main/java/org/apache/lens/api/error/LensCommonErrorCode.java
+++ b/lens-api/src/main/java/org/apache/lens/api/error/LensCommonErrorCode.java
@@ -24,7 +24,9 @@ package org.apache.lens.api.error;
  */
 public enum LensCommonErrorCode {
 
-  INTERNAL_SERVER_ERROR(1001);
+  INTERNAL_SERVER_ERROR(1001),
+
+  INVALID_XML_ERROR(1002);
 
   public int getValue() {
     return this.errorCode;

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContext.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContext.java b/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContext.java
new file mode 100644
index 0000000..85a47ec
--- /dev/null
+++ b/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContext.java
@@ -0,0 +1,91 @@
+/**
+ * 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.lens.api.jaxb;
+
+import java.net.URL;
+
+import javax.xml.XMLConstants;
+import javax.xml.bind.*;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.util.ValidationEventCollector;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.xml.sax.SAXException;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class LensJAXBContext extends JAXBContext {
+  private final JAXBContext jaxbContext;
+  private final boolean hasTopLevelClass;
+
+  public LensJAXBContext(Class... classesToBeBoundArray) throws JAXBException {
+    jaxbContext = JAXBContext.newInstance(classesToBeBoundArray);
+    boolean hasTopLevelClass = false;
+    for (Class clas : classesToBeBoundArray) {
+      if (clas.isAnnotationPresent(XmlRootElement.class)) {
+        hasTopLevelClass = true;
+        break;
+      }
+    }
+    this.hasTopLevelClass = hasTopLevelClass;
+  }
+
+  @Override
+  public Unmarshaller createUnmarshaller() throws JAXBException {
+    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+    if (!hasTopLevelClass) {
+      ClassLoader classLoader = LensJAXBContext.class.getClassLoader();
+      SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+      try {
+        URL resource = classLoader.getResource("cube-0.1.xsd");
+        Schema schema = sf.newSchema(resource);
+        unmarshaller.setSchema(schema);
+      } catch (SAXException e) {
+        throw new JAXBException(e);
+      }
+    }
+    unmarshaller.setEventHandler(new LensValidationEventCollector());
+    return unmarshaller;
+  }
+
+  @Override
+  public Marshaller createMarshaller() throws JAXBException {
+    return jaxbContext.createMarshaller();
+  }
+
+  @Override
+  public Validator createValidator() throws JAXBException {
+    return jaxbContext.createValidator();
+  }
+
+  private static class LensValidationEventCollector extends ValidationEventCollector {
+    @Override
+    public boolean handleEvent(ValidationEvent event) {
+      if (event.getSeverity() == event.ERROR || event.getSeverity() == event.FATAL_ERROR) {
+        throw new LensJAXBValidationException(event);
+      }
+      return true;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContextResolver.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContextResolver.java b/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContextResolver.java
new file mode 100644
index 0000000..6a5ca29
--- /dev/null
+++ b/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBContextResolver.java
@@ -0,0 +1,74 @@
+/**
+ * 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.lens.api.jaxb;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+
+import org.apache.lens.api.error.ErrorCollection;
+import org.apache.lens.api.error.ErrorCollectionFactory;
+import org.apache.lens.api.result.LensAPIResult;
+
+import com.google.common.collect.Sets;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @see javax.ws.rs.ext.ContextResolver
+ */
+@Provider
+@Slf4j
+public class LensJAXBContextResolver implements ContextResolver<JAXBContext> {
+
+  private Map<Class, JAXBContext> jaxbContextCache = new ConcurrentHashMap<Class, JAXBContext>();
+
+  @Override
+  public JAXBContext getContext(Class<?> type) {
+
+    JAXBContext jaxbContext = jaxbContextCache.get(type);
+
+    if (jaxbContext == null) {
+
+      log.debug("JAXB instance to be created for {}", type);
+      try {
+        if (type.equals(LensAPIResult.class)) {
+
+          ErrorCollection errorCollection = new ErrorCollectionFactory().createErrorCollection();
+          Set<Class> classesToBeBound = Sets.newHashSet(errorCollection.getErrorPayloadClasses());
+          log.debug("classesToBeBound:{}", classesToBeBound);
+          classesToBeBound.add(type);
+          Class[] classesToBeBoundArray = classesToBeBound.toArray(new Class[classesToBeBound.size()]);
+          jaxbContext = new LensJAXBContext(classesToBeBoundArray);
+        } else {
+          jaxbContext = new LensJAXBContext(type);
+        }
+        jaxbContextCache.put(type, jaxbContext);
+
+      } catch (JAXBException | ClassNotFoundException e) {
+        log.error("JAXBContext not initialized for " + type, e);
+      }
+    }
+    return jaxbContext;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBValidationException.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBValidationException.java b/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBValidationException.java
new file mode 100644
index 0000000..0847976
--- /dev/null
+++ b/lens-api/src/main/java/org/apache/lens/api/jaxb/LensJAXBValidationException.java
@@ -0,0 +1,31 @@
+/**
+ * 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.lens.api.jaxb;
+
+import javax.xml.bind.ValidationEvent;
+
+import lombok.Data;
+
+@Data
+public class LensJAXBValidationException extends RuntimeException {
+  private final ValidationEvent event;
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/result/LensAPIResult.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/result/LensAPIResult.java b/lens-api/src/main/java/org/apache/lens/api/result/LensAPIResult.java
index 41805eb..238f9e6 100644
--- a/lens-api/src/main/java/org/apache/lens/api/result/LensAPIResult.java
+++ b/lens-api/src/main/java/org/apache/lens/api/result/LensAPIResult.java
@@ -63,21 +63,20 @@ public class LensAPIResult<DATA> {
 
   public static <DATA> LensAPIResult<DATA> composedOf(final String apiVersion,
       final String id, @NonNull final DATA data) {
-
-    return new LensAPIResult<DATA>(apiVersion, id, data, null, Status.OK);
+    return composedOf(apiVersion, id, data, Status.OK);
   }
 
   public static <DATA> LensAPIResult<DATA> composedOf(final String apiVersion,
       final String id, @NonNull final DATA data, @NonNull final Status httpStatusCode) {
 
-    return new LensAPIResult<DATA>(apiVersion, id, data, null, httpStatusCode);
+    return new LensAPIResult<>(apiVersion, id, data, null, httpStatusCode);
   }
 
-  public static <PAYLOAD> LensAPIResult<NoResultData> composedOf(
+  public static LensAPIResult<NoResultData> composedOf(
       final String apiVersion, final String id, @NonNull final LensErrorTO lensErrorTO,
       @NonNull final Status httpStatusCode) {
 
-    return new LensAPIResult<NoResultData>(apiVersion, id, null, lensErrorTO, httpStatusCode);
+    return new LensAPIResult<>(apiVersion, id, null, lensErrorTO, httpStatusCode);
   }
 
   private LensAPIResult(final String apiVersion, final String id, final DATA data, final LensErrorTO lensErrorTO,
@@ -98,7 +97,7 @@ public class LensAPIResult<DATA> {
   }
 
   public boolean areValidStackTracesPresent() {
-    return (lensErrorTO == null) ? false : lensErrorTO.areValidStackTracesPresent();
+    return (lensErrorTO != null) && lensErrorTO.areValidStackTracesPresent();
   }
 
   public Status getHttpStatusCode() {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/result/LensErrorTO.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/result/LensErrorTO.java b/lens-api/src/main/java/org/apache/lens/api/result/LensErrorTO.java
index a2aca36..aa880f4 100644
--- a/lens-api/src/main/java/org/apache/lens/api/result/LensErrorTO.java
+++ b/lens-api/src/main/java/org/apache/lens/api/result/LensErrorTO.java
@@ -67,25 +67,25 @@ public class LensErrorTO<PAYLOAD> implements Serializable {
   public static <PAYLOAD> LensErrorTO<PAYLOAD> composedOf(final int code, final String message,
       final String stackTrace, final PAYLOAD payload, final List<LensErrorTO> childErrors) {
 
-    return new LensErrorTO<PAYLOAD>(code, message, stackTrace, payload, childErrors);
+    return new LensErrorTO<>(code, message, stackTrace, payload, childErrors);
   }
 
   public static <PAYLOAD> LensErrorTO<PAYLOAD> composedOf(final int code, final String message,
       final String stackTrace, final PAYLOAD payload) {
 
-    return new LensErrorTO<PAYLOAD>(code, message, stackTrace, payload, null);
+    return new LensErrorTO<>(code, message, stackTrace, payload, null);
   }
 
   public static LensErrorTO<NoErrorPayload> composedOf(final int code, final String message,
       final String stackTrace) {
 
-    return new LensErrorTO<NoErrorPayload>(code, message, stackTrace, null, null);
+    return new LensErrorTO<>(code, message, stackTrace, null, null);
   }
 
   public static LensErrorTO<NoErrorPayload> composedOf(final int code, final String message,
       final String stackTrace, final List<LensErrorTO> childErrors) {
 
-    return new LensErrorTO<NoErrorPayload>(code, message, stackTrace, null, childErrors);
+    return new LensErrorTO<>(code, message, stackTrace, null, childErrors);
   }
 
   private LensErrorTO(final int code, final String message, final String stackTrace, final PAYLOAD errorPayload,

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/java/org/apache/lens/api/result/LensJAXBContextResolver.java
----------------------------------------------------------------------
diff --git a/lens-api/src/main/java/org/apache/lens/api/result/LensJAXBContextResolver.java b/lens-api/src/main/java/org/apache/lens/api/result/LensJAXBContextResolver.java
deleted file mode 100644
index 5b48578..0000000
--- a/lens-api/src/main/java/org/apache/lens/api/result/LensJAXBContextResolver.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * 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.lens.api.result;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-
-import org.apache.lens.api.error.ErrorCollection;
-import org.apache.lens.api.error.ErrorCollectionFactory;
-
-import com.google.common.collect.Sets;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * @see javax.ws.rs.ext.ContextResolver
- */
-@Provider
-@Slf4j
-public class LensJAXBContextResolver implements ContextResolver<JAXBContext> {
-
-  private Map<Class, JAXBContext> jaxbContextCache = new ConcurrentHashMap<Class, JAXBContext>();
-
-  @Override
-  public JAXBContext getContext(Class<?> type) {
-
-    JAXBContext jaxbContext = jaxbContextCache.get(type);
-
-    if (jaxbContext == null) {
-
-      log.debug("JAXB instance to be created for {}", type);
-      try {
-        if (type.equals(LensAPIResult.class)) {
-
-          ErrorCollection errorCollection = new ErrorCollectionFactory().createErrorCollection();
-          Set<Class> classesToBeBound = Sets.newHashSet(errorCollection.getErrorPayloadClasses());
-          log.debug("classesToBeBound:{}", classesToBeBound);
-          classesToBeBound.add(type);
-
-          Class[] classesToBeBoundArray = classesToBeBound.toArray(new Class[classesToBeBound.size()]);
-          jaxbContext = JAXBContext.newInstance(classesToBeBoundArray);
-        } else {
-
-          jaxbContext = JAXBContext.newInstance(type);
-        }
-        jaxbContextCache.put(type, jaxbContext);
-
-      } catch (JAXBException e) {
-        log.error("JAXBContext not initialized for "+type, e);
-      } catch (ClassNotFoundException e) {
-        log.error("JAXBContext not initialized for "+type, e);
-      }
-    }
-    return jaxbContext;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/resources/cube-0.1.xsd
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/cube-0.1.xsd b/lens-api/src/main/resources/cube-0.1.xsd
index 7ebb5a1..e6cb87d 100644
--- a/lens-api/src/main/resources/cube-0.1.xsd
+++ b/lens-api/src/main/resources/cube-0.1.xsd
@@ -65,7 +65,7 @@
     </xs:sequence>
   </xs:complexType>
 
-  <xs:element name="x_cube" abstract="true" type="x_cube"/>
+  <xs:element name="x_cube" type="x_cube"/>
 
   <xs:complexType name="x_cube" abstract="true">
     <xs:annotation>
@@ -213,7 +213,7 @@
       </xs:documentation>
     </xs:annotation>
     <xs:sequence>
-      <xs:element type="x_property" name="property" maxOccurs="unbounded" minOccurs="1"/>
+      <xs:element type="x_property" name="property" maxOccurs="unbounded" minOccurs="0"/>
     </xs:sequence>
   </xs:complexType>
 
@@ -521,7 +521,7 @@
       </xs:documentation>
     </xs:annotation>
     <xs:sequence>
-      <xs:element type="x_join_chain" name="join_chain" maxOccurs="unbounded" minOccurs="1"/>
+      <xs:element type="x_join_chain" name="join_chain" maxOccurs="unbounded" minOccurs="0"/>
     </xs:sequence>
   </xs:complexType>
 
@@ -664,7 +664,7 @@
       </xs:annotation>
       <xs:simpleType>
         <xs:restriction base="xs:double">
-          <xs:minExclusive value="0"></xs:minExclusive>
+          <xs:minInclusive value="0"></xs:minInclusive>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
@@ -672,7 +672,7 @@
 
   <xs:complexType name="x_update_periods">
     <xs:sequence>
-      <xs:element name="update_period" type="x_update_period" maxOccurs="unbounded" minOccurs="1"/>
+      <xs:element name="update_period" type="x_update_period" maxOccurs="unbounded" minOccurs="0"/>
     </xs:sequence>
   </xs:complexType>
 
@@ -1201,7 +1201,7 @@
       </xs:annotation>
       <xs:simpleType>
         <xs:restriction base="xs:double">
-          <xs:minExclusive value="0"></xs:minExclusive>
+          <xs:minInclusive value="0"></xs:minInclusive>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-api/src/main/resources/lens-errors.conf
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/lens-errors.conf b/lens-api/src/main/resources/lens-errors.conf
index 6130ad7..e6715b6 100644
--- a/lens-api/src/main/resources/lens-errors.conf
+++ b/lens-api/src/main/resources/lens-errors.conf
@@ -38,30 +38,35 @@ lensCommonErrors = [
     errorMsg = "Internal Server Error."
   }
 
+  {
+    errorCode = 1002
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "XML invalid: %s"
+  }
 ]
 
 # lensServerErrors: Defined for lens-server module
 
 lensServerErrors = [
 
- {
-   errorCode = 2001
-   httpStatusCode = ${BAD_REQUEST}
-   errorMsg = "Session id not provided. Please provide a session id."
- }
-
- {
-   errorCode = 2002
-   httpStatusCode = ${BAD_REQUEST}
-   errorMsg = "Query is not provided, or it is empty or blank. Please provide a valid query."
- }
-
- {
-   errorCode = 2003
-   httpStatusCode = ${BAD_REQUEST}
-   errorMsg = "Provided Operation is not supported. Supported Operations are: [%s]"
-   payloadClass = org.apache.lens.api.query.SupportedQuerySubmitOperations
- }
+  {
+    errorCode = 2001
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "Session id not provided. Please provide a session id."
+  }
+
+  {
+    errorCode = 2002
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "Query is not provided, or it is empty or blank. Please provide a valid query."
+  }
+
+  {
+    errorCode = 2003
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "Provided Operation is not supported. Supported Operations are: [%s]"
+    payloadClass = org.apache.lens.api.query.SupportedQuerySubmitOperations
+  }
 
 ]
 
@@ -69,25 +74,25 @@ lensServerErrors = [
 
 lensCubeErrors = [
 
- {
-   errorCode = 3001
-   httpStatusCode = ${BAD_REQUEST}
-   errorMsg = "Syntax Error: %s"
- }
-
- {
-   errorCode = 3002
-   httpStatusCode = ${BAD_REQUEST}
-   errorMsg = "%s can only be queried %s. Please adjust the selected time range accordingly."
-   payloadClass = org.apache.lens.cube.error.ColUnAvailableInTimeRange
- }
-
- {
-   errorCode = 3003
-   httpStatusCode = ${BAD_REQUEST}
-   errorMsg = "%s. Please remove conflicting fields and try again."
-   payloadClass = org.apache.lens.cube.error.ConflictingFields
- }
+  {
+    errorCode = 3001
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "Syntax Error: %s"
+  }
+
+  {
+    errorCode = 3002
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "%s can only be queried %s. Please adjust the selected time range accordingly."
+    payloadClass = org.apache.lens.cube.error.ColUnAvailableInTimeRange
+  }
+
+  {
+    errorCode = 3003
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "%s. Please remove conflicting fields and try again."
+    payloadClass = org.apache.lens.cube.error.ConflictingFields
+  }
 
 ]
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
----------------------------------------------------------------------
diff --git a/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java b/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
index 169170c..3637ab8 100644
--- a/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
+++ b/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
@@ -21,27 +21,21 @@ package org.apache.lens.client;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Date;
 import java.util.List;
 
 import javax.ws.rs.client.*;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
-import javax.xml.XMLConstants;
 import javax.xml.bind.*;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
 
 import org.apache.lens.api.APIResult;
 import org.apache.lens.api.DateTime;
 import org.apache.lens.api.StringList;
+import org.apache.lens.api.jaxb.LensJAXBContext;
 import org.apache.lens.api.metastore.*;
 
 import org.glassfish.jersey.media.multipart.*;
-import org.xml.sax.SAXException;
 
 import com.google.common.base.Joiner;
 import lombok.extern.slf4j.Slf4j;
@@ -57,15 +51,9 @@ public class LensMetadataClient {
 
   static {
     try {
-      ClassLoader classLoader = LensMetadataClient.class.getClassLoader();
-      SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-      URI uri = classLoader.getResource("cube-0.1.xsd").toURI();
-      log.info("URI for cube schema: {}", uri.toString());
-      Schema schema = sf.newSchema(uri.toURL());
-      JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
+      JAXBContext jaxbContext = new LensJAXBContext(ObjectFactory.class);
       JAXB_UNMARSHALLER = jaxbContext.createUnmarshaller();
-      JAXB_UNMARSHALLER.setSchema(schema);
-    } catch (JAXBException | URISyntaxException | MalformedURLException | SAXException e) {
+    } catch (JAXBException e) {
       log.error("Could not initialize JAXBContext. ", e);
       throw new RuntimeException("Could not initialize JAXBContext. ", e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-examples/src/main/java/org/apache/lens/examples/SampleMetastore.java
----------------------------------------------------------------------
diff --git a/lens-examples/src/main/java/org/apache/lens/examples/SampleMetastore.java b/lens-examples/src/main/java/org/apache/lens/examples/SampleMetastore.java
index 4699dbb..1fbd358 100644
--- a/lens-examples/src/main/java/org/apache/lens/examples/SampleMetastore.java
+++ b/lens-examples/src/main/java/org/apache/lens/examples/SampleMetastore.java
@@ -21,12 +21,10 @@ package org.apache.lens.examples;
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.*;
 
 import org.apache.lens.api.APIResult;
+import org.apache.lens.api.jaxb.LensJAXBContext;
 import org.apache.lens.api.metastore.ObjectFactory;
 import org.apache.lens.client.LensClientSingletonWrapper;
 import org.apache.lens.client.LensMetadataClient;
@@ -44,7 +42,7 @@ public class SampleMetastore {
   static {
     try {
       JAXBContext jaxbContext;
-      jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
+      jaxbContext = new LensJAXBContext(ObjectFactory.class);
       JAXB_UNMARSHALLER = jaxbContext.createUnmarshaller();
     } catch (JAXBException e) {
       throw new RuntimeException("Could not initialize JAXBCOntext");
@@ -87,6 +85,7 @@ public class SampleMetastore {
       retCode = 1;
     }
   }
+
   public void createDimensions() throws JAXBException, IOException {
     createDimension("sample-dimension.xml");
     createDimension("sample-dimension2.xml");
@@ -133,6 +132,7 @@ public class SampleMetastore {
       retCode = 1;
     }
   }
+
   private void createDimensionTables() throws JAXBException, IOException {
     createDimTable("dim_table.xml");
     createDimTable("dim_table2.xml");
@@ -152,6 +152,7 @@ public class SampleMetastore {
       retCode = 1;
     }
   }
+
   private void createFacts() throws JAXBException, IOException {
     createFact("fact1.xml");
     createFact("fact2.xml");

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-regression/src/main/java/org/apache/lens/regression/util/Util.java
----------------------------------------------------------------------
diff --git a/lens-regression/src/main/java/org/apache/lens/regression/util/Util.java b/lens-regression/src/main/java/org/apache/lens/regression/util/Util.java
index 6a2bc6b..0e531e0 100644
--- a/lens-regression/src/main/java/org/apache/lens/regression/util/Util.java
+++ b/lens-regression/src/main/java/org/apache/lens/regression/util/Util.java
@@ -21,23 +21,17 @@ package org.apache.lens.regression.util;
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-import java.util.StringTokenizer;
+import java.util.*;
 
 import javax.ws.rs.core.Response;
 import javax.xml.bind.*;
 
 import org.apache.lens.api.APIResult;
 import org.apache.lens.api.StringList;
+import org.apache.lens.api.jaxb.LensJAXBContext;
 import org.apache.lens.api.metastore.ObjectFactory;
 
-import com.jcraft.jsch.ChannelExec;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
-
+import com.jcraft.jsch.*;
 import lombok.extern.slf4j.Slf4j;
 
 
@@ -134,12 +128,12 @@ public class Util {
 
   @SuppressWarnings("unchecked")
   public static <T> Object extractObject(String queryString, Class<T> c) throws
-      InstantiationException, IllegalAccessException {
+    InstantiationException, IllegalAccessException {
     JAXBContext jaxbContext = null;
     Unmarshaller unmarshaller = null;
     StringReader reader = new StringReader(queryString);
     try {
-      jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
+      jaxbContext = new LensJAXBContext(ObjectFactory.class) {};
       unmarshaller = jaxbContext.createUnmarshaller();
       return (T) ((JAXBElement<?>) unmarshaller.unmarshal(reader)).getValue();
     } catch (JAXBException e) {
@@ -150,12 +144,12 @@ public class Util {
 
   @SuppressWarnings("unchecked")
   public static <T> Object getObject(String queryString, Class<T> c) throws
-      InstantiationException, IllegalAccessException {
+    InstantiationException, IllegalAccessException {
     JAXBContext jaxbContext = null;
     Unmarshaller unmarshaller = null;
     StringReader reader = new StringReader(queryString);
     try {
-      jaxbContext = JAXBContext.newInstance(c);
+      jaxbContext = new LensJAXBContext(c);
       unmarshaller = jaxbContext.createUnmarshaller();
       return (T) unmarshaller.unmarshal(reader);
     } catch (JAXBException e) {
@@ -166,8 +160,8 @@ public class Util {
 
   @SuppressWarnings("unchecked")
   public static <T> String convertObjectToXml(T object, Class<T> clazz, String functionName) throws
-      SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
-      InvocationTargetException {
+    SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
+    InvocationTargetException {
     JAXBElement<T> root = null;
     StringWriter stringWriter = new StringWriter();
     ObjectFactory methodObject = new ObjectFactory();
@@ -185,7 +179,7 @@ public class Util {
   public static Marshaller getMarshaller(Class clazz) {
     JAXBContext jaxbContext = null;
     try {
-      jaxbContext = JAXBContext.newInstance(clazz);
+      jaxbContext = new LensJAXBContext(clazz);
       Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
       jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/main/java/org/apache/lens/server/LensServer.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/LensServer.java b/lens-server/src/main/java/org/apache/lens/server/LensServer.java
index 55332e2..61eb37f 100644
--- a/lens-server/src/main/java/org/apache/lens/server/LensServer.java
+++ b/lens-server/src/main/java/org/apache/lens/server/LensServer.java
@@ -25,10 +25,11 @@ import java.util.logging.Logger;
 
 import javax.ws.rs.core.UriBuilder;
 
-import org.apache.lens.api.result.LensJAXBContextResolver;
+import org.apache.lens.api.jaxb.LensJAXBContextResolver;
 import org.apache.lens.server.api.LensConfConstants;
 import org.apache.lens.server.api.metrics.MetricsService;
 import org.apache.lens.server.error.LensExceptionMapper;
+import org.apache.lens.server.error.LensJAXBValidationExceptionMapper;
 import org.apache.lens.server.metrics.MetricsServiceImpl;
 import org.apache.lens.server.model.MappedDiagnosticLogSegregationContext;
 import org.apache.lens.server.ui.UIApp;
@@ -112,6 +113,7 @@ public class LensServer {
     ResourceConfig app = ResourceConfig.forApplicationClass(LensApplication.class);
     app.register(new LoggingFilter(Logger.getLogger(LensServer.class.getName() + ".request"), true));
     app.register(LensExceptionMapper.class);
+    app.register(LensJAXBValidationExceptionMapper.class);
     app.register(LensJAXBContextResolver.class);
     app.setApplicationName("AllApps");
     return app;

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/main/java/org/apache/lens/server/error/LensJAXBValidationExceptionMapper.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/error/LensJAXBValidationExceptionMapper.java b/lens-server/src/main/java/org/apache/lens/server/error/LensJAXBValidationExceptionMapper.java
new file mode 100644
index 0000000..580c615
--- /dev/null
+++ b/lens-server/src/main/java/org/apache/lens/server/error/LensJAXBValidationExceptionMapper.java
@@ -0,0 +1,53 @@
+/**
+ * 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.lens.server.error;
+
+import java.util.Arrays;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.xml.bind.ValidationEvent;
+import javax.xml.bind.ValidationEventLocator;
+
+import org.apache.lens.api.error.LensCommonErrorCode;
+import org.apache.lens.api.jaxb.LensJAXBValidationException;
+import org.apache.lens.api.result.LensAPIResult;
+import org.apache.lens.api.result.LensErrorTO;
+import org.apache.lens.server.model.MappedDiagnosticLogSegregationContext;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class LensJAXBValidationExceptionMapper implements ExceptionMapper<LensJAXBValidationException> {
+  @Override
+  public Response toResponse(LensJAXBValidationException e) {
+    ValidationEvent event = e.getEvent();
+    ValidationEventLocator vel = event.getLocator();
+    String msg = "XML Validation Exception:  " + event.getMessage() + " at row: " + vel.getLineNumber() + " column: "
+      + vel.getColumnNumber();
+    LensAPIResult lensAPIResult =
+      LensAPIResult.composedOf(null, new MappedDiagnosticLogSegregationContext().getLogSegragationId(),
+        LensErrorTO.composedOf(LensCommonErrorCode.INVALID_XML_ERROR.getValue(), msg,
+          Arrays.toString(e.getStackTrace())), Response.Status.BAD_REQUEST);
+    return Response.status(Response.Status.BAD_REQUEST).entity(lensAPIResult).build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreApp.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreApp.java b/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreApp.java
index 367da2d..520c698 100644
--- a/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreApp.java
+++ b/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreApp.java
@@ -25,7 +25,10 @@ import java.util.Set;
 import javax.ws.rs.ApplicationPath;
 import javax.ws.rs.core.Application;
 
+import org.apache.lens.api.jaxb.LensJAXBContextResolver;
 import org.apache.lens.server.LensApplicationListener;
+import org.apache.lens.server.LensRequestContextInitFilter;
+import org.apache.lens.server.error.LensJAXBValidationExceptionMapper;
 
 import org.glassfish.jersey.filter.LoggingFilter;
 import org.glassfish.jersey.media.multipart.MultiPartFeature;
@@ -40,6 +43,9 @@ public class MetastoreApp extends Application {
     classes.add(LoggingFilter.class);
     classes.add(MultiPartFeature.class);
     classes.add(LensApplicationListener.class);
+    classes.add(LensJAXBContextResolver.class);
+    classes.add(LensRequestContextInitFilter.class);
+    classes.add(LensJAXBValidationExceptionMapper.class);
     return classes;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java b/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java
index 35874ea..0748d5b 100644
--- a/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java
+++ b/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java
@@ -70,6 +70,11 @@ public class MetastoreResource {
     }
   }
 
+  private void checkNonNullPartitionList(XPartitionList partitions) {
+    checkNonNullArgs("Partition List is null", partitions);
+    checkNonNullArgs("One partition is null", partitions.getPartition().toArray());
+  }
+
   /**
    * API to know if metastore service is up and running
    *
@@ -1105,7 +1110,7 @@ public class MetastoreResource {
     @PathParam("storage") String storage,
     XPartitionList partitions) {
     checkSessionId(sessionid);
-    checkNonNullArgs("Partition List is null", partitions);
+    checkNonNullPartitionList(partitions);
     try {
       return successOrPartialOrFailure(getSvc().addPartitionsToFactStorage(sessionid, factName, storage, partitions),
         partitions.getPartition().size());
@@ -1134,7 +1139,7 @@ public class MetastoreResource {
     @PathParam("storage") String storage,
     XPartitionList partitions) {
     checkSessionId(sessionid);
-    checkNonNullArgs("Partition List is null", partitions);
+    checkNonNullPartitionList(partitions);
     try {
       getSvc().updatePartitions(sessionid, factName, storage, partitions);
     } catch (LensException exc) {
@@ -1533,7 +1538,7 @@ public class MetastoreResource {
     @PathParam("storage") String storage,
     XPartitionList partitions) {
     checkSessionId(sessionid);
-    checkNonNullArgs("Partition list is null", partitions);
+    checkNonNullPartitionList(partitions);
     try {
       return successOrPartialOrFailure(getSvc().addPartitionsToDimStorage(sessionid, dimTableName, storage, partitions),
         partitions.getPartition().size());
@@ -1561,7 +1566,7 @@ public class MetastoreResource {
     @PathParam("storage") String storage,
     XPartitionList partitions) {
     checkSessionId(sessionid);
-    checkNonNullArgs("Partition list is null", partitions);
+    checkNonNullPartitionList(partitions);
     try {
       getSvc().updatePartitions(sessionid, dimTableName, storage, partitions);
     } catch (LensException exc) {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/main/java/org/apache/lens/server/query/QueryServiceResource.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/query/QueryServiceResource.java b/lens-server/src/main/java/org/apache/lens/server/query/QueryServiceResource.java
index d3c443a..6bfd77a 100644
--- a/lens-server/src/main/java/org/apache/lens/server/query/QueryServiceResource.java
+++ b/lens-server/src/main/java/org/apache/lens/server/query/QueryServiceResource.java
@@ -205,7 +205,7 @@ public class QueryServiceResource {
   @Consumes({MediaType.MULTIPART_FORM_DATA})
   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN})
   @MultiPurposeResource(formParamName = "operation")
-  public LensAPIResult<QuerySubmitResult> query(@FormDataParam("sessionid") LensSessionHandle sessionid,
+  public LensAPIResult<? extends QuerySubmitResult> query(@FormDataParam("sessionid") LensSessionHandle sessionid,
       @FormDataParam("query") String query, @FormDataParam("operation") String operation,
       @FormDataParam("conf") LensConf conf, @DefaultValue("30000") @FormDataParam("timeoutmillis") Long timeoutmillis,
       @DefaultValue("") @FormDataParam("queryName") String queryName) throws LensException {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java b/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
index 924187f..6e3afc6 100644
--- a/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
+++ b/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
@@ -36,7 +36,9 @@ import javax.xml.datatype.XMLGregorianCalendar;
 
 import org.apache.lens.api.*;
 import org.apache.lens.api.APIResult.Status;
+import org.apache.lens.api.error.LensCommonErrorCode;
 import org.apache.lens.api.metastore.*;
+import org.apache.lens.api.result.LensAPIResult;
 import org.apache.lens.cube.metadata.*;
 import org.apache.lens.cube.metadata.ExprColumn.ExprSpec;
 import org.apache.lens.server.LensJerseyTest;
@@ -1043,7 +1045,6 @@ public class TestMetastoreService extends LensJerseyTest {
     dimension.setExpressions(new XExpressions());
     dimension.setJoinChains(new XJoinChains());
     dimension.setProperties(new XProperties());
-
     XDimAttribute xd1 = cubeObjectFactory.createXDimAttribute();
     xd1.setName("col1");
     xd1.setType("STRING");
@@ -2067,7 +2068,22 @@ public class TestMetastoreService extends LensJerseyTest {
         .queryParam("sessionid", lensSessionId).request(mediaType)
         .post(null);
       Assert.assertEquals(resp.getStatus(), 400);
-      // Add again, in batch this time
+
+      // Try adding in batch, but to a wrong endpoint
+      resp = target().path("metastore/facts/").path(table).path("storages/S2/partition")
+        .queryParam("sessionid", lensSessionId).request(mediaType)
+        .post(Entity.xml(cubeObjectFactory.createXPartitionList(toXPartitionList(xp))));
+      assertXMLError(resp);
+
+
+      // Try adding in batch, but provide just an XPartition
+      resp = target().path("metastore/facts/").path(table).path("storages/S2/partitions")
+        .queryParam("sessionid", lensSessionId).request(mediaType)
+        .post(Entity.xml(cubeObjectFactory.createXPartition(xp)));
+      assertXMLError(resp);
+
+
+      // Add in batch
       partAddResult = target().path("metastore/facts/").path(table).path("storages/S2/partitions")
         .queryParam("sessionid", lensSessionId).request(mediaType)
         .post(Entity.xml(cubeObjectFactory.createXPartitionList(toXPartitionList(xp))),
@@ -2216,7 +2232,20 @@ public class TestMetastoreService extends LensJerseyTest {
         .queryParam("sessionid", lensSessionId).request(mediaType)
         .post(null);
       Assert.assertEquals(resp.getStatus(), 400);
-      // Add again, this time in batch
+
+      // Try adding in batch, but to a wrong endpoint
+      resp = target().path("metastore/dimtables/").path(table).path("storages/test/partition")
+        .queryParam("sessionid", lensSessionId).request(mediaType)
+        .post(Entity.xml(cubeObjectFactory.createXPartitionList(toXPartitionList(xp))));
+      assertXMLError(resp);
+
+      // Try adding in batch, but provide just an XPartition
+      resp = target().path("metastore/dimtables/").path(table).path("storages/test/partitions")
+        .queryParam("sessionid", lensSessionId).request(mediaType)
+        .post(Entity.xml(cubeObjectFactory.createXPartition(xp)));
+      assertXMLError(resp);
+
+      // Add in batch
       partAddResult = target().path("metastore/dimtables/").path(table).path("storages/test/partitions")
         .queryParam("sessionid", lensSessionId).request(mediaType)
         .post(Entity.xml(cubeObjectFactory.createXPartitionList(toXPartitionList(xp))),
@@ -2254,6 +2283,14 @@ public class TestMetastoreService extends LensJerseyTest {
     }
   }
 
+  private void assertXMLError(Response resp) {
+    assertEquals(resp.getStatus(), 400);
+    LensAPIResult entity = resp.readEntity(LensAPIResult.class);
+    assertTrue(entity.isErrorResult());
+    assertEquals(entity.getLensErrorTO().getCode(), LensCommonErrorCode.INVALID_XML_ERROR.getValue());
+    assertTrue(entity.getLensErrorTO().getMessage().contains("unexpected element"));
+  }
+
   private XPartitionList toXPartitionList(final XPartition... xps) {
     XPartitionList ret = new XPartitionList();
     Collections.addAll(ret.getPartition(), xps);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java b/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
index 9a45512..2189eb8 100644
--- a/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
+++ b/lens-server/src/test/java/org/apache/lens/server/query/QueryAPIErrorResponseTest.java
@@ -37,18 +37,16 @@ import javax.xml.datatype.DatatypeConfigurationException;
 
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
-import org.apache.lens.api.metastore.XColumn;
-import org.apache.lens.api.metastore.XCube;
-import org.apache.lens.api.metastore.XDimAttribute;
-import org.apache.lens.api.metastore.XFactTable;
+import org.apache.lens.api.jaxb.LensJAXBContextResolver;
+import org.apache.lens.api.metastore.*;
 import org.apache.lens.api.query.SupportedQuerySubmitOperations;
 import org.apache.lens.api.result.LensErrorTO;
-import org.apache.lens.api.result.LensJAXBContextResolver;
 import org.apache.lens.cube.error.ColUnAvailableInTimeRange;
 import org.apache.lens.server.LensJerseyTest;
 import org.apache.lens.server.LensRequestContextInitFilter;
 import org.apache.lens.server.common.ErrorResponseExpectedData;
 import org.apache.lens.server.error.LensExceptionMapper;
+import org.apache.lens.server.error.LensJAXBValidationExceptionMapper;
 import org.apache.lens.server.metastore.MetastoreResource;
 import org.apache.lens.server.session.SessionResource;
 
@@ -92,7 +90,8 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
     enable(TestProperties.DUMP_ENTITY);
 
     return new ResourceConfig(LensRequestContextInitFilter.class, SessionResource.class, MetastoreResource.class,
-        QueryServiceResource.class, MultiPartFeature.class, LensExceptionMapper.class, LensJAXBContextResolver.class);
+      QueryServiceResource.class, MultiPartFeature.class, LensExceptionMapper.class, LensJAXBContextResolver.class,
+      LensRequestContextInitFilter.class, LensJAXBValidationExceptionMapper.class);
   }
 
   @Override
@@ -113,7 +112,7 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
 
     final String expectedErrMsg = "Session id not provided. Please provide a session id.";
     LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(SESSION_ID_NOT_PROVIDED.getValue(), expectedErrMsg,
-        MOCK_STACK_TRACE);
+      MOCK_STACK_TRACE);
     ErrorResponseExpectedData expectedData = new ErrorResponseExpectedData(BAD_REQUEST, expectedLensErrorTO);
 
     expectedData.verify(response);
@@ -128,7 +127,7 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
 
     final String expectedErrMsg = "Query is not provided, or it is empty or blank. Please provide a valid query.";
     LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(NULL_OR_EMPTY_OR_BLANK_QUERY.getValue(), expectedErrMsg,
-        MOCK_STACK_TRACE);
+      MOCK_STACK_TRACE);
     ErrorResponseExpectedData expectedData = new ErrorResponseExpectedData(BAD_REQUEST, expectedLensErrorTO);
 
     expectedData.verify(response);
@@ -143,10 +142,10 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
         Optional.of(INVALID_OPERATION));
 
     final String expectedErrMsg = "Provided Operation is not supported. Supported Operations are: "
-        + "[estimate, execute, explain, execute_with_timeout]";
+      + "[estimate, execute, explain, execute_with_timeout]";
 
     LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(UNSUPPORTED_QUERY_SUBMIT_OPERATION.getValue(),
-        expectedErrMsg, MOCK_STACK_TRACE, new SupportedQuerySubmitOperations());
+      expectedErrMsg, MOCK_STACK_TRACE, new SupportedQuerySubmitOperations());
     ErrorResponseExpectedData expectedData = new ErrorResponseExpectedData(BAD_REQUEST, expectedLensErrorTO);
 
     expectedData.verify(response);
@@ -163,7 +162,7 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
     final String expectedErrMsg = "Internal Server Error.";
 
     LensErrorTO childError1 = LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
-        expectedErrMsg, MOCK_STACK_TRACE);
+      expectedErrMsg, MOCK_STACK_TRACE);
     LensErrorTO childError2 = LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
         expectedErrMsg, MOCK_STACK_TRACE);
     LensErrorTO childError3 = LensErrorTO.composedOf(INTERNAL_SERVER_ERROR.getValue(),
@@ -173,7 +172,7 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
         expectedErrMsg, MOCK_STACK_TRACE, Arrays.asList(childError1, childError2, childError3));
 
     ErrorResponseExpectedData expectedData = new ErrorResponseExpectedData(Status.INTERNAL_SERVER_ERROR,
-        expectedLensErrorTO);
+      expectedLensErrorTO);
 
     expectedData.verify(response);
   }
@@ -187,7 +186,7 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
 
     final String expectedErrMsg = "Syntax Error: line 1:0 cannot recognize input near 'mock' '-' 'query'";
     LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(SYNTAX_ERROR.getValue(),
-        expectedErrMsg, MOCK_STACK_TRACE);
+      expectedErrMsg, MOCK_STACK_TRACE);
     ErrorResponseExpectedData expectedData = new ErrorResponseExpectedData(BAD_REQUEST, expectedLensErrorTO);
 
     expectedData.verify(response);
@@ -206,10 +205,10 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
     DateTime queryTillThreeJan2014 = new DateTime(2014, 01, 03, 0, 0, DateTimeZone.UTC);
 
     final String expectedErrMsgSuffix = " can only be queried after Thursday, January 1, 2015 12:00:00 AM UTC and "
-        + "before Friday, January 30, 2015 11:00:00 PM UTC. Please adjust the selected time range accordingly.";
+      + "before Friday, January 30, 2015 11:00:00 PM UTC. Please adjust the selected time range accordingly.";
 
     testColUnAvailableInTimeRange(Optional.of(startDateOneJan2015),
-        Optional.of(endDateThirtyJan2015), queryFromOneJan2014, queryTillThreeJan2014, expectedErrMsgSuffix);
+      Optional.of(endDateThirtyJan2015), queryFromOneJan2014, queryTillThreeJan2014, expectedErrMsgSuffix);
   }
 
   @Test
@@ -224,10 +223,10 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
     DateTime queryTillThreeJan2014 = new DateTime(2014, 01, 03, 0, 0, DateTimeZone.UTC);
 
     final String expectedErrMsgSuffix = " can only be queried after Thursday, January 1, 2015 12:00:00 AM UTC. "
-        + "Please adjust the selected time range accordingly.";
+      + "Please adjust the selected time range accordingly.";
 
     testColUnAvailableInTimeRange(Optional.of(startDateOneJan2015),
-        Optional.<DateTime>absent(), queryFromOneJan2014, queryTillThreeJan2014, expectedErrMsgSuffix);
+      Optional.<DateTime>absent(), queryFromOneJan2014, queryTillThreeJan2014, expectedErrMsgSuffix);
   }
 
   @Test
@@ -242,15 +241,15 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
     DateTime queryTillThreeJan2016 = new DateTime(2016, 01, 03, 0, 0, DateTimeZone.UTC);
 
     final String expectedErrMsgSuffix = " can only be queried before Friday, January 30, 2015 11:00:00 PM UTC. "
-        + "Please adjust the selected time range accordingly.";
+      + "Please adjust the selected time range accordingly.";
 
     testColUnAvailableInTimeRange(Optional.<DateTime>absent(),
-        Optional.of(endDateThirtyJan2015), queryFromOneJan2016, queryTillThreeJan2016, expectedErrMsgSuffix);
+      Optional.of(endDateThirtyJan2015), queryFromOneJan2016, queryTillThreeJan2016, expectedErrMsgSuffix);
   }
 
   private void testColUnAvailableInTimeRange(@NonNull final Optional<DateTime> colStartDate,
-      @NonNull final Optional<DateTime> colEndDate, @NonNull DateTime queryFrom, @NonNull DateTime queryTill,
-      @NonNull final String expectedErrorMsgSuffix) throws DatatypeConfigurationException {
+    @NonNull final Optional<DateTime> colEndDate, @NonNull DateTime queryFrom, @NonNull DateTime queryTill,
+    @NonNull final String expectedErrorMsgSuffix) throws DatatypeConfigurationException {
 
     final WebTarget target = target();
     final String testDb = getRandomDbName();
@@ -279,7 +278,7 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
 
       DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd-HH");
       final String testQuery = "cube select " + testDimensionField + " from " + testCube + " where TIME_RANGE_IN(dt, "
-          + "\"" + dtf.print(queryFrom) + "\",\"" + dtf.print(queryTill) +"\")";
+        + "\"" + dtf.print(queryFrom) + "\",\"" + dtf.print(queryTill) + "\")";
 
       Response response = estimate(target, Optional.of(sessionId), Optional.of(testQuery));
 
@@ -289,10 +288,10 @@ public class QueryAPIErrorResponseTest extends LensJerseyTest {
       Long expecAvailableTill = colEndDate.isPresent() ? colEndDate.get().getMillis() : null;
 
       final ColUnAvailableInTimeRange expectedErrorPayload = new ColUnAvailableInTimeRange(testDimensionField,
-          expecAvailableFrom, expecAvailableTill);
+        expecAvailableFrom, expecAvailableTill);
 
       LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(COLUMN_UNAVAILABLE_IN_TIME_RANGE.getValue(),
-          expectedErrMsg, MOCK_STACK_TRACE, expectedErrorPayload, null);
+        expectedErrMsg, MOCK_STACK_TRACE, expectedErrorPayload, null);
       ErrorResponseExpectedData expectedData = new ErrorResponseExpectedData(BAD_REQUEST, expectedLensErrorTO);
 
       expectedData.verify(response);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/4d81aaf4/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
----------------------------------------------------------------------
diff --git a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
index 29dede8..beaa247 100644
--- a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
+++ b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryService.java
@@ -40,6 +40,7 @@ import org.apache.lens.api.APIResult;
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.error.LensCommonErrorCode;
+import org.apache.lens.api.jaxb.LensJAXBContextResolver;
 import org.apache.lens.api.query.*;
 import org.apache.lens.api.query.QueryStatus.Status;
 import org.apache.lens.api.result.*;