You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2016/02/09 21:48:52 UTC
olingo-odata4 git commit: OLINGO-874: Error handling improvements
Repository: olingo-odata4
Updated Branches:
refs/heads/master b7005b774 -> 7a68ae68a
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/master
Commit: 7a68ae68ad72f13927814700be0debc3b481f008
Parents: b7005b7
Author: Ramesh Reddy <ra...@jboss.org>
Authored: Tue Feb 9 13:10:02 2016 -0600
Committer: Ramesh Reddy <ra...@jboss.org>
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);
+ }
}