Split server Jackrabbit into JCR
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 30 Apr 2010 08:41:52 +0000 (08:41 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 30 Apr 2010 08:41:52 +0000 (08:41 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@3543 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
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/WebDavServlet.java
server/runtime/org.argeo.server.jcr/META-INF/MANIFEST.MF
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultJcrListener.java [new file with mode: 0644]
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java [new file with mode: 0644]
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java [deleted file]
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java [deleted file]
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/mvc/JcrBrowserController.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/mvc/JcrManagerController.java
server/runtime/org.argeo.server.jcr/src/test/java/org/argeo/server/jcr/JcrResourceAdapterTest.java

index fabe0aebb79c8280dd00b02dd1091d4d9be5e9bd..0d0d056c128af02455125274b746d616f32ad057 100644 (file)
@@ -6,7 +6,7 @@ Import-Package: javax.jcr,
  javax.servlet.http,
  javax.servlet.resources,
  org.argeo.server.jackrabbit.webdav,
- org.argeo.server.jcr,
+ org.argeo.jcr,
  org.argeo.server.jcr.mvc,
  org.argeo.server.json,
  org.argeo.server.mvc,
index 8dd19947deae50acff1de3a85eb1fb8933a166a6..077b77bf1ccb1eefbda9cf17aacd048e0faca816 100644 (file)
                <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 id="resourceAdapter" class="org.argeo.jcr.JcrResourceAdapter">
+               <property name="session" ref="jcrSession" />
+       </bean>
+
+       <bean id="jcrSession" class="org.argeo.jcr.ThreadBoundJcrSessionFactory">
+               <property name="repository" ref="jcrRepository" />
        </bean>
 
        <bean id="viewResolver" class="org.argeo.server.mvc.SerializingViewResolver">
index c7b42e6df7be0aeb80e023dd0b386947a0599f33..a2683a1fa9dac07015ff577e485dc0d078aa26db 100644 (file)
@@ -26,8 +26,6 @@ public class WebDavServlet extends SimpleWebdavServlet {
 
        }
 
-       // private Session session;
-
        @Override
        public void init() throws ServletException {
                super.init();
@@ -42,18 +40,8 @@ public class WebDavServlet extends SimpleWebdavServlet {
                        }
                        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);
-               // }
        }
 
-       @SuppressWarnings("restriction")
        @Override
        protected void service(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
@@ -68,25 +56,6 @@ public class WebDavServlet extends SimpleWebdavServlet {
                }
        }
 
-       // 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;
        }
index 39e03ff767944bf5cd623bcd4dafadf5f4f0b93b..29061a0b29d8693ba4ec38936f895963d5e7cd63 100644 (file)
@@ -1,23 +1,40 @@
 Manifest-Version: 1.0\r
 Created-By: 1.5.0_16 (Sun Microsystems Inc.)\r
 Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt\r
