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) {