Return-Path: X-Original-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Delivered-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 22836CFF9 for ; Wed, 6 Jun 2012 15:36:03 +0000 (UTC) Received: (qmail 94682 invoked by uid 500); 6 Jun 2012 15:36:03 -0000 Delivered-To: apmail-jackrabbit-oak-commits-archive@jackrabbit.apache.org Received: (qmail 94660 invoked by uid 500); 6 Jun 2012 15:36:03 -0000 Mailing-List: contact oak-commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: oak-commits@jackrabbit.apache.org Delivered-To: mailing list oak-commits@jackrabbit.apache.org Received: (qmail 94641 invoked by uid 99); 6 Jun 2012 15:36:03 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Jun 2012 15:36:03 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Jun 2012 15:36:01 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 4C3702388962; Wed, 6 Jun 2012 15:35:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1346952 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Date: Wed, 06 Jun 2012 15:35:41 -0000 To: oak-commits@jackrabbit.apache.org From: reschke@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120606153541.4C3702388962@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: reschke Date: Wed Jun 6 15:35:40 2012 New Revision: 1346952 URL: http://svn.apache.org/viewvc?rev=1346952&view=rev Log: OAK-66: add more support for addMixin/canAddMixin/removeMixin Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java 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=1346952&r1=1346951&r2=1346952&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 Wed Jun 6 15:35:40 2012 @@ -16,21 +16,16 @@ */ package org.apache.jackrabbit.oak.jcr; -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; -import org.apache.jackrabbit.oak.api.CoreValue; -import org.apache.jackrabbit.oak.api.Tree.Status; -import org.apache.jackrabbit.oak.commons.PathUtils; -import org.apache.jackrabbit.oak.jcr.value.ValueConverter; -import org.apache.jackrabbit.oak.namepath.NameMapper; -import org.apache.jackrabbit.oak.util.Function1; -import org.apache.jackrabbit.oak.util.Iterators; -import org.apache.jackrabbit.oak.util.Predicate; -import org.apache.jackrabbit.value.ValueHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static org.apache.jackrabbit.oak.util.Iterators.filter; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; import javax.annotation.Nonnull; import javax.jcr.Binary; @@ -50,22 +45,29 @@ import javax.jcr.UnsupportedRepositoryOp import javax.jcr.Value; 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; import javax.jcr.version.OnParentVersionAction; import javax.jcr.version.Version; import javax.jcr.version.VersionHistory; -import java.io.InputStream; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; -import static org.apache.jackrabbit.oak.util.Iterators.filter; +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; +import org.apache.jackrabbit.oak.api.CoreValue; +import org.apache.jackrabbit.oak.api.Tree.Status; +import org.apache.jackrabbit.oak.commons.PathUtils; +import org.apache.jackrabbit.oak.jcr.value.ValueConverter; +import org.apache.jackrabbit.oak.namepath.NameMapper; +import org.apache.jackrabbit.oak.util.Function1; +import org.apache.jackrabbit.oak.util.Iterators; +import org.apache.jackrabbit.oak.util.Predicate; +import org.apache.jackrabbit.value.ValueHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * {@code NodeImpl}... @@ -760,27 +762,36 @@ public class NodeImpl extends ItemImpl i // TODO: figure out the right place for this check NodeTypeManager ntm = sessionDelegate.getNodeTypeManager(); NodeType nt = ntm.getNodeType(mixinName); // throws on not found - - if (nt.isNodeType(NodeType.MIX_REFERENCEABLE)) { - setProperty(Property.JCR_UUID, UUID.randomUUID().toString()); - } // TODO: END String jcrMixinTypes = sessionDelegate.getOakPathOrThrow(Property.JCR_MIXIN_TYPES); PropertyDelegate mixins = dlg.getProperty(jcrMixinTypes); CoreValue cv = ValueConverter.toCoreValue(mixinName, PropertyType.NAME, sessionDelegate); + + boolean nodeModified = false; + if (mixins == null) { + nodeModified = true; dlg.setProperty(jcrMixinTypes, Collections.singletonList(cv)); } else { List values = new ArrayList(); - values.add(cv); for (CoreValue existingValue : mixins.getValues()) { if (!values.contains(existingValue)) { values.add(existingValue); } } - dlg.setProperty(jcrMixinTypes, values); + if (!values.contains(cv)) { + values.add(cv); + nodeModified = true; + dlg.setProperty(jcrMixinTypes, values); + } + } + + // TODO: hack -- make sure we assign a UUID + if (nodeModified && nt.isNodeType(NodeType.MIX_REFERENCEABLE)) { + String jcrUuid = sessionDelegate.getOakPathOrThrow(Property.JCR_UUID); + dlg.setProperty(jcrUuid, ValueConverter.toCoreValue(UUID.randomUUID().toString(), PropertyType.STRING, sessionDelegate)); } } @@ -788,17 +799,23 @@ public class NodeImpl extends ItemImpl i public void removeMixin(String mixinName) throws RepositoryException { checkStatus(); - // todo implement removeMixin + if (!isNodeType(mixinName)) { + throw new NoSuchNodeTypeException(); + } + + throw new ConstraintViolationException(); } @Override public boolean canAddMixin(String mixinName) throws RepositoryException { + checkStatus(); + // TODO: figure out the right place for this check NodeTypeManager ntm = sessionDelegate.getNodeTypeManager(); ntm.getNodeType(mixinName); // throws on not found // TODO: END - return false; + return isSupportedMixinName(mixinName); } @Override @@ -1123,4 +1140,12 @@ public class NodeImpl extends ItemImpl i return getTargetType(values[0], type); } } + + // TODO: hack to filter for a subset of supported mixins for now + // this allows exactly one (harmless) mixin type so that other code like + // addMixin gets test coverage + private boolean isSupportedMixinName(String mixinName) throws RepositoryException { + String oakName = sessionDelegate.getOakPathOrThrow(mixinName); + return "mix:title".equals(oakName); + } }