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 2010/09/24 17:34:26 UTC

svn commit: r1000912 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/version/ test/java/org/apache/jackrabbit/core/version/

Author: jukka
Date: Fri Sep 24 15:34:25 2010
New Revision: 1000912

URL: http://svn.apache.org/viewvc?rev=1000912&view=rev
Log:
JCR-2655: initVersions crashes with NPE

Skip missing successors to avoid the NPE

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionIteratorImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersion.java Fri Sep 24 15:34:25 2010
@@ -21,6 +21,7 @@ import org.apache.jackrabbit.core.id.Nod
 import javax.jcr.version.Version;
 
 import java.util.Calendar;
+import java.util.List;
 
 /**
  * This interface defines the internal version.
@@ -63,7 +64,7 @@ public interface InternalVersion extends
      * @see javax.jcr.version.Version#getSuccessors()
      * @return the successors as internal versions
      */
-    InternalVersion[] getSuccessors();
+    List<InternalVersion> getSuccessors();
 
     /**
      * Equivalent to {@link Version#getLinearSuccessor()}.

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionHistoryImpl.java Fri Sep 24 15:34:25 2010
@@ -162,7 +162,7 @@ class InternalVersionHistoryImpl extends
         }
 
         // fix legacy
-        if (rootVersion.getSuccessors().length == 0) {
+        if (rootVersion.getSuccessors().isEmpty()) {
             for (Name versionName : nameCache.keySet()) {
                 InternalVersionImpl v = createVersionInstance(versionName);
                 v.legacyResolveSuccessors();

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java Fri Sep 24 15:34:25 2010
@@ -22,11 +22,14 @@ import org.apache.jackrabbit.core.value.
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import java.util.Arrays;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.ArrayList;
@@ -37,6 +40,10 @@ import java.util.ArrayList;
 class InternalVersionImpl extends InternalVersionItemImpl
         implements InternalVersion {
 
+    /** Logger instance */
+    private static final Logger log =
+        LoggerFactory.getLogger(InternalVersionImpl.class);
+
     /**
      * the date when this version was created
      */
@@ -138,18 +145,27 @@ class InternalVersionImpl extends Intern
     /**
      * {@inheritDoc}
      */
