You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2010/10/04 12:45:45 UTC

svn commit: r1004193 - in /incubator/chemistry/opencmis/trunk: chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/ chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/j...

Author: fmui
Date: Mon Oct  4 10:45:45 2010
New Revision: 1004193

URL: http://svn.apache.org/viewvc?rev=1004193&view=rev
Log:
- moved classes and code to support browser binding development

Added:
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/BasicAuthCallContextHandler.java   (with props)
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/CallContextHandler.java   (with props)
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/HttpUtils.java   (with props)
Removed:
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/BasicAuthCallContextHandler.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CallContextHandler.java
Modified:
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/CallContext.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java
    incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/CallContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/CallContext.java?rev=1004193&r1=1004192&r2=1004193&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/CallContext.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/CallContext.java Mon Oct  4 10:45:45 2010
@@ -25,6 +25,7 @@ public interface CallContext {
 
     String BINDING_ATOMPUB = "atompub";
     String BINDING_WEBSERVICES = "webservices";
+    String BINDING_BROWSER = "browser";
     String BINDING_LOCAL = "local";
 
     String REPOSITORY_ID = "repositoryId";
@@ -36,8 +37,9 @@ public interface CallContext {
 
     /**
      * Returns the binding. Usually it returns
-     * {@link CallContext#BINDING_ATOMPUB} or
-     * {@link CallContext#BINDING_WEBSERVICES}.
+     * {@link CallContext#BINDING_ATOMPUB},
+     * {@link CallContext#BINDING_WEBSERVICES},
+     * {@link CallContext#BINDING_BROWSER} or {@link CallContext#BINDING_LOCAL}.
      */
     String getBinding();
 

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java?rev=1004193&r1=1004192&r2=1004193&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java Mon Oct  4 10:45:45 2010
@@ -19,8 +19,6 @@
 package org.apache.chemistry.opencmis.server.impl.atompub;
 
 import java.io.IOException;
-import java.math.BigInteger;
-import java.util.Map;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
@@ -45,8 +43,9 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
-import org.apache.chemistry.opencmis.server.impl.CallContextImpl;
 import org.apache.chemistry.opencmis.server.impl.CmisRepositoryContextListener;
+import org.apache.chemistry.opencmis.server.shared.CallContextHandler;
+import org.apache.chemistry.opencmis.server.shared.HttpUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -149,7 +148,7 @@ public class CmisAtomPubServlet extends 
         // create a context object, dispatch and handle exceptions
         CallContext context = null;
         try {
-            context = createContext(request);
+            context = HttpUtils.createContext(request, CallContext.BINDING_ATOMPUB, callContextHandler);
             dispatch(context, request, response);
         } catch (Exception e) {
             if (e instanceof CmisPermissionDeniedException) {
@@ -194,7 +193,7 @@ public class CmisAtomPubServlet extends 
             service = factory.getService(context);
 
             // analyze the path
-            String[] pathFragments = splitPath(request);
+            String[] pathFragments = HttpUtils.splitPath(request);
 
             if (pathFragments.length < 2) {
                 // root -> service document
@@ -223,79 +222,6 @@ public class CmisAtomPubServlet extends 
     }
 
     /**
-     * Decodes basic auth and creates a {@link CallContext} object.
-     */
-    protected CallContext createContext(HttpServletRequest request) {
-        String[] pathFragments = splitPath(request);
-
-        String repositoryId = null;
-        if (pathFragments.length > 0) {
-            repositoryId = pathFragments[0];
-        }
-
-        CallContextImpl context = new CallContextImpl(CallContext.BINDING_ATOMPUB, repositoryId, true);
-
-        // call call context handler
-        if (callContextHandler != null) {
-            Map<String, String> callContextMap = callContextHandler.getCallContextMap(request);
-            if (callContextMap != null) {
-                for (Map.Entry<String, String> e : callContextMap.entrySet()) {
-                    context.put(e.getKey(), e.getValue());
-                }
-            }
-        }
-
-        // decode range
-        String rangeHeader = request.getHeader("Range");
-        if (rangeHeader != null) {
-            rangeHeader = rangeHeader.trim();
-            BigInteger offset = null;
-            BigInteger length = null;
-
-            int eq = rangeHeader.indexOf('=');
-            int ds = rangeHeader.indexOf('-');
-            if ((eq > 0) && (ds > eq)) {
-                String offsetStr = rangeHeader.substring(eq + 1, ds).trim();
-                if (offsetStr.length() > 0) {
-                    offset = new BigInteger(offsetStr);
-                }
-
-                if (ds < rangeHeader.length()) {
-                    String lengthStr = rangeHeader.substring(ds + 1).trim();
-                    if (lengthStr.length() > 0) {
-                        if (offset == null) {
-                            length = new BigInteger(lengthStr);
-                        } else {
-                            length = (new BigInteger(lengthStr)).subtract(offset);
-                        }
-                    }
-
-                    if (offset != null) {
-                        context.put(CallContext.OFFSET, offset.toString());
-                    }
-                    if (length != null) {
-                        context.put(CallContext.LENGTH, length.toString());
-                    }
-                }
-            }
-        }
-
-        return context;
-    }
-
-    /**
-     * Splits the path into its fragments.
-     */
-    private String[] splitPath(HttpServletRequest request) {
-        String p = request.getPathInfo();
-        if (p == null) {
-            return new String[0];
-        }
-
-        return p.substring(1).split("/");
-    }
-
-    /**
      * Translates an exception in an appropriate HTTP error code.
      */
     private int getErrorCode(CmisBaseException ex) {

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/BasicAuthCallContextHandler.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/BasicAuthCallContextHandler.java?rev=1004193&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/BasicAuthCallContextHandler.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/BasicAuthCallContextHandler.java Mon Oct  4 10:45:45 2010
@@ -0,0 +1,71 @@
+/*
+ * 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.chemistry.opencmis.server.shared;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.chemistry.opencmis.commons.server.CallContext;
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * Call Context handler that handles basic authentication.
+ */
+public class BasicAuthCallContextHandler implements CallContextHandler {
+
+    /**
+     * Constructor.
+     */
+    public BasicAuthCallContextHandler() {
+    }
+
+    public Map<String, String> getCallContextMap(HttpServletRequest request) {
+        Map<String, String> result = null;
+
+        String authHeader = request.getHeader("Authorization");
+        if ((authHeader != null) && (authHeader.trim().toLowerCase().startsWith("basic "))) {
+            int x = authHeader.lastIndexOf(' ');
+            if (x == -1) {
+                return result;
+            }
+
+            String credentials = null;
+            try {
+                credentials = new String(Base64.decodeBase64(authHeader.substring(x + 1).getBytes("ISO-8859-1")),
+                        "ISO-8859-1");
+            } catch (Exception e) {
+                return result;
+            }
+
+            x = credentials.indexOf(':');
+            if (x == -1) {
+                return result;
+            }
+
+            // extract user and password and add them to map
+            result = new HashMap<String, String>();
+            result.put(CallContext.USERNAME, credentials.substring(0, x));
+            result.put(CallContext.PASSWORD, credentials.substring(x + 1));
+        }
+
+        return result;
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/BasicAuthCallContextHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/CallContextHandler.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/CallContextHandler.java?rev=1004193&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/CallContextHandler.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/CallContextHandler.java Mon Oct  4 10:45:45 2010
@@ -0,0 +1,36 @@
+/*
+ * 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.chemistry.opencmis.server.shared;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.chemistry.opencmis.commons.server.CallContext;
+
+/**
+ * Call Context handler interface.
+ */
+public interface CallContextHandler {
+
+    /**
+     * Returns key-value pairs that will be added to the {@link CallContext}.
+     */
+    Map<String, String> getCallContextMap(HttpServletRequest request);
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/CallContextHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/HttpUtils.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/HttpUtils.java?rev=1004193&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/HttpUtils.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/HttpUtils.java Mon Oct  4 10:45:45 2010
@@ -0,0 +1,107 @@
+/*
+ * 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.chemistry.opencmis.server.shared;
+
+import java.math.BigInteger;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.chemistry.opencmis.commons.server.CallContext;
+import org.apache.chemistry.opencmis.server.impl.CallContextImpl;
+
+/**
+ * Utility methods that are used by the AtomPub and Browser binding.
+ */
+public class HttpUtils {
+
+    /**
+     * Creates a {@link CallContext} object from a servlet request.
+     */
+    public static CallContext createContext(HttpServletRequest request, String binding,
+            CallContextHandler callContextHandler) {
+        String[] pathFragments = splitPath(request);
+
+        String repositoryId = null;
+        if (pathFragments.length > 0) {
+            repositoryId = pathFragments[0];
+        }
+
+        CallContextImpl context = new CallContextImpl(binding, repositoryId, true);
+
+        // call call context handler
+        if (callContextHandler != null) {
+            Map<String, String> callContextMap = callContextHandler.getCallContextMap(request);
+            if (callContextMap != null) {
+                for (Map.Entry<String, String> e : callContextMap.entrySet()) {
+                    context.put(e.getKey(), e.getValue());
+                }
+            }
+        }
+
+        // decode range
+        String rangeHeader = request.getHeader("Range");
+        if (rangeHeader != null) {
+            rangeHeader = rangeHeader.trim();
+            BigInteger offset = null;
+            BigInteger length = null;
+
+            int eq = rangeHeader.indexOf('=');
+            int ds = rangeHeader.indexOf('-');
+            if ((eq > 0) && (ds > eq)) {
+                String offsetStr = rangeHeader.substring(eq + 1, ds).trim();
+                if (offsetStr.length() > 0) {
+                    offset = new BigInteger(offsetStr);
+                }
+
+                if (ds < rangeHeader.length()) {
+                    String lengthStr = rangeHeader.substring(ds + 1).trim();
+                    if (lengthStr.length() > 0) {
+                        if (offset == null) {
+                            length = new BigInteger(lengthStr);
+                        } else {
+                            length = (new BigInteger(lengthStr)).subtract(offset);
+                        }
+                    }
+
+                    if (offset != null) {
+                        context.put(CallContext.OFFSET, offset.toString());
+                    }
+                    if (length != null) {
+                        context.put(CallContext.LENGTH, length.toString());
+                    }
+                }
+            }
+        }
+
+        return context;
+    }
+
+    /**
+     * Splits the path into its fragments.
+     */
+    public static String[] splitPath(HttpServletRequest request) {
+        String p = request.getPathInfo();
+        if (p == null) {
+            return new String[0];
+        }
+
+        return p.substring(1).split("/");
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/HttpUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml?rev=1004193&r1=1004192&r2=1004193&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml Mon Oct  4 10:45:45 2010
@@ -46,7 +46,7 @@
 		<servlet-class>org.apache.chemistry.opencmis.server.impl.atompub.CmisAtomPubServlet</servlet-class>
 		<init-param>
 			<param-name>callContextHandler</param-name>
-			<param-value>org.apache.chemistry.opencmis.server.impl.atompub.BasicAuthCallContextHandler</param-value>
+			<param-value>org.apache.chemistry.opencmis.server.shared.BasicAuthCallContextHandler</param-value>
 		</init-param>
 		<load-on-startup>2</load-on-startup>
 	</servlet>