[OLINGO-266] ODataHandler
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/bb48147b Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/bb48147b Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/bb48147b Branch: refs/heads/master Commit: bb48147bc200f13157730932a49bcde63fa55af4 Parents: f92ab0a Author: Stephan Klevenz <[email protected]> Authored: Wed May 14 16:04:11 2014 +0200 Committer: Stephan Klevenz <[email protected]> Committed: Mon May 19 14:27:04 2014 +0200 ---------------------------------------------------------------------- .../apache/olingo/server/api/ODataHandler.java | 28 ---- .../olingo/server/api/ODataHttpHandler.java | 28 ++++ .../apache/olingo/server/api/ODataServer.java | 2 +- .../apache/olingo/server/core/ODataHandler.java | 52 +++++++ .../olingo/server/core/ODataHandlerImpl.java | 142 ------------------ .../server/core/ODataHttpHandlerImpl.java | 146 +++++++++++++++++++ .../olingo/server/core/ODataResponse.java | 33 +++++ .../olingo/server/core/ODataServerImpl.java | 6 +- .../olingo/server/tecsvc/TechnicalServlet.java | 4 +- 9 files changed, 265 insertions(+), 176 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHandler.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHandler.java deleted file mode 100644 index ff0ab06..0000000 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public interface ODataHandler { - - void process(HttpServletRequest request, HttpServletResponse response); - -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/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 new file mode 100644 index 0000000..82210b8 --- /dev/null +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataHttpHandler.java @@ -0,0 +1,28 @@ +/* + * 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 javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public interface ODataHttpHandler { + + void process(HttpServletRequest request, HttpServletResponse response); + +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServer.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServer.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServer.java index 2d35100..48aa5a7 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServer.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServer.java @@ -48,7 +48,7 @@ public abstract class ODataServer { public abstract ODataSerializer createSerializer(ODataFormat format); - public abstract ODataHandler createHandler(Edm edm); + public abstract ODataHttpHandler createHandler(Edm edm); public abstract Edm createEdm(EdmProvider edmProvider); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/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 new file mode 100644 index 0000000..fc92d6a --- /dev/null +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.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 org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.server.api.ODataServer; +import org.apache.olingo.server.api.serializer.ODataFormat; +import org.apache.olingo.server.api.serializer.ODataSerializer; + +public class ODataHandler { + + private ODataServer server; + private Edm edm; + + public ODataHandler(ODataServer server, Edm edm) { + this.server = server; + this.edm = edm; + } + + public ODataResponse process(ODataRequest odRequest) { + ODataResponse response = new ODataResponse(); + + ODataSerializer serializer = server.createSerializer(ODataFormat.JSON); + InputStream responseEntity = serializer.serviceDocument(edm, "http//:root"); + + response.setStatusCode(200); + response.setHeader("Content-Type", "application/json"); + response.setContent(responseEntity); + + return response; + } + +} + http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java deleted file mode 100644 index a516689..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * 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.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.olingo.commons.api.ODataRuntimeException; -import org.apache.olingo.commons.api.edm.Edm; -import org.apache.olingo.commons.api.http.HttpMethod; -import org.apache.olingo.server.api.ODataHandler; -import org.apache.olingo.server.api.ODataServer; -import org.apache.olingo.server.api.serializer.ODataFormat; -import org.apache.olingo.server.api.serializer.ODataSerializer; - -public class ODataHandlerImpl implements ODataHandler { - - private Edm edm; - private ODataServer server; - - public ODataHandlerImpl(ODataServer server, Edm edm) { - this.edm = edm; - this.server = server; - } - - @Override - public void process(HttpServletRequest request, HttpServletResponse response) { - ODataRequest odRequest = createODataRequest(request); - ODataResponse odResponse; - - // odResponse = process(odRequest); -// convertToHttp(response, odResponse); - } - - private ODataRequest createODataRequest(HttpServletRequest request) { - try { - ODataRequest odRequest = new ODataRequest(); - - odRequest.setBody(request.getInputStream()); - odRequest.setHeaders(extractHeaders(request)); - odRequest.setQueryParameters(extractQueryParameters(request.getQueryString())); - odRequest.setMethod(HttpMethod.valueOf(request.getMethod())); - - return odRequest; - } catch (Exception e) { - throw new ODataRuntimeException(e); - } - } - - public void processx(HttpServletRequest request, HttpServletResponse response) { - try { - InputStream responseEntity = null; - if (request.getPathInfo().contains("$metadata")) { - ODataSerializer serializer = server.createSerializer(ODataFormat.XML); - responseEntity = serializer.metadataDocument(edm); - } else { - ODataSerializer serializer = server.createSerializer(ODataFormat.JSON); - responseEntity = serializer.serviceDocument(edm, "http//:root"); - } - - response.setStatus(200); - response.setContentType("application/json"); - - if (responseEntity != null) { - ServletOutputStream out = response.getOutputStream(); - int curByte = -1; - if (responseEntity instanceof InputStream) { - while ((curByte = ((InputStream) responseEntity).read()) != -1) { - out.write((char) curByte); - } - ((InputStream) responseEntity).close(); - } - - out.flush(); - out.close(); - } - - } catch (Exception e) { - throw new ODataRuntimeException(e); - } - } - - private Map<String, String> extractQueryParameters(final String queryString) { - Map<String, String> queryParametersMap = new HashMap<String, String>(); - if (queryString != null) { - // At first the queryString will be decoded. - List<String> queryParameters = Arrays.asList(Decoder.decode(queryString).split("\\&")); - for (String param : queryParameters) { - int indexOfEqualSign = param.indexOf("="); - if (indexOfEqualSign < 0) { - queryParametersMap.put(param, ""); - } else { - queryParametersMap.put(param.substring(0, indexOfEqualSign), param.substring(indexOfEqualSign + 1)); - } - } - } - return queryParametersMap; - } - - private Map<String, List<String>> extractHeaders(final HttpServletRequest req) { - Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>(); - for (Enumeration<String> headerNames = req.getHeaderNames(); headerNames.hasMoreElements();) { - String headerName = headerNames.nextElement(); - List<String> headerValues = new ArrayList<String>(); - for (Enumeration<String> headers = req.getHeaders(headerName); headers.hasMoreElements();) { - String value = headers.nextElement(); - headerValues.add(value); - } - if (requestHeaders.containsKey(headerName)) { - requestHeaders.get(headerName).addAll(headerValues); - } else { - requestHeaders.put(headerName, headerValues); - } - } - return requestHeaders; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/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 new file mode 100644 index 0000000..dca4229 --- /dev/null +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java @@ -0,0 +1,146 @@ +/* + * 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.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +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; +import javax.servlet.http.HttpServletResponse; + +import org.apache.olingo.commons.api.ODataRuntimeException; +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.http.HttpMethod; +import org.apache.olingo.server.api.ODataHttpHandler; +import org.apache.olingo.server.api.ODataServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ODataHttpHandlerImpl implements ODataHttpHandler { + + private static final Logger LOG = LoggerFactory.getLogger(ODataHttpHandlerImpl.class); + + private Edm edm; + private ODataServer server; + + public ODataHttpHandlerImpl(ODataServer server, Edm edm) { + this.edm = edm; + this.server = server; + } + + @Override + public void process(HttpServletRequest request, HttpServletResponse response) { + ODataRequest odRequest = createODataRequest(request); + + ODataHandler handler = new ODataHandler(server, edm); + ODataResponse odResponse = handler.process(odRequest); + convertToHttp(response, odResponse); + } + + private void convertToHttp(HttpServletResponse response, ODataResponse odResponse) { + response.setStatus(odResponse.getStatusCode()); + + for (Entry<String, String> entry : odResponse.getHeaders().entrySet()) { + response.setHeader(entry.getKey(), entry.getValue()); + } + + InputStream in = odResponse.getContent(); + try + { + byte[] buffer = new byte[1024]; + int bytesRead = 0; + + do + { + bytesRead = in.read(buffer, 0, buffer.length); + response.getOutputStream().write(buffer, 0, bytesRead); + } while (bytesRead == buffer.length); + + response.getOutputStream().flush(); + } catch (IOException e) { + LOG.error(e.getMessage(), e); + throw new ODataRuntimeException(e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + throw new ODataRuntimeException(e); + } + } + } + } + + private ODataRequest createODataRequest(HttpServletRequest request) { + try { + ODataRequest odRequest = new ODataRequest(); + + odRequest.setBody(request.getInputStream()); + odRequest.setHeaders(extractHeaders(request)); + odRequest.setQueryParameters(extractQueryParameters(request.getQueryString())); + odRequest.setMethod(HttpMethod.valueOf(request.getMethod())); + + return odRequest; + } catch (Exception e) { + throw new ODataRuntimeException(e); + } + } + + private Map<String, String> extractQueryParameters(final String queryString) { + Map<String, String> queryParametersMap = new HashMap<String, String>(); + if (queryString != null) { + List<String> queryParameters = Arrays.asList(Decoder.decode(queryString).split("\\&")); + for (String param : queryParameters) { + int indexOfEqualSign = param.indexOf("="); + if (indexOfEqualSign < 0) { + queryParametersMap.put(param, ""); + } else { + queryParametersMap.put(param.substring(0, indexOfEqualSign), param.substring(indexOfEqualSign + 1)); + } + } + } + return queryParametersMap; + } + + private Map<String, List<String>> extractHeaders(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>(); + for (Enumeration<?> headers = req.getHeaders(headerName); headers.hasMoreElements();) { + String value = (String) headers.nextElement(); + headerValues.add(value); + } + if (requestHeaders.containsKey(headerName)) { + requestHeaders.get(headerName).addAll(headerValues); + } else { + requestHeaders.put(headerName, headerValues); + } + } + return requestHeaders; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataResponse.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataResponse.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataResponse.java index 7bcf7d3..71c3719 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataResponse.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataResponse.java @@ -18,6 +18,39 @@ */ package org.apache.olingo.server.core; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + public class ODataResponse { + private int statusCode; + private Map<String, String> headers = new HashMap<String, String>(); + private InputStream content; + + public void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } + + public void setHeader(String name, String value) { + headers.put(name, value); + } + + public void setContent(InputStream content) { + this.content = content; + } + + public int getStatusCode() { + return statusCode; + } + + public Map<String, String> getHeaders() { + return Collections.unmodifiableMap(headers); + } + + public InputStream getContent() { + return content; + } + } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java index 5ac9d37..cac5f50 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java @@ -20,7 +20,7 @@ package org.apache.olingo.server.core; import org.apache.olingo.commons.api.ODataRuntimeException; import org.apache.olingo.commons.api.edm.Edm; -import org.apache.olingo.server.api.ODataHandler; +import org.apache.olingo.server.api.ODataHttpHandler; import org.apache.olingo.server.api.ODataServer; import org.apache.olingo.server.api.edm.provider.EdmProvider; import org.apache.olingo.server.api.serializer.ODataFormat; @@ -49,8 +49,8 @@ public class ODataServerImpl extends ODataServer { } @Override - public ODataHandler createHandler(Edm edm) { - return new ODataHandlerImpl(this, edm); + public ODataHttpHandler createHandler(Edm edm) { + return new ODataHttpHandlerImpl(this, edm); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/bb48147b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/TechnicalServlet.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/TechnicalServlet.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/TechnicalServlet.java index 1f6b6bf..c7bb0e0 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/TechnicalServlet.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/TechnicalServlet.java @@ -26,7 +26,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.olingo.commons.api.edm.Edm; -import org.apache.olingo.server.api.ODataHandler; +import org.apache.olingo.server.api.ODataHttpHandler; import org.apache.olingo.server.api.ODataServer; import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; import org.slf4j.Logger; @@ -45,7 +45,7 @@ public class TechnicalServlet extends HttpServlet { ODataServer server = ODataServer.newInstance(); Edm edm = server.createEdm(new EdmTechProvider()); - ODataHandler handler = server.createHandler(edm); + ODataHttpHandler handler = server.createHandler(edm); handler.process(req, resp); } }
