You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by cl...@apache.org on 2008/05/28 21:01:54 UTC

svn commit: r661049 - in /jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter: ./ impl/

Author: clombart
Date: Wed May 28 12:01:53 2008
New Revision: 661049

URL: http://svn.apache.org/viewvc?rev=661049&view=rev
Log:
Applying patch for JCR-1624 provided by Stephane Landelle

Added:
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/AbstractLazyLoader.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxy.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxyUtils.java
Modified:
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ProxyManager.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/BeanLazyLoader.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/CollectionLazyLoader.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ProxyManagerImpl.java

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ProxyManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ProxyManager.java?rev=661049&r1=661048&r2=661049&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ProxyManager.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/ProxyManager.java Wed May 28 12:01:53 2008
@@ -19,17 +19,18 @@
 import javax.jcr.Node;
 import javax.jcr.Session;
 
+import org.apache.jackrabbit.ocm.manager.beanconverter.BeanConverter;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.CollectionConverter;
+import org.apache.jackrabbit.ocm.mapper.model.BeanDescriptor;
+import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor;
 import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor;
 
 public interface ProxyManager {
 
-	public abstract Object createBeanProxy(Session session,
-			ObjectConverter objectConverter, Class beanClass, String path);
+	Object createBeanProxy(BeanConverter beanConverter, String path, Session session, Node parentNode, BeanDescriptor beanDescriptor,
+			ClassDescriptor beanClassDescriptor, Class beanClass, Object parent);
 
-	public abstract Object createCollectionProxy(Session session,
-			CollectionConverter collectionConverter, Node parentNode,
-			CollectionDescriptor collectionDescriptor,
-			Class collectionFieldClass);
+	Object createCollectionProxy(Session session, CollectionConverter collectionConverter, Node parentNode,
+			CollectionDescriptor collectionDescriptor, Class collectionFieldClass);
 
 }
\ No newline at end of file

Added: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/AbstractLazyLoader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/AbstractLazyLoader.java?rev=661049&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/AbstractLazyLoader.java (added)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/AbstractLazyLoader.java Wed May 28 12:01:53 2008
@@ -0,0 +1,104 @@
+package org.apache.jackrabbit.ocm.manager.objectconverter.impl;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import net.sf.cglib.proxy.InvocationHandler;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Parent Class of the OCM Lazy Loaders
+ * 
+ * @author <a href="mailto:slandelle@excilys.com">Stephane LANDELLE</a>
+ */
+public abstract class AbstractLazyLoader implements InvocationHandler {
+
+	/**
+	 * The logger
+	 */
+	private final static Log log = LogFactory.getLog(AbstractLazyLoader.class);
+
+	/**
+	 * The proxified instance
+	 */
+	private Object target = null;
+
+	/**
+	 * Indicate if the proxy has been loaded
+	 */
+	private boolean initialized = false;
+
+	/**
+	 * Return the proxified instance
+	 * 
+	 * @return the proxified instance
+	 */
+	protected Object getTarget() {
+		if (!initialized) {
+			target = fetchTarget();
+			initialized = true;
+			if (log.isDebugEnabled()) {
+				log.debug("Target loaded");
+			}
+		}
+		return target;
+	}
+
+	/**
+	 * Fetch the proxified instance
+	 * 
+	 * @return the proxified instance
+	 */
+	protected abstract Object fetchTarget();
+
+	/**
+	 * Getter of property initialized
+	 * 
+	 * @return initialized
+	 */
+	public boolean isInitialized() {
+		return initialized;
+	}
+
+	/**
+	 * Invoke proxy methods : delegate to proxified instance except for OcmProxy
+	 * methods that are intercepted (because not concretely implemented)
+	 * 
+	 * @see net.sf.cglib.proxy.InvocationHandler#invoke(java.lang.Object,
+	 *      java.lang.reflect.Method, java.lang.Object[])
+	 */
+	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+
+		if (!(proxy instanceof OcmProxy)) {
+			throw new IllegalArgumentException("proxy should implement OcmProxy");
+		}
+
+		// proxified methods without concrete implementation
+		if (args.length == 0) {
+			if (method.getName().equals("isInitialized")) {
+				return isInitialized();
+
+			} else if (method.getName().equals("fetch")) {
+				getTarget();
+				return null;
+			}
+		}
+
+		Object returnValue = null;
+
+		if (Modifier.isPublic(method.getModifiers())) {
+			if (!method.getDeclaringClass().isInstance(getTarget())) {
+				throw new ClassCastException(getTarget().getClass().getName());
+			}
+			returnValue = method.invoke(getTarget(), args);
+		} else {
+			if (!method.isAccessible()) {
+				method.setAccessible(true);
+			}
+			returnValue = method.invoke(getTarget(), args);
+		}
+		return returnValue == getTarget() ? proxy : returnValue;
+	}
+}

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/BeanLazyLoader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/BeanLazyLoader.java?rev=661049&r1=661048&r2=661049&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/BeanLazyLoader.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/BeanLazyLoader.java Wed May 28 12:01:53 2008
@@ -17,35 +17,51 @@
 
 package org.apache.jackrabbit.ocm.manager.objectconverter.impl;
 