-Import-Package: javax.activation;version="1.1",javax.jcr;version="1.0"\r
- ,javax.jcr.nodetype;version="1.0",javax.jcr.observation;version="1.0"\r
- ,javax.jcr.query;version="1.0",javax.jcr.version;version="1.0",javax.\r
- servlet;version="2.5",javax.servlet.http;version="2.5",javax.xml.pars\r
- ers,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.s\r
- tream,org.apache.commons.fileupload;version="1.2",org.apache.commons.\r
- fileupload.disk;version="1.2",org.apache.commons.fileupload.servlet;v\r
- ersion="1.2",org.apache.commons.io;version="1.4",org.apache.commons.l\r
- ogging;version="1.1",org.argeo;version="0.1",org.argeo.jcr;version="0\r
- .1",org.argeo.server;version="0.1",org.argeo.server.jcr;version="0.1"\r
- ,org.argeo.server.jcr.mvc;version="0.1",org.argeo.server.mvc;version=\r
- "0.1",org.springframework.beans;version="2.5",org.springframework.bea\r
- ns.factory;version="2.5",org.springframework.core.io;version="2.5",or\r
- g.springframework.stereotype;version="2.5",org.springframework.ui;ver\r
- sion="2.5",org.springframework.web.bind.annotation;version="2.5",org.\r
- springframework.web.context.request;version="2.5",org.springframework\r
- .xml.dom;version="1.5",org.w3c.dom,org.xml.sax\r
+Import-Package: javax.activation;version="1.1",\r
+ javax.jcr;version="1.0",\r
+ javax.jcr.nodetype;version="1.0",\r
+ javax.jcr.observation;version="1.0",\r
+ javax.jcr.query;version="1.0",\r
+ javax.jcr.version;version="1.0",\r
+ javax.servlet;version="2.5",\r
+ javax.servlet.http;version="2.5",\r
+ javax.xml.parsers,\r
+ javax.xml.transform,\r
+ javax.xml.transform.dom,\r
+ javax.xml.transform.stream,\r
+ org.apache.commons.fileupload;version="1.2",\r
+ org.apache.commons.fileupload.disk;version="1.2",\r
+ org.apache.commons.fileupload.servlet;version="1.2",\r
+ org.apache.commons.io;version="1.4",\r
+ org.apache.commons.logging;version="1.1",\r
+ org.argeo;version="0.1",\r
+ org.argeo.jcr;version="0.1",\r
+ org.argeo.server;version="0.1",\r
+ org.argeo.server.jackrabbit.unit;version="0.1.3.SNAPSHOT-r3520",\r
+ org.argeo.server.jcr;version="0.1",\r
+ org.argeo.server.jcr.mvc;version="0.1",\r
+ org.argeo.server.mvc;version="0.1",\r
+ org.springframework.beans;version="2.5",\r
+ org.springframework.beans.factory;version="2.5",\r
+ org.springframework.core.io;version="2.5",\r
+ org.springframework.stereotype;version="2.5",\r
+ org.springframework.ui;version="2.5",\r
+ org.springframework.web.bind.annotation;version="2.5",\r
+ org.springframework.web.context.request;version="2.5",\r
+ org.springframework.xml.dom;version="1.5",\r
+ org.w3c.dom,\r
+ org.xml.sax\r
 Bundle-RequiredExecutionEnvironment: J2SE-1.5\r
 Export-Package: org.argeo.jcr;uses:="org.springframework.beans,javax.j\r
  cr,org.argeo,javax.jcr.query,org.apache.commons.logging,javax.jcr.nod\r
diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultJcrListener.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultJcrListener.java
new file mode 100644 (file)
index 0000000..85f495d
--- /dev/null
@@ -0,0 +1,79 @@
+package org.argeo.jcr;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+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 String path = "/";
+       private Boolean deep = true;
+
+       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);
+       }
+
+       private Session session() {
+               return session;
+       }
+
+       public void setPath(String path) {
+               this.path = path;
+       }
+
+       public void setDeep(Boolean deep) {
+               this.deep = deep;
+       }
+
+       public void setSession(Session session) {
+               this.session = session;
+       }
+
+}
diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java
new file mode 100644 (file)
index 0000000..3c69e0b
--- /dev/null
@@ -0,0 +1,221 @@
+package org.argeo.jcr;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import javax.activation.MimetypesFileTypeMap;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+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;
+import org.springframework.core.io.Resource;
+
+public class JcrResourceAdapter {
+       private final static Log log = LogFactory.getLog(JcrResourceAdapter.class);
+
+       private Session session;
+
+       private Boolean versioning = true;
+       private String defaultEncoding = "UTF-8";
+
+       // private String restoreBase = "/.restore";
+
+       public void mkdirs(String path) {
+               JcrUtils.mkdirs(session(), path, "nt:folder", versioning);
+       }
+
+       public void create(String path, Resource file, String mimeType) {
+               try {
+                       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);
+                       if (parentPath.equals(""))
+                               parentPath = "/";
+                       String fileName = path.substring(index + 1);
+                       if (!session().itemExists(parentPath))
+                               throw new ArgeoException("Parent folder of node " + path
+                                               + " does not exist: " + parentPath);
+
+                       Node folderNode = (Node) session().getItem(parentPath);
+                       Node fileNode = folderNode.addNode(fileName, "nt:file");
+
+                       Node contentNode = fileNode.addNode("jcr:content", "nt:resource");
+                       if (mimeType != null)
+                               contentNode.setProperty("jcr:mimeType", mimeType);
+                       contentNode.setProperty("jcr:encoding", defaultEncoding);
+                       contentNode.setProperty("jcr:data", in);
+                       Calendar lastModified = Calendar.getInstance();
+                       // lastModified.setTimeInMillis(file.lastModified());
+                       contentNode.setProperty("jcr:lastModified", lastModified);
+                       // resNode.addMixin("mix:referenceable");
+
+                       if (versioning)
+                               fileNode.addMixin("mix:versionable");
+
+                       session().save();
+
+                       if (versioning)
+                               fileNode.checkin();
+
+                       if (log.isDebugEnabled())
+                               log.debug("Created " + path);
+               } catch (Exception 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)) {
+                               String type = new MimetypesFileTypeMap()
+                                               .getContentType(FilenameUtils.getName(path));
+                               create(path, in, type);
+                               return;
+                       }
+
+                       Node fileNode = (Node) session().getItem(path);
+                       Node contentNode = fileNode.getNode("jcr:content");
+                       fileNode.checkout();
+                       contentNode.setProperty("jcr:data", in);
+                       Calendar lastModified = Calendar.getInstance();
+                       // lastModified.setTimeInMillis(file.lastModified());
+                       contentNode.setProperty("jcr:lastModified", lastModified);
+
+                       session().save();
+                       fileNode.checkin();
+
+                       if (log.isDebugEnabled())
+                               log.debug("Updated " + path);
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot update node " + path, e);
+               }
+       }
+
+       public List<Calendar> listVersions(String path) {
+               if (!versioning)
+                       throw new ArgeoException("Versioning is not activated");
+
+               try {
+                       List<Calendar> versions = new ArrayList<Calendar>();
+                       Node fileNode = (Node) session().getItem(path);
+                       VersionHistory history = fileNode.getVersionHistory();
+                       for (VersionIterator it = history.getAllVersions(); it.hasNext();) {
+                               Version version = (Version) it.next();
+                               versions.add(version.getCreated());
+                               if (log.isTraceEnabled()) {
+                                       log.debug(version);
+                                       // debug(version);
+                               }
+                       }
+                       return versions;
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot list version of node " + path, e);
+               }
+       }
+
+       public InputStream retrieve(String path) {
+               try {
+                       Node node = (Node) session().getItem(path + "/jcr:content");
+                       Property property = node.getProperty("jcr:data");
+                       return property.getStream();
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot retrieve " + path, e);
+               }
+       }
+
+       public synchronized InputStream retrieve(String path, Integer revision) {
+               if (!versioning)
+                       throw new ArgeoException("Versioning is not activated");
+
+               try {
+                       Node fileNode = (Node) session().getItem(path);
+                       VersionHistory history = fileNode.getVersionHistory();
+                       int count = 0;
+                       Version version = null;
+                       for (VersionIterator it = history.getAllVersions(); it.hasNext();) {
+                               version = (Version) it.next();
+                               if (count == revision + 1) {
+                                       InputStream in = fromVersion(version);
+                                       if (log.isDebugEnabled())
+                                               log.debug("Retrieved " + path + " at revision "
+                                                               + revision);
+                                       return in;
+                               }
+                               count++;
+                       }
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot retrieve version " + revision
+                                       + " of " + path, e);
+               }
+
+               throw new ArgeoException("Version " + revision
+                               + " does not exist for node " + path);
+       }
+
+       protected InputStream fromVersion(Version version)
+                       throws RepositoryException {
+               Node frozenNode = version.getNode("jcr:frozenNode");
+               InputStream in = frozenNode.getNode("jcr:content").getProperty(
+                               "jcr:data").getStream();
+               return in;
+       }
+
+       protected Session session() {
+               return session;
+       }
+
+       public void setVersioning(Boolean versioning) {
+               this.versioning = versioning;
+       }
+
+       public void setDefaultEncoding(String defaultEncoding) {
+               this.defaultEncoding = defaultEncoding;
+       }
+
+       protected String fill(Integer number) {
+               int size = 4;
+               String str = number.toString();
+               for (int i = str.length(); i < size; i++) {
+                       str = "0" + str;
+               }
+               return str;
+       }
+
+       public void setSession(Session session) {
+               this.session = session;
+       }
+       
+       
+}
diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/DefaultJcrListener.java
deleted file mode 100644 (file)
index 4b23308..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-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;
-       }
-
-       public void setPath(String path) {
-               this.path = path;
-       }
-
-       public void setDeep(Boolean deep) {
-               this.deep = deep;
-       }
-
-}
diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java
deleted file mode 100644 (file)
index 020672b..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-package org.argeo.server.jcr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-
-import javax.activation.MimetypesFileTypeMap;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-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;
-import org.argeo.jcr.JcrUtils;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.core.io.Resource;
-
-public class JcrResourceAdapter implements InitializingBean, DisposableBean {
-       private final static Log log = LogFactory.getLog(JcrResourceAdapter.class);
-
-       private Repository repository;
-
-       private String username;
-       private String password;
-
-       private Session session;
-
-       private Boolean versioning = true;
-       private String defaultEncoding = "UTF-8";
-
-       // private String restoreBase = "/.restore";
-
-       public void mkdirs(String path) {
-               JcrUtils.mkdirs(session(), path, "nt:folder", versioning);
-       }
-
-       public void create(String path, Resource file, String mimeType) {
-               try {
-                       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);
-                       if (parentPath.equals(""))
-                               parentPath = "/";
-                       String fileName = path.substring(index + 1);
-                       if (!session().itemExists(parentPath))
-                               throw new ArgeoException("Parent folder of node " + path
-                                               + " does not exist: " + parentPath);
-
-                       Node folderNode = (Node) session().getItem(parentPath);
-                       Node fileNode = folderNode.addNode(fileName, "nt:file");
-
-                       Node contentNode = fileNode.addNode("jcr:content", "nt:resource");
-                       if (mimeType != null)
-                               contentNode.setProperty("jcr:mimeType", mimeType);
-                       contentNode.setProperty("jcr:encoding", defaultEncoding);
-                       contentNode.setProperty("jcr:data", in);
-                       Calendar lastModified = Calendar.getInstance();
-                       // lastModified.setTimeInMillis(file.lastModified());
-                       contentNode.setProperty("jcr:lastModified", lastModified);
-                       // resNode.addMixin("mix:referenceable");
-
-                       if (versioning)
-                               fileNode.addMixin("mix:versionable");
-
-                       session().save();
-
-                       if (versioning)
-                               fileNode.checkin();
-
-                       if (log.isDebugEnabled())
-                               log.debug("Created " + path);
-               } catch (Exception 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)) {
-                               String type = new MimetypesFileTypeMap()
-                                               .getContentType(FilenameUtils.getName(path));
-                               create(path, in, type);
-                               return;
-                       }
-
-                       Node fileNode = (Node) session().getItem(path);
-                       Node contentNode = fileNode.getNode("jcr:content");
-                       fileNode.checkout();
-                       contentNode.setProperty("jcr:data", in);
-                       Calendar lastModified = Calendar.getInstance();
-                       // lastModified.setTimeInMillis(file.lastModified());
-                       contentNode.setProperty("jcr:lastModified", lastModified);
-
-                       session().save();
-                       fileNode.checkin();
-
-                       if (log.isDebugEnabled())
-                               log.debug("Updated " + path);
-               } catch (Exception e) {
-                       throw new ArgeoException("Cannot update node " + path, e);
-               }
-       }
-
-       public List<Calendar> listVersions(String path) {
-               if (!versioning)
-                       throw new ArgeoException("Versioning is not activated");
-
-               try {
-                       List<Calendar> versions = new ArrayList<Calendar>();
-                       Node fileNode = (Node) session().getItem(path);
-                       VersionHistory history = fileNode.getVersionHistory();
-                       for (VersionIterator it = history.getAllVersions(); it.hasNext();) {
-                               Version version = (Version) it.next();
-                               versions.add(version.getCreated());
-                               if (log.isTraceEnabled()) {
-                                       log.debug(version);
-                                       // debug(version);
-                               }
-                       }
-                       return versions;
-               } catch (Exception e) {
-                       throw new ArgeoException("Cannot list version of node " + path, e);
-               }
-       }
-
-       public InputStream retrieve(String path) {
-               try {
-                       Node node = (Node) session().getItem(path + "/jcr:content");
-                       Property property = node.getProperty("jcr:data");
-                       return property.getStream();
-               } catch (Exception e) {
-                       throw new ArgeoException("Cannot retrieve " + path, e);
-               }
-       }
-
-       public synchronized InputStream retrieve(String path, Integer revision) {
-               if (!versioning)
-                       throw new ArgeoException("Versioning is not activated");
-
-               try {
-                       Node fileNode = (Node) session().getItem(path);
-                       VersionHistory history = fileNode.getVersionHistory();
-                       int count = 0;
-                       Version version = null;
-                       for (VersionIterator it = history.getAllVersions(); it.hasNext();) {
-                               version = (Version) it.next();
-                               if (count == revision + 1) {
-                                       InputStream in = fromVersion(version);
-                                       if (log.isDebugEnabled())
-                                               log.debug("Retrieved " + path + " at revision "
-                                                               + revision);
-                                       return in;
-                               }
-                               count++;
-                       }
-               } catch (Exception e) {
-                       throw new ArgeoException("Cannot retrieve version " + revision
-                                       + " of " + path, e);
-               }
-
-               throw new ArgeoException("Version " + revision
-                               + " does not exist for node " + path);
-       }
-
-       protected InputStream fromVersion(Version version)
-                       throws RepositoryException {
-               Node frozenNode = version.getNode("jcr:frozenNode");
-               InputStream in = frozenNode.getNode("jcr:content").getProperty(
-                               "jcr:data").getStream();
-               return in;
-       }
-
-       protected Session session() {
-               return session;
-       }
-
-       public void afterPropertiesSet() throws Exception {
-               session = repository.login(new SimpleCredentials(username, password
-                               .toCharArray()));
-       }
-
-       public void destroy() throws Exception {
-               session.logout();
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void setUsername(String username) {
-               this.username = username;
-       }
-
-       public void setPassword(String password) {
-               this.password = password;
-       }
-
-       public void setVersioning(Boolean versioning) {
-               this.versioning = versioning;
-       }
-
-       public void setDefaultEncoding(String defaultEncoding) {
-               this.defaultEncoding = defaultEncoding;
-       }
-
-       protected String fill(Integer number) {
-               int size = 4;
-               String str = number.toString();
-               for (int i = str.length(); i < size; i++) {
-                       str = "0" + str;
-               }
-               return str;
-       }
-}
index cddc8b01e09aa0f4a5d77167999d2f4bfc9f16fb..849fff1eddec02bad8e155c926201eb2f49380e9 100644 (file)
@@ -3,7 +3,6 @@ package org.argeo.server.jcr.mvc;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 
 import javax.jcr.Item;
 import javax.jcr.NodeIterator;
