Repository: lens
Updated Branches:
  refs/heads/master efa247f07 -> 23ca56644


LENS-957 : Add GenericExceptionMapper to map all non LensException as well.


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

Branch: refs/heads/master
Commit: 23ca5664402bd495ec7f40201140685aebc833d3
Parents: efa247f
Author: Amareshwari Sriramadasu <[email protected]>
Authored: Thu May 12 18:00:45 2016 +0530
Committer: Puneet <[email protected]>
Committed: Thu May 12 18:00:46 2016 +0530

----------------------------------------------------------------------
 .../java/org/apache/lens/server/LensServer.java |   4 +-
 .../server/error/GenericExceptionMapper.java    |  92 +++++++++++++++++
 .../lens/server/error/LensExceptionMapper.java  |  37 -------
 .../lens/server/query/QueryServiceResource.java | 101 ++++++++-----------
 .../server/query/save/SavedQueryResource.java   |  82 ++++-----------
 .../lens/server/session/SessionResource.java    |  24 ++---
 .../common/ErrorResponseExpectedData.java       |   1 -
 .../lens/server/common/FailingQueryDriver.java  |  17 +++-
 .../lens/server/common/RestAPITestUtil.java     |   5 +-
 .../server/query/QueryAPIErrorResponseTest.java |  57 ++++++++++-
 .../lens/server/query/TestQueryService.java     |   4 +-
 .../query/save/TestSavedQueryService.java       |   4 +-
 .../server/session/TestSessionResource.java     |  13 ++-
 13 files changed, 253 insertions(+), 188 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/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 092ecda..b6983f4 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
@@ -28,7 +28,7 @@ import javax.ws.rs.core.UriBuilder;
 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.GenericExceptionMapper;
 import org.apache.lens.server.error.LensJAXBValidationExceptionMapper;
 import org.apache.lens.server.metrics.MetricsServiceImpl;
 import org.apache.lens.server.model.MappedDiagnosticLogSegregationContext;
@@ -112,7 +112,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(GenericExceptionMapper.class);
     app.register(LensJAXBValidationExceptionMapper.class);
     app.register(LensJAXBContextResolver.class);
     app.setApplicationName("AllApps");

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/main/java/org/apache/lens/server/error/GenericExceptionMapper.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/error/GenericExceptionMapper.java
 
