You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2013/02/13 10:31:45 UTC

svn commit: r1445518 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/core/ oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/ oak-core/src/main/ja...

Author: alexparvulescu
Date: Wed Feb 13 09:31:44 2013
New Revision: 1445518

URL: http://svn.apache.org/r1445518
Log:
OAK-410 RepositoryInitializer runs before the CommitHooks are in place

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/LuceneInitializerHelper.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Wed Feb 13 09:31:44 2013
@@ -86,4 +86,8 @@ public class ContentRepositoryImpl imple
                 nodeStore, indexProvider);
     }
 
+    public NodeStore getNodeStore() {
+        return nodeStore;
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java Wed Feb 13 09:31:44 2013
@@ -16,18 +16,23 @@
  */
 package org.apache.jackrabbit.oak.osgi;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.core.ContentRepositoryImpl;
 import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
+import org.apache.jackrabbit.oak.osgi.OsgiRepositoryInitializer.RepositoryInitializerObserver;
 import org.apache.jackrabbit.oak.plugins.nodetype.DefaultTypeEditor;
 import org.apache.jackrabbit.oak.spi.commit.CompositeHook;
 import org.apache.jackrabbit.oak.spi.commit.ValidatingHook;
 import org.apache.jackrabbit.oak.spi.lifecycle.OakInitializer;
+import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -35,7 +40,7 @@ import org.osgi.framework.ServiceRegistr
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
-public class Activator implements BundleActivator, ServiceTrackerCustomizer {
+public class Activator implements BundleActivator, ServiceTrackerCustomizer, RepositoryInitializerObserver {
 
     private BundleContext context;
 
@@ -47,7 +52,7 @@ public class Activator implements Bundle
 
     private final OsgiValidatorProvider validatorProvider = new OsgiValidatorProvider();
 
-    private final OsgiRepositoryInitializer kernelTracker = new OsgiRepositoryInitializer();
+    private final OsgiRepositoryInitializer repositoryInitializerTracker = new OsgiRepositoryInitializer();
 
     private final Map<ServiceReference, ServiceRegistration> services =
             new HashMap<ServiceReference, ServiceRegistration>();
@@ -61,8 +66,8 @@ public class Activator implements Bundle
         indexProvider.start(bundleContext);
         indexHookProvider.start(bundleContext);
         validatorProvider.start(bundleContext);
-        kernelTracker.start(bundleContext);
-
+        repositoryInitializerTracker.setObserver(this);
+        repositoryInitializerTracker.start(bundleContext);
         tracker = new ServiceTracker(
                 context, MicroKernel.class.getName(), this);
         tracker.open();
@@ -71,22 +76,19 @@ public class Activator implements Bundle
     @Override
     public void stop(BundleContext bundleContext) throws Exception {
         tracker.close();
-
         indexProvider.stop();
         indexHookProvider.stop();
         validatorProvider.stop();
-        kernelTracker.stop();
+        repositoryInitializerTracker.stop();
     }
 
     //-------------------------------------------< ServiceTrackerCustomizer >---
 
     @Override
     public Object addingService(ServiceReference reference) {
-        Object service = context.getService(reference);
-        if (service instanceof MicroKernel) {
-            MicroKernel kernel = (MicroKernel) service;
-            OakInitializer.initialize(new KernelNodeStore(kernel),
-                    kernelTracker, indexHookProvider);
+        MicroKernel kernel = (MicroKernel) context.getService(reference);
+        OakInitializer.initialize(new KernelNodeStore(kernel),
+                repositoryInitializerTracker, indexHookProvider);
             Oak oak = new Oak(kernel)
                     .with(new CompositeHook(
                         // TODO: DefaultTypeEditor is JCR specific and does not belong here
@@ -98,11 +100,7 @@ public class Activator implements Bundle
                     ContentRepository.class.getName(),
                     oak.createContentRepository(),
                     new Properties()));
-            return service;
-        } else {
-            context.ungetService(reference);
-            return null;
-        }
+            return kernel;
     }
 
     @Override
@@ -112,9 +110,24 @@ public class Activator implements Bundle
 
     @Override
     public void removedService(ServiceReference reference, Object service) {
-        ServiceRegistration registration = services.remove(reference);
-        registration.unregister();
+        services.remove(reference).unregister();
         context.ungetService(reference);
     }
 
+    //----------------------------------------< RepositoryInitializerObserver >---
+
+    @Override
+    public void newRepositoryInitializer(RepositoryInitializer ri) {
+        List<ServiceReference> mkRefs = new ArrayList<ServiceReference>(
+                services.keySet());
+        for (ServiceReference ref : mkRefs) {
+            Object service = context.getService(ref);
+            if (service instanceof ContentRepositoryImpl) {
+                ContentRepositoryImpl repository = (ContentRepositoryImpl) service;
+                OakInitializer.initialize(repository.getNodeStore(), ri,
+                        indexHookProvider);
+            }
+        }
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java Wed Feb 13 09:31:44 2013
@@ -18,8 +18,9 @@
  */
 package org.apache.jackrabbit.oak.osgi;
 
+import org.apache.jackrabbit.oak.spi.lifecycle.CompositeInitializer;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -31,35 +32,33 @@ public class OsgiRepositoryInitializer
         extends AbstractServiceTracker<RepositoryInitializer>
         implements RepositoryInitializer {
 
-    /**
-     * The reference to the micro kernel once available.
-     */
-    private volatile NodeStore store;
+    private RepositoryInitializerObserver observer;
 
     public OsgiRepositoryInitializer() {
         super(RepositoryInitializer.class);
     }
 
     @Override
-    public void initialize(NodeStore store) {
-        this.store = store;
-        if (store != null) {
-            for (RepositoryInitializer mki : getServices()) {
-                mki.initialize(store);
-            }
-        }
+    public NodeState initialize(NodeState state) {
+        return new CompositeInitializer(getServices()).initialize(state);
     }
 
     @Override
     public Object addingService(ServiceReference reference) {
-        RepositoryInitializer mki =
-                (RepositoryInitializer) super.addingService(reference);
-        NodeStore store = this.store;
-        if (store != null) {
-            //TODO index added content
-            mki.initialize(store);
+        RepositoryInitializer ri = (RepositoryInitializer) super
+                .addingService(reference);
+        if (observer != null) {
+            observer.newRepositoryInitializer(ri);
         }
-        return mki;
+        return ri;
+    }
+
+    public void setObserver(RepositoryInitializerObserver observer) {
+        this.observer = observer;
+    }
+
+    interface RepositoryInitializerObserver {
+        void newRepositoryInitializer(RepositoryInitializer ri);
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java Wed Feb 13 09:31:44 2013
@@ -23,8 +23,10 @@ import org.apache.jackrabbit.oak.api.Typ
 import org.apache.jackrabbit.oak.core.RootImpl;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 
@@ -45,10 +47,8 @@ import static org.apache.jackrabbit.JcrC
 public class InitialContent implements RepositoryInitializer {
 
     @Override
-    public void initialize(NodeStore store) {
-        NodeStoreBranch branch = store.branch();
-
-        NodeBuilder root = branch.getRoot().builder();
+    public NodeState initialize(NodeState state) {
+        NodeBuilder root = state.builder();
         root.setProperty(JCR_PRIMARYTYPE, "rep:root", Type.NAME);
 
         if (!root.hasChildNode(JCR_SYSTEM)) {
@@ -71,14 +71,16 @@ public class InitialContent implements R
             IndexUtils.createIndexDefinition(index, "nodetype", true, false,
                     ImmutableList.of(JCR_PRIMARYTYPE, JCR_MIXINTYPES), null);
         }
+        NodeStore store = new MemoryNodeStore();
+        NodeStoreBranch branch = store.branch();
+        branch.setRoot(root.getNodeState());
         try {
-            branch.setRoot(root.getNodeState());
             branch.merge();
         } catch (CommitFailedException e) {
-            throw new RuntimeException(e); // TODO: shouldn't need the wrapper
+            throw new RuntimeException(e);
         }
-
         BuiltInNodeTypes.register(new RootImpl(store));
+        return store.getRoot();
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlInitializer.java Wed Feb 13 09:31:44 2013
@@ -17,14 +17,10 @@
 package org.apache.jackrabbit.oak.security.authorization;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
-import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
@@ -34,16 +30,10 @@ import static org.apache.jackrabbit.JcrC
  */
 public class AccessControlInitializer implements RepositoryInitializer, AccessControlConstants {
 
-    /**
-     * logger instance
-     */
-    private static final Logger log = LoggerFactory.getLogger(AccessControlInitializer.class);
-
     @Override
-    public void initialize(NodeStore store) {
-        NodeStoreBranch branch = store.branch();
+    public NodeState initialize(NodeState state) {
+        NodeBuilder root = state.builder();
 
-        NodeBuilder root = branch.getRoot().builder();
         NodeBuilder system = root.child(JCR_SYSTEM);
         if (!system.hasChildNode(REP_PERMISSION_STORE)) {
             system.child(REP_PERMISSION_STORE)
@@ -55,12 +45,6 @@ public class AccessControlInitializer im
         IndexUtils.createIndexDefinition(index, "acPrincipalName", true, false,
                 ImmutableList.<String>of(REP_PRINCIPAL_NAME),
                 ImmutableList.<String>of(NT_REP_DENY_ACE, NT_REP_GRANT_ACE));
-        try {
-            branch.setRoot(root.getNodeState());
-            branch.merge();
-        } catch (CommitFailedException e) {
-            log.error("Failed to commit access control index definition", e);
-            throw new RuntimeException(e);
-        }
+        return root.getNodeState();
     }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java Wed Feb 13 09:31:44 2013
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.securi
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
+
 import javax.jcr.RepositoryException;
 
 import com.google.common.collect.ImmutableMap;
@@ -26,10 +27,12 @@ import org.apache.jackrabbit.JcrConstant
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.core.RootImpl;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeDefinition;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 import org.slf4j.Logger;
@@ -64,10 +67,8 @@ class PrivilegeInitializer implements Re
             REP_WRITE, new String[] {JCR_WRITE, JCR_NODE_TYPE_MANAGEMENT});
 
     @Override
-    public void initialize(NodeStore store) {
-        NodeStoreBranch branch = store.branch();
-
-        NodeBuilder root = branch.getRoot().builder();
+    public NodeState initialize(NodeState state) {
+        NodeBuilder root = state.builder();
         NodeBuilder system = root.child(JcrConstants.JCR_SYSTEM);
         system.setProperty(JcrConstants.JCR_PRIMARYTYPE, NodeTypeConstants.NT_REP_SYSTEM, Type.NAME);
 
@@ -75,6 +76,8 @@ class PrivilegeInitializer implements Re
             NodeBuilder privileges = system.child(REP_PRIVILEGES);
             privileges.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_PRIVILEGES, Type.NAME);
 
+            NodeStore store = new MemoryNodeStore();
+            NodeStoreBranch branch = store.branch();
             try {
                 branch.setRoot(root.getNodeState());
                 branch.merge();
@@ -90,7 +93,9 @@ class PrivilegeInitializer implements Re
                 log.error("Failed to register built-in privileges", e);
                 throw new RuntimeException(e);
             }
+            return store.getRoot();
         }
+        return root.getNodeState();
     }
 
     private Collection<PrivilegeDefinition> getBuiltInDefinitions() {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java Wed Feb 13 09:31:44 2013
@@ -26,11 +26,15 @@ import org.apache.jackrabbit.oak.core.Ro
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,7 +78,16 @@ public class UserInitializer implements 
 
     //----------------------------------------------< RepositoryInitializer >---
     @Override
-    public void initialize(NodeStore store) {
+    public NodeState initialize(NodeState state) {
+        NodeBuilder builder = state.builder();
+        NodeStore store = new MemoryNodeStore();
+        NodeStoreBranch branch = store.branch();
+        branch.setRoot(builder.getNodeState());
+        try {
+            branch.merge();
+        } catch (CommitFailedException e) {
+            throw new RuntimeException(e);
+        }
         Root root = new RootImpl(store);
 
         UserConfiguration userConfiguration = securityProvider.getUserConfiguration();
@@ -108,5 +121,6 @@ public class UserInitializer implements 
             log.error("Failed to initialize user content ", e);
             throw new RuntimeException(e);
         }
+        return store.getRoot();
     }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java Wed Feb 13 09:31:44 2013
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.spi.li
 import java.util.Arrays;
 import java.util.Collection;
 
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
 /**
@@ -41,9 +42,11 @@ public class CompositeInitializer implem
     }
 
     @Override
-    public void initialize(NodeStore store) {
+    public NodeState initialize(NodeState state) {
+        NodeState newState = state;
         for (RepositoryInitializer tracker : initializers) {
-            tracker.initialize(store);
+            newState = tracker.initialize(newState);
         }
+        return newState;
     }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java Wed Feb 13 09:31:44 2013
@@ -21,8 +21,7 @@ package org.apache.jackrabbit.oak.spi.li
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookManager;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
-import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeState;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 
@@ -31,18 +30,12 @@ public class OakInitializer {
     public static void initialize(NodeStore store,
             RepositoryInitializer initializer, IndexHookProvider indexHook) {
 
-        // TODO refactor initializer to be able to first #branch, then
-        // #initialize, next #index and finally #merge
-        // This means that the RepositoryInitializer should receive a
-        // NodeStoreBranch as a param
-
-        initializer.initialize(store);
-
         NodeStoreBranch branch = store.branch();
-        NodeBuilder root = branch.getRoot().builder();
+        NodeState before = branch.getRoot();
+        NodeState after = initializer.initialize(before);
         try {
-            branch.setRoot(IndexHookManager.of(indexHook).processCommit(
-                    MemoryNodeState.EMPTY_NODE, root.getNodeState()));
+            branch.setRoot(IndexHookManager.of(indexHook).processCommit(before,
+                    after));
             branch.merge();
         } catch (CommitFailedException e) {
             throw new RuntimeException(e);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java Wed Feb 13 09:31:44 2013
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.spi.lifecycle;
 
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * Initializer of repository content. A component that needs to add specific
@@ -34,8 +34,8 @@ public interface RepositoryInitializer {
      * have been initialized, so the implementation of this method should
      * check for that before blindly adding new content.
      *
-     * @param store node store of the repository
+     * @param state the current state of the repository
      */
-    void initialize(NodeStore store);
+    NodeState initialize(NodeState state);
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java Wed Feb 13 09:31:44 2013
@@ -28,8 +28,6 @@ import org.apache.jackrabbit.oak.api.Con
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.index.p2.Property2IndexHookProvider;
-import org.apache.jackrabbit.oak.plugins.index.p2.Property2IndexProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
 import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
 import org.apache.jackrabbit.oak.security.authentication.ConfigurationUtil;
@@ -57,8 +55,6 @@ public abstract class AbstractSecurityTe
     public void before() throws Exception {
         contentRepository = new Oak()
                 .with(new InitialContent())
-                .with(new Property2IndexHookProvider())
-                .with(new Property2IndexProvider())
                 .with(getSecurityProvider())
                 .createContentRepository();
 

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java Wed Feb 13 09:31:44 2013
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Set;
 
@@ -27,10 +28,13 @@ import org.apache.jackrabbit.mk.core.Mic
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
+import org.apache.jackrabbit.oak.plugins.index.CompositeIndexHookProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookManager;
+import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
 import org.apache.jackrabbit.oak.plugins.index.p2.Property2IndexHookProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
+import org.apache.jackrabbit.oak.spi.lifecycle.OakInitializer;
 import org.apache.jackrabbit.oak.spi.query.Cursor;
 import org.apache.jackrabbit.oak.spi.query.Cursors;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -56,7 +60,9 @@ public class NodeTypeIndexTest {
         store = new KernelNodeStore(mk);
         store.setHook(IndexHookManager.of(new Property2IndexHookProvider()));
         // initialize node types & index definitions
-        new InitialContent().initialize(store);
+        OakInitializer.initialize(store, new InitialContent(),
+                CompositeIndexHookProvider
+                        .compose(new ArrayList<IndexHookProvider>()));
     }
 
     @Test

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/LuceneInitializerHelper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/LuceneInitializerHelper.java?rev=1445518&r1=1445517&r2=1445518&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/LuceneInitializerHelper.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/LuceneInitializerHelper.java Wed Feb 13 09:31:44 2013
@@ -17,12 +17,11 @@
 package org.apache.jackrabbit.oak.plugins.index.lucene.util;
 
 import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 
 public class LuceneInitializerHelper implements RepositoryInitializer {
@@ -34,12 +33,10 @@ public class LuceneInitializerHelper imp
     }
 
     @Override
-    public void initialize(NodeStore store) {
+    public NodeState initialize(NodeState state) {
+        NodeBuilder root = state.builder();
         boolean dirty = false;
 
-        NodeStoreBranch branch = store.branch();
-        NodeBuilder root = branch.getRoot().builder();
-
         NodeBuilder index = root;
         for (String p : PathUtils.elements(path)) {
             if (!index.hasChildNode(p)) {
@@ -53,13 +50,9 @@ public class LuceneInitializerHelper imp
                     "oak:queryIndexDefinition", Type.NAME).setProperty("type",
                     "lucene");
             index.setProperty("reindex", true);
-            try {
-                branch.setRoot(root.getNodeState());
-                branch.merge();
-            } catch (CommitFailedException e) {
-                throw new RuntimeException(e);
-            }
+            return root.getNodeState();
         }
+        return state;
     }
 
 }