[jira] [Commented] (SLING-3351) org.apache.sling.jcr.resource.JcrResourceUtil.setProperty method doesn't handle primitive arrays

2014-01-30 Thread Alexei Krainiouk (JIRA)

[ 
https://issues.apache.org/jira/browse/SLING-3351?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanelfocusedCommentId=13886614#comment-13886614
 ] 

Alexei Krainiouk commented on SLING-3351:
-

Sorry for not submitting proper patch, - I was having troubles checking out 
your project yesterday.

 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
Affects Versions: JCR Resource 2.2.8
Reporter: Alexei Krainiouk
Assignee: Carsten Ziegeler
 Fix For: JCR Resource 2.3.0


 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 
 http://svn.apache.org/repos/asf/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/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; ilength; 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)


[jira] [Commented] (SLING-3351) org.apache.sling.jcr.resource.JcrResourceUtil.setProperty method doesn't handle primitive arrays

2014-01-29 Thread Carsten Ziegeler (JIRA)

[ 
https://issues.apache.org/jira/browse/SLING-3351?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanelfocusedCommentId=13886342#comment-13886342
 ] 

Carsten Ziegeler commented on SLING-3351:
-

Thanks for the patch, Alexei. It's applied

 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
Affects Versions: JCR Resource 2.2.8
Reporter: Alexei Krainiouk
Assignee: Carsten Ziegeler
 Fix For: JCR Resource 2.3.0


 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 
 http://svn.apache.org/repos/asf/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/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; ilength; 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)