+import javax.jcr.Node;
 import javax.jcr.Session;
 
-import net.sf.cglib.proxy.LazyLoader;
+import org.apache.jackrabbit.ocm.manager.beanconverter.BeanConverter;
+import org.apache.jackrabbit.ocm.mapper.model.BeanDescriptor;
+import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor;
+
+public class BeanLazyLoader extends AbstractLazyLoader {
+
+	private BeanConverter beanConverter;
+	private Session session;
+	private Node parentNode;
+	private BeanDescriptor beanDescriptor;
+	private ClassDescriptor beanClassDescriptor;
+	private Class<?> beanClass;
+	private Object parent;
+
+	public BeanLazyLoader(BeanConverter beanConverter, Session session, Node parentNode, BeanDescriptor beanDescriptor,
+			ClassDescriptor beanClassDescriptor, Class<?> beanClass, Object parent) {
+		this.beanConverter = beanConverter;
+		this.session = session;
+		this.parentNode = parentNode;
+		this.beanDescriptor = beanDescriptor;
+		this.beanClassDescriptor = beanClassDescriptor;
+		this.beanClass = beanClass;
+		this.parent = parent;
+	}
+
+	@Override
+	protected Object fetchTarget() {
+		if (isInitialized()) {
+			throw new IllegalStateException("Proxy already initialized");
+		}
+
+		Object target = beanConverter.getObject(session, parentNode, beanDescriptor, beanClassDescriptor, beanClass, parent);
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter;
-
-public class BeanLazyLoader implements LazyLoader
-{
-
-	 private final static Log log = LogFactory.getLog(BeanLazyLoader.class);
-	
-	 private ObjectConverter objectConverter;
-	 private Session session;
-	 private Class beanClass;
-	 private String path;
-	
-	
-	public BeanLazyLoader(ObjectConverter objectConverter, Session session, Class beanClass, String path)
-	{
-	     this.objectConverter = objectConverter;
-	     this.session = session;
-	     this.beanClass = beanClass;
-	     this.path = path;
+		clean();
+		return target;
 	}
 
-	public Object loadObject()
-	{				
-		return objectConverter.getObject(session, beanClass, path);		
+	private void clean() {
+		 beanConverter = null;
+		 session = null;
+		 parentNode = null;
+		 beanDescriptor = null;
+		 parent = null;
 	}
 }

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/CollectionLazyLoader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/CollectionLazyLoader.java?rev=661049&r1=661048&r2=661049&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/CollectionLazyLoader.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/CollectionLazyLoader.java Wed May 28 12:01:53 2008
@@ -20,26 +20,20 @@
 import javax.jcr.Node;
 import javax.jcr.Session;
 
-import net.sf.cglib.proxy.LazyLoader;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.CollectionConverter;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjects;
 import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor;
 
-public class CollectionLazyLoader implements LazyLoader {
-
-	private final static Log log = LogFactory.getLog(CollectionLazyLoader.class);
+public class CollectionLazyLoader extends AbstractLazyLoader {
 
 	private CollectionConverter collectionConverter;
 	private Session session;
 	private Node collectionParentNode;
 	private CollectionDescriptor collectionDescriptor;
-	private Class collectionFieldClass;
+	private Class<?> collectionFieldClass;
 
 	public CollectionLazyLoader(CollectionConverter collectionConverter, Session session, Node parentNode,
-			                                               CollectionDescriptor collectionDescriptor, Class collectionFieldClass ) {
+			CollectionDescriptor collectionDescriptor, Class<?> collectionFieldClass) {
 		this.collectionConverter = collectionConverter;
 		this.session = session;
 		this.collectionParentNode = parentNode;
@@ -47,10 +41,22 @@
 		this.collectionFieldClass = collectionFieldClass;
 	}
 
-	public Object loadObject() {
-
+	@Override
+	protected Object fetchTarget() {
+		if (isInitialized()) {
+			throw new IllegalStateException("Proxy already initialized");
+		}
+		ManageableObjects objects = collectionConverter.getCollection(session, collectionParentNode, collectionDescriptor,
+				collectionFieldClass);
+		Object target = objects.getObjects();
+		clean();
+		return target;
+	}
 
-		ManageableObjects objects = collectionConverter.getCollection(session, collectionParentNode, collectionDescriptor, collectionFieldClass);
-		return objects.getObjects();
+	private void clean() {
+		collectionConverter = null;
+		session = null;
+		collectionParentNode = null;
+		collectionDescriptor = null;
 	}
 }

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java?rev=661049&r1=661048&r2=661049&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java Wed May 28 12:01:53 2008
@@ -34,6 +34,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.ocm.exception.IncorrectPersistentClassException;
 import org.apache.jackrabbit.ocm.exception.JcrMappingException;
 import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;
 import org.apache.jackrabbit.ocm.manager.ManagerConstant;
@@ -42,9 +43,8 @@
 import org.apache.jackrabbit.ocm.manager.cache.ObjectCache;
 import org.apache.jackrabbit.ocm.manager.cache.impl.RequestObjectCacheImpl;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.CollectionConverter;
-import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableCollection;
-import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjectsUtil;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjects;
+import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjectsUtil;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.impl.DefaultCollectionConverterImpl;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableCollectionImpl;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableMapImpl;
@@ -656,7 +656,6 @@
 		{
 			Class beanClass = ReflectionUtils.getPropertyType(object, beanName);
 
-
 			String converterClassName = null;
 			if (null == beanDescriptor.getConverter() || "".equals(beanDescriptor.getConverter()))
 			{
@@ -671,7 +670,24 @@
 			BeanConverter beanConverter = (BeanConverter) ReflectionUtils.invokeConstructor(converterClassName, param);
 			if (beanDescriptor.isProxy())
 			{
-				bean = proxyManager.createBeanProxy(session, this, beanClass, beanConverter.getPath(session, beanDescriptor, node));
+				if (beanDescriptor.getJcrType() != null && !"".equals(beanDescriptor.getJcrType())) {
+					// If a mapped jcrType has been set, use it as proxy parent class instead of the bean property type.
+					// This way, we can handle proxies when bean property type is an interface.
+					try {
+						String className = mapper.getClassDescriptorByNodeType(beanDescriptor.getJcrType()).getClassName();
+						if (log.isDebugEnabled()) {
+							log.debug("a mapped jcrType has been specified, switching from <" + beanClass + "> to <" + ReflectionUtils.forName(className));
+						}
+						beanClass = ReflectionUtils.forName(className);
+					
+					} catch (IncorrectPersistentClassException e) {
+						if (log.isDebugEnabled()) {
+							log.debug(beanDescriptor.getClassDescriptor().getJcrType() + " is not mapped");
+						}
+					}					
+				}
+
+				bean = proxyManager.createBeanProxy(beanConverter, beanConverter.getPath(session, beanDescriptor, node), session, node, beanDescriptor,  mapper.getClassDescriptorByClass(beanClass), beanClass, bean);
 			}
 			else
 			{

Added: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxy.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxy.java?rev=661049&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxy.java (added)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxy.java Wed May 28 12:01:53 2008
@@ -0,0 +1,23 @@
+package org.apache.jackrabbit.ocm.manager.objectconverter.impl;
+
+import java.io.Serializable;
+
+/**
+ * Interface implemented by lazy loading proxies
+ * 
+ * @author <a href="mailto:slandelle@excilys.com">Stephane LANDELLE</a>
+ */
+public interface OcmProxy extends Serializable {
+
+	/**
+	 * Check is the proxy has been loaded
+	 *
+	 * @return true is the proxy has been loaded
+	 */
+	boolean isInitialized();
+
+	/**
+	 * Force proxy fetching
+	 */
+	void fetch();
+}

Added: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxyUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxyUtils.java?rev=661049&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxyUtils.java (added)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/OcmProxyUtils.java Wed May 28 12:01:53 2008
@@ -0,0 +1,53 @@
+package org.apache.jackrabbit.ocm.manager.objectconverter.impl;
+
+/**
+ * Utils class for proxy nandling
+ * 
+ * @author <a href="mailto:slandelle@excilys.com">Stephane LANDELLE</a>
+ */
+public abstract class OcmProxyUtils {
+
+	/**
+	 * Check if an object is an OCM proxy
+	 * 
+	 * @param object
+	 *            the Object to check
+	 * @return true is the object is an OCM proxy
+	 */
+	public static boolean isProxy(Object object) {
+		return object instanceof OcmProxy;
+	}
+
+	/**
+	 * Check is an Object is not an unitialized OCM proxy
+	 * @see OcmProxy.isInitialized()
+	 * 
+	 * @param object
+	 *            the Object to check
+	 * @return true if the object is not an OCM proxy or if it has already been
+	 *         initialized
+	 */
+	public static boolean isInitialized(Object object) {
+		if (!isProxy(object)) {
+			return true;
+
+		} else {
+			return ((OcmProxy) object).isInitialized();
+		}
+	}
+
+	/**
+	 * Force fetching of an abject
+	 *
+	 * @param <T> the type of the object to fetch
+	 * @param object the object to fetch
+	 * @return the fetched object
+	 */
+	public static <T> T fetch(T object) {
+
+		if (isProxy(object)) {
+			((OcmProxy) object).fetch();
+		}
+		return object;
+	}
+}

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ProxyManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ProxyManagerImpl.java?rev=661049&r1=661048&r2=661049&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ProxyManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ProxyManagerImpl.java Wed May 28 12:01:53 2008
@@ -21,59 +21,66 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import net.sf.cglib.proxy.Callback;
 import net.sf.cglib.proxy.Enhancer;
-import net.sf.cglib.proxy.LazyLoader;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.jackrabbit.ocm.manager.beanconverter.BeanConverter;
 import org.apache.jackrabbit.ocm.manager.collectionconverter.CollectionConverter;
-import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjectsUtil;
-import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjects;
-import org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter;
 import org.apache.jackrabbit.ocm.manager.objectconverter.ProxyManager;
+import org.apache.jackrabbit.ocm.mapper.model.BeanDescriptor;
+import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor;
 import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor;
-import org.apache.jackrabbit.ocm.reflection.ReflectionUtils;
-
-public class ProxyManagerImpl implements ProxyManager
-{
-
-	private final static Log log = LogFactory.getLog(ProxyManagerImpl.class);
-
 
+public class ProxyManagerImpl implements ProxyManager {
 
 	/**
-	 *
-	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ProxyManager#createBeanProxy(javax.jcr.Session, org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter, java.lang.Class, java.lang.String)
+	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ProxyManager#createBeanProxy(javax.jcr.Session,
+	 *      org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter,
+	 *      java.lang.Class, java.lang.String)
 	 */
-	public  Object createBeanProxy(Session session, ObjectConverter objectConverter, Class beanClass, String path)
-	{
-
-       try {
-			if (!session.itemExists(path)) {
+	public Object createBeanProxy(BeanConverter beanConverter, String path, Session session, Node parentNode,
+			BeanDescriptor beanDescriptor, ClassDescriptor beanClassDescriptor, Class beanClass, Object parent) {
+		try {
+			if (path == null || !session.itemExists(path)) {
 				return null;
 			}
 		} catch (RepositoryException e) {
 			throw new org.apache.jackrabbit.ocm.exception.RepositoryException("Impossible to check,if the object exits on " + path, e);
 		}
 
-		LazyLoader loader = new BeanLazyLoader(objectConverter, session, beanClass, path) ;
-		return  Enhancer.create(beanClass, loader);
+		Callback loader = new BeanLazyLoader(beanConverter, session, parentNode, beanDescriptor, beanClassDescriptor, beanClass, parent);
+		return Enhancer.create(beanClass, getInterfaces(beanClass), loader);
 	}
 
 	/**
-	 *
-	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ProxyManager#createCollectionProxy(javax.jcr.Session, org.apache.jackrabbit.ocm.manager.collectionconverter.CollectionConverter, javax.jcr.Node, org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor, java.lang.Class)
+	 * @see org.apache.jackrabbit.ocm.manager.objectconverter.ProxyManager#createCollectionProxy(javax.jcr.Session,
+	 *      org.apache.jackrabbit.ocm.manager.collectionconverter.CollectionConverter,
+	 *      javax.jcr.Node,
+	 *      org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor,
+	 *      java.lang.Class)
 	 */
-	public  Object createCollectionProxy(Session session, CollectionConverter collectionConverter, Node parentNode,  CollectionDescriptor collectionDescriptor, Class collectionFieldClass)
-	{
+	public Object createCollectionProxy(Session session, CollectionConverter collectionConverter, Node parentNode,
+			CollectionDescriptor collectionDescriptor, Class collectionFieldClass) {
 
-		if (collectionConverter.isNull(session, parentNode, collectionDescriptor, collectionFieldClass)) 	{
+		if (collectionConverter.isNull(session, parentNode, collectionDescriptor, collectionFieldClass)) {
 			return null;
 		}
 
-		//ManageableObjects manageableCollection = ManageableObjectsUtil.getManageableObjects(collectionFieldClass);
-
-		LazyLoader loader = new CollectionLazyLoader(collectionConverter, session, parentNode, collectionDescriptor, collectionFieldClass);
-		return  Enhancer.create(collectionFieldClass, loader);
+		Callback loader = new CollectionLazyLoader(collectionConverter, session, parentNode, collectionDescriptor, collectionFieldClass);
+		return Enhancer.create(collectionFieldClass, getInterfaces(collectionFieldClass), loader);
+	}
+	
+	private Class<?>[] getInterfaces(Class<?> collectionFieldClass) {
+		
+		Class<?>[] interfaces = null;
+		if (collectionFieldClass.isInterface()) {
+			// if collectionFieldClass is an interface, simply use it
+			interfaces = new Class<?>[] { collectionFieldClass };
+		} else {
+			// else, use all interfaces
+			interfaces = collectionFieldClass.getInterfaces();
+		}
+		return (Class<?>[]) ArrayUtils.add(interfaces, OcmProxy.class);
 	}
 }