/* * Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jsyntaxpane.util; import java.awt.Color; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; /** * Wrapper around the Properties class with more functionality * This is mainly needed to provide easier support for getting values by an * optional prefix. * * @author Ayman Al-Sairafi */ public class Configuration extends Properties { public Configuration(Properties defaults) { super(defaults); } private Configuration() { super(); } /** * Gets the String value for the key prefix.key, or key, or default * @param prefix * @param key * @param Default * @return */ public String getPrefixProperty(String prefix, String key, String Default) { String v = super.getProperty(prefix + "." + key); if (v != null) { return v; } return super.getProperty(key, Default); } /** * Gets a prefixed integer from the properties. If number cannot be found * or if it cannot be decoded, the default is returned * The integer is decoded using {@link Integer.decode(String)} * @param prefix * @param key * @param Default * @return */ public int getPrefixInteger(String prefix, String key, int Default) { String v = getPrefixProperty(prefix, key, null); if (v == null) { return Default; } try { int i = Integer.decode(v); return i; } catch (NumberFormatException e) { LOG.log(Level.WARNING, null, e); return Default; } } /** * Returns a String[] of the comma separated items in the value for * prefix.key or key * Does NOT return null. If the prefix.key or key value is not found, * then an empty string array is returned. So the return of this method * can be used directly in a foreach loop * @param prefix * @param key * @return non-null String[] */ public String[] getPrefixPropertyList(String prefix, String key) { String v = getProperty(prefix + "." + key); if (v == null) { v = getProperty(key); } if (v == null) { return EMPTY_LIST; } return COMMA_SEPARATOR.split(v); } /** * Returns a boolean from the configuration * @param prefix * @param key * @param Default * @return */ public boolean getPrefixBoolean(String prefix, String key, boolean Default) { String b = getPrefixProperty(prefix, key, null); if (b == null) { return Default; } return Boolean.parseBoolean(b.trim()); } /** * return the COlor that has the given key = prefix.key or key = key or * default, in that order * @param prefix * @param key * @param Default * @return */ public Color getPrefixColor(String prefix, String key, Color Default) { String c = getPrefixProperty(prefix, key, null); if (c == null) { return Default; } try { return Color.decode(c); } catch (NumberFormatException e) { return Default; } } /** * Return a sub configuration from this instance that has the keys equal to * either prefix.keyPrefix or keyPrefix. The entries of keyPrefix are * added first, so they are the defaults if prefix is not found. * * @param prefix * @param keyPrefix * @return */ public Configuration subConfig(String prefix, String keyPrefix) { Configuration sub = new Configuration(); addToSubConf(sub, keyPrefix); addToSubConf(sub, prefix + "." + keyPrefix); return sub; } private void addToSubConf(Configuration subConf, String prefix) { int prefixLen = prefix.length(); for (String k : stringPropertyNames()) { if (k.startsWith(prefix)) { subConf.put(k.substring(prefixLen), getProperty(k)); } } } public static final String[] EMPTY_LIST = new String[0]; public static final Pattern COMMA_SEPARATOR = Pattern.compile("\\s*,\\s*"); private static final Logger LOG = Logger.getLogger(Configuration.class.getName()); }