Index: oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java (revision 1831260) +++ oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java (revision ) @@ -18,16 +18,21 @@ import java.util.List; import java.util.Set; - import javax.annotation.Nonnull; import com.google.common.collect.Sets; - import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore; -import org.apache.jackrabbit.oak.plugins.version.VersionablePathHook; +import org.apache.jackrabbit.oak.plugins.tree.RootProvider; +import org.apache.jackrabbit.oak.plugins.tree.TreeProvider; +import org.apache.jackrabbit.oak.plugins.tree.impl.RootProviderService; +import org.apache.jackrabbit.oak.plugins.tree.impl.TreeProviderService; +import org.apache.jackrabbit.oak.security.authorization.ProviderCtx; +import org.apache.jackrabbit.oak.security.authorization.permission.VersionablePathHook; import org.apache.jackrabbit.oak.spi.commit.CommitInfo; import org.apache.jackrabbit.oak.spi.commit.EmptyHook; +import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider; +import org.apache.jackrabbit.oak.spi.security.SecurityProvider; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.junit.Test; @@ -66,7 +71,31 @@ } store.paths.clear(); - VersionablePathHook hook = new VersionablePathHook("default"); + VersionablePathHook hook = new VersionablePathHook("default", new ProviderCtx() { + @Nonnull + @Override + public SecurityProvider getSecurityProvider() { + throw new UnsupportedOperationException(); + } + + @Nonnull + @Override + public TreeProvider getTreeProvider() { + return new TreeProviderService(); + } + + @Nonnull + @Override + public RootProvider getRootProvider() { + return new RootProviderService(); + } + + @Nonnull + @Override + public MountInfoProvider getMountInfoProvider() { + throw new UnsupportedOperationException(); + } + }); hook.processCommit(ns.getRoot(), builder.getNodeState(), CommitInfo.EMPTY); assertEquals("Must not query for hidden paths: " + store.paths.toString(), 0, store.paths.size()); Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java (revision 1831260) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java (revision ) @@ -14,26 +14,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.jackrabbit.oak.plugins.version; +package org.apache.jackrabbit.oak.security.authorization.permission; import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.annotation.Nonnull; import com.google.common.collect.ImmutableSet; - import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.commons.PathUtils; -import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree; -import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; +import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager; +import org.apache.jackrabbit.oak.plugins.version.ReadWriteVersionManager; +import org.apache.jackrabbit.oak.security.authorization.ProviderCtx; import org.apache.jackrabbit.oak.spi.commit.CommitHook; import org.apache.jackrabbit.oak.spi.commit.CommitInfo; +import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants; import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; @@ -51,9 +52,11 @@ public class VersionablePathHook implements CommitHook { private final String workspaceName; + private final ProviderCtx providerCtx; - public VersionablePathHook(String workspaceName) { + public VersionablePathHook(@Nonnull String workspaceName, @Nonnull ProviderCtx providerCtx) { this.workspaceName = workspaceName; + this.providerCtx = providerCtx; } @Nonnull @@ -63,10 +66,13 @@ throws CommitFailedException { NodeBuilder rootBuilder = after.builder(); NodeBuilder vsRoot = rootBuilder.child(NodeTypeConstants.JCR_SYSTEM).child(NodeTypeConstants.JCR_VERSIONSTORAGE); + ReadWriteVersionManager vMgr = new ReadWriteVersionManager(vsRoot, rootBuilder); + ReadOnlyNodeTypeManager ntMgr = ReadOnlyNodeTypeManager.getInstance(providerCtx.getRootProvider().createReadOnlyRoot(rootBuilder.getNodeState()), NamePathMapper.DEFAULT); + List exceptions = new ArrayList(); after.compareAgainstBaseState(before, - new Diff(vMgr, new Node(rootBuilder), exceptions)); + new Diff(vMgr, ntMgr, new Node(rootBuilder), exceptions)); if (!exceptions.isEmpty()) { throw exceptions.get(0); } @@ -81,13 +87,16 @@ private final class Diff extends DefaultNodeStateDiff implements VersionConstants { private final ReadWriteVersionManager versionManager; + private final ReadOnlyNodeTypeManager ntMgr; private final Node nodeAfter; private final List exceptions; private Diff(@Nonnull ReadWriteVersionManager versionManager, + @Nonnull ReadOnlyNodeTypeManager ntMgr, @Nonnull Node node, @Nonnull List exceptions) { this.versionManager = versionManager; + this.ntMgr = ntMgr; this.nodeAfter = node; this.exceptions = exceptions; } @@ -116,11 +125,11 @@ } Node node = new Node(nodeAfter, name); return after.compareAgainstBaseState( - before, new Diff(versionManager, node, exceptions)); + before, new Diff(versionManager, ntMgr, node, exceptions)); } private boolean setVersionablePath(PropertyState after) { - if (JcrConstants.JCR_VERSIONHISTORY.equals(after.getName()) && nodeAfter.isVersionable(versionManager)) { + if (JcrConstants.JCR_VERSIONHISTORY.equals(after.getName()) && nodeAfter.isVersionable(ntMgr)) { NodeBuilder vhBuilder; try { vhBuilder = versionManager.getOrCreateVersionHistory( @@ -145,7 +154,7 @@ } } - private static final class Node { + private final class Node { private final String path; private final NodeBuilder builder; @@ -160,9 +169,12 @@ this.path = PathUtils.concat(parent.path, name); } - private boolean isVersionable(ReadWriteVersionManager versionManager) { - Tree tree = new ImmutableTree(ImmutableTree.ParentProvider.UNSUPPORTED, PathUtils.getName(path), builder.getNodeState()); - return versionManager.isVersionable(tree); + private boolean isVersionable(ReadOnlyNodeTypeManager ntMgr) { + // this is not 100% correct, because t.getPath() will + // not return the correct path for node after, but is + // sufficient to check if it is versionable + Tree tree = providerCtx.getTreeProvider().createReadOnlyTree(builder.getNodeState()); + return ntMgr.isNodeType(tree, VersionConstants.MIX_VERSIONABLE); } } } \ No newline at end of file Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java (revision 1831260) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java (revision ) @@ -253,7 +253,6 @@ * versionable path property for the specified workspace is missing or if * the given tree is not located within the tree structure defined by a version history. * - * @see VersionablePathHook * @see VersionConstants#MIX_REP_VERSIONABLE_PATHS */ @CheckForNull Index: oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java (revision 1831261) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java (revision ) @@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableList; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.namepath.NamePathMapper; -import org.apache.jackrabbit.oak.plugins.version.VersionablePathHook; +import org.apache.jackrabbit.oak.security.authorization.permission.VersionablePathHook; import org.apache.jackrabbit.oak.security.authorization.accesscontrol.AccessControlImporter; import org.apache.jackrabbit.oak.security.authorization.accesscontrol.AccessControlManagerImpl; import org.apache.jackrabbit.oak.security.authorization.accesscontrol.AccessControlValidatorProvider; @@ -157,7 +157,7 @@ @Override public List getCommitHooks(@Nonnull String workspaceName) { return ImmutableList.of( - new VersionablePathHook(workspaceName), + new VersionablePathHook(workspaceName, this), new PermissionHook(workspaceName, getRestrictionProvider(), mountInfoProvider, getRootProvider(), getTreeProvider())); }