public class ArgeoException extends RuntimeException {
private static final long serialVersionUID = 1L;
- public ArgeoException() {
- }
-
public ArgeoException(String message) {
super(message);
}
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>
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;
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);
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() + " "
// 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() + " "
e.printStackTrace();
}
}
-
}
## 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
<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>
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>
public class ArgeoServerException extends ArgeoException {
private static final long serialVersionUID = 1L;
- public ArgeoServerException() {
- }
-
public ArgeoServerException(String message) {
super(message);
}
<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>
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);
+++ /dev/null
-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;
- }
-
-}
--- /dev/null
+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;
+ }
+
+}
package org.argeo.server.jcr;
+import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
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);
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");
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);
}
}
--- /dev/null
+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");
+ }
+}