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 459EB1054B for ; Wed, 19 Jun 2013 15:44:26 +0000 (UTC) Received: (qmail 86155 invoked by uid 500); 19 Jun 2013 15:44:25 -0000 Delivered-To: apmail-jackrabbit-oak-commits-archive@jackrabbit.apache.org Received: (qmail 86118 invoked by uid 500); 19 Jun 2013 15:44:25 -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-dev@jackrabbit.apache.org Delivered-To: mailing list oak-commits@jackrabbit.apache.org Received: (qmail 86107 invoked by uid 99); 19 Jun 2013 15:44:25 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Jun 2013 15:44:25 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_FILL_THIS_FORM_SHORT 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, 19 Jun 2013 15:44:24 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 719F12388A6C; Wed, 19 Jun 2013 15:44:05 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1494662 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ Date: Wed, 19 Jun 2013 15:44:05 -0000 To: oak-commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130619154405.719F12388A6C@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jukka Date: Wed Jun 19 15:44:04 2013 New Revision: 1494662 URL: http://svn.apache.org/r1494662 Log: OAK-702: Optimize access to node type information Replace the getDefinition() lookups in Property.setValue() by looking at the existing property type Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStates.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStates.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStates.java?rev=1494662&r1=1494661&r2=1494662&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStates.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStates.java Wed Jun 19 15:44:04 2013 @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugins.memory; import java.math.BigDecimal; +import java.util.Calendar; import java.util.List; import javax.annotation.Nonnull; @@ -34,8 +35,6 @@ import org.apache.jackrabbit.oak.api.Typ import org.apache.jackrabbit.oak.plugins.value.Conversions; import org.apache.jackrabbit.oak.plugins.value.ValueImpl; -import static org.apache.jackrabbit.oak.api.Type.STRINGS; - /** * Utility class for creating {@link PropertyState} instances. */ @@ -87,13 +86,20 @@ public final class PropertyStates { * @throws RepositoryException forwarded from {@code value} */ @Nonnull - public static PropertyState createProperty(String name, Iterable values) throws RepositoryException { + public static PropertyState createProperty( + String name, Iterable values) + throws RepositoryException { + int type = PropertyType.STRING; Value first = Iterables.getFirst(values, null); - if (first == null) { - return EmptyPropertyState.emptyProperty(name, STRINGS); + if (first != null) { + type = first.getType(); } + return createProperty(name, values, type); + } - int type = first.getType(); + public static PropertyState createProperty( + String name, Iterable values, int type) + throws RepositoryException { switch (type) { case PropertyType.STRING: List strings = Lists.newArrayList(); @@ -272,6 +278,8 @@ public final class PropertyStates { return LongPropertyState.createLongProperty(name, (long) (Integer) value); } else if (value instanceof Double) { return DoublePropertyState.doubleProperty(name, (Double) value); + } else if (value instanceof Calendar) { + return LongPropertyState.createDateProperty(name, (Calendar) value); } else if (value instanceof Boolean) { return BooleanPropertyState.booleanProperty(name, (Boolean) value); } else if (value instanceof BigDecimal) { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java?rev=1494662&r1=1494661&r2=1494662&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java Wed Jun 19 15:44:04 2013 @@ -27,9 +27,11 @@ import javax.jcr.Binary; import javax.jcr.Node; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; +import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.Value; import javax.jcr.ValueFactory; import javax.jcr.ValueFormatException; +import javax.jcr.nodetype.NodeType; import com.google.common.collect.Lists; import org.apache.jackrabbit.oak.api.Blob; @@ -179,8 +181,12 @@ public class ValueFactoryImpl implements return createValue(value, false); } - @Override + @Override @SuppressWarnings("deprecation") public Value createValue(Node value, boolean weak) throws RepositoryException { + if (!value.isNodeType(NodeType.MIX_REFERENCEABLE)) { + throw new ValueFormatException( + "Node is not referenceable: " + value.getPath()); + } return weak ? new ValueImpl(GenericPropertyState.weakreferenceProperty("", value.getUUID()), namePathMapper) : new ValueImpl(GenericPropertyState.referenceProperty("", value.getUUID()), namePathMapper); Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java?rev=1494662&r1=1494661&r2=1494662&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java Wed Jun 19 15:44:04 2013 @@ -16,8 +16,12 @@ */ package org.apache.jackrabbit.oak.jcr; -import static com.google.common.base.Preconditions.checkNotNull; -import static javax.jcr.PropertyType.UNDEFINED; +import static com.google.common.collect.Lists.newArrayListWithCapacity; +import static org.apache.jackrabbit.oak.api.Type.NAME; +import static org.apache.jackrabbit.oak.api.Type.NAMES; +import static org.apache.jackrabbit.oak.api.Type.PATH; +import static org.apache.jackrabbit.oak.api.Type.PATHS; +import static org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty; import java.io.InputStream; import java.math.BigDecimal; @@ -35,23 +39,22 @@ import javax.jcr.Property; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; +import javax.jcr.ValueFactory; import javax.jcr.ValueFormatException; import javax.jcr.nodetype.PropertyDefinition; import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.api.Tree.Status; +import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate; import org.apache.jackrabbit.oak.jcr.delegate.PropertyDelegate; import org.apache.jackrabbit.oak.plugins.value.ValueFactoryImpl; import org.apache.jackrabbit.value.ValueHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * TODO document */ public class PropertyImpl extends ItemImpl implements Property { - private static final Logger log = LoggerFactory.getLogger(PropertyImpl.class); private static final Value[] NO_VALUES = new Value[0]; @@ -124,7 +127,7 @@ public class PropertyImpl extends ItemIm @Override public void setValue(Value value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { internalSetValue(value); } @@ -133,88 +136,94 @@ public class PropertyImpl extends ItemIm @Override public void setValue(final Value[] values) throws RepositoryException { if (values == null) { - internalRemove(); + remove(); } else { - internalSetValues(values, ValueHelper.getType(values)); + internalSetValue(values); } } @Override public void setValue(String value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } } @Override - public void setValue(String[] values) throws RepositoryException { - if (values == null) { - internalRemove(); + public void setValue(String[] strings) throws RepositoryException { + if (strings == null) { + remove(); } else { - Value[] vs = ValueHelper.convert(values, PropertyType.STRING, getValueFactory()); - internalSetValues(vs, UNDEFINED); + ValueFactory factory = getValueFactory(); + Value[] values = new Value[strings.length]; + for (int i = 0; i < strings.length; i++) { + if (strings[i] != null) { + values[i] = factory.createValue(strings[i]); + } + } + internalSetValue(values); } } - @Override + @Override @SuppressWarnings("deprecation") public void setValue(InputStream value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } } @Override public void setValue(Binary value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } } @Override public void setValue(long value) throws RepositoryException { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } @Override public void setValue(double value) throws RepositoryException { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } @Override public void setValue(BigDecimal value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } } @Override public void setValue(Calendar value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } } @Override public void setValue(boolean value) throws RepositoryException { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } @Override public void setValue(Node value) throws RepositoryException { if (value == null) { - internalRemove(); + remove(); } else { - internalSetValue(getValueFactory().createValue(value)); + setValue(getValueFactory().createValue(value)); } } @@ -427,43 +436,80 @@ public class PropertyImpl extends ItemIm } } - private void internalRemove() throws RepositoryException { - perform(new ItemWriteOperation() { - @Override - protected Void perform() throws RepositoryException { - dlg.remove(); - return null; - } - }); - } - - private void internalSetValue(@Nonnull final Value value) + private void internalSetValue(final @Nonnull Value value) throws RepositoryException { - checkNotNull(value); perform(new ItemWriteOperation() { @Override protected Void perform() throws RepositoryException { - // TODO: Avoid extra JCR method calls (OAK-672) - PropertyDefinition definition = internalGetDefinition(); - PropertyState state = createSingleState(dlg.getName(), value, definition); + Type type = dlg.getPropertyState().getType(); + if (type.isArray()) { + throw new ValueFormatException( + "This is a multi-valued property"); + } + + Value converted = ValueHelper.convert( + value, type.tag(), getValueFactory()); + + PropertyState state; + if (type == NAME) { + String name = getOakName(converted.getString()); + state = createProperty(dlg.getName(), name, NAME); + } else if (type == PATH) { + String path = getOakPathOrThrow(converted.getString()); + state = createProperty(dlg.getName(), path, PATH); + } else { + state = createProperty(dlg.getName(), converted); + } + dlg.setState(state); return null; } }); } - private void internalSetValues(@Nonnull final Value[] values, final int type) throws RepositoryException { - checkNotNull(values); + private void internalSetValue(final @Nonnull Value[] values) + throws RepositoryException { perform(new ItemWriteOperation() { @Override protected Void perform() throws RepositoryException { - // TODO: Avoid extra JCR method calls (OAK-672) - PropertyDefinition definition = internalGetDefinition(); - PropertyState state = createMultiState(dlg.getName(), type, values, definition); + Type type = dlg.getPropertyState().getType(); + if (!type.isArray()) { + throw new ValueFormatException( + "This is a single-valued property"); + } + + List converted = newArrayListWithCapacity(values.length); + ValueFactory factory = getValueFactory(); + for (int i = 0; i < values.length; i++) { + if (values[i] != null) { + converted.add(ValueHelper.convert( + values[i], type.tag(), factory)); + } + } + + PropertyState state; + if (type == NAMES) { + List names = + newArrayListWithCapacity(converted.size()); + for (Value name : converted) { + names.add(getOakName(name.getString())); + } + state = createProperty(dlg.getName(), names, NAMES); + } else if (type == PATHS) { + List paths = + newArrayListWithCapacity(converted.size()); + for (Value path : converted) { + paths.add(getOakPathOrThrow(path.getString())); + } + state = createProperty(dlg.getName(), paths, PATHS); + } else { + state = createProperty(dlg.getName(), converted, type.tag()); + } + dlg.setState(state); return null; } }); } -} \ No newline at end of file +}