Author: jukka
Date: Tue Jul 23 05:47:16 2013
New Revision: 1505899
URL: http://svn.apache.org/r1505899
Log:
OAK-767: Implement Node#removeMixin
Modified:
jackrabbit/oak/trunk/oak-jcr/pom.xml
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AccessControlManagementTest.java
Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1505899&r1=1505898&r2=1505899&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Tue Jul 23 05:47:16 2013
@@ -254,9 +254,6 @@
org.apache.jackrabbit.test.api.lock.LockTest#testCheckedInUnlock
org.apache.jackrabbit.test.api.observation.GetUserDataTest#testVersioning
-
org.apache.jackrabbit.oak.jcr.security.authorization.AccessControlManagementTest#testRemoveMixin
<!-- OAK-767 -->
-
org.apache.jackrabbit.oak.jcr.security.authorization.NodeTypeManagementTest#testRemoveMixin
<!-- OAK-767 -->
-
org.apache.jackrabbit.oak.jcr.security.authorization.NodeTypeManagementTest#testRemoveMixinWithoutPermission
<!-- OAK-767 -->
org.apache.jackrabbit.oak.jcr.security.authorization.NodeTypeManagementTest#testCopy
<!-- OAK-711 -->
org.apache.jackrabbit.oak.jcr.security.authorization.NodeTypeManagementTest#testWorkspaceMove
<!-- OAK-711 -->
org.apache.jackrabbit.oak.jcr.security.authorization.NodeTypeManagementTest#testSessionMove
<!-- OAK-711 -->
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1505899&r1=1505898&r2=1505899&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
Tue Jul 23 05:47:16 2013
@@ -54,7 +54,6 @@ import javax.jcr.Value;
import javax.jcr.Workspace;
import javax.jcr.lock.Lock;
import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.nodetype.NodeDefinition;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
@@ -68,7 +67,6 @@ import com.google.common.collect.Immutab
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
-import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.commons.ItemNameMatcher;
import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
@@ -867,7 +865,8 @@ public class NodeImpl<T extends NodeDele
protected void checkPreconditions() throws RepositoryException {
super.checkPreconditions();
if (!isCheckedOut()) {
- throw new VersionException("Cannot add mixin type. Node is
checked in.");
+ throw new VersionException(
+ "Cannot add mixin type. Node is checked in.");
}
}
@Override
@@ -879,25 +878,21 @@ public class NodeImpl<T extends NodeDele
}
@Override
- public void removeMixin(final String mixinName) throws RepositoryException
{
+ public void removeMixin(String mixinName) throws RepositoryException {
+ final String oakTypeName = getOakName(checkNotNull(mixinName));
perform(new ItemWriteOperation<Void>() {
@Override
protected void checkPreconditions() throws RepositoryException {
super.checkPreconditions();
if (!isCheckedOut()) {
- throw new VersionException("Cannot remove mixin type. Node
is checked in.");
+ throw new VersionException(
+ "Cannot remove mixin type. Node is checked in.");
}
}
@Override
public Void perform() throws RepositoryException {
- PropertyDelegate propDlg =
dlg.getPropertyOrNull(JcrConstants.JCR_MIXINTYPES);
- String oakName = getOakName(mixinName);
- if (propDlg == null ||
!ImmutableSet.copyOf(propDlg.getPropertyState().getValue(Type.NAMES)).contains(oakName))
{
- throw new NoSuchNodeTypeException("Mixin " + mixinName +"
not contained in " + this);
- }
-
- // TODO: implement #removeMixin (OAK-767)
- throw new ConstraintViolationException();
+ dlg.removeMixin(oakTypeName);
+ return null;
}
});
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java?rev=1505899&r1=1505898&r2=1505899&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
Tue Jul 23 05:47:16 2013
@@ -47,6 +47,7 @@ import static com.google.common.collect.
import static com.google.common.collect.Iterators.transform;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
+import static com.google.common.collect.Sets.newLinkedHashSet;
import static org.apache.jackrabbit.JcrConstants.JCR_ISMIXIN;
import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_MULTIPLE;
@@ -57,6 +58,7 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.JcrConstants.JCR_SAMENAMESIBLINGS;
import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
import static org.apache.jackrabbit.JcrConstants.NT_BASE;
+import static org.apache.jackrabbit.oak.api.Type.NAMES;
import static org.apache.jackrabbit.oak.api.Type.UNDEFINED;
import static org.apache.jackrabbit.oak.api.Type.UNDEFINEDS;
import static org.apache.jackrabbit.oak.commons.PathUtils.dropIndexFromName;
@@ -64,12 +66,15 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES;
+import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_CHILD_NODE_DEFINITIONS;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_PROPERTY_DEFINITIONS;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_CHILD_NODES;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_PROPERTIES;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_CHILD_NODE_DEFINITIONS;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_PROPERTY_DEFINITIONS;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_SUPERTYPES;
+import static org.apache.jackrabbit.oak.util.TreeUtil.getBoolean;
+import static org.apache.jackrabbit.oak.util.TreeUtil.getNames;
/**
* {@code NodeDelegate} serve as internal representations of {@code Node}s.
@@ -369,6 +374,55 @@ public class NodeDelegate extends ItemDe
TreeUtil.addMixin(getTree(), typeName,
sessionDelegate.getRoot().getTree(NODE_TYPES_PATH), getUserID());
}
+ public void removeMixin(String typeName) throws RepositoryException {
+ Tree tree = getTree();
+ Set<String> mixins = newLinkedHashSet(getNames(tree, JCR_MIXINTYPES));
+ if (!mixins.remove(typeName)) {
+ throw new NoSuchNodeTypeException(
+ "Mixin " + typeName +" not contained in " + getPath());
+ }
+ tree.setProperty(JCR_MIXINTYPES, mixins, NAMES);
+
+ // We need to remove all protected properties and child nodes
+ // associated with the removed mixin type, as there's no way for
+ // the client to do that. Other items defined in this mixin type
+ // might also need to be removed, but it's probably best to let
+ // the client take care of that before save(), as it's hard to tell
+ // whether removing such items really is the right thing to do.
+
+ Tree types = sessionDelegate.getRoot().getTree(NODE_TYPES_PATH);
+ Tree type = types.getChild(typeName);
+
+ Tree properties = type.getChild(OAK_NAMED_PROPERTY_DEFINITIONS);
+ for (Tree definitions : properties.getChildren()) {
+ String name = definitions.getName();
+ if (name.equals("oak:primaryType")
+ || name.equals("oak:mixinTypes")) {
+ continue;
+ } else if (name.equals("oak:uuid")) {
+ name = JCR_UUID;
+ }
+ for (Tree definition : definitions.getChildren()) {
+ if (getBoolean(definition, JCR_PROTECTED)) {
+ tree.removeProperty(name);
+ }
+ }
+ }
+
+ Tree childNodes = type.getChild(OAK_NAMED_CHILD_NODE_DEFINITIONS);
+ for (Tree definitions : childNodes.getChildren()) {
+ String name = definitions.getName();
+ for (Tree definition : definitions.getChildren()) {
+ if (getBoolean(definition, JCR_PROTECTED)) {
+ Tree child = tree.getChild(name);
+ if (child.exists()) {
+ child.remove();
+ }
+ }
+ }
+ }
+ }
+
/**
* Set a property
*
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1505899&r1=1505898&r2=1505899&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
Tue Jul 23 05:47:16 2013
@@ -46,7 +46,6 @@ import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
-import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NodeDefinition;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
@@ -1778,11 +1777,7 @@ public class RepositoryTest extends Abst
session2.logout();
}
- try {
- testNode.removeMixin("mix:test");
- fail("Expected ConstraintViolationException");
- } catch (ConstraintViolationException expected) {
- }
+ testNode.removeMixin("mix:test");
}
@Test
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AccessControlManagementTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AccessControlManagementTest.java?rev=1505899&r1=1505898&r2=1505899&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AccessControlManagementTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AccessControlManagementTest.java
Tue Jul 23 05:47:16 2013
@@ -500,7 +500,6 @@ public class AccessControlManagementTest
testSession.save();
}
- @Ignore("OAK-767 : Implement Node#removeMixin")
@Test
public void testRemoveMixin() throws Exception {
Node n = superuser.getNode(path);