b/lens-server/src/main/java/org/apache/lens/server/error/GenericExceptionMapper.java
new file mode 100644
index 0000000..658fcb2
--- /dev/null
+++ 
b/lens-server/src/main/java/org/apache/lens/server/error/GenericExceptionMapper.java
@@ -0,0 +1,92 @@
+/**
+ * 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 javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+import org.apache.lens.api.error.ErrorCollection;
+import org.apache.lens.api.result.LensAPIResult;
+import org.apache.lens.api.result.LensErrorTO;
+import org.apache.lens.server.LensServices;
+import org.apache.lens.server.api.error.LensException;
+import org.apache.lens.server.model.LogSegregationContext;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+
+import org.glassfish.jersey.server.ExtendedUriInfo;
+
+@Provider
+public class GenericExceptionMapper implements ExceptionMapper<Exception> {
+  private final LogSegregationContext logContext;
+  private final ErrorCollection errorCollection;
+
+  @Context
+  ExtendedUriInfo extendedUriInfo;
+
+  public GenericExceptionMapper() {
+    logContext = LensServices.get().getLogSegregationContext();
+    errorCollection = LensServices.get().getErrorCollection();
+  }
+
+  @Override
+  public Response toResponse(Exception exception) {
+    Response.StatusType status;
+    String requestId = logContext.getLogSegragationId();
+    LensException le = null;
+
+    // Get http status code for the exception
+    if (exception instanceof LensException) {
+      le = ((LensException) exception);
+      le.buildLensErrorResponse(errorCollection, null, requestId);
+      status = le.getLensAPIResult().getHttpStatusCode();
+    } else if (exception instanceof WebApplicationException) {
+      status = Response.Status.fromStatusCode(((WebApplicationException) 
exception).getResponse().getStatus());
+    } else {
+      status = Response.Status.INTERNAL_SERVER_ERROR;
+    }
+
+    if 
(extendedUriInfo.getMatchedResourceMethod().getInvocable().getRawResponseType() 
== LensAPIResult.class) {
+      if (le != null) {
+        return Response.status(status).entity(le.getLensAPIResult()).build();
+      }
+      // if no LensException construct LensAPIResult
+      LensAPIResult lensAPIResult = constructLensAPIResult(exception, status);
+      return 
Response.status(lensAPIResult.getHttpStatusCode()).entity(lensAPIResult).build();
+    } else {
+      return Response.status(status).entity(exception.getMessage()).build();
+    }
+  }
+
+  private LensAPIResult constructLensAPIResult(Exception exception, 
Response.StatusType status) {
+    LensErrorTO errorTO;
+    if (exception instanceof WebApplicationException) {
+      errorTO = LensErrorTO.composedOf(status.getStatusCode(), 
exception.getMessage(),
+        ExceptionUtils.getStackTrace(exception));
+    } else {
+      errorTO = 
LensErrorTO.composedOf(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(),
+        "Internal server error" + (exception.getMessage() != null ? ":" + 
exception.getMessage() : ""),
+        ExceptionUtils.getStackTrace(exception));
+    }
+    return LensAPIResult.composedOf(null, logContext.getLogSegragationId(), 
errorTO, status);
+  }
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/main/java/org/apache/lens/server/error/LensExceptionMapper.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/error/LensExceptionMapper.java
 
b/lens-server/src/main/java/org/apache/lens/server/error/LensExceptionMapper.java
deleted file mode 100644
index 1bb65ca..0000000
--- 
a/lens-server/src/main/java/org/apache/lens/server/error/LensExceptionMapper.java
+++ /dev/null
@@ -1,37 +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.server.error;
-
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-import org.apache.lens.api.result.LensAPIResult;
-import org.apache.lens.server.api.error.LensException;
-
-@Provider
-public class LensExceptionMapper implements ExceptionMapper<LensException> {
-
-  @Override
-  public Response toResponse(LensException exception) {
-
-    final LensAPIResult lensAPIResult = exception.getLensAPIResult();
-    return 
Response.status(lensAPIResult.getHttpStatusCode()).entity(lensAPIResult).build();
-  }
-}

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/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 d384abc..c70689b 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
@@ -31,7 +31,6 @@ import org.apache.lens.api.APIResult;
 import org.apache.lens.api.APIResult.Status;
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
-import org.apache.lens.api.error.ErrorCollection;
 import org.apache.lens.api.query.*;
 import org.apache.lens.api.result.LensAPIResult;
 import org.apache.lens.server.LensServices;
@@ -60,8 +59,6 @@ public class QueryServiceResource {
   /** The query server. */
   private QueryExecutionService queryServer;
 
-  private final ErrorCollection errorCollection;
-
   private final LogSegregationContext logSegregationContext;
 
   /**
@@ -125,7 +122,6 @@ public class QueryServiceResource {
    */
   public QueryServiceResource() throws LensException {
     queryServer = LensServices.get().getService(QueryExecutionService.NAME);
-    errorCollection = LensServices.get().getErrorCollection();
     logSegregationContext = LensServices.get().getLogSegregationContext();
   }
 