-    public InternalVersion[] getSuccessors() {
+    public List<InternalVersion> getSuccessors() {
         ReadLock lock = vMgr.acquireReadLock();
         try {
-            InternalValue[] values = node.getPropertyValues(NameConstants.JCR_SUCCESSORS);
+            InternalValue[] values =
+                node.getPropertyValues(NameConstants.JCR_SUCCESSORS);
             if (values != null) {
-                InternalVersion[] versions = new InternalVersion[values.length];
-                for (int i = 0; i < values.length; i++) {
-                    versions[i] = versionHistory.getVersion(values[i].getNodeId());
+                List<InternalVersion> versions =
+                    new ArrayList<InternalVersion>(values.length);
+                for (InternalValue value : values) {
+                    InternalVersion version =
+                        versionHistory.getVersion(value.getNodeId());
+                    if (version != null) {
+                        versions.add(version);
+                    } else {
+                        // Can happen with a corrupted repository (JCR-2655)
+                        log.warn("Missing successor {}", value.getNodeId());
+                    }
                 }
                 return versions;
             } else {
-                return new InternalVersion[0];
+                return Collections.emptyList();
             }
         } finally {
             lock.release();
@@ -275,8 +291,7 @@ class InternalVersionImpl extends Intern
      */
     void internalDetach() throws RepositoryException {
         // detach this from all successors
-        InternalVersion[] succ = getSuccessors();
-        for (InternalVersion aSucc : succ) {
+        for (InternalVersion aSucc :  getSuccessors()) {
             ((InternalVersionImpl) aSucc).internalDetachPredecessor(this, true);
         }
 
@@ -312,7 +327,7 @@ class InternalVersionImpl extends Intern
      */
     private void internalAddSuccessor(InternalVersionImpl succ, boolean store)
             throws RepositoryException {
-        List<InternalVersion> l = new ArrayList<InternalVersion>(Arrays.asList(getSuccessors()));
+        List<InternalVersion> l = new ArrayList<InternalVersion>(getSuccessors());
         if (!l.contains(succ)) {
             l.add(succ);
             storeXCessors(l, NameConstants.JCR_SUCCESSORS, store);
@@ -353,11 +368,11 @@ class InternalVersionImpl extends Intern
     private void internalDetachSuccessor(InternalVersionImpl v, boolean store)
             throws RepositoryException {
         // remove 'v' from successors list
-        List<InternalVersion> l = new ArrayList<InternalVersion>(Arrays.asList(getSuccessors()));
+        List<InternalVersion> l = new ArrayList<InternalVersion>(getSuccessors());
         l.remove(v);
 
         // attach V's successors
-        l.addAll(Arrays.asList(v.getSuccessors()));
+        l.addAll(v.getSuccessors());
         storeXCessors(l, NameConstants.JCR_SUCCESSORS, store);
     }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionManagerBase.java Fri Sep 24 15:34:25 2010
@@ -664,7 +664,7 @@ abstract class InternalVersionManagerBas
             return newVersionName;
         } else {
             // best is root version
-            return String.valueOf(best.getSuccessors().length + 1) + ".0";
+            return String.valueOf(best.getSuccessors().size() + 1) + ".0";
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java Fri Sep 24 15:34:25 2010
@@ -512,12 +512,10 @@ public class InternalXAVersionManager ex
             xaItems.put(history.getId(), history);
             // also put 'successor' and 'predecessor' version items to xaItem sets
             InternalVersion v = history.getVersion(name);
-            InternalVersion[] vs = v.getSuccessors();
-            for (InternalVersion v1 : vs) {
+            for (InternalVersion v1 : v.getSuccessors()) {
                 xaItems.put(v1.getId(), v1);
             }
-            vs = v.getPredecessors();
-            for (InternalVersion v1 : vs) {
+            for (InternalVersion v1 : v.getPredecessors()) {
                 xaItems.put(v1.getId(), v1);
             }
         }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java Fri Sep 24 15:34:25 2010
@@ -34,6 +34,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Node;
 import javax.jcr.nodetype.ConstraintViolationException;
 import java.util.Calendar;
+import java.util.List;
 
 /**
  * Base implementation of the {@link javax.jcr.version.Version} interface.
@@ -84,10 +85,11 @@ public class VersionImpl extends NodeImp
      */
     public javax.jcr.version.Version[] getSuccessors() throws RepositoryException {
         // need to wrap it around proper node
-        InternalVersion[] suc = getInternalVersion().getSuccessors();
-        Version[] ret = new Version[suc.length];
-        for (int i = 0; i < suc.length; i++) {
-            ret[i] = (Version) sessionContext.getSessionImpl().getNodeById(suc[i].getId());
+        List<InternalVersion> suc = getInternalVersion().getSuccessors();
+        Version[] ret = new Version[suc.size()];
+        for (int i = 0; i < ret.length; i++) {
+            ret[i] = (Version) sessionContext.getSessionImpl().getNodeById(
+                    suc.get(i).getId());
         }
         return ret;
     }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionIteratorImpl.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionIteratorImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionIteratorImpl.java Fri Sep 24 15:34:25 2010
@@ -26,7 +26,6 @@ import javax.jcr.version.VersionIterator
 import java.util.ConcurrentModificationException;
 import java.util.LinkedList;
 import java.util.NoSuchElementException;
-import java.util.Arrays;
 
 /**
  * This Class implements a VersionIterator that iterates over a version
@@ -170,8 +169,7 @@ class VersionIteratorImpl implements Ver
             NodeId id = currentVersion.getId();
             if (!versions.contains(id)) {
                 versions.add(id);
-                InternalVersion[] successors = currentVersion.getSuccessors();
-                workQueue.addAll(Arrays.asList(successors));
+                workQueue.addAll(currentVersion.getSuccessors());
             }
         }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplRestore.java Fri Sep 24 15:34:25 2010
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.core.versi
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
 
 import javax.jcr.ItemExistsException;
@@ -577,14 +578,14 @@ abstract public class VersionManagerImpl
                     if (v == null) {
                         // if version selector was unable to select version,
                         // choose the initial one
-                        InternalVersion[] vs = vh.getRootVersion().getSuccessors();
-                        if (vs.length == 0) {
+                        List<InternalVersion> vs = vh.getRootVersion().getSuccessors();
+                        if (vs.isEmpty()) {
                             String msg = "Unable to select appropariate version for "
                                     + child.getName() + " using " + vsel;
                             log.error(msg);
                             throw new VersionException(msg);
                         }
-                        v = vs[0];
+                        v = vs.get(0);
                     }
                     InternalFrozenNode f = v.getFrozenNode();
                     restoredChild = state.addNode(fh.getName(), f.getFrozenPrimaryType(), f.getFrozenId());

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java?rev=1000912&r1=1000911&r2=1000912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/version/VersionIteratorImplTest.java Fri Sep 24 15:34:25 2010
@@ -16,7 +16,9 @@
  */
 package org.apache.jackrabbit.core.version;
 
+import java.util.Arrays;
 import java.util.Calendar;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -37,8 +39,8 @@ public class VersionIteratorImplTest ext
             this.id = id;
         }
 
-        public InternalVersion[] getSuccessors() {
-            return successors;
+        public List<InternalVersion> getSuccessors() {
+            return Arrays.asList(successors);
         }
 
         public NodeId getId() {