svn commit: r1167157 - in /ofbiz/branches/jackrabbit20100709: applications/content/src/org/ofbiz/content/jcr/ framework/jcr/src/org/ofbiz/jcr/access/ framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1167157 - in /ofbiz/branches/jackrabbit20100709: applications/content/src/org/ofbiz/content/jcr/ framework/jcr/src/org/ofbiz/jcr/access/ framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/

sascharodekamp
Author: sascharodekamp
Date: Fri Sep  9 13:30:49 2011
New Revision: 1167157

URL: http://svn.apache.org/viewvc?rev=1167157&view=rev
Log:
Update: Enable versioning for hierarchy and unstructured nodes

Modified:
    ofbiz/branches/jackrabbit20100709/applications/content/src/org/ofbiz/content/jcr/JackrabbitEvents.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/RepositoryAccess.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/RepositoryAccessJackrabbit.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitHierarchyNode.java
    ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitUnstructured.java

Modified: ofbiz/branches/jackrabbit20100709/applications/content/src/org/ofbiz/content/jcr/JackrabbitEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/applications/content/src/org/ofbiz/content/jcr/JackrabbitEvents.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/applications/content/src/org/ofbiz/content/jcr/JackrabbitEvents.java (original)
+++ ofbiz/branches/jackrabbit20100709/applications/content/src/org/ofbiz/content/jcr/JackrabbitEvents.java Fri Sep  9 13:30:49 2011
@@ -120,13 +120,16 @@ public class JackrabbitEvents {
         }
 
         RepositoryAccess repositoryAccess = new RepositoryAccessJackrabbit(userLogin);
+
+        List<String> list = repositoryAccess.getVersionList(node);
+
         OfbizRepositoryMappingJackrabbitArticle ormArticle = (OfbizRepositoryMappingJackrabbitArticle) repositoryAccess.getContentObject(node);
 
         request.setAttribute("contentObject", ormArticle);
         request.setAttribute("path", ormArticle.getPath());
         request.setAttribute("language", ormArticle.getLanguage());
         request.setAttribute("title", ormArticle.getTitle());
-        request.setAttribute("version", ormArticle.getVersion());
+        request.setAttribute("version", list.get(list.size() - 1));
         request.setAttribute("createDate", ormArticle.getCreationDate());
         request.setAttribute("content", ormArticle.getContent());
 

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/RepositoryAccess.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/RepositoryAccess.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/RepositoryAccess.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/RepositoryAccess.java Fri Sep  9 13:30:49 2011
@@ -1,5 +1,7 @@
 package org.ofbiz.jcr.access;
 
+import java.util.List;
+
 import javax.jcr.ItemExistsException;
 import javax.jcr.RepositoryException;
 
@@ -72,4 +74,12 @@ public interface RepositoryAccess {
      * @throws RepositoryException
      */
     JSONArray getJsonFileTree() throws RepositoryException;
+
+    /**
+     * Returns a list of the available versions.
+     *
+     * @param nodePath
+     * @return
+     */
+    public List<String> getVersionList(String nodePath);
 }

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java Fri Sep  9 13:30:49 2011
@@ -1,5 +1,46 @@
 package org.ofbiz.jcr.access;
 
