Update webdav
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 26 Nov 2009 19:25:15 +0000 (19:25 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 26 Nov 2009 19:25:15 +0000 (19:25 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@3173 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

15 files changed:
basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/ArgeoException.java
sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy00.xls [new file with mode: 0644]
sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy01.xls [new file with mode: 0644]
sandbox/runtime/org.argeo.sandbox.jackrabbit/pom.xml
sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/java/org/argeo/sandbox/jackrabbit/WebDavTest.java
server/demo/org.argeo.server.demo.log4j/log4j.properties
server/dep/org.argeo.server.dep.jackrabbit.server/pom.xml
server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/webdav-servlet.xml
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ArgeoServerException.java
server/runtime/org.argeo.server.jackrabbit/pom.xml
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/ExtendedDispatcherServlet.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/SimpleWebDavServlet.java [deleted file]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.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 [new file with mode: 0644]

index 28d276fd174de5da29fb15d165d61756177ce4a2..ff3cef8aee99841616a58b8e6cc7ffe9ae8291ca 100644 (file)
@@ -3,9 +3,6 @@ package org.argeo;
 public class ArgeoException extends RuntimeException {
        private static final long serialVersionUID = 1L;
 
-       public ArgeoException() {
-       }
-
        public ArgeoException(String message) {
                super(message);
        }
diff --git a/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy00.xls b/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy00.xls
new file mode 100644 (file)
index 0000000..e5846fe
Binary files /dev/null and b/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy00.xls differ
diff --git a/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy01.xls b/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy01.xls
new file mode 100644 (file)
index 0000000..b5c6b55
Binary files /dev/null and b/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy01.xls differ
index 9c1877c4a6e1ea99791a0eb9b99bd2b89e162447..ad81e525b08553455e9bb5f4de572b0adac26181 100644 (file)
                                                        org.springframework.osgi.extender,
                                                        org.springframework.osgi.web.extender,
                                                        org.argeo.dep.osgi.catalina.start,
-                                                       org.argeo.server.jackrabbit.webapp,
+                                                       org.argeo.server.jackrabbit.webdav,
                                                        org.argeo.server.jackrabbit.repo
                                                </argeo.osgi.start>
                                                <argeo.osgi.bundles>
                                                        ${basedir}/../../../server/modules;in=*;ex=pom.xml;ex=target;ex=.*,
                                                        ${basedir}/../../../server/demo;in=*;ex=pom.xml;ex=target;ex=.*,
+                                                       ${basedir}/../../../server/runtime;in=*/target/classes,
                                                </argeo.osgi.bundles>
                                        </systemProperties>
                                </configuration>
index f121e928eb17dd882d92d2fb84e30f4f19a754a7..9a422f268d571a2223c4e4a30d63204b0f2a1f06 100644 (file)
@@ -1,6 +1,8 @@
 package org.argeo.sandbox.jackrabbit;
 
 import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.HostConfiguration;
@@ -18,7 +20,11 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.webdav.client.methods.CheckoutMethod;
 import org.apache.jackrabbit.webdav.client.methods.CopyMethod;
 import org.apache.jackrabbit.webdav.client.methods.DavMethod;
+import org.apache.jackrabbit.webdav.client.methods.PropPatchMethod;
 import org.apache.jackrabbit.webdav.client.methods.PutMethod;
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
+import org.apache.jackrabbit.webdav.version.DeltaVConstants;
 
 public class WebDavTest {
        private final static Log log = LogFactory.getLog(WebDavTest.class);
@@ -42,24 +48,47 @@ public class WebDavTest {
                        client.setHostConfiguration(hostConfig);
                        // return client;
 
-                       String baseUrl = "http://localhost:7070/org.argeo.server.jackrabbit.webapp/default/";
-                       String fileName = "test.xml";
-                       String url1 = baseUrl + fileName;
-                       String url2 = baseUrl + "test-copied.xml";
+                       String baseUrl = "http://localhost:7070/webdav/default/";
+                       // String fileName = "test.xml";
+                       String file00 = "dummy00.xls";
+                       String file01 = "dummy01.xls";
+                       String url00 = baseUrl + file00;
+                       String url01 = baseUrl + file01;
+                       String urlCopied = baseUrl + "test-copied.xls";
 
                        // PUT
-                       log.debug("Create " + url1);
-                       PutMethod pm = new PutMethod(url1);
+                       log.debug("Create " + url00);
+                       PutMethod pm = new PutMethod(url00);
                        RequestEntity requestEntity = new InputStreamRequestEntity(
-                                       new FileInputStream(fileName));
+                                       new FileInputStream(file00));
+                       pm.setRequestEntity(requestEntity);
+                       client.executeMethod(pm);
+                       log.debug("POST status: " + pm.getStatusCode() + " "
+                                       + pm.getStatusText());
+
+                       // PROP PATCH
+                       List<DavProperty> props = new ArrayList<DavProperty>();
+                       props.add(new DefaultDavProperty("auto-version",
+                                       DeltaVConstants.XML_CHECKOUT_CHECKIN,
+                                       DeltaVConstants.NAMESPACE));
+                       PropPatchMethod pp = new PropPatchMethod(url00, props);
+                       client.executeMethod(pp);
+                       log.debug("PROP PATCH status: " + pp.getStatusCode() + " "
+                                       + pp.getStatusText());
+
+                       // PUT (update)
+                       log.debug("Update " + url00);
+                       pm = new PutMethod(url00);
+                       requestEntity = new InputStreamRequestEntity(new FileInputStream(
+                                       file01));
                        pm.setRequestEntity(requestEntity);
                        client.executeMethod(pm);
                        log.debug("POST status: " + pm.getStatusCode() + " "
                                        + pm.getStatusText());
 
                        // COPY
-                       log.debug("Copy to " + url2);
-                       DavMethod copy = new CopyMethod(url1, url2, true);
+                       log.debug("Copy to " + urlCopied);
+                       DavMethod copy = new CopyMethod(url00, urlCopied, true);
                        client.executeMethod(copy);
 
                        log.debug("COPY status: " + copy.getStatusCode() + " "
@@ -67,8 +96,8 @@ public class WebDavTest {
 
                        // GET
                        // CheckoutMethod gm = new CheckoutMethod(baseUrl + fileName);
-                       log.debug("Retrieve " + url2);
-                       GetMethod gm = new GetMethod(url2);
+                       log.debug("Retrieve " + urlCopied);
+                       GetMethod gm = new GetMethod(urlCopied);
                        client.executeMethod(gm);
                        String responseGet = gm.getResponseBodyAsString();
                        log.debug("GET status: " + gm.getStatusCode() + " "
@@ -78,5 +107,4 @@ public class WebDavTest {
                        e.printStackTrace();
                }
        }
-
 }
index 659533cdc08e72b243fc1f40be9d0d17023e9cb4..d87a780bc8d9bf9847f5f75848642dd488a449a0 100644 (file)
@@ -2,11 +2,12 @@ log4j.rootLogger=WARN, console
 
 ## Levels
 log4j.logger.org.argeo=DEBUG
+org.argeo.server.jackrabbit.webdav.ExtendedDispatcherServlet=INFO
 
 log4j.logger.org.hibernate=WARN
 
 log4j.logger.org.springframework=WARN
-log4j.logger.org.springframework.web=TRACE
+log4j.logger.org.springframework.web=WARN
 #log4j.logger.org.springframework.jms=WARN
 #log4j.logger.org.springframework.security=WARN
 
index 233e83904e9bc0524cdd752009659d1eb03999c1..e7b9942141e7aa2f61d9029807a3a5dc784c79a1 100644 (file)
                        <groupId>org.argeo.dep.osgi</groupId>
                        <artifactId>org.argeo.dep.osgi.jackrabbit</artifactId>
                </dependency>
+               <dependency>
+                       <groupId>org.apache.xalan</groupId>
+                       <artifactId>com.springsource.org.apache.xalan</artifactId>
+               </dependency>
 
                <!--  For webdav -->
                <dependency>
index cfa47ee9ba4410a7caaf22d856944ed276a253d6..4ed8e3dab3c65ee6d0d772c78f5fa4f1716af8a6 100644 (file)
@@ -7,7 +7,7 @@
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 
-       <bean id="webdavServlet" class="org.argeo.server.jackrabbit.webdav.SimpleWebDavServlet">
+       <bean id="webdavServlet" class="org.argeo.server.jackrabbit.webdav.WebDavServlet">
                <property name="repository" ref="repository" />
                <property name="resourceConfiguration" value="osgibundle:/WEB-INF/config.xml" />
        </bean>
index ae1d2085302e690fc214f7856b188a80d5056e03..8184e0a848144e6f95d555876408f9fdd906f13d 100644 (file)
@@ -6,9 +6,6 @@ import org.argeo.ArgeoException;
 public class ArgeoServerException extends ArgeoException {
        private static final long serialVersionUID = 1L;
 
-       public ArgeoServerException() {
-       }
-
        public ArgeoServerException(String message) {
                super(message);
        }
index a00612998e29ee3613812d38a84d42e5a26adfe4..e0bb0c393d6ff2d87199a99e4e670e8445f8ea39 100644 (file)
                        <version>0.1.2-SNAPSHOT</version>
                </dependency>
 
+               <dependency>
+                       <groupId>org.argeo.commons.server</groupId>
+                       <artifactId>org.argeo.server.core</artifactId>
+                       <version>0.1.2-SNAPSHOT</version>
+               </dependency>
+
                <!-- Jack Rabbit -->
                <dependency>
                        <groupId>org.argeo.dep.osgi</groupId>
                        <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
                </dependency>
 
+               <dependency>
+                       <groupId>org.apache.commons</groupId>
+                       <artifactId>com.springsource.org.apache.commons.fileupload</artifactId>
+               </dependency>
+
                <!-- TEST -->
                <dependency>
                        <groupId>org.argeo.commons.basic</groupId>
                        <type>pom</type>
                        <scope>test</scope>
                </dependency>
-
        </dependencies>
 </project>
index 2fde82d03577d05492c24a8de5d980703a849add..3b71b5fce92d6c802e4c15480a05fa72be6bfa82 100644 (file)
@@ -19,7 +19,7 @@ public class ExtendedDispatcherServlet extends DispatcherServlet {
                        throws ServletException, java.io.IOException {
                // see http://forum.springsource.org/showthread.php?t=53472
                try {
-                       if (log.isDebugEnabled())
+                       if (log.isTraceEnabled())
                                log.debug("Received request with method '" + req.getMethod()
                                                + "'");
                        doService(req, resp);
diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/SimpleWebDavServlet.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/SimpleWebDavServlet.java
deleted file mode 100644 (file)
index 2677589..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.argeo.server.jackrabbit.webdav;
-
-import java.io.IOException;
-
-import javax.jcr.Repository;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jackrabbit.webdav.simple.ResourceConfig;
-import org.argeo.ArgeoException;
-import org.springframework.core.io.Resource;
-
-public class SimpleWebDavServlet extends
-               org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet {
-
-       private static final long serialVersionUID = 1L;
-       private final static Log log = LogFactory.getLog(SimpleWebDavServlet.class);
-
-       /**
-        * the jcr repository
-        */
-       private Repository repository;
-       private Resource resourceConfiguration;
-
-       @Override
-       public void init() throws ServletException {
-               super.init();
-
-               if (resourceConfiguration != null) {
-                       ResourceConfig resourceConfig = new ResourceConfig();
-                       try {
-                               resourceConfig.parse(resourceConfiguration.getURL());
-                       } catch (IOException e) {
-                               throw new ArgeoException("Cannot parse resource configuration "
-                                               + resourceConfiguration, e);
-                       }
-                       setResourceConfig(resourceConfig);
-               }
-       }
-
-       @Override
-       protected void service(HttpServletRequest request,
-                       HttpServletResponse response) throws ServletException, IOException {
-               if (log.isDebugEnabled())
-                       log.debug("Received request with method '" + request.getMethod()
-                                       + "'");
-               super.service(request, response);
-       }
-
-       public Repository getRepository() {
-               return repository;
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void setResourceConfiguration(Resource resourceConfig) {
-               this.resourceConfiguration = resourceConfig;
-       }
-
-}
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
new file mode 100644 (file)
index 0000000..88c7f6b
--- /dev/null
@@ -0,0 +1,101 @@
+package org.argeo.server.jackrabbit.webdav;
+
+import java.io.IOException;
+
+import javax.jcr.Repository;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.webdav.simple.ResourceConfig;
+import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet;
+import org.argeo.ArgeoException;
+import org.springframework.core.io.Resource;
+
+public class WebDavServlet extends SimpleWebdavServlet {
+
+       private static final long serialVersionUID = 1L;
+       private final static Log log = LogFactory.getLog(WebDavServlet.class);
+
+       private Repository repository;
+       private Resource resourceConfiguration;
+
+       public WebDavServlet() {
+
+       }
+
+       // private Session session;
+
+       @Override
+       public void init() throws ServletException {
+               super.init();
+
+               if (resourceConfiguration != null) {
+                       ResourceConfig resourceConfig = new ResourceConfig();
+                       try {
+                               resourceConfig.parse(resourceConfiguration.getURL());
+                       } catch (IOException e) {
+                               throw new ArgeoException("Cannot parse resource configuration "
+                                               + resourceConfiguration, e);
+                       }
+                       setResourceConfig(resourceConfig);
+               }
+
+               // try {
+               // session().getWorkspace().getObservationManager().addEventListener(
+               // this, Event.NODE_ADDED, "/", true, null, null, false);
+               // if (log.isDebugEnabled())
+               // log.debug("Registered listener");
+               // } catch (Exception e) {
+               // throw new ArgeoException("Cannot register event listener", e);
+               // }
+       }
+
+       @Override
+       protected void service(HttpServletRequest request,
+                       HttpServletResponse response) throws ServletException, IOException {
+               if (log.isDebugEnabled())
+                       log.debug("Received request with method '" + request.getMethod()
+                                       + "'");
+               super.service(request, response);
+
+               if (log.isDebugEnabled()) {
+                       log.debug("Webdav response: " + response);
+                       // response.
+               }
+       }
+
+       // public void onEvent(EventIterator events) {
+       // while (events.hasNext()) {
+       // Event event = events.nextEvent();
+       // log.debug(event);
+       // }
+       //
+       // }
+
+       // protected Session session() {
+       // if (session == null)
+       // try {
+       // session = getRepository().login(
+       // new SimpleCredentials("demo", "demo".toCharArray()));
+       // } catch (Exception e) {
+       // throw new ArgeoException("Cannot open session", e);
+       // }
+       // return session;
+       // }
+
+       public Repository getRepository() {
+               return repository;
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+       public void setResourceConfiguration(Resource resourceConfig) {
+               this.resourceConfiguration = resourceConfig;
+       }
+
+}
index b770a89a802d1d330b6f90f697ac81f89f13eafd..aa6f11b25e95d67b6a0e18e8cea1046ead063dea 100644 (file)
@@ -1,5 +1,6 @@
 package org.argeo.server.jcr;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -66,8 +67,17 @@ public class JcrResourceAdapter implements InitializingBean, DisposableBean {
 
        public void create(String path, Resource file, String mimeType) {
                try {
-                       if (session().itemExists(path))
+                       create(path, file.getInputStream(), mimeType);
+               } catch (IOException e) {
+                       throw new ArgeoException("Cannot read " + file, e);
+               }
+       }
+
+       public void create(String path, InputStream in, String mimeType) {
+               try {
+                       if (session().itemExists(path)) {
                                throw new ArgeoException("Node " + path + " already exists.");
+                       }
 
                        int index = path.lastIndexOf('/');
                        String parentPath = path.substring(0, index);
@@ -80,11 +90,12 @@ public class JcrResourceAdapter implements InitializingBean, DisposableBean {
                        Node fileNode = folderNode.addNode(fileName, "nt:file");
 
                        Node contentNode = fileNode.addNode("jcr:content", "nt:resource");
-                       contentNode.setProperty("jcr:mimeType", mimeType);
+                       if (mimeType != null)
+                               contentNode.setProperty("jcr:mimeType", mimeType);
                        contentNode.setProperty("jcr:encoding", defaultEncoding);
-                       contentNode.setProperty("jcr:data", file.getInputStream());
+                       contentNode.setProperty("jcr:data", in);
                        Calendar lastModified = Calendar.getInstance();
-                       lastModified.setTimeInMillis(file.lastModified());
+                       // lastModified.setTimeInMillis(file.lastModified());
                        contentNode.setProperty("jcr:lastModified", lastModified);
                        // resNode.addMixin("mix:referenceable");
 
@@ -97,32 +108,44 @@ public class JcrResourceAdapter implements InitializingBean, DisposableBean {
                                fileNode.checkin();
 
                        if (log.isDebugEnabled())
-                               log.debug("Created " + path + " from " + file);
+                               log.debug("Created " + path);
                } catch (Exception e) {
-                       throw new ArgeoException("Cannot create node from resource " + file
-                                       + " under " + path, e);
+                       throw new ArgeoException("Cannot create node for " + path, e);
                }
 
        }
 
        public void update(String path, Resource file) {
                try {
+                       update(path, file.getInputStream());
+               } catch (IOException e) {
+                       throw new ArgeoException("Cannot read " + file, e);
+               }
+       }
+
+       public void update(String path, InputStream in) {
+               try {
+
+                       if (!session().itemExists(path)) {
+                               create(path, in, null);
+                               return;
+                       }
+
                        Node fileNode = (Node) session().getItem(path);
                        Node contentNode = fileNode.getNode("jcr:content");
                        fileNode.checkout();
-                       contentNode.setProperty("jcr:data", file.getInputStream());
+                       contentNode.setProperty("jcr:data", in);
                        Calendar lastModified = Calendar.getInstance();
-                       lastModified.setTimeInMillis(file.lastModified());
+                       // lastModified.setTimeInMillis(file.lastModified());
                        contentNode.setProperty("jcr:lastModified", lastModified);
 
                        session().save();
                        fileNode.checkin();
 
                        if (log.isDebugEnabled())
-                               log.debug("Updated " + path + " from " + file);
+                               log.debug("Updated " + path);
                } catch (Exception e) {
-                       throw new ArgeoException("Cannot update node " + path
-                                       + " from resource" + file, e);
+                       throw new ArgeoException("Cannot update node " + path, e);
                }
        }
 
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
new file mode 100644 (file)
index 0000000..ea800a0
--- /dev/null
@@ -0,0 +1,43 @@
+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");
+       }
+}