/* * Copyright 2002-2007 the original author or authors. * * 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.springframework.core.type; import junit.framework.TestCase; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.SimpleMetadataReaderFactory; import org.springframework.core.type.filter.AspectJTypeFilter; import org.springframework.stereotype.Component; /** * @author Ramnivas Laddad */ public class AspectJTypeFilterTests extends TestCase { public void testNamePatternMatches() throws Exception { assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "org.springframework.core.type.AspectJTypeFilterTests.SomeClass"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "*"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "*..SomeClass"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "org..SomeClass"); } public void testNamePatternNoMatches() throws Exception { assertNoMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "org.springframework.core.type.AspectJTypeFilterTests.SomeClassX"); } public void testSubclassPatternMatches() throws Exception { assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClass", "org.springframework.core.type.AspectJTypeFilterTests.SomeClass+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClass", "*+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClass", "java.lang.Object+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassImplementingSomeInterface", "org.springframework.core.type.AspectJTypeFilterTests.SomeInterface+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassImplementingSomeInterface", "*+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassImplementingSomeInterface", "java.lang.Object+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "org.springframework.core.type.AspectJTypeFilterTests.SomeInterface+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "org.springframework.core.type.AspectJTypeFilterTests.SomeClassExtendingSomeClass+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "org.springframework.core.type.AspectJTypeFilterTests.SomeClass+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "*+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "java.lang.Object+"); } public void testSubclassPatternNoMatches() throws Exception { assertNoMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClass", "java.lang.String+"); } public void testAnnotationPatternMathces() throws Exception { assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@org.springframework.stereotype.Component *..*"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@* *..*"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@*..* *..*"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@*..*Component *..*"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@org.springframework.stereotype.Component *..*Component"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@org.springframework.stereotype.Component *"); } public void testAnnotationPatternNoMathces() throws Exception { assertNoMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassAnnotatedWithComponent", "@org.springframework.stereotype.Repository *..*"); } public void testCompositionPatternMatches() throws Exception { assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "!*..SomeOtherClass"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "org.springframework.core.type.AspectJTypeFilterTests.SomeInterface+ " + "&& org.springframework.core.type.AspectJTypeFilterTests.SomeClass+ " + "&& org.springframework.core.type.AspectJTypeFilterTests.SomeClassExtendingSomeClass+"); assertMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface", "org.springframework.core.type.AspectJTypeFilterTests.SomeInterface+ " + "|| org.springframework.core.type.AspectJTypeFilterTests.SomeClass+ " + "|| org.springframework.core.type.AspectJTypeFilterTests.SomeClassExtendingSomeClass+"); } public void testCompositionPatternNoMatches() throws Exception { assertNoMatch("org.springframework.core.type.AspectJTypeFilterTests$SomeClass", "*..Bogus && org.springframework.core.type.AspectJTypeFilterTests.SomeClass"); } private void assertMatch(String type, String typePattern) throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(type); AspectJTypeFilter filter = new AspectJTypeFilter(typePattern, getClass().getClassLoader()); assertTrue(filter.match(metadataReader, metadataReaderFactory)); ClassloadingAssertions.assertClassNotLoaded(type); } private void assertNoMatch(String type, String typePattern) throws Exception { MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(type); AspectJTypeFilter filter = new AspectJTypeFilter(typePattern, getClass().getClassLoader()); assertFalse(filter.match(metadataReader, metadataReaderFactory)); ClassloadingAssertions.assertClassNotLoaded(type); } // We must use a standalone set of types to ensure that no one else is loading them // and interfering with ClassloadingAssertions.assertClassNotLoaded() static interface SomeInterface { } static class SomeClass { } static class SomeClassExtendingSomeClass extends SomeClass { } static class SomeClassImplementingSomeInterface implements SomeInterface { } static class SomeClassExtendingSomeClassExtendingSomeClassAndImplemnentingSomeInterface extends SomeClassExtendingSomeClass implements SomeInterface { } @Component static class SomeClassAnnotatedWithComponent { } }