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,
--- /dev/null
+<?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
<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>
<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>
@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.
}
--- /dev/null
+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;
+ }
+
+}
import java.util.List;
import java.util.StringTokenizer;
+import javax.activation.MimetypesFileTypeMap;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
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;
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
try {
if (!session().itemExists(path)) {
- create(path, in, null);
+ String type = new MimetypesFileTypeMap()
+ .getContentType(FilenameUtils.getName(path));
+ create(path, in, type);
return;
}
+++ /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");
- }
-}
--- /dev/null
+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;
+ }
+
+}