You are viewing a plain text version of this content. The canonical link for it is here.
Posted to graffito-commits@incubator.apache.org by cl...@apache.org on 2006/04/12 21:15:28 UTC

svn commit: r393615 [2/2] - in /incubator/graffito/trunk/jcr/jcr-mapping/src: java/org/apache/portals/graffito/jcr/mapper/impl/ java/org/apache/portals/graffito/jcr/mapper/model/ java/org/apache/portals/graffito/jcr/persistence/collectionconverter/ jav...

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ObjectConverterImpl.java Wed Apr 12 14:15:26 2006
@@ -15,7 +15,6 @@
  */
 package org.apache.portals.graffito.jcr.persistence.objectconverter.impl;
 
-
 import java.util.Iterator;
 import java.util.Map;
 
@@ -29,9 +28,9 @@
 import javax.jcr.lock.LockException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
-import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.NodeTypeManager;
+import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.version.VersionException;
 
 import org.apache.commons.logging.Log;
@@ -50,777 +49,667 @@
 import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection;
 import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollectionUtil;
 import org.apache.portals.graffito.jcr.persistence.collectionconverter.impl.DefaultCollectionConverterImpl;
-import org.apache.portals.graffito.jcr.persistence.impl.PersistenceManagerImpl;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter;
 import org.apache.portals.graffito.jcr.reflection.ReflectionUtils;
 import org.apache.portals.graffito.jcr.repository.RepositoryUtil;
 
-import sun.reflect.misc.ReflectUtil;
-
 /**
  * Default implementation for {@link ObjectConverterImpl}
- *
- * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ * 
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart
+ *         Christophe </a>
  * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
  */
 public class ObjectConverterImpl implements ObjectConverter {
-    
+
 	private final static Log log = LogFactory.getLog(ObjectConverterImpl.class);
-    
-    private static final AtomicTypeConverter NULL_CONVERTER = new NullTypeConverterImpl();
 
-    private Mapper mapper;
+	private static final AtomicTypeConverter NULL_CONVERTER = new NullTypeConverterImpl();
+
+	private Mapper mapper;
+
+	private AtomicTypeConverterProvider atomicTypeConverterProvider;
+
+	private ProxyManager proxyManager;
+
+	/**
+	 * No-arg constructor.
+	 */
+	public ObjectConverterImpl() {
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param mapper
+	 *            The mapper to used
+	 * @param converterProvider
+	 *            The atomic type converter provider
+	 * 
+	 */
+	public ObjectConverterImpl(Mapper mapper, AtomicTypeConverterProvider converterProvider) {
+		this.mapper = mapper;
+		this.atomicTypeConverterProvider = converterProvider;
+		this.proxyManager = new ProxyManager();
+	}
+
+	/**
+	 * Set the <code>Mapper</code> used to solve mappings.
+	 * 
+	 * @param mapper
+	 *            a <code>Mapper</code>
+	 */
+	public void setMapper(Mapper mapper) {
+		this.mapper = mapper;
+	}
+
+	/**
+	 * Sets the converter provider.
+	 * 
+	 * @param converterProvider
+	 *            an <code>AtomicTypeConverterProvider</code>
+	 */
+	public void setAtomicTypeConverterProvider(AtomicTypeConverterProvider converterProvider) {
+		this.atomicTypeConverterProvider = converterProvider;
+	}
+
+	/**
+	 * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#insert(javax.jcr.Session,
+	 *      java.lang.Object)
+	 */
+	public void insert(Session session, Object object) {
+		String path = this.getPath(session, object);
+		try {
+			String parentPath = RepositoryUtil.getParentPath(path);
+			String nodeName = RepositoryUtil.getNodeName(path);
+			Node parentNode = (Node) session.getItem(parentPath);
+			this.insert(session, parentNode, nodeName, object);
+
+		} catch (PathNotFoundException pnfe) {
+			throw new PersistenceException("Impossible to insert the object at '" + path + "'", pnfe);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Impossible to insert the object at '" + path
+					+ "'", re);
+		}
+	}
+
+	/**
+	 * 
+	 * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#insert(javax.jcr.Session,
+	 *      javax.jcr.Node, java.lang.String, java.lang.Object)
+	 */
+	public void insert(Session session, Node parentNode, String nodeName, Object object) {
+		ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
+
+		String jcrNodeType = classDescriptor.getJcrNodeType();
+		if ((jcrNodeType == null) || jcrNodeType.equals("")) {
+			throw new JcrMappingException("Undefined node type for  " + parentNode);
+		}
+
+		Node objectNode = null;
+		try {
+			objectNode = parentNode.addNode(nodeName, jcrNodeType);
+
+		} catch (NoSuchNodeTypeException nsnte) {
+			throw new JcrMappingException("Unknown node type " + jcrNodeType + " for mapped class " + object.getClass(), nsnte);
+		} catch (RepositoryException re) {
+			throw new PersistenceException("Cannot create new node of type " + jcrNodeType + " from mapped class "
+					+ object.getClass(), re);
+		}
+
+		if (null != classDescriptor.getJcrMixinTypes()) {
+			String[] mixinTypes = classDescriptor.getJcrMixinTypes();
+			for (int i = 0; i < mixinTypes.length; i++) {
+				try {
+					objectNode.addMixin(mixinTypes[i].trim());
+				} catch (NoSuchNodeTypeException nsnte) {
+					throw new JcrMappingException("Unknown mixin type " + mixinTypes[i].trim() + " for mapped class "
+							+ object.getClass(), nsnte);
+				} catch (RepositoryException re) {
+					throw new PersistenceException("Cannot create new node of type " + jcrNodeType + " from mapped class "
+							+ object.getClass(), re);
+				}
+			}
+		}
+
+		storeSimpleFields(session, object, classDescriptor, objectNode);
+		insertBeanFields(session, object, classDescriptor, objectNode);
+		insertCollectionFields(session, object, classDescriptor, objectNode);
+	}
+
+	/**
+	 * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#update(javax.jcr.Session,
+	 *      java.lang.Object)
+	 */
+	public void update(Session session, Object object) {
+		String path = this.getPath(session, object);
+		try {
+			String parentPath = RepositoryUtil.getParentPath(path);
+			String nodeName = RepositoryUtil.getNodeName(path);
+			Node parentNode = (Node) session.getItem(parentPath);
+			this.update(session, parentNode, nodeName, object);
+		} catch (PathNotFoundException pnfe) {
+			throw new PersistenceException("Impossible to update the object at '" + path + "'", pnfe);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Impossible to update the object at '" + path
+					+ "'", re);
+		}
+	}
+
+	/**
+	 * 
+	 * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#update(javax.jcr.Session,
+	 *      javax.jcr.Node, java.lang.String, java.lang.Object)
+	 */
+	public void update(Session session, Node parentNode, String nodeName, Object object) {
+		try {
+			ClassDescriptor classDescriptor = getClassDescriptor(ReflectionUtils.getBeanClass(object));
+			Node objectNode = parentNode.getNode(nodeName);
+
+			checkNodeType(session, classDescriptor);
+			checkCompatibleNodeTypes(session, objectNode, classDescriptor, false);
+
+			storeSimpleFields(session, object, classDescriptor, objectNode);
+			updateBeanFields(session, object, classDescriptor, objectNode);
+			updateCollectionFields(session, object, classDescriptor, objectNode);
+		} catch (PathNotFoundException pnfe) {
+			throw new PersistenceException("Impossible to update the object: " + nodeName + " at node : " + parentNode, pnfe);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Impossible to update the object: "
+					+ nodeName + " at node : " + parentNode, re);
+		}
+	}
+
+	/**
+	 * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#getObject(javax.jcr.Session,
+	 *      java.lang.Class, java.lang.String)
+	 */
+	public Object getObject(Session session, Class clazz, String path) {
+		try {
+			if (!session.itemExists(path)) {
+				return null;
+			}
+
+			ClassDescriptor classDescriptor = getClassDescriptor(clazz);
+
+			checkNodeType(session, classDescriptor);
+
+			Node node = (Node) session.getItem(path);
+
+			checkCompatibleNodeTypes(session, node, classDescriptor, true);
+			Object object = null;
+			if (classDescriptor.usesNodeTypePerHierarchyStrategy()) {
+				String discriminatorProperty = classDescriptor.getDiscriminatorFieldDescriptor().getJcrName();
+
+				if (!node.hasProperty(discriminatorProperty)) {
+					throw new PersistenceException("Cannot fetch object of type '" + clazz.getName()
+							+ "' using NODETYPE_PER_HIERARCHY. Discriminator property is not present.");
+				}
+
+				String className = node.getProperty(discriminatorProperty).getValue().getString();
+				classDescriptor = getClassDescriptor(Class.forName(className));
+				object = ReflectionUtils.newInstance(className);
+			} else {
+				if (classDescriptor.usesNodeTypePerConcreteClassStrategy()) {
+					String nodeType = node.getPrimaryNodeType().getName();
+					if (!nodeType.equals(classDescriptor.getJcrNodeType())) {
+						classDescriptor = classDescriptor.getDescendantClassDescriptor(nodeType);
+					}
+				}
+				object = ReflectionUtils.newInstance(classDescriptor.getClassName());
+
+			}
+
+			retrieveSimpleFields(session, classDescriptor, node, object);
+			retrieveBeanFields(session, classDescriptor, node, path, object);
+			retrieveCollectionFields(session, classDescriptor, node, object);
+
+			return object;
+		} catch (ClassNotFoundException clnf) {
+			throw new PersistenceException("Impossible to instantiate the object at " + path, clnf);
+		} catch (PathNotFoundException pnfe) {
+			// HINT should never get here
+			throw new PersistenceException("Impossible to get the object at " + path, pnfe);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Impossible to get the object at " + path, re);
+		}
+	}
+
+	/**
+	 * Validates the node type used by the class descriptor.
+	 * 
+	 * @param session
+	 *            the current session
+	 * @param classDescriptor
+	 *            descriptor
+	 * @throws JcrMappingException
+	 *             thrown if the node type is unknown
+	 * @throws org.apache.portals.graffito.jcr.exception.RepositoryException
+	 *             thrown if an error occured in the underlying repository
+	 */
+	private void checkNodeType(Session session, ClassDescriptor classDescriptor) {
+		try {
+			session.getWorkspace().getNodeTypeManager().getNodeType(classDescriptor.getJcrNodeType());
+		} catch (NoSuchNodeTypeException nsnte) {
+			throw new JcrMappingException("Mapping for class '" + classDescriptor.getClassName() + "' use unknown node type '"
+					+ classDescriptor.getJcrNodeType() + "'");
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException(re);
+		}
+	}
+
+	/**
+	 * Checks if the node type in the class descriptor is compatible with the
+	 * specified node node type.
+	 * 
+	 * @param session
+	 *            the current session
+	 * @param node
+	 *            node against whose node type the compatibility is checked
+	 * @param classDescriptor
+	 *            class descriptor
+	 * @param checkVersionNode
+	 *            <tt>true</tt> if the check should continue in case the
+	 *            <tt>node</tt> is a version node, <tt>false</tt> if no
+	 *            check against version node should be performed
+	 * 
+	 * @throws PersistenceException
+	 *             thrown if node types are incompatible
+	 * @throws org.apache.portals.graffito.jcr.exception.RepositoryException
+	 *             thrown if an error occured in the underlying repository
+	 */
+	private void checkCompatibleNodeTypes(Session session, Node node, ClassDescriptor classDescriptor, boolean checkVersionNode) {
+		try {
+			NodeType nodeType = node.getPrimaryNodeType();
+
+			boolean compatible = checkCompatibleNodeTypes(nodeType, classDescriptor);
+
+			if (!compatible && checkVersionNode && "nt:frozenNode".equals(nodeType.getName())) {
+				NodeTypeManager ntMgr = session.getWorkspace().getNodeTypeManager();
+				nodeType = ntMgr.getNodeType(node.getProperty("jcr:frozenPrimaryType").getString());
+
+				compatible = checkCompatibleNodeTypes(nodeType, classDescriptor);
+			}
+
+			if (!compatible) {
+				throw new PersistenceException("Cannot map object of type '" + classDescriptor.getClassName() + "'. Node type '"
+						+ node.getPrimaryNodeType().getName() + "' does not match descriptor node type '"
+						+ classDescriptor.getJcrNodeType() + "'");
+			}
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException(re);
+		}
+	}
+
+	/**
+	 * Node types compatibility check.
+	 * 
+	 * @param nodeType
+	 *            target node type
+	 * @param descriptor
+	 *            descriptor containing source node type
+	 * @return <tt>true</tt> if nodes are considered compatible,
+	 *         <tt>false</tt> otherwise
+	 */
+	private boolean checkCompatibleNodeTypes(NodeType nodeType, ClassDescriptor descriptor) {
+		if (nodeType.getName().equals(descriptor.getJcrNodeType())) {
+			return true;
+		}
+
+		NodeType[] superTypes = nodeType.getSupertypes();
+		for (int i = 0; i < superTypes.length; i++) {
+			if (superTypes[i].getName().equals(descriptor.getJcrNodeType())) {
+				return true;
+			}
+		}
+
+		return false;
+	}
 
