You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/05/14 16:42:12 UTC

[3/3] git commit: [OLINGO-266] ODataHandler

[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/6e76ea9c
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/6e76ea9c
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/6e76ea9c

Branch: refs/heads/olingo-266-ref
Commit: 6e76ea9cca8ecea2467fd6c357a2797374756ea2
Parents: 093bbb7
Author: Stephan Klevenz <st...@sap.com>
Authored: Wed May 14 16:04:11 2014 +0200
Committer: Stephan Klevenz <st...@sap.com>
Committed: Wed May 14 16:34:24 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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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/6e76ea9c/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);
   }
 }