package de.skuzzle.polly.core.moduleloader;
import org.apache.log4j.Logger;
public abstract class AbstractProvider implements Provider {
protected Logger logger = Logger.getLogger(AbstractProvider.class.getName());
private ModuleLoader loader;
private String name;
private boolean crucial;
private boolean setup;
private boolean run;
public AbstractProvider(String name, ModuleLoader loader, boolean isCrucial) {
this.name = name;
this.loader = loader;
this.crucial = isCrucial;
loader.registerModule(this);
}
@Override
public ModuleLoader getModuleLoder() {
return this.loader;
}
@Override
public void addState(int state) {
this.loader.addState(state);
}
@Override
public void provideComponent(Object component) {
this.loader.provideComponent(component);
}
@Override
public void provideComponentAs(Class<?> type, Object component) {
this.loader.provideComponentAs(type, component);
}
@Override
public <T> T requireNow(Class<T> component, boolean check) {
if (check && !this.loader.checkRequires(component, this)) {
throw new ModuleDependencyException("Module " + this +
" tries to access a non-reported requirement: " + component);
}
return this.loader.requireNow(component);
}
public void beforeSetup() {}
@Override
public final void setupModule() throws SetupException {
if (this.setup) {
return;
}
try {
this.beforeSetup();
this.setup();
} catch (SetupException e) {
if (this.crucial) {
logger.error("Error while setup of crucial module '" +
this.getName() + "'", e);
throw e;
}
logger.error(
"Error while setup of non-crucial module '" + this.getName()
+ "'", e);
} finally {
this.setup = true;
}
}
public abstract void setup() throws SetupException;
public void beforeRun() {}
public final void runModule() throws Exception {
if (this.run) {
return;
} else if (!this.setup) {
throw new ModuleDependencyException("Module " + this +
"' must be set up before running!");
}
try {
this.beforeRun();
this.run();
} catch (Exception e) {
e.printStackTrace();
if (this.isCrucial()) {
throw e;
}
} finally {
this.run = true;
}
}
public void run() throws Exception {
}
@Override
public boolean isCrucial() {
return this.crucial;
}
@Override
public boolean isSetup() {
return this.setup;
}
@Override
public boolean isRun() {
return this.run;
}
@Override
public String getName() {
return this.name;
}
@Override
public String toString() {
return this.getName();
}
@Override
public void dispose() {
this.loader = null;
}
}