Author: rombert
Date: Wed Oct 1 21:08:21 2014
New Revision: 1628836
URL: http://svn.apache.org/r1628836
Log:
SLING-3979 - [tooling] multi valued properties are still not correctly
exported to the server
Use a better means of detecting whether the property definition matches
what we want to write and delete the existing property if it does not.
Modified:
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
Modified:
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java?rev=1628836&r1=1628835&r2=1628836&view=diff
==============================================================================
---
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
(original)
+++
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
Wed Oct 1 21:08:21 2014
@@ -80,19 +80,13 @@ public class AddOrUpdateNodeCommandTest
Property newProp =
session.getNode("/content").getProperty(PROP_NAME);
if (newPropertyValues instanceof String) {
- if (newProp.isMultiple()) {
- Value[] values =
session.getNode("/content").getProperty(PROP_NAME).getValues();
-
- assertThat(values.length, equalTo(1));
- assertThat(values[0].getString(),
equalTo(newPropertyValues));
-
- } else {
- assertThat(newProp.getString(), equalTo((String)
newPropertyValues));
- }
+ assertThat("property.isMultiple", newProp.isMultiple(),
equalTo(Boolean.FALSE));
+ assertThat(newProp.getString(), equalTo((String)
newPropertyValues));
} else {
String[] expectedValues = (String[]) newPropertyValues;
+ assertThat("property.isMultiple", newProp.isMultiple(),
equalTo(Boolean.TRUE));
Value[] values =
session.getNode("/content").getProperty(PROP_NAME).getValues();
Modified:
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
URL:
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java?rev=1628836&r1=1628835&r2=1628836&view=diff
==============================================================================
---
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
(original)
+++
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
Wed Oct 1 21:08:21 2014
@@ -51,6 +51,7 @@ import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.PropertyDefinition;
import org.apache.jackrabbit.vault.util.JcrConstants;
import org.apache.jackrabbit.vault.util.Text;
@@ -220,74 +221,54 @@ public class AddOrUpdateNodeCommand exte
continue;
}
- // TODO - we don't handle the case where the input no longer
matches the property definition, e.g. type
- // change or multiplicity change
-
- boolean isMultiple = property != null &&
property.getDefinition().isMultiple();
-
ValueFactory valueFactory = session.getValueFactory();
Value value = null;
Value[] values = null;
if (propertyValue instanceof String) {
- if (isMultiple) {
- values = toValueArray(new String[] { (String)
propertyValue }, session);
- } else {
- value = valueFactory.createValue((String) propertyValue);
- }
+ value = valueFactory.createValue((String) propertyValue);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.STRING, false);
} else if (propertyValue instanceof String[]) {
values = toValueArray((String[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.STRING, true);
} else if (propertyValue instanceof Boolean) {
- if (isMultiple) {
- values = toValueArray(new Boolean[] { (Boolean)
propertyValue }, session);
- } else {
- value = valueFactory.createValue((Boolean) propertyValue);
- }
+ value = valueFactory.createValue((Boolean) propertyValue);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.BOOLEAN, false);
} else if (propertyValue instanceof Boolean[]) {
values = toValueArray((Boolean[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.BOOLEAN, true);
} else if (propertyValue instanceof Calendar) {
- if (isMultiple) {
- values = toValueArray(new Calendar[] { (Calendar)
propertyValue }, session);
- } else {
- value = valueFactory.createValue((Calendar) propertyValue);
- }
+ value = valueFactory.createValue((Calendar) propertyValue);
+ ensurePropertyDefinitionMatchers(property, PropertyType.DATE,
false);
} else if (propertyValue instanceof Calendar[]) {
values = toValueArray((Calendar[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property, PropertyType.DATE,
true);
} else if (propertyValue instanceof Double) {
- if (isMultiple) {
- values = toValueArray(new Double[] { (Double)
propertyValue }, session);
- } else {
- value = valueFactory.createValue((Double) propertyValue);
- }
+ value = valueFactory.createValue((Double) propertyValue);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.DOUBLE, false);
} else if (propertyValue instanceof Double[]) {
values = toValueArray((Double[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.DOUBLE, true);
} else if (propertyValue instanceof BigDecimal) {
- if (isMultiple) {
- values = toValueArray(new BigDecimal[] { (BigDecimal)
propertyValue }, session);
- } else {
- value = valueFactory.createValue((BigDecimal)
propertyValue);
- }
+ value = valueFactory.createValue((BigDecimal) propertyValue);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.DECIMAL, false);
} else if (propertyValue instanceof BigDecimal[]) {
values = toValueArray((BigDecimal[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.DECIMAL, true);
} else if (propertyValue instanceof Long) {
- if (isMultiple) {
- values = toValueArray(new Long[] { (Long) propertyValue },
session);
- } else {
- value = valueFactory.createValue((Long) propertyValue);
- }
+ value = valueFactory.createValue((Long) propertyValue);
+ ensurePropertyDefinitionMatchers(property, PropertyType.LONG,
false);
} else if (propertyValue instanceof Long[]) {
values = toValueArray((Long[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property, PropertyType.LONG,
true);
// TODO - distinguish between weak vs strong references
} else if (propertyValue instanceof UUID) {
Node reference = session.getNodeByIdentifier(((UUID)
propertyValue).toString());
- if (isMultiple) {
- values = toValueArray(new UUID[] { (UUID) propertyValue },
session);
- } else {
- value = valueFactory.createValue(reference);
- }
-
+ value = valueFactory.createValue(reference);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.REFERENCE, false);
} else if (propertyValue instanceof UUID[]) {
values = toValueArray((UUID[]) propertyValue, session);
+ ensurePropertyDefinitionMatchers(property,
PropertyType.REFERENCE, true);
} else {
throw new IllegalArgumentException("Unable to handle value '"
+ propertyValue + "' for property '"
+ propertyName + "'");
@@ -299,11 +280,6 @@ public class AddOrUpdateNodeCommand exte
node.setProperty(propertyName, value);
getLogger().trace("Set property {0} with value {1} (raw =
{2}) on node at {3}", arguments);
} else if (values != null) {
- if (node.hasProperty(propertyName) &&
!node.getProperty(propertyName).isMultiple()) {
- getLogger().trace("Removing single-valued property {0}
since we need to set multiple values",
- propertyName);
- node.getProperty(propertyName).remove();
- }
Object[] arguments = { propertyName, values, propertyValue,
node.getPath() };
getLogger().trace("Setting property {0} with values {1} (raw =
{2}) on node at {3}", arguments);
node.setProperty(propertyName, values);
@@ -321,6 +297,28 @@ public class AddOrUpdateNodeCommand exte
}
+ private void ensurePropertyDefinitionMatchers(Property property, int
expectedType, boolean expectedMultiplicity)
+ throws RepositoryException {
+ if (property == null) {
+ return;
+ }
+
+ PropertyDefinition definition = property.getDefinition();
+ if (definition.getRequiredType() != expectedType) {
+ getLogger().trace("Removing property {0} of type {1} since we need
type {2}", property.getName(),
+ definition.getRequiredType(), expectedType);
+ property.remove();
+ return;
+ }
+
+ if (definition.isMultiple() != expectedMultiplicity) {
+ getLogger().trace("Removing property {0} of multiplicity {1} since
we need type {2}", property.getName(),
+ definition.isMultiple(), expectedMultiplicity);
+ property.remove();
+ return;
+ }
+ }
+
private void updateMixins(Node node, Object mixinValue) throws
RepositoryException {
List<String> newMixins = new ArrayList<String>();