From 6f9b81862316741292bf782395f90f2c7e57bfc7 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 26 Apr 2010 21:43:05 +0000 Subject: [PATCH] Improve JCR git-svn-id: https://svn.argeo.org/commons/trunk@3498 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../src/main/java/org/argeo/jcr/JcrUtils.java | 43 +++++++++++++++++-- .../server/jcr/mvc/JcrBrowserController.java | 23 ++++++++++ .../argeo/server/jcr/mvc/JcrMvcConstants.java | 5 +++ .../jcr/mvc/JcrXmlServerSerializer.java | 40 +++++++++++++++++ .../mvc/OpenSessionInViewJcrInterceptor.java | 8 +++- 5 files changed, 113 insertions(+), 6 deletions(-) create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrBrowserController.java create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrMvcConstants.java create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrXmlServerSerializer.java diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java index bf199ffda..d3174a1ca 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java @@ -3,6 +3,7 @@ package org.argeo.jcr; import java.util.Calendar; import java.util.StringTokenizer; +import javax.jcr.NamespaceRegistry; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; @@ -59,18 +60,19 @@ public class JcrUtils { } public static String dateAsPath(Calendar cal) { - StringBuffer buf = new StringBuffer(11); - buf.append(cal.get(Calendar.YEAR));// 4 + StringBuffer buf = new StringBuffer(14); + buf.append('Y').append(cal.get(Calendar.YEAR));// 5 buf.append('/');// 1 int month = cal.get(Calendar.MONTH) + 1; + buf.append('M'); if (month < 10) buf.append(0); - buf.append(month);// 2 + buf.append(month);// 3 buf.append('/');// 1 int day = cal.get(Calendar.DAY_OF_MONTH); if (day < 10) buf.append(0); - buf.append(day);// 2 + buf.append('D').append(day);// 3 buf.append('/');// 1 return buf.toString(); @@ -128,6 +130,39 @@ public class JcrUtils { } } + public static void registerNamespaceSafely(Session session, String prefix, + String uri) { + try { + registerNamespaceSafely(session.getWorkspace() + .getNamespaceRegistry(), prefix, uri); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot find namespace registry", e); + } + } + + public static void registerNamespaceSafely(NamespaceRegistry nr, + String prefix, String uri) { + try { + String[] prefixes = nr.getPrefixes(); + for (String pref : prefixes) + if (pref.equals(prefix)) { + String registeredUri = nr.getURI(pref); + if (!registeredUri.equals(uri)) + throw new ArgeoException("Prefix " + pref + + " already registered for URI " + + registeredUri + + " which is different from provided URI " + + uri); + else + return;// skip + } + nr.registerNamespace(prefix, uri); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot register namespace " + uri + + " under prefix " + prefix, e); + } + } + /** Recursively outputs the contents of the given node. */ public static void debug(Node node) throws RepositoryException { // First output the node path diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrBrowserController.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrBrowserController.java new file mode 100644 index 000000000..298daeb3e --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrBrowserController.java @@ -0,0 +1,23 @@ +package org.argeo.server.jcr.mvc; + +import javax.jcr.Item; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.WebRequest; + +@Controller +public class JcrBrowserController implements JcrMvcConstants { + + @RequestMapping("/getJcrItem.*") + public Item getJcrItem(WebRequest webRequest, + @RequestParam("path") String path) throws RepositoryException { + return ((Session) webRequest.getAttribute(REQUEST_ATTR_SESSION, + RequestAttributes.SCOPE_REQUEST)).getItem(path); + } + +} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrMvcConstants.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrMvcConstants.java new file mode 100644 index 000000000..3f50e9675 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrMvcConstants.java @@ -0,0 +1,5 @@ +package org.argeo.server.jcr.mvc; + +public interface JcrMvcConstants { + public final static String REQUEST_ATTR_SESSION = "jcrSession"; +} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrXmlServerSerializer.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrXmlServerSerializer.java new file mode 100644 index 000000000..01eab4b34 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrXmlServerSerializer.java @@ -0,0 +1,40 @@ +package org.argeo.server.jcr.mvc; + +import java.io.OutputStream; +import java.util.Set; + +import javax.jcr.Node; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.ArgeoException; +import org.argeo.server.ServerSerializer; +import org.xml.sax.helpers.DefaultHandler; + +public class JcrXmlServerSerializer implements ServerSerializer { + private String contentTypeCharset = "UTF-8"; + + public void serialize(Object obj, HttpServletRequest request, + HttpServletResponse response) { + if (!(obj instanceof Node)) + throw new ArgeoException("Only " + Node.class + " is supported"); + + String noRecurseStr = request.getParameter("noRecurse"); + boolean noRecurse = noRecurseStr != null && noRecurseStr.equals("true"); + + Node node = (Node) obj; + response.setContentType("text/xml;charset=" + contentTypeCharset); + try { + node.getSession().exportDocumentView(node.getPath(), + response.getOutputStream(), true, noRecurse); + } catch (Exception e) { + throw new ArgeoException("Cannot serialize " + node, e); + } + + } + + public void setContentTypeCharset(String contentTypeCharset) { + this.contentTypeCharset = contentTypeCharset; + } + +} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/OpenSessionInViewJcrInterceptor.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/OpenSessionInViewJcrInterceptor.java index ea02ae352..c91b66dbe 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/OpenSessionInViewJcrInterceptor.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/OpenSessionInViewJcrInterceptor.java @@ -5,10 +5,12 @@ import javax.jcr.Session; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.ui.ModelMap; +import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.WebRequest; import org.springframework.web.context.request.WebRequestInterceptor; -public class OpenSessionInViewJcrInterceptor implements WebRequestInterceptor { +public class OpenSessionInViewJcrInterceptor implements WebRequestInterceptor, + JcrMvcConstants { private final static Log log = LogFactory .getLog(OpenSessionInViewJcrInterceptor.class); @@ -27,7 +29,9 @@ public class OpenSessionInViewJcrInterceptor implements WebRequestInterceptor { // FIXME: find a safer way to initialize // FIXME: not really needed to initialize here - //session.getRepository(); + // session.getRepository(); + request.setAttribute(REQUEST_ATTR_SESSION, session, + RequestAttributes.SCOPE_REQUEST); } public void postHandle(WebRequest request, ModelMap model) throws Exception { -- 2.30.2