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>();