package de.skuzzle.polly.core.configuration;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.log4j.Logger;
import de.skuzzle.polly.sdk.Configuration;
import de.skuzzle.polly.sdk.ConfigurationValidator;
import de.skuzzle.polly.sdk.eventlistener.ConfigurationEvent;
public class ConfigurationImpl implements Configuration {
private final static Logger logger = Logger.getLogger(
ConfigurationImpl.class.getName());
private Properties properties;
private ConfigurationProviderImpl parent;
private ConfigurationValidator validator;
private File cfgFile;
public ConfigurationImpl(File cfgFile, ConfigurationProviderImpl parent)
throws FileNotFoundException, IOException {
this(parent);
this.cfgFile = cfgFile;
this.properties.load(new FileInputStream(cfgFile));
}
public ConfigurationImpl(ConfigurationProviderImpl parent) {
this.parent = parent;
this.properties = new Properties();
}
public ConfigurationImpl(ConfigurationProviderImpl parent,
ConfigurationImpl defaults) {
this(parent);
this.properties.putAll(defaults.properties);
}
public void store() throws FileNotFoundException, IOException {
this.properties.store(new FileOutputStream(this.cfgFile), ""); //$NON-NLS-1$
}
public void setValidator(ConfigurationValidator validator) {
this.validator = validator;
}
@Override
public ConfigurationValidator getValidator() {
return this.validator;
}
@Override
public boolean isValidated() {
return this.validator != null;
}
@Override
public <T> void setProperty(String name, T value) {
this.properties.setProperty(name, value.toString());
if (parent == null) {
logger.warn("Tried to dispatch a ConfigurationEvent, but no parent was set!"); //$NON-NLS-1$
} else {
this.parent.fireConfigurationChanged(new ConfigurationEvent(this));
}
}
@Override
public String readString(String name) {
return this.properties.getProperty(name);
}
@Override
public String readString(String name, String defaultValue) {
return this.properties.getProperty(name, defaultValue);
}
@Override
public int readInt(String name) {
return Integer.parseInt(this.readString(name));
}
@Override
public int readInt(String name, int defaultValue) {
try {
return this.readInt(name);
} catch (Exception e) {
return defaultValue;
}
}
@Override
public boolean readBoolean(String name) {
final String tmp = this.readString(name);
return tmp != null && Boolean.parseBoolean(tmp);
}
@Override
public List<String> readStringList(String name) {
String prop = this.readString(name);
if (prop == null) {
return new LinkedList<String>();
}
String[] list = prop.split(","); //$NON-NLS-1$
return Arrays.asList(list);
}
@Override
public List<Integer> readIntList(String name) {
String prop = this.readString(name);
if (prop == null) {
return new LinkedList<Integer>();
}
String[] parts = prop.split(","); //$NON-NLS-1$
ArrayList<Integer> result = new ArrayList<Integer>(parts.length);
for (String s : parts) {
result.add(Integer.parseInt(s));
}
return result;
}
@Override
public String toString() {
SortedMap<Object, Object> sorted = new TreeMap<Object, Object>(
this.properties);
int maxLength = 0;
for (Object o : sorted.keySet()) {
maxLength = Math.max(maxLength, o.toString().length());
}
StringBuilder b = new StringBuilder();
if (this.cfgFile != null) {
b.append(this.cfgFile.getAbsolutePath());
} else {
b.append("Memory Configuration"); //$NON-NLS-1$
}
b.append(System.lineSeparator());
for (Entry<Object, Object> e : sorted.entrySet()) {
b.append(" "); //$NON-NLS-1$
b.append(e.getKey().toString());
this.padSpaces(maxLength, e.getKey().toString().length(), b);
b.append(" = "); //$NON-NLS-1$
b.append(e.getValue().toString());
b.append(System.lineSeparator());
}
return b.toString();
}
private void padSpaces(int desiredLength, int currentLength, StringBuilder b) {
int spaces = desiredLength - currentLength;
if (spaces <= 0) {
return;
}
for (int i = 0; i < spaces; ++i) {
b.append(" "); //$NON-NLS-1$
}
}
}