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)); + } }
