Repository: olingo-odata4
Updated Branches:
  refs/heads/master 9ae26a709 -> f68aa54e1


[OLINGO-313] version header support


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

Branch: refs/heads/master
Commit: f68aa54e12c5ee177a4ecec3da40ecddbfede234
Parents: 9ae26a7
Author: Stephan Klevenz <[email protected]>
Authored: Tue Jun 3 16:20:34 2014 +0200
Committer: Stephan Klevenz <[email protected]>
Committed: Tue Jun 3 16:29:59 2014 +0200

----------------------------------------------------------------------
 .../olingo/commons/api/http/HttpHeader.java     | 10 +++++
 .../apache/olingo/server/api/ODataRequest.java  | 22 ++++++----
 .../apache/olingo/server/core/ODataHandler.java | 17 ++++++++
 .../server/core/ODataHttpHandlerImpl.java       | 11 +----
 .../olingo/server/core/ODataHandlerTest.java    | 42 ++++++++++++++++++++
 5 files changed, 85 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f68aa54e/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
----------------------------------------------------------------------
diff --git 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
index 7d1a47d..2f21a8c 100644
--- 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
+++ 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
@@ -152,4 +152,14 @@ public interface HttpHeader {
    */
   public static final String X_HTTP_METHOD_OVERRIDE = "X-HTTP-Method-Override";
 
+  /**
+   * OData Custom Header
+   */
+  public static final String ODATA_VERSION = "OData-Version";
+  
+  /**
+   * OData Custom Header
+   */
+  public static final String ODATA_MAX_VERSION = "OData-MaxVersion";
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f68aa54e/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataRequest.java
----------------------------------------------------------------------
diff --git 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataRequest.java 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataRequest.java
index 7bae3be..85883f0 100644
--- 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataRequest.java
+++ 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataRequest.java
@@ -19,7 +19,6 @@
 package org.apache.olingo.server.api;
 
 import java.io.InputStream;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -44,14 +43,23 @@ public class ODataRequest {
     this.method = method;
   }
 
-  public Map<String, List<String>> getHeaders() {
-    return Collections.unmodifiableMap(headers);
+  /**
+   * Add header to request where name handled as case insensitive key.
+   * @param name case insensitive header name
+   * @param values
+   */
+  public void addHeader(String name, List<String> values) {
+    headers.put(name.toUpperCase(), values);
   }
-
-  public void setHeaders(final Map<String, List<String>> headers) {
-    this.headers = headers;
+  
+  /**
+   * Returns header value for name where name is a case insensitive key.
+   * @return the header value or null if not found
+   */
+  public List<String> getHeader(String name) {
+    return headers.get(name.toUpperCase());
   }
-
+  
   public InputStream getBody() {
     return body;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f68aa54e/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 45e8354..e5ca20c 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,12 +19,15 @@
 package org.apache.olingo.server.core;
 
 import java.util.HashMap;
+import java.util.List;
 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.http.HttpContentType;
 import org.apache.olingo.commons.api.http.HttpMethod;
+import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
@@ -59,6 +62,8 @@ public class ODataHandler {
     try {
       ODataResponse response = new ODataResponse();
 
+      validateODataVersion(request, response);
+
       Parser parser = new Parser();
       String odUri =
           request.getRawODataPath() + (request.getRawQueryPath() == null ? "" 
: "?" + request.getRawQueryPath());
@@ -146,6 +151,18 @@ public class ODataHandler {
     }
   }
 
+  private void validateODataVersion(ODataRequest request, ODataResponse 
response) {
+    List<String> maxVersionHeader = 
request.getHeader(HttpHeader.ODATA_MAX_VERSION);
+
+    if (maxVersionHeader != null && maxVersionHeader.size() > 0) {
+      if (ODataServiceVersion.isBiggerThan(ODataServiceVersion.V40.toString(), 
maxVersionHeader.get(0))) {
+        throw new ODataRuntimeException("400 Bad Request - ODataVersion not 
supported: " + maxVersionHeader.get(0));
+      }
+    }
+
+    response.setHeader(HttpHeader.ODATA_VERSION, 
ODataServiceVersion.V40.toString());
+  }
+
   private <T extends Processor> T selectProcessor(Class<T> cls) {
     @SuppressWarnings("unchecked")
     T p = (T) processors.get(cls);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f68aa54e/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 577728c..36ef5c5 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
@@ -23,9 +23,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 
 import javax.servlet.http.HttpServletRequest;
@@ -185,8 +183,6 @@ public class ODataHttpHandlerImpl implements 
ODataHttpHandler {
   }
 
   private void extractHeaders(ODataRequest odRequest, final HttpServletRequest 
req) {
-    Map<String, List<String>> requestHeaders = new HashMap<String, 
List<String>>();
-
     for (Enumeration<?> headerNames = req.getHeaderNames(); 
headerNames.hasMoreElements();) {
       String headerName = (String) headerNames.nextElement();
       List<String> headerValues = new ArrayList<String>();
@@ -194,13 +190,8 @@ public class ODataHttpHandlerImpl implements 
ODataHttpHandler {
         String value = (String) headers.nextElement();
         headerValues.add(value);
       }
-      if (requestHeaders.containsKey(headerName)) {
-        requestHeaders.get(headerName).addAll(headerValues);
-      } else {
-        requestHeaders.put(headerName, headerValues);
-      }
+      odRequest.addHeader(headerName, headerValues);
     }
-    odRequest.setHeaders(requestHeaders);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f68aa54e/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 ade4245..242646d 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
@@ -23,8 +23,11 @@ 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;
 import org.apache.olingo.commons.api.http.HttpContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpMethod;
@@ -139,4 +142,43 @@ public class ODataHandlerTest {
     assertTrue(doc.contains("<edmx:Edmx Version=\"4.0\""));
   }
 
+  @Test
+  public void testMaxVersionNone() {
+    ODataRequest request = new ODataRequest();
+
+    request.setMethod(HttpMethod.GET);
+    request.setRawODataPath("$metadata");
+    
+    ODataResponse response = handler.process(request);
+    assertNotNull(response);
+    
+    assertEquals(ODataServiceVersion.V40.toString(), 
response.getHeaders().get(HttpHeader.ODATA_VERSION));
+  }
+  
+  @Test
+  public void testMaxVersionSupported() {
+    ODataRequest request = new ODataRequest();
+
+    request.setMethod(HttpMethod.GET);
+    request.setRawODataPath("$metadata");
+    request.addHeader(HttpHeader.ODATA_MAX_VERSION, 
Arrays.asList(ODataServiceVersion.V40.toString()));
+    
+    ODataResponse response = handler.process(request);
+    assertNotNull(response);
+    
+    assertEquals(ODataServiceVersion.V40.toString(), 
response.getHeaders().get(HttpHeader.ODATA_VERSION));
+  }
+  @Test(expected = Exception.class)
+  public void testMaxVersionNotSupported() {
+    ODataRequest request = new ODataRequest();
+
+    request.setMethod(HttpMethod.GET);
+    request.setRawODataPath("$metadata");
+    request.addHeader(HttpHeader.ODATA_MAX_VERSION, 
Arrays.asList(ODataServiceVersion.V30.toString()));
+    
+    ODataResponse response = handler.process(request);
+    assertNotNull(response);
+    
+    assertEquals(ODataServiceVersion.V40.toString(), 
response.getHeaders().get(HttpHeader.ODATA_VERSION));
+  }
 }

Reply via email to