Hello,

Just a little message to know if you had some time to investigate this
issue?

Regards,
Anthony


2008/9/16 Anthony MULLER <[EMAIL PROTECTED]>

> The test case:
>
> @Retention(RUNTIME)
> @Target(ElementType.TYPE)
> @Inherited
> public @interface *MyAnno *{}
>
>
> public interface *IToto *{}
>
>
> public class *TotoImpl *implements IToto {}
>
>
> @MyAnno
> public interface *ITotoService *{
>
>     /**
>      * A great method which will do something
>      *
>      * @return
>      */
>     IToto doSomething();
> }
>
>
> public class *TotoServiceImpl *implements ITotoService {
>
>     public TotoImpl doSomething() {
>         return null;
>     }
> }
>
>
>
> package tests.guice;
>
> import java.lang.annotation.Annotation;
> import java.lang.reflect.Method;
> import java.util.ArrayList;
> import java.util.List;
>
> import org.aopalliance.intercept.MethodInterceptor;
> import org.aopalliance.intercept.MethodInvocation;
>
> import com.google.inject.AbstractModule;
> import com.google.inject.Guice;
> import com.google.inject.Injector;
> import com.google.inject.matcher.AbstractMatcher;
> import com.google.inject.matcher.Matchers;
>
> public class Main {
>
>     public static void main(String[] args) {
>         Injector injector = Guice.createInjector(new TotoModule());
>         ITotoService totoService =
> injector.getInstance(ITotoService.class);
>
>         // Method call
>         totoService.doSomething();
>     }
> }
>
> class TotoModule extends AbstractModule {
>
>     @Override
>     protected void configure() {
>         bind(ITotoService.class).to(TotoServiceImpl.class);
>         bindInterceptor(Matchers.any(), new
> TypeAnnotatedMatcher(MyAnno.class), new TotoInterceptor());
>     }
>
> }
>
> class TotoInterceptor implements MethodInterceptor {
>
>     public Object invoke(MethodInvocation mi) throws Throwable {
>         System.out.println(mi.getMethod().getName() + " -> isSynthetic ? "
>                 + mi.getMethod().isSynthetic());
>         return mi.proceed();
>     }
> }
>
> class TypeAnnotatedMatcher extends AbstractMatcher<Method> {
>
>     private final Class<? extends Annotation> annClass;
>
>     /**
>      * Constructor.
>      *
>      * @param annClass
>      */
>     public TypeAnnotatedMatcher(final Class<? extends Annotation> annClass)
> {
>         this.annClass = annClass;
>     }
>
>     /**
>      * Search for the method signature into all the interface annotated
> with a
>      * given annotation.
>      */
>     public boolean matches(Method method) {
>         // Hook to avoid twice interceptions of the same method
>         if (method.isSynthetic()) {
>             //return false;
>         }
>
>         boolean matches = false;
>         Class<?> type = method.getDeclaringClass();
>         Class<?>[] iTypes = ReflectUtils.getInterfaces(type, annClass);
>         for (Class<?> iType : iTypes) {
>             Method iMethod = null;
>
>             try {
>                 iMethod = iType.getDeclaredMethod(method.getName(), method
>                         .getParameterTypes());
>             } catch (SecurityException e) {
>                 // Should never happen
>             } catch (NoSuchMethodException e) {
>                 // Should never happen
>             }
>             if (iMethod != null) {
>                 matches = true;
>                 break;
>             }
>         }
>
>         return matches;
>     }
> }
>
> class ReflectUtils {
>     /**
>      * Get type annoted with the given annotation
>      *
>      * @param type
>      *            Type where we have to search for annoted interfaces
>      *
>      * @param annClass
>      *            Annotation to find
>      *
>      * @return Class<?>[]
>      */
>     public final static Class<?>[] getInterfaces(final Class<?> type,
>             final Class<? extends Annotation> annClass) {
>         List<Class<?>> annTypes = new ArrayList<Class<?>>();
>         Class<?>[] iTypes = type.getInterfaces();
>         for (Class<?> iType : iTypes) {
>             if (iType.isAnnotationPresent(annClass)) {
>                 annTypes.add(iType);
>             }
>         }
>         return annTypes.toArray(new Class<?>[annTypes.size()]);
>     }
> }
>
>
>
> 2008/9/15 Anthony MULLER <[EMAIL PROTECTED]>
>
>> Yep, TotoServiceImpl implements ITotoService and Toto implements IToto.
>>
>>
>> I will send you a minimal test case tomorrow...
>>
>> Cheers,
>> Anthony
>>
>> 2008/9/15 [EMAIL PROTECTED] <[EMAIL PROTECTED]>
>>
>>
>>> On Sep 15, 6:19 am, "Anthony MULLER" <[EMAIL PROTECTED]> wrote:
>>> > interface ITotoService {
>>> >      IToto doSomething();
>>> > }
>>> >
>>> > class TotoServiceImpl {
>>> >      Toto doSomething() {
>>> >         return ..... ;
>>> >      }
>>> > }
>>> Did you intend
>>>  class TotoServiceImpl implements ITotoService?
>>>
>>> > Observe the return type of both methods.
>>> Is it safe to assume that Toto implements IToto?
>>>
>>> > I think Guice should not ask for invocation when a method is
>>> "synthetic"
>>> > ("volatile", "bridge", ... any methods generated by compiler)...
>>>
>>> I don't think there's any synthetic methods here. Could you
>>> send an executable test case? I think I know what you're
>>> getting at here but it's a lot easier to fix bugs with a test case.
>>>
>>> Cheers,
>>> Jesse
>>>
>>> >>>
>>>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to