index 37fca841c1104366d1f3f1c581ac0ad9a39e88b8..7edd5378b760e41d0eb60a66fd975a90037b2f38 100644 (file)
@@ -12,8 +12,8 @@ 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.jcr.JcrResourceAdapter;
 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;
index 1588fd7e019ce3e621ce7df8558e8b4d35627176..65063e040faa29a0df7e18331a71eb4c13229752 100644 (file)
@@ -6,9 +6,12 @@ import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.List;
 
+import javax.jcr.SimpleCredentials;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.jcr.JcrResourceAdapter;
 import org.argeo.server.jackrabbit.unit.AbstractJcrTestCase;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
@@ -74,16 +77,8 @@ public class JcrResourceAdapterTest extends AbstractJcrTestCase {
        protected void setUp() throws Exception {
                super.setUp();
                jra = new JcrResourceAdapter();
-               jra.setRepository(getRepository());
-               jra.setUsername("demo");
-               jra.setPassword("demo");
-               jra.afterPropertiesSet();
-       }
-
-       @Override
-       protected void tearDown() throws Exception {
-               jra.destroy();
-               super.tearDown();
+               jra.setSession(getRepository().login(
+                               new SimpleCredentials("demo", "demo".toCharArray())));
        }
 
        protected File getRepositoryFile() throws Exception {