From 9b0c0818123d0265be3a3d35e4511077109e827a Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 26 Nov 2009 20:53:20 +0000 Subject: [PATCH] Jackrabbit git-svn-id: https://svn.argeo.org/commons/trunk@3174 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/MANIFEST.MF | 4 + .../WEB-INF/manager-servlet.xml | 31 +++++++ .../WEB-INF/web.xml | 16 ++++ .../org.argeo.server.jackrabbit/pom.xml | 5 + .../jackrabbit/webdav/WebDavServlet.java | 4 +- .../argeo/server/jcr/DefaultJcrListener.java | 91 +++++++++++++++++++ .../argeo/server/jcr/JcrResourceAdapter.java | 8 +- .../argeo/server/jcr/mvc/JcrController.java | 43 --------- .../server/jcr/mvc/JcrManagerController.java | 79 ++++++++++++++++ 9 files changed, 235 insertions(+), 46 deletions(-) create mode 100644 server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/manager-servlet.xml create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java delete mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrController.java create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrManagerController.java diff --git a/server/modules/org.argeo.server.jackrabbit.webdav/META-INF/MANIFEST.MF b/server/modules/org.argeo.server.jackrabbit.webdav/META-INF/MANIFEST.MF index 4232d6203..dfde83c75 100644 --- a/server/modules/org.argeo.server.jackrabbit.webdav/META-INF/MANIFEST.MF +++ b/server/modules/org.argeo.server.jackrabbit.webdav/META-INF/MANIFEST.MF @@ -6,6 +6,10 @@ Import-Package: javax.jcr, javax.servlet.http, javax.servlet.resources, org.argeo.server.jackrabbit.webdav, + org.argeo.server.jcr, + org.argeo.server.jcr.mvc, + org.argeo.server.json, + org.argeo.server.mvc, org.springframework.osgi.web.context.support, org.springframework.web.context, org.springframework.web.servlet, diff --git a/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/manager-servlet.xml b/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/manager-servlet.xml new file mode 100644 index 000000000..8dd19947d --- /dev/null +++ b/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/manager-servlet.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/web.xml b/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/web.xml index 1a7a9232d..a9e69b0d9 100644 --- a/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/web.xml +++ b/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/web.xml @@ -40,4 +40,20 @@ /default/* + + + manager + org.springframework.web.servlet.DispatcherServlet + + contextClass + org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext + + 1 + + + + manager + /manager/* + + diff --git a/server/runtime/org.argeo.server.jackrabbit/pom.xml b/server/runtime/org.argeo.server.jackrabbit/pom.xml index e0bb0c393..bdb643fea 100644 --- a/server/runtime/org.argeo.server.jackrabbit/pom.xml +++ b/server/runtime/org.argeo.server.jackrabbit/pom.xml @@ -67,6 +67,11 @@ com.springsource.org.apache.commons.io + + javax.activation + com.springsource.javax.activation + + org.springframework diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java index 88c7f6bd3..965a5fd47 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java @@ -56,12 +56,12 @@ public class WebDavServlet extends SimpleWebdavServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - if (log.isDebugEnabled()) + if (log.isTraceEnabled()) log.debug("Received request with method '" + request.getMethod() + "'"); super.service(request, response); - if (log.isDebugEnabled()) { + if (log.isTraceEnabled()) { log.debug("Webdav response: " + response); // response. } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java new file mode 100644 index 000000000..8d08a9ea6 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java @@ -0,0 +1,91 @@ +package org.argeo.server.jcr; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.SimpleCredentials; +import javax.jcr.observation.Event; +import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventListener; +import javax.jcr.observation.ObservationManager; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; + +/** To be overridden */ +public class DefaultJcrListener implements EventListener { + private final static Log log = LogFactory.getLog(DefaultJcrListener.class); + private Session session; + private Repository repository; + private String path = "/"; + private Boolean deep = true; + private String username = "demo"; + private String password = "demo"; + + public void start() { + try { + addEventListener(session().getWorkspace().getObservationManager()); + if (log.isDebugEnabled()) + log.debug("Registered JCR event listener on " + path); + } catch (Exception e) { + throw new ArgeoException("Cannot register event listener", e); + } + } + + public void stop() { + try { + session().getWorkspace().getObservationManager() + .removeEventListener(this); + if (log.isDebugEnabled()) + log.debug("Unregistered JCR event listener on " + path); + } catch (Exception e) { + throw new ArgeoException("Cannot unregister event listener", e); + } + } + + /** Default is listen to all events */ + protected Integer getEvents() { + return Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED + | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED; + } + + /** To be overidden */ + public void onEvent(EventIterator events) { + while (events.hasNext()) { + Event event = events.nextEvent(); + log.debug(event); + } + } + + /** To be overidden */ + protected void addEventListener(ObservationManager observationManager) + throws RepositoryException { + observationManager.addEventListener(this, getEvents(), path, deep, + null, null, false); + } + + protected Session session() { + if (session == null) + try { + session = repository.login(new SimpleCredentials(username, + password.toCharArray())); + } catch (Exception e) { + throw new ArgeoException("Cannot open session", e); + } + return session; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java index aa6f11b25..44e6ecc15 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java @@ -7,6 +7,7 @@ import java.util.Calendar; import java.util.List; import java.util.StringTokenizer; +import javax.activation.MimetypesFileTypeMap; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyIterator; @@ -19,6 +20,7 @@ import javax.jcr.version.Version; import javax.jcr.version.VersionHistory; import javax.jcr.version.VersionIterator; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; @@ -81,6 +83,8 @@ public class JcrResourceAdapter implements InitializingBean, DisposableBean { int index = path.lastIndexOf('/'); String parentPath = path.substring(0, index); + if (parentPath.equals("")) + parentPath = "/"; String fileName = path.substring(index + 1); if (!session().itemExists(parentPath)) throw new ArgeoException("Parent folder of node " + path @@ -127,7 +131,9 @@ public class JcrResourceAdapter implements InitializingBean, DisposableBean { try { if (!session().itemExists(path)) { - create(path, in, null); + String type = new MimetypesFileTypeMap() + .getContentType(FilenameUtils.getName(path)); + create(path, in, type); return; } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrController.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrController.java deleted file mode 100644 index ea800a037..000000000 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrController.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.argeo.server.jcr.mvc; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileItemFactory; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.argeo.server.ServerAnswer; -import org.argeo.server.jcr.JcrResourceAdapter; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.stereotype.Controller; - -@Controller -public class JcrController { - private JcrResourceAdapter resourceAdapter; - - // Create a factory for disk-based file items - private FileItemFactory factory = new DiskFileItemFactory(); - - // Create a new file upload handler - private ServletFileUpload upload = new ServletFileUpload(factory); - - public ServerAnswer importFile(HttpServletRequest request, - HttpServletResponse response) throws Exception { - // Parse the request - List items = upload.parseRequest(request); - - byte[] arr = null; - for (FileItem item : items) { - if (!item.isFormField()) { - arr = item.get(); - break; - } - } - - ByteArrayResource res = new ByteArrayResource(arr); - return ServerAnswer.ok("File imported"); - } -} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrManagerController.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrManagerController.java new file mode 100644 index 000000000..453c4a4de --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrManagerController.java @@ -0,0 +1,79 @@ +package org.argeo.server.jcr.mvc; + +import java.util.List; +import java.util.StringTokenizer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.server.ServerAnswer; +import org.argeo.server.jcr.JcrResourceAdapter; +import org.argeo.server.mvc.MvcConstants; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class JcrManagerController implements MvcConstants { + private final static Log log = LogFactory + .getLog(JcrManagerController.class); + + private JcrResourceAdapter resourceAdapter; + + // Create a factory for disk-based file items + private FileItemFactory factory = new DiskFileItemFactory(); + + // Create a new file upload handler + private ServletFileUpload upload = new ServletFileUpload(factory); + + @SuppressWarnings("unchecked") + @RequestMapping("/upload/**") + @ModelAttribute(ANSWER_MODEL_KEY) + public ServerAnswer upload(HttpServletRequest request, + HttpServletResponse response) throws Exception { + // Parse the request + List items = upload.parseRequest(request); + + byte[] arr = null; + for (FileItem item : items) { + if (!item.isFormField()) { + arr = item.get(); + break; + } + } + + ByteArrayResource res = new ByteArrayResource(arr); +// String pathInfo = request.getPathInfo(); + + StringBuffer path = new StringBuffer("/"); + StringTokenizer st = new StringTokenizer(request.getPathInfo(), "/"); + st.nextToken();// skip /upload/ + while (st.hasMoreTokens()) { + String token = st.nextToken(); + if (!st.hasMoreTokens()) { + resourceAdapter.mkdirs(path.toString()); + path.append(token); + } else { + path.append(token).append('/'); + } + } + // String path = '/' + pathInfo.substring(1).substring( + // pathInfo.indexOf('/')); + if (log.isDebugEnabled()) + log.debug("Upload to " + path); + resourceAdapter.update(path.toString(), res); + return ServerAnswer.ok("File " + path + " imported"); + } + + public void setResourceAdapter(JcrResourceAdapter resourceAdapter) { + this.resourceAdapter = resourceAdapter; + } + +} -- 2.30.2