-    private AtomicTypeConverterProvider atomicTypeConverterProvider;
-    
-    private ProxyManager proxyManager;
-
-    /**
-     * No-arg constructor.
-     */
-    public ObjectConverterImpl() {
-    }
-
-    /**
-     * Constructor
-     *
-     * @param mapper The mapper to used
-     * @param converterProvider The atomic type converter provider
-     *
-     */
-    public ObjectConverterImpl(Mapper mapper, AtomicTypeConverterProvider converterProvider) {
-        this.mapper = mapper;
-        this.atomicTypeConverterProvider = converterProvider;
-        this.proxyManager = new ProxyManager(this);
-    }
-
-    /**
-     * Set the <code>Mapper</code> used to solve mappings.
-     * @param mapper a <code>Mapper</code>
-     */
-    public void setMapper(Mapper mapper) {
-        this.mapper = mapper;
-    }
-
-    /**
-     * Sets the converter provider.
-     *
-     * @param converterProvider an <code>AtomicTypeConverterProvider</code>
-     */
-    public void setAtomicTypeConverterProvider(AtomicTypeConverterProvider converterProvider) {
-        this.atomicTypeConverterProvider = converterProvider;
-    }
-
-    /**
-     * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#insert(javax.jcr.Session, java.lang.Object)
-     */
-    public void insert(Session session, Object object) {
-        String path = this.getPath(session, object);
-        try {
-            String parentPath = RepositoryUtil.getParentPath(path);
-            String nodeName = RepositoryUtil.getNodeName(path);
-            Node parentNode = (Node) session.getItem(parentPath);
-            this.insert(session, parentNode, nodeName, object);
-
-        } catch (PathNotFoundException pnfe) {
-            throw new PersistenceException("Impossible to insert the object at '" + path + "'",
-                                           pnfe);
-        } catch (RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Impossible to insert the object at '" + path + "'",
-                    re);
-        }
-    }
-
-    /**
-     *
-     * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#insert(javax.jcr.Session, javax.jcr.Node, java.lang.String, java.lang.Object)
-     */
-    public void insert(Session session, Node parentNode, String nodeName, Object object) {
-        ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
-        
-        String jcrNodeType = classDescriptor.getJcrNodeType();
-        if ((jcrNodeType == null) || jcrNodeType.equals("")) {
-            throw new JcrMappingException("Undefined node type for  " + parentNode);
-        }
-
-        Node objectNode = null;
-        try {
-            objectNode = parentNode.addNode(nodeName, jcrNodeType);
-            
-        } 
-        catch (NoSuchNodeTypeException nsnte) {
-            throw new JcrMappingException("Unknown node type " + jcrNodeType
-                                          + " for mapped class " + object.getClass(), nsnte);
-        } 
-        catch (RepositoryException re) {
-            throw new PersistenceException("Cannot create new node of type " + jcrNodeType
-                                           + " from mapped class " + object.getClass(), re);
-        }
-
-        if (null != classDescriptor.getJcrMixinTypes()) {
-            String[] mixinTypes = classDescriptor.getJcrMixinTypes();
-            for (int i = 0; i < mixinTypes.length; i++) {
-                try {
-                    objectNode.addMixin(mixinTypes[i].trim());
-                } catch (NoSuchNodeTypeException nsnte) {
-                    throw new JcrMappingException("Unknown mixin type " + mixinTypes[i].trim()
-                                                  + " for mapped class " + object.getClass(), nsnte);
-                } catch (RepositoryException re) {
-                    throw new PersistenceException("Cannot create new node of type " + jcrNodeType
-                                                   + " from mapped class " + object.getClass(), re);
-                }
-            }
-        }
-
-
-        storeSimpleFields(session, object, classDescriptor, objectNode);
-        insertBeanFields(session, object, classDescriptor, objectNode);
-        insertCollectionFields(session, object, classDescriptor, objectNode);
-    }
-
-    /**
-     * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#update(javax.jcr.Session, java.lang.Object)
-     */
-    public void update(Session session, Object object) {
-        String path = this.getPath(session, object);
-        try {
-            String parentPath = RepositoryUtil.getParentPath(path);
-            String nodeName = RepositoryUtil.getNodeName(path);
-            Node parentNode = (Node) session.getItem(parentPath);
-            this.update(session, parentNode, nodeName, object);
-        }
-        catch(PathNotFoundException pnfe) {
-            throw new PersistenceException("Impossible to update the object at '"
-                    + path + "'",
-                    pnfe);
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Impossible to update the object at '" + path + "'",
-                    re);
-        }
-    }
-
-    /**
-     *
-     * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#update(javax.jcr.Session, javax.jcr.Node, java.lang.String, java.lang.Object)
-     */
-    public void update(Session session, Node parentNode, String nodeName, Object object) {
-        try {
-            ClassDescriptor classDescriptor = getClassDescriptor(ReflectionUtils.getBeanClass(object));
-            Node objectNode = parentNode.getNode(nodeName);
-
-            checkNodeType(session, classDescriptor);
-            checkCompatibleNodeTypes(session, objectNode, classDescriptor, false);
-
-            storeSimpleFields(session, object, classDescriptor, objectNode);
-            updateBeanFields(session, object, classDescriptor, objectNode);
-            updateCollectionFields(session, object, classDescriptor, objectNode);
-        }
-        catch(PathNotFoundException pnfe) {
-            throw new PersistenceException("Impossible to update the object: "
-                    + nodeName
-                    + " at node : " + parentNode, pnfe);
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Impossible to update the object: " + nodeName
-                    + " at node : " + parentNode, re);
-        }
-    }
-
-    /**
-     * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#getObject(javax.jcr.Session, java.lang.Class, java.lang.String)
-     */
-    public Object getObject(Session session, Class clazz, String path) {
-        try {
-            if (!session.itemExists(path)) {
-                return null;
-            }
-
-            ClassDescriptor classDescriptor = getClassDescriptor(clazz);
-
-            checkNodeType(session, classDescriptor);
-
-            Node node = (Node) session.getItem(path);
-
-            checkCompatibleNodeTypes(session, node, classDescriptor, true);
-            Object object = null;
-            if (classDescriptor.usesNodeTypePerHierarchyStrategy()) {
-                String discriminatorProperty = classDescriptor.getDiscriminatorFieldDescriptor().getJcrName();
-
-                if (!node.hasProperty(discriminatorProperty)) {
-                     throw new PersistenceException("Cannot fetch object of type '"
-                        + clazz.getName()
-                        + "' using NODETYPE_PER_HIERARCHY. Discriminator property is not present.");
-                }
-                
-                String className = node.getProperty(discriminatorProperty).getValue().getString();
-                classDescriptor = getClassDescriptor(Class.forName(className));
-                object = ReflectionUtils.newInstance(className);
-            }
-            else {
-            	    if (classDescriptor.usesNodeTypePerConcreteClassStrategy())
-            	    {
-            	    	    String nodeType =  node.getPrimaryNodeType().getName();
-            	    	    if (! nodeType.equals(classDescriptor.getJcrNodeType()))
-            	    	    {
-            	    	        classDescriptor  = classDescriptor.getDescendantClassDescriptor(nodeType);
-            	    	    }
-            	    }
-                object = ReflectionUtils.newInstance(classDescriptor.getClassName());
-
-            }   
-
-            retrieveSimpleFields(session, classDescriptor, node, object);
-            retrieveBeanFields(session, classDescriptor, node, path, object);
-            retrieveCollectionFields(session, classDescriptor, node, object);
-
-            return object;
-        } 
-        catch(ClassNotFoundException clnf) {
-           	throw new PersistenceException("Impossible to instantiate the object at " + path, clnf);
-        }
-        catch(PathNotFoundException pnfe) {
-            // HINT should never get here
-            throw new PersistenceException("Impossible to get the object at " + path, pnfe);
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Impossible to get the object at " + path, re);
-        }
-    }
-
-    /**
-     * Validates the node type used by the class descriptor.
-     *
-     * @param session the current session
-     * @param classDescriptor descriptor
-     * @throws JcrMappingException thrown if the node type is unknown
-     * @throws org.apache.portals.graffito.jcr.exception.RepositoryException thrown if
-     *  an error occured in the underlying repository
-     */
-    private void checkNodeType(Session session, ClassDescriptor classDescriptor) {
-        try {
-            session.getWorkspace().getNodeTypeManager().getNodeType(classDescriptor.getJcrNodeType());
-        }
-        catch(NoSuchNodeTypeException nsnte) {
-            throw new JcrMappingException("Mapping for class '"
-                + classDescriptor.getClassName()
-                + "' use unknown node type '"
-                + classDescriptor.getJcrNodeType()
-                + "'");
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(re);
-        }
-    }
-
-    /**
-     * Checks if the node type in the class descriptor is compatible with the
-     * specified node node type.
-     *
-     * @param session the current session
-     * @param node node against whose node type the compatibility is checked
-     * @param classDescriptor class descriptor
-     * @param checkVersionNode <tt>true</tt> if the check should continue in case the <tt>node</tt>
-     *  is a version node, <tt>false</tt> if no check against version node should be performed
-     *
-     * @throws PersistenceException thrown if node types are incompatible
-     * @throws org.apache.portals.graffito.jcr.exception.RepositoryException thrown if an error
-     *  occured in the underlying repository
-     */
-    private void checkCompatibleNodeTypes(Session session,
-                                          Node node,
-                                          ClassDescriptor classDescriptor,
-                                          boolean checkVersionNode) {
-        try {
-            NodeType nodeType = node.getPrimaryNodeType();
-
-            boolean compatible = checkCompatibleNodeTypes(nodeType, classDescriptor);
-
-            if (!compatible && checkVersionNode && "nt:frozenNode".equals(nodeType.getName())) {
-                NodeTypeManager ntMgr = session.getWorkspace().getNodeTypeManager();
-                nodeType = ntMgr.getNodeType(node.getProperty("jcr:frozenPrimaryType").getString());
-
-                compatible = checkCompatibleNodeTypes(nodeType, classDescriptor);
-            }
-
-            if (!compatible) {
-                throw new PersistenceException("Cannot map object of type '"
-                        + classDescriptor.getClassName()
-                        + "'. Node type '"
-                        + node.getPrimaryNodeType().getName()
-                        + "' does not match descriptor node type '"
-                        + classDescriptor.getJcrNodeType()
-                        + "'");
-            }
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(re);
-        }
-    }
-
-    /**
-     * Node types compatibility check.
-     *
-     * @param nodeType target node type
-     * @param descriptor descriptor containing source node type
-     * @return <tt>true</tt> if nodes are considered compatible, <tt>false</tt> otherwise
-     */
-    private boolean checkCompatibleNodeTypes(NodeType nodeType, ClassDescriptor descriptor) {
-        if(nodeType.getName().equals(descriptor.getJcrNodeType())) {
-            return true;
-        }
-
-        NodeType[] superTypes = nodeType.getSupertypes();
-        for(int i = 0; i < superTypes.length; i++) {
-            if(superTypes[i].getName().equals(descriptor.getJcrNodeType())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#getPath(javax.jcr.Session, java.lang.Object)
-     * @throws JcrMappingException
-     */
-    public String getPath(Session session, Object object) {
-        ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
-
-        final FieldDescriptor pathFieldDescriptor = classDescriptor.getPathFieldDescriptor();
-        if (pathFieldDescriptor == null) {
-            throw new JcrMappingException("Class of type: "
-                    + object.getClass().getName()
-                    + " has no path mapping. Maybe attribute path=\"true\" for a field element of this class in jcrmapping.xml is missing?"
-            );
-        }
-        String pathField = pathFieldDescriptor.getFieldName();
-
-        return (String) ReflectionUtils.getNestedProperty(object, pathField);
-    }
-
-    /**
-     * Retrieve simple fields (atomic fields)
-     * 
-     * @throws JcrMappingException
-     * @throws org.apache.portals.graffito.jcr.exception.RepositoryException
-     */
-    private Object retrieveSimpleFields(Session session, 
-                                        ClassDescriptor classDescriptor, 
-                                        Node node, 
-                                        Object object) {
-       Object initializedBean = object;
-        try {
-            Iterator fieldDescriptorIterator = classDescriptor.getFieldDescriptors().iterator();
-    
-            while (fieldDescriptorIterator.hasNext()) {
-                FieldDescriptor fieldDescriptor = (FieldDescriptor) fieldDescriptorIterator.next();
-    
-                String fieldName = fieldDescriptor.getFieldName();
-                String propertyName = fieldDescriptor.getJcrName();
-    
-                if (fieldDescriptor.isPath()) {
-                    // 	 HINT: lazy initialize target bean - The bean can be null when it is inline
-                    if (null == initializedBean) { 
-                     initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
-                   }
-                    
-                    ReflectionUtils.setNestedProperty(initializedBean, fieldName, node.getPath());
-                 
-                }
-                else if (classDescriptor.usesNodeTypePerHierarchyStrategy() && fieldDescriptor.isDiscriminator()) {                	    
-                	    
-                    if (node.hasProperty( classDescriptor.getDiscriminatorFieldDescriptor().getJcrName())) {
-                        if (null == initializedBean) {
-                            initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
-                        }
-                        String value = node.getProperty( classDescriptor.getDiscriminatorFieldDescriptor().getJcrName()).getValue().getString();
-                        ReflectionUtils.setNestedProperty(initializedBean, fieldName, value);
-                    }
-                    else {
-                        throw new PersistenceException("Class '" + classDescriptor.getClassName() + "' have not a discriminator property.");
-                    }
-                }
-                else {
-                    if (node.hasProperty(propertyName)) {
-                        Value propValue = node.getProperty(propertyName).getValue();
-                        // 	 HINT: lazy initialize target bean - The bean can be null when it is inline
-                        if (null != propValue && null == initializedBean) { 
-                            initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
-                        }
-
-                        AtomicTypeConverter converter= getAtomicTypeConverter(fieldDescriptor, 
-                                                                              initializedBean, 
-                                                                              fieldName);
-                        
-                        Object fieldValue = converter.getObject(propValue);
-                        ReflectionUtils.setNestedProperty(initializedBean, fieldName, fieldValue);
-                    }
-                    else
-                    {
-                    	     log.warn("Class '" + classDescriptor.getClassName() + "' has an unmapped property : " + propertyName);	
-                    }
-                }
-            }
-        }
-        catch(ValueFormatException vfe) {
-            throw new PersistenceException( "Cannot retrieve properties of object "
-                    + object
-                    + " from node "
-                    + node,
-                    vfe);
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Cannot retrieve properties of object "
-                    + object
-                    + " from node "
-                    + node,
-                    re);
-        }
-        
-        return initializedBean;
-    }
-    
-    /**
-     * Retrieve bean fields
-     */
-    private void retrieveBeanFields(Session session, ClassDescriptor classDescriptor,  Node node, String path, Object object) {
-        Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors()
-				.iterator();
+	/**
+	 * @see org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter#getPath(javax.jcr.Session,
+	 *      java.lang.Object)
+	 * @throws JcrMappingException
+	 */
+	public String getPath(Session session, Object object) {
+		ClassDescriptor classDescriptor = getClassDescriptor(object.getClass());
+
+		final FieldDescriptor pathFieldDescriptor = classDescriptor.getPathFieldDescriptor();
+		if (pathFieldDescriptor == null) {
+			throw new JcrMappingException(
+					"Class of type: "
+							+ object.getClass().getName()
+							+ " has no path mapping. Maybe attribute path=\"true\" for a field element of this class in jcrmapping.xml is missing?");
+		}
+		String pathField = pathFieldDescriptor.getFieldName();
+
+		return (String) ReflectionUtils.getNestedProperty(object, pathField);
+	}
+
+	/**
+	 * Retrieve simple fields (atomic fields)
+	 * 
+	 * @throws JcrMappingException
+	 * @throws org.apache.portals.graffito.jcr.exception.RepositoryException
+	 */
+	private Object retrieveSimpleFields(Session session, ClassDescriptor classDescriptor, Node node, Object object) {
+		Object initializedBean = object;
+		try {
+			Iterator fieldDescriptorIterator = classDescriptor.getFieldDescriptors().iterator();
+
+			while (fieldDescriptorIterator.hasNext()) {
+				FieldDescriptor fieldDescriptor = (FieldDescriptor) fieldDescriptorIterator.next();
+
+				String fieldName = fieldDescriptor.getFieldName();
+				String propertyName = fieldDescriptor.getJcrName();
+
+				if (fieldDescriptor.isPath()) {
+					// HINT: lazy initialize target bean - The bean can be null
+					// when it is inline
+					if (null == initializedBean) {
+						initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
+					}
+
+					ReflectionUtils.setNestedProperty(initializedBean, fieldName, node.getPath());
+
+				} else if (classDescriptor.usesNodeTypePerHierarchyStrategy() && fieldDescriptor.isDiscriminator()) {
+
+					if (node.hasProperty(classDescriptor.getDiscriminatorFieldDescriptor().getJcrName())) {
+						if (null == initializedBean) {
+							initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
+						}
+						String value = node.getProperty(classDescriptor.getDiscriminatorFieldDescriptor().getJcrName())
+								.getValue().getString();
+						ReflectionUtils.setNestedProperty(initializedBean, fieldName, value);
+					} else {
+						throw new PersistenceException("Class '" + classDescriptor.getClassName()
+								+ "' have not a discriminator property.");
+					}
+				} else {
+					if (node.hasProperty(propertyName)) {
+						Value propValue = node.getProperty(propertyName).getValue();
+						// HINT: lazy initialize target bean - The bean can be
+						// null when it is inline
+						if (null != propValue && null == initializedBean) {
+							initializedBean = ReflectionUtils.newInstance(classDescriptor.getClassName());
+						}
+
+						AtomicTypeConverter converter = getAtomicTypeConverter(fieldDescriptor, initializedBean, fieldName);
+
+						Object fieldValue = converter.getObject(propValue);
+						ReflectionUtils.setNestedProperty(initializedBean, fieldName, fieldValue);
+					} else {
+						log.warn("Class '" + classDescriptor.getClassName() + "' has an unmapped property : " + propertyName);
+					}
+				}
+			}
+		} catch (ValueFormatException vfe) {
+			throw new PersistenceException("Cannot retrieve properties of object " + object + " from node " + node, vfe);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot retrieve properties of object "
+					+ object + " from node " + node, re);
+		}
+
+		return initializedBean;
+	}
+
+	/**
+	 * Retrieve bean fields
+	 */
+	private void retrieveBeanFields(Session session, ClassDescriptor classDescriptor, Node node, String path, Object object) {
+		Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors().iterator();
 		while (beanDescriptorIterator.hasNext()) {
-			BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator
-					.next();
+			BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator.next();
 			String beanName = beanDescriptor.getFieldName();
 			Class beanClass = ReflectionUtils.getPropertyType(object, beanName);
 			Object bean = null;
 			if (beanDescriptor.isProxy()) {
-				bean = proxyManager.createBeanProxy(session, beanClass, path + "/" + beanDescriptor.getJcrName());
+				bean = proxyManager.createBeanProxy(session, this, beanClass, path + "/" + beanDescriptor.getJcrName());
 
 			} else {
 				if (beanDescriptor.isInline()) {
-					bean = this.retrieveSimpleFields(session,
-							getClassDescriptor(beanClass), node, bean);
+					bean = this.retrieveSimpleFields(session, getClassDescriptor(beanClass), node, bean);
 				} else if (null != beanDescriptor.getBeanConverter()) {
-					bean = beanDescriptor.getBeanConverter().getObject(session,
-							node, beanDescriptor, beanClass);
+					bean = beanDescriptor.getBeanConverter().getObject(session, node, beanDescriptor, beanClass);
 				} else {
-					bean = this.getObject(session, beanClass, path + "/"
-							+ beanDescriptor.getJcrName());
+					bean = this.getObject(session, beanClass, path + "/" + beanDescriptor.getJcrName());
 				}
 			}
 			ReflectionUtils.setNestedProperty(object, beanName, bean);
 		}
-    }
+	}
 
-    /**
+	/**
 	 * Retrieve Collection fields
 	 */
-    private void retrieveCollectionFields(Session session,
-                                          ClassDescriptor classDescriptor,
-                                          Node node,
-                                          Object object)  {
-        Iterator collectionDescriptorIterator = classDescriptor.getCollectionDescriptors()
-                                                               .iterator();
-        while (collectionDescriptorIterator.hasNext()) {
-            CollectionDescriptor collectionDescriptor = (CollectionDescriptor)
-                collectionDescriptorIterator.next();
-            CollectionConverter collectionConverter = this.getCollectionConverter(session, collectionDescriptor);
-            Class collectionFieldClass = ReflectionUtils.getPropertyType(object,
-                    collectionDescriptor.getFieldName());
-            ManageableCollection collection = collectionConverter.getCollection(session,
-                                                                                node,
-                                                                                collectionDescriptor,
-                                                                                collectionFieldClass);
-            ReflectionUtils.setNestedProperty(object,
-                                              collectionDescriptor.getFieldName(),
-                                              collection);
-        }
-    }
-
-    /**
-     * Insert Bean fields
-     */
-    private void insertBeanFields(Session session,
-                                  Object object,
-                                  ClassDescriptor classDescriptor,
-                                  Node objectNode) {
-        Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors().iterator();
-        while (beanDescriptorIterator.hasNext()) {
-            BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator.next();
-            String jcrName = beanDescriptor.getJcrName();
-            Object bean = ReflectionUtils.getNestedProperty(object,
-                                                            beanDescriptor.getFieldName());
-            if (bean != null) {
-                if (beanDescriptor.isInline()) {
-                    this.storeSimpleFields(session, bean, getClassDescriptor(bean.getClass()), objectNode);
-                }
-                else if (null != beanDescriptor.getBeanConverter()) {
-                    beanDescriptor.getBeanConverter().insert(session,
-                            objectNode,
-                            beanDescriptor,
-                            object);
-                }
-                else {
-                    this.insert(session, objectNode, jcrName, bean);
-                }
-            }
-        }
-    }
-
-    /**
-     * Update Bean fields
-     */
-    private void updateBeanFields(Session session,
-                                  Object object,
-                                  ClassDescriptor classDescriptor,
-                                  Node objectNode) {
-        String jcrName = null;
-        try {
-            Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors().iterator();
-            while (beanDescriptorIterator.hasNext()) {
-                BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator.next();
-                jcrName = beanDescriptor.getJcrName();
-                Object bean = ReflectionUtils.getNestedProperty(object, beanDescriptor.getFieldName());
-
-                // if the bean is null, remove existing node
-                if ((bean == null)) {
-                    if (beanDescriptor.isInline()) {
-                        Class beanClass = ReflectionUtils.getPropertyType(object, beanDescriptor.getFieldName());
-                        this.storeSimpleFields(session, bean, getClassDescriptor(beanClass), objectNode);
-                    }
-                    else if (null != beanDescriptor.getBeanConverter()) {
-                        beanDescriptor.getBeanConverter().remove(session, objectNode, beanDescriptor);
-                    }
-                    else {
-                        if (objectNode.hasNode(jcrName)) {
-                            objectNode.getNode(jcrName).remove();
-                        }
-                    }
-                } 
-                else {
-                    if (beanDescriptor.isInline()) {
-                        this.storeSimpleFields(session, bean, getClassDescriptor(bean.getClass()), objectNode);
-                    }
-                    else if (null != beanDescriptor.getBeanConverter()) {
-                        beanDescriptor.getBeanConverter().update(session,
-                                objectNode,
-                                beanDescriptor,
-                                bean);
-                    }
-                    else {
-                        this.update(session, objectNode, jcrName, bean);
-                    }
-                }
-            }
-        } 
-        catch(VersionException ve) {
-            throw new PersistenceException("Cannot remove bean at path " + jcrName,
-                    ve);
-        }
-        catch(LockException le) {
-            throw new PersistenceException("Cannot remove bean at path " + jcrName + ". Item is locked.",
-                    le);
-        }
-        catch(ConstraintViolationException cve) {
-            throw new PersistenceException("Cannot remove bean at path " + jcrName + ". Contraint violation.",
-                    cve);
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Cannot remove bean at path " + jcrName,
-                    re);
-        }
-    }
-
-    private void insertCollectionFields(Session session,
-                                        Object object,
-                                        ClassDescriptor classDescriptor,
-                                        Node objectNode) {
-        Iterator collectionDescriptorIterator = classDescriptor.getCollectionDescriptors().iterator();
-        
-        while (collectionDescriptorIterator.hasNext()) {
-            CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
-            CollectionConverter collectionConverter = this.getCollectionConverter(session, collectionDescriptor);
-            Object collection = ReflectionUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
-            ManageableCollection manageableCollection = ManageableCollectionUtil.getManageableCollection(collection);
-            
-            collectionConverter.insertCollection(session,objectNode, collectionDescriptor, manageableCollection);
-        }
-    }
-
-    private void updateCollectionFields(Session session,
-                                        Object object,
-                                        ClassDescriptor classDescriptor,
-                                        Node objectNode) {
-        Iterator collectionDescriptorIterator = classDescriptor.getCollectionDescriptors().iterator();
-        
-        while (collectionDescriptorIterator.hasNext()) {
-            CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
-            CollectionConverter collectionConverter = this.getCollectionConverter(session, collectionDescriptor);
-            Object collection = ReflectionUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
-            ManageableCollection manageableCollection = ManageableCollectionUtil.getManageableCollection(collection);
-            
-            collectionConverter.updateCollection(session,
-                                                 objectNode,
-                                                 collectionDescriptor,
-                                                 manageableCollection);
-        }
-    }
-
-    private void storeSimpleFields(Session session,
-                                   Object object,
-                                   ClassDescriptor classDescriptor,
-                                   Node objectNode) {
-        try {
-            ValueFactory valueFactory = session.getValueFactory();
-    
-            Iterator fieldDescriptorIterator = classDescriptor.getFieldDescriptors().iterator();
-            while (fieldDescriptorIterator.hasNext()) {
-                FieldDescriptor fieldDescriptor = (FieldDescriptor) fieldDescriptorIterator.next();
-
-                String fieldName = fieldDescriptor.getFieldName();
-                String jcrName = fieldDescriptor.getJcrName();
-
-
-                //Of course, Path field is not stored as property
-                if (fieldDescriptor.isPath()) {
-                    continue;
-                }
-
-                if (classDescriptor.usesNodeTypePerHierarchyStrategy() && fieldDescriptor.isDiscriminator()) {
-                     objectNode.setProperty(fieldDescriptor.getJcrName(), classDescriptor.getClassName());                     
-                    continue;
-                }
-    
-    
-                boolean protectedProperty= fieldDescriptor.isJcrProtected();
-                
-                if(objectNode.hasProperty(jcrName)) {
-                    protectedProperty= objectNode.getProperty(jcrName).getDefinition().isProtected();
-                }
-    
-                if(!protectedProperty) { // DO NOT TRY TO WRITE PROTECTED PROPERTIES
-                    Object fieldValue = ReflectionUtils.getNestedProperty(object, fieldName);
-                    AtomicTypeConverter converter= getAtomicTypeConverter(fieldDescriptor, 
-                                                                          object, 
-                                                                          fieldName); 
-                    Value value = converter.getValue(valueFactory, fieldValue);
-    
-                    // Check if the node property is "autocreated"
-                    boolean autoCreated= fieldDescriptor.isJcrAutoCreated();
-    
-                    if(objectNode.hasProperty(jcrName)) {
-                        autoCreated= objectNode.getProperty(jcrName).getDefinition().isAutoCreated();
-                    }
-                    
-                    if(!autoCreated) {
-                        // Check if mandatory property are not null
-                        checkMandatoryProperty(objectNode, fieldDescriptor, value);
-                    }
-    
-                    objectNode.setProperty(jcrName, value);
-                }
-            }
-        }
-        catch(ValueFormatException vfe) {
-            throw new PersistenceException("Cannot persist properties of object " + object
-                    + ". Value format exception.",
-                    vfe);
-        }
-        catch(VersionException ve) {
-            throw new PersistenceException("Cannot persist properties of object " + object
-                    + ". Versioning exception.",
-                    ve);
-        }
-        catch(LockException le) {
-            throw new PersistenceException("Cannot persist properties of object " + object
-                    + " on locked node.",
-                    le);
-        }
-        catch(ConstraintViolationException cve) {
-            throw new PersistenceException("Cannot persist properties of object " + object
-                    + ". Constraint violation.",
-                    cve);
-        }
-        catch(RepositoryException re) {
-            throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-                    "Cannot persist properties of object " + object,
-                    re);
-        }
-    }
-
-    private CollectionConverter getCollectionConverter(Session session, CollectionDescriptor collectionDescriptor) {
-        String className = collectionDescriptor.getCollectionConverterClassName();
-        Map atomicTypeConverters= this.atomicTypeConverterProvider.getAtomicTypeConverters();
-        if (className == null) {
-            return new DefaultCollectionConverterImpl(atomicTypeConverters, this, this.mapper);
-        } else {
-            return (CollectionConverter) ReflectionUtils.invokeConstructor(className,
-                    new Object[] {atomicTypeConverters, this, this.mapper});
-        }
-
-    }
-
-    private void checkMandatoryProperty(Node objectNode,
-                                        FieldDescriptor fieldDescriptor,
-                                        Value value) throws RepositoryException {
-        PropertyDefinition[] propertyDefinitions = objectNode.getPrimaryNodeType()
-                                                             .getDeclaredPropertyDefinitions();
-        for (int i = 0; i < propertyDefinitions.length; i++) {
-            PropertyDefinition definition = propertyDefinitions[i];
-            if (definition.getName().equals(fieldDescriptor.getJcrName())
-                && definition.isMandatory() 
-                && (definition.isAutoCreated() == false)
-                && (value == null)) 
-            {
-                throw new PersistenceException("Class of type:"
-                        + fieldDescriptor.getClassDescriptor().getClassName() 
-                        + " has property: "
-                        + fieldDescriptor.getFieldName()
-                        + " declared as JCR property: "
-                        + fieldDescriptor.getJcrName()
-                        + " This property is mandatory but property in bean has value null");
-            }
-        }
-    }
-    
-    private AtomicTypeConverter getAtomicTypeConverter(FieldDescriptor fd, 
-                                                       Object object, 
-                                                       String fieldName) {
-        Class fieldTypeClass = null;
-        if (null != fd.getFieldTypeClass()) {
-            fieldTypeClass = fd.getFieldTypeClass();
-        }
-        else if (null != object) {
-            fieldTypeClass = ReflectionUtils.getPropertyType(object, fieldName);
-        }
-
-        if (null != fieldTypeClass) {
-            return this.atomicTypeConverterProvider.getAtomicTypeConverter(fieldTypeClass);
-        }
-        else {
-            return NULL_CONVERTER;
-        }
-    }
-    
-    protected ClassDescriptor getClassDescriptor(Class beanClass) {
-        ClassDescriptor classDescriptor = mapper.getClassDescriptor(beanClass);
-        if(null == classDescriptor) {
-            throw new JcrMappingException("Class of type: " + beanClass.getName()
-                    + " is not JCR persistable. Maybe element 'class-descriptor' for this type in mapping file is missing");
-        }
-
-//        if(classDescriptor.isAbstract()) 
-//        {
-//        	      throw new PersistenceException("Cannot persist/retrieve abstract class " + beanClass.getName());
-//        }
-
-        return classDescriptor;
-    }
-    
+	private void retrieveCollectionFields(Session session, ClassDescriptor classDescriptor, Node parentNode, Object object) {
+		Iterator collectionDescriptorIterator = classDescriptor.getCollectionDescriptors().iterator();
+		while (collectionDescriptorIterator.hasNext()) {
+			CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
+			CollectionConverter collectionConverter = this.getCollectionConverter(session, collectionDescriptor);
+			Class collectionFieldClass = ReflectionUtils.getPropertyType(object, collectionDescriptor.getFieldName());
+			ManageableCollection collection = null;
+			if (collectionDescriptor.isProxy()) {
+				collection = (ManageableCollection)  proxyManager.createCollectionProxy(session, collectionConverter, parentNode, collectionDescriptor,collectionFieldClass);
+
+			}
+			else 
+			{
+			     collection = collectionConverter.getCollection(session, parentNode, collectionDescriptor,	collectionFieldClass);
+			}
+			
+			ReflectionUtils.setNestedProperty(object, collectionDescriptor.getFieldName(), collection);
+		}
+	}
+
+	/**
+	 * Insert Bean fields
+	 */
+	private void insertBeanFields(Session session, Object object, ClassDescriptor classDescriptor, Node objectNode) {
+		Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors().iterator();
+		while (beanDescriptorIterator.hasNext()) {
+			BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator.next();
+			String jcrName = beanDescriptor.getJcrName();
+			Object bean = ReflectionUtils.getNestedProperty(object, beanDescriptor.getFieldName());
+			if (bean != null) {
+				if (beanDescriptor.isInline()) {
+					this.storeSimpleFields(session, bean, getClassDescriptor(bean.getClass()), objectNode);
+				} else if (null != beanDescriptor.getBeanConverter()) {
+					beanDescriptor.getBeanConverter().insert(session, objectNode, beanDescriptor, object);
+				} else {
+					this.insert(session, objectNode, jcrName, bean);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Update Bean fields
+	 */
+	private void updateBeanFields(Session session, Object object, ClassDescriptor classDescriptor, Node objectNode) {
+		String jcrName = null;
+		try {
+			Iterator beanDescriptorIterator = classDescriptor.getBeanDescriptors().iterator();
+			while (beanDescriptorIterator.hasNext()) {
+				BeanDescriptor beanDescriptor = (BeanDescriptor) beanDescriptorIterator.next();
+				jcrName = beanDescriptor.getJcrName();
+				Object bean = ReflectionUtils.getNestedProperty(object, beanDescriptor.getFieldName());
+
+				// if the bean is null, remove existing node
+				if ((bean == null)) {
+					if (beanDescriptor.isInline()) {
+						Class beanClass = ReflectionUtils.getPropertyType(object, beanDescriptor.getFieldName());
+						this.storeSimpleFields(session, bean, getClassDescriptor(beanClass), objectNode);
+					} else if (null != beanDescriptor.getBeanConverter()) {
+						beanDescriptor.getBeanConverter().remove(session, objectNode, beanDescriptor);
+					} else {
+						if (objectNode.hasNode(jcrName)) {
+							objectNode.getNode(jcrName).remove();
+						}
+					}
+				} else {
+					if (beanDescriptor.isInline()) {
+						this.storeSimpleFields(session, bean, getClassDescriptor(bean.getClass()), objectNode);
+					} else if (null != beanDescriptor.getBeanConverter()) {
+						beanDescriptor.getBeanConverter().update(session, objectNode, beanDescriptor, bean);
+					} else {
+						this.update(session, objectNode, jcrName, bean);
+					}
+				}
+			}
+		} catch (VersionException ve) {
+			throw new PersistenceException("Cannot remove bean at path " + jcrName, ve);
+		} catch (LockException le) {
+			throw new PersistenceException("Cannot remove bean at path " + jcrName + ". Item is locked.", le);
+		} catch (ConstraintViolationException cve) {
+			throw new PersistenceException("Cannot remove bean at path " + jcrName + ". Contraint violation.", cve);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot remove bean at path " + jcrName, re);
+		}
+	}
+
+	private void insertCollectionFields(Session session, Object object, ClassDescriptor classDescriptor, Node objectNode) {
+		Iterator collectionDescriptorIterator = classDescriptor.getCollectionDescriptors().iterator();
+
+		while (collectionDescriptorIterator.hasNext()) {
+			CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
+			CollectionConverter collectionConverter = this.getCollectionConverter(session, collectionDescriptor);
+			Object collection = ReflectionUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
+			ManageableCollection manageableCollection = ManageableCollectionUtil.getManageableCollection(collection);
+
+			collectionConverter.insertCollection(session, objectNode, collectionDescriptor, manageableCollection);
+		}
+	}
+
+	private void updateCollectionFields(Session session, Object object, ClassDescriptor classDescriptor, Node objectNode) {
+		Iterator collectionDescriptorIterator = classDescriptor.getCollectionDescriptors().iterator();
+
+		while (collectionDescriptorIterator.hasNext()) {
+			CollectionDescriptor collectionDescriptor = (CollectionDescriptor) collectionDescriptorIterator.next();
+			CollectionConverter collectionConverter = this.getCollectionConverter(session, collectionDescriptor);
+			Object collection = ReflectionUtils.getNestedProperty(object, collectionDescriptor.getFieldName());
+			ManageableCollection manageableCollection = ManageableCollectionUtil.getManageableCollection(collection);
+
+			collectionConverter.updateCollection(session, objectNode, collectionDescriptor, manageableCollection);
+		}
+	}
+
+	private void storeSimpleFields(Session session, Object object, ClassDescriptor classDescriptor, Node objectNode) {
+		try {
+			ValueFactory valueFactory = session.getValueFactory();
+
+			Iterator fieldDescriptorIterator = classDescriptor.getFieldDescriptors().iterator();
+			while (fieldDescriptorIterator.hasNext()) {
+				FieldDescriptor fieldDescriptor = (FieldDescriptor) fieldDescriptorIterator.next();
+
+				String fieldName = fieldDescriptor.getFieldName();
+				String jcrName = fieldDescriptor.getJcrName();
+
+				// Of course, Path field is not stored as property
+				if (fieldDescriptor.isPath()) {
+					continue;
+				}
+
+				if (classDescriptor.usesNodeTypePerHierarchyStrategy() && fieldDescriptor.isDiscriminator()) {
+					objectNode.setProperty(fieldDescriptor.getJcrName(), classDescriptor.getClassName());
+					continue;
+				}
+
+				boolean protectedProperty = fieldDescriptor.isJcrProtected();
+
+				if (objectNode.hasProperty(jcrName)) {
+					protectedProperty = objectNode.getProperty(jcrName).getDefinition().isProtected();
+				}
+
+				if (!protectedProperty) { // DO NOT TRY TO WRITE PROTECTED
+											// PROPERTIES
+					Object fieldValue = ReflectionUtils.getNestedProperty(object, fieldName);
+					AtomicTypeConverter converter = getAtomicTypeConverter(fieldDescriptor, object, fieldName);
+					Value value = converter.getValue(valueFactory, fieldValue);
+
+					// Check if the node property is "autocreated"
+					boolean autoCreated = fieldDescriptor.isJcrAutoCreated();
+
+					if (objectNode.hasProperty(jcrName)) {
+						autoCreated = objectNode.getProperty(jcrName).getDefinition().isAutoCreated();
+					}
+
+					if (!autoCreated) {
+						// Check if mandatory property are not null
+						checkMandatoryProperty(objectNode, fieldDescriptor, value);
+					}
+
+					objectNode.setProperty(jcrName, value);
+				}
+			}
+		} catch (ValueFormatException vfe) {
+			throw new PersistenceException("Cannot persist properties of object " + object + ". Value format exception.", vfe);
+		} catch (VersionException ve) {
+			throw new PersistenceException("Cannot persist properties of object " + object + ". Versioning exception.", ve);
+		} catch (LockException le) {
+			throw new PersistenceException("Cannot persist properties of object " + object + " on locked node.", le);
+		} catch (ConstraintViolationException cve) {
+			throw new PersistenceException("Cannot persist properties of object " + object + ". Constraint violation.", cve);
+		} catch (RepositoryException re) {
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot persist properties of object "
+					+ object, re);
+		}
+	}
+
+	private CollectionConverter getCollectionConverter(Session session, CollectionDescriptor collectionDescriptor) {
+		String className = collectionDescriptor.getCollectionConverterClassName();
+		Map atomicTypeConverters = this.atomicTypeConverterProvider.getAtomicTypeConverters();
+		if (className == null) {
+			return new DefaultCollectionConverterImpl(atomicTypeConverters, this, this.mapper);
+		} else {
+			return (CollectionConverter) ReflectionUtils.invokeConstructor(className, new Object[]{atomicTypeConverters, this,
+					this.mapper});
+		}
+
+	}
+
+	private void checkMandatoryProperty(Node objectNode, FieldDescriptor fieldDescriptor, Value value) throws RepositoryException {
+		PropertyDefinition[] propertyDefinitions = objectNode.getPrimaryNodeType().getDeclaredPropertyDefinitions();
+		for (int i = 0; i < propertyDefinitions.length; i++) {
+			PropertyDefinition definition = propertyDefinitions[i];
+			if (definition.getName().equals(fieldDescriptor.getJcrName()) && definition.isMandatory()
+					&& (definition.isAutoCreated() == false) && (value == null)) {
+				throw new PersistenceException("Class of type:" + fieldDescriptor.getClassDescriptor().getClassName()
+						+ " has property: " + fieldDescriptor.getFieldName() + " declared as JCR property: "
+						+ fieldDescriptor.getJcrName() + " This property is mandatory but property in bean has value null");
+			}
+		}
+	}
+
+	private AtomicTypeConverter getAtomicTypeConverter(FieldDescriptor fd, Object object, String fieldName) {
+		Class fieldTypeClass = null;
+		if (null != fd.getFieldTypeClass()) {
+			fieldTypeClass = fd.getFieldTypeClass();
+		} else if (null != object) {
+			fieldTypeClass = ReflectionUtils.getPropertyType(object, fieldName);
+		}
+
+		if (null != fieldTypeClass) {
+			return this.atomicTypeConverterProvider.getAtomicTypeConverter(fieldTypeClass);
+		} else {
+			return NULL_CONVERTER;
+		}
+	}
+
+	private ClassDescriptor getClassDescriptor(Class beanClass) {
+		ClassDescriptor classDescriptor = mapper.getClassDescriptor(beanClass);
+		if (null == classDescriptor) {
+			throw new JcrMappingException("Class of type: " + beanClass.getName()
+					+ " is not JCR persistable. Maybe element 'class-descriptor' for this type in mapping file is missing");
+		}
+
+		// if(classDescriptor.isAbstract())
+		// {
+		// throw new PersistenceException("Cannot persist/retrieve abstract
+		// class " + beanClass.getName());
+		// }
+
+		return classDescriptor;
+	}
+
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyManager.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyManager.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyManager.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyManager.java Wed Apr 12 14:15:26 2006
@@ -16,6 +16,7 @@
 
 package org.apache.portals.graffito.jcr.persistence.objectconverter.impl;
 
+import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
@@ -24,20 +25,18 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection;
+import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollectionUtil;
 import org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter;
 
 public class ProxyManager {
 
 	 private final static Log log = LogFactory.getLog(ProxyManager.class);
 	
-	 private ObjectConverter objectConverter;
 	 
-	 public ProxyManager(ObjectConverter objectConverter)
-	 {
-		 	this.objectConverter = objectConverter;
-	 }
-	 
-	public  Object createBeanProxy(Session session, Class beanClass, String path) 
+	public  Object createBeanProxy(Session session, ObjectConverter objectConverter,  Class beanClass, String path) 
 	{
 		
        try {
@@ -45,13 +44,24 @@
 				return null;
 			}
 		} catch (RepositoryException e) {
-			throw new org.apache.portals.graffito.jcr.exception.RepositoryException(
-					"Impossible to check,if the object exits on " + path, e);
+			throw new org.apache.portals.graffito.jcr.exception.RepositoryException(	"Impossible to check,if the object exits on " + path, e);
 		}
-		
-		log.debug("Create proxy for " + path);
-		LazyLoader loader = new BeanLazyLoader(this.objectConverter, session, beanClass, path) ;		
+				
+		LazyLoader loader = new BeanLazyLoader(objectConverter, session, beanClass, path) ;		
 		return  Enhancer.create(beanClass, loader);
 	}
 
+	
+	public  Object createCollectionProxy(Session session, CollectionConverter collectionConverter, Node parentNode,  CollectionDescriptor collectionDescriptor, Class collectionFieldClass) 
+	{	
+		
+		if (collectionConverter.isNull(session, parentNode, collectionDescriptor, collectionFieldClass)) 	{
+			return null;
+		}
+		
+		ManageableCollection manageableCollection = ManageableCollectionUtil.getManageableCollection(collectionFieldClass);
+		
+		LazyLoader loader = new CollectionLazyLoader(collectionConverter, session, parentNode, collectionDescriptor, collectionFieldClass);
+		return  Enhancer.create(manageableCollection.getClass(), loader);
+	}	
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/java/org/apache/portals/graffito/jcr/reflection/ReflectionUtils.java Wed Apr 12 14:15:26 2006
@@ -141,7 +141,7 @@
     }
     
     public static boolean isProxy(Class beanClass)
-    {
+    {    	        	     
          return Enhancer.isEnhanced(beanClass);	
     }
     
@@ -155,4 +155,5 @@
          }
          return beanClass;
     }
+    
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-inheritance.xml Wed Apr 12 14:15:26 2006
@@ -40,7 +40,7 @@
 
 	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.Folder" jcrNodeType="graffito:folder" 
 	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.CmsObject" >
-		<collection-descriptor fieldName="children" proxy="false" 
+		<collection-descriptor fieldName="children" proxy="true" 
 		                       elementClassName="org.apache.portals.graffito.jcr.testmodel.inheritance.CmsObject" 
 		                       collectionConverter="org.apache.portals.graffito.jcr.persistence.collectionconverter.impl.NTCollectionConverterImpl" />
 	</class-descriptor >	
@@ -53,7 +53,7 @@
 	                                   extends="org.apache.portals.graffito.jcr.testmodel.inheritance.Content" >
 		<field-descriptor fieldName="contentType" jcrName="graffito:contenttype" />  
 		<field-descriptor fieldName="size" jcrName="graffito:size" />  	
-		<bean-descriptor fieldName="documentStream" jcrName="graffito:documentstream"  />			
+		<bean-descriptor fieldName="documentStream" jcrName="graffito:documentstream" proxy="true"  />			
 	</class-descriptor >	
 
 	<class-descriptor className="org.apache.portals.graffito.jcr.testmodel.inheritance.DocumentStream" jcrNodeType="graffito:documentstream"  >

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test-config/jcrmapping-proxy.xml Wed Apr 12 14:15:26 2006
@@ -8,10 +8,15 @@
 		<field-descriptor fieldName="path" path="true" />
 		<bean-descriptor fieldName="proxyDetail" jcrName="proxydetail" proxy="true" jcrNodeType="nt:unstructured" />		
 		<bean-descriptor fieldName="nullDetail" jcrName="nulldetail" proxy="true" jcrNodeType="nt:unstructured" />		
-		<bean-descriptor fieldName="detail" jcrName="detail" proxy="false" jcrNodeType="nt:unstructured" />		
+		<bean-descriptor fieldName="detail" jcrName="detail" proxy="false" jcrNodeType="nt:unstructured" />		
+		
+		<collection-descriptor fieldName="proxyCollection" jcrName="proxycollection" proxy="true"
+                                                  elementClassName="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" jcrNodeType="nt:unstructured"/>
+        <collection-descriptor fieldName="nullProxyCollection" jcrName="nullproxycollection" proxy="true"
+                                                  elementClassName="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" jcrNodeType="nt:unstructured"/>                                                  		
 	</class-descriptor>
 
-	<class-descriptor 	className="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" 	jcrNodeType="nt:unstructured">		
+	<class-descriptor 	className="org.apache.portals.graffito.jcr.testmodel.proxy.Detail" jcrNodeType="nt:unstructured">		
 		<field-descriptor fieldName="path" path="true" />
 		<field-descriptor fieldName="field" jcrName="field" />
 	</class-descriptor>

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/mapper/DigesterMapperImplTest.java Wed Apr 12 14:15:26 2006
@@ -359,9 +359,9 @@
 
 			ClassDescriptor classDescriptor = mapper.getClassDescriptor(Main.class);
 			assertNotNull("ClassDescriptor is null", classDescriptor);
-			assertTrue("Invalid proxy setting", classDescriptor.getBeanDescriptor("proxyDetail").isProxy());
-			assertFalse("Invalid proxy setting", classDescriptor.getBeanDescriptor("detail").isProxy());
-			
+			assertTrue("Invalid proxy setting for bean field proxyDetail ", classDescriptor.getBeanDescriptor("proxyDetail").isProxy());
+			assertFalse("Invalid proxy setting for bean field detail  ", classDescriptor.getBeanDescriptor("detail").isProxy());
+			assertTrue("Invalid proxy setting for collection field proxyDetail ", classDescriptor.getCollectionDescriptor("proxyCollection").isProxy());
 			
 		} catch (JcrMappingException e) {
 			e.printStackTrace();

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtConcreteClassTest.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtConcreteClassTest.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtConcreteClassTest.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/impl/PersistenceManagerNtConcreteClassTest.java Wed Apr 12 14:15:26 2006
@@ -291,5 +291,52 @@
 		assertTrue("Invalid item in the collection", this.contains(result, "/folder2/subfolder",Folder.class));
 		
 	}
