You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2005/10/10 02:38:24 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/core/proxy AbstractProxyFactory.java ProxyHelper.java

arminw      2005/10/09 17:38:24

  Modified:    src/java/org/apache/ojb/broker/core/proxy Tag:
                        OJB_1_0_RELEASE AbstractProxyFactory.java
                        ProxyHelper.java
  Log:
  make AbstractProxyFactory#getProxyFactory a singleton
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.2.2.3   +309 -175  db-ojb/src/java/org/apache/ojb/broker/core/proxy/AbstractProxyFactory.java
  
  Index: AbstractProxyFactory.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/AbstractProxyFactory.java,v
  retrieving revision 1.2.2.2
  retrieving revision 1.2.2.3
  diff -u -r1.2.2.2 -r1.2.2.3
  --- AbstractProxyFactory.java	29 Sep 2005 17:16:58 -0000	1.2.2.2
  +++ AbstractProxyFactory.java	10 Oct 2005 00:38:24 -0000	1.2.2.3
  @@ -35,49 +35,61 @@
   /**
    * Abstract implementation for the ProxyFactory
    *
  - * @version $Id:
  - *
    * @author andrew.clute
  - *
  + * @version $Id:
    */
  -public abstract class AbstractProxyFactory implements ProxyFactory {
  +public abstract class AbstractProxyFactory implements ProxyFactory
  +{
  +    /*
  +    arminw:
  +    Do we need a serializable ProxyFactory implementation? If yes, we have to fix this class.
  +    TODO: ProxyFactory is declared as Serializable but Constructor class is not, but used without transient keyword.
  +    */
  +
  +    private static Logger log = LoggerFactory.getLogger(AbstractProxyFactory.class);
  +    private static transient ProxyFactory singleton;
   
  -    private static Logger         log = LoggerFactory.getLogger(AbstractProxyFactory.class);
       /** The indirection handler class */
  -    private Class                 _indirectionHandlerClass;
  +    private Class _indirectionHandlerClass;
       /** The constructor used for creating indirection handler instances (shortcut) */
       private transient Constructor _indirectionHandlerConstructor;
       /** The constructor used for creating list proxies */
  -    private Constructor           _listProxyConstructor;
  +    private Constructor _listProxyConstructor;
       /** The constructor used for creating set proxies */
  -    private Constructor           _setProxyConstructor;
  +    private Constructor _setProxyConstructor;
       /** The constructor used for creating collection proxies */
  -    private Constructor           _collectionProxyConstructor;
  +    private Constructor _collectionProxyConstructor;
   
  -    private static ProxyConfiguration getProxyConfiguration() {
  -        return (ProxyConfiguration)OjbConfigurator.getInstance().getConfigurationFor(null);
  +    private static ProxyConfiguration getProxyConfiguration()
  +    {
  +        return (ProxyConfiguration) OjbConfigurator.getInstance().getConfigurationFor(null);
       }
   
       /**
        * Returns the constructor of the indirection handler class.
  -     * 
  +     *
        * @return The constructor for indirection handlers
        */
  -    private Constructor getIndirectionHandlerConstructor() {
  -        if (_indirectionHandlerConstructor == null) {
  -            Class[] paramType = { PBKey.class, Identity.class };
  +    private synchronized Constructor getIndirectionHandlerConstructor()
  +    {
  +        if(_indirectionHandlerConstructor == null)
  +        {
  +            Class[] paramType = {PBKey.class, Identity.class};
   
  -            try {
  +            try
  +            {
                   _indirectionHandlerConstructor = getIndirectionHandlerClass().getConstructor(paramType);
  -            } catch (NoSuchMethodException ex) {
  +            }
  +            catch(NoSuchMethodException ex)
  +            {
                   throw new MetadataException("The class "
  -                                            + _indirectionHandlerClass.getName()
  -                                            + " specified for IndirectionHandlerClass"
  -                                            + " is required to have a public constructor with signature ("
  -                                            + PBKey.class.getName()
  -                                            + ", "
  -                                            + Identity.class.getName()
  -                                            + ").");
  +                        + _indirectionHandlerClass.getName()
  +                        + " specified for IndirectionHandlerClass"
  +                        + " is required to have a public constructor with signature ("
  +                        + PBKey.class.getName()
  +                        + ", "
  +                        + Identity.class.getName()
  +                        + ").");
               }
           }
           return _indirectionHandlerConstructor;
  @@ -85,11 +97,13 @@
   
       /**
        * Returns the indirection handler class.
  -     * 
  +     *
        * @return The class for indirection handlers
        */
  -    public Class getIndirectionHandlerClass() {
  -        if (_indirectionHandlerClass == null) {
  +    public Class getIndirectionHandlerClass()
  +    {
  +        if(_indirectionHandlerClass == null)
  +        {
               setIndirectionHandlerClass(getProxyConfiguration().getIndirectionHandlerClass());
           }
   
  @@ -98,11 +112,13 @@
   
       /**
        * Sets the indirection handler class.
  -     * 
  +     *
        * @param indirectionHandlerClass The class for indirection handlers
        */
  -    public void setIndirectionHandlerClass(Class indirectionHandlerClass) {
  -        if (indirectionHandlerClass == null) {
  +    public void setIndirectionHandlerClass(Class indirectionHandlerClass)
  +    {
  +        if(indirectionHandlerClass == null)
  +        {
               //throw new MetadataException("No IndirectionHandlerClass specified.");
               /**
                * andrew.clute
  @@ -111,34 +127,43 @@
                */
               indirectionHandlerClass = getDefaultIndirectionHandlerClass();
           }
  -        if (indirectionHandlerClass.isInterface()
  -            || Modifier.isAbstract(indirectionHandlerClass.getModifiers())
  -            || !getIndirectionHandlerBaseClass().isAssignableFrom(indirectionHandlerClass)) {
  +        if(indirectionHandlerClass.isInterface()
  +                || Modifier.isAbstract(indirectionHandlerClass.getModifiers())
  +                || !getIndirectionHandlerBaseClass().isAssignableFrom(indirectionHandlerClass))
  +        {
               throw new MetadataException("Illegal class "
  -                                        + indirectionHandlerClass.getName()
  -                                        + " specified for IndirectionHandlerClass. Must be a concrete subclass of "
  -                                        + getIndirectionHandlerBaseClass().getName());
  +                    + indirectionHandlerClass.getName()
  +                    + " specified for IndirectionHandlerClass. Must be a concrete subclass of "
  +                    + getIndirectionHandlerBaseClass().getName());
           }
           _indirectionHandlerClass = indirectionHandlerClass;
       }
   
       /**
        * Creates a new indirection handler instance.
  -     * 
  +     *
        * @param brokerKey The associated {@link PBKey}.
  -     * @param id              The subject's ids
  +     * @param id The subject's ids
        * @return The new instance
        */
  -    public IndirectionHandler createIndirectionHandler(PBKey brokerKey, Identity id) {
  -        Object args[] = { brokerKey, id };
  -
  -        try {
  -            return (IndirectionHandler)getIndirectionHandlerConstructor().newInstance(args);
  -        } catch (InvocationTargetException ex) {
  +    public IndirectionHandler createIndirectionHandler(PBKey brokerKey, Identity id)
  +    {
  +        Object args[] = {brokerKey, id};
  +
  +        try
  +        {
  +            return (IndirectionHandler) getIndirectionHandlerConstructor().newInstance(args);
  +        }
  +        catch(InvocationTargetException ex)
  +        {
               throw new PersistenceBrokerException("Exception while creating a new indirection handler instance", ex);
  -        } catch (InstantiationException ex) {
  +        }
  +        catch(InstantiationException ex)
  +        {
               throw new PersistenceBrokerException("Exception while creating a new indirection handler instance", ex);
  -        } catch (IllegalAccessException ex) {
  +        }
  +        catch(IllegalAccessException ex)
  +        {
               throw new PersistenceBrokerException("Exception while creating a new indirection handler instance", ex);
           }
       }
  @@ -146,60 +171,69 @@
       /**
        * Retrieves the constructor that is used by OJB to create instances of the given collection proxy
        * class.
  -     * 
  +     *
        * @param proxyClass The proxy class
  -     * @param baseType   The required base type of the proxy class
  -     * @param typeDesc   The type of collection proxy
  +     * @param baseType The required base type of the proxy class
  +     * @param typeDesc The type of collection proxy
        * @return The constructor
        */
  -    private static Constructor retrieveCollectionProxyConstructor(Class proxyClass, Class baseType, String typeDesc) {
  -        if (proxyClass == null) {
  +    private static Constructor retrieveCollectionProxyConstructor(Class proxyClass, Class baseType, String typeDesc)
  +    {
  +        if(proxyClass == null)
  +        {
               throw new MetadataException("No " + typeDesc + " specified.");
           }
  -        if (proxyClass.isInterface() || Modifier.isAbstract(proxyClass.getModifiers()) || !baseType.isAssignableFrom(proxyClass)) {
  +        if(proxyClass.isInterface() || Modifier.isAbstract(proxyClass.getModifiers()) || !baseType.isAssignableFrom(proxyClass))
  +        {
               throw new MetadataException("Illegal class "
  -                                        + proxyClass.getName()
  -                                        + " specified for "
  -                                        + typeDesc
  -                                        + ". Must be a concrete subclass of "
  -                                        + baseType.getName());
  +                    + proxyClass.getName()
  +                    + " specified for "
  +                    + typeDesc
  +                    + ". Must be a concrete subclass of "
  +                    + baseType.getName());
           }
   
  -        Class[] paramType = { PBKey.class, Class.class, Query.class };
  +        Class[] paramType = {PBKey.class, Class.class, Query.class};
   
  -        try {
  +        try
  +        {
               return proxyClass.getConstructor(paramType);
  -        } catch (NoSuchMethodException ex) {
  +        }
  +        catch(NoSuchMethodException ex)
  +        {
               throw new MetadataException("The class "
  -                                        + proxyClass.getName()
  -                                        + " specified for "
  -                                        + typeDesc
  -                                        + " is required to have a public constructor with signature ("
  -                                        + PBKey.class.getName()
  -                                        + ", "
  -                                        + Class.class.getName()
  -                                        + ", "
  -                                        + Query.class.getName()
  -                                        + ").");
  +                    + proxyClass.getName()
  +                    + " specified for "
  +                    + typeDesc
  +                    + " is required to have a public constructor with signature ("
  +                    + PBKey.class.getName()
  +                    + ", "
  +                    + Class.class.getName()
  +                    + ", "
  +                    + Query.class.getName()
  +                    + ").");
           }
       }
   
       /**
        * Returns the list proxy class.
  -     * 
  +     *
        * @return The class used for list proxies
        */
  -    public Class getListProxyClass() {
  +    public Class getListProxyClass()
  +    {
           return getListProxyConstructor().getDeclaringClass();
       }
   
       /**
        * Returns the constructor of the list proxy class.
  -     * 
  +     *
        * @return The constructor for list proxies
        */
  -    private Constructor getListProxyConstructor() {
  -        if (_listProxyConstructor == null) {
  +    private Constructor getListProxyConstructor()
  +    {
  +        if(_listProxyConstructor == null)
  +        {
               setListProxyClass(getProxyConfiguration().getListProxyClass());
           }
           return _listProxyConstructor;
  @@ -212,26 +246,30 @@
        *
        * @param listProxyClass The proxy class
        */
  -    public void setListProxyClass(Class listProxyClass) {
  +    public void setListProxyClass(Class listProxyClass)
  +    {
           _listProxyConstructor = retrieveCollectionProxyConstructor(listProxyClass, List.class, "ListProxyClass");
       }
   
       /**
        * Returns the set proxy class.
  -     * 
  +     *
        * @return The class used for set proxies
        */
  -    public Class getSetProxyClass() {
  +    public Class getSetProxyClass()
  +    {
           return getSetProxyConstructor().getDeclaringClass();
       }
   
       /**
        * Returns the constructor of the set proxy class.
  -     * 
  +     *
        * @return The constructor for set proxies
        */
  -    private Constructor getSetProxyConstructor() {
  -        if (_setProxyConstructor == null) {
  +    private Constructor getSetProxyConstructor()
  +    {
  +        if(_setProxyConstructor == null)
  +        {
               setSetProxyClass(getProxyConfiguration().getSetProxyClass());
           }
           return _setProxyConstructor;
  @@ -242,26 +280,30 @@
        *
        * @param setProxyClass The proxy class
        */
  -    public void setSetProxyClass(Class setProxyClass) {
  +    public void setSetProxyClass(Class setProxyClass)
  +    {
           _setProxyConstructor = retrieveCollectionProxyConstructor(setProxyClass, Set.class, "SetProxyClass");
       }
   
       /**
        * Returns the collection proxy class.
  -     * 
  +     *
        * @return The class used for collection proxies
        */
  -    public Class getCollectionProxyClass() {
  +    public Class getCollectionProxyClass()
  +    {
           return getCollectionProxyConstructor().getDeclaringClass();
       }
   
       /**
        * Returns the constructor of the generic collection proxy class.
  -     * 
  +     *
        * @return The constructor for collection proxies
        */
  -    private Constructor getCollectionProxyConstructor() {
  -        if (_collectionProxyConstructor == null) {
  +    private Constructor getCollectionProxyConstructor()
  +    {
  +        if(_collectionProxyConstructor == null)
  +        {
               setCollectionProxyClass(getProxyConfiguration().getCollectionProxyClass());
           }
           return _collectionProxyConstructor;
  @@ -272,51 +314,67 @@
        *
        * @param collectionProxyClass The proxy class
        */
  -    public void setCollectionProxyClass(Class collectionProxyClass) {
  +    public void setCollectionProxyClass(Class collectionProxyClass)
  +    {
           _collectionProxyConstructor = retrieveCollectionProxyConstructor(collectionProxyClass, Collection.class, "CollectionProxyClass");
           // we also require the class to be a subclass of ManageableCollection
  -        if (!ManageableCollection.class.isAssignableFrom(collectionProxyClass)) {
  +        if(!ManageableCollection.class.isAssignableFrom(collectionProxyClass))
  +        {
               throw new MetadataException("Illegal class "
  -                                        + collectionProxyClass.getName()
  -                                        + " specified for CollectionProxyClass. Must be a concrete subclass of "
  -                                        + ManageableCollection.class.getName());
  +                    + collectionProxyClass.getName()
  +                    + " specified for CollectionProxyClass. Must be a concrete subclass of "
  +                    + ManageableCollection.class.getName());
           }
       }
   
       /**
        * Determines which proxy to use for the given collection class (list, set or generic collection proxy).
  -     * 
  +     *
        * @param collectionClass The collection class
        * @return The constructor of the proxy class
        */
  -    private Constructor getCollectionProxyConstructor(Class collectionClass) {
  -        if (List.class.isAssignableFrom(collectionClass)) {
  +    private Constructor getCollectionProxyConstructor(Class collectionClass)
  +    {
  +        if(List.class.isAssignableFrom(collectionClass))
  +        {
               return getListProxyConstructor();
  -        } else if (Set.class.isAssignableFrom(collectionClass)) {
  +        }
  +        else if(Set.class.isAssignableFrom(collectionClass))
  +        {
               return getSetProxyConstructor();
  -        } else {
  +        }
  +        else
  +        {
               return getCollectionProxyConstructor();
           }
       }
   
       /**
        * Create a Collection Proxy for a given query.
  -     * 
  -     * @param brokerKey       The key of the persistence broker
  -     * @param query           The query
  +     *
  +     * @param brokerKey The key of the persistence broker
  +     * @param query The query
        * @param collectionClass The class to build the proxy for
        * @return The collection proxy
        */
  -    public ManageableCollection createCollectionProxy(PBKey brokerKey, Query query, Class collectionClass) {
  -        Object args[] = { brokerKey, collectionClass, query };
  -
  -        try {
  -            return (ManageableCollection)getCollectionProxyConstructor(collectionClass).newInstance(args);
  -        } catch (InstantiationException ex) {
  +    public ManageableCollection createCollectionProxy(PBKey brokerKey, Query query, Class collectionClass)
  +    {
  +        Object args[] = {brokerKey, collectionClass, query};
  +
  +        try
  +        {
  +            return (ManageableCollection) getCollectionProxyConstructor(collectionClass).newInstance(args);
  +        }
  +        catch(InstantiationException ex)
  +        {
               throw new PersistenceBrokerException("Exception while creating a new collection proxy instance", ex);
  -        } catch (InvocationTargetException ex) {
  +        }
  +        catch(InvocationTargetException ex)
  +        {
               throw new PersistenceBrokerException("Exception while creating a new collection proxy instance", ex);
  -        } catch (IllegalAccessException ex) {
  +        }
  +        catch(IllegalAccessException ex)
  +        {
               throw new PersistenceBrokerException("Exception while creating a new collection proxy instance", ex);
           }
       }
  @@ -327,33 +385,49 @@
        * @param objectOrProxy
        * @return Object
        */
  -    public final Object getRealObject(Object objectOrProxy) {
  -        if (isNormalOjbProxy(objectOrProxy)) {
  +    public final Object getRealObject(Object objectOrProxy)
  +    {
  +        if(isNormalOjbProxy(objectOrProxy))
  +        {
               String msg;
   
  -            try {
  +            try
  +            {
                   return getIndirectionHandler(objectOrProxy).getRealSubject();
  -            } catch (ClassCastException e) {
  +            }
  +            catch(ClassCastException e)
  +            {
                   // shouldn't happen but still ...
                   msg = "The InvocationHandler for the provided Proxy was not an instance of " + IndirectionHandler.class.getName();
                   log.error(msg);
                   throw new PersistenceBrokerException(msg, e);
  -            } catch (IllegalArgumentException e) {
  +            }
  +            catch(IllegalArgumentException e)
  +            {
                   msg = "Could not retrieve real object for given Proxy: " + objectOrProxy;
                   log.error(msg);
                   throw new PersistenceBrokerException(msg, e);
  -            } catch (PersistenceBrokerException e) {
  +            }
  +            catch(PersistenceBrokerException e)
  +            {
                   log.error("Could not retrieve real object for given Proxy: " + objectOrProxy);
                   throw e;
               }
  -        } else if (isVirtualOjbProxy(objectOrProxy)) {
  -            try {
  -                return ((VirtualProxy)objectOrProxy).getRealSubject();
  -            } catch (PersistenceBrokerException e) {
  +        }
  +        else if(isVirtualOjbProxy(objectOrProxy))
  +        {
  +            try
  +            {
  +                return ((VirtualProxy) objectOrProxy).getRealSubject();
  +            }
  +            catch(PersistenceBrokerException e)
  +            {
                   log.error("Could not retrieve real object for VirtualProxy: " + objectOrProxy);
                   throw e;
               }
  -        } else {
  +        }
  +        else
  +        {
               return objectOrProxy;
           }
       }
  @@ -364,37 +438,53 @@
        * @param objectOrProxy
        * @return Object or null if the Handel is not materialized
        */
  -    public Object getRealObjectIfMaterialized(Object objectOrProxy) {
  -        if (isNormalOjbProxy(objectOrProxy)) {
  +    public Object getRealObjectIfMaterialized(Object objectOrProxy)
  +    {
  +        if(isNormalOjbProxy(objectOrProxy))
  +        {
               String msg;
   
  -            try {
  +            try
  +            {
                   IndirectionHandler handler = getIndirectionHandler(objectOrProxy);
   
                   return handler.alreadyMaterialized() ? handler.getRealSubject() : null;
  -            } catch (ClassCastException e) {
  +            }
  +            catch(ClassCastException e)
  +            {
                   // shouldn't happen but still ...
                   msg = "The InvocationHandler for the provided Proxy was not an instance of " + IndirectionHandler.class.getName();
                   log.error(msg);
                   throw new PersistenceBrokerException(msg, e);
  -            } catch (IllegalArgumentException e) {
  +            }
  +            catch(IllegalArgumentException e)
  +            {
                   msg = "Could not retrieve real object for given Proxy: " + objectOrProxy;
                   log.error(msg);
                   throw new PersistenceBrokerException(msg, e);
  -            } catch (PersistenceBrokerException e) {
  +            }
  +            catch(PersistenceBrokerException e)
  +            {
                   log.error("Could not retrieve real object for given Proxy: " + objectOrProxy);
                   throw e;
               }
  -        } else if (isVirtualOjbProxy(objectOrProxy)) {
  -            try {
  -                VirtualProxy proxy = (VirtualProxy)objectOrProxy;
  +        }
  +        else if(isVirtualOjbProxy(objectOrProxy))
  +        {
  +            try
  +            {
  +                VirtualProxy proxy = (VirtualProxy) objectOrProxy;
   
                   return proxy.alreadyMaterialized() ? proxy.getRealSubject() : null;
  -            } catch (PersistenceBrokerException e) {
  +            }
  +            catch(PersistenceBrokerException e)
  +            {
                   log.error("Could not retrieve real object for VirtualProxy: " + objectOrProxy);
                   throw e;
               }
  -        } else {
  +        }
  +        else
  +        {
               return objectOrProxy;
           }
       }
  @@ -405,13 +495,16 @@
        * @param objectOrProxy
        * @return Class
        */
  -    public Class getRealClass(Object objectOrProxy) {
  +    public Class getRealClass(Object objectOrProxy)
  +    {
           IndirectionHandler handler;
   
  -        if (isNormalOjbProxy(objectOrProxy)) {
  +        if(isNormalOjbProxy(objectOrProxy))
  +        {
               String msg;
   
  -            try {
  +            try
  +            {
                   handler = getIndirectionHandler(objectOrProxy);
                   /*
                    arminw:
  @@ -419,44 +512,54 @@
                    */
                   // return handler.getIdentity().getObjectsTopLevelClass();
                   return handler.getIdentity().getObjectsRealClass();
  -            } catch (ClassCastException e) {
  +            }
  +            catch(ClassCastException e)
  +            {
                   // shouldn't happen but still ...
                   msg = "The InvocationHandler for the provided Proxy was not an instance of " + IndirectionHandler.class.getName();
                   log.error(msg);
                   throw new PersistenceBrokerException(msg, e);
  -            } catch (IllegalArgumentException e) {
  +            }
  +            catch(IllegalArgumentException e)
  +            {
                   msg = "Could not retrieve real object for given Proxy: " + objectOrProxy;
                   log.error(msg);
                   throw new PersistenceBrokerException(msg, e);
               }
  -        } else if (isVirtualOjbProxy(objectOrProxy)) {
  -            handler = VirtualProxy.getIndirectionHandler((VirtualProxy)objectOrProxy);
  +        }
  +        else if(isVirtualOjbProxy(objectOrProxy))
  +        {
  +            handler = VirtualProxy.getIndirectionHandler((VirtualProxy) objectOrProxy);
               /*
                arminw:
                think we should return the real class
                */
               // return handler.getIdentity().getObjectsTopLevelClass();
               return handler.getIdentity().getObjectsRealClass();
  -        } else {
  +        }
  +        else
  +        {
               return objectOrProxy.getClass();
           }
       }
   
       /**
        * Determines whether the given object is an OJB proxy.
  -     * 
  +     *
        * @return <code>true</code> if the object is an OJB proxy
        */
  -    public boolean isNormalOjbProxy(Object proxyOrObject) {
  +    public boolean isNormalOjbProxy(Object proxyOrObject)
  +    {
           return proxyOrObject instanceof OJBProxy;
       }
   
       /**
        * Determines whether the given object is an OJB virtual proxy.
  -     * 
  +     *
        * @return <code>true</code> if the object is an OJB virtual proxy
        */
  -    public boolean isVirtualOjbProxy(Object proxyOrObject) {
  +    public boolean isVirtualOjbProxy(Object proxyOrObject)
  +    {
           return proxyOrObject instanceof VirtualProxy;
       }
   
  @@ -464,7 +567,8 @@
        * Returns <tt>true</tt> if the given object is a {@link java.lang.reflect.Proxy}
        * or a {@link VirtualProxy} instance.
        */
  -    public boolean isProxy(Object proxyOrObject) {
  +    public boolean isProxy(Object proxyOrObject)
  +    {
           return isNormalOjbProxy(proxyOrObject) || isVirtualOjbProxy(proxyOrObject);
       }
   
  @@ -476,19 +580,27 @@
   
       /**
        * Returns the invocation handler object of the given proxy object.
  -     * 
  +     *
        * @param obj The object
        * @return The invocation handler if the object is an OJB proxy, or <code>null</code>
        *         otherwise
        */
  -    public IndirectionHandler getIndirectionHandler(Object obj) {
  -        if (obj == null) {
  +    public IndirectionHandler getIndirectionHandler(Object obj)
  +    {
  +        if(obj == null)
  +        {
               return null;
  -        } else if (isNormalOjbProxy(obj)) {
  +        }
  +        else if(isNormalOjbProxy(obj))
  +        {
               return getDynamicIndirectionHandler(obj);
  -        } else if (isVirtualOjbProxy(obj)) {
  -            return VirtualProxy.getIndirectionHandler((VirtualProxy)obj);
  -        } else {
  +        }
  +        else if(isVirtualOjbProxy(obj))
  +        {
  +            return VirtualProxy.getIndirectionHandler((VirtualProxy) obj);
  +        }
  +        else
  +        {
               return null;
           }
   
  @@ -497,23 +609,26 @@
       /**
        * Determines whether the object is a materialized object, i.e. no proxy or a
        * proxy that has already been loaded from the database.
  -     *   
  +     *
        * @param object The object to test
        * @return <code>true</code> if the object is materialized
        */
  -    public boolean isMaterialized(Object object) {
  +    public boolean isMaterialized(Object object)
  +    {
           IndirectionHandler handler = getIndirectionHandler(object);
   
  -        return handler == null ? true : handler.alreadyMaterialized();
  +        return handler == null || handler.alreadyMaterialized();
       }
   
  -    /**
  -     * Return CollectionProxy for item is item is a CollectionProxy, otherwise return null
  -     */
  -    public CollectionProxy getCollectionProxy(Object item) {
  -        if (isCollectionProxy(item)) {
  -            return (CollectionProxy)item;
  -        } else {
  +    /** Return CollectionProxy for item is item is a CollectionProxy, otherwise return null */
  +    public CollectionProxy getCollectionProxy(Object item)
  +    {
  +        if(isCollectionProxy(item))
  +        {
  +            return (CollectionProxy) item;
  +        }
  +        else
  +        {
               return null;
           }
       }
  @@ -523,7 +638,8 @@
        *
        * TODO: Provide handling for pluggable collection proxy implementations
        */
  -    public boolean isCollectionProxy(Object item) {
  +    public boolean isCollectionProxy(Object item)
  +    {
           return (item instanceof CollectionProxy);
       }
   
  @@ -532,30 +648,48 @@
        * then only the text "unmaterialized proxy for ..." is returned and the proxy is NOT
        * materialized. Otherwise, the normal toString method is called. This useful e.g. for
        * logging etc.
  -     * 
  +     *
        * @param proxy The object for which a string representation shall be generated
        * @return The string representation
        */
  -
  -    public String toString(Object proxy) {
  +    public String toString(Object proxy)
  +    {
           IndirectionHandler handler = getIndirectionHandler(proxy);
  -        if ((handler != null) && handler.alreadyMaterialized()) {
  +        if((handler != null) && handler.alreadyMaterialized())
  +        {
               return "unmaterialized proxy for " + handler.getIdentity();
  -        } else {
  +        }
  +        else
  +        {
               return proxy.toString();
           }
       }
   
  -    public static ProxyFactory getProxyFactory() {
  -        Class proxyFactoryClass = null;
  -        try {
  -            proxyFactoryClass = getProxyConfiguration().getProxyFactoryClass();
  -            return (ProxyFactory)proxyFactoryClass.newInstance();
  -        } catch (InstantiationException e) {
  -            throw new MetadataException("Illegal class " + proxyFactoryClass.getName() + " specified for ProxyFactoryClass.");
  -        } catch (IllegalAccessException e) {
  -            throw new MetadataException("Illegal class " + proxyFactoryClass.getName() + " specified for ProxyFactoryClass.");
  +    public synchronized static ProxyFactory getProxyFactory()
  +    {
  +        /*
  +        TODO: Check usage of singleton.
  +        arminw: Think the ProxyFactory instance can be a singleton, because the proxy stuff
  +        will never change while runtime.
  +        */
  +        if(singleton == null)
  +        {
  +            Class proxyFactoryClass = null;
  +            try
  +            {
  +                proxyFactoryClass = getProxyConfiguration().getProxyFactoryClass();
  +                singleton = (ProxyFactory) proxyFactoryClass.newInstance();
  +            }
  +            catch(InstantiationException e)
  +            {
  +                throw new MetadataException("Illegal class " + proxyFactoryClass.getName() + " specified for ProxyFactoryClass.");
  +            }
  +            catch(IllegalAccessException e)
  +            {
  +                throw new MetadataException("Illegal class " + proxyFactoryClass.getName() + " specified for ProxyFactoryClass.");
  +            }
           }
  +        return singleton;
       }
   
   }
  
  
  
  1.2.2.7   +10 -3     db-ojb/src/java/org/apache/ojb/broker/core/proxy/Attic/ProxyHelper.java
  
  Index: ProxyHelper.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/Attic/ProxyHelper.java,v
  retrieving revision 1.2.2.6
  retrieving revision 1.2.2.7
  diff -u -r1.2.2.6 -r1.2.2.7
  --- ProxyHelper.java	29 Sep 2005 17:21:19 -0000	1.2.2.6
  +++ ProxyHelper.java	10 Oct 2005 00:38:24 -0000	1.2.2.7
  @@ -16,6 +16,8 @@
    */
   
   import java.lang.ref.SoftReference;
  +import java.lang.ref.WeakReference;
  +import java.lang.ref.Reference;
   
   import org.apache.ojb.broker.PBFactoryException;
   
  @@ -27,7 +29,7 @@
    */
   public class ProxyHelper
   {
  -    private static SoftReference proxyFactoryRef;
  +    private static Reference proxyFactoryRef;
   
       public synchronized static ProxyFactory getProxyFactory()
       {
  @@ -35,7 +37,12 @@
           {
               try
               {
  -                proxyFactoryRef = new SoftReference(AbstractProxyFactory.getProxyFactory());
  +                /*
  +                TODO: Check usage of WeakReference
  +                arminw: Changed Soft- to WeakReference. If in AbstractProxyFactory the
  +                the ProxyFactory instance is freed this class will take care of that.
  +                */
  +                proxyFactoryRef = new WeakReference(AbstractProxyFactory.getProxyFactory());
               }
               catch(PBFactoryException ex)
               {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org