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 ju...@apache.org on 2013/03/08 20:57:29 UTC

svn commit: r1454516 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/ 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/jackrabbi...

Author: jukka
Date: Fri Mar  8 19:57:28 2013
New Revision: 1454516

URL: http://svn.apache.org/r1454516
Log:
OAK-673: Unified hook processing

Use editors instead of validators where possible

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditorProvider.java
Removed:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeValidator.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/DefaultValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ValidatingHook.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.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/plugins/commit/ConflictValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlConfigurationImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeConfigurationImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/Validator.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ValidatorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/SecurityConfiguration.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java Fri Mar  8 19:57:28 2013
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak;
 
 import java.util.List;
+
 import javax.annotation.Nonnull;
 import javax.jcr.NoSuchWorkspaceException;
 import javax.security.auth.login.LoginException;
@@ -36,11 +37,11 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CompositeHook;
-import org.apache.jackrabbit.oak.spi.commit.CompositeValidatorProvider;
+import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
-import org.apache.jackrabbit.oak.spi.commit.ValidatingHook;
-import org.apache.jackrabbit.oak.spi.commit.Validator;
-import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
+import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.commit.EditorHook;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.CompositeInitializer;
 import org.apache.jackrabbit.oak.spi.lifecycle.OakInitializer;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
