import java.util.Calendar;
import java.util.StringTokenizer;
+import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
}
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();
}
}
+ 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
--- /dev/null
+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);
+ }
+
+}
--- /dev/null
+package org.argeo.server.jcr.mvc;
+
+public interface JcrMvcConstants {
+ public final static String REQUEST_ATTR_SESSION = "jcrSession";
+}
--- /dev/null
+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;
+ }
+
+}
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);
// 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 {