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]

Reply via email to