@@ -218,34 +214,30 @@ public class QueryServiceResource {
 
     final String requestId = this.logSegregationContext.getLogSegragationId();
 
-    try {
-      validateSessionId(sessionid);
-      SubmitOp sop = checkAndGetQuerySubmitOperation(operation);
-      validateQuery(query);
+    validateSessionId(sessionid);
+    SubmitOp sop = checkAndGetQuerySubmitOperation(operation);
+    validateQuery(query);
+
+    QuerySubmitResult result;
+    switch (sop) {
+    case ESTIMATE:
+      result = new QueryCostTOBuilder(queryServer.estimate(requestId, 
sessionid, query, conf)).build();
+      break;
+    case EXECUTE:
+      result = queryServer.executeAsync(sessionid, query, conf, queryName);
+      break;
+    case EXPLAIN:
+      result = queryServer.explain(requestId, sessionid, query, conf);
+      break;
+    case EXECUTE_WITH_TIMEOUT:
+      result = queryServer.execute(sessionid, query, timeoutmillis, conf, 
queryName);
+      break;
+    default:
+      throw new UnSupportedQuerySubmitOpException();
+    }
 
-      QuerySubmitResult result;
-      switch (sop) {
-      case ESTIMATE:
-        result = new QueryCostTOBuilder(queryServer.estimate(requestId, 
sessionid, query, conf)).build();
-        break;
-      case EXECUTE:
-        result = queryServer.executeAsync(sessionid, query, conf, queryName);
-        break;
-      case EXPLAIN:
-        result = queryServer.explain(requestId, sessionid, query, conf);
-        break;
-      case EXECUTE_WITH_TIMEOUT:
-        result = queryServer.execute(sessionid, query, timeoutmillis, conf, 
queryName);
-        break;
-      default:
-        throw new UnSupportedQuerySubmitOpException();
-      }
+    return LensAPIResult.composedOf(null, requestId, result);
 
-      return LensAPIResult.composedOf(null, requestId, result);
-    } catch (LensException e) {
-      e.buildLensErrorResponse(errorCollection, null, requestId);
-      throw e;
-    }
   }
 
   /**
@@ -361,34 +353,29 @@ public class QueryServiceResource {
       @DefaultValue("") @FormDataParam("queryName") String queryName) throws 
LensException {
     final String requestId = this.logSegregationContext.getLogSegragationId();
 
+    checkSessionId(sessionid);
+    checkQuery(query);
+    SubmitOp sop = null;
+    QuerySubmitResult result;
     try {
-      checkSessionId(sessionid);
-      checkQuery(query);
-      SubmitOp sop = null;
-      QuerySubmitResult result;
-      try {
-        sop = SubmitOp.valueOf(operation.toUpperCase());
-      } catch (IllegalArgumentException e) {
-        log.error("Illegal argument for submitop: " + operation, e);
-      }
-      if (sop == null) {
-        throw new BadRequestException("Invalid operation type: " + operation + 
prepareClue);
-      }
-      switch (sop) {
-      case PREPARE:
-        result = queryServer.prepare(sessionid, query, conf, queryName);
-        break;
-      case EXPLAIN_AND_PREPARE:
-        result = queryServer.explainAndPrepare(sessionid, query, conf, 
queryName);
-        break;
-      default:
-        throw new BadRequestException("Invalid operation type: " + operation + 
prepareClue);
-      }
-      return LensAPIResult.composedOf(null, requestId, result);
-    } catch (LensException e) {
-      e.buildLensErrorResponse(errorCollection, null, requestId);
-      throw e;
+      sop = SubmitOp.valueOf(operation.toUpperCase());
+    } catch (IllegalArgumentException e) {
+      log.error("Illegal argument for submitop: " + operation, e);
+    }
+    if (sop == null) {
+      throw new BadRequestException("Invalid operation type: " + operation + 
prepareClue);
+    }
+    switch (sop) {
+    case PREPARE:
+      result = queryServer.prepare(sessionid, query, conf, queryName);
+      break;
+    case EXPLAIN_AND_PREPARE:
+      result = queryServer.explainAndPrepare(sessionid, query, conf, 
queryName);
+      break;
+    default:
+      throw new BadRequestException("Invalid operation type: " + operation + 
prepareClue);
     }
+    return LensAPIResult.composedOf(null, requestId, result);
   }
   /**
    * Destroy all the prepared queries; Can be filtered with user.
@@ -770,7 +757,7 @@ public class QueryServiceResource {
     try {
       queryServer.closeResultSet(sessionid, getQueryHandle(queryHandle));
       return new APIResult(Status.SUCCEEDED,
-        "Close on the result set" + " for query " + queryHandle + " is 
successful");
+        "Close on the result set for query " + queryHandle + " is successful");
 
     } catch (LensException e) {
       throw new WebApplicationException(e);

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/main/java/org/apache/lens/server/query/save/SavedQueryResource.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/query/save/SavedQueryResource.java
 
b/lens-server/src/main/java/org/apache/lens/server/query/save/SavedQueryResource.java
index 861600c..72748cd 100644
--- 
a/lens-server/src/main/java/org/apache/lens/server/query/save/SavedQueryResource.java
+++ 
b/lens-server/src/main/java/org/apache/lens/server/query/save/SavedQueryResource.java
@@ -33,7 +33,6 @@ import javax.ws.rs.core.UriInfo;
 
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
-import org.apache.lens.api.error.ErrorCollection;
 import org.apache.lens.api.query.QueryHandle;
 import org.apache.lens.api.query.save.ListResponse;
 import org.apache.lens.api.query.save.ParameterParserResponse;
@@ -65,7 +64,6 @@ public class SavedQueryResource {
 
   final SavedQueryService savedQueryService;
   final QueryExecutionService queryService;
-  private final ErrorCollection errorCollection;
   private final LogSegregationContext logSegregationContext;
   private static final String DEFAULT_START = "0";
   private final int defaultCount;
@@ -73,7 +71,6 @@ public class SavedQueryResource {
   public SavedQueryResource() {
     savedQueryService = 
LensServices.get().getService(SavedQueryServiceImpl.NAME);
     queryService = LensServices.get().getService(QueryExecutionService.NAME);
-    errorCollection = LensServices.get().getErrorCollection();
     logSegregationContext = LensServices.get().getLogSegregationContext();
     final HiveConf hiveConf = LensServices.get().getHiveConf();
     defaultCount = hiveConf.getInt(FETCH_COUNT_SAVED_QUERY_LIST_KEY, 
DEFAULT_FETCH_COUNT_SAVED_QUERY_LIST);
@@ -109,12 +106,8 @@ public class SavedQueryResource {
     @Context UriInfo info,
     @DefaultValue(DEFAULT_START) @QueryParam("start") int start,
     @QueryParam("count") String count) throws LensException {
-    try {
-      final int countVal = count == null? defaultCount: 
Integer.parseInt(count);
-      return savedQueryService.list(sessionid, info.getQueryParameters(), 
start, countVal);
-    } catch (LensException e) {
-      throw getWrapped(e);
-    }
+    final int countVal = count == null? defaultCount: Integer.parseInt(count);
+    return savedQueryService.list(sessionid, info.getQueryParameters(), start, 
countVal);
   }
 
   /**
@@ -130,11 +123,8 @@ public class SavedQueryResource {
   public SavedQuery getByID(
     @QueryParam("sessionid") LensSessionHandle sessionid,
     @PathParam("id") long id) throws LensException {
-    try {
-      return savedQueryService.get(sessionid, id);
-    } catch (LensException e) {
-      throw getWrapped(e);
-    }
+    return savedQueryService.get(sessionid, id);
+
   }
 
   /**
@@ -150,12 +140,8 @@ public class SavedQueryResource {
   public ResourceModifiedResponse deleteById(
     @QueryParam("sessionid") LensSessionHandle sessionid,
     @PathParam("id") long id) throws LensException {
-    try {
-      savedQueryService.delete(sessionid, id);
-      return new ResourceModifiedResponse(id, "saved_query", DELETED);
-    } catch (LensException e) {
-      throw getWrapped(e);
-    }
+    savedQueryService.delete(sessionid, id);
+    return new ResourceModifiedResponse(id, "saved_query", DELETED);
   }
 
   /**
@@ -176,14 +162,11 @@ public class SavedQueryResource {
     SavedQuery savedQuery,
     @Context final Response response)
     throws LensException, IOException {
-    try {
-      long id = savedQueryService.save(sessionid, savedQuery);
-      response.setStatus(HttpServletResponse.SC_CREATED);
-      response.flush();
-      return new ResourceModifiedResponse(id, "saved_query", CREATED);
-    } catch (LensException e) {
-      throw getWrapped(e);
-    }
+    long id = savedQueryService.save(sessionid, savedQuery);
+    response.setStatus(HttpServletResponse.SC_CREATED);
+    response.flush();
+    return new ResourceModifiedResponse(id, "saved_query", CREATED);
+
   }
 
   /**
@@ -204,14 +187,10 @@ public class SavedQueryResource {
     @PathParam("id") long id,
     SavedQuery savedQuery,
     @Context final Response response) throws LensException, IOException {
-    try {
-      savedQueryService.update(sessionid, id, savedQuery);
-      response.setStatus(HttpServletResponse.SC_CREATED);
-      response.flush();
-      return new ResourceModifiedResponse(id, "saved_query", UPDATED);
-    } catch (LensException e) {
-      throw getWrapped(e);
-    }
+    savedQueryService.update(sessionid, id, savedQuery);
+    response.setStatus(HttpServletResponse.SC_CREATED);
+    response.flush();
+    return new ResourceModifiedResponse(id, "saved_query", UPDATED);
   }
 
   /**
@@ -247,29 +226,12 @@ public class SavedQueryResource {
     @FormDataParam("sessionid") LensSessionHandle sessionid,
     @FormDataParam("conf") LensConf conf) throws LensException {
     final String requestId = this.logSegregationContext.getLogSegragationId();
-    try {
-      final SavedQuery savedQuery = savedQueryService.get(sessionid, id);
-      final String query = ParameterResolver.resolve(savedQuery, 
info.getQueryParameters());
-      return LensAPIResult.composedOf(
-        null,
-        requestId,
-        queryService.executeAsync(sessionid, query, conf, savedQuery.getName())
-      );
-    } catch (LensException e) {
-      throw getWrapped(e);
-    }
-  }
-
-  /**
-   * Helper method that builds error response for LensException provided.
-   *
-   * @param e    Lens exception object
-   * @return lens exception object with error response built
-   * @throws LensException
-   */
-  private LensException getWrapped(LensException e) throws
-    LensException {
-    e.buildLensErrorResponse(errorCollection, null, 
logSegregationContext.getLogSegragationId());
-    throw e;
+    final SavedQuery savedQuery = savedQueryService.get(sessionid, id);
+    final String query = ParameterResolver.resolve(savedQuery, 
info.getQueryParameters());
+    return LensAPIResult.composedOf(
+      null,
+      requestId,
+      queryService.executeAsync(sessionid, query, conf, savedQuery.getName())
+    );
   }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java 