@@ -50,6 +51,7 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
@@ -81,7 +83,7 @@ public class Oak {
 
     private final List<CommitHook> commitHooks = newArrayList();
 
-    private List<ValidatorProvider> validatorProviders = newArrayList();
+    private List<EditorProvider> editorProviders = newArrayList();
 
     // TODO: review if we really want to have the OpenSecurityProvider as default.
     private SecurityProvider securityProvider = new OpenSecurityProvider();
@@ -154,54 +156,53 @@ public class Oak {
      */
     @Nonnull
     public Oak with(@Nonnull CommitHook hook) {
-        withValidatorHook();
+        withEditorHook();
         commitHooks.add(hook);
         return this;
     }
 
     /**
-     * Turns all currently tracked validators to a validating commit hook
-     * and associates that hook with the repository to be created. This way
-     * a sequence of {@code with()} calls that alternates between validators
-     * and other commit hooks will have all the validators in the correct
+     * Turns all currently tracked editors to an editor commit hook and
+     * associates that hook with the repository to be created. This way
+     * a sequence of {@code with()} calls that alternates between editors
+     * and other commit hooks will have all the editors in the correct
      * order while still being able to leverage the performance gains of
-     * multiple validators iterating over the changes simultaneously.
+     * multiple editors iterating over the changes simultaneously.
      */
-    private void withValidatorHook() {
-        if (!validatorProviders.isEmpty()) {
-            commitHooks.add(new ValidatingHook(
-                    CompositeValidatorProvider.compose(validatorProviders)));
-            validatorProviders = newArrayList();
+    private void withEditorHook() {
+        if (!editorProviders.isEmpty()) {
+            commitHooks.add(new EditorHook(
+                    CompositeEditorProvider.compose(editorProviders)));
+            editorProviders = newArrayList();
         }
     }
 
     /**
-     * Associates the given validator provider with the repository to
-     * be created.
+     * Associates the given editor provider with the repository to be created.
      *
-     * @param provider validator provider
+     * @param provider editor provider
      * @return this builder
      */
     @Nonnull
-    public Oak with(@Nonnull ValidatorProvider provider) {
-        validatorProviders.add(provider);
+    public Oak with(@Nonnull EditorProvider provider) {
+        editorProviders.add(checkNotNull(provider));
         return this;
     }
 
     /**
-     * Associates the given validator with the repository to be created.
+     * Associates the given editor with the repository to be created.
      *
-     * @param validator validator
+     * @param editor editor
      * @return this builder
      */
     @Nonnull
-    public Oak with(@Nonnull final Validator validator) {
-        return with(new ValidatorProvider() {
-            @Override
-            @Nonnull
-            public Validator getRootValidator(
-                    NodeState before, NodeState after) {
-                return validator;
+    public Oak with(@Nonnull final Editor editor) {
+        checkNotNull(editor);
+        return with(new EditorProvider() {
+            @Override @Nonnull
+            public Editor getRootEditor(
+                    NodeState before, NodeState after, NodeBuilder builder) {
+                return editor;
             }
         });
     }
@@ -221,7 +222,7 @@ public class Oak {
      */
     @Nonnull
     public Oak with(@Nonnull ConflictHandler conflictHandler) {
-        withValidatorHook();
+        withEditorHook();
         commitHooks.add(new ConflictHook(conflictHandler));
         return this;
     }
@@ -230,8 +231,8 @@ public class Oak {
         IndexHookProvider indexHooks = CompositeIndexHookProvider.compose(indexHookProviders);
         OakInitializer.initialize(store, new CompositeInitializer(initializers), indexHooks);
 
+        withEditorHook();
         commitHooks.add(IndexHookManager.of(indexHooks));
-        withValidatorHook();
         CommitHook commitHook = CompositeHook.compose(commitHooks);
         QueryIndexProvider indexProvider = CompositeQueryIndexProvider.compose(queryIndexProviders);
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java Fri Mar  8 19:57:28 2013
@@ -40,8 +40,11 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.query.QueryEngineImpl;
 import org.apache.jackrabbit.oak.security.authentication.SystemSubject;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.CompositeHook;
+import org.apache.jackrabbit.oak.spi.commit.EditorHook;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.observation.ChangeExtractor;
 import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
@@ -282,9 +285,10 @@ public class RootImpl implements Root {
         commitHooks.add(hook);
         List<CommitHook> securityHooks = new ArrayList<CommitHook>();
         for (SecurityConfiguration sc : securityProvider.getSecurityConfigurations()) {
-            CommitHook validators = sc.getValidators().getCommitHook(workspaceName);
-            if (validators != EmptyHook.INSTANCE) {
-                commitHooks.add(validators);
+            List<? extends ValidatorProvider> validators = sc.getValidators(workspaceName);
+            if (!validators.isEmpty()) {
+                commitHooks.add(new EditorHook(
+                        CompositeEditorProvider.compose(validators)));
             }
             CommitHook ch = sc.getSecurityHooks().getCommitHook(workspaceName);
             if (ch != EmptyHook.INSTANCE) {

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=1454516&r1=1454515&r2=1454516&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 Fri Mar  8 19:57:28 2013
@@ -29,8 +29,6 @@ import org.apache.jackrabbit.oak.core.Co
 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.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -53,7 +51,7 @@ public class Activator implements Bundle
 
     private final OsgiIndexHookProvider indexHookProvider = new OsgiIndexHookProvider();
 
-    private final OsgiValidatorProvider validatorProvider = new OsgiValidatorProvider();
+    private final OsgiEditorProvider validatorProvider = new OsgiEditorProvider();
 
     private final OsgiRepositoryInitializer repositoryInitializerTracker = new OsgiRepositoryInitializer();
 
@@ -105,10 +103,9 @@ public class Activator implements Bundle
             OakInitializer.initialize(
                     store, repositoryInitializerTracker, indexHookProvider);
             Oak oak = new Oak(store)
-                .with(new CompositeHook(
-                        // TODO: DefaultTypeEditor is JCR specific and does not belong here
-                        new DefaultTypeEditor(),
-                        new ValidatingHook(validatorProvider)))
+                // TODO: DefaultTypeEditor is JCR specific and does not belong here
+                .with(new DefaultTypeEditor())
+                .with(validatorProvider)
                 .with(indexProvider)
                 .with(indexHookProvider);
             services.put(reference, context.registerService(

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java?rev=1454516&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java Fri Mar  8 19:57:28 2013
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.osgi;
+
+import javax.annotation.CheckForNull;
+
+import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
+import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * This editor provider combines all editors of all available OSGi editor
+ * providers.
+ */
+public class OsgiEditorProvider
+        extends AbstractServiceTracker<EditorProvider>
+        implements EditorProvider {
+
+    public OsgiEditorProvider() {
+        super(EditorProvider.class);
+    }
+
+    //----------------------------------------------------< EditorProvider >--
+
+    @Override @CheckForNull
+    public Editor getRootEditor(
+            NodeState before, NodeState after, NodeBuilder builder) {
+        EditorProvider provider =
+                CompositeEditorProvider.compose(getServices());
+        return provider.getRootEditor(before, after, builder);
+    }
+}

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.Validator;
 import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -26,8 +27,8 @@ import org.apache.jackrabbit.oak.spi.sta
  * TODO document
  */
 @Component
-@Service(ValidatorProvider.class)
-public class ConflictValidatorProvider implements ValidatorProvider {
+@Service(EditorProvider.class)
+public class ConflictValidatorProvider extends ValidatorProvider {
 
     @Override
     public Validator getRootValidator(NodeState before, NodeState after) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NameValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugin
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.core.ReadOnlyTree;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.Validator;
 import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -29,8 +30,8 @@ import org.apache.jackrabbit.oak.spi.sta
  * are properly registered.
  */
 @Component
-@Service(ValidatorProvider.class)
-public class NameValidatorProvider implements ValidatorProvider {
+@Service(EditorProvider.class)
+public class NameValidatorProvider extends ValidatorProvider {
 
     @Override
     public Validator getRootValidator(NodeState before, NodeState after) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -22,6 +22,7 @@ import static org.apache.jackrabbit.oak.
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.core.ReadOnlyTree;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.SubtreeValidator;
 import org.apache.jackrabbit.oak.spi.commit.Validator;
 import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
@@ -33,8 +34,8 @@ import org.apache.jackrabbit.oak.spi.sta
  * are properly registered.
  */
 @Component
-@Service(ValidatorProvider.class)
-public class NamespaceValidatorProvider implements ValidatorProvider {
+@Service(EditorProvider.class)
+public class NamespaceValidatorProvider extends ValidatorProvider {
 
     @Override
     public Validator getRootValidator(NodeState before, NodeState after) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -31,7 +31,7 @@ import org.apache.jackrabbit.oak.spi.sta
  * is responsible for making sure that any modifications made to node type
  * definitions are valid.
  */
-public class RegistrationValidatorProvider implements ValidatorProvider {
+public class RegistrationValidatorProvider extends ValidatorProvider {
 
     @Nonnull
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -25,13 +25,14 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
 import org.apache.jackrabbit.oak.plugins.name.Namespaces;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.Validator;
 import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 @Component
-@Service(ValidatorProvider.class)
-public class TypeValidatorProvider implements ValidatorProvider {
+@Service(EditorProvider.class)
+public class TypeValidatorProvider extends ValidatorProvider {
 
     @Override
     public Validator getRootValidator(NodeState before, final NodeState after) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlConfigurationImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlConfigurationImpl.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlConfigurationImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlConfigurationImpl.java Fri Mar  8 19:57:28 2013
@@ -32,7 +32,7 @@ import org.apache.jackrabbit.oak.securit
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitHookProvider;
 import org.apache.jackrabbit.oak.spi.commit.CompositeHook;
-import org.apache.jackrabbit.oak.spi.commit.ValidatingHook;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
@@ -42,6 +42,8 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
 import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * {@code AccessControlConfigurationImpl} ... TODO
  */
@@ -81,17 +83,11 @@ public class AccessControlConfigurationI
     }
 
     @Override
-    public CommitHookProvider getValidators() {
-        return new CommitHookProvider() {
-            @Nonnull
-            @Override
-            public CommitHook getCommitHook(@Nonnull final String workspaceName) {
-                return new ValidatingHook(
-                        new PermissionStoreValidatorProvider(),
-                        new PermissionValidatorProvider(securityProvider, workspaceName),
-                        new AccessControlValidatorProvider(securityProvider));
-            }
-        };
+    public List<ValidatorProvider> getValidators(String workspaceName) {
+        return ImmutableList.of(
+                new PermissionStoreValidatorProvider(),
+                new PermissionValidatorProvider(securityProvider, workspaceName),
+                new AccessControlValidatorProvider(securityProvider));
     }
 
     @Nonnull

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -45,7 +45,7 @@ import org.slf4j.LoggerFactory;
  * and removing access control policies) are valid according to the
  * constraints defined by this access control implementation.
  */
-class AccessControlValidatorProvider implements ValidatorProvider {
+class AccessControlValidatorProvider extends ValidatorProvider {
 
     private static final Logger log = LoggerFactory.getLogger(AccessControlValidatorProvider.class);
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -28,7 +28,7 @@ import org.apache.jackrabbit.oak.spi.sta
 /**
  * Validator implementation that asserts that the permission store is read-only.
  */
-public class PermissionStoreValidatorProvider implements ValidatorProvider, PermissionConstants {
+public class PermissionStoreValidatorProvider extends ValidatorProvider implements PermissionConstants {
 
     @Nonnull
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -35,7 +35,7 @@ import org.apache.jackrabbit.oak.spi.sta
 /**
  * PermissionValidatorProvider... TODO
  */
-public class PermissionValidatorProvider implements ValidatorProvider {
+public class PermissionValidatorProvider extends ValidatorProvider {
 
     private final SecurityProvider securityProvider;
     private final String workspaceName;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeConfigurationImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeConfigurationImpl.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeConfigurationImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeConfigurationImpl.java Fri Mar  8 19:57:28 2013
@@ -16,6 +16,9 @@
  */
 package org.apache.jackrabbit.oak.security.privilege;
 
+import java.util.Collections;
+import java.util.List;
+
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
@@ -23,7 +26,7 @@ import org.apache.jackrabbit.oak.api.Roo
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitHookProvider;
-import org.apache.jackrabbit.oak.spi.commit.ValidatingHook;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
@@ -61,14 +64,8 @@ public class PrivilegeConfigurationImpl 
 
     @Nonnull
     @Override
-    public CommitHookProvider getValidators() {
-        return new CommitHookProvider() {
-            @Nonnull
-            @Override
-            public CommitHook getCommitHook(@Nonnull String workspaceName) {
-                return new ValidatingHook(new PrivilegeValidatorProvider());
-            }
-        };
+    public List<? extends ValidatorProvider> getValidators(String workspaceName) {
+        return Collections.singletonList(new PrivilegeValidatorProvider());
     }
 
     @Nonnull

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -31,7 +31,7 @@ import static org.apache.jackrabbit.oak.
  * to make sure modifications to the /jcr:system/rep:privileges tree are compliant
  * with constraints applied for custom privileges.
  */
-class PrivilegeValidatorProvider implements ValidatorProvider {
+class PrivilegeValidatorProvider extends ValidatorProvider {
 
     @Nonnull
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java Fri Mar  8 19:57:28 2013
@@ -23,9 +23,7 @@ import javax.annotation.Nonnull;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.spi.commit.CommitHook;
-import org.apache.jackrabbit.oak.spi.commit.CommitHookProvider;
-import org.apache.jackrabbit.oak.spi.commit.ValidatingHook;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.Context;
@@ -65,14 +63,9 @@ public class UserConfigurationImpl exten
 
     @Nonnull
     @Override
-    public CommitHookProvider getValidators() {
-        return new CommitHookProvider() {
-            @Nonnull
-            @Override
-            public CommitHook getCommitHook(@Nonnull String workspaceName) {
-                return new ValidatingHook(new UserValidatorProvider(getConfigurationParameters()));
-            }
-        };
+    public List<? extends ValidatorProvider> getValidators(String workspaceName) {
+        return Collections.singletonList(
+                new UserValidatorProvider(getConfigurationParameters()));
     }
 
     @Nonnull

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -29,7 +29,7 @@ import static com.google.common.base.Pre
 /**
  * Provides a validator for user and group management.
  */
-class UserValidatorProvider implements ValidatorProvider {
+class UserValidatorProvider extends ValidatorProvider {
 
     private final ConfigurationParameters config;
 

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditor.java?rev=1454516&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditor.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditor.java Fri Mar  8 19:57:28 2013
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.spi.commit;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Arrays.asList;
+
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+import com.google.common.collect.Lists;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ * Aggregation of a list of editors into a single editor.
+ */
+public class CompositeEditor implements Editor {
+
+    @CheckForNull
+    public static Editor compose(@Nonnull Collection<Editor> editors) {
+        checkNotNull(editors);
+        switch (editors.size()) {
+        case 0:
+            return null;
+        case 1:
+            return editors.iterator().next();
+        default:
+            return new CompositeEditor(editors);
+        }
+    }
+
+    private final Collection<? extends Editor> editors;
+
+    public CompositeEditor(Collection<? extends Editor> editors) {
+        this.editors = editors;
+    }
+
+    public CompositeEditor(Editor... editors) {
+        this(asList(editors));
+    }
+
+    @Override
+    public void propertyAdded(PropertyState after)
+            throws CommitFailedException {
+        for (Editor editor : editors) {
+            editor.propertyAdded(after);
+        }
+    }
+
+    @Override
+    public void propertyChanged(PropertyState before, PropertyState after)
+            throws CommitFailedException {
+        for (Editor editor : editors) {
+            editor.propertyChanged(before, after);
+        }
+    }
+
+    @Override
+    public void propertyDeleted(PropertyState before)
+            throws CommitFailedException {
+        for (Editor editor : editors) {
+            editor.propertyDeleted(before);
+        }
+    }
+
+    @Override
+    public Editor childNodeAdded(String name, NodeState after)
+            throws CommitFailedException {
+        List<Editor> list = Lists.newArrayListWithCapacity(editors.size());
+        for (Editor editor : editors) {
+            Editor child = editor.childNodeAdded(name, after);
+            if (child != null) {
+                list.add(child);
+            }
+        }
+        return compose(list);
+    }
+
+    @Override
+    public Editor childNodeChanged(
+            String name, NodeState before, NodeState after)
+            throws CommitFailedException {
+        List<Editor> list = Lists.newArrayListWithCapacity(editors.size());
+        for (Editor editor : editors) {
+            Editor child = editor.childNodeChanged(name, before, after);
+            if (child != null) {
+                list.add(child);
+            }
+        }
+        return compose(list);
+    }
+
+    @Override
+    public Editor childNodeDeleted(String name, NodeState before)
+            throws CommitFailedException {
+        List<Editor> list = Lists.newArrayListWithCapacity(editors.size());
+        for (Editor editor : editors) {
+            Editor child = editor.childNodeDeleted(name, before);
+            if (child != null) {
+                list.add(child);
+            }
+        }
+        return compose(list);
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditorProvider.java?rev=1454516&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditorProvider.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeEditorProvider.java Fri Mar  8 19:57:28 2013
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.spi.commit;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Arrays.asList;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Aggregation of a list of editor providers into a single provider.
+ */
+public class CompositeEditorProvider implements EditorProvider {
+
+    private static final EditorProvider EMPTY_PROVIDER =
+        new EditorProvider() {
+            @Override @CheckForNull
+            public Editor getRootEditor(
+                    NodeState before, NodeState after, NodeBuilder builder) {
+                return null;
+            }
+        };
+
+    @Nonnull
+    public static EditorProvider compose(
+            @Nonnull Collection<? extends EditorProvider> providers) {
+        checkNotNull(providers);
+        switch (providers.size()) {
+        case 0:
+            return EMPTY_PROVIDER;
+        case 1:
+            return providers.iterator().next();
+        default:
+            return new CompositeEditorProvider(providers);
+        }
+    }
+
+    private final Collection<? extends EditorProvider> providers;
+
+    private CompositeEditorProvider(
+            Collection<? extends EditorProvider> providers) {
+        this.providers = providers;
+    }
+
+    public CompositeEditorProvider(EditorProvider... providers) {
+        this(asList(providers));
+    }
+
+    @Override @CheckForNull
+    public Editor getRootEditor(
+            NodeState before, NodeState after, NodeBuilder builder) {
+        List<Editor> list = Lists.newArrayListWithCapacity(providers.size());
+        for (EditorProvider provider : providers) {
+            Editor editor = provider.getRootEditor(before, after, builder);
+            if (editor != null) {
+                list.add(editor);
+            }
+        }
+        return CompositeEditor.compose(list);
+    }
+
+}

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/Validator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/Validator.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/Validator.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/Validator.java Fri Mar  8 19:57:28 2013
@@ -26,7 +26,7 @@ import javax.annotation.CheckForNull;
  * Content change validator. An instance of this interface is used to
  * validate changes against a specific {@link NodeState}.
  */
-public interface Validator {
+public interface Validator extends Editor {
 
     /**
      * Validate an added property

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ValidatorProvider.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ValidatorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ValidatorProvider.java Fri Mar  8 19:57:28 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.spi.commit;
 
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import javax.annotation.Nonnull;
@@ -24,7 +25,7 @@ import javax.annotation.Nonnull;
  * Extension point for plugging in different kinds of validation rules
  * for content changes.
  */
-public interface ValidatorProvider {
+public abstract class ValidatorProvider implements EditorProvider {
 
     /**
      * Returns a validator for checking the changes between the given
@@ -35,6 +36,15 @@ public interface ValidatorProvider {
      * @return validator for checking the modifications
      */
     @Nonnull
-    Validator getRootValidator(NodeState before, NodeState after);
+    protected abstract Validator getRootValidator(
+            NodeState before, NodeState after);
+
+    //----------------------------------------------------< EditorProvider >--
+
+    @Override @Nonnull
+    public final Editor getRootEditor(
+            NodeState before, NodeState after, NodeBuilder builder) {
+        return getRootValidator(before, after);
+    }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/SecurityConfiguration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/SecurityConfiguration.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/SecurityConfiguration.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/SecurityConfiguration.java Fri Mar  8 19:57:28 2013
@@ -24,6 +24,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitHookProvider;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -44,7 +45,7 @@ public interface SecurityConfiguration {
     CommitHookProvider getSecurityHooks();
 
     @Nonnull
-    CommitHookProvider getValidators();
+    List<? extends ValidatorProvider> getValidators(String workspaceName);
 
     @Nonnull
     List<ProtectedItemImporter> getProtectedItemImporters();
@@ -83,8 +84,8 @@ public interface SecurityConfiguration {
 
         @Nonnull
         @Override
-        public CommitHookProvider getValidators() {
-            return new CommitHookProvider.Empty();
+        public List<? extends ValidatorProvider> getValidators(String workspaceName) {
+            return Collections.emptyList();
         }
 
         @Nonnull

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java?rev=1454516&r1=1454515&r2=1454516&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java Fri Mar  8 19:57:28 2013
@@ -40,8 +40,8 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
-import org.apache.jackrabbit.oak.spi.commit.Validator;
-import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
+import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
@@ -113,14 +113,14 @@ public class Jcr {
     }
 
     @Nonnull
-    public Jcr with(@Nonnull ValidatorProvider provider) {
+    public Jcr with(@Nonnull EditorProvider provider) {
         oak.with(checkNotNull(provider));
         return this;
     }
 
     @Nonnull
-    public Jcr with(@Nonnull Validator validator) {
-        oak.with(checkNotNull(validator));
+    public Jcr with(@Nonnull Editor editor) {
+        oak.with(checkNotNull(editor));
         return this;
     }