From: Mathieu Baudier Date: Thu, 26 Nov 2009 19:25:15 +0000 (+0000) Subject: Update webdav X-Git-Tag: argeo-commons-2.1.30~1685 X-Git-Url: http://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=1bb92c3e37546f02d79807a08ea6cd114161f795 Update webdav git-svn-id: https://svn.argeo.org/commons/trunk@3173 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/ArgeoException.java b/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/ArgeoException.java index 28d276fd1..ff3cef8ae 100644 --- a/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/ArgeoException.java +++ b/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/ArgeoException.java @@ -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 index 000000000..e5846fef7 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 index 000000000..b5c6b5539 Binary files /dev/null and b/sandbox/runtime/org.argeo.sandbox.jackrabbit/dummy01.xls differ diff --git a/sandbox/runtime/org.argeo.sandbox.jackrabbit/pom.xml b/sandbox/runtime/org.argeo.sandbox.jackrabbit/pom.xml index 9c1877c4a..ad81e525b 100644 --- a/sandbox/runtime/org.argeo.sandbox.jackrabbit/pom.xml +++ b/sandbox/runtime/org.argeo.sandbox.jackrabbit/pom.xml @@ -28,12 +28,13 @@ 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 ${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, diff --git a/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/java/org/argeo/sandbox/jackrabbit/WebDavTest.java b/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/java/org/argeo/sandbox/jackrabbit/WebDavTest.java index f121e928e..9a422f268 100644 --- a/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/java/org/argeo/sandbox/jackrabbit/WebDavTest.java +++ b/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/java/org/argeo/sandbox/jackrabbit/WebDavTest.java @@ -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 props = new ArrayList(); + 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(); } } - } diff --git a/server/demo/org.argeo.server.demo.log4j/log4j.properties b/server/demo/org.argeo.server.demo.log4j/log4j.properties index 659533cdc..d87a780bc 100644 --- a/server/demo/org.argeo.server.demo.log4j/log4j.properties +++ b/server/demo/org.argeo.server.demo.log4j/log4j.properties @@ -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 diff --git a/server/dep/org.argeo.server.dep.jackrabbit.server/pom.xml b/server/dep/org.argeo.server.dep.jackrabbit.server/pom.xml index 233e83904..e7b994214 100644 --- a/server/dep/org.argeo.server.dep.jackrabbit.server/pom.xml +++ b/server/dep/org.argeo.server.dep.jackrabbit.server/pom.xml @@ -15,6 +15,10 @@ org.argeo.dep.osgi org.argeo.dep.osgi.jackrabbit + + org.apache.xalan + com.springsource.org.apache.xalan + diff --git a/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/webdav-servlet.xml b/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/webdav-servlet.xml index cfa47ee9b..4ed8e3dab 100644 --- a/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/webdav-servlet.xml +++ b/server/modules/org.argeo.server.jackrabbit.webdav/WEB-INF/webdav-servlet.xml @@ -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"> - + diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ArgeoServerException.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ArgeoServerException.java index ae1d20853..8184e0a84 100644 --- a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ArgeoServerException.java +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ArgeoServerException.java @@ -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); } diff --git a/server/runtime/org.argeo.server.jackrabbit/pom.xml b/server/runtime/org.argeo.server.jackrabbit/pom.xml index a00612998..e0bb0c393 100644 --- a/server/runtime/org.argeo.server.jackrabbit/pom.xml +++ b/server/runtime/org.argeo.server.jackrabbit/pom.xml @@ -45,6 +45,12 @@ 0.1.2-SNAPSHOT + + org.argeo.commons.server + org.argeo.server.core + 0.1.2-SNAPSHOT + + org.argeo.dep.osgi @@ -78,6 +84,11 @@ com.springsource.slf4j.org.apache.commons.logging + + org.apache.commons + com.springsource.org.apache.commons.fileupload + + org.argeo.commons.basic @@ -92,6 +103,5 @@ pom test - diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/ExtendedDispatcherServlet.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/ExtendedDispatcherServlet.java index 2fde82d03..3b71b5fce 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/ExtendedDispatcherServlet.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/ExtendedDispatcherServlet.java @@ -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 index 267758958..000000000 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/SimpleWebDavServlet.java +++ /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 index 000000000..88c7f6bd3 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java @@ -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; + } + +} 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 b770a89a8..aa6f11b25 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 @@ -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 index 000000000..ea800a037 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/mvc/JcrController.java @@ -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 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"); + } +}