[ https://issues.apache.org/jira/browse/SLING-3351?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexei Krainiouk updated SLING-3351: ------------------------------------ Description: org.apache.sling.jcr.resource.JcrResourceUtil.setProperty(Node, String, Object) method throws ClassCastException if primitive array is passed as a property value. The reason is that the method implementation attempts cast propertyValue parameter to Object[] directly after detecting that the property class is an array (see JcrResourceUtil.java lines 176:177): .... } else if ( propertyValue.getClass().isArray() ) { final Object[] values = (Object[])propertyValue; ..... This doesn't take into account that primitive arrays are not subclasses of Object[] thus leading to ClassCastException. Here is the fixed version of setProperty method: public static void setProperty(final Node node, final String propertyName, final Object propertyValue) throws RepositoryException { if ( propertyValue == null ) { node.setProperty(propertyName, (String)null); } else if ( propertyValue.getClass().isArray() ) { final int length = Array.getLength(propertyValue); final Value[] setValues = new Value[length]; for(int i=0; i<length; i++) { Object value = Array.get(propertyValue, i); setValues[i] = createValue(value, node.getSession()); } node.setProperty(propertyName, setValues); } else { node.setProperty(propertyName, createValue(propertyValue, node.getSession())); } } was: org.apache.sling.jcr.resource.JcrResourceUtil.setProperty(Node, String, Object) method throws ClassCastException if primitive array is passed as a property value. The reason is that the method implementation attempts cast propertyValue parameter to Object[] directly after detecting that the property class is an array (see JcrResourceUtil.java lines 176:177): {noformat} } else if ( propertyValue.getClass().isArray() ) { final Object[] values = (Object[])propertyValue; {noformat} This doesn't take into account that primitive arrays are not subclasses of Object[] thus leading to ClassCastException. Here is the fixed version of setProperty method: {noformat} public static void setProperty(final Node node, final String propertyName, final Object propertyValue) throws RepositoryException { if ( propertyValue == null ) { node.setProperty(propertyName, (String)null); } else if ( propertyValue.getClass().isArray() ) { final int length = Array.getLength(propertyValue); final Value[] setValues = new Value[length]; for(int i=0; i<length; i++) { Object value = Array.get(propertyValue, i); setValues[i] = createValue(value, node.getSession()); } node.setProperty(propertyName, setValues); } else { node.setProperty(propertyName, createValue(propertyValue, node.getSession())); } } {noformat} > org.apache.sling.jcr.resource.JcrResourceUtil.setProperty method doesn't > handle primitive arrays > ------------------------------------------------------------------------------------------------ > > Key: SLING-3351 > URL: https://issues.apache.org/jira/browse/SLING-3351 > Project: Sling > Issue Type: Bug > Components: JCR > Reporter: Alexei Krainiouk > > org.apache.sling.jcr.resource.JcrResourceUtil.setProperty(Node, String, > Object) method throws ClassCastException if primitive array is passed as a > property value. > The reason is that the method implementation attempts cast propertyValue > parameter to Object[] directly after detecting that the property class is an > array (see JcrResourceUtil.java lines 176:177): > .... > } else if ( propertyValue.getClass().isArray() ) { > final Object[] values = (Object[])propertyValue; > ..... > This doesn't take into account that primitive arrays are not subclasses of > Object[] thus leading to ClassCastException. > Here is the fixed version of setProperty method: > public static void setProperty(final Node node, > final String propertyName, > final Object propertyValue) > throws RepositoryException { > if ( propertyValue == null ) { > node.setProperty(propertyName, (String)null); > } else if ( propertyValue.getClass().isArray() ) { > final int length = Array.getLength(propertyValue); > final Value[] setValues = new Value[length]; > for(int i=0; i<length; i++) { > Object value = Array.get(propertyValue, i); > setValues[i] = createValue(value, node.getSession()); > } > node.setProperty(propertyName, setValues); > } else { > node.setProperty(propertyName, createValue(propertyValue, > node.getSession())); > } > } -- This message was sent by Atlassian JIRA (v6.1.5#6160)