Author: stillalex
Date: Wed Jun 20 07:30:56 2018
New Revision: 1833892

URL: http://svn.apache.org/viewvc?rev=1833892&view=rev
Log:
OAK-7532 VersionStorageEditor should allow bootstraping of initial content


Modified:
    
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
    
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
    
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java

Modified: 
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
 Wed Jun 20 07:30:56 2018
@@ -150,4 +150,7 @@ public interface VersionConstants extend
             VersionConstants.REP_ACTIVITIES,
             VersionConstants.REP_CONFIGURATIONS
     );
+
+    // flag indicating the version store has been initialized
+    String VERSION_STORE_INIT = ":initialized";
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
 Wed Jun 20 07:30:56 2018
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.0.0")
+@Version("1.1.0")
 package org.apache.jackrabbit.oak.spi.version;
 
 import org.osgi.annotation.versioning.Version;
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
 Wed Jun 20 07:30:56 2018
@@ -25,6 +25,7 @@ import static org.apache.jackrabbit.oak.
 import static 
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
 import static 
org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState.squeeze;
 import static 
org.apache.jackrabbit.oak.spi.version.VersionConstants.REP_VERSIONSTORAGE;
+import static 
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_INIT;
 
 import com.google.common.collect.ImmutableList;
 
@@ -142,15 +143,15 @@ public class InitialContent implements R
     }
     
     //--------------------------< internal 
>------------------------------------
-    
-    private boolean isInitialized(NodeBuilder versionStorage) {
-        PropertyState init = versionStorage.getProperty(":initialized");
+
+    private static boolean isInitialized(NodeBuilder versionStorage) {
+        PropertyState init = versionStorage.getProperty(VERSION_STORE_INIT);
         return init != null && init.getValue(Type.LONG) > 0;
     }
 
-    private void createIntermediateNodes(NodeBuilder versionStorage) {
+    private static void createIntermediateNodes(NodeBuilder versionStorage) {
         String fmt = "%02x";
-        versionStorage.setProperty(":initialized", 1);
+        versionStorage.setProperty(VERSION_STORE_INIT, 1);
         for (int i = 0; i < 0xff; i++) {
             NodeBuilder c = storageChild(versionStorage, String.format(fmt, 
i));
             for (int j = 0; j < 0xff; j++) {
@@ -158,8 +159,8 @@ public class InitialContent implements R
             }
         }
     }
-    
-    private NodeBuilder storageChild(NodeBuilder node, String name) {
+
+    private static NodeBuilder storageChild(NodeBuilder node, String name) {
         NodeBuilder c = node.child(name);
         if (!c.hasProperty(JCR_PRIMARYTYPE)) {
             c.setProperty(JCR_PRIMARYTYPE, REP_VERSIONSTORAGE, Type.NAME);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
 Wed Jun 20 07:30:56 2018
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.api.Com
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.spi.commit.DefaultEditor;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
@@ -31,7 +32,9 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.oak.commons.PathUtils.concat;
 import static org.apache.jackrabbit.oak.commons.PathUtils.getDepth;
 import static org.apache.jackrabbit.oak.commons.PathUtils.relativize;
+import static 
org.apache.jackrabbit.oak.spi.state.AbstractNodeState.comparePropertiesAgainstBaseState;
 import static 
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_NODE_TYPE_NAMES;
+import static 
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_INIT;
 import static 
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_NT_NAMES;
 import static 
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_PATH;
 
@@ -46,6 +49,7 @@ class VersionStorageEditor extends Defau
     private final NodeBuilder workspaceRoot;
     private final NodeBuilder builder;
     private final String path;
+    private boolean initPhase;
     private ReadWriteVersionManager vMgr;
 
     VersionStorageEditor(@Nonnull NodeBuilder versionStorageNode,
@@ -65,6 +69,13 @@ class VersionStorageEditor extends Defau
     }
 
     @Override
+    public void enter(NodeState before, NodeState after) {
+        if (VERSION_STORE_PATH.equals(path)) {
+            initPhase = isInitializationPhase(before, after);
+        }
+    }
+
+    @Override
     public Editor childNodeChanged(String name,
                                    NodeState before,
                                    NodeState after)
@@ -92,6 +103,10 @@ class VersionStorageEditor extends Defau
                 !isVersionStorageNode(after)) {
             return null;
         }
+        // allow node addition during initialization phase
+        if (initPhase) {
+            return null;
+        }
         return throwProtected(name);
     }
 
@@ -157,4 +172,13 @@ class VersionStorageEditor extends Defau
     private Editor throwProtected(String name) throws CommitFailedException {
         return Utils.throwProtected(concat(path, name));
     }
+
+    private static boolean isInitializationPhase(NodeState before, NodeState 
after) {
+        return !comparePropertiesAgainstBaseState(after, before, new 
DefaultNodeStateDiff() {
+            @Override
+            public boolean propertyAdded(PropertyState after) {
+                return !after.getName().equals(VERSION_STORE_INIT);
+            }
+        });
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
 Wed Jun 20 07:30:56 2018
@@ -16,16 +16,19 @@
  */
 package org.apache.jackrabbit.oak;
 
-import org.apache.jackrabbit.oak.spi.version.VersionConstants;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.junit.Test;
-
+import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT;
 import static 
org.apache.jackrabbit.oak.plugins.document.bundlor.BundlingConfigHandler.DOCUMENT_NODE_STORE;
 import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import org.apache.jackrabbit.oak.plugins.version.VersionHook;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.version.VersionConstants;
+import org.junit.Test;
+
 /**
  * Test for OAK-2459.
  */
@@ -35,7 +38,7 @@ public class InitialContentTest implemen
     public void noVersionStoragePrePopulated() throws Exception {
         // default initial content does not have intermediate nodes
         // pre-populated
-        NodeState system = 
InitialContentHelper.INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
+        NodeState system = INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
         assertTrue(system.exists());
         
         NodeState vs = system.getChildNode(JCR_VERSIONSTORAGE);
@@ -63,8 +66,17 @@ public class InitialContentTest implemen
     }
 
     @Test
-    public void bundlingConfig() throws Exception{
-        NodeState system = 
InitialContentHelper.INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
+    public void bundlingConfig() throws Exception {
+        NodeState system = INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
         assertFalse(system.getChildNode(DOCUMENT_NODE_STORE).exists());
     }
+
+    @Test
+    public void validatePrePopulated() throws Exception {
+        NodeState before = EMPTY_NODE;
+        NodeBuilder builder = before.builder();
+        new 
InitialContent().withPrePopulatedVersionStore().initialize(builder);
+        NodeState after = builder.getNodeState();
+        new VersionHook().processCommit(before, after, CommitInfo.EMPTY);
+    }
 }


Reply via email to