Firstly, apologies for the long post!
I have taken James Carman's AOPAlliance method interceptor factory and
altered it a bit to take a MethodInterceptor as a parameter when declaring
an interceptor. I felt that this was worth doing as otherwise we would have
to declare a 2 services for each MethodInterceptor service (one for the
MethodInterceptor factory and one for the MethodInterceptor itself). This
way it needs only 1 declaration for the MethodInterceptor factory and one
for each MethodInterceptor.
I am having a problem declaring multiple interceptors for the same service
point ("Interceptor contribution
'cendil.lib.AOPAllianceMethodInterceptorFactory' duplicates previous value
and is being ignored.").
The service-point looks like this:
<service-point id="AOPAllianceMethodInterceptorFactory"
interface="org.apache.hivemind.ServiceInterceptorFactory">
<parameters-schema>
<element name="method-interceptor">
<attribute name="service-id" required="true" translator="service">The
id of the service implementing the MethodInterceptor interface</attribute>
<rules>
<create-object
class="com.cendil.hivemind.aopalliance.impl.MethodInterceptorParameter"/>
<read-attribute attribute="service-id"
property="methodInterceptor"/>
<invoke-parent method="addElement"/>
</rules>
</element>
</parameters-schema>
<create-instance
class="com.cendil.hivemind.aopalliance.impl.MethodInterceptorFactory"
model="primitive"/>
</service-point>
This can then be used like below to add a method interceptor like below:
<interceptor service-id="cendil.lib.AOPAllianceMethodInterceptorFactory">
<method-interceptor service-id="cendil.lib.LoggingInterceptor"/>
</interceptor>
Where the LoggingInterceptor is declared like this:
<service-point id="LoggingInterceptor"
interface="org.aopalliance.intercept.MethodInterceptor"/>
<implementation service-id="LoggingInterceptor">
<invoke-factory service-id="hivemind.BuilderFactory">
<construct
class="com.quindell.hivemind.aopalliance.impl.LoggingInterceptor"/>
</invoke-factory>
</implementation>
The problem I'm having is that if I want to add a second AOPAlliance
MethodInterceptor like this:
<interceptor service-id="cendil.lib.AOPAllianceMethodInterceptorFactory">
<method-interceptor
service-id="cendil.transaction.TransactionInterceptor"/>
</interceptor>
<interceptor service-id="cendil.lib.AOPAllianceMethodInterceptorFactory">
<method-interceptor service-id="cendil.lib.LoggingInterceptor"/>
</interceptor>
I get the message that:
Interceptor contribution 'cendil.lib.AOPAllianceMethodInterceptorFactory'
duplicates previous value and is being ignored.
Does anyone have any ideas as to how to get around this? This really does
simplify a lot of things (e.g. LoggingInterceptor is only 45 lines of code
rather than over 200).
Thanks,
Jim Dyson
-----Original Message-----
From: James Carman [mailto:[EMAIL PROTECTED]
Sent: 21 September 2004 15:18
To: [email protected]; 'Knut Wannheden'
Subject: RE: Reflection vs. Javassist
Well, that's the beauty of it. The class implementation has a setter for an
object of type MethodInterceptor, so you can set that property however you
want. I chose to use a service, because my interceptor relied upon other
services and I wanted to use BuilderFactory to autowire everything for me.
I wasn't familiar with object providers, so I just stuck with what I knew.
:-)
-----Original Message-----
From: Knut Wannheden [mailto:[EMAIL PROTECTED]
Sent: Tuesday, September 21, 2004 10:14 AM
To: [email protected]
Subject: Re: Reflection vs. Javassist
Can't this be simplified by using the HiveMind ObjectProviders? Then
you wouldn't need the first service anymore:
<service-point
id="RollbackOnlyInterceptorFactory"
interface="org.apache.hivemind.ServiceInterceptorFactory">
<invoke-factory service-id="hivemind.BuilderFactory">
<construct
class="example.interceptor.factory.MethodInterceptorFactory">
<set-object
value="instance:example.interceptor.RollbackOnlyInterceptor"
property="methodInterceptor"/>
</construct>
</invoke-factory>
</service-point>
--knut
On Tue, 21 Sep 2004 10:04:19 -0400, James Carman
<[EMAIL PROTECTED]> wrote:
> I can do you one better. I can include the source code for a
> MethodInterceptorFactory class that I wrote. Now, this class is dependent
> upon the AOP Alliance (http://sourceforge.net/projects/aopalliance) jar
> file, but it makes creating interceptors EASY! All you have to do is
> implement the MethodInterceptor interface (from AOP Alliance). This class
> (or some version similar to it) may make it into the hivemind-lib module
in
> version 1.1, so make sure you switch over to the "official" one once it
> arrives.
>
> Here's an example of how to use it in a hivemodule.xml file...
>
> <service-point
> id="RollbackOnlyInterceptor"
> interface="org.aopalliance.intercept.MethodInterceptor">
> <invoke-factory service-id="hivemind.BuilderFactory">
> <construct class="example.interceptor.RollbackOnlyInterceptor" />
> </invoke-factory>
> </service-point>
>
> <service-point
> id="RollbackOnlyInterceptorFactory"
> interface="org.apache.hivemind.ServiceInterceptorFactory">
> <invoke-factory service-id="hivemind.BuilderFactory">
> <construct
> class="example.interceptor.factory.MethodInterceptorFactory">
> <set-service
> service-id="RollbackOnlyInterceptor"
> property="methodInterceptor"/>
> </construct>
> </invoke-factory>
> </service-point>
>
> <implementation service-id="ProjectServices">
> <interceptor service-id="RollbackOnlyInterceptorFactory"/>
> </implementation>
>
> Here, we declared the actual interceptor itself as a service and told the
> factory which service to call to intercept the methods.
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]