package edu.umd.rhsmith.diads.meater.core.app.components;
import java.util.HashMap;
import java.util.Map;
import edu.umd.rhsmith.diads.meater.core.app.MEaterConfigurationException;
import edu.umd.rhsmith.diads.meater.core.app.MEaterInitializer;
import edu.umd.rhsmith.diads.meater.core.app.MEaterMain;
import edu.umd.rhsmith.diads.meater.core.app.components.media.MediaManager;
import edu.umd.rhsmith.diads.meater.core.app.components.media.MediaProcessor;
import edu.umd.rhsmith.diads.meater.core.app.components.media.MediaSource;
import edu.umd.rhsmith.diads.meater.util.ControlException;
import edu.umd.rhsmith.diads.meater.util.ControlUnit;
public class ComponentManager extends ControlUnit {
private final MEaterMain main;
private final Map<String, Component> components;
private final MediaManager mediaManager;
public ComponentManager(MEaterInitializer init, MEaterMain main) {
this.main = main;
// MEaterGeneralSettings settings = config.getGeneralSettings();
// component registrations
this.components = new HashMap<String, Component>();
// media
this.mediaManager = new MediaManager(init, main);
// logging
this.setLogger(this.main.getLogger());
this.setLogName("ComponentManager");
}
/*
* --------------------------------
* General getters/setters
* --------------------------------
*/
public MEaterMain getMain() {
return main;
}
public final MediaManager getMediaManager() {
return mediaManager;
}
/*
* --------------------------------
* Component registration
* --------------------------------
*/
public void registerComponent(Component component)
throws IllegalStateException {
synchronized (this.controlLock) {
this.requireUnStarted();
this.logInfo(MSG_REG_FMT, component.getName());
this.components.put(component.getName(), component);
component.setComponentManager(this);
for (MediaSource<?> source : component.getMediaSources()) {
this.mediaManager.registerSource(component.getName(), source);
}
for (MediaProcessor<?> processor : component.getMediaProcessors()) {
this.mediaManager.registerProcessor(component.getName(),
processor);
}
}
}
/*
* --------------------------------
* Control methods
* --------------------------------
*/
@Override
protected void doStartupRoutine() throws ControlException {
try {
for (Component c : this.components.values()) {
c.initialize();
}
} catch (MEaterConfigurationException e) {
throw new ControlException(MSG_ERR_INIT_CONFIG, e);
}
this.mediaManager.start();
for (Component c : this.components.values()) {
c.start();
}
}
@Override
protected void doShutdownRoutine() {
for (Component c : this.components.values()) {
c.stop();
}
this.mediaManager.stop();
}
/*
* --------------------------------
* Messages
* --------------------------------
*/
private static final String MSG_REG_FMT = "Component %s registered";
private static final String MSG_ERR_INIT_CONFIG = "Unable to start due to incorrectly-configured component";
}