/*
* This file is part of the OSMembrane project.
* More informations under www.osmembrane.de
*
* The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
* for more details about the license see http://www.osmembrane.de/license/
*
* Source: $HeadURL$ ($Revision$)
* Last changed: $Date$
*/
package de.osmembrane.model.settings;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Observable;
import de.osmembrane.Application;
import de.osmembrane.exceptions.ControlledException;
import de.osmembrane.exceptions.ExceptionSeverity;
import de.osmembrane.model.persistence.AbstractPersistence;
import de.osmembrane.model.persistence.FileException;
import de.osmembrane.model.persistence.PersistenceFactory;
import de.osmembrane.model.persistence.SettingPersistence;
import de.osmembrane.model.pipeline.AbstractFunction;
import de.osmembrane.resources.Constants;
import de.osmembrane.tools.I18N;
import de.osmembrane.tools.Tools;
/**
* Implementation of {@link AbstractSettings}.
*
* @author jakob_jarosch
*/
public class Settings extends AbstractSettings {
private static final long serialVersionUID = 2011020217010001L;
private static final String FUNCTION_PRESET_KEY = "functionPresetKey";
Map<Object, Object> settingsMap = new HashMap<Object, Object>();
@Override
public void initiate() {
AbstractPersistence persistence = PersistenceFactory.getInstance()
.getPersistence(SettingPersistence.class);
File file = Tools.urlToFile(Constants.DEFAULT_SETTINGS_FILE);
/*
* register the persistence as observer for automatic saving of the
* settings
*/
addObserver(PersistenceFactory.getInstance());
try {
if (!file.isFile()) {
saveSettings();
}
Object obj = persistence.load(Constants.DEFAULT_SETTINGS_FILE);
/* is checked by persistence */
@SuppressWarnings("unchecked")
Map<Object, Object> settingsMap = (Map<Object, Object>) obj;
this.settingsMap = settingsMap;
// invoke the required actions, even on default values
for (SettingType st : SettingType.values()) {
st.doRequiredActions(getValue(st));
}
} catch (FileException e) {
Application.handleException(new ControlledException(this,
ExceptionSeverity.WARNING, I18N.getInstance().getString(
"Model.Settings.FileException", file)));
}
}
@Override
public Object getValue(SettingType type) {
Object result = settingsMap.get(type);
if (result != null) {
return result;
} else {
return type.getDefaultValue();
}
}
@Override
public void setValue(SettingType type, Object value)
throws UnparsableFormatException {
if (!type.getType().isInstance(value)) {
value = type.parse(value);
}
/* perform required actions as change the localization */
type.doRequiredActions(value);
settingsMap.put(type, value);
changedNotifyObservers(new SettingsObserverObject(type));
}
@Override
public Locale[] getLanguages() {
return Constants.AVAILABLE_LOCALES;
}
@Override
public void saveSettings() throws FileException {
AbstractPersistence persistence = PersistenceFactory.getInstance()
.getPersistence(SettingPersistence.class);
File parent = Tools.urlToFile(Constants.DEFAULT_SETTINGS_FILE)
.getParentFile();
if (parent != null) {
parent.mkdirs();
}
persistence.save(Constants.DEFAULT_SETTINGS_FILE, settingsMap);
}
@Override
public void saveFunctionPreset(String name, AbstractFunction function) {
FunctionPreset preset = new FunctionPreset(name, function);
getFPList().add(preset);
changedNotifyObservers(new SettingsObserverObject());
}
@Override
public AbstractFunctionPreset[] getAllFunctionPresets(
AbstractFunction function) {
List<AbstractFunctionPreset> fpList = new ArrayList<AbstractFunctionPreset>();
for (FunctionPreset preset : getFPList()) {
if (preset.getInheritedFunction().getId().equals(function.getId())) {
fpList.add(preset);
}
}
return fpList.toArray(new AbstractFunctionPreset[fpList.size()]);
}
@Override
public boolean deleteFunctionPreset(AbstractFunctionPreset preset) {
boolean returnValue = getFPList().remove(preset);
changedNotifyObservers(new SettingsObserverObject());
return returnValue;
}
/**
* Returns the FunctionPreset list.
*
* @return the {@link FunctionPreset} list.
*/
private List<FunctionPreset> getFPList() {
Object result = settingsMap.get(FUNCTION_PRESET_KEY);
if (result == null || !(result instanceof List)) {
settingsMap.put(FUNCTION_PRESET_KEY,
new ArrayList<FunctionPreset>());
}
@SuppressWarnings("unchecked")
List<FunctionPreset> presetMap = (List<FunctionPreset>) settingsMap
.get(FUNCTION_PRESET_KEY);
return presetMap;
}
@Override
public void update(Observable o, Object arg) {
notifyObservers(settingsMap);
}
@Override
protected void changedNotifyObservers(SettingsObserverObject soo) {
soo.setSettingsModel(this);
setChanged();
notifyObservers(soo);
}
}