+	  
+	public void testBeanCollection() {
+		PersistenceManager persistenceManager = this.getPersistenceManager();
+
+		//---------------------------------------------------------------------------------------------------------
+		// Insert cmsobjects
+		//---------------------------------------------------------------------------------------------------------
+		 Folder folder = new Folder();		
+	     folder.setPath("/mainfolder");
+	     folder.setName("Main folder");        
 	    
+	     for (int i=1; i<=100;i++)
+	     {
+	         Document document = new Document();	        
+	         document.setName("document" + i);
+	         document.setContentType("plain/text"); 
+	         DocumentStream documentStream = new DocumentStream();
+	         documentStream.setEncoding("utf-8");
+	         documentStream.setContent("Test Content".getBytes());
+	         document.setDocumentStream(documentStream);
+	         folder.addChild(document);
+	         
+	         Folder subFolder = new Folder();
+	         subFolder.setName("folder" + i);
+	         subFolder.addChild(document);
+	         folder.addChild(subFolder);
+	         	    	 
+	     }
+	     log.debug("Save the folder and its 200 children");   
+	     persistenceManager.insert(folder);
+	     persistenceManager.save();
+	     log.debug("End - Save the folder and its 200 children");
+
+		//---------------------------------------------------------------------------------------------------------	
+		// Retrieve Folder
+		//---------------------------------------------------------------------------------------------------------			
+		folder  = (Folder) persistenceManager.getObject(Folder.class,"/mainfolder");
+		assertNotNull("Folder is null",folder);		
+		Collection children = folder.getChildren();
+		assertEquals("Invalid number of children", children.size(), 200);
+	     for (int i=1; i<=100;i++)
+	     {
+		     assertTrue("Invalid item in the collection : " +"/mainfolder/document" + i , this.contains(children, "/mainfolder/document" + i,Document.class));
+		    assertTrue("Invalid item in the collection : " + "/mainfolder/folder" + i, this.contains(children, "/mainfolder/folder" + i, Folder.class));
+	     }
+		
+	
+	}	
 }

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyTest.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyTest.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyTest.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/persistence/objectconverter/impl/ProxyTest.java Wed Apr 12 14:15:26 2006
@@ -16,6 +16,9 @@
  */
 package org.apache.portals.graffito.jcr.persistence.objectconverter.impl;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
