You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2008/04/22 00:28:30 UTC

svn commit: r650301 - in /jackrabbit/branches/1.4/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java

Author: jukka
Date: Mon Apr 21 15:28:23 2008
New Revision: 650301

URL: http://svn.apache.org/viewvc?rev=650301&view=rev
Log:
1.4: Merged revisions 640838 and 641319 (JCR-1463)

Added:
    jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java
      - copied, changed from r640838, jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java
Modified:
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java?rev=650301&r1=650300&r2=650301&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java Mon Apr 21 15:28:23 2008
@@ -52,6 +52,11 @@
     private static Logger log = LoggerFactory.getLogger(InternalVersionHistory.class);
 
     /**
+     * The last current time that was returned by {@link #getCurrentTime()}.
+     */
+    private static final Calendar CURRENT_TIME = Calendar.getInstance();
+
+    /**
      * the cache of the version labels
      * key = version label (String)
      * value = version name
@@ -162,8 +167,8 @@
         if (rootVersion.getSuccessors().length==0) {		
             Iterator iter = nameCache.keySet().iterator();
             while (iter.hasNext()) {
-                Name versionName = (Name)iter.next();
-                InternalVersionImpl v = (InternalVersionImpl)createVersionInstance(versionName);
+                Name versionName = (Name) iter.next();
+                InternalVersionImpl v = createVersionInstance(versionName);
                 v.legacyResolveSuccessors();
             }
         }
@@ -480,7 +485,7 @@
         NodeStateEx vNode = node.addNode(name, NameConstants.NT_VERSION, versionId, true);
 
         // initialize 'created', 'predecessors' and 'successors'
-        vNode.setPropertyValue(NameConstants.JCR_CREATED, InternalValue.create(Calendar.getInstance()));
+        vNode.setPropertyValue(NameConstants.JCR_CREATED, InternalValue.create(getCurrentTime()));
         vNode.setPropertyValues(NameConstants.JCR_PREDECESSORS, PropertyType.REFERENCE, predecessors);
         vNode.setPropertyValues(NameConstants.JCR_SUCCESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
 
@@ -533,7 +538,7 @@
         NodeStateEx vNode = pNode.addNode(NameConstants.JCR_ROOTVERSION, NameConstants.NT_VERSION, versionId, true);
 
         // initialize 'created' and 'predecessors'
-        vNode.setPropertyValue(NameConstants.JCR_CREATED, InternalValue.create(Calendar.getInstance()));
+        vNode.setPropertyValue(NameConstants.JCR_CREATED, InternalValue.create(getCurrentTime()));
         vNode.setPropertyValues(NameConstants.JCR_PREDECESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
         vNode.setPropertyValues(NameConstants.JCR_SUCCESSORS, PropertyType.REFERENCE, InternalValue.EMPTY_ARRAY);
 
@@ -557,5 +562,25 @@
 
         parent.store();
         return new InternalVersionHistoryImpl(vMgr, pNode);
+    }
+
+    /**
+     * Returns the current time as a calendar instance and makes sure that no
+     * two Calendar instances represent the exact same time. If this method is
+     * called quickly in succession each Calendar instance returned is at least
+     * one millisecond later than the previous one.
+     *
+     * @return the current time.
+     */
+    static Calendar getCurrentTime() {
+        long time = System.currentTimeMillis();
+        synchronized (CURRENT_TIME) {
+            if (time > CURRENT_TIME.getTimeInMillis()) {
+                CURRENT_TIME.setTimeInMillis(time);
+            } else {
+                CURRENT_TIME.add(Calendar.MILLISECOND, 1);
+            }
+            return (Calendar) CURRENT_TIME.clone();
+        }
     }
 }

Copied: jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java (from r640838, jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java?p2=jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java&p1=jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java&r1=640838&r2=650301&rev=650301&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImplTest.java Mon Apr 21 15:28:23 2008
@@ -35,7 +35,7 @@
         for (int i = 0; i < 100; i++) {
             Calendar next = InternalVersionHistoryImpl.getCurrentTime();
             assertTrue("InternalVersionHistoryImpl.getCurrentTime() not monotonically increasing",
-                    last.compareTo(next) < 0);
+                    last.getTimeInMillis() < next.getTimeInMillis());
             last = next;
         }
     }