support plugins with default constructors

This commit is contained in:
Anton Keks 2015-08-14 01:47:55 +03:00
parent 32699e8c4f
commit 6b2bd34639

View File

@ -7,6 +7,7 @@ package net.azib.ipscan.config;
import dagger.Module;
import dagger.Provides;
import net.azib.ipscan.core.Plugin;
import net.azib.ipscan.core.state.StateMachine;
import net.azib.ipscan.exporters.*;
import net.azib.ipscan.feeders.FeederCreator;
@ -16,9 +17,9 @@ import net.azib.ipscan.gui.SWTAwareStateMachine;
import net.azib.ipscan.gui.feeders.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.picocontainer.MutablePicoContainer;
import javax.inject.Named;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@ -71,29 +72,37 @@ public class ComponentRegistry {
return Arrays.asList(f1, f2, f3);
}
@Provides public List<Exporter> exporters(TXTExporter e1, CSVExporter e2, XMLExporter e3, IPListExporter e4) {
return Arrays.<Exporter>asList(e1, e2, e3, e4);
@Provides public List<Exporter> exporters(@Named("plugins") List<Class> plugins, TXTExporter e1, CSVExporter e2, XMLExporter e3, IPListExporter e4) {
return addPlugins(Arrays.<Exporter>asList(e1, e2, e3, e4), Exporter.class, plugins);
}
@Provides public List<Fetcher> fetchers(IPFetcher f1, PingFetcher f2, PingTTLFetcher f3, HostnameFetcher f4, PortsFetcher f5,
FilteredPortsFetcher f6, WebDetectFetcher f7, HTTPSenderFetcher f8, CommentFetcher f9,
NetBIOSInfoFetcher f10, MACFetcher f11, MACVendorFetcher f12) {
return Arrays.<Fetcher>asList(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12);
@Provides public List<Fetcher> fetchers(@Named("plugins") List<Class> plugins,
IPFetcher f1, PingFetcher f2, PingTTLFetcher f3, HostnameFetcher f4, PortsFetcher f5,
FilteredPortsFetcher f6, WebDetectFetcher f7, HTTPSenderFetcher f8, CommentFetcher f9,
NetBIOSInfoFetcher f10, MACFetcher f11, MACVendorFetcher f12) {
return addPlugins(Arrays.<Fetcher>asList(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12), Fetcher.class, plugins);
}
@Provides MACFetcher selectMacFetcher() {
return Platform.WINDOWS ? new WinMACFetcher() : new UnixMACFetcher();
}
private void registerComponentImplementations(MutablePicoContainer container, List<Class> classes) {
// TODO: @Named("plugins") List<Class> plugins
@SuppressWarnings("unchecked")
private <T extends Plugin> List<T> addPlugins(List<T> original, Class<T> type, @Named("plugins") List<Class> classes) {
List<T> result = new ArrayList<T>(original);
for (Class clazz: classes) {
container.registerComponentImplementation(clazz);
try {
if (type.isAssignableFrom(clazz))
result.add((T)clazz.newInstance());
}
catch (Exception e) {
throw new RuntimeException("Cannot instantiate plugin with default constructor: " + clazz.getName());
}
}
return result;
}
// TODO: implement start with Dagger
private void start() {
if (!containerStarted) {
containerStarted = true;