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";
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/");
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);
}
}
+ 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));
.getName());
Class propClass = pd.getPropertyType();
- // list
+ // primitive list
if (propClass != null && List.class.isAssignableFrom(propClass)) {
List<Object> lst = new ArrayList<Object>();
Class<?> valuesClass = classFromProperty(prop);
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();
continue nodes;
}
+ // objects map
if (propClass != null && Map.class.isAssignableFrom(propClass)) {
String mapClass = childNode.getProperty(classProperty)
.getString();
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
}
protected Class<?> loadClass(String name) {
+ // log.debug("Class loader: " + classLoader);
try {
return classLoader.loadClass(name);
} catch (ClassNotFoundException e) {
}
}
+ /** Returns itself. */
+ public NodeMapper findNodeMapper(Node node) {
+ return this;
+ }
+
protected String propertyName(String name) {
return name;
}
this.classLoader = classLoader;
}
+ public void setNodeMapperProvider(NodeMapperProvider nodeMapperProvider) {
+ this.nodeMapperProvider = nodeMapperProvider;
+ }
+
}