package de.skuzzle.polly.core.internal.plugins;
import java.io.IOException;
import de.skuzzle.polly.core.Polly;
import de.skuzzle.polly.core.configuration.ConfigurationProviderImpl;
import de.skuzzle.polly.core.internal.ModuleStates;
import de.skuzzle.polly.core.internal.ShutdownManagerImpl;
import de.skuzzle.polly.core.internal.mypolly.MyPollyImpl;
import de.skuzzle.polly.core.moduleloader.AbstractProvider;
import de.skuzzle.polly.core.moduleloader.ModuleLoader;
import de.skuzzle.polly.core.moduleloader.SetupException;
import de.skuzzle.polly.core.moduleloader.annotations.Module;
import de.skuzzle.polly.core.moduleloader.annotations.Provide;
import de.skuzzle.polly.core.moduleloader.annotations.Require;
import de.skuzzle.polly.core.util.ProxyClassLoader;
import de.skuzzle.polly.sdk.Configuration;
import de.skuzzle.polly.sdk.ConfigurationProvider;
@Module(
requires = {
@Require(component = ConfigurationProviderImpl.class),
@Require(component = ShutdownManagerImpl.class),
@Require(component = ProxyClassLoader.class)
},
provides = {
@Provide(component = PluginManagerImpl.class),
@Provide(state = ModuleStates.PLUGINS_READY)
})
public class PluginManagerProvider extends AbstractProvider {
public final static String PLUGIN_CFG = "plugin.cfg";
private PluginManagerImpl pluginManager;
private Configuration pluginCfg;
private ShutdownManagerImpl shutdownManager;
private ProxyClassLoader pollyCl;
public PluginManagerProvider(ModuleLoader loader) {
super("PLUGIN_MANAGER_PROVIDER", loader, false);
}
@Override
public void beforeSetup() {
this.shutdownManager = this.requireNow(ShutdownManagerImpl.class, true);
this.pollyCl = this.requireNow(ProxyClassLoader.class, true);
}
@Override
public void setup() throws SetupException {
ConfigurationProvider configProvider = this.requireNow(
ConfigurationProviderImpl.class, true);
try {
this.pluginCfg = configProvider.open(PLUGIN_CFG);
} catch (IOException e) {
throw new SetupException(e);
}
this.pluginManager = new PluginManagerImpl(this.pollyCl);
this.provideComponent(this.pluginManager);
this.shutdownManager.addDisposable(this.pluginManager);
}
public void run() throws Exception {
MyPollyImpl myPolly = this.requireNow(MyPollyImpl.class, false);
try {
this.pluginManager.loadFolder(Polly.PLUGIN_FOLDER, myPolly,
this.pluginCfg.readStringList(Configuration.PLUGIN_EXCLUDES));
} finally {
this.addState(ModuleStates.PLUGINS_READY);
}
}
@Override
public void dispose() {
this.pluginCfg = null;
this.pluginManager = null;
this.pollyCl = null;
this.shutdownManager = null;
super.dispose();
}
}