From e9401f31819cd8bc7264a22bfe18ad1321cf05eb Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 30 Apr 2010 09:45:57 +0000 Subject: [PATCH] Fix list mapping git-svn-id: https://svn.argeo.org/commons/trunk@3548 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../java/org/argeo/jcr/BeanNodeMapper.java | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/BeanNodeMapper.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/BeanNodeMapper.java index a526bcf5e..d83ec73ca 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/BeanNodeMapper.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/BeanNodeMapper.java @@ -22,12 +22,14 @@ import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.ValueFactory; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; public class BeanNodeMapper implements NodeMapper { - // private final static Log log = LogFactory.getLog(BeanNodeMapper.class); + private final static Log log = LogFactory.getLog(BeanNodeMapper.class); private final static String NODE_VALUE = "value"; @@ -153,6 +155,8 @@ public class BeanNodeMapper implements NodeMapper { * Transforms a node into an object of the class defined by classProperty Property */ protected Object nodeToBean(Node node) throws RepositoryException { + if (log.isTraceEnabled()) + log.trace("Load " + node); try { String clssName = node.getProperty(classProperty).getValue() @@ -171,7 +175,10 @@ public class BeanNodeMapper implements NodeMapper { .getName()); Class propClass = pd.getPropertyType(); - // Process case of List and its derived classes + if (log.isTraceEnabled()) + log.trace("Load " + prop + ", propClass=" + propClass + + ", property descriptor=" + pd); + // primitive list if (propClass != null && List.class.isAssignableFrom(propClass)) { List lst = new ArrayList(); @@ -212,13 +219,30 @@ public class BeanNodeMapper implements NodeMapper { lst = new ArrayList(); } - NodeIterator valuesIt = childNode.getNodes(); - while (valuesIt.hasNext()) { - Node lstValueNode = valuesIt.nextNode(); - Object lstValue = nodeToBean(lstValueNode); - lst.add(lstValue); + if (childNode.hasNodes()) { + // Look for children nodes + NodeIterator valuesIt = childNode.getNodes(); + while (valuesIt.hasNext()) { + Node lstValueNode = valuesIt.nextNode(); + Object lstValue = nodeToBean(lstValueNode); + lst.add(lstValue); + } + } else { + // look for a property with the same name which will + // provide + // primitives + Property childProp = childNode.getProperty(childNode + .getName()); + Class valuesClass = classFromProperty(childProp); + if (valuesClass != null) + if (childProp.getDefinition().isMultiple()) + for (Value value : childProp.getValues()) { + lst.add(asObject(value, valuesClass)); + } + else + lst.add(asObject(childProp.getValue(), + valuesClass)); } - beanWrapper.setPropertyValue(name, lst); continue nodes; } -- 2.30.2