package org.signalml.app.config.preset.managers;
import java.io.File;
import java.io.IOException;
import org.signalml.app.config.preset.Preset;
import org.signalml.app.config.preset.PresetManager;
import org.signalml.domain.montage.generators.IMontageGenerator;
import org.signalml.domain.montage.system.EegSystem;
import org.signalml.domain.montage.system.EegSystemName;
import org.signalml.domain.montage.system.MontageGenerators;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* This {@link PresetManager} manages the available EEG systems definitions which
* are stored in the 'eegSystems' directory inside the profile directory.
* It reads the EEG electrodes definitions from the 'eegSystems/electrodes'
* and montage generators definitions from the 'eegSystems/generators' directory
* and connects them appropriately to form EEG systems.
*
* @author Piotr Szachewicz
*/
@XStreamAlias("eegSystems")
public class EegSystemsPresetManager extends AbstractPresetManager {
/**
* The preset manager that handles the EEG electrodes definitions.
*/
private EegElectrodesPresetManager eegElectrodesPresetManager = new EegElectrodesPresetManager();
/**
* The preset manager that handles the {@link IMontageGenerator montage generators}
* definitions.
*/
private MontageGeneratorsPresetManager montageGeneratorsPresetManager = new MontageGeneratorsPresetManager();
@Override
public void readFromPersistence(File file) throws IOException {
eegElectrodesPresetManager.readFromPersistence(null);
this.copyFrom(eegElectrodesPresetManager);
montageGeneratorsPresetManager.readFromPersistence(null);
matchMontageGeneratorsWithEegSystems(this.getPresets(), montageGeneratorsPresetManager.getPresets());
}
/**
* Matches the right {@link IMontageGenerator} with the correct EEG system
* taking into account the name of the EEG system.
* @param eegSystemsPresets the list of EEG systems presets to which montage
* generators should be connected
* @param montageGeneratorsPresets montage generators to be connected
* to the right EEG systems
*/
protected void matchMontageGeneratorsWithEegSystems(Preset[] eegSystemsPresets, Preset[] montageGeneratorsPresets) {
for (Preset preset: eegSystemsPresets) {
EegSystem eegSystem = (EegSystem) preset;
EegSystemName eegSystemName = ((EegSystem) preset).getEegSystemName();
for (Preset generatorPreset: montageGeneratorsPresets) {
MontageGenerators montageGenerators = (MontageGenerators) generatorPreset;
EegSystemName generatorEegSystem = montageGenerators.getEegSystemName();
if (generatorEegSystem == null || generatorEegSystem.getSymbol() == null)
continue;
String symbol = generatorEegSystem.getSymbol();
String type = generatorEegSystem.getType() == null ? null: generatorEegSystem.getType();
if (eegSystemName.getSymbol().equalsIgnoreCase(symbol)
&& (type == null || type.isEmpty() ||
type.equalsIgnoreCase(eegSystemName.getType()))) {
//if type of the EEG system in the montage generator is NULL then
//it is not taken into account while connecting montage generators
//with EEG systems - this makes sense for montage generators that fit for
//every type of an EEG system.
eegSystem.setMontageGenerators(montageGenerators);
}
}
}
}
@Override
public void setProfileDir(File profileDir) {
super.setProfileDir(profileDir);
eegElectrodesPresetManager.setProfileDir(profileDir);
montageGeneratorsPresetManager.setProfileDir(profileDir);
}
/**
* Creates the 'eegSystems/electrodes' and 'eegSystems/generators'
* directories in the user directory, so that the user knows
* where is the place to put his electrode and generators definitions.
*/
public void createProfileDirectoriesIfNecessary() {
eegElectrodesPresetManager.createProfileDirectoryIfNecessary();
montageGeneratorsPresetManager.createProfileDirectoryIfNecessary();
}
@Override
public String getStandardFilename() {
throw new UnsupportedOperationException("This opperation is not supported by this preset manager.");
}
@Override
public Class<?> getPresetClass() {
throw new UnsupportedOperationException("This opperation is not supported by this preset manager.");
}
public EegSystem getEegSystem(EegSystemName eegSystemName) {
for (Preset preset: presets) {
EegSystem eegSystem = (EegSystem) preset;
if (eegSystem.getEegSystemName().equals(eegSystemName))
return eegSystem;
}
return null;
}
@Override
public Preset getDefaultPreset() {
for (Preset preset: presets) {
EegSystem eegSystem = (EegSystem) preset;
if (eegSystem.isDefault())
return eegSystem;
}
return null;
}
}