From a171094436482fa16e8da47d5501df59ec06e595 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 13 Oct 2011 21:03:03 +0000 Subject: [PATCH] Improve JCR remoting git-svn-id: https://svn.argeo.org/commons/trunk@4835 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../remote/ExtendedDispatcherServlet.java | 6 +++ .../remote/SimpleWebdavHandlerMapping.java | 1 + .../remote/SimpleWebdavServlet.java | 4 +- .../argeo/jcr/mvc/JcrXmlServerSerializer.java | 1 + .../mvc/MultipleRepositoryHandlerMapping.java | 49 +++++++++++++++---- .../mvc/OpenSessionInViewJcrInterceptor.java | 1 + .../argeo/jcr/mvc/ResourceProxyServlet.java | 10 +++- 7 files changed, 60 insertions(+), 12 deletions(-) diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/ExtendedDispatcherServlet.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/ExtendedDispatcherServlet.java index ec1d96ea3..cff2c3b01 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/ExtendedDispatcherServlet.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/ExtendedDispatcherServlet.java @@ -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); } } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavHandlerMapping.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavHandlerMapping.java index ea014f9e3..bb3e04c14 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavHandlerMapping.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavHandlerMapping.java @@ -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; diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavServlet.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavServlet.java index 4fa4033eb..6bc48fa07 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavServlet.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleWebdavServlet.java @@ -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); } diff --git a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/JcrXmlServerSerializer.java b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/JcrXmlServerSerializer.java index 0275a4b74..a036c14e7 100644 --- a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/JcrXmlServerSerializer.java +++ b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/JcrXmlServerSerializer.java @@ -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"; diff --git a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java index 16ecdd89e..bc333ba44 100644 --- a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java +++ b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java @@ -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 tokens = new ArrayList(); + 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 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) diff --git a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/OpenSessionInViewJcrInterceptor.java b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/OpenSessionInViewJcrInterceptor.java index f32acaa69..663da4cc6 100644 --- a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/OpenSessionInViewJcrInterceptor.java +++ b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/OpenSessionInViewJcrInterceptor.java @@ -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 diff --git a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/ResourceProxyServlet.java b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/ResourceProxyServlet.java index 8735e869e..20306609f 100644 --- a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/ResourceProxyServlet.java +++ b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/ResourceProxyServlet.java @@ -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) { -- 2.39.2