Author: drobiazko
Date: Mon May 30 05:50:41 2011
New Revision: 1128997

URL: http://svn.apache.org/viewvc?rev=1128997&view=rev
Log:
TAP5-1510: The @Advise annotation limits advice to just a specific interface 
type

Added:
    
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AdviseByMarkerModule2.java
   (with props)
Modified:
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Advise.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Decorate.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleImplTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Advise.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Advise.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Advise.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Advise.java
 Mon May 30 05:50:41 2011
@@ -36,7 +36,7 @@ public @interface Advise
     /**
      * Type of the service to advise.
      */
-    Class serviceInterface();
+    Class serviceInterface() default Object.class;
    
     /**
      * Id of the advisor.

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Decorate.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Decorate.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Decorate.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/annotations/Decorate.java
 Mon May 30 05:50:41 2011
@@ -36,7 +36,7 @@ public @interface Decorate
     /**
      * Type of the service to decorate.
      */
-    Class serviceInterface();
+    Class serviceInterface() default Object.class;
    
     /**
      * Id of the decorator.

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
 Mon May 30 05:50:41 2011
@@ -326,23 +326,20 @@ public class DefaultModuleDefImpl implem
 
         Set<Class> markers = extractMarkers(method, Decorate.class);
 
-        DecoratorDef def = new DecoratorDefImpl(method, 
extractPatterns(annotation, decoratorId, method),
+        DecoratorDef def = new DecoratorDefImpl(method, 
extractPatterns(decoratorId, method),
                 extractConstraints(method), proxyFactory, decoratorId, 
serviceInterface, markers);
 
         decoratorDefs.put(decoratorId, def);
     }
 
-    private <T extends Annotation> String[] extractPatterns(T annotation, 
String id, Method method)
+    private <T extends Annotation> String[] extractPatterns(String id, Method 
method)
     {
-        if (annotation != null)
-            return new String[]
-            {};
-
         Match match = method.getAnnotation(Match.class);
 
         if (match == null)
-            return new String[]
-            { id };
+        {
+            return new String[] { id };
+        }
 
         return match.value();
     }
@@ -393,7 +390,7 @@ public class DefaultModuleDefImpl implem
 
         Set<Class> markers = extractMarkers(method, Advise.class);
 
-        AdvisorDef def = new AdvisorDefImpl(method, 
extractPatterns(annotation, advisorId, method),
+        AdvisorDef def = new AdvisorDefImpl(method, extractPatterns(advisorId, 
method),
                 extractConstraints(method), proxyFactory, advisorId, 
serviceInterface, markers);
 
         advisorDefs.put(advisorId, def);

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
 Mon May 30 05:50:41 2011
@@ -28,15 +28,7 @@ import java.util.Comparator;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.tapestry5.ioc.AdvisorDef;
-import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.ioc.Markable;
-import org.apache.tapestry5.ioc.ObjectCreator;
-import org.apache.tapestry5.ioc.ObjectLocator;
-import org.apache.tapestry5.ioc.OperationTracker;
-import org.apache.tapestry5.ioc.ServiceBuilderResources;
-import org.apache.tapestry5.ioc.ServiceLifecycle2;
-import org.apache.tapestry5.ioc.ServiceResources;
+import org.apache.tapestry5.ioc.*;
 import org.apache.tapestry5.ioc.annotations.Local;
 import org.apache.tapestry5.ioc.def.ContributionDef;
 import org.apache.tapestry5.ioc.def.ContributionDef2;
@@ -569,9 +561,10 @@ public class ModuleImpl implements Modul
 
     private boolean markerMatched(ServiceDef serviceDef, Markable markable)
     {
-        if 
(!serviceDef.getServiceInterface().equals(markable.getServiceInterface()))
+        final Class markableInterface = markable.getServiceInterface();
+
+        if (markableInterface == null || 
!markableInterface.isAssignableFrom(serviceDef.getServiceInterface()))
             return false;
-        ;
 
         Set<Class> contributionMarkers = 
CollectionFactory.newSet(markable.getMarkers());
 
@@ -592,6 +585,12 @@ public class ModuleImpl implements Modul
 
         contributionMarkers.retainAll(registry.getMarkerAnnotations());
 
+        //@Advise and @Decorate default to Object.class service interface.
+        //If @Match is present, no marker annotations are needed.
+        //In such a case an empty contribution marker list  should be ignored.
+        if (markableInterface == Object.class && contributionMarkers.isEmpty())
+            return false;
+
         return serviceDef.getMarkers().containsAll(contributionMarkers);
     }
 

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
 Mon May 30 05:50:41 2011
@@ -23,29 +23,9 @@ import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.Locale;
 
-import org.apache.tapestry5.ioc.AnnotationProvider;
-import org.apache.tapestry5.ioc.Configuration;
-import org.apache.tapestry5.ioc.Location;
-import org.apache.tapestry5.ioc.LoggerSource;
-import org.apache.tapestry5.ioc.MappedConfiguration;
-import org.apache.tapestry5.ioc.MessageFormatter;
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.ObjectCreator;
-import org.apache.tapestry5.ioc.ObjectLocator;
-import org.apache.tapestry5.ioc.ObjectProvider;
-import org.apache.tapestry5.ioc.OperationTracker;
-import org.apache.tapestry5.ioc.OrderedConfiguration;
-import org.apache.tapestry5.ioc.Registry;
-import org.apache.tapestry5.ioc.RegistryBuilder;
-import org.apache.tapestry5.ioc.Resource;
-import org.apache.tapestry5.ioc.ServiceBuilderResources;
-import org.apache.tapestry5.ioc.ServiceDecorator;
-import org.apache.tapestry5.ioc.ServiceResources;
+import org.apache.tapestry5.ioc.*;
 import org.apache.tapestry5.ioc.annotations.IntermediateType;
-import org.apache.tapestry5.ioc.def.ContributionDef;
-import org.apache.tapestry5.ioc.def.DecoratorDef;
-import org.apache.tapestry5.ioc.def.ModuleDef;
-import org.apache.tapestry5.ioc.def.ServiceDef;
+import org.apache.tapestry5.ioc.def.*;
 import org.apache.tapestry5.ioc.services.ClassPropertyAdapter;
 import org.apache.tapestry5.ioc.services.MasterObjectProvider;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
@@ -133,6 +113,21 @@ public class IOCTestCase extends TestBas
         return newMock(DecoratorDef.class);
     }
 
+    protected final DecoratorDef2 mockDecoratorDef2()
+    {
+        return newMock(DecoratorDef2.class);
+    }
+
+    protected final AdvisorDef mockAdvisorDef()
+    {
+        return newMock(AdvisorDef.class);
+    }
+
+    protected final AdvisorDef2 mockAdvisorDef2()
+    {
+        return newMock(AdvisorDef2.class);
+    }
+
     protected final Location mockLocation()
     {
         return newMock(Location.class);
@@ -169,6 +164,11 @@ public class IOCTestCase extends TestBas
         return newMock(ModuleDef.class);
     }
 
+    protected final ModuleDef2 mockModuleDef2()
+    {
+        return newMock(ModuleDef2.class);
+    }
+
     protected final ObjectCreator mockObjectCreator()
     {
         return newMock(ObjectCreator.class);
@@ -367,6 +367,11 @@ public class IOCTestCase extends TestBas
         expect(decoratorDef.matches(serviceDef)).andReturn(matches);
     }
 
+    protected final void train_matches(AdvisorDef advisorDef, ServiceDef 
serviceDef, boolean matches)
+    {
+        expect(advisorDef.matches(serviceDef)).andReturn(matches);
+    }
+
     protected final <T> void train_provide(ObjectProvider provider, Class<T> 
objectType,
             AnnotationProvider annotationProvider, ObjectLocator locator, T 
object)
     {

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
 Mon May 30 05:50:41 2011
@@ -25,15 +25,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.tapestry5.ioc.internal.AdviseByMarkerModule;
-import org.apache.tapestry5.ioc.internal.AlphabetModule;
-import org.apache.tapestry5.ioc.internal.AlphabetModule2;
-import org.apache.tapestry5.ioc.internal.DecorateByMarkerModule;
-import org.apache.tapestry5.ioc.internal.ExceptionInConstructorModule;
-import org.apache.tapestry5.ioc.internal.ExtraPublicConstructorsModule;
-import org.apache.tapestry5.ioc.internal.IOCInternalTestCase;
-import org.apache.tapestry5.ioc.internal.PrivateConstructorModule;
-import org.apache.tapestry5.ioc.internal.UpcaseService;
+import org.apache.tapestry5.ioc.internal.*;
 import org.apache.tapestry5.ioc.internal.services.SimpleAnnotation;
 import org.apache.tapestry5.ioc.internal.services.StartupModule2;
 import org.apache.tapestry5.ioc.services.Builtin;
@@ -1578,6 +1570,19 @@ public class IntegrationTest extends IOC
     }
 
     @Test
+    public void advise_by_annotation_matched_by_id()
+    {
+        Registry r = buildRegistry(AdviseByMarkerModule2.class);
+
+        Greeter green = r.getService("RedGreeter", Greeter.class);
+
+        assertEquals(green.getGreeting(), "beta[alpha[Red]]");
+
+        r.shutdown();
+
+    }
+
+    @Test
     public void decorate_by_annotation()
     {
         Registry r = buildRegistry(GreeterModule2.class, 
DecorateByMarkerModule.class);

Added: 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AdviseByMarkerModule2.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AdviseByMarkerModule2.java?rev=1128997&view=auto
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AdviseByMarkerModule2.java
 (added)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AdviseByMarkerModule2.java
 Mon May 30 05:50:41 2011
@@ -0,0 +1,77 @@
+// Copyright 2010 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package org.apache.tapestry5.ioc.internal;
+
+import org.apache.tapestry5.ioc.*;
+import org.apache.tapestry5.ioc.annotations.Advise;
+import org.apache.tapestry5.ioc.annotations.Marker;
+import org.apache.tapestry5.ioc.annotations.Match;
+import org.apache.tapestry5.ioc.annotations.Order;
+import org.testng.Assert;
+import org.testng.TestNG;
+
+
+public class AdviseByMarkerModule2
+{
+    private static void doAdvise(MethodAdviceReceiver receiver, final String 
id)
+    {
+        receiver.adviseAllMethods(new MethodAdvice()
+        {
+
+            public void advise(Invocation invocation)
+            {
+                invocation.proceed();
+
+                Object result = invocation.getResult();
+
+                invocation.overrideResult(String.format("%s[%s]", id, result));
+
+            }
+        });
+    }
+
+    @Advise
+    @Match ("RedGreeter")
+    public static void byMatchAnnotation(MethodAdviceReceiver receiver)
+    {
+        doAdvise(receiver, "alpha");
+    }
+
+    @Advise(id="withMarker")
+    @RedMarker
+    @Order("before:*")
+    public static void byMarkerAnnotation(MethodAdviceReceiver receiver)
+    {
+        doAdvise(receiver, "beta");
+    }
+
+    @Advise(id="doesNotMatchAnyService")
+    public static void doesNotMatchAnyService(MethodAdviceReceiver receiver)
+    {
+        Assert.fail("Unexpected invocation");
+    }
+   
+    @Marker(RedMarker.class)
+    public Greeter buildRedGreeter()
+    {
+        return new Greeter()
+        {
+            public String getGreeting()
+            {
+                return "Red";
+            }
+        };
+    }
+
+}

Propchange: 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AdviseByMarkerModule2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleImplTest.java?rev=1128997&r1=1128996&r2=1128997&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ModuleImplTest.java
 Mon May 30 05:50:41 2011
@@ -14,11 +14,9 @@
 
 package org.apache.tapestry5.ioc.internal;
 
-import org.apache.tapestry5.ioc.Registry;
-import org.apache.tapestry5.ioc.RegistryBuilder;
-import org.apache.tapestry5.ioc.def.DecoratorDef;
-import org.apache.tapestry5.ioc.def.ModuleDef;
-import org.apache.tapestry5.ioc.def.ServiceDef;
+import org.apache.tapestry5.ioc.*;
+import org.apache.tapestry5.ioc.def.*;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ClassFactory;
 import org.slf4j.Logger;
 import org.testng.annotations.Test;
@@ -62,8 +60,8 @@ public class ModuleImplTest extends IOCI
     {
         InternalRegistry registry = mockInternalRegistry();
         ServiceDef serviceDef = mockServiceDef();
-        DecoratorDef def1 = mockDecoratorDef();
-        DecoratorDef def2 = mockDecoratorDef();
+        DecoratorDef2 def1 =newMock(DecoratorDef2.class);
+        DecoratorDef def2 = newMock(DecoratorDef2.class);
         Set<DecoratorDef> rawDefs = newMock(Set.class);
         Logger logger = mockLogger();
 
@@ -77,6 +75,7 @@ public class ModuleImplTest extends IOCI
         expect(rawDefs.iterator()).andReturn(Arrays.asList(def1, 
def2).iterator());
 
         train_matches(def1, serviceDef, false);
+        expect(def1.getServiceInterface()).andReturn(ToStringService.class);
         expect(serviceDef.getServiceInterface()).andReturn(Runnable.class);
         train_matches(def2, serviceDef, true);
 
@@ -92,6 +91,214 @@ public class ModuleImplTest extends IOCI
         verify();
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    public void find_decorator_defs_for_service_markers_do_not_match()
+    {
+        InternalRegistry registry = mockInternalRegistry();
+        ServiceDef serviceDef = mockServiceDef();
+        DecoratorDef2 def1 =newMock(DecoratorDef2.class);
+        DecoratorDef def2 = newMock(DecoratorDef2.class);
+        Set<DecoratorDef> rawDefs = newMock(Set.class);
+        Set<Class> def1Markers = 
CollectionFactory.newSet((Class)BlueMarker.class);
+        Set<Class> serviceDefMarkers 
=CollectionFactory.newSet((Class)RedMarker.class);
+        Set<Class> allMarkers = 
CollectionFactory.newSet((Class)BlueMarker.class, (Class)BlueMarker.class);
+        Logger logger = mockLogger();
+
+        ModuleDef moduleDef = mockModuleDef();
+
+        Set<String> serviceIds = Collections.emptySet();
+        expect(moduleDef.getServiceIds()).andReturn(serviceIds);
+
+        expect(moduleDef.getDecoratorDefs()).andReturn(rawDefs);
+
+        expect(rawDefs.iterator()).andReturn(Arrays.asList(def1, 
def2).iterator());
+
+        train_matches(def1, serviceDef, false);
+        expect(def1.getServiceInterface()).andReturn(Object.class);
+        expect(serviceDef.getServiceInterface()).andReturn(Runnable.class);
+        expect(def1.getMarkers()).andReturn(def1Markers);
+        expect(registry.getMarkerAnnotations()).andReturn(allMarkers);
+        expect(serviceDef.getMarkers()).andReturn(serviceDefMarkers);
+        train_matches(def2, serviceDef, true);
+
+        replay();
+
+        Module module = new ModuleImpl(registry, null, moduleDef, null, 
logger);
+
+        Set<DecoratorDef> defs = module.findMatchingDecoratorDefs(serviceDef);
+
+        assertEquals(defs.size(), 1);
+        assertTrue(defs.contains(def2));
+
+        verify();
+    }
+
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void find_advisor_defs_for_service()
+    {
+        InternalRegistry registry = mockInternalRegistry();
+        ServiceDef serviceDef = mockServiceDef();
+        AdvisorDef2 def1 = mockAdvisorDef2();
+        AdvisorDef2 def2 = mockAdvisorDef2();
+        Set<AdvisorDef> rawDefs = newMock(Set.class);
+        Logger logger = mockLogger();
+
+        ModuleDef2 moduleDef = mockModuleDef2();
+
+        Set<String> serviceIds = Collections.emptySet();
+        expect(moduleDef.getServiceIds()).andReturn(serviceIds);
+
+        expect(moduleDef.getAdvisorDefs()).andReturn(rawDefs);
+
+        expect(rawDefs.iterator()).andReturn(Arrays.<AdvisorDef>asList(def1, 
def2).iterator());
+
+        train_matches(def1, serviceDef, false);
+        expect(def1.getServiceInterface()).andReturn(ToStringService.class);
+        expect(serviceDef.getServiceInterface()).andReturn(Runnable.class);
+        train_matches(def2, serviceDef, true);
+
+        replay();
+
+        Module module = new ModuleImpl(registry, null, moduleDef, null, 
logger);
+
+        Set<AdvisorDef> defs = module.findMatchingServiceAdvisors(serviceDef);
+
+        assertEquals(defs.size(), 1);
+        assertTrue(defs.contains(def2));
+
+        verify();
+    }
+
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void find_advisor_defs_for_service_markers_do_not_match()
+    {
+        InternalRegistry registry = mockInternalRegistry();
+        ServiceDef serviceDef = mockServiceDef();
+        AdvisorDef2 def1 = mockAdvisorDef2();
+        AdvisorDef2 def2 = mockAdvisorDef2();
+        Set<AdvisorDef> rawDefs = newMock(Set.class);
+        Set<Class> def1Markers = 
CollectionFactory.newSet((Class)BlueMarker.class);
+        Set<Class> serviceDefMarkers 
=CollectionFactory.newSet((Class)RedMarker.class);
+        Set<Class> allMarkers = 
CollectionFactory.newSet((Class)BlueMarker.class, (Class)BlueMarker.class);
+        Logger logger = mockLogger();
+
+        ModuleDef2 moduleDef = mockModuleDef2();
+
+        Set<String> serviceIds = Collections.emptySet();
+        expect(moduleDef.getServiceIds()).andReturn(serviceIds);
+
+        expect(moduleDef.getAdvisorDefs()).andReturn(rawDefs);
+
+        expect(rawDefs.iterator()).andReturn(Arrays.<AdvisorDef>asList(def1, 
def2).iterator());
+
+        train_matches(def1, serviceDef, false);
+        expect(def1.getServiceInterface()).andReturn(Object.class);
+        expect(serviceDef.getServiceInterface()).andReturn(Runnable.class);
+        expect(def1.getMarkers()).andReturn(def1Markers);
+        expect(registry.getMarkerAnnotations()).andReturn(allMarkers);
+        expect(serviceDef.getMarkers()).andReturn(serviceDefMarkers);
+
+        train_matches(def2, serviceDef, true);
+
+        replay();
+
+        Module module = new ModuleImpl(registry, null, moduleDef, null, 
logger);
+
+        Set<AdvisorDef> defs = module.findMatchingServiceAdvisors(serviceDef);
+
+        assertEquals(defs.size(), 1);
+        assertTrue(defs.contains(def2));
+
+        verify();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void find_advisor_defs_for_service_markers_do_match()
+    {
+        InternalRegistry registry = mockInternalRegistry();
+        ServiceDef serviceDef = mockServiceDef();
+        AdvisorDef2 def1 = mockAdvisorDef2();
+        AdvisorDef2 def2 = mockAdvisorDef2();
+        Set<AdvisorDef> rawDefs = newMock(Set.class);
+        Set<Class> def1Markers = 
CollectionFactory.newSet((Class)BlueMarker.class);
+        Set<Class> serviceDefMarkers 
=CollectionFactory.newSet((Class)BlueMarker.class);
+        Set<Class> allMarkers = 
CollectionFactory.newSet((Class)BlueMarker.class);
+        Logger logger = mockLogger();
+
+        ModuleDef2 moduleDef = mockModuleDef2();
+
+        Set<String> serviceIds = Collections.emptySet();
+        expect(moduleDef.getServiceIds()).andReturn(serviceIds);
+
+        expect(moduleDef.getAdvisorDefs()).andReturn(rawDefs);
+
+        expect(rawDefs.iterator()).andReturn(Arrays.<AdvisorDef>asList(def1, 
def2).iterator());
+
+        train_matches(def1, serviceDef, false);
+        expect(def1.getServiceInterface()).andReturn(Object.class);
+        expect(serviceDef.getServiceInterface()).andReturn(Runnable.class);
+        expect(def1.getMarkers()).andReturn(def1Markers);
+        expect(registry.getMarkerAnnotations()).andReturn(allMarkers);
+        expect(serviceDef.getMarkers()).andReturn(serviceDefMarkers);
+
+        train_matches(def2, serviceDef, true);
+
+        replay();
+
+        Module module = new ModuleImpl(registry, null, moduleDef, null, 
logger);
+
+        Set<AdvisorDef> defs = module.findMatchingServiceAdvisors(serviceDef);
+
+        assertEquals(defs.size(), 2);
+        assertTrue(defs.contains(def1));
+        assertTrue(defs.contains(def2));
+
+        verify();
+    }
+
+
+     @SuppressWarnings("unchecked")
+    @Test
+    public void 
no_advisor_def_when_service_interface_is_default_and_no_markers()
+    {
+        InternalRegistry registry = mockInternalRegistry();
+        ServiceDef serviceDef = mockServiceDef();
+        AdvisorDef2 def = mockAdvisorDef2();
+        Set<AdvisorDef> rawDefs = newMock(Set.class);
+        Logger logger = mockLogger();
+
+        ModuleDef2 moduleDef = mockModuleDef2();
+
+        Set<String> serviceIds = Collections.emptySet();
+        expect(moduleDef.getServiceIds()).andReturn(serviceIds);
+
+        expect(moduleDef.getAdvisorDefs()).andReturn(rawDefs);
+
+        
expect(rawDefs.iterator()).andReturn(Arrays.<AdvisorDef>asList(def).iterator());
+
+        train_matches(def, serviceDef, false);
+        expect(def.getServiceInterface()).andReturn(Object.class);
+        expect(serviceDef.getServiceInterface()).andReturn(Runnable.class);
+        expect(def.getMarkers()).andReturn(CollectionFactory.<Class>newSet());
+        
expect(registry.getMarkerAnnotations()).andReturn(CollectionFactory.<Class>newSet());
+
+        replay();
+
+        Module module = new ModuleImpl(registry, null, moduleDef, null, 
logger);
+
+        Set<AdvisorDef> defs = module.findMatchingServiceAdvisors(serviceDef);
+
+        assertEquals(defs.size(), 0);
+
+        verify();
+    }
+
 
     protected void train_expandSymbols(InternalRegistry registry, String 
input, String expanded)
     {


Reply via email to