Improve JCR remoting
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 13 Oct 2011 21:03:03 +0000 (21:03 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 13 Oct 2011 21:03:03 +0000 (21:03 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4835 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/ExtendedDispatcherServlet.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavHandlerMapping.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavServlet.java
server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/JcrXmlServerSerializer.java
server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java
server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/OpenSessionInViewJcrInterceptor.java
server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/ResourceProxyServlet.java

index ec1d96ea30dc0b8ead6cf3999d899cb788c71405..cff2c3b01053fac19d6333cbda0e0bce38981e96 100644 (file)
@@ -39,8 +39,14 @@ public class ExtendedDispatcherServlet extends DispatcherServlet {
                try {
                        if (log.isTraceEnabled())
                                log.trace("Received request " + request);
+//                     log.debug("PathTranslated="+request.getPathTranslated());
+                       log.debug("PathInfo="+request.getPathInfo());
+//                     log.debug("ServletPath="+request.getServletPath());
+//                     log.debug("ContextPath="+request.getContextPath());
                        doService(request, response);
                } catch (Exception e) {
+//                     e.printStackTrace();
+//                     log.debug(request.getMethod());
                        throw new ArgeoException("Cannot process request", e);
                }
        }
index ea014f9e3828e2fbf94f434091e1beffaf83873a..bb3e04c14b211c85bfb554ebc490798388ad46cf 100644 (file)
@@ -6,6 +6,7 @@ import javax.jcr.Repository;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 
+/** Handler mapping for WebDav */
 public class SimpleWebdavHandlerMapping extends
                AbstractJackrabbitHandlerMapping {
        private String configuration;
index 4fa4033ebee4fc68822af9f5c401fbe3b37951c5..6bc48fa07e8e4547d495fb5e99ede4701f943e9c 100644 (file)
@@ -20,12 +20,14 @@ import javax.jcr.Repository;
 
 import org.apache.jackrabbit.server.SessionProvider;
 
+/** WebDav servlet whoe repository is injected */
 public class SimpleWebdavServlet extends
                org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet {
        private static final long serialVersionUID = -369787931175177080L;
        private final Repository repository;
 
-       public SimpleWebdavServlet(Repository repository, SessionProvider sessionProvider) {
+       public SimpleWebdavServlet(Repository repository,
+                       SessionProvider sessionProvider) {
                this.repository = repository;
                setSessionProvider(sessionProvider);
        }
index 0275a4b748db7b68bc8c814364ea83f8abcc637b..a036c14e7254ebcc2be25ee016bfa6156fcbb882 100644 (file)
@@ -35,6 +35,7 @@ import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
+/** @deprecated */
 public class JcrXmlServerSerializer implements ServerSerializer {
        private String contentTypeCharset = "UTF-8";
 
index 16ecdd89ecff8de8b5fda232a33ad74124015060..bc333ba4400d15d87e951c85ca8aa6400d295bb7 100644 (file)
@@ -1,6 +1,8 @@
 package org.argeo.jcr.mvc;
 
+import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Properties;
 
 import javax.jcr.Repository;
@@ -27,6 +29,8 @@ public abstract class MultipleRepositoryHandlerMapping implements
        private final static Log log = LogFactory
                        .getLog(MultipleRepositoryHandlerMapping.class);
 
+       private final static String MKCOL = "MKCOL";
+
        private ConfigurableApplicationContext applicationContext;
        private ServletContext servletContext;
 
@@ -44,7 +48,39 @@ public abstract class MultipleRepositoryHandlerMapping implements
                        log.trace("getPathInfo=" + request.getPathInfo());
                }
 
-               String repositoryName = extractRepositoryName(request);
+               String pathInfo = request.getPathInfo();
+
+               // tokenize path
+               // TODO factorize
+               List<String> tokens = new ArrayList<String>();
+               StringBuffer curr = new StringBuffer();
+               char[] arr = pathInfo.toCharArray();
+               chars: for (int i = 0; i < arr.length; i++) {
+                       char c = arr[i];
+                       if (c == '/') {
+                               if (i == 0 || (i == arr.length - 1))
+                                       continue chars;
+                               if (curr.length() > 0) {
+                                       tokens.add(curr.toString());
+                                       curr = new StringBuffer();
+                               }
+                       } else
+                               curr.append(c);
+               }
+               if (curr.length() > 0) {
+                       tokens.add(curr.toString());
+                       curr = new StringBuffer();
+               }
+
+               // check if repository can be found
+               if (tokens.size() == 0
+                               || (tokens.size() == 1 && tokens.get(0).equals("")))
+                       return null;
+               // MKCOL on repository or root node doesn't make sense
+               if ((tokens.size() == 1 || tokens.size() == 2)
+                               && request.getMethod().equals(MKCOL))
+                       return null;
+               String repositoryName = extractRepositoryName(tokens);
                String pathPrefix = request.getServletPath() + '/' + repositoryName;
                String beanName = pathPrefix;
 
@@ -63,14 +99,9 @@ public abstract class MultipleRepositoryHandlerMapping implements
        }
 
        /** The repository name is the first part of the path info */
-       protected String extractRepositoryName(HttpServletRequest request) {
-               String pathInfo = request.getPathInfo();
-               // TODO: optimize by checking character by character
-               String[] tokens = pathInfo.split("/");
+       protected String extractRepositoryName(List<String> pathTokens) {
                StringBuffer currName = new StringBuffer("");
-               tokens: for (String token : tokens) {
-                       if (token.equals(""))
-                               continue tokens;
+               for (String token : pathTokens) {
                        currName.append(token);
                        if (repositoryRegister.getRepositories().containsKey(
                                        currName.toString()))
@@ -78,7 +109,7 @@ public abstract class MultipleRepositoryHandlerMapping implements
                        currName.append('/');
                }
                throw new ArgeoException("No repository can be found for request "
-                               + pathInfo);
+                               + pathTokens);
        }
 
        public void setApplicationContext(ApplicationContext applicationContext)
index f32acaa690077452b3d29f008e692220af1cc047..663da4cc67c4e09005e35a08bdb759c035643a79 100644 (file)
@@ -25,6 +25,7 @@ import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.WebRequest;
 import org.springframework.web.context.request.WebRequestInterceptor;
 
+/** @deprecated */
 public class OpenSessionInViewJcrInterceptor implements WebRequestInterceptor,
                JcrMvcConstants {
        private final static Log log = LogFactory
index 8735e869e27f600d78b320821d3ba86fb199a65b..20306609f86cfa8306ce5bee5cb056d8fc9b0c2d 100644 (file)
@@ -5,6 +5,7 @@ import java.io.InputStream;
 
 import javax.jcr.Binary;
 import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
 import javax.jcr.Property;
 import javax.jcr.Session;
 import javax.servlet.ServletException;
@@ -82,8 +83,13 @@ public class ResourceProxyServlet extends HttpServlet implements ArgeoNames {
 
                        response.setContentType(contentType);
 
-                       binary = node.getNode(Property.JCR_CONTENT)
-                                       .getProperty(Property.JCR_DATA).getBinary();
+                       try {
+                               binary = node.getNode(Property.JCR_CONTENT)
+                                               .getProperty(Property.JCR_DATA).getBinary();
+                       } catch (PathNotFoundException e) {
+                               log.error("Node "+node+" as no data under content");
+                               throw e;
+                       }
                        in = binary.getStream();
                        IOUtils.copy(in, response.getOutputStream());
                } catch (Exception e) {