import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.BeanWrapper;
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 final static Log log = LogFactory.getLog(BeanNodeMapper.class);
private final static String NODE_VALUE = "value";
private ClassLoader classLoader = getClass().getClassLoader();
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 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 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 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")
@SuppressWarnings("unchecked")
+ /** Transforms an object into a node*/
public Object nodeToBean(Node node) throws RepositoryException {
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();
String clssName = node.getProperty(classProperty).getValue()
.getString();
.getName());
Class propClass = pd.getPropertyType();
.getName());
Class propClass = pd.getPropertyType();
if (propClass != null && List.class.isAssignableFrom(propClass)) {
List<Object> lst = new ArrayList<Object>();
Class<?> valuesClass = classFromProperty(prop);
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();
PropertyDescriptor pd = beanWrapper.getPropertyDescriptor(name);
Class propClass = pd.getPropertyType();
if (propClass != null && List.class.isAssignableFrom(propClass)) {
String lstClass = childNode.getProperty(classProperty)
.getString();
if (propClass != null && List.class.isAssignableFrom(propClass)) {
String lstClass = childNode.getProperty(classProperty)
.getString();
if (propClass != null && Map.class.isAssignableFrom(propClass)) {
String mapClass = childNode.getProperty(classProperty)
.getString();
if (propClass != null && Map.class.isAssignableFrom(propClass)) {
String mapClass = childNode.getProperty(classProperty)
.getString();
protected void beanToNode(BeanWrapper beanWrapper, Node node)
throws RepositoryException {
protected void beanToNode(BeanWrapper beanWrapper, Node node)
throws RepositoryException {
+
+ 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());
if (log.isTraceEnabled())
log.debug("Map bean to node " + node.getPath());
}
protected Class<?> loadClass(String name) {
}
protected Class<?> loadClass(String name) {
- //log.debug("Class loader: " + classLoader);
+ // log.debug("Class loader: " + classLoader);
try {
return classLoader.loadClass(name);
} catch (ClassNotFoundException e) {
try {
return classLoader.loadClass(name);
} catch (ClassNotFoundException e) {
+ /** Returns itself. */
+ public NodeMapper findNodeMapper(Node node) {
+ return this;
+ }
+
protected String propertyName(String name) {
return name;
}
protected String propertyName(String name) {
return name;
}
this.classLoader = classLoader;
}
this.classLoader = classLoader;
}
+ public void setNodeMapperProvider(NodeMapperProvider nodeMapperProvider) {
+ this.nodeMapperProvider = nodeMapperProvider;
+ }
+
if (path.charAt(path.length() - 1) == '/')
throw new ArgeoException("Path " + path + " cannot end with '/'");
int index = path.lastIndexOf('/');
if (path.charAt(path.length() - 1) == '/')
throw new ArgeoException("Path " + path + " cannot end with '/'");
int index = path.lastIndexOf('/');
throw new ArgeoException("Cannot find last path element for "
+ path);
return path.substring(index + 1);
throw new ArgeoException("Cannot find last path element for "
+ path);
return path.substring(index + 1);
--- /dev/null
+package org.argeo.jcr;
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+
+public interface NodeMapper {
+ public Object load(Node node);
+
+ public void update(Node node, Object obj);
+
+ public Node save(Session session, String path, Object obj);
+}
--- /dev/null
+package org.argeo.jcr;
+
+import javax.jcr.Node;
+
+/** Provides a node mapper relevant for this node. */
+public interface NodeMapperProvider {
+ /** @return the node mapper or null if no relvant node mapper cna be found. */
+ public NodeMapper findNodeMapper(Node node);
+}