private static final Logger log = LoggerFactory.getLogger(DefaultExtensionFinder.class);
private ClassLoader classLoader;
+ private ExtensionFactory extensionFactory;
private volatile Set<String> entries;
public DefaultExtensionFinder(ClassLoader classLoader) {
this.classLoader = classLoader;
+ this.extensionFactory = createExtensionFactory();
}
@Override
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<T>(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);
}
}
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() {
log.debug("Reading extensions index files");
Set<String> entries = new HashSet<String>();
return entries;
}
+ /**
+ * Creates an extension instance.
+ */
+ public static interface ExtensionFactory {
+
+ public Object create(Class<?> extensionType);
+
+ }
+
}