+import java.util.List;
+import java.util.Set;
+
 public interface VersioningManager {
 
+    /**
+     * Returns a List of all available versions for the passed node.
+     *
+     * @param nodePath
+     * @return
+     */
+    public List<String> getVersionList(String nodePath);
+
+    /**
+     * Check Out a node from a repository
+     *
+     * @param nodePath
+     */
+    public void checkOutContentObject(String nodePath);
+
+    /**
+     * Check Out a node from a repository. If recursive is set to TRUE all
+     * related sub nodes and the parent node will also be checked out.
+     *
+     * @param nodePath
+     * @param recursiv
+     */
+    public void checkOutContentObject(String nodePath, boolean recursiv);
+
+    /**
+     * Saves the state of the session and checks in all checkout content nodes.
+     */
+    public void checkInContentAndSaveState();
+
+    /**
+     * Add a node path to a list of node path which will be checked in when the
+     * state is saved. This is to add new created nodes which could not checked
+     * out before.
+     *
+     * @param nodePath
+     */
+    public void addContentToCheckInList(String nodePath);
+
 }

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java Fri Sep  9 13:30:49 2011
@@ -23,8 +23,6 @@ public class ContentReaderJackrabbit imp
 
     @Override
     public OfbizRepositoryMapping getContentObject(String nodePath) {
-        // OfbizRepositoryMappingJackrabbit ofbizRepositoryMapping =
-        // (OfbizRepositoryMappingJackrabbit) ocm.getObject(nodePath);
         return (OfbizRepositoryMapping) ocm.getObject(nodePath);
     }
 

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java Fri Sep  9 13:30:49 2011
@@ -10,6 +10,7 @@ import org.apache.jackrabbit.ocm.manager
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.jcr.access.ContentWriter;
+import org.ofbiz.jcr.access.VersioningManager;
 import org.ofbiz.jcr.orm.OfbizRepositoryMapping;
 
 public class ContentWriterJackrabbit implements ContentWriter {
@@ -17,6 +18,7 @@ public class ContentWriterJackrabbit imp
     private static String module = ContentWriterJackrabbit.class.getName();
 
     private ObjectContentManager ocm = null;
+    VersioningManager versioningManager = null;
 
     /**
      *
@@ -24,6 +26,7 @@ public class ContentWriterJackrabbit imp
      */
     public ContentWriterJackrabbit(ObjectContentManager ocm) {
         this.ocm = ocm;
+        versioningManager = new VersioningManagerJackrabbit(ocm);
     }
 
     /*
@@ -85,7 +88,10 @@ public class ContentWriterJackrabbit imp
                     }
                     newNode.setPath(parentNodePath + node);
 
+                    versioningManager.checkOutContentObject(parentNode.getPath());
+
                     ocm.insert(newNode);
+                    versioningManager.addContentToCheckInList(newNode.getPath());
                     parentNode = parentNode.getNode(node);
                 }
             } catch (PathNotFoundException e) {
@@ -105,6 +111,8 @@ public class ContentWriterJackrabbit imp
         }
 
         ocm.insert(orm);
+        versioningManager.addContentToCheckInList(orm.getPath());
+
         this.saveState();
     }
 
@@ -117,6 +125,7 @@ public class ContentWriterJackrabbit imp
      */
     @Override
     public void updateContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException {
+        versioningManager.checkOutContentObject(orm.getPath());
         ocm.update(orm);
         this.saveState();
     }
@@ -129,13 +138,13 @@ public class ContentWriterJackrabbit imp
      */
     @Override
     public void removeContentObject(String nodePath) throws ObjectContentManagerException {
+        versioningManager.checkOutContentObject(nodePath, true);
+
         ocm.remove(nodePath);
         this.saveState();
     }
 
     private void saveState() {
-        if (ocm != null) {
-            ocm.save();
-        }
+        versioningManager.checkInContentAndSaveState();
     }
 }

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/RepositoryAccessJackrabbit.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/RepositoryAccessJackrabbit.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/RepositoryAccessJackrabbit.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/RepositoryAccessJackrabbit.java Fri Sep  9 13:30:49 2011
@@ -18,6 +18,7 @@ import org.ofbiz.entity.GenericValue;
 import org.ofbiz.jcr.access.ContentReader;
 import org.ofbiz.jcr.access.ContentWriter;
 import org.ofbiz.jcr.access.RepositoryAccess;
+import org.ofbiz.jcr.access.VersioningManager;
 import org.ofbiz.jcr.loader.JCRFactoryUtil;
 import org.ofbiz.jcr.orm.OfbizRepositoryMapping;
 import org.ofbiz.jcr.orm.jackrabbit.OfbizRepositoryMappingJackrabbitArticle;
@@ -160,6 +161,16 @@ public class RepositoryAccessJackrabbit
 
     /*
      * (non-Javadoc)
+     * @see org.ofbiz.jcr.access.RepositoryAccess#getVersionList(java.lang.String)
+     */
+    @Override
+    public List<String> getVersionList(String nodePath) {
+        VersioningManager versioningnManager = new VersioningManagerJackrabbit(this.ocm);
+        return versioningnManager.getVersionList(nodePath);
+    }
+
+    /*
+     * (non-Javadoc)
      *
      * @see org.ofbiz.jcr.orm.RepositoryAccess#getJsonFileTree()
      */

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java Fri Sep  9 13:30:49 2011
@@ -2,15 +2,19 @@ package org.ofbiz.jcr.access.jackrabbit;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 import javax.jcr.UnsupportedRepositoryOperationException;
-import javax.jcr.version.VersionManager;
+import javax.jcr.version.VersionException;
 
+import org.apache.jackrabbit.ocm.manager.ObjectContentManager;
+import org.apache.jackrabbit.ocm.version.Version;
+import org.apache.jackrabbit.ocm.version.VersionIterator;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.jcr.access.VersioningManager;
 
