Adds factory to allow create different versions of ClassFinder
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/a1941a85 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/a1941a85 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/a1941a85 Branch: refs/heads/master Commit: a1941a8528cdb82501f1ea2611367275b66258ee Parents: 3ce21ac Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Sat Dec 20 21:46:25 2014 +0100 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Sat Dec 20 21:46:25 2014 +0100 ---------------------------------------------------------------------- .../PackageBasedActionConfigBuilder.java | 26 +++++++++++++++++--- .../xwork2/util/finder/ClassFinderFactory.java | 11 +++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/a1941a85/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java index f6a43a8..811df83 100644 --- a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java +++ b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java @@ -38,7 +38,8 @@ import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.WildcardHelper; import com.opensymphony.xwork2.util.classloader.ReloadingClassLoader; import com.opensymphony.xwork2.util.finder.ClassFinder; -import com.opensymphony.xwork2.util.finder.ClassFinder.ClassInfo; +import com.opensymphony.xwork2.util.finder.ClassFinderFactory; +import com.opensymphony.xwork2.util.finder.DefaultClassFinder; import com.opensymphony.xwork2.util.finder.ClassLoaderInterface; import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate; import com.opensymphony.xwork2.util.finder.Test; @@ -113,6 +114,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { private boolean eagerLoading = false; private FileManager fileManager; + private ClassFinderFactory classFinderFactory; /** * Constructs actions based on a list of packages. @@ -303,6 +305,11 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { this.fileManager = fileManagerFactory.getFileManager(); } + @Inject(required = false) + public void setClassFinderFactory(ClassFinderFactory classFinderFactory) { + this.classFinderFactory = classFinderFactory; + } + protected void initReloadClassLoader() { //when the configuration is reloaded, a new classloader will be setup if (isReloadEnabled() && reloadingClassLoader == null) @@ -387,7 +394,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { // specified by the user Test<String> classPackageTest = getClassPackageTest(); List<URL> urls = readUrls(); - ClassFinder finder = new ClassFinder(getClassLoaderInterface(), urls, EXTRACT_BASE_INTERFACES, fileProtocols, classPackageTest); + ClassFinder finder = buildClassFinder(classPackageTest, urls); Test<ClassFinder.ClassInfo> test = getActionClassTest(); classes.addAll(finder.findClasses(test)); @@ -400,6 +407,16 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { return classes; } + protected ClassFinder buildClassFinder(Test<String> classPackageTest, List<URL> urls) { + if (classFinderFactory != null) { + LOG.trace("Using ClassFinderFactory to create instance of ClassFinder!"); + return classFinderFactory.buildClassFinder(getClassLoaderInterface(), urls, EXTRACT_BASE_INTERFACES, fileProtocols, classPackageTest); + } else { + LOG.trace("ClassFinderFactory not defined, fallback to default ClassFinder implementation"); + return new DefaultClassFinder(getClassLoaderInterface(), urls, EXTRACT_BASE_INTERFACES, fileProtocols, classPackageTest); + } + } + private List<URL> readUrls() throws IOException { List<URL> resourceUrls = new ArrayList<URL>(); // Usually the "classes" dir. @@ -496,7 +513,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { * goal is to avoid loading the class if we don't have to, the (actionSuffix * || implements Action) test will have to remain until later. See * {@link #getActionClassTest()} for the test performed on the loaded - * {@link ClassInfo} structure. + * {@link ClassFinder.ClassInfo} structure. * * @param className the name of the class to test * @return true if the specified class should be included in the @@ -588,7 +605,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { /** * Construct a {@link Test} Object that determines if a specified class - * should be included in the package scan based on the full {@link ClassInfo} + * should be included in the package scan based on the full {@link ClassFinder.ClassInfo} * of the class. At this point, the class has been loaded, so it's ok to * perform tests such as checking annotations or looking at interfaces or * super-classes of the specified class. @@ -1121,4 +1138,5 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder { } else return false; } + } http://git-wip-us.apache.org/repos/asf/struts/blob/a1941a85/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinderFactory.java ---------------------------------------------------------------------- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinderFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinderFactory.java new file mode 100644 index 0000000..28e47c2 --- /dev/null +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinderFactory.java @@ -0,0 +1,11 @@ +package com.opensymphony.xwork2.util.finder; + +import java.net.URL; +import java.util.Collection; +import java.util.Set; + +public interface ClassFinderFactory { + + ClassFinder buildClassFinder(ClassLoaderInterface classLoaderInterface, Collection<URL> urls, boolean extractBaseInterfaces, Set<String> protocols, Test<String> classNameFilter); + +}