@@ -80,7 +83,6 @@
 			//---------------------------------------------------------------------------------------------------------
 			// Retrieve the main object
 			//---------------------------------------------------------------------------------------------------------						
-
 			main = (Main) persistenceManager.getObject(Main.class, "/test");
 			assertNotNull("detail is null", main.getDetail());
 			assertTrue("Invalid detail bean", main.getDetail().getField().equals("FieldValue"));
@@ -129,9 +131,67 @@
 			e.printStackTrace();
 			fail();
 		}
-       
+
+		
 	}
 	
+	public void testCollectionProxy() {
+
+		try {
+			PersistenceManager persistenceManager = this.getPersistenceManager();
+
+			ArrayList  details= new ArrayList();
+			for(int i=1; i<=100;i++)
+			{
+				Detail detail = new Detail();
+				detail.setField("field" + i);				
+				details.add(detail);
+			}
+			
+			Main main = new Main();
+			main.setProxyCollection(details);
+			main.setPath("/test");							
+            persistenceManager.insert(main);
+			persistenceManager.save();
+			
+			
+			//---------------------------------------------------------------------------------------------------------
+			// Retrieve the main object
+			//---------------------------------------------------------------------------------------------------------						
+			main = (Main) persistenceManager.getObject(Main.class, "/test");
+			assertNotNull("main is null", main);
+
+            Collection result = main.getProxyCollection();
+            assertEquals("Invalide size", result.size(), 100);
+            assertNull("nullcollectionproxy  is not null", main.getNullProxyCollection());
+			
+			//---------------------------------------------------------------------------------------------------------
+			// Update  
+			//---------------------------------------------------------------------------------------------------------
+            
+            Detail detail = new Detail();
+			detail.setField("newFieldValue");			
+			result.add(detail);
+			main.setProxyCollection(result);
+			persistenceManager.update(main);
+			persistenceManager.save();
+
+			//---------------------------------------------------------------------------------------------------------
+			// Retrieve the main object
+			//---------------------------------------------------------------------------------------------------------						
+			main = (Main) persistenceManager.getObject(Main.class, "/test");
+			assertNotNull("main  is null", main);
+            assertEquals("Invalide size",main.getProxyCollection().size(), 101);
+            assertNull("nullcollectionproxy  is not null", main.getNullProxyCollection());
+            
+	
+		} catch (Exception e) {
+			e.printStackTrace();
+			fail();
+		}
+
+		
+	}
 
 
 

