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
-~----------~----~----~----~------~----~------~--~---