OLINGO-874: Error handling improvements
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/7a68ae68 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/7a68ae68 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/7a68ae68 Branch: refs/heads/OLINGO-832_StreamSerializerPoC Commit: 7a68ae68ad72f13927814700be0debc3b481f008 Parents: b7005b7 Author: Ramesh Reddy <[email protected]> Authored: Tue Feb 9 13:10:02 2016 -0600 Committer: Ramesh Reddy <[email protected]> Committed: Tue Feb 9 14:44:02 2016 -0600 ---------------------------------------------------------------------- .../apache/olingo/server/core/ErrorHandler.java | 47 ++++++---------- .../olingo/server/core/OData4HttpHandler.java | 10 ++-- .../olingo/server/core/ServiceDispatcher.java | 39 +++++++++++-- .../olingo/server/core/ServiceHandler.java | 13 ++++- .../core/legacy/ProcessorServiceHandler.java | 7 +++ .../server/core/requests/BatchRequest.java | 11 +--- .../server/core/responses/EntityResponse.java | 1 + .../core/responses/EntitySetResponse.java | 2 + .../server/core/responses/ErrorResponse.java | 58 ++++++++++++++++++++ .../server/core/responses/MetadataResponse.java | 2 + .../server/core/responses/PropertyResponse.java | 2 + .../core/responses/ServiceDocumentResponse.java | 2 + .../core/responses/ServiceResponseVisior.java | 4 ++ .../olingo/server/example/TripPinHandler.java | 9 ++- 14 files changed, 155 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java index 33f65cd..bfccc68 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java @@ -24,18 +24,16 @@ import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataServerError; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException; -import org.apache.olingo.server.api.serializer.CustomContentTypeSupport; import org.apache.olingo.server.api.serializer.ODataSerializer; -import org.apache.olingo.server.api.serializer.RepresentationType; import org.apache.olingo.server.api.serializer.SerializerException; -import org.apache.olingo.server.api.uri.UriInfo; -import org.apache.olingo.server.core.uri.parser.Parser; +import org.apache.olingo.server.core.responses.ErrorResponse; import org.apache.olingo.server.core.uri.parser.UriParserException; import org.apache.olingo.server.core.uri.parser.UriParserSemanticException; import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException; @@ -43,13 +41,16 @@ import org.apache.olingo.server.core.uri.validator.UriValidationException; public class ErrorHandler { private final OData odata; + private final ServiceHandler handler; + private final ContentType contentType; private final ServiceMetadata metadata; - private final CustomContentTypeSupport customContent; - - public ErrorHandler(OData odata, ServiceMetadata metadata, CustomContentTypeSupport customContent) { + + public ErrorHandler(OData odata, ServiceMetadata metadata, + ServiceHandler handler, ContentType contentType) { this.odata = odata; + this.handler = handler; + this.contentType = contentType; this.metadata = metadata; - this.customContent = customContent; } public void handleException(Exception e, ODataRequest request, ODataResponse response) { @@ -80,7 +81,10 @@ public class ErrorHandler { } else if(e instanceof ODataHandlerException) { ODataServerError serverError = ODataExceptionHelper.createServerErrorObject((ODataHandlerException)e, null); handleServerError(request, response, serverError); - } else { + } else if(e instanceof ODataApplicationException) { + ODataServerError serverError = ODataExceptionHelper.createServerErrorObject((ODataApplicationException)e); + handleServerError(request, response, serverError); + }else { ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e); handleServerError(request, response, serverError); } @@ -88,29 +92,10 @@ public class ErrorHandler { void handleServerError(final ODataRequest request, final ODataResponse response, final ODataServerError serverError) { - ContentType requestedContentType; - try { - final UriInfo uriInfo = new Parser(metadata.getEdm(), odata) - .parseUri(request.getRawODataPath(), request.getRawQueryPath(), null); - requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), - request, this.customContent, RepresentationType.ERROR); - } catch (final ContentNegotiatorException e) { - requestedContentType = ContentType.JSON; - } catch (final UriParserException e) { - requestedContentType = ContentType.JSON; - } catch (final UriValidationException e) { - requestedContentType = ContentType.JSON; - } - processError(response, serverError, requestedContentType); - } - - void processError(ODataResponse response, ODataServerError serverError, - ContentType requestedContentType) { try { - ODataSerializer serializer = this.odata.createSerializer(requestedContentType); - response.setContent(serializer.error(serverError).getContent()); - response.setStatusCode(serverError.getStatusCode()); - response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString()); + ODataSerializer serializer = this.odata.createSerializer(this.contentType); + ErrorResponse errorResponse = new ErrorResponse(this.metadata, serializer, this.contentType, response); + handler.processError(serverError, errorResponse); } catch (Exception e) { // This should never happen but to be sure we have this catch here // to prevent sending a stacktrace to a client. http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java index 7811cdf..18e1364 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java @@ -24,11 +24,12 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; +import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; -import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.processor.Processor; import org.apache.olingo.server.api.serializer.CustomContentTypeSupport; @@ -63,12 +64,13 @@ public class OData4HttpHandler extends ODataHttpHandlerImpl { ServiceDispatcher dispatcher = new ServiceDispatcher(this.odata, this.serviceMetadata, handler, this.customContentTypeSupport); dispatcher.execute(request, response); - + } catch (Exception e) { + // also handle any unchecked exception thrown by service handler for proper serialization ErrorHandler handler = new ErrorHandler(this.odata, this.serviceMetadata, - this.customContentTypeSupport); + this.handler, ContentType.JSON); handler.handleException(e, request, response); - } + } convertToHttp(httpResponse, response); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java index cb718e1..fc5c88c 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java @@ -23,16 +23,18 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import org.apache.olingo.commons.api.ex.ODataException; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; -import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.serializer.CustomContentTypeSupport; +import org.apache.olingo.server.api.serializer.RepresentationType; import org.apache.olingo.server.api.uri.UriInfo; import org.apache.olingo.server.api.uri.UriInfoBatch; import org.apache.olingo.server.api.uri.UriInfoCrossjoin; @@ -75,11 +77,36 @@ public class ServiceDispatcher extends RequestURLHierarchyVisitor { this.customContentSupport = customContentSupport; } - public void execute(ODataRequest odRequest, ODataResponse odResponse) - throws ODataLibraryException, ODataApplicationException { - - UriInfo uriInfo = new Parser(this.metadata.getEdm(), odata) - .parseUri(odRequest.getRawODataPath(), odRequest.getRawQueryPath(), null); + public void execute(ODataRequest odRequest, ODataResponse odResponse) { + ContentType contentType = ContentType.JSON; + try { + contentType = ContentNegotiator.doContentNegotiation(null, + odRequest, this.customContentSupport, RepresentationType.ERROR); + + UriInfo uriInfo = new Parser(this.metadata.getEdm(), odata) + .parseUri(odRequest.getRawODataPath(), odRequest.getRawQueryPath(), null); + + contentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), + odRequest, this.customContentSupport, RepresentationType.ERROR); + + internalExecute(uriInfo, odRequest, odResponse); + } catch(ODataLibraryException e) { + handleException(e, contentType, odRequest, odResponse); + } catch(ODataApplicationException e) { + handleException(e, contentType, odRequest, odResponse); + } + } + + protected void handleException(ODataException e, ContentType contentType, + ODataRequest odRequest, ODataResponse odResponse) { + ErrorHandler handler = new ErrorHandler(this.odata, this.metadata, + this.handler, contentType); + handler.handleException(e, odRequest, odResponse); + } + + private void internalExecute(UriInfo uriInfo, ODataRequest odRequest, + ODataResponse odResponse) throws ODataLibraryException, + ODataApplicationException { new UriValidator().validate(uriInfo, odRequest.getMethod()); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java index ba96f94..8f8fc1d 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java @@ -26,9 +26,10 @@ import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.http.HttpMethod; import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; -import org.apache.olingo.server.api.ODataLibraryException; +import org.apache.olingo.server.api.ODataServerError; import org.apache.olingo.server.api.processor.Processor; import org.apache.olingo.server.core.requests.ActionRequest; import org.apache.olingo.server.core.requests.DataRequest; @@ -37,6 +38,7 @@ import org.apache.olingo.server.core.requests.MediaRequest; import org.apache.olingo.server.core.requests.MetadataRequest; import org.apache.olingo.server.core.requests.ServiceDocumentRequest; import org.apache.olingo.server.core.responses.EntityResponse; +import org.apache.olingo.server.core.responses.ErrorResponse; import org.apache.olingo.server.core.responses.MetadataResponse; import org.apache.olingo.server.core.responses.NoContentResponse; import org.apache.olingo.server.core.responses.PropertyResponse; @@ -296,4 +298,13 @@ public interface ServiceHandler extends Processor { * @return */ boolean supportsDataIsolation(); + + + /** + * Handle errors generated by the framework as well as the service specific errors. This can be used + * one place handle error logging, error modification etc. + * @param error + * @param response + */ + void processError(ODataServerError error, ErrorResponse response); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java index db62c0a..d4d0662 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java @@ -32,6 +32,7 @@ import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataLibraryException; +import org.apache.olingo.server.api.ODataServerError; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.processor.ComplexCollectionProcessor; import org.apache.olingo.server.api.processor.ComplexProcessor; @@ -59,6 +60,7 @@ import org.apache.olingo.server.core.requests.ServiceDocumentRequest; import org.apache.olingo.server.core.responses.CountResponse; import org.apache.olingo.server.core.responses.EntityResponse; import org.apache.olingo.server.core.responses.EntitySetResponse; +import org.apache.olingo.server.core.responses.ErrorResponse; import org.apache.olingo.server.core.responses.MetadataResponse; import org.apache.olingo.server.core.responses.NoContentResponse; import org.apache.olingo.server.core.responses.PrimitiveValueResponse; @@ -442,4 +444,9 @@ public class ProcessorServiceHandler implements ServiceHandler { public boolean supportsDataIsolation() { return false; } + + @Override + public void processError(ODataServerError error, ErrorResponse response) { + response.writeError(error); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java index d14b5ad..2215594 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java @@ -29,16 +29,15 @@ import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; -import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException; import org.apache.olingo.server.api.deserializer.batch.BatchOptions; import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart; import org.apache.olingo.server.core.ContentNegotiatorException; -import org.apache.olingo.server.core.ErrorHandler; import org.apache.olingo.server.core.ServiceDispatcher; import org.apache.olingo.server.core.ServiceHandler; import org.apache.olingo.server.core.ServiceRequest; @@ -154,13 +153,7 @@ public class BatchRequest extends ServiceRequest { ServiceDispatcher dispatcher = new ServiceDispatcher(this.odata, this.serviceMetadata, handler, this.customContentType); ODataResponse res = new ODataResponse(); - try { - dispatcher.execute(singleRequest, res); - } catch (Exception e) { - ErrorHandler ehandler = new ErrorHandler(this.odata, this.serviceMetadata, - getCustomContentTypeSupport()); - ehandler.handleException(e, singleRequest, res); - } + dispatcher.execute(singleRequest, res); return res; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java index a0bbd14..5f54a24 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java @@ -162,6 +162,7 @@ public class EntityResponse extends ServiceResponse { public void writeError(ODataServerError error) { try { + writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType()); writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true); } catch (SerializerException e) { writeServerError(true); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java index 0dd2bd8..09a48c1 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java @@ -24,6 +24,7 @@ import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.EntityCollection; import org.apache.olingo.commons.api.edm.EdmEntityType; import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataServerError; @@ -84,6 +85,7 @@ public class EntitySetResponse extends ServiceResponse { public void writeError(ODataServerError error) { try { + writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType()); writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true); } catch (SerializerException e) { writeServerError(true); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java new file mode 100644 index 0000000..2e1fbd6 --- /dev/null +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java @@ -0,0 +1,58 @@ +/* + * 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.olingo.server.core.responses; + +import java.util.HashMap; + +import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.commons.api.http.HttpHeader; +import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataLibraryException; +import org.apache.olingo.server.api.ODataResponse; +import org.apache.olingo.server.api.ODataServerError; +import org.apache.olingo.server.api.ServiceMetadata; +import org.apache.olingo.server.api.serializer.ODataSerializer; +import org.apache.olingo.server.api.serializer.SerializerException; + +public class ErrorResponse extends ServiceResponse { + private ContentType contentType; + private ODataSerializer serializer; + + public ErrorResponse(ServiceMetadata metadata, ODataSerializer serializer, + ContentType contentType, ODataResponse response) { + super(metadata, response, new HashMap<String, String>()); + this.contentType = contentType; + this.serializer = serializer; + } + + @Override + public void accepts(ServiceResponseVisior visitor) + throws ODataLibraryException, ODataApplicationException { + visitor.visit(this); + } + + public void writeError(ODataServerError error) { + try { + writeHeader(HttpHeader.CONTENT_TYPE, this.contentType.getType()); + writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true); + } catch (SerializerException e) { + writeServerError(true); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java index 5facd96..c030336 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java @@ -21,6 +21,7 @@ package org.apache.olingo.server.core.responses; import java.util.Map; import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataServerError; @@ -63,6 +64,7 @@ public class MetadataResponse extends ServiceResponse { public void writeError(ODataServerError error) { try { + writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType()); writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true); } catch (SerializerException e) { writeServerError(true); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java index 1fc5416..f9c35ba 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java @@ -27,6 +27,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataResponse; @@ -148,6 +149,7 @@ public class PropertyResponse extends ServiceResponse { public void writeError(ODataServerError error) { try { + writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType()); writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true); } catch (SerializerException e) { writeServerError(true); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java index 0d7a88c..a4192e7 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java @@ -21,6 +21,7 @@ package org.apache.olingo.server.core.responses; import java.util.Map; import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataServerError; @@ -64,6 +65,7 @@ public class ServiceDocumentResponse extends ServiceResponse { public void writeError(ODataServerError error) { try { + writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType()); writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true); } catch (SerializerException e) { writeServerError(true); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java index 5be8113..fb73b8c 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java @@ -67,4 +67,8 @@ public class ServiceResponseVisior { ODataApplicationException { response.writeServerError(true); } + + public void visit(ErrorResponse response) { + response.writeServerError(true); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java index fea02e9..4d2dbb9 100644 --- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java +++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java @@ -40,9 +40,10 @@ import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.http.HttpMethod; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; -import org.apache.olingo.server.api.ODataLibraryException; +import org.apache.olingo.server.api.ODataServerError; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.api.uri.UriResourceNavigation; @@ -56,6 +57,7 @@ import org.apache.olingo.server.core.requests.ServiceDocumentRequest; import org.apache.olingo.server.core.responses.CountResponse; import org.apache.olingo.server.core.responses.EntityResponse; import org.apache.olingo.server.core.responses.EntitySetResponse; +import org.apache.olingo.server.core.responses.ErrorResponse; import org.apache.olingo.server.core.responses.MetadataResponse; import org.apache.olingo.server.core.responses.NoContentResponse; import org.apache.olingo.server.core.responses.PrimitiveValueResponse; @@ -561,4 +563,9 @@ public class TripPinHandler implements ServiceHandler { public boolean supportsDataIsolation() { return false; } + + @Override + public void processError(ODataServerError error, ErrorResponse response) { + response.writeError(error); + } }