b/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
index 7c17b8a..a74c8cd 100644
--- 
a/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
+++ 
b/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
@@ -24,14 +24,12 @@ import java.util.Map;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
 
 import org.apache.lens.api.APIResult;
 import org.apache.lens.api.APIResult.Status;
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.StringList;
-import org.apache.lens.api.error.ErrorCollection;
 import org.apache.lens.server.BaseLensService;
 import org.apache.lens.server.LensServices;
 import org.apache.lens.server.api.error.LensException;
@@ -54,8 +52,6 @@ public class SessionResource {
   /** The session service. */
   private SessionService sessionService;
 
-  private final ErrorCollection errorCollection;
-
   /**
    * API to know if session service is up and running
    *
@@ -74,7 +70,6 @@ public class SessionResource {
    */
   public SessionResource() throws LensException {
     sessionService = LensServices.get().getService(SessionService.NAME);
-    errorCollection = LensServices.get().getErrorCollection();
   }
 
   /**
@@ -93,20 +88,13 @@ public class SessionResource {
     @FormDataParam("password") String password,
     @FormDataParam("database")  @DefaultValue("") String database,
     @FormDataParam("sessionconf") LensConf sessionconf) throws LensException {
-    try {
-      Map<String, String> conf;
-      if (sessionconf != null) {
-        conf = sessionconf.getProperties();
-      } else {
-        conf = new HashMap<String, String>();
-      }
-      return sessionService.openSession(username, password, database,   conf);
-    } catch (LensException e) {
-      e.buildLensErrorResponse(errorCollection, null,
-          LensServices.get().getLogSegregationContext().getLogSegragationId());
-      Response response = 
Response.status(e.getLensAPIResult().getHttpStatusCode()).build();
-      throw new WebApplicationException(response);
+    Map<String, String> conf;
+    if (sessionconf != null) {
+      conf = sessionconf.getProperties();
+    } else {
+      conf = new HashMap();
     }
+    return sessionService.openSession(username, password, database,   conf);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/test/java/org/apache/lens/server/common/ErrorResponseExpectedData.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/common/ErrorResponseExpectedData.java
 
b/lens-server/src/test/java/org/apache/lens/server/common/ErrorResponseExpectedData.java
index 3ede853..a4154c3 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/common/ErrorResponseExpectedData.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/common/ErrorResponseExpectedData.java
@@ -54,5 +54,4 @@ public class ErrorResponseExpectedData {
     /* Assert receipt of valid stacktraces */
     assertTrue(lensAPIResult.areValidStackTracesPresent(), "Received Lens 
Response:" + lensAPIResult);
   }
-
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/test/java/org/apache/lens/server/common/FailingQueryDriver.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/common/FailingQueryDriver.java
 
b/lens-server/src/test/java/org/apache/lens/server/common/FailingQueryDriver.java
index 2f74ceb..0b38517 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/common/FailingQueryDriver.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/common/FailingQueryDriver.java
@@ -19,6 +19,9 @@
 
 package org.apache.lens.server.common;
 
+import javax.ws.rs.NotFoundException;
+
+import org.apache.lens.server.api.driver.DriverQueryPlan;
 import org.apache.lens.server.api.driver.MockDriver;
 import org.apache.lens.server.api.error.LensException;
 import org.apache.lens.server.api.query.AbstractQueryContext;
@@ -30,7 +33,6 @@ public class FailingQueryDriver extends MockDriver {
 
   @Override
   public QueryCost estimate(final AbstractQueryContext ctx) throws 
LensException {
-
     if (ctx.getUserQuery().contains("fail")) {
       return new FactPartitionBasedQueryCost(0.0);
     } else {
@@ -39,7 +41,18 @@ public class FailingQueryDriver extends MockDriver {
   }
 
   @Override
-  public void executeAsync(final QueryContext context) throws LensException {
+  public DriverQueryPlan explain(AbstractQueryContext explainCtx) throws 
LensException {
+    if (explainCtx.getUserQuery().contains("runtime")) {
+      throw new RuntimeException("Runtime exception from query explain");
+    }
+    if (explainCtx.getUserQuery().contains("webappexception")) {
+      throw new NotFoundException("Not found from mock driver");
+    }
+    return super.explain(explainCtx);
+  }
+
+  @Override
+  public void executeAsync(final QueryContext ctx) throws LensException {
     throw new LensException("Simulated Launch Failure");
   }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java 
b/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java
index 837c33d..2c42631 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java
@@ -77,7 +77,10 @@ public class RestAPITestUtil {
     final Optional<String> query, MediaType mt) {
     return postQuery(target, sessionId, query, Optional.of("estimate"), 
Optional.<LensConf>absent(), mt);
   }
-
+  public static Response explain(final WebTarget target, final 
Optional<LensSessionHandle> sessionId,
+                                  final Optional<String> query, MediaType mt) {
+    return postQuery(target, sessionId, query, Optional.of("explain"), 
Optional.<LensConf>absent(), mt);
+  }
   public static Response execute(final WebTarget target, final 
Optional<LensSessionHandle> sessionId,
     final Optional<String> query, MediaType mt) {
     return execute(target, sessionId, query, Optional.<LensConf>absent(), mt);

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/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 29fcd6d..fe9163f 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
@@ -19,6 +19,7 @@
 package org.apache.lens.server.query;
 
 import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
+import static javax.ws.rs.core.Response.Status.NOT_FOUND;
 
 import static 
org.apache.lens.api.error.LensCommonErrorCode.INTERNAL_SERVER_ERROR;
 import static 
org.apache.lens.cube.error.LensCubeErrorCode.COLUMN_UNAVAILABLE_IN_TIME_RANGE;
@@ -47,7 +48,7 @@ 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.GenericExceptionMapper;
 import org.apache.lens.server.error.LensJAXBValidationExceptionMapper;
 import org.apache.lens.server.metastore.MetastoreResource;
 import org.apache.lens.server.session.SessionResource;
@@ -90,7 +91,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, 
GenericExceptionMapper.class,
+      LensJAXBContextResolver.class,
       LensRequestContextInitFilter.class, 
LensJAXBValidationExceptionMapper.class,
       MoxyJsonConfigurationContextResolver.class, MoxyJsonFeature.class);
   }
@@ -130,7 +132,7 @@ public class QueryAPIErrorResponseTest extends 
LensJerseyTest {
     LensSessionHandle sessionId = openSession(target(), "foo", "bar", new 
LensConf(), mt);
 
     Response response = postQuery(target(), Optional.of(sessionId), 
Optional.of(MOCK_QUERY),
-        Optional.of(INVALID_OPERATION), mt);
+      Optional.of(INVALID_OPERATION), mt);
 
     final String expectedErrMsg = "Provided Operation is not supported. 
Supported Operations are: "
       + "[estimate, execute, explain, execute_with_timeout]";
@@ -165,8 +167,8 @@ public class QueryAPIErrorResponseTest extends 
LensJerseyTest {
     LensErrorTO responseLensErrorTO = 
response.readEntity(LensAPIResult.class).getLensErrorTO();
 
     
assertTrue(expectedLensErrorTO1.getMessage().equals(responseLensErrorTO.getMessage())
-            || 
expectedLensErrorTO2.getMessage().equals(responseLensErrorTO.getMessage()),
-        "Message is " + responseLensErrorTO.getMessage());
+        || 
expectedLensErrorTO2.getMessage().equals(responseLensErrorTO.getMessage()),
+      "Message is " + responseLensErrorTO.getMessage());
     closeSession(target(), sessionId, mt);
 
   }
@@ -296,4 +298,49 @@ public class QueryAPIErrorResponseTest extends 
LensJerseyTest {
       closeSessionFailFast(target, sessionId, mt);
     }
   }
+
+  /**
+   * Test execute failure in with selected driver throwing Runtime exception.
+   *
+   * @throws InterruptedException the interrupted exception
+   */
+  @Test(dataProvider = "mediaTypeData")
+  public void testExplainRuntimeException(MediaType mt) throws 
InterruptedException {
+    LensSessionHandle sessionId = openSession(target(), "foo", "bar", new 
LensConf(), mt);
+    try {
+      Response response = explain(target(), Optional.of(sessionId), 
Optional.of("select fail, execute_runtime "
+        + " from non_exist"), mt);
+      final String expectedErrMsg = "Internal server error:Runtime exception 
from query explain";
+      LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(
+        INTERNAL_SERVER_ERROR.getValue(), expectedErrMsg, MOCK_STACK_TRACE);
+      ErrorResponseExpectedData expectedData = new 
ErrorResponseExpectedData(Response.Status.INTERNAL_SERVER_ERROR,
+        expectedLensErrorTO);
+      expectedData.verify(response);
+    } finally {
+      closeSessionFailFast(target(), sessionId, mt);
+    }
+
+  }
+  /**
+   * Test execute failure in with selected driver throwing webapp exception.
+   *
+   * @throws InterruptedException the interrupted exception
+   */
+  @Test(dataProvider = "mediaTypeData")
+  public void testExplainWebappException(MediaType mt) throws 
InterruptedException {
+    LensSessionHandle sessionId = openSession(target(), "foo", "bar", new 
LensConf(), mt);
+    try {
+      Response response = explain(target(), Optional.of(sessionId), 
Optional.of("select fail, webappexception "
+        + " from non_exist"), mt);
+      final String expectedErrMsg = "Not found from mock driver";
+      LensErrorTO expectedLensErrorTO = LensErrorTO.composedOf(
+        NOT_FOUND.getStatusCode(), expectedErrMsg, MOCK_STACK_TRACE);
+      ErrorResponseExpectedData expectedData = new 
ErrorResponseExpectedData(Response.Status.NOT_FOUND,
+        expectedLensErrorTO);
+      expectedData.verify(response);
+    } finally {
+      closeSessionFailFast(target(), sessionId, mt);
+    }
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/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 164c9f8..797886d 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
@@ -67,7 +67,7 @@ import org.apache.lens.server.api.session.SessionService;
 import org.apache.lens.server.common.ErrorResponseExpectedData;
 import org.apache.lens.server.common.TestDataUtils;
 import org.apache.lens.server.common.TestResourceFile;
-import org.apache.lens.server.error.LensExceptionMapper;
+import org.apache.lens.server.error.GenericExceptionMapper;
 import org.apache.lens.server.session.HiveSessionService;
 import org.apache.lens.server.session.LensSessionImpl;
 
@@ -110,7 +110,7 @@ public class TestQueryService extends LensJerseyTest {
     @Override
     public Set<Class<?>> getClasses() {
       final Set<Class<?>> classes = super.getClasses();
-      classes.add(LensExceptionMapper.class);
+      classes.add(GenericExceptionMapper.class);
       classes.add(LensJAXBContextResolver.class);
       return classes;
     }

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/test/java/org/apache/lens/server/query/save/TestSavedQueryService.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/query/save/TestSavedQueryService.java
 
b/lens-server/src/test/java/org/apache/lens/server/query/save/TestSavedQueryService.java
index f9bacf1..a8b58b2 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/query/save/TestSavedQueryService.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/query/save/TestSavedQueryService.java
@@ -39,7 +39,7 @@ import org.apache.lens.server.LensServices;
 import org.apache.lens.server.api.metrics.MetricsService;
 import org.apache.lens.server.api.query.QueryExecutionService;
 import org.apache.lens.server.api.query.save.SavedQueryService;
-import org.apache.lens.server.error.LensExceptionMapper;
+import org.apache.lens.server.error.GenericExceptionMapper;
 import org.apache.lens.server.query.QueryExecutionServiceImpl;
 
 import org.apache.hadoop.hive.conf.HiveConf;
@@ -84,7 +84,7 @@ public class TestSavedQueryService extends LensJerseyTest {
     @Override
     public Set<Class<?>> getClasses() {
       final Set<Class<?>> classes = super.getClasses();
-      classes.add(LensExceptionMapper.class);
+      classes.add(GenericExceptionMapper.class);
       classes.add(LensJAXBContextResolver.class);
       return classes;
     }

http://git-wip-us.apache.org/repos/asf/lens/blob/23ca5664/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
 
b/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
index 988fa1d..685ad85 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
@@ -25,6 +25,7 @@ import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Set;
 
 import javax.ws.rs.ClientErrorException;
 import javax.ws.rs.NotFoundException;
@@ -39,6 +40,7 @@ import org.apache.lens.api.APIResult.Status;
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.StringList;
+import org.apache.lens.api.jaxb.LensJAXBContextResolver;
 import org.apache.lens.server.LensJerseyTest;
 import org.apache.lens.server.LensServerConf;
 import org.apache.lens.server.LensServices;
@@ -50,6 +52,7 @@ import org.apache.lens.server.common.LenServerTestException;
 import org.apache.lens.server.common.LensServerTestFileUtils;
 import org.apache.lens.server.common.RestAPITestUtil;
 import org.apache.lens.server.common.TestResourceFile;
+import org.apache.lens.server.error.GenericExceptionMapper;
 
 import org.apache.commons.io.FileUtils;
 
@@ -107,7 +110,15 @@ public class TestSessionResource extends LensJerseyTest {
   protected Application configure() {
     enable(TestProperties.LOG_TRAFFIC);
     enable(TestProperties.DUMP_ENTITY);
-    return new SessionApp();
+    return new SessionApp() {
+      @Override
+      public Set<Class<?>> getClasses() {
+        final Set<Class<?>> classes = super.getClasses();
+        classes.add(GenericExceptionMapper.class);
+        classes.add(LensJAXBContextResolver.class);
+        return classes;
+      }
+    };
   }
 
   @Test

Reply via email to