You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/06/19 17:44:05 UTC
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/
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<Value> values) throws RepositoryException {
+ public static PropertyState createProperty(
+ String name, Iterable<Value> 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<Value> values, int type)
+ throws RepositoryException {
switch (type) {
case PropertyType.STRING:
List<String> 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<PropertyDelegate> 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<Void>() {
- @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<Void>() {
@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<Void>() {
@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<Value> 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<String> names =
+ newArrayListWithCapacity(converted.size());
+ for (Value name : converted) {
+ names.add(getOakName(name.getString()));
+ }
+ state = createProperty(dlg.getName(), names, NAMES);
+ } else if (type == PATHS) {
+ List<String> 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
+}