Modified: incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/proxy/Main.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/proxy/Main.java?rev=393615&r1=393614&r2=393615&view=diff
==============================================================================
--- incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/proxy/Main.java (original)
+++ incubator/graffito/trunk/jcr/jcr-mapping/src/test/org/apache/portals/graffito/jcr/testmodel/proxy/Main.java Wed Apr 12 14:15:26 2006
@@ -16,6 +16,8 @@
  */
 package org.apache.portals.graffito.jcr.testmodel.proxy;
 
+import java.util.Collection;
+
 public class Main 
 {
 
@@ -23,6 +25,8 @@
 	private Detail proxyDetail;
 	private Detail nullDetail; 
     private Detail detail;
+    private Collection proxyCollection;
+    private Collection nullProxyCollection;
 
      
 	public String getPath() {
@@ -56,7 +60,23 @@
 	public void setNullDetail(Detail nullDetail) {
 		this.nullDetail = nullDetail;
 	}
-     
+
+	public Collection getProxyCollection() {
+		return proxyCollection;
+	}
+
+	public void setProxyCollection(Collection proxyCollection) {
+		this.proxyCollection = proxyCollection;
+	}
+
+	public Collection getNullProxyCollection() {
+		return nullProxyCollection;
+	}
+
+	public void setNullProxyCollection(Collection nullProxyCollection) {
+		this.nullProxyCollection = nullProxyCollection;
+	}
+	
 	
      
 }