Author: mreutegg
Date: Wed Oct 15 08:26:48 2014
New Revision: 1631971
URL: http://svn.apache.org/r1631971
Log:
OAK-2188: Add/remove version label fails with restricted access on /jcr:system
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
(with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java
Wed Oct 15 08:26:48 2014
@@ -112,6 +112,17 @@ public abstract class ReadOnlyVersionMan
}
/**
+ * Returns the version tree with the given uuid.
+ *
+ * @param uuid the uuid of the version tree.
+ * @return the version tree or {@code null} if there is none.
+ */
+ @CheckForNull
+ public Tree getVersion(@Nonnull String uuid) {
+ return getIdentifierManager().getTree(uuid);
+ }
+
+ /**
* Returns the path of the version history for the given {@code uuid}.
* The returned path is relative to the version storage tree as returned
* by {@link #getVersionStorage()}.
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
Wed Oct 15 08:26:48 2014
@@ -71,7 +71,8 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH;
/**
- * TODO document
+ * Extends the {@link ReadOnlyVersionManager} with methods to modify the
+ * version store.
*/
class ReadWriteVersionManager extends ReadOnlyVersionManager {
@@ -214,8 +215,7 @@ class ReadWriteVersionManager extends Re
public void checkout(NodeBuilder versionable) {
versionable.setProperty(JCR_ISCHECKEDOUT, true, Type.BOOLEAN);
PropertyState baseVersion = versionable.getProperty(JCR_BASEVERSION);
- List<String> predecessors = Collections.singletonList(
- baseVersion.getValue(Type.REFERENCE));
+ List<String> predecessors =
Collections.singletonList(baseVersion.getValue(Type.REFERENCE));
versionable.setProperty(JCR_PREDECESSORS, predecessors,
Type.REFERENCES);
}
@@ -282,39 +282,6 @@ class ReadWriteVersionManager extends Re
}
/**
- * Adds a version label to the jcr:versionLabels node of the referenced
- * version history.
- *
- * @param historyRelPath relative path from the jcr:versionStorage node to
- * the version history node.
- * @param label the version label.
- * @param versionName the name of the version.
- * @throws CommitFailedException if there is no such version history or if
- * there is already a label with the given name or if the given version
name
- * is invalid.
- */
- public void addVersionLabel(@Nonnull String historyRelPath,
- @Nonnull String label,
- @Nonnull String versionName)
- throws CommitFailedException {
- NodeBuilder labels = getVersionLabelsFor(checkNotNull(historyRelPath));
- if (labels.hasProperty(checkNotNull(label))) {
- throw new CommitFailedException(CommitFailedException.LABEL_EXISTS,
- VersionExceptionCode.LABEL_EXISTS.ordinal(),
- "Version label " + label + " already exists on this
version history");
- }
- NodeBuilder history = resolve(versionStorageNode, historyRelPath);
- if (checkNotNull(versionName).equals(JCR_ROOTVERSION)
- || !history.hasChildNode(checkNotNull(versionName))) {
- throw new CommitFailedException(CommitFailedException.VERSION,
- VersionExceptionCode.NO_SUCH_VERSION.ordinal(),
- "Not a valid version on this history: " + versionName);
- }
- String uuid = uuidFromNode(history.getChildNode(versionName));
- labels.setProperty(label, uuid, Type.REFERENCE);
- }
-
- /**
* Removes a version label from the jcr:versionLabels node of the
referenced
* version history.
*
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
Wed Oct 15 08:26:48 2014
@@ -21,11 +21,14 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.base.Preconditions.checkNotNull;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
+import static org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT;
import javax.annotation.Nonnull;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
/**
@@ -70,4 +73,9 @@ public final class Utils {
}
return primaryType;
}
+
+ static <T> T throwProtected(String path) throws CommitFailedException {
+ throw new CommitFailedException(CONSTRAINT, 100,
+ "Item is protected: " + path);
+ }
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
Wed Oct 15 08:26:48 2014
@@ -58,21 +58,6 @@ public interface VersionConstants extend
String MIX_REP_VERSIONABLE_PATHS = "rep:VersionablePaths";
/**
- * Version operation property name to add version labels.
- */
- String REP_ADD_VERSION_LABELS = "rep:addVersionLabels";
-
- /**
- * Version operation property name to remove version labels.
- */
- String REP_REMOVE_VERSION_LABELS = "rep:removeVersionLabels";
-
- /**
- * Version operation property name to remove version(s).
- */
- String REP_REMOVE_VERSION = "rep:removeVersion";
-
- /**
* Prefix of the jcr:baseVersion value for a restore.
*/
String RESTORE_PREFIX = "restore-";
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
Wed Oct 15 08:26:48 2014
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.spi.com
import org.apache.jackrabbit.oak.spi.commit.CompositeEditor;
import org.apache.jackrabbit.oak.spi.commit.Editor;
import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
+import org.apache.jackrabbit.oak.spi.commit.SubtreeEditor;
import org.apache.jackrabbit.oak.spi.commit.VisibleEditor;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -47,7 +48,9 @@ public class VersionEditorProvider imple
NodeBuilder versionStorage = system.child(JCR_VERSIONSTORAGE);
return new VisibleEditor(new CompositeEditor(
new VersionEditor(versionStorage, builder, info),
- new VersionStorageEditor(versionStorage, builder)));
+ new SubtreeEditor(
+ new VersionStorageEditor(versionStorage, builder),
+ JCR_SYSTEM, JCR_VERSIONSTORAGE)));
}
}
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java?rev=1631971&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
Wed Oct 15 08:26:48 2014
@@ -0,0 +1,97 @@
+/*
+ * 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.plugins.version;
+
+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.spi.commit.DefaultEditor;
+import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+import static org.apache.jackrabbit.JcrConstants.JCR_ROOTVERSION;
+import static org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT;
+import static org.apache.jackrabbit.oak.plugins.version.Utils.throwProtected;
+
+/**
+ * Validates changes on jcr:versionLabels nodes in the version storage.
+ */
+class VersionLabelsEditor extends DefaultEditor {
+
+ private final String path;
+ private final ReadWriteVersionManager vMgr;
+
+ VersionLabelsEditor(String labelsPath,
+ ReadWriteVersionManager versionManager) {
+ this.path = labelsPath;
+ this.vMgr = versionManager;
+ }
+
+ @Override
+ public void propertyAdded(PropertyState after)
+ throws CommitFailedException {
+ validateLabel(after);
+ }
+
+ @Override
+ public void propertyChanged(PropertyState before, PropertyState after)
+ throws CommitFailedException {
+ validateLabel(after);
+ }
+
+ @Override
+ public Editor childNodeAdded(String name, NodeState after)
+ throws CommitFailedException {
+ return throwProtected(PathUtils.concat(path, name));
+ }
+
+ @Override
+ public Editor childNodeChanged(String name,
+ NodeState before,
+ NodeState after)
+ throws CommitFailedException {
+ return throwProtected(PathUtils.concat(path, name));
+ }
+
+ @Override
+ public Editor childNodeDeleted(String name, NodeState before)
+ throws CommitFailedException {
+ return throwProtected(PathUtils.concat(path, name));
+ }
+
+ //-----------------------< internal
>---------------------------------------
+
+ private void validateLabel(PropertyState label)
+ throws CommitFailedException {
+ String identifier = label.getValue(Type.REFERENCE);
+ Tree version = vMgr.getVersion(identifier);
+ if (version == null) {
+ throw new CommitFailedException(CONSTRAINT, 0,
+ "Version label references unknown node");
+ }
+ String parent = PathUtils.getAncestorPath(path, 1);
+ String versionName = version.getName();
+ if (versionName.equals(JCR_ROOTVERSION)
+ || !PathUtils.isAncestor(parent, version.getPath())) {
+ throw new CommitFailedException(CommitFailedException.VERSION,
+ VersionExceptionCode.NO_SUCH_VERSION.ordinal(),
+ "Not a valid version on this history: " + versionName);
+ }
+ }
+}
Propchange:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
Wed Oct 15 08:26:48 2014
@@ -16,89 +16,52 @@
*/
package org.apache.jackrabbit.oak.plugins.version;
-import java.util.Arrays;
-import java.util.List;
-import java.util.SortedMap;
-
import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.spi.commit.DefaultEditor;
import org.apache.jackrabbit.oak.spi.commit.Editor;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONLABELS;
-import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE;
-import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_ADD_VERSION_LABELS;
-import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION;
-import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION_LABELS;
+import static org.apache.jackrabbit.oak.commons.PathUtils.concat;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getDepth;
+import static org.apache.jackrabbit.oak.commons.PathUtils.relativize;
+import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_NODE_TYPE_NAMES;
+import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_NT_NAMES;
+import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH;
/**
- * Implements an editor watching for well known properties on the
- * /jcr:system/jcr:versionStorage node to trigger version operations (like
- * adding/removing labels or removing versions) on the protected version
storage
- * tree.
- * <p>
- * This editor supports the following operations:
- * <ul>
- * <li>{@link VersionConstants#REP_ADD_VERSION_LABELS}: adds version labels to
- * existing version histories. The property is multi-valued and each value is a
- * PATH, which looks like this:
- * {@code
<version-history-path>/jcr:versionLabels/<version-label>/<version-name>}.
- * The {@code version-history-path} is a relative path to the version
- * history node starting at the /jcr:system/jcr:versionStorage node.
- * An attempt to add a version label that already exists will result in a
- * {@link CommitFailedException}. </li>
- * <li>{@link VersionConstants#REP_REMOVE_VERSION_LABELS}: removes version
labels from
- * existing version histories. The property is multi-valued and each value is a
- * PATH, which looks like this:
- * {@code
<version-history-path>/jcr:versionLabels/<version-label>/<version-name>}.
- * The {@code version-history-path} is a relative path to the version
- * history node starting at the /jcr:system/jcr:versionStorage node. The
- * {@code <version-name>} part is ignored when labels are removed and
- * can be anything, though it must be a valid JCR/Oak name.
- * An attempt to remove a version label, which does not exist, will result in a
- * {@link CommitFailedException}. </li>
- * <li>{@link VersionConstants#REP_REMOVE_VERSION}: : removes a version from
- * existing version histories, the associated labels and fixes the version
tree.
- * The property is multi-valued and each value is a
- * PATH, which looks like this:
- * {@code <version-history-path>/<version-name>}.
- * The {@code version-history-path} is a relative path to the version
- * history node starting at the /jcr:system/jcr:versionStorage node.</li>
- * </ul>
+ * Validates changes on the version store.
*/
class VersionStorageEditor extends DefaultEditor {
+ private static final int VERSION_HISTORY_DEPTH = 6;
+
private final NodeBuilder versionStorageNode;
private final NodeBuilder workspaceRoot;
+ private final NodeBuilder builder;
+ private final String path;
private ReadWriteVersionManager vMgr;
- private final List<String> pathRemainder;
-
- private final SortedMap<Integer, Operation> operations = Maps.newTreeMap();
VersionStorageEditor(@Nonnull NodeBuilder versionStorageNode,
@Nonnull NodeBuilder workspaceRoot) {
- this(versionStorageNode, workspaceRoot,
- Arrays.asList(JCR_SYSTEM, JCR_VERSIONSTORAGE));
+ this(versionStorageNode, workspaceRoot, versionStorageNode,
+ VERSION_STORE_PATH);
}
private VersionStorageEditor(@Nonnull NodeBuilder versionStorageNode,
- @Nonnull NodeBuilder workspaceRoot,
- @Nonnull List<String> pathRemainder) {
- this.versionStorageNode = versionStorageNode;
- this.workspaceRoot = workspaceRoot;
- this.pathRemainder = checkNotNull(pathRemainder);
+ @Nonnull NodeBuilder workspaceRoot,
+ @Nonnull NodeBuilder builder,
+ @Nonnull String path) {
+ this.versionStorageNode = checkNotNull(versionStorageNode);
+ this.workspaceRoot = checkNotNull(workspaceRoot);
+ this.builder = checkNotNull(builder);
+ this.path = checkNotNull(path);
}
@Override
@@ -106,144 +69,92 @@ class VersionStorageEditor extends Defau
NodeState before,
NodeState after)
throws CommitFailedException {
- if (pathRemainder.isEmpty()) {
- return null;
+ int d = getDepth(path);
+ String p = concat(path, name);
+ if (d == VERSION_HISTORY_DEPTH
+ && name.equals(JCR_VERSIONLABELS)) {
+ return new VersionLabelsEditor(p, getVersionManager());
}
- if (pathRemainder.get(0).equals(name)) {
- return new VersionStorageEditor(versionStorageNode, workspaceRoot,
- pathRemainder.subList(1, pathRemainder.size()));
- } else {
+ if (d < VERSION_HISTORY_DEPTH && !isVersionStorageNode(after)) {
return null;
}
+ return new VersionStorageEditor(versionStorageNode, workspaceRoot,
+ builder.child(name), p);
}
@Override
- public void propertyAdded(PropertyState after)
+ public Editor childNodeAdded(String name, NodeState after)
throws CommitFailedException {
- String name = after.getName();
- if (REP_REMOVE_VERSION_LABELS.equals(name)) {
- operations.put(1, new
RemoveVersionLabels(after.getValue(Type.PATHS)));
- versionStorageNode.removeProperty(name);
- } else if (REP_ADD_VERSION_LABELS.equals(name)) {
- operations.put(2, new
AddVersionLabels(after.getValue(Type.PATHS)));
- versionStorageNode.removeProperty(name);
- } else if (REP_REMOVE_VERSION.equals(name)) {
- operations.put(3, new RemoveVersion(after.getValue(Type.PATHS)));
- versionStorageNode.removeProperty(name);
+ int d = getDepth(path);
+ // allow child nodes under version storage node, unless an attempt
+ // is made to create rep:versionStorage nodes manually.
+ if (d == getDepth(VERSION_STORE_PATH) &&
+ !isVersionStorageNode(after)) {
+ return null;
}
+ return throwProtected(name);
}
@Override
- public void leave(NodeState before, NodeState after)
+ public Editor childNodeDeleted(String name, NodeState before)
throws CommitFailedException {
- for (Operation op : operations.values()) {
- op.perform();
+ int d = getDepth(path);
+ if (d == VERSION_HISTORY_DEPTH) {
+ // restore version on builder
+ builder.setChildNode(name, before);
+ String relPath = relativize(VERSION_STORE_PATH, concat(path,
name));
+ // let version manager remove it properly
+ getVersionManager().removeVersion(relPath);
+ return null;
+ } else if (isVersionStorageNode(before) || d > VERSION_HISTORY_DEPTH) {
+ throwProtected(name);
}
+ return null;
}
- //-------------------------< internal
>-------------------------------------
-
- private ReadWriteVersionManager getVersionManager() {
- if (vMgr == null) {
- vMgr = new ReadWriteVersionManager(versionStorageNode,
workspaceRoot);
+ @Override
+ public void propertyAdded(PropertyState after)
+ throws CommitFailedException {
+ if (getDepth(path) < VERSION_HISTORY_DEPTH) {
+ return;
}
- return vMgr;
+ throwProtected(after.getName());
}
- interface Operation {
-
- void perform() throws CommitFailedException;
- }
-
- private class AddVersionLabels implements Operation {
-
- private Iterable<String> labelPaths;
-
- public AddVersionLabels(Iterable<String> labelPaths) {
- this.labelPaths = labelPaths;
- }
-
- @Override
- public void perform() throws CommitFailedException {
- for (String s : labelPaths) {
- VersionLabel label = new VersionLabel(s);
- getVersionManager().addVersionLabel(label.versionHistoryPath,
label.label, label.versionName);
- }
+ @Override
+ public void propertyChanged(PropertyState before, PropertyState after)
+ throws CommitFailedException {
+ if (getDepth(path) < VERSION_HISTORY_DEPTH) {
+ return;
}
+ throwProtected(before.getName());
}
- private class RemoveVersionLabels implements Operation {
-
- private Iterable<String> labelPaths;
-
- public RemoveVersionLabels(Iterable<String> labelPaths) {
- this.labelPaths = labelPaths;
- }
-
- @Override
- public void perform() throws CommitFailedException {
- for (String s : labelPaths) {
- VersionLabel label = new VersionLabel(s);
-
getVersionManager().removeVersionLabel(label.versionHistoryPath, label.label);
- }
+ @Override
+ public void propertyDeleted(PropertyState before)
+ throws CommitFailedException {
+ if (getDepth(path) < VERSION_HISTORY_DEPTH) {
+ return;
}
+ throwProtected(before.getName());
}
- private class RemoveVersion implements Operation {
-
- private final Iterable<String> versionPaths;
+ //-------------------------< internal
>-------------------------------------
- private RemoveVersion(@Nonnull Iterable<String> versionPaths) {
- this.versionPaths = versionPaths;
- }
+ private static boolean isVersionStorageNode(NodeState state) {
+ String ntName = state.getName(JCR_PRIMARYTYPE);
+ return VERSION_STORE_NT_NAMES.contains(ntName)
+ || VERSION_NODE_TYPE_NAMES.contains(ntName);
+ }
- @Override
- public void perform() throws CommitFailedException {
- for (String path : versionPaths) {
- getVersionManager().removeVersion(path);
- }
+ private ReadWriteVersionManager getVersionManager() {
+ if (vMgr == null) {
+ vMgr = new ReadWriteVersionManager(versionStorageNode,
workspaceRoot);
}
+ return vMgr;
}
- private static class VersionLabel {
-
- private final String versionHistoryPath;
-
- private final String label;
-
- private final String versionName;
-
- /**
- * @param path a label path as defined in the constructor of
- * {@link VersionStorageEditor}.
- * @throws IllegalArgumentException if the path is malformed
- */
- VersionLabel(@Nonnull String path) throws IllegalArgumentException {
- checkArgument(!PathUtils.isAbsolute(checkNotNull(path)),
- "Version label path must be relative");
- List<String> elements =
Lists.newArrayList(PathUtils.elements(path));
- // length of the path must be 7:
- // intermediate versionstorage nodes : 3
- // version history node : 1
- // jcr:versionLabels : 1
- // version label : 1
- // version name : 1
- if (elements.size() != 7) {
- throw new IllegalArgumentException(
- "Invalid version label path: " + path);
- }
- StringBuilder builder = new StringBuilder();
- String slash = "";
- for (String element : elements.subList(0, 4)) {
- builder.append(slash);
- builder.append(element);
- slash = "/";
- }
- versionHistoryPath = builder.toString();
- checkArgument(elements.get(4).equals(JCR_VERSIONLABELS),
- "Invalid version label path: " + path);
- label = elements.get(5);
- versionName = elements.get(6);
- }
+ private Editor throwProtected(String name) throws CommitFailedException {
+ return Utils.throwProtected(concat(path, name));
}
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
Wed Oct 15 08:26:48 2014
@@ -181,7 +181,8 @@ public class VersionManagerDelegate {
String vhRelPath =
PathUtils.relativize(VersionStorage.VERSION_STORAGE_PATH,
checkNotNull(versionHistory).getPath());
versionManager.addVersionLabel(storage, vhRelPath,
- checkNotNull(version).getName(), checkNotNull(oakVersionLabel),
+ checkNotNull(version).getIdentifier(),
+ checkNotNull(oakVersionLabel),
moveLabel);
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
Wed Oct 15 08:26:48 2014
@@ -16,8 +16,6 @@
*/
package org.apache.jackrabbit.oak.jcr.version;
-import java.util.Collections;
-
import javax.annotation.Nonnull;
import javax.jcr.InvalidItemStateException;
import javax.jcr.RepositoryException;
@@ -44,9 +42,6 @@ import static com.google.common.base.Pre
import static org.apache.jackrabbit.JcrConstants.JCR_CREATED;
import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT;
import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONLABELS;
-import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_ADD_VERSION_LABELS;
-import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION_LABELS;
-import static
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION;
/**
* {@code ReadWriteVersionManager}...
@@ -182,27 +177,22 @@ public class ReadWriteVersionManager ext
public void addVersionLabel(@Nonnull VersionStorage versionStorage,
@Nonnull String versionHistoryOakRelPath,
- @Nonnull String versionOakName,
+ @Nonnull String versionIdentifier,
@Nonnull String oakVersionLabel,
boolean moveLabel) throws RepositoryException {
Tree versionHistory =
TreeUtil.getTree(checkNotNull(versionStorage.getTree()),
checkNotNull(versionHistoryOakRelPath));
Tree labels = checkNotNull(versionHistory).getChild(JCR_VERSIONLABELS);
- if (labels.hasProperty(checkNotNull(oakVersionLabel))) {
+ PropertyState existing =
labels.getProperty(checkNotNull(oakVersionLabel));
+ if (existing != null) {
if (moveLabel) {
- String labelPath = PathUtils.concat(versionHistoryOakRelPath,
- JCR_VERSIONLABELS, oakVersionLabel, "dummy");
- versionStorage.getTree().setProperty(REP_REMOVE_VERSION_LABELS,
- Collections.singleton(labelPath), Type.PATHS);
+ labels.removeProperty(existing.getName());
} else {
throw new LabelExistsVersionException("Version label '"
+ oakVersionLabel + "' already exists on this version
history");
}
}
- String labelPath = PathUtils.concat(versionHistoryOakRelPath,
- JCR_VERSIONLABELS, oakVersionLabel,
checkNotNull(versionOakName));
- versionStorage.getTree().setProperty(REP_ADD_VERSION_LABELS,
- Collections.singleton(labelPath), Type.PATHS);
+ labels.setProperty(oakVersionLabel, versionIdentifier, Type.REFERENCE);
try {
sessionDelegate.commit(versionStorage.getRoot());
refresh();
@@ -223,10 +213,7 @@ public class ReadWriteVersionManager ext
throw new VersionException("Version label " + oakVersionLabel +
" does not exist on this version history");
}
- String labelPath = PathUtils.concat(versionHistoryOakRelPath,
- JCR_VERSIONLABELS, oakVersionLabel, "dummy");
- versionStorage.getTree().setProperty(REP_REMOVE_VERSION_LABELS,
- Collections.singleton(labelPath), Type.PATHS);
+ labels.removeProperty(oakVersionLabel);
try {
sessionDelegate.commit(versionStorage.getRoot());
refresh();
@@ -248,8 +235,7 @@ public class ReadWriteVersionManager ext
if (!version.exists()) {
throw new VersionException("Version " + oakVersionName + " does
not exist on this version history");
}
- String versionPath = PathUtils.concat(versionHistoryOakRelPath,
oakVersionName);
- versionStorage.getTree().setProperty(REP_REMOVE_VERSION,
Collections.singleton(versionPath), Type.PATHS);
+ version.remove();
try {
sessionDelegate.commit(versionStorage.getRoot());
refresh();
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
Wed Oct 15 08:26:48 2014
@@ -69,6 +69,7 @@ public class TestContentLoader {
}
AccessControlUtils.addAccessControlEntry(session, "/",
EveryonePrincipal.getInstance(), new String[]{Privilege.JCR_READ}, true);
+ AccessControlUtils.addAccessControlEntry(session, "/jcr:system",
EveryonePrincipal.getInstance(), new String[]{Privilege.JCR_READ}, false);
session.save();
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
Wed Oct 15 08:26:48 2014
@@ -18,7 +18,7 @@ package org.apache.jackrabbit.oak.jcr.se
import java.security.Principal;
import java.util.Collections;
-import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -32,8 +32,9 @@ import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
+import javax.jcr.security.AccessControlEntry;
+import javax.jcr.security.AccessControlList;
import javax.jcr.security.AccessControlManager;
-import javax.jcr.security.AccessControlPolicy;
import javax.jcr.security.Privilege;
import org.apache.jackrabbit.api.JackrabbitSession;
@@ -42,12 +43,14 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
-import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
import org.apache.jackrabbit.test.NotExecutableException;
import org.apache.jackrabbit.test.api.security.AbstractAccessControlTest;
import org.junit.After;
import org.junit.Before;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
import static org.junit.Assert.assertArrayEquals;
/**
@@ -78,7 +81,7 @@ public abstract class AbstractEvaluation
protected Session testSession;
protected AccessControlManager testAcMgr;
- private Set<String> toClear = new HashSet<String>();
+ private List<ACL> toRestore = Lists.newArrayList();
@Override
@Before
@@ -116,8 +119,6 @@ public abstract class AbstractEvaluation
childchildPPath = ccp1.getPath();
siblingPath = n2.getPath();
- // setup default permissions
- AccessControlUtils.addAccessControlEntry(superuser, "/",
EveryonePrincipal.getInstance(), privilegesFromName(Privilege.JCR_READ), true);
superuser.save();
testSession = createTestSession();
@@ -139,14 +140,13 @@ public abstract class AbstractEvaluation
testSession.logout();
}
superuser.refresh(false);
- for (String path : toClear) {
- if (path != null && superuser.nodeExists(path)) {
- AccessControlPolicy[] policies = acMgr.getPolicies(path);
- for (AccessControlPolicy policy : policies) {
- acMgr.removePolicy(path, policy);
- }
+ // restore in reverse order
+ for (ACL acl : Lists.reverse(toRestore)) {
+ if (acl.path == null || superuser.nodeExists(acl.path)) {
+ restoreAces(acl);
}
}
+ toRestore.clear();
if (testGroup != null) {
testGroup.remove();
}
@@ -225,6 +225,9 @@ public abstract class AbstractEvaluation
}
protected JackrabbitAccessControlList modify(String path, Principal
principal, Privilege[] privileges, boolean isAllow, Map<String, Value>
restrictions) throws Exception {
+ // remember for restore during tearDown
+ toRestore.add(getACL(path));
+
JackrabbitAccessControlList tmpl =
AccessControlUtils.getAccessControlList(acMgr, path);
tmpl.addEntry(principal, privileges, isAllow, restrictions);
@@ -232,8 +235,6 @@ public abstract class AbstractEvaluation
superuser.save();
testSession.refresh(false);
- // remember for clean up during tearDown
- toClear.add(tmpl.getPath());
return tmpl;
}
@@ -270,4 +271,36 @@ public abstract class AbstractEvaluation
throws Exception {
return modify(nPath, principal, privileges, false, EMPTY_RESTRICTIONS);
}
+
+ private ACL getACL(String path) throws RepositoryException {
+ return new ACL(path,
AccessControlUtils.getAccessControlList(superuser, path));
+ }
+
+ private void restoreAces(ACL restore) throws RepositoryException {
+ AccessControlList acl =
AccessControlUtils.getAccessControlList(superuser, path);
+ if (acl != null) {
+ for (AccessControlEntry ace : acl.getAccessControlEntries()) {
+ acl.removeAccessControlEntry(ace);
+ }
+ for (AccessControlEntry ace : restore.entries) {
+ acl.addAccessControlEntry(ace.getPrincipal(),
ace.getPrivileges());
+ }
+ acMgr.setPolicy(path, acl);
+ superuser.save();
+ }
+ }
+
+ private static final class ACL {
+
+ private final String path;
+ private final Set<AccessControlEntry> entries = Sets.newHashSet();
+
+ ACL(String path, AccessControlList list)
+ throws RepositoryException {
+ this.path = path;
+ if (list != null) {
+ Collections.addAll(entries, list.getAccessControlEntries());
+ }
+ }
+ }
}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
Wed Oct 15 08:26:48 2014
@@ -17,7 +17,6 @@
package org.apache.jackrabbit.oak.jcr.security.authorization;
import java.security.Principal;
-import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.jcr.Node;
@@ -26,11 +25,9 @@ import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.security.AccessControlEntry;
-import javax.jcr.security.AccessControlList;
import javax.jcr.security.Privilege;
import javax.jcr.util.TraversingItemVisitor;
-import com.google.common.collect.Sets;
import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
import org.apache.jackrabbit.api.security.user.Group;
import
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
@@ -144,37 +141,12 @@ public class ReadTest extends AbstractEv
@Test
public void testDenyRoot() throws Exception {
- Set<AccessControlEntry> acesBefore = getACEs("/");
try {
deny("/", readPrivileges);
testSession.getRootNode();
fail("root should not be accessible");
} catch (Exception e) {
// expected exception
- } finally {
- restoreAces("/", acesBefore);
- }
- }
-
- private Set<AccessControlEntry> getACEs(String path) throws
RepositoryException {
- AccessControlList acl =
AccessControlUtils.getAccessControlList(superuser, path);
- Set<AccessControlEntry> acesBefore = Sets.newHashSet();
- if (acl != null) {
- Collections.addAll(acesBefore, acl.getAccessControlEntries());
- }
- return acesBefore;
- }
-
- private void restoreAces(String path, Set<AccessControlEntry> acesToKeep)
throws RepositoryException {
- AccessControlList acl =
AccessControlUtils.getAccessControlList(superuser, path);
- if (acl != null) {
- for (AccessControlEntry ace : acl.getAccessControlEntries()) {
- if (!acesToKeep.contains(ace)) {
- acl.removeAccessControlEntry(ace);
- }
- }
- acMgr.setPolicy("/", acl);
- superuser.save();
}
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
Wed Oct 15 08:26:48 2014
@@ -24,7 +24,6 @@ import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.query.Query;
-import javax.jcr.security.AccessControlEntry;
import javax.jcr.security.Privilege;
import com.google.common.collect.Lists;
@@ -35,6 +34,7 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.commons.JcrUtils;
import
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
@@ -57,6 +57,16 @@ public class UserManagementTest extends
private List<String> authorizablesToRemove = Lists.newArrayList(userId,
groupId);
@Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // setup default permissions
+ String authPath = "/rep:security/rep:authorizables";
+ AccessControlUtils.addAccessControlEntry(superuser, authPath,
EveryonePrincipal.getInstance(), privilegesFromName(Privilege.JCR_READ), true);
+ superuser.save();
+ }
+
+ @Override
@Before
public void tearDown() throws Exception {
try {
@@ -71,20 +81,6 @@ public class UserManagementTest extends
}
}
- JackrabbitAccessControlList acl =
AccessControlUtils.getAccessControlList(acMgr, "/");
- if (acl != null) {
- boolean modified = false;
- for (AccessControlEntry entry : acl.getAccessControlEntries())
{
- if (testUser.getPrincipal().equals(entry.getPrincipal())) {
- acl.removeAccessControlEntry(entry);
- modified = true;
- }
- }
- if (modified) {
- acMgr.setPolicy("/", acl);
- }
- }
-
superuser.save();
} finally {
super.tearDown();
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
Wed Oct 15 08:26:48 2014
@@ -48,7 +48,9 @@ public class VersionManagementTest exten
super.setUp();
versionPrivileges =
privilegesFromName(Privilege.JCR_VERSION_MANAGEMENT);
- assertFalse(testAcMgr.hasPrivileges(VERSIONSTORE, versionPrivileges));
+ // must not see version storage or must not have version privilege
+ assertTrue(!testSession.nodeExists(VERSIONSTORE)
+ || !testAcMgr.hasPrivileges(VERSIONSTORE, versionPrivileges));
}
private Node createVersionableNode(Node parent) throws Exception {
@@ -321,6 +323,30 @@ public class VersionManagementTest exten
* @since oak
*/
@Test
+ public void testRemoveVersionLabel() throws Exception {
+ Node n = createVersionableNode(superuser.getNode(path));
+ allow(n.getPath(), versionPrivileges);
+
+ Node testNode = testSession.getNode(n.getPath());
+ Version v = testNode.checkin();
+ testNode.checkout();
+ Version v2 = testNode.checkin();
+ testNode.checkout();
+
+ // -> VersionHistory.addVersionLabel must be allowed
+ VersionHistory history = testNode.getVersionHistory();
+ history.addVersionLabel(v.getName(), "testLabel", false);
+ history.addVersionLabel(v2.getName(), "testLabel", true);
+
+ VersionManager vMgr = testSession.getWorkspace().getVersionManager();
+ history = vMgr.getVersionHistory(testNode.getPath());
+ history.removeVersionLabel("testLabel");
+ }
+
+ /**
+ * @since oak
+ */
+ @Test
public void testVersionablePath() throws Exception {
Node n = createVersionableNode(superuser.getNode(path));