From abf4672d97529d3122848c762d3269311a9f281f Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Thu, 10 Oct 2013 16:48:53 +0300 Subject: [PATCH] add possibility to override extension creation in DefaultExtensionFinder --- .../fortsoft/pf4j/DefaultExtensionFinder.java | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultExtensionFinder.java b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultExtensionFinder.java index 5ab989b..f61195b 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultExtensionFinder.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultExtensionFinder.java @@ -38,10 +38,12 @@ public class DefaultExtensionFinder implements ExtensionFinder { private static final Logger log = LoggerFactory.getLogger(DefaultExtensionFinder.class); private ClassLoader classLoader; + private ExtensionFactory extensionFactory; private volatile Set entries; public DefaultExtensionFinder(ClassLoader classLoader) { this.classLoader = classLoader; + this.extensionFactory = createExtensionFactory(); } @Override @@ -57,21 +59,17 @@ public class DefaultExtensionFinder implements ExtensionFinder { Class extensionType = classLoader.loadClass(entry); log.debug("Checking extension type {}", extensionType.getName()); if (type.isAssignableFrom(extensionType)) { - Object instance = extensionType.newInstance(); + Object instance = extensionFactory.create(extensionType); if (instance != null) { Extension extension = extensionType.getAnnotation(Extension.class); - log.debug("Added extension {} with ordinal {}", extensionType, extension.ordinal()); + log.debug("Added extension {} with ordinal {}", extensionType.getName(), extension.ordinal()); result.add(new ExtensionWrapper(type.cast(instance), extension.ordinal())); } } else { - log.warn("{} is not an extension for extension point {}", extensionType, type.getName()); + log.warn("{} is not an extension for extension point {}", extensionType.getName(), type.getName()); } } catch (ClassNotFoundException e) { - log.error(e.getMessage(), e); - } catch (InstantiationException e) { - log.error(e.getMessage(), e); - } catch (IllegalAccessException e) { - log.error(e.getMessage(), e); + log.error(e.getMessage(), e); } } @@ -87,6 +85,31 @@ public class DefaultExtensionFinder implements ExtensionFinder { return result; } + /** + * Add the possibility to override the ExtensionFactory. + * The default implementation uses Class.newInstance() method. + */ + protected ExtensionFactory createExtensionFactory() { + return new ExtensionFactory() { + + @Override + public Object create(Class extensionType) { + log.debug("Create instance for extension {}", extensionType.getName()); + + try { + return extensionType.newInstance(); + } catch (InstantiationException e) { + log.error(e.getMessage(), e); + } catch (IllegalAccessException e) { + log.error(e.getMessage(), e); + } + + return null; + } + + }; + } + private Set readIndexFiles() { log.debug("Reading extensions index files"); Set entries = new HashSet(); @@ -110,4 +133,13 @@ public class DefaultExtensionFinder implements ExtensionFinder { return entries; } + /** + * Creates an extension instance. + */ + public static interface ExtensionFactory { + + public Object create(Class extensionType); + + } + }