@@ -18,58 +22,123 @@ public class VersioningManagerJackrabbit
 
     private static String module = VersioningManagerJackrabbit.class.getName();
 
-    private volatile VersionManager versionManager = null;
-    private List<Node> checkedOutNodeStore = Collections.synchronizedList(new ArrayList<Node>());
-    private Session session = null;
+    ObjectContentManager ocm = null;
 
-    VersioningManagerJackrabbit(Session session) throws UnsupportedRepositoryOperationException, RepositoryException {
-        versionManager = session.getWorkspace().getVersionManager();
-        this.session = session;
+    private Set<String> checkedOutNodeStore = Collections.synchronizedSet(new HashSet<String>());
+
+    VersioningManagerJackrabbit(ObjectContentManager ocm) {
+        this.ocm = ocm;
     }
 
-    public VersionManager getVersionManager() {
-        return this.versionManager;
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.ofbiz.jcr.access.VersioningManager#getVersionList(java.lang.String)
+     */
+    @Override
+    public List<String> getVersionList(String nodePath) {
+        List<String> result = new ArrayList<String>();
+        VersionIterator versionIterator = null;
+        try {
+            versionIterator = this.ocm.getAllVersions(nodePath);
+        } catch (VersionException e) {
+            Debug.logError(e, module);
+            // return an empty List
+            return result;
+        }
+
+        // write the versions to the array list.
+        while (versionIterator.hasNext()) {
+            Version version = (Version) versionIterator.next();
+            result.add(version.getName());
+        }
+
+        return result;
     }
 
-    public void addNodeToCheckedOutStore(Node node) {
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.ofbiz.jcr.access.VersioningManager#checkOutContentObject(java.lang
+     * .String)
+     */
+    @Override
+    public void checkOutContentObject(String nodePath) {
+        // check if the parent node is the root node, because the
+        // root node can not be checked out.
+        if (ConstantsJackrabbit.ROOTPATH.equals(nodePath)) {
+            return;
+        }
+
         try {
-            if (!versionManager.isCheckedOut(node.getPath())) {
-                checkedOutNodeStore.add(node);
+            if (this.ocm.getSession().nodeExists(nodePath) && !this.ocm.getSession().getWorkspace().getVersionManager().isCheckedOut(nodePath)) {
+                this.ocm.checkout(nodePath);
+                this.addContentToCheckInList(nodePath);
             }
+        } catch (VersionException e) {
+            Debug.logError(e, module);
+        } catch (UnsupportedRepositoryOperationException e) {
+            Debug.logError(e, module);
         } catch (RepositoryException e) {
             Debug.logError(e, module);
         }
     }
 
-    protected void saveSessionAndCheckinNode() {
-        try {
-            this.session.save();
+    public void checkOutContentObject(String nodePath, boolean recursiv) {
+        if (recursiv) {
+            try {
+                checkOutRelatedNodes(nodePath);
+            } catch (RepositoryException e) {
+                Debug.logError(e, module);
+            }
+        } else {
+            checkOutContentObject(nodePath);
+        }
+    }
 
-            for (Node node : checkedOutNodeStore) {
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.ofbiz.jcr.access.VersioningManager#addContentToCheckInList(java.lang
+     * .String)
+     */
+    @Override
+    public void addContentToCheckInList(String nodePath) {
+        checkedOutNodeStore.add(nodePath);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.ofbiz.jcr.access.VersioningManager#checkInContentAndSaveState()
+     */
+    @Override
+    public void checkInContentAndSaveState() {
+        if (ocm != null) {
+            ocm.save();
+        }
+
+        try {
+            for (String nodePath : checkedOutNodeStore) {
                 // add the new resource content to the version history
-                if (session.nodeExists(node.getPath()) && versionManager.isCheckedOut(node.getPath())) {
-                    versionManager.checkin(node.getPath());
+                if (this.ocm.getSession().nodeExists(nodePath) && this.ocm.getSession().getWorkspace().getVersionManager().isCheckedOut(nodePath)) {
+                    this.ocm.checkin(nodePath);
                 }
             }
 
             // reset the node store after everything is checked in
-            checkedOutNodeStore = new ArrayList<Node>();
-        } catch (RepositoryException e) {
+            checkedOutNodeStore.clear();
+        } catch (VersionException e) {
+            Debug.logError(e, module);
+        } catch (UnsupportedRepositoryOperationException e) {
             Debug.logError(e, module);
-        }
-    }
-
-    protected void checkOutNode(Node node) {
-        try {
-            // make sure we don't checkout the root node, because it's not
-            // versionable
-            if (!ConstantsJackrabbit.ROOTPATH.equals(node.getPath())) {
-                versionManager.checkout(node.getPath());
-                checkedOutNodeStore.add(node);
-            }
         } catch (RepositoryException e) {
             Debug.logError(e, module);
         }
+
     }
 
     /**
@@ -79,16 +148,16 @@ public class VersioningManagerJackrabbit
      * @param startNode
      * @throws RepositoryException
      */
-    protected void checkOutRelatedNodes(Node startNode) throws RepositoryException {
-        List<Node> nodesToCheckOut = new ArrayList<Node>();
-        nodesToCheckOut.add(startNode);
-        nodesToCheckOut.add(startNode.getParent());
-        if (startNode.hasNodes()) {
-            nodesToCheckOut.addAll(getAllChildNodes(startNode));
+    protected void checkOutRelatedNodes(String startNodePath) throws RepositoryException {
+        List<String> nodesToCheckOut = new ArrayList<String>();
+        nodesToCheckOut.add(startNodePath);
+        nodesToCheckOut.add(ocm.getSession().getNode(startNodePath).getParent().getPath());
+        if (ocm.getSession().getNode(startNodePath).hasNodes()) {
+            nodesToCheckOut.addAll(getAllChildNodes(startNodePath));
         }
 
-        for (Node node : nodesToCheckOut) {
-            checkOutNode(node);
+        for (String node : nodesToCheckOut) {
+            this.checkOutContentObject(node);
         }
 
     }
@@ -100,19 +169,18 @@ public class VersioningManagerJackrabbit
      * @return
      * @throws RepositoryException
      */
-    private List<Node> getAllChildNodes(Node startNode) throws RepositoryException {
-        List<Node> nodes = new ArrayList<Node>();
-        NodeIterator ni = startNode.getNodes();
+    private List<String> getAllChildNodes(String startNode) throws RepositoryException {
+        List<String> nodes = new ArrayList<String>();
+        NodeIterator ni = ocm.getSession().getNode(startNode).getNodes();
         while (ni.hasNext()) {
             Node nextNode = ni.nextNode();
             if (nextNode.hasNodes()) {
-                nodes.addAll(getAllChildNodes(nextNode));
+                nodes.addAll(getAllChildNodes(nextNode.getPath()));
             }
 
-            nodes.add(nextNode);
+            nodes.add(nextNode.getPath());
         }
 
         return nodes;
     }
-
 }

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitHierarchyNode.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitHierarchyNode.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitHierarchyNode.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitHierarchyNode.java Fri Sep  9 13:30:49 2011
@@ -7,7 +7,7 @@ import org.apache.jackrabbit.ocm.mapper.
 import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;
 import org.ofbiz.jcr.orm.OfbizRepositoryMapping;
 
-@Node(jcrType = "nt:hierarchyNode")
+@Node(jcrType = "nt:hierarchyNode", jcrMixinTypes="mix:versionable")
 public class OfbizRepositoryMappingJackrabbitHierarchyNode implements OfbizRepositoryMapping {
     @Field(path = true, id = true, jcrProtected = true)
     protected String path;

Modified: ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitUnstructured.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitUnstructured.java?rev=1167157&r1=1167156&r2=1167157&view=diff
==============================================================================
--- ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitUnstructured.java (original)
+++ ofbiz/branches/jackrabbit20100709/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/OfbizRepositoryMappingJackrabbitUnstructured.java Fri Sep  9 13:30:49 2011
@@ -8,15 +8,19 @@ import org.apache.jackrabbit.ocm.mapper.
 import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;
 import org.ofbiz.jcr.orm.OfbizRepositoryMapping;
 
-@Node(isAbstract = true)
+@Node(isAbstract = true, jcrMixinTypes = "mix:versionable")
 public abstract class OfbizRepositoryMappingJackrabbitUnstructured implements OfbizRepositoryMapping {
 
     protected static String module = OfbizRepositoryMappingJackrabbitUnstructured.class.getName();
 
-    @Field(path = true) private String path;
-    @Field private String version;
-    @Field(jcrName = "jcr:created") private Calendar creationDate;
-    @Field private boolean localized;
+    @Field(path = true)
+    private String path;
+    @Field
+    private String version;
+    @Field(jcrName = "jcr:created")
+    private Calendar creationDate;
+    @Field
+    private boolean localized;
 
     protected OfbizRepositoryMappingJackrabbitUnstructured() {
         // create an empty object