Jackrabbit
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 26 Nov 2009 20:53:20 +0000 (20:53 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 26 Nov 2009 20:53:20 +0000 (20:53 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@3174 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/modules/org.argeo.server.jackrabbit.webdav/META-INF/MANIFEST.MF
server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/manager-servlet.xml [new file with mode: 0644]
server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/web.xml
server/runtime/org.argeo.server.jackrabbit/pom.xml
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java [new file with mode: 0644]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrController.java [deleted file]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrManagerController.java [new file with mode: 0644]

index 4232d6203078aff42fa69f63814e8291ea76b439..dfde83c756d4957c9449a37621207acd6ec9d7f0 100644 (file)
@@ -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 (file)
index 0000000..8dd1994
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
+       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+
+       <context:component-scan base-package="org.argeo.server.jcr.mvc" />
+
+       <bean id="controller" class="org.argeo.server.jcr.mvc.JcrManagerController">
+               <property name="resourceAdapter" ref="resourceAdapter" />
+       </bean>
+
+       <bean id="resourceAdapter" class="org.argeo.server.jcr.JcrResourceAdapter">
+               <property name="repository" ref="repository" />
+               <property name="username" value="demo" />
+               <property name="password" value="demo" />
+       </bean>
+
+       <bean id="viewResolver" class="org.argeo.server.mvc.SerializingViewResolver">
+               <property name="serializer" ref="serverMapper" />
+       </bean>
+
+       <bean id="serverMapper" class="org.argeo.server.json.JsonServerMapper">
+       </bean>
+
+       <bean class="org.argeo.server.mvc.DefaultHandlerExceptionResolver" />
+
+</beans>
\ No newline at end of file
index 1a7a9232dc4f964b05dee8df07bfb3e30aea52a2..a9e69b0d9c00b8b19b4b993c3728b81177b8b882 100644 (file)
                <url-pattern>/default/*</url-pattern>
        </servlet-mapping>
 
+       <!-- Simple Webdav -->
+       <servlet>
+               <servlet-name>manager</servlet-name>
+               <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+               <init-param>
+                       <param-name>contextClass</param-name>
+                       <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
+               </init-param>
+               <load-on-startup>1</load-on-startup>
+       </servlet>
+
+       <servlet-mapping>
+               <servlet-name>manager</servlet-name>
+               <url-pattern>/manager/*</url-pattern>
+       </servlet-mapping>
+
 </web-app>
index e0bb0c393d6ff2d87199a99e4e670e8445f8ea39..bdb643feaa20367a1810878e510a0adb727ded61 100644 (file)
                        <artifactId>com.springsource.org.apache.commons.io</artifactId>
                </dependency>
 
+               <dependency>
+                       <groupId>javax.activation</groupId>
+                       <artifactId>com.springsource.javax.activation</artifactId>
+               </dependency>
+
                <!-- Spring -->
                <dependency>
                        <groupId>org.springframework</groupId>
index 88c7f6bd3d6e29f70715467ab0dfb552ca269c98..965a5fd4706225d9249c11d3fcf41797bebde362 100644 (file)
@@ -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 (file)
index 0000000..8d08a9e
--- /dev/null
@@ -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;
+       }
+
+}
index aa6f11b25e95d67b6a0e18e8cea1046ead063dea..44e6ecc15bb7a18712f15fd9f2ed13a24d214d06 100644 (file)
@@ -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 (file)
index ea800a0..0000000
+++ /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<FileItem> 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 (file)
index 0000000..453c4a4
--- /dev/null
@@ -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<FileItem> 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;
+       }
+
+}