[ 
https://issues.apache.org/jira/browse/JCR-2046?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sandrine Raffalli updated JCR-2046:
-----------------------------------

    Description: 
The InvocationHandler of a proxy is called when the method finalize() is 
called, that means the proxy loads the object when the GC tries to delete it.
Adding a CallbackFilter to the Enhancer could be a solution to avoid that :

public class ProxyManagerImpl implements ProxyManager {

        private static final CallbackFilter FINALIZE_FILTER = new 
CallbackFilter() {
                public int accept(Method method) {
                        if (method.getParameterTypes().length == 0 && 
method.getName().equals("finalize")) {
                                return 1;
                        } else {
                                return 0;
                        }
                }
        };
       ...
        public Object createBeanProxy(BeanConverter beanConverter, String path, 
Session session, Node parentNode, BeanDescriptor beanDescriptor,
                        ClassDescriptor beanClassDescriptor, Class beanClass, 
Object parent) {
                ...
                return Enhancer.create(beanClass, getInterfaces(beanClass), 
FINALIZE_FILTER, new Callback[] { loader , NoOp.INSTANCE});
        }
        ...
        public Object createCollectionProxy(Session session, 
CollectionConverter collectionConverter, Node parentNode,
                        CollectionDescriptor collectionDescriptor, Class 
collectionFieldClass) {
               ....
                return Enhancer.create(collectionFieldClass, 
getInterfaces(collectionFieldClass), FINALIZE_FILTER, new Callback[] { loader , 
NoOp.INSTANCE});
        }

        ...
}

Maybe you may consider other methods such as "equals", "hashCode"...

  was:
The InvocationHandler of a proxy is called when the method finalize() is 
called, that means the proxy loads the object when the GC tries to delete it.
Adding a CallbackFilter to the Enhancer could be a solution to avoid that :

public class ProxyManagerImpl implements ProxyManager {

        private static final CallbackFilter FINALIZE_FILTER = new 
CallbackFilter() {
                public int accept(Method method) {
                        if (method.getParameterTypes().length == 0 && 
method.getName().equals("finalize")) {
                                return 1;
                        } else {
                                return 0;
                        }
                }
        };
       ...
        public Object createBeanProxy(BeanConverter beanConverter, String path, 
Session session, Node parentNode, BeanDescriptor beanDescriptor,
                        ClassDescriptor beanClassDescriptor, Class beanClass, 
Object parent) {
                ...
                return Enhancer.create(beanClass, getInterfaces(beanClass), 
FINALIZE_FILTER, new Callback[] { loader });
        }
        ...
        public Object createCollectionProxy(Session session, 
CollectionConverter collectionConverter, Node parentNode,
                        CollectionDescriptor collectionDescriptor, Class 
collectionFieldClass) {
               ....
                return Enhancer.create(collectionFieldClass, 
getInterfaces(collectionFieldClass), FINALIZE_FILTER, new Callback[] { loader 
});
        }

        ...
}

Maybe you may consider other methods such as "equals", "hashCode"...


> No Filter on method finalize for Proxy
> --------------------------------------
>
>                 Key: JCR-2046
>                 URL: https://issues.apache.org/jira/browse/JCR-2046
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-ocm
>            Reporter: Sandrine Raffalli
>
> The InvocationHandler of a proxy is called when the method finalize() is 
> called, that means the proxy loads the object when the GC tries to delete it.
> Adding a CallbackFilter to the Enhancer could be a solution to avoid that :
> public class ProxyManagerImpl implements ProxyManager {
>       private static final CallbackFilter FINALIZE_FILTER = new 
> CallbackFilter() {
>               public int accept(Method method) {
>                       if (method.getParameterTypes().length == 0 && 
> method.getName().equals("finalize")) {
>                               return 1;
>                       } else {
>                               return 0;
>                       }
>               }
>       };
>        ...
>       public Object createBeanProxy(BeanConverter beanConverter, String path, 
> Session session, Node parentNode, BeanDescriptor beanDescriptor,
>                       ClassDescriptor beanClassDescriptor, Class beanClass, 
> Object parent) {
>               ...
>               return Enhancer.create(beanClass, getInterfaces(beanClass), 
> FINALIZE_FILTER, new Callback[] { loader , NoOp.INSTANCE});
>       }
>         ...
>       public Object createCollectionProxy(Session session, 
> CollectionConverter collectionConverter, Node parentNode,
>                       CollectionDescriptor collectionDescriptor, Class 
> collectionFieldClass) {
>                ....
>               return Enhancer.create(collectionFieldClass, 
> getInterfaces(collectionFieldClass), FINALIZE_FILTER, new Callback[] { loader 
> , NoOp.INSTANCE});
>       }
>       ...
> }
> Maybe you may consider other methods such as "equals", "hashCode"...

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to