X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jackrabbit%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2FBeanNodeMapper.java;h=f066ce8f931a46ee099a4d03354da7a818e050ca;hb=f0e8b8dc680eb131d11e53180c3912ece49f37fc;hp=94a644bddb9452d990e490c24009a30f28ea283f;hpb=3049428581e087f337011c4a5095b68513e84721;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java index 94a644bdd..f066ce8f9 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java @@ -28,9 +28,7 @@ import org.argeo.ArgeoException; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; -//import org.springframework.beans.BeanWrapperImpl; - -public class BeanNodeMapper { +public class BeanNodeMapper implements NodeMapper, NodeMapperProvider { private final static Log log = LogFactory.getLog(BeanNodeMapper.class); private final static String NODE_VALUE = "value"; @@ -45,6 +43,17 @@ public class BeanNodeMapper { private ClassLoader classLoader = getClass().getClassLoader(); + private NodeMapperProvider nodeMapperProvider; + + public void update(Node node, Object obj) { + try { + beanToNode(createBeanWrapper(obj), node); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot update node " + node + " with " + + obj, e); + } + } + public String storagePath(Object obj) { String clss = obj.getClass().getName(); StringBuffer buf = new StringBuffer("/objects/"); @@ -59,16 +68,6 @@ public class BeanNodeMapper { public Node save(Session session, Object obj) { return save(session, storagePath(obj), obj); } - - public void update(Node node, Object obj) { - try { - beanToNode(createBeanWrapper(obj), node); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot update node " + node + " with " - + obj, e); - } - } - public Node save(Session session, String path, Object obj) { try { BeanWrapper beanWrapper = createBeanWrapper(obj); @@ -98,13 +97,28 @@ public class BeanNodeMapper { } } + public Object load(Node node) { + try { + return nodeToBean(node); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot load object from node " + node, e); + } + } + @SuppressWarnings("unchecked") + /** Transforms an object into a node*/ public Object nodeToBean(Node node) throws RepositoryException { + if (nodeMapperProvider != null) { + NodeMapper nodeMapper = nodeMapperProvider.findNodeMapper(node); + if (nodeMapper != null) { + return nodeMapper.load(node); + } + } String clssName = node.getProperty(classProperty).getValue() .getString(); - if (log.isDebugEnabled()) + if (log.isTraceEnabled()) log.debug("Map node " + node.getPath() + " to bean " + clssName); BeanWrapper beanWrapper = createBeanWrapper(loadClass(clssName)); @@ -120,7 +134,7 @@ public class BeanNodeMapper { .getName()); Class propClass = pd.getPropertyType(); - // list + // primitive list if (propClass != null && List.class.isAssignableFrom(propClass)) { List lst = new ArrayList(); Class valuesClass = classFromProperty(prop); @@ -147,8 +161,7 @@ public class BeanNodeMapper { PropertyDescriptor pd = beanWrapper.getPropertyDescriptor(name); Class propClass = pd.getPropertyType(); - log.debug(childNode.getName() + "=" + propClass); - + // objects list if (propClass != null && List.class.isAssignableFrom(propClass)) { String lstClass = childNode.getProperty(classProperty) .getString(); @@ -170,6 +183,7 @@ public class BeanNodeMapper { continue nodes; } + // objects map if (propClass != null && Map.class.isAssignableFrom(propClass)) { String mapClass = childNode.getProperty(classProperty) .getString(); @@ -223,7 +237,16 @@ public class BeanNodeMapper { protected void beanToNode(BeanWrapper beanWrapper, Node node) throws RepositoryException { - if (log.isDebugEnabled()) + + if (nodeMapperProvider != null) { + NodeMapper nodeMapper = nodeMapperProvider.findNodeMapper(node); + if (nodeMapper != null) { + nodeMapper.update(node, beanWrapper.getWrappedInstance()); + return; + } + } + + if (log.isTraceEnabled()) log.debug("Map bean to node " + node.getPath()); properties: for (PropertyDescriptor pd : beanWrapper @@ -477,6 +500,7 @@ public class BeanNodeMapper { } protected Class loadClass(String name) { + // log.debug("Class loader: " + classLoader); try { return classLoader.loadClass(name); } catch (ClassNotFoundException e) { @@ -484,6 +508,11 @@ public class BeanNodeMapper { } } + /** Returns itself. */ + public NodeMapper findNodeMapper(Node node) { + return this; + } + protected String propertyName(String name) { return name; } @@ -512,4 +541,8 @@ public class BeanNodeMapper { this.classLoader = classLoader; } + public void setNodeMapperProvider(NodeMapperProvider nodeMapperProvider) { + this.nodeMapperProvider = nodeMapperProvider; + } + }