/* * Copyright 2014 Federal Chancellery Austria * MOA-ID has been developed in a cooperation between BRZ, the Federal * Chancellery Austria - ICT staff unit, and Graz University of Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. */ package at.gv.egiz.components.configuration.api; import java.util.HashSet; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; /** * @author tlenz * */ @Transactional("transactionManager") public abstract class AbstractConfigurationImpl implements Configuration { private static final Logger logger = LoggerFactory .getLogger(AbstractConfigurationImpl.class); /** * Get all keys from configuration * @return The List values or null if no keys found */ abstract protected List getAllKeys() throws ConfigurationException; /** * Get key specific value from configuration * @param key The cfg id * @return The string value or null if not found */ abstract protected String getValue(String key) throws ConfigurationException; /** * Check configuration contains a specific key * @param key The cfg id * @return True if the cfg key is found */ abstract protected boolean containsKey(String key) throws ConfigurationException; /** * Store a key/value pair to configuration * @param key The cfg key * @param value The cfg value */ abstract protected void storeKey(String key, String value) throws ConfigurationException; /** * Delete a key from configuration * @param key The cfg key */ abstract protected void deleteKey(String key) throws ConfigurationException; /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getStringValue(java.lang.String) */ @Override public String getStringValue(String id) throws ConfigurationException { return getStringValue(id, null); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getStringValue(java.lang.String, java.lang.String) */ @Override public String getStringValue(String id, String defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) { return defaultValue; } return value; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setStringValue(java.lang.String, java.lang.String) */ @Override public void setStringValue(String id, String value) throws ConfigurationException { if (containsKey(id)) { logger.debug("{} is overwritten with {}", id, value); } storeKey(id, value); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getByteValue(java.lang.String) */ @Override public byte getByteValue(String id) throws ConfigurationException { return getByteValue(id, (byte) 0); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getByteValue(java.lang.String, byte) */ @Override public byte getByteValue(String id, byte defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { byte bvalue = Byte.parseByte(value); return bvalue; } catch (Throwable e) { logger.warn("Invalid configuration value {} is not a byte value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setByteValue(java.lang.String, byte) */ @Override public void setByteValue(String id, byte value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getShortValue(java.lang.String) */ @Override public short getShortValue(String id) throws ConfigurationException { return getShortValue(id, (short) 0); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getShortValue(java.lang.String, short) */ @Override public short getShortValue(String id, short defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { short svalue = Short.parseShort(value); return svalue; } catch (Throwable e) { logger.warn("Invalid configuration value {} is not a short value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setShortValue(java.lang.String, short) */ @Override public void setShortValue(String id, short value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getIntegerValue(java.lang.String) */ @Override public int getIntegerValue(String id) throws ConfigurationException { return getIntegerValue(id, 0); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getIntegerValue(java.lang.String, int) */ @Override public int getIntegerValue(String id, int defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { int ivalue = Integer.parseInt(value); return ivalue; } catch (Throwable e) { logger.warn("Invalid configuration value {} is not a int value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setIntegerValue(java.lang.String, int) */ @Override public void setIntegerValue(String id, int value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getLongValue(java.lang.String) */ @Override public long getLongValue(String id) throws ConfigurationException { return getLongValue(id, 0L); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getLongValue(java.lang.String, long) */ @Override public long getLongValue(String id, long defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { long lvalue = Long.parseLong(value); return lvalue; } catch (Throwable e) { logger.warn("Invalid configuration value {} is not a long value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setLongValue(java.lang.String, long) */ @Override public void setLongValue(String id, long value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getFloatValue(java.lang.String) */ @Override public float getFloatValue(String id) throws ConfigurationException { return getFloatValue(id, 0.0F); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getFloatValue(java.lang.String, float) */ @Override public float getFloatValue(String id, float defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { float fvalue = Float.parseFloat(value); return fvalue; } catch (Throwable e) { logger.warn("Invalid configuration value {} is not a float value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setFloatValue(java.lang.String, float) */ @Override public void setFloatValue(String id, float value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getDoubleValue(java.lang.String) */ @Override public double getDoubleValue(String id) throws ConfigurationException { return getDoubleValue(id, 0.0D); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getDoubleValue(java.lang.String, double) */ @Override public double getDoubleValue(String id, double defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { double dvalue = Double.parseDouble(value); return dvalue; } catch (Throwable e) { logger.warn("Invalid configuration value {} is not a double value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setDoubleValue(java.lang.String, double) */ @Override public void setDoubleValue(String id, double value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getBooleanValue(java.lang.String) */ @Override public boolean getBooleanValue(String id) throws ConfigurationException { return getBooleanValue(id, false); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getBooleanValue(java.lang.String, boolean) */ @Override public boolean getBooleanValue(String id, boolean defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) return defaultValue; try { boolean bvalue = Boolean.parseBoolean(value); return bvalue; } catch (Throwable e) { logger.warn( "Invalid configuration value {} is not a boolean value", id, e); } return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setBooleanValue(java.lang.String, boolean) */ @Override public void setBooleanValue(String id, boolean value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getCharValue(java.lang.String) */ @Override public char getCharValue(String id) throws ConfigurationException { return getCharValue(id, '\0'); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getCharValue(java.lang.String, char) */ @Override public char getCharValue(String id, char defaultValue) throws ConfigurationException { String value = getValue(id); if (value == null) { return defaultValue; } if (value.toCharArray().length > 0) { return value.toCharArray()[0]; } logger.warn("Invalid configuration value {} is not a char value", id); return defaultValue; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setCharValue(java.lang.String, short) */ @Override public void setCharValue(String id, short value) throws ConfigurationException { setStringValue(id, String.valueOf(value)); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getObjectValue(java.lang.String, java.lang.Class) */ @Override public T getObjectValue(String id, Class cls) throws ConfigurationException { return getObjectValue(id, cls, null); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getObjectValue(java.lang.String, java.lang.Class, java.lang.Object) */ @Override public T getObjectValue(String id, Class cls, T defaultValue) throws ConfigurationException { String savedValue = getStringValue(id); if (savedValue == null) { return defaultValue; } ObjectTranslator objectTranslator = ConfigurationFactory .getObjectTranslator(cls); if (objectTranslator == null) { logger.warn( "Found object value but could not find Object Transator for cls {}", cls.getName()); throw new ConfigurationException("No Object Translator for [" + cls.getName() + "] available"); } return objectTranslator.toObject(savedValue, cls); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#setObjectValue(java.lang.String, java.lang.Object) */ @Override public void setObjectValue(String id, Object object) throws ConfigurationException { ObjectTranslator objectTranslator = ConfigurationFactory .getObjectTranslator(object); if (objectTranslator == null) { logger.warn("Could not find Object Transator for cls {}", object .getClass().getName()); throw new ConfigurationException("No Object Translator for [" + object.getClass().getName() + "] available"); } String cfgValue = objectTranslator.toString(object); setStringValue(id, cfgValue); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#findConfigurationId(java.lang.String) */ @Override abstract public String[] findConfigurationId(String searchString) throws ConfigurationException; /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#findByValue(java.lang.String) */ @Override abstract public String[] findByValue(String searchString) throws ConfigurationException; /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getConfigurationIds() */ @Override public String[] getConfigurationIds() throws ConfigurationException { List allKeys = getAllKeys(); return allKeys.toArray(new String[allKeys.size()]); } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getConfigurationIdNextLevel(java.lang.String) */ @Override public String[] getConfigurationIdNextLevel(String prefix) throws ConfigurationException { String[] allIds = getConfigurationIds(); Set subIds = new HashSet(); for (String id : allIds) { if (id.startsWith(prefix)) { String idAfterPrefix = id.substring(prefix.length()); int index = idAfterPrefix.indexOf("."); if (index == 0) { idAfterPrefix = idAfterPrefix.substring(1); index = idAfterPrefix.indexOf("."); } if (index > 0) { String adding = idAfterPrefix.substring(0, index); if (!(adding.isEmpty())) { subIds.add(adding); } } else if (!(idAfterPrefix.isEmpty())) { subIds.add(idAfterPrefix); } } } String[] subIdarray = new String[subIds.size()]; subIdarray = (String[]) subIds.toArray(subIdarray); return subIdarray; } /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#deleteIds(java.lang.String) */ @Override abstract public void deleteIds(String idSearch) throws ConfigurationException; /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#synchronize() */ @Override abstract public void synchronize() throws ConfigurationException; /* (non-Javadoc) * @see at.gv.egiz.components.configuration.api.Configuration#getName() */ @Override abstract public String getName(); }