Hi, 

maybe the question is a bit silly but I would like to test/check that all the 
implementations of a specific service interface receive a method advice X.

I would like to advise only the update method defined by the ServiceUpdater 
interface, so I wrote the following code in my application module:

        @Advise(serviceInterface = ServiceUpdater.class)
        @Match("*")
        public static void useServiceUpdaterCache(MethodAdviceReceiver receiver,
                        final ServiceUpdaterCache cache) {

                MethodAdvice advice = new MethodAdvice() {

                        @Override
                        public void advise(MethodInvocation invocation) {
                                if (cache.isValid()) {
                                        
cache.updateService((DynamicServiceDescription) invocation.getParameter(0));
                                } else {
                                        invocation.proceed();
                                        cache.store((DynamicServiceDescription) 
invocation.getParameter(0));
                                }
                        }
                };

                // Advice only the actuate method
                System.out.println("Receiver interface: "
                                + receiver.getInterface().getName());

                for (Method m : receiver.getInterface().getMethods()) {
                        System.out.println("Processing " + m.getName());
                        if ("update".equals(m.getName())) {
                                System.out.println("\n\nAdvising: " + 
m.getName());
                                receiver.adviseMethod(m, advice);
                        }
                }
        };

But as output I got the list of all the services that invoked: 

Receiver interface: java.lang.Runnable
Processing run
Receiver interface: org.apache.tapestry5.ioc.services.SymbolSource
Processing expandSymbols
Processing valueForSymbol
Receiver interface: org.apache.tapestry5.ioc.services.SymbolProvider
Processing valueForSymbol
Receiver interface: org.apache.tapestry5.ioc.services.TypeCoercer
Processing clearCache
Processing coerce
Processing getCoercion
Processing explain
...

I guess that this behavior can be explained with the use of @Match("*"), but 
what about  @Advice with the serviceInterface ? Is it ignored ?


At the moment, the ServiceUpdater interface is implemented only by one class, 
i.e., ServiceUpdaterImpl, but in the module I have two build* methods that have 
different dependencies injected:

public static ServiceUpdater buildOSServiceUpdater(Logger logger,
        @InjectService("OpenStackTypica") CloudInterface cloudInterface) {
        return new ServiceUpdaterImpl(logger, cloudInterface);
}

public static ServiceUpdater buildAmazonServiceUpdater(Logger logger,
        @InjectService("AmazonTypica") CloudInterface cloudInterface) {
        return new ServiceUpdaterImpl(logger, cloudInterface);
}

I know I can refine the condition inside the @Match annotation to something 
like "*ServiceUpdater" but I prefer to use the ServiceInterface.class as 
"filter".
Eventually I would like adviseAll the serviceUpdater interface methods, instead 
of using the (non-refactoring-safe) method name to identify the receiver.


Can someone shed some light here ? Is that a bug ? a misuse of the annotations 
? 

Thanks

-- Alessio

Reply via email to