/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.camel.spring.scan;
import java.lang.annotation.Annotation;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashSet;
import java.util.Set;
import org.apache.camel.impl.DefaultPackageScanClassResolver;
import org.apache.camel.spring.scan.a.ScanTargetOne;
import org.apache.camel.spring.scan.b.ScanTargetTwo;
import org.apache.camel.spring.scan.c.ScanTargetThree;
public class DefaultPackageScanClassResolverTest extends org.apache.camel.spring.scan.ScanTestSupport {
private DefaultPackageScanClassResolver resolver;
private Set<Class<? extends Annotation>> annotations = new HashSet<Class<? extends Annotation>>();
private String scanPackage = "org.apache.camel.spring.scan";
public void setUp() throws Exception {
super.setUp();
resolver = new DefaultPackageScanClassResolver();
annotations.add(org.apache.camel.spring.scan.ScannableOne.class);
annotations.add(org.apache.camel.spring.scan.ScannableTwo.class);
}
public void testAccepableSchema() {
assertFalse("We should not accept the test by default!", resolver.isAcceptableScheme("test://test"));
resolver.setAcceptableSchemes("test:;test2:");
assertTrue("We should accept the test:!", resolver.isAcceptableScheme("test://test"));
assertTrue("We should accept the test2:!", resolver.isAcceptableScheme("test2://test"));
}
public void testFindByAnnotationWithoutExtraFilters() {
Set<Class<?>> scanned = resolver.findAnnotated(org.apache.camel.spring.scan.ScannableOne.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetOne.class, ScanTargetTwo.class);
scanned = resolver.findAnnotated(org.apache.camel.spring.scan.ScannableTwo.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetThree.class);
}
public void testFindByAnnotationsWithoutExtraFilters() {
Set<Class<?>> scanned = resolver.findAnnotated(annotations, scanPackage);
validateMatchingSetContains(scanned, ScanTargetOne.class, ScanTargetTwo.class, ScanTargetThree.class);
}
public void testFindImplementationsWithoutExtraFilters() {
Set<Class<?>> scanned = resolver.findImplementations(ScanTargetOne.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetOne.class, ScanTargetTwo.class);
}
public void testFindByAnnotationWithIncludePackageFilter() {
filter.addIncludePattern(scanPackage + ".b.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findAnnotated(org.apache.camel.spring.scan.ScannableOne.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetTwo.class);
scanned = resolver.findAnnotated(ScannableTwo.class, scanPackage);
validateMatchingSetContains(scanned);
}
public void testFindByAnnotationsWithIncludePackageFilter() {
filter.addIncludePattern(scanPackage + ".b.*");
filter.addIncludePattern(scanPackage + ".c.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findAnnotated(annotations, "org.apache.camel.spring.scan");
validateMatchingSetContains(scanned, ScanTargetTwo.class, ScanTargetThree.class);
}
public void testFindByAnnotationWithExcludePackageFilter() {
filter.addExcludePattern(scanPackage + ".b.*");
filter.addExcludePattern(scanPackage + ".c.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findAnnotated(ScannableOne.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetOne.class);
scanned = resolver.findAnnotated(org.apache.camel.spring.scan.ScannableTwo.class, scanPackage);
validateMatchingSetContains(scanned);
}
public void testFindByAnnotationsWithExcludePackageFilter() {
filter.addExcludePattern(scanPackage + ".a.*");
Set<Class<?>> scanned = resolver.findAnnotated(annotations, "org.apache.camel.spring.scan");
validateMatchingSetContains(scanned, ScanTargetTwo.class, ScanTargetThree.class);
}
public void testFindByFilterWithIncludePackageFilter() {
filter.addIncludePattern(scanPackage + ".**.ScanTarget*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findByFilter(filter, "org.apache.camel.spring.scan");
validateMatchingSetContains(scanned, ScanTargetOne.class, ScanTargetTwo.class, ScanTargetThree.class);
}
public void testFindImplementationsWithIncludePackageFilter() {
filter.addIncludePattern(scanPackage + ".b.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findImplementations(ScanTargetOne.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetTwo.class);
}
public void testFindImplementationsWithExcludePackageFilter() {
filter.addExcludePattern(scanPackage + ".a.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findImplementations(ScanTargetOne.class, scanPackage);
validateMatchingSetContains(scanned, ScanTargetTwo.class);
}
public void testFindByFilterPackageInJarUrl() throws Exception {
ClassLoader savedClassLoader = null;
try {
savedClassLoader = Thread.currentThread().getContextClassLoader();
URL url = getClass().getResource("/package_scan_test.jar");
URL urls[] = {new URL("jar:" + url.toString() + "!/")};
URLClassLoader classLoader = new URLClassLoader(urls, savedClassLoader);
Thread.currentThread().setContextClassLoader(classLoader);
// recreate resolver since we mess with context class loader
resolver = new DefaultPackageScanClassResolver();
filter.addIncludePattern("a.*.c.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findByFilter(filter, "a.b.c");
assertEquals(1, scanned.size());
assertEquals("class a.b.c.Test", scanned.iterator().next().toString());
} finally {
if (savedClassLoader != null) {
Thread.currentThread().setContextClassLoader(savedClassLoader);
}
}
}
public void testFindByFilterPackageInJarUrlWithPlusChars() throws Exception {
ClassLoader savedClassLoader = null;
try {
savedClassLoader = Thread.currentThread().getContextClassLoader();
URL url = getClass().getResource("/package+scan+test.jar");
URL urls[] = {new URL("jar:" + url.toString() + "!/")};
URLClassLoader classLoader = new URLClassLoader(urls, savedClassLoader);
Thread.currentThread().setContextClassLoader(classLoader);
// recreate resolver since we mess with context class loader
resolver = new DefaultPackageScanClassResolver();
filter.addIncludePattern("a.*.c.*");
resolver.addFilter(filter);
Set<Class<?>> scanned = resolver.findByFilter(filter, "a.b.c");
assertEquals(1, scanned.size());
assertEquals("class a.b.c.Test", scanned.iterator().next().toString());
} finally {
if (savedClassLoader != null) {
Thread.currentThread().setContextClassLoader(savedClassLoader);
}
}
}
}