package com.scrivenvar.service.impl;
import com.scrivenvar.service.Settings;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
import org.apache.commons.configuration2.convert.ListDelimiterHandler;
import org.apache.commons.configuration2.ex.ConfigurationException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
import static com.scrivenvar.Constants.SETTINGS_NAME;
public class DefaultSettings implements Settings {
private static final char VALUE_SEPARATOR = ',';
private PropertiesConfiguration properties;
public DefaultSettings() throws ConfigurationException {
setProperties( createProperties() );
}
@Override
public String getSetting( final String property, final String defaultValue ) {
return getSettings().getString( property, defaultValue );
}
@Override
public int getSetting( final String property, final int defaultValue ) {
return getSettings().getInt( property, defaultValue );
}
@Override
public List<String> getStringSettingList(
final String property, final List<String> defaults ) {
return getSettings().getList( String.class, property, defaults );
}
@Override
public List<String> getStringSettingList( final String property ) {
return getStringSettingList( property, null );
}
@Override
public Iterator<String> getKeys( final String prefix ) {
return getSettings().getKeys( prefix );
}
private PropertiesConfiguration createProperties()
throws ConfigurationException {
final URL url = getPropertySource();
final PropertiesConfiguration configuration = new PropertiesConfiguration();
if( url != null ) {
try( final Reader r = new InputStreamReader( url.openStream(),
getDefaultEncoding() ) ) {
configuration.setListDelimiterHandler( createListDelimiterHandler() );
configuration.read( r );
} catch( final IOException ex ) {
throw new RuntimeException( new ConfigurationException( ex ) );
}
}
return configuration;
}
protected Charset getDefaultEncoding() {
return Charset.defaultCharset();
}
protected ListDelimiterHandler createListDelimiterHandler() {
return new DefaultListDelimiterHandler( VALUE_SEPARATOR );
}
private URL getPropertySource() {
return DefaultSettings.class.getResource( getSettingsFilename() );
}
private String getSettingsFilename() {
return SETTINGS_NAME;
}
private void setProperties( final PropertiesConfiguration configuration ) {
this.properties = configuration;
}
private PropertiesConfiguration getSettings() {
return this.properties;
}
}