Author: reschke
Date: Tue Mar 11 15:53:21 2014
New Revision: 1576391

URL: http://svn.apache.org/r1576391
Log:
OAK-1525 - VersionHistory.getAllVersions - sort history contents by creation 
date

Modified:
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionHistoryDelegate.java

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionHistoryDelegate.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionHistoryDelegate.java?rev=1576391&r1=1576390&r2=1576391&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionHistoryDelegate.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionHistoryDelegate.java
 Tue Mar 11 15:53:21 2014
@@ -18,11 +18,14 @@ package org.apache.jackrabbit.oak.jcr.de
 
 import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Deque;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+
 import javax.annotation.Nonnull;
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.RepositoryException;
@@ -31,6 +34,7 @@ import javax.jcr.version.VersionExceptio
 
 import com.google.common.base.Function;
 import com.google.common.collect.Iterators;
+
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -129,19 +133,41 @@ public class VersionHistoryDelegate exte
 
     @Nonnull
     public Iterator<VersionDelegate> getAllVersions() throws 
RepositoryException {
-        Set<String> versions = new HashSet<String>();
+        List<NodeDelegate> versions = new ArrayList<NodeDelegate>();
         for (Iterator<NodeDelegate> it = getChildren(); it.hasNext();) {
             NodeDelegate n = it.next();
             String primaryType = 
n.getProperty(JcrConstants.JCR_PRIMARYTYPE).getString();
             if (primaryType.equals(VersionConstants.NT_VERSION)) {
-                versions.add(n.getName());
+                versions.add(n);
             }
         }
+        // best-effort sort by created time stamp, see JCR 2.0, 15.1.1.2
+        Collections.sort(versions, new Comparator<NodeDelegate>() {
+            @Override
+            public int compare(NodeDelegate n1, NodeDelegate n2) {
+                try {
+                    PropertyDelegate c1 = 
n1.getPropertyOrNull(JcrConstants.JCR_CREATED);
+                    PropertyDelegate c2 = 
n2.getPropertyOrNull(JcrConstants.JCR_CREATED);
+                    if (c1 != null && c2 != null) {
+                        return c1.getDate().compareTo(c2.getDate());
+                    } else if (c1 != null) {
+                        return 1;
+                    } else if (c2 != null) {
+                        return -1;
+                    } else {
+                        return 0;
+                    }
+                } catch (RepositoryException ex) {
+                    // best effort
+                    return 0;
+                }
+            }
+        });
         final Tree thisTree = getTree();
-        return Iterators.transform(versions.iterator(), new Function<String, 
VersionDelegate>() {
+        return Iterators.transform(versions.iterator(), new 
Function<NodeDelegate, VersionDelegate>() {
             @Override
-            public VersionDelegate apply(String name) {
-                return VersionDelegate.create(sessionDelegate, 
thisTree.getChild(name));
+            public VersionDelegate apply(NodeDelegate nd) {
+                return VersionDelegate.create(sessionDelegate, 
thisTree.getChild(nd.getName()));
             }
         });
     }


Reply via email to