> > Same way as you deal with all resources. ie call close(), 
> > release() etc. 
> 
> So can I assume that every component, or every XXXXManager 
> has a close() or release() method?

I'd not suggest that...if you want to isolate the client from
determining whether the component has/needs the close()/release(), use a
utility.

>   "Every pair of component C and its associated CManager interfaces
>    must define a method that, when called by the client, indicates 
>    that the client is finished using the component C. The method 
>    may be in the CManager interface - for example, 
>    CManager.release (C c) - or in the C interface - for example, 
>    C.close (). Note that this contract applies to component
> *interfaces*.
>    even if the implementation does not require an end-of-transaction
>    signal from the client, the method must be specified so
> implementations
>    that do require such a signal can recieve them."
> 
> How about that?

make that:

A component must define a method with the following signature:

public void release();

or a component's manager (if it exists) must define a method with the
following signature:

public void release( Object );

at the interface level, that, when called by a client, indicates that
the client is finished using the component if it has any resources that
require releasing.

You can even write a ReleaseUtil that uses some minimal reflection to
determine whether the method exists and calls it if it does, then always
use that in all of your components (have this in C++ project of mine).

ReleaseUtil::release( component, manager  )
        if component has method "public void release()"
                component.release()
                return

        if manager has method "public void release(Object)"
                manager.release( component )
                return

I would prefer though (cleaner, no reflection):

/**
 * If an object implements this interface, it is the responsibility
 * of anyone that uses it to call the release() method when it is done
 * using it.
 */
interface RequiresRelease
{
        public void release();
}

so you get

class ReleaseUtil
{
        public static release( Object obj )
        {
                if( obj instanceof RequiresRelease )
                        ((RequiresRelease)obj).release();
        }
}

class SomeComponent
{
        SomeManager m; // presumably a pool...

        compose( ComponentManager cm ) throws ComponentException
        {
                m = cm.lookup( SomeManager.ROLE );
        }

        doWork()
        {
                try
                {
                        SomeObject comp = m.getObject();

                        //bla
                }
                catch( Throwable t )
                {
                        //logme
                }
                finally
                {
                        ReleaseUtil.release( comp );
                }
        }
}

point is: release() is not made part of the lifecycle part of the
framework or any of those interfaces.

This should probably become a part of a generic pooling solution.

cjeers,

- Leo



--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to