Browse Source

add possibility to override extension creation in DefaultExtensionFinder

pull/3/head
Decebal Suiu 11 years ago
parent
commit
abf4672d97
  1. 46
      pf4j/src/main/java/ro/fortsoft/pf4j/DefaultExtensionFinder.java

46
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 static final Logger log = LoggerFactory.getLogger(DefaultExtensionFinder.class);
private ClassLoader classLoader; private ClassLoader classLoader;
private ExtensionFactory extensionFactory;
private volatile Set<String> entries; private volatile Set<String> entries;
public DefaultExtensionFinder(ClassLoader classLoader) { public DefaultExtensionFinder(ClassLoader classLoader) {
this.classLoader = classLoader; this.classLoader = classLoader;
this.extensionFactory = createExtensionFactory();
} }
@Override @Override
@ -57,21 +59,17 @@ public class DefaultExtensionFinder implements ExtensionFinder {
Class<?> extensionType = classLoader.loadClass(entry); Class<?> extensionType = classLoader.loadClass(entry);
log.debug("Checking extension type {}", extensionType.getName()); log.debug("Checking extension type {}", extensionType.getName());
if (type.isAssignableFrom(extensionType)) { if (type.isAssignableFrom(extensionType)) {
Object instance = extensionType.newInstance(); Object instance = extensionFactory.create(extensionType);
if (instance != null) { if (instance != null) {
Extension extension = extensionType.getAnnotation(Extension.class); 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<T>(type.cast(instance), extension.ordinal())); result.add(new ExtensionWrapper<T>(type.cast(instance), extension.ordinal()));
} }
} else { } 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) { } catch (ClassNotFoundException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} catch (InstantiationException e) {
log.error(e.getMessage(), e);
} catch (IllegalAccessException e) {
log.error(e.getMessage(), e);
} }
} }
@ -87,6 +85,31 @@ public class DefaultExtensionFinder implements ExtensionFinder {
return result; 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<String> readIndexFiles() { private Set<String> readIndexFiles() {
log.debug("Reading extensions index files"); log.debug("Reading extensions index files");
Set<String> entries = new HashSet<String>(); Set<String> entries = new HashSet<String>();
@ -110,4 +133,13 @@ public class DefaultExtensionFinder implements ExtensionFinder {
return entries; return entries;
} }
/**
* Creates an extension instance.
*/
public static interface ExtensionFactory {
public Object create(Class<?> extensionType);
}
} }

Loading…
Cancel
Save