Improve JCR
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 26 Apr 2010 21:43:05 +0000 (21:43 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 26 Apr 2010 21:43:05 +0000 (21:43 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@3498 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrBrowserController.java [new file with mode: 0644]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrMvcConstants.java [new file with mode: 0644]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrXmlServerSerializer.java [new file with mode: 0644]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/OpenSessionInViewJcrInterceptor.java

index bf199ffdaed882a7720d6322ffd70a56e8b3ca83..d3174a1cace4427be061598273b2039b529968c7 100644 (file)
@@ -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 (file)
index 0000000..298daeb
--- /dev/null
@@ -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 (file)
index 0000000..3f50e96
--- /dev/null
@@ -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 (file)
index 0000000..01eab4b
--- /dev/null
@@ -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;
+       }
+
+}
index ea02ae352f574f190f3eb3f6a0310026bc9ab42d..c91b66dbedc10a2fcd8e58429b53c5993855df7b 100644 (file)
@@ -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 {