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
