You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/07/22 16:50:13 UTC

[1/2] git commit: [OLINGO-348] Exceptionhandling on server side and message texts

Repository: olingo-odata4
Updated Branches:
  refs/heads/master a9ec75991 -> c58109466


[OLINGO-348] Exceptionhandling on server side and message texts


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/984ca341
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/984ca341
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/984ca341

Branch: refs/heads/master
Commit: 984ca3412b5fccc63c749b1a9f3fd8771e8342bf
Parents: a9ec759
Author: Christian Amend <ch...@apache.org>
Authored: Tue Jul 22 14:13:58 2014 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Tue Jul 22 16:45:13 2014 +0200

----------------------------------------------------------------------
 .../apache/olingo/server/api/ODataResponse.java |  2 +-
 .../server/api/ODataTranslatedException.java    | 10 ++++
 .../src/main/resources/i18n.properties          |  6 ++-
 .../apache/olingo/server/core/ODataHandler.java | 51 +++++++++++---------
 .../server/core/ODataHttpHandlerImpl.java       | 43 +++++++++++++----
 .../server/core/ODataHttpHandlerImplTest.java   | 22 ++++-----
 .../olingo/server/core/ODataHandlerTest.java    |  5 +-
 7 files changed, 93 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
index c1a16c0..74d5c61 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
@@ -28,7 +28,7 @@ import java.util.Map;
  */
 public class ODataResponse {
 
-  private int statusCode;
+  private int statusCode = 0;
   private Map<String, String> headers = new HashMap<String, String>();
   private InputStream content;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
index 621c38c..d980467 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
@@ -36,6 +36,12 @@ public class ODataTranslatedException extends ODataException {
   private static final String BUNDLE_NAME = "i18n";
   private static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
 
+  // MessageKeys
+  public static final String AMBIGUOUS_XHTTP_METHOD = "ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD";
+  public static final String HTTP_METHOD_NOT_IMPLEMENTED = "ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED";
+  public static final String PROCESSOR_NOT_IMPLEMENTED = "ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED";
+  public static final String ODATA_VERSION_NOT_SUPPORTED = "ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED";
+
   private String messageKey;
   private Object[] parameters;
 
@@ -51,6 +57,10 @@ public class ODataTranslatedException extends ODataException {
     this.parameters = parameters;
   }
 
+  public String getMessageKey() {
+    return messageKey;
+  }
+
   public String getTranslatedMessage(final Locale locale) {
     if (messageKey == null) {
       return getMessage();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-api/src/main/resources/i18n.properties
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/resources/i18n.properties b/lib/server-api/src/main/resources/i18n.properties
index cb6f2d3..9b2133c 100644
--- a/lib/server-api/src/main/resources/i18n.properties
+++ b/lib/server-api/src/main/resources/i18n.properties
@@ -17,4 +17,8 @@
 #        under the License.
 #-------------------------------------------------------------------------------
 # Basic Apache Olingo exception messages
-#
\ No newline at end of file
+#
+ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD=x-http-method header '%1$s' and x-http-method-override header '%2$s' are not the same.
+ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED=Invalid http method given: '%1$s'.
+ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED=No processor for interface '%1$s' registered.
+ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED=OData version '%1$s' is not supported.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
index a1f1911..b2ef568 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
@@ -18,6 +18,9 @@
  */
 package org.apache.olingo.server.core;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.olingo.commons.api.ODataRuntimeException;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
@@ -27,6 +30,7 @@ import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataTranslatedException;
 import org.apache.olingo.server.api.processor.CollectionProcessor;
 import org.apache.olingo.server.api.processor.DefaultProcessor;
 import org.apache.olingo.server.api.processor.EntityProcessor;
@@ -39,19 +43,14 @@ import org.apache.olingo.server.api.uri.UriResourceNavigation;
 import org.apache.olingo.server.api.uri.UriResourcePartTyped;
 import org.apache.olingo.server.core.uri.parser.Parser;
 import org.apache.olingo.server.core.uri.validator.UriValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.Map;
 
 public class ODataHandler {
 
-  private final static Logger LOG = LoggerFactory.getLogger(ODataHandler.class);
-
   private final OData odata;
   private final Edm edm;
-  private Map<Class<? extends Processor>, Processor> processors = new HashMap<Class<? extends Processor>, Processor>();
+  private final ODataResponse response;
+  private final Map<Class<? extends Processor>, Processor> processors =
+      new HashMap<Class<? extends Processor>, Processor>();
 
   public ODataHandler(final OData server, final Edm edm) {
     odata = server;
@@ -59,12 +58,13 @@ public class ODataHandler {
 
     register(new DefaultProcessor());
     register(new DefaultRedirectProcessor());
+    response = new ODataResponse();
   }
 
   public ODataResponse process(final ODataRequest request) {
-    try {
-      ODataResponse response = new ODataResponse();
+    ContentType requestedContentType = null;
 
+    try {
       validateODataVersion(request, response);
 
       Parser parser = new Parser();
@@ -75,7 +75,6 @@ public class ODataHandler {
       UriValidator validator = new UriValidator();
       validator.validate(uriInfo, request.getMethod());
 
-      ContentType requestedContentType = null;
       switch (uriInfo.getKind()) {
       case metadata:
         MetadataProcessor mp = selectProcessor(MetadataProcessor.class);
@@ -105,16 +104,19 @@ public class ODataHandler {
       default:
         throw new ODataRuntimeException("not implemented");
       }
-
-      return response;
     } catch (Exception e) {
-      // TODO OData error message handling
-      throw new RuntimeException(e);
+      ODataExceptionHandler exceptionHandler = new ODataExceptionHandler();
+      exceptionHandler.handle(response, e);
+//    exceptionHandler.setRequestedContentType(requestedContentType);
+//    exceptionHandler.setRequestedLocale();
+//    exceptionHandler.setExceptionProcessor() or setExceptionCallback()
     }
+    return response;
   }
 
   private void
-      handleResourceDispatching(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo) {
+      handleResourceDispatching(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo)
+          throws ODataTranslatedException {
     int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
     UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
     ContentType requestedContentType = null;
@@ -175,31 +177,34 @@ public class ODataHandler {
     }
   }
 
-  private void validateODataVersion(final ODataRequest request, final ODataResponse response) {
+  private void validateODataVersion(final ODataRequest request, final ODataResponse response)
+      throws ODataTranslatedException {
     String maxVersion = request.getHeader(HttpHeader.ODATA_MAX_VERSION);
+    response.setHeader(HttpHeader.ODATA_VERSION, ODataServiceVersion.V40.toString());
 
     if (maxVersion != null) {
       if (ODataServiceVersion.isBiggerThan(ODataServiceVersion.V40.toString(), maxVersion)) {
-        throw new ODataRuntimeException("400 Bad Request - ODataVersion not supported: " + maxVersion);
+        response.setStatusCode(400);
+        throw new ODataTranslatedException("ODataVersion not supported: " + maxVersion,
+            ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED, maxVersion);
       }
     }
-
-    response.setHeader(HttpHeader.ODATA_VERSION, ODataServiceVersion.V40.toString());
   }
 
-  private <T extends Processor> T selectProcessor(final Class<T> cls) {
+  private <T extends Processor> T selectProcessor(final Class<T> cls) throws ODataTranslatedException {
     @SuppressWarnings("unchecked")
     T p = (T) processors.get(cls);
 
     if (p == null) {
-      throw new ODataRuntimeException("Not implemented");
+      response.setStatusCode(501);
+      throw new ODataTranslatedException("Processor: " + cls.getName() + " not registered.",
+          ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED, cls.getName());
     }
 
     return p;
   }
 
   public void register(final Processor processor) {
-
     processor.init(odata, edm);
 
     for (Class<?> cls : processor.getClass().getInterfaces()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
index 06f0559..891cb4c 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
@@ -22,10 +22,12 @@ import org.apache.olingo.commons.api.ODataRuntimeException;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpMethod;
+import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataHttpHandler;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataTranslatedException;
 import org.apache.olingo.server.api.processor.Processor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,13 +54,34 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
 
   @Override
   public void process(final HttpServletRequest request, final HttpServletResponse response) {
-    ODataRequest odRequest = createODataRequest(request, 0);
-
-    ODataResponse odResponse = handler.process(odRequest);
+    ODataRequest odRequest = null;
+    ODataResponse odResponse = null;
+    try {
+      odRequest = createODataRequest(request, 0);
+      odResponse = handler.process(odRequest);
+      // ALL future methods after process must not throw exceptions!
+    } catch (Exception e) {
+      odResponse = handleException(e);
+    }
 
     convertToHttp(response, odResponse);
   }
 
+  private ODataResponse handleException(Exception e) {
+    ODataResponse resp = new ODataResponse();
+    if (e instanceof ODataTranslatedException) {
+      ODataTranslatedException exp = (ODataTranslatedException) e;
+      if (exp.getMessageKey() == ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD) {
+        resp.setStatusCode(HttpStatusCode.BAD_REQUEST.getStatusCode());
+      } else if (exp.getMessageKey() == ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED) {
+        resp.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
+      }
+    }
+    ODataExceptionHandler exceptionHandler = new ODataExceptionHandler();
+    exceptionHandler.handle(resp, e);
+    return resp;
+  }
+
   static void convertToHttp(final HttpServletResponse response, final ODataResponse odResponse) {
     response.setStatus(odResponse.getStatusCode());
 
@@ -91,7 +114,8 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
     }
   }
 
-  private ODataRequest createODataRequest(final HttpServletRequest httpRequest, final int split) {
+  private ODataRequest createODataRequest(final HttpServletRequest httpRequest, final int split)
+      throws ODataTranslatedException {
     try {
       ODataRequest odRequest = new ODataRequest();
 
@@ -106,9 +130,9 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
     }
   }
 
-  static void extractMethod(final ODataRequest odRequest, final HttpServletRequest httpRequest) {
+  static void extractMethod(final ODataRequest odRequest, final HttpServletRequest httpRequest)
+      throws ODataTranslatedException {
     try {
-
       HttpMethod httpRequestMethod = HttpMethod.valueOf(httpRequest.getMethod());
 
       if (httpRequestMethod == HttpMethod.POST) {
@@ -123,7 +147,8 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
           odRequest.setMethod(HttpMethod.valueOf(xHttpMethod));
         } else {
           if (!xHttpMethod.equalsIgnoreCase(xHttpMethodOverride)) {
-            throw new ODataRuntimeException("!!! HTTP 400 !!! Ambiguous X-HTTP-Methods!");
+            throw new ODataTranslatedException("Ambiguous X-HTTP-Methods",
+                ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD, xHttpMethod, xHttpMethodOverride);
           }
           odRequest.setMethod(HttpMethod.valueOf(xHttpMethod));
         }
@@ -131,12 +156,12 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
         odRequest.setMethod(httpRequestMethod);
       }
     } catch (IllegalArgumentException e) {
-      throw new ODataRuntimeException("!!! HTTP 501 !!!");
+      throw new ODataTranslatedException("Invalid http method" + httpRequest.getMethod(),
+          ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED, httpRequest.getMethod());
     }
   }
 
   static void extractUri(final ODataRequest odRequest, final HttpServletRequest httpRequest, final int split) {
-
     String rawRequestUri = httpRequest.getRequestURL().toString();
 
     String rawODataPath;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
index 9719a52..03fc0ea 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataHttpHandlerImplTest.java
@@ -18,26 +18,26 @@
  */
 package org.apache.olingo.server.core;
 
-import org.apache.olingo.commons.api.ODataRuntimeException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.server.api.ODataRequest;
+import org.apache.olingo.server.api.ODataTranslatedException;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.http.HttpServletRequest;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 public class ODataHttpHandlerImplTest {
 
   private final Logger LOG = LoggerFactory.getLogger(ODataHttpHandlerImplTest.class);
 
   @Test
-  public void extractMethod() {
+  public void extractMethod() throws Exception {
     String[][] mm = {
         { "GET", null, null, "GET" },
         { "GET", "xxx", "yyy", "GET" },
@@ -72,7 +72,7 @@ public class ODataHttpHandlerImplTest {
   }
 
   @Test
-  public void extractMethodFail() {
+  public void extractMethodFail() throws Exception {
     String[][] mm = {
         { "POST", "bla", null },
         { "POST", "MERGE", "PATCH" },
@@ -92,7 +92,7 @@ public class ODataHttpHandlerImplTest {
       try {
         ODataHttpHandlerImpl.extractMethod(odr, hr);
         fail();
-      } catch (ODataRuntimeException e) {}
+      } catch (ODataTranslatedException e) {}
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/984ca341/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
index 2566c32..86366b5 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
@@ -34,6 +34,8 @@ import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.sun.org.apache.bcel.internal.generic.GETSTATIC;
+
 import java.util.Arrays;
 
 import static org.junit.Assert.assertEquals;
@@ -172,7 +174,7 @@ public class ODataHandlerTest {
     assertEquals(ODataServiceVersion.V40.toString(), response.getHeaders().get(HttpHeader.ODATA_VERSION));
   }
 
-  @Test(expected = Exception.class)
+  @Test
   public void testMaxVersionNotSupported() {
     ODataRequest request = new ODataRequest();
 
@@ -184,6 +186,7 @@ public class ODataHandlerTest {
     assertNotNull(response);
 
     assertEquals(ODataServiceVersion.V40.toString(), response.getHeaders().get(HttpHeader.ODATA_VERSION));
+    assertEquals(400, response.getStatusCode());
   }
 
 }


[2/2] git commit: [OLINGO-348] Exception refactoring on server side

Posted by ch...@apache.org.
[OLINGO-348] Exception refactoring on server side


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/c5810946
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/c5810946
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/c5810946

Branch: refs/heads/master
Commit: c58109466fec654dde0b29567d2b213a90a57b80
Parents: 984ca34
Author: Christian Amend <ch...@apache.org>
Authored: Tue Jul 22 16:28:39 2014 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Tue Jul 22 16:45:14 2014 +0200

----------------------------------------------------------------------
 .../server/api/ODataApplicationException.java   |   6 +-
 .../olingo/server/api/ODataHttpHandler.java     |   6 +
 .../apache/olingo/server/api/ODataResponse.java |   4 +-
 .../olingo/server/api/ODataServerError.java     | 123 +++++++++++++++++++
 .../server/api/ODataTranslatedException.java    |  49 ++++++--
 .../server/api/processor/DefaultProcessor.java  |  43 ++++---
 .../api/processor/ExceptionProcessor.java       |  33 +++++
 .../server/api/processor/MetadataProcessor.java |  12 +-
 .../server/api/serializer/ODataSerializer.java  |   8 +-
 .../server/api/TranslatedExceptionsTest.java    |  51 +++++---
 .../server/core/ODataExceptionHandler.java      |  52 ++++++++
 .../server/core/ODataExceptionHelper.java       |  59 +++++++++
 .../apache/olingo/server/core/ODataHandler.java |  72 ++++++++---
 .../server/core/ODataHttpHandlerImpl.java       |   8 +-
 .../core/serializer/ODataXmlSerializerImpl.java |  15 +--
 .../serializer/json/ODataJsonSerializer.java    |   4 +-
 .../json/ODataErrorSerializerTest.java          |  36 +++---
 .../olingo/server/core/ODataHandlerTest.java    |  20 ++-
 18 files changed, 489 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataApplicationException.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataApplicationException.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataApplicationException.java
index 8816316..3fb6b4d 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataApplicationException.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataApplicationException.java
@@ -20,7 +20,9 @@ package org.apache.olingo.server.api;
 
 import java.util.Locale;
 
-public class ODataApplicationException extends Exception {
+import org.apache.olingo.commons.api.ODataException;
+
+public class ODataApplicationException extends ODataException {
 
   private static final long serialVersionUID = 5358683245923127425L;
   private int statusCode = 500;
@@ -62,7 +64,7 @@ public class ODataApplicationException extends Exception {
     return locale;
   }
 
-  public String getoDataErrorCode() {
+  public String getODataErrorCode() {
     return oDataErrorCode;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHttpHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHttpHandler.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHttpHandler.java
index 03e5e38..9812927 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHttpHandler.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHttpHandler.java
@@ -42,4 +42,10 @@ public interface ODataHttpHandler {
    */
   void register(Processor processor);
 
+  /**
+   * Sets the split parameter which is used for service resolution. Default is 0. 
+   * @param split
+   */
+  void setSplit(int split);
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
index 74d5c61..b16f60c 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataResponse.java
@@ -23,12 +23,14 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.olingo.commons.api.http.HttpStatusCode;
+
 /**
  * Response object to carry OData relevant http information (statusCode, content & response headers)
  */
 public class ODataResponse {
 
-  private int statusCode = 0;
+  private int statusCode = HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode();
   private Map<String, String> headers = new HashMap<String, String>();
   private InputStream content;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java
new file mode 100644
index 0000000..434372a
--- /dev/null
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java
@@ -0,0 +1,123 @@
+/*
+ * 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.api;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.olingo.commons.api.domain.ODataError;
+import org.apache.olingo.commons.api.domain.ODataErrorDetail;
+
+public class ODataServerError extends ODataError {
+
+  private Exception exception;
+  private int statusCode;
+  private Locale locale;
+
+  /**
+   * @return the locale for the exception message
+   */
+  public Locale getLocale() {
+    return locale;
+  }
+
+  public ODataServerError setLocale(Locale locale) {
+    this.locale = locale;
+    return this;
+  }
+
+  /**
+   * @return the exception with its hierarchy
+   */
+  public Exception getException() {
+    return exception;
+  }
+
+  public ODataServerError setException(Exception exception) {
+    this.exception = exception;
+    return this;
+  }
+
+  /**
+   * @return the status code which this error results in.
+   */
+  public int getStatusCode() {
+    return statusCode;
+  }
+
+  public ODataServerError setStatusCode(int statusCode) {
+    this.statusCode = statusCode;
+    return this;
+  }
+
+  /**
+   * The value for the code name/value pair is a language-independent string. Its value is a service-defined error code.
+   * This code serves as a sub-status for the HTTP error code specified in the response. MAY be null.
+   * @param code
+   * @return this for method chaining
+   */
+  public ODataServerError setCode(String code) {
+    super.setCode(code);
+    return this;
+  }
+
+  /**
+   * The value for the message name/value pair MUST be a human-readable, language-dependent representation of the error.
+   * MUST not be null
+   * @param message
+   * @return this for method chaining
+   */
+  public ODataServerError setMessage(String message) {
+    super.setMessage(message);
+    return this;
+  }
+
+  /**
+   * The value for the target name/value pair is the target of the particular error (for example, the name of the
+   * property in error). MAY be null.
+   * @param target
+   * @return this for method chaining
+   */
+  public ODataServerError setTarget(String target) {
+    super.setTarget(target);
+    return this;
+  }
+
+  /**
+   * Sets error details.
+   * 
+   * @return this for method chaining.
+   */
+  public ODataServerError setDetails(List<ODataErrorDetail> details) {
+    super.setDetails(details);
+    return this;
+  }
+
+  /**
+   * Sets server defined key-value pairs for debug environment only.
+   * 
+   * @return this for method chaining.
+   */
+  public ODataServerError setInnerError(Map<String, String> innerError) {
+    super.setInnerError(innerError);
+    return this;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
index d980467..9eac1e1 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataTranslatedException.java
@@ -34,8 +34,8 @@ public class ODataTranslatedException extends ODataException {
   private static final long serialVersionUID = -1210541002198287561L;
   private static final Logger log = LoggerFactory.getLogger(ODataTranslatedException.class);
   private static final String BUNDLE_NAME = "i18n";
-  private static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
-
+  
+  public static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
   // MessageKeys
   public static final String AMBIGUOUS_XHTTP_METHOD = "ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD";
   public static final String HTTP_METHOD_NOT_IMPLEMENTED = "ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED";
@@ -51,6 +51,11 @@ public class ODataTranslatedException extends ODataException {
     this.parameters = parameters;
   }
 
+  @Override
+  public String getLocalizedMessage() {
+    return getTranslatedMessage(DEFAULT_LOCALE).getMessage();
+  }
+
   public ODataTranslatedException(String developmentMessage, Throwable cause, String messageKey, String... parameters) {
     super(developmentMessage, cause);
     this.messageKey = messageKey;
@@ -61,13 +66,13 @@ public class ODataTranslatedException extends ODataException {
     return messageKey;
   }
 
-  public String getTranslatedMessage(final Locale locale) {
+  public ODataErrorMessage getTranslatedMessage(final Locale locale) {
     if (messageKey == null) {
-      return getMessage();
+      return new ODataErrorMessage(getMessage(), DEFAULT_LOCALE);
     }
     ResourceBundle bundle = createResourceBundle(locale);
     if (bundle == null) {
-      return getMessage();
+      return new ODataErrorMessage(getMessage(), DEFAULT_LOCALE);
     }
 
     return buildMessage(bundle, locale);
@@ -87,7 +92,7 @@ public class ODataTranslatedException extends ODataException {
     return bundle;
   }
 
-  private String buildMessage(ResourceBundle bundle, Locale locale) {
+  private ODataErrorMessage buildMessage(ResourceBundle bundle, Locale locale) {
     String message = null;
 
     try {
@@ -96,14 +101,34 @@ public class ODataTranslatedException extends ODataException {
       Formatter f = new Formatter(builder, locale);
       f.format(message, parameters);
       f.close();
-
-      return builder.toString();
-
+      Locale usedLocale = bundle.getLocale();
+      if (usedLocale == Locale.ROOT || Locale.ROOT.equals(usedLocale)) {
+        usedLocale = DEFAULT_LOCALE;
+      }
+      return new ODataErrorMessage(builder.toString(), usedLocale);
     } catch (MissingResourceException e) {
-      return "Missing message for key '" + messageKey + "'!";
+      return new ODataErrorMessage("Missing message for key '" + messageKey + "'!", DEFAULT_LOCALE);
     } catch (MissingFormatArgumentException e) {
-      return "Missing replacement for place holder in message '" + message +
-          "' for following arguments '" + Arrays.toString(parameters) + "'!";
+      return new ODataErrorMessage("Missing replacement for place holder in message '" + message +
+          "' for following arguments '" + Arrays.toString(parameters) + "'!", DEFAULT_LOCALE);
+    }
+  }
+
+  public class ODataErrorMessage {
+    String message;
+    Locale locale;
+
+    public ODataErrorMessage(String message, Locale usedLocale) {
+      this.message = message;
+      this.locale = usedLocale;
+    }
+
+    public String getMessage() {
+      return message;
+    }
+
+    public Locale getLocale() {
+      return locale;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/DefaultProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/DefaultProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/DefaultProcessor.java
index 4595385..548c902 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/DefaultProcessor.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/DefaultProcessor.java
@@ -18,23 +18,26 @@
  */
 package org.apache.olingo.server.api.processor;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.format.ODataFormat;
 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.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.apache.olingo.server.api.uri.UriInfo;
 
-import java.io.InputStream;
-
 /**
- * Processor implementation for handling of metadata and service document. This implementation is registerd in the 
+ * Processor implementation for handling of metadata and service document. This implementation is registerd in the
  * ODataHandler by default. The default can be replaced by re-registering an custom implementation.
  */
-public class DefaultProcessor implements MetadataProcessor, ServiceDocumentProcessor {
+public class DefaultProcessor implements MetadataProcessor, ServiceDocumentProcessor, ExceptionProcessor {
 
   private OData odata;
   private Edm edm;
@@ -48,11 +51,8 @@ public class DefaultProcessor implements MetadataProcessor, ServiceDocumentProce
   @Override
   public void readServiceDocument(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
       final ContentType requestedContentType) {
-    ODataSerializer serializer;
-    InputStream responseEntity;
-
-    serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
-    responseEntity = serializer.serviceDocument(edm, request.getRawBaseUri());
+    ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
+    InputStream responseEntity = serializer.serviceDocument(edm, request.getRawBaseUri());
 
     response.setStatusCode(200);
     response.setContent(responseEntity);
@@ -63,14 +63,29 @@ public class DefaultProcessor implements MetadataProcessor, ServiceDocumentProce
   @Override
   public void readMetadata(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
       final ContentType requestedContentType) {
-    ODataSerializer serializer;
-    InputStream responseEntity;
-
-    serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
-    responseEntity = serializer.metadataDocument(edm);
+    ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
+    InputStream responseEntity = serializer.metadataDocument(edm);
     response.setStatusCode(200);
     response.setContent(responseEntity);
     response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
   }
 
+  @Override
+  public void processException(ODataRequest request, ODataResponse response, ODataServerError serverError,
+      ContentType requestedContentType) {
+    try {
+      ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
+      InputStream responseEntity = serializer.error(serverError);
+      response.setStatusCode(serverError.getStatusCode());
+      response.setContent(responseEntity);
+      response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
+    } catch (Exception e) {
+      // This should never happen but to be sure we have this catch here to prevent sending a stacktrace to a client.
+      String responseContent =
+          "An unexpected exception occoured during error processing with message: \"" + e.getMessage() + "\"";
+      response.setContent(new ByteArrayInputStream(responseContent.getBytes()));
+      response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
+      response.setHeader(HttpHeader.CONTENT_TYPE, ContentType.APPLICATION_JSON.toContentTypeString());
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ExceptionProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ExceptionProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ExceptionProcessor.java
new file mode 100644
index 0000000..f4b4f3e
--- /dev/null
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/ExceptionProcessor.java
@@ -0,0 +1,33 @@
+/*
+ * 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.api.processor;
+
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.server.api.ODataRequest;
+import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataServerError;
+
+/**
+ * Processor which is called if any exception occurs inside the library or another processor
+ */
+public interface ExceptionProcessor extends Processor{
+
+  public void processException(ODataRequest request, ODataResponse response, ODataServerError serverError,
+      final ContentType requestedContentType);
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/MetadataProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/MetadataProcessor.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/MetadataProcessor.java
index b1caebd..331ba72 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/MetadataProcessor.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/processor/MetadataProcessor.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.server.api.processor;
 
 import org.apache.olingo.commons.api.format.ContentType;
+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.uri.UriInfo;
@@ -30,10 +31,11 @@ public interface MetadataProcessor extends Processor {
 
   /**
    * Read data from persistency and puts serialized content and status into the response.
-   *  @param request - OData request object containing raw http information.
-   *  @param response - OData response object for collecting response data
-   *  @param uriInfo - information of a parsed OData uri
-   *  @param requestedContentType - requested content type after content negotiation
+   * @param request - OData request object containing raw http information.
+   * @param response - OData response object for collecting response data
+   * @param uriInfo - information of a parsed OData uri
+   * @param requestedContentType - requested content type after content negotiation
    */
-  void readMetadata(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestedContentType);
+  void readMetadata(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestedContentType)
+      throws ODataApplicationException;
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
index 8f2bdd5..9206b4f 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java
@@ -18,14 +18,14 @@
  */
 package org.apache.olingo.server.api.serializer;
 
+import java.io.InputStream;
+
 import org.apache.olingo.commons.api.data.ContextURL;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntitySet;
-import org.apache.olingo.commons.api.domain.ODataError;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
-
-import java.io.InputStream;
+import org.apache.olingo.server.api.ODataServerError;
 
 public interface ODataSerializer {
 
@@ -44,5 +44,5 @@ public interface ODataSerializer {
    * @param error the main error
    * @return inputStream containing the OData formatted error
    */
-  InputStream error(ODataError error);
+  InputStream error(ODataServerError error);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-api/src/test/java/org/apache/olingo/server/api/TranslatedExceptionsTest.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/test/java/org/apache/olingo/server/api/TranslatedExceptionsTest.java b/lib/server-api/src/test/java/org/apache/olingo/server/api/TranslatedExceptionsTest.java
index 066dc80..55514fe 100644
--- a/lib/server-api/src/test/java/org/apache/olingo/server/api/TranslatedExceptionsTest.java
+++ b/lib/server-api/src/test/java/org/apache/olingo/server/api/TranslatedExceptionsTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.Locale;
 
+import org.apache.olingo.server.api.ODataTranslatedException.ODataErrorMessage;
 import org.junit.Test;
 
 public class TranslatedExceptionsTest {
@@ -43,25 +44,28 @@ public class TranslatedExceptionsTest {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, BASIC);
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertEquals("Test Default", translatedMessage);
+    assertEquals("Test Default", translatedMessage.getMessage());
 
     translatedMessage = exp.getTranslatedMessage(Locale.ENGLISH);
     assertNotNull(translatedMessage);
-    assertEquals("Test Default", translatedMessage);
+    assertEquals("Test Default", translatedMessage.getMessage());
+    assertEquals(Locale.ENGLISH, translatedMessage.getLocale());
 
     translatedMessage = exp.getTranslatedMessage(Locale.UK);
     assertNotNull(translatedMessage);
-    assertEquals("Test Default", translatedMessage);
+    assertEquals("Test Default", translatedMessage.getMessage());
 
     translatedMessage = exp.getTranslatedMessage(Locale.GERMAN);
     assertNotNull(translatedMessage);
-    assertEquals("Test DE", translatedMessage);
+    assertEquals("Test DE", translatedMessage.getMessage());
+    assertEquals(Locale.GERMAN, translatedMessage.getLocale());
 
     translatedMessage = exp.getTranslatedMessage(Locale.GERMANY);
     assertNotNull(translatedMessage);
-    assertEquals("Test DE", translatedMessage);
+    assertEquals("Test DE", translatedMessage.getMessage());
+    assertEquals(Locale.GERMAN, translatedMessage.getLocale());
   }
 
   @Test
@@ -69,9 +73,9 @@ public class TranslatedExceptionsTest {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, BASIC, "unusedParam1", "unusedParam2");
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertEquals("Test Default", translatedMessage);
+    assertEquals("Test Default", translatedMessage.getMessage());
   }
 
   @Test
@@ -79,9 +83,9 @@ public class TranslatedExceptionsTest {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM, "usedParam1");
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertEquals("Param1: usedParam1", translatedMessage);
+    assertEquals("Param1: usedParam1", translatedMessage.getMessage());
   }
 
   @Test
@@ -89,9 +93,9 @@ public class TranslatedExceptionsTest {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM, "usedParam1", "unusedParam2");
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertEquals("Param1: usedParam1", translatedMessage);
+    assertEquals("Param1: usedParam1", translatedMessage.getMessage());
   }
 
   @Test
@@ -99,9 +103,9 @@ public class TranslatedExceptionsTest {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, TWOPARAM, "usedParam1", "usedParam2");
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertEquals("Param1: usedParam1 Param2: usedParam2", translatedMessage);
+    assertEquals("Param1: usedParam1 Param2: usedParam2", translatedMessage.getMessage());
   }
 
   @Test
@@ -109,19 +113,28 @@ public class TranslatedExceptionsTest {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM);
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertTrue(translatedMessage.contains("Missing replacement for place holder in message"));
+    assertTrue(translatedMessage.getMessage().contains("Missing replacement for place holder in message"));
   }
-  
+
   @Test
   public void noMessageForKey() {
     ODataTranslatedException exp = new ODataTranslatedException(DEV, "NOMESSAGE");
     assertEquals(DEV, exp.getMessage());
 
-    String translatedMessage = exp.getTranslatedMessage(null);
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
     assertNotNull(translatedMessage);
-    assertTrue(translatedMessage.contains("Missing message for key"));
+    assertTrue(translatedMessage.getMessage().contains("Missing message for key"));
   }
 
+  @Test
+  public void keyForRootBundleButNotPresentInDerivedBundle() {
+    ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM, "param1");
+    assertEquals(DEV, exp.getMessage());
+    
+    ODataErrorMessage translatedMessage = exp.getTranslatedMessage(Locale.GERMAN);
+    assertNotNull(translatedMessage);
+    assertEquals("Param1: param1", translatedMessage.getMessage());
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHandler.java
new file mode 100644
index 0000000..cb2d183
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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;
+
+import java.io.InputStream;
+import java.util.Locale;
+
+import org.apache.olingo.commons.api.format.ODataFormat;
+import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataServerError;
+import org.apache.olingo.server.api.ODataTranslatedException;
+import org.apache.olingo.server.api.serializer.ODataSerializer;
+
+public class ODataExceptionHandler {
+
+  public Locale requestedLocale;
+  public ODataFormat requestedFormat = ODataFormat.JSON;
+
+  public void handle(ODataResponse resp, Exception e) {
+    if (resp.getStatusCode() == 0) {
+      resp.setStatusCode(500);
+    }
+    ODataServerError error = new ODataServerError();
+    if (e instanceof ODataTranslatedException) {
+      error.setMessage(((ODataTranslatedException) e).getTranslatedMessage(requestedLocale).getMessage());
+    } else {
+      error.setMessage(e.getMessage());
+    }
+
+    ODataSerializer serializer = OData.newInstance().createSerializer(requestedFormat);
+    InputStream errorStream = serializer.error(error);
+    resp.setContent(errorStream);
+    // Set header
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHelper.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHelper.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHelper.java
new file mode 100644
index 0000000..3ba30c7
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataExceptionHelper.java
@@ -0,0 +1,59 @@
+/*
+ * 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;
+
+import java.util.Locale;
+
+import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataServerError;
+import org.apache.olingo.server.api.ODataTranslatedException;
+import org.apache.olingo.server.api.ODataTranslatedException.ODataErrorMessage;
+
+public class ODataExceptionHelper {
+
+  public static ODataServerError createServerErrorObject(Exception e, int statusCode) {
+    ODataServerError serverError = basicServerError(e);
+    serverError.setStatusCode(statusCode);
+    serverError.setLocale(Locale.ENGLISH);
+    return serverError;
+  }
+
+  public static ODataServerError createServerErrorObject(ODataTranslatedException e, int statusCode,
+      Locale requestedLocale) {
+    ODataServerError serverError = basicServerError(e);
+    ODataErrorMessage translatedMessage = e.getTranslatedMessage(requestedLocale);
+    serverError.setMessage(translatedMessage.getMessage());
+    serverError.setLocale(translatedMessage.getLocale());
+    serverError.setStatusCode(statusCode);
+    return serverError;
+  }
+
+  public static ODataServerError createServerErrorObject(ODataApplicationException e) {
+    ODataServerError serverError = basicServerError(e);
+    serverError.setStatusCode(e.getStatusCode());
+    serverError.setLocale(e.getLocale());
+    serverError.setCode(e.getODataErrorCode());
+    return serverError;
+  }
+  
+  private static ODataServerError basicServerError(Exception e) {
+    ODataServerError serverError = new ODataServerError().setException(e).setMessage(e.getMessage());
+    return serverError;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
index b2ef568..4f823bb 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
@@ -19,21 +19,26 @@
 package org.apache.olingo.server.core;
 
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.olingo.commons.api.ODataRuntimeException;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.format.ODataFormat;
 import org.apache.olingo.commons.api.http.HttpHeader;
 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.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.ODataTranslatedException;
 import org.apache.olingo.server.api.processor.CollectionProcessor;
 import org.apache.olingo.server.api.processor.DefaultProcessor;
 import org.apache.olingo.server.api.processor.EntityProcessor;
+import org.apache.olingo.server.api.processor.ExceptionProcessor;
 import org.apache.olingo.server.api.processor.MetadataProcessor;
 import org.apache.olingo.server.api.processor.Processor;
 import org.apache.olingo.server.api.processor.ServiceDocumentProcessor;
@@ -48,7 +53,6 @@ public class ODataHandler {
 
   private final OData odata;
   private final Edm edm;
-  private final ODataResponse response;
   private final Map<Class<? extends Processor>, Processor> processors =
       new HashMap<Class<? extends Processor>, Processor>();
 
@@ -58,15 +62,14 @@ public class ODataHandler {
 
     register(new DefaultProcessor());
     register(new DefaultRedirectProcessor());
-    response = new ODataResponse();
   }
 
   public ODataResponse process(final ODataRequest request) {
     ContentType requestedContentType = null;
-
+    ODataResponse response = new ODataResponse();
     try {
       validateODataVersion(request, response);
-
+      
       Parser parser = new Parser();
       String odUri =
           request.getRawODataPath() + (request.getRawQueryPath() == null ? "" : "?" + request.getRawQueryPath());
@@ -77,7 +80,7 @@ public class ODataHandler {
 
       switch (uriInfo.getKind()) {
       case metadata:
-        MetadataProcessor mp = selectProcessor(MetadataProcessor.class);
+        MetadataProcessor mp = selectProcessor(MetadataProcessor.class, response);
 
         requestedContentType =
             ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, mp, MetadataProcessor.class);
@@ -86,10 +89,10 @@ public class ODataHandler {
         break;
       case service:
         if ("".equals(request.getRawODataPath())) {
-          RedirectProcessor rdp = selectProcessor(RedirectProcessor.class);
+          RedirectProcessor rdp = selectProcessor(RedirectProcessor.class, response);
           rdp.redirect(request, response);
         } else {
-          ServiceDocumentProcessor sdp = selectProcessor(ServiceDocumentProcessor.class);
+          ServiceDocumentProcessor sdp = selectProcessor(ServiceDocumentProcessor.class, response);
 
           requestedContentType =
               ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, sdp,
@@ -104,16 +107,50 @@ public class ODataHandler {
       default:
         throw new ODataRuntimeException("not implemented");
       }
+    } catch (ODataTranslatedException e) {
+      Locale requestedLocale = null;
+      ODataServerError serverError =
+          ODataExceptionHelper.createServerErrorObject(e, response.getStatusCode(), requestedLocale);
+      handleException(request, response, serverError, requestedContentType);
+    } catch (ODataApplicationException e) {
+      ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e);
+      handleException(request, response, serverError, requestedContentType);
     } catch (Exception e) {
-      ODataExceptionHandler exceptionHandler = new ODataExceptionHandler();
-      exceptionHandler.handle(response, e);
-//    exceptionHandler.setRequestedContentType(requestedContentType);
-//    exceptionHandler.setRequestedLocale();
-//    exceptionHandler.setExceptionProcessor() or setExceptionCallback()
+      ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e, response.getStatusCode());
+      handleException(request, response, serverError, requestedContentType);
     }
     return response;
   }
 
+  private void handleException(ODataRequest request, ODataResponse response, ODataServerError serverError,
+      ContentType requestedContentType) {
+    try {
+      ExceptionProcessor exceptionProcessor = selectProcessor(ExceptionProcessor.class, response);
+      if (requestedContentType == null) {
+        requestedContentType = ODataFormat.JSON.getContentType(ODataServiceVersion.V40);
+      }
+      exceptionProcessor.processException(request, response, serverError, requestedContentType);
+    } catch (ODataTranslatedException e1) {
+      throw new ODataRuntimeException("Could not instanciate ExceptionProcessor");
+    }
+  }
+
+//  private void handleException(ODataRequest request, ODataResponse response, ODataTranslatedException e,
+//      ContentType requestedContentType) {
+//    try {
+//      ExceptionProcessor exceptionProcessor = selectProcessor(ExceptionProcessor.class, response);
+//      Locale requestedLocale = null;
+//      ODataServerError serverError =
+//          ODataExceptionHelper.createServerErrorObject(e, response.getStatusCode(), requestedLocale);
+//      if (requestedContentType == null) {
+//        requestedContentType = ODataFormat.JSON.getContentType(ODataServiceVersion.V40);
+//      }
+//      exceptionProcessor.processException(request, response, serverError, requestedContentType);
+//    } catch (ODataTranslatedException e1) {
+//      throw new ODataRuntimeException("Could not instanciate ExceptionProcessor", e);
+//    }
+//  }
+
   private void
       handleResourceDispatching(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo)
           throws ODataTranslatedException {
@@ -125,7 +162,7 @@ public class ODataHandler {
     case entitySet:
       if (((UriResourcePartTyped) lastPathSegment).isCollection()) {
         if (request.getMethod().equals(HttpMethod.GET)) {
-          CollectionProcessor cp = selectProcessor(CollectionProcessor.class);
+          CollectionProcessor cp = selectProcessor(CollectionProcessor.class, response);
 
           requestedContentType =
               ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, cp, CollectionProcessor.class);
@@ -136,7 +173,7 @@ public class ODataHandler {
         }
       } else {
         if (request.getMethod().equals(HttpMethod.GET)) {
-          EntityProcessor ep = selectProcessor(EntityProcessor.class);
+          EntityProcessor ep = selectProcessor(EntityProcessor.class, response);
 
           requestedContentType =
               ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, ep, EntityProcessor.class);
@@ -150,7 +187,7 @@ public class ODataHandler {
     case navigationProperty:
       if (((UriResourceNavigation) lastPathSegment).isCollection()) {
         if (request.getMethod().equals(HttpMethod.GET)) {
-          CollectionProcessor cp = selectProcessor(CollectionProcessor.class);
+          CollectionProcessor cp = selectProcessor(CollectionProcessor.class, response);
 
           requestedContentType =
               ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, cp, CollectionProcessor.class);
@@ -161,7 +198,7 @@ public class ODataHandler {
         }
       } else {
         if (request.getMethod().equals(HttpMethod.GET)) {
-          EntityProcessor ep = selectProcessor(EntityProcessor.class);
+          EntityProcessor ep = selectProcessor(EntityProcessor.class, response);
 
           requestedContentType =
               ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, ep, EntityProcessor.class);
@@ -191,7 +228,8 @@ public class ODataHandler {
     }
   }
 
-  private <T extends Processor> T selectProcessor(final Class<T> cls) throws ODataTranslatedException {
+  private <T extends Processor> T selectProcessor(final Class<T> cls, ODataResponse response)
+      throws ODataTranslatedException {
     @SuppressWarnings("unchecked")
     T p = (T) processors.get(cls);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
index 891cb4c..e245fc2 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
@@ -47,6 +47,7 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
   private static final Logger LOG = LoggerFactory.getLogger(ODataHttpHandlerImpl.class);
 
   private ODataHandler handler;
+  private int split = 0;
 
   public ODataHttpHandlerImpl(final OData odata, final Edm edm) {
     handler = new ODataHandler(odata, edm);
@@ -57,7 +58,7 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
     ODataRequest odRequest = null;
     ODataResponse odResponse = null;
     try {
-      odRequest = createODataRequest(request, 0);
+      odRequest = createODataRequest(request, split);
       odResponse = handler.process(odRequest);
       // ALL future methods after process must not throw exceptions!
     } catch (Exception e) {
@@ -66,6 +67,11 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
 
     convertToHttp(response, odResponse);
   }
+  
+  @Override
+  public void setSplit(int split) {
+    this.split = split;
+  }
 
   private ODataResponse handleException(Exception e) {
     ODataResponse resp = new ODataResponse();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
index ad7c80c..40f96a9 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ODataXmlSerializerImpl.java
@@ -18,24 +18,25 @@
  */
 package org.apache.olingo.server.core.serializer;
 
+import java.io.InputStream;
+
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
 import org.apache.olingo.commons.api.ODataRuntimeException;
 import org.apache.olingo.commons.api.data.ContextURL;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntitySet;
-import org.apache.olingo.commons.api.domain.ODataError;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.apache.olingo.server.core.serializer.utils.CircleStreamBuffer;
 import org.apache.olingo.server.core.serializer.xml.MetadataDocumentXmlSerializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import java.io.InputStream;
-
 public class ODataXmlSerializerImpl implements ODataSerializer {
 
   private static final Logger log = LoggerFactory.getLogger(ODataXmlSerializerImpl.class);
@@ -86,7 +87,7 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
   }
 
   @Override
-  public InputStream error(ODataError error) {
+  public InputStream error(ODataServerError error) {
     throw new ODataRuntimeException("error serialization not implemented for XML format");
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
index 27af0d8..bc4cbc9 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
@@ -30,7 +30,6 @@ import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntitySet;
 import org.apache.olingo.commons.api.data.LinkedComplexValue;
 import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.domain.ODataError;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmComplexType;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
@@ -41,6 +40,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.EdmProperty;
 import org.apache.olingo.commons.api.format.ODataFormat;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.apache.olingo.server.core.serializer.utils.CircleStreamBuffer;
 import org.slf4j.Logger;
@@ -101,7 +101,7 @@ public class ODataJsonSerializer implements ODataSerializer {
   }
 
   @Override
-  public InputStream error(final ODataError error) {
+  public InputStream error(final ODataServerError error) {
     CircleStreamBuffer buffer = new CircleStreamBuffer();
     try {
       JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializerTest.java
index e159004..9d64ce1 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializerTest.java
@@ -18,25 +18,26 @@
  */
 package org.apache.olingo.server.core.serializer.json;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.JsonNodeType;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.olingo.commons.api.ODataRuntimeException;
-import org.apache.olingo.commons.api.domain.ODataError;
 import org.apache.olingo.commons.api.domain.ODataErrorDetail;
 import org.apache.olingo.commons.api.format.ODataFormat;
 import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
 
 public class ODataErrorSerializerTest {
 
@@ -49,7 +50,7 @@ public class ODataErrorSerializerTest {
 
   @Test
   public void basicODataErrorNoCode() throws Exception {
-    ODataError error = new ODataError();
+    ODataServerError error = new ODataServerError();
     error.setMessage("ErrorMessage");
     InputStream stream = ser.error(error);
     String jsonString = IOUtils.toString(stream);
@@ -58,7 +59,7 @@ public class ODataErrorSerializerTest {
 
   @Test
   public void basicODataErrorWithCode() throws Exception {
-    ODataError error = new ODataError();
+    ODataServerError error = new ODataServerError();
     error.setCode("Code").setMessage("ErrorMessage");
     InputStream stream = ser.error(error);
     String jsonString = IOUtils.toString(stream);
@@ -67,7 +68,7 @@ public class ODataErrorSerializerTest {
 
   @Test
   public void basicODataErrorWithCodeAndTarget() throws Exception {
-    ODataError error = new ODataError();
+    ODataServerError error = new ODataServerError();
     error.setCode("Code").setMessage("ErrorMessage").setTarget("Target");
     InputStream stream = ser.error(error);
     String jsonString = IOUtils.toString(stream);
@@ -81,7 +82,7 @@ public class ODataErrorSerializerTest {
 
   @Test
   public void emptyDetailsList() throws Exception {
-    ODataError error = new ODataError();
+    ODataServerError error = new ODataServerError();
     error.setMessage("ErrorMessage").setDetails(new ArrayList<ODataErrorDetail>());
     InputStream stream = ser.error(error);
     String jsonString = IOUtils.toString(stream);
@@ -90,7 +91,7 @@ public class ODataErrorSerializerTest {
 
   @Test
   public void nothingSetAtODataErrorObject() throws Exception {
-    ODataError error = new ODataError();
+    ODataServerError error = new ODataServerError();
     InputStream stream = ser.error(error);
     String jsonString = IOUtils.toString(stream);
     assertEquals("{\"error\":{\"code\":null,\"message\":null}}", jsonString);
@@ -100,7 +101,7 @@ public class ODataErrorSerializerTest {
   public void singleDetailNothingSet() throws Exception {
     List<ODataErrorDetail> details = new ArrayList<ODataErrorDetail>();
     details.add(new ODataErrorDetail());
-    ODataError error = new ODataError().setDetails(details);
+    ODataServerError error = new ODataServerError().setDetails(details);
     InputStream stream = ser.error(error);
     String jsonString = IOUtils.toString(stream);
     assertEquals("{\"error\":{\"code\":null,\"message\":null,\"details\":[{\"code\":null,\"message\":null}]}}",
@@ -111,7 +112,8 @@ public class ODataErrorSerializerTest {
   public void verifiedWithJacksonParser() throws Exception {
     List<ODataErrorDetail> details = new ArrayList<ODataErrorDetail>();
     details.add(new ODataErrorDetail().setCode("detailCode").setMessage("detailMessage").setTarget("detailTarget"));
-    ODataError error = new ODataError().setCode("Code").setMessage("Message").setTarget("Target").setDetails(details);
+    ODataServerError error =
+        new ODataServerError().setCode("Code").setMessage("Message").setTarget("Target").setDetails(details);
     InputStream stream = ser.error(error);
     JsonNode tree = new ObjectMapper().readTree(stream);
     assertNotNull(tree);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c5810946/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
index 86366b5..efd0e65 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/ODataHandlerTest.java
@@ -18,6 +18,13 @@
  */
 package org.apache.olingo.server.core;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import java.util.Arrays;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
@@ -34,15 +41,6 @@ import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.sun.org.apache.bcel.internal.generic.GETSTATIC;
-
-import java.util.Arrays;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-
 public class ODataHandlerTest {
 
   private ODataHandler handler;
@@ -69,7 +67,7 @@ public class ODataHandlerTest {
     ODataResponse response = handler.process(request);
 
     assertNotNull(response);
-    assertEquals(0, response.getStatusCode());
+    assertEquals(500, response.getStatusCode());
   }
 
   @Test
@@ -125,7 +123,7 @@ public class ODataHandlerTest {
     ODataResponse response = handler.process(request);
 
     assertNotNull(response);
-    assertEquals(0, response.getStatusCode());
+    assertEquals(500, response.getStatusCode());
   }
 
   @Test