package nl.topicus.onderwijs.dashboard.config;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import nl.topicus.onderwijs.dashboard.keys.Key;
import nl.topicus.onderwijs.dashboard.keys.Project;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.KeyDeserializer;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
public class Settings implements ISettings {
/**
* Custom JSON deserializer for projects that are used as key values in a
* Map.
*/
private static class ProjectKeyDeserializer extends KeyDeserializer {
@Override
public Object deserializeKey(String id, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
for (Key key : keys) {
if (key.getCode().equals(id))
return key;
}
throw ctxt.weirdKeyException(String.class, id,
"Onbekend project sleutel gevonden");
}
}
public static ISettings create() {
ConfigurationRepository configurationRepository = new ConfigurationRepository();
if (!configurationRepository.configurationExists(Settings.class))
throw new IllegalStateException("No configuration exists for "
+ Settings.class.getName());
return configurationRepository.getConfiguration(Settings.class);
}
private static ArrayList<Key> keys = new ArrayList<Key>();
private HashMap<Key, Map<String, Map<String, ?>>> projectSettings = new HashMap<Key, Map<String, Map<String, ?>>>();
public void addKey(Key key) {
if (!keys.contains(key))
keys.add(key);
}
@Override
public List<Key> getKeys() {
return Collections.unmodifiableList(keys);
}
public void setKeys(List<Key> projects) {
Settings.keys = new ArrayList<Key>(projects);
}
public Map<Key, Map<String, Map<String, ?>>> getProjectSettings() {
return projectSettings;
}
@JsonDeserialize(keyUsing = ProjectKeyDeserializer.class)
public void setProjectSettings(
Map<Project, Map<String, Map<String, ?>>> projectSettings) {
this.projectSettings = new HashMap<Key, Map<String, Map<String, ?>>>(
projectSettings);
}
@Override
public Map<Key, Map<String, ?>> getServiceSettings(Class<?> service) {
Map<Key, Map<String, ?>> serviceSettings = new HashMap<Key, Map<String, ?>>();
String key = service.getName();
for (Entry<Key, Map<String, Map<String, ?>>> projectSetting : projectSettings
.entrySet()) {
Map<String, Map<String, ?>> settings = projectSetting.getValue();
if (settings.containsKey(key)) {
serviceSettings.put(projectSetting.getKey(), settings.get(key));
}
}
return serviceSettings;
}
@Override
public Set<Key> getKeysWithConfigurationFor(Class<?> service) {
return getServiceSettings(service).keySet();
}
}