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.*;