epugh 2004/03/28 06:42:45 Modified: configuration/src/test/org/apache/commons/configuration TestJNDIConfiguration.java configuration/src/java/org/apache/commons/configuration JNDIConfiguration.java Log: Refactor from ebourg:
- extend AbstractConfiguration instead of BaseConfiguration - rename getValueFromJNDI into getPropertyDirect - add a setPropertyDirect method throwing an UnsupportedOperationException - throw an UnsupportedOperationException on write operations instead of a java.lang.Error - remove the default constructor - clearedProperties is now a Set instead of a List - more tests for subset(), clearProperty(), getKeys() and isEmpty(). - minor javadoc & style changes Revision Changes Path 1.6 +113 -115 jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestJNDIConfiguration.java Index: TestJNDIConfiguration.java =================================================================== RCS file: /home/cvs/jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestJNDIConfiguration.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- TestJNDIConfiguration.java 27 Feb 2004 17:41:34 -0000 1.5 +++ TestJNDIConfiguration.java 28 Mar 2004 14:42:45 -0000 1.6 @@ -1,5 +1,3 @@ -package org.apache.commons.configuration; - /* * Copyright 2001-2004 The Apache Software Foundation. * @@ -16,129 +14,129 @@ * limitations under the License. */ -import java.util.Iterator; +package org.apache.commons.configuration; import junit.framework.TestCase; +import java.util.Iterator; + /** - * test if non-string properties are handled correctly + * Test to see if the JNDIConfiguration works properly. Currently excluded + * in the project.xml unitTest section as our JNDI provider doesn't + * properly support the listBindings() method. + * + * This does work fine with Tomcat's JNDI provider however. * * @version $Id$ */ -public class TestJNDIConfiguration extends TestCase -{ - private Configuration conf; - private NonStringTestHolder nonStringTestHolder; - - - - public void setUp() throws Exception - { - //InitialContext context = new InitialContext(); - //assertNotNull(context); - - JNDIConfiguration jndiConfiguration = new JNDIConfiguration(); - jndiConfiguration.setPrefix(""); - conf = jndiConfiguration; +public class TestJNDIConfiguration extends TestCase { + + private JNDIConfiguration conf; + private NonStringTestHolder nonStringTestHolder; + + public void setUp() throws Exception { + //InitialContext context = new InitialContext(); + //assertNotNull(context); + + conf = new JNDIConfiguration(); + conf.setPrefix(""); + nonStringTestHolder = new NonStringTestHolder(); nonStringTestHolder.setConfiguration(conf); + } + + public void testBoolean() throws Exception { + nonStringTestHolder.testBoolean(); + } + + public void testBooleanDefaultValue() throws Exception { + nonStringTestHolder.testBooleanDefaultValue(); + } + + public void testByte() throws Exception { + nonStringTestHolder.testByte(); + } + + public void testDouble() throws Exception { + nonStringTestHolder.testDouble(); + } + + public void testDoubleDefaultValue() throws Exception { + nonStringTestHolder.testDoubleDefaultValue(); + } + public void testFloat() throws Exception { + nonStringTestHolder.testFloat(); } - - public void testBoolean() throws Exception - { - nonStringTestHolder.testBoolean(); - } - - public void testBooleanDefaultValue() throws Exception - { - nonStringTestHolder.testBooleanDefaultValue(); - } - - public void testByte() throws Exception - { - nonStringTestHolder.testByte(); - } - - public void testDouble() throws Exception - { - nonStringTestHolder.testDouble(); - } - - public void testDoubleDefaultValue() throws Exception - { - nonStringTestHolder.testDoubleDefaultValue(); - } - - public void testFloat() throws Exception - { - nonStringTestHolder.testFloat(); - } - - public void testFloatDefaultValue() throws Exception - { - nonStringTestHolder.testFloatDefaultValue(); - - } - - public void testInteger() throws Exception - { - nonStringTestHolder.testInteger(); - } - - public void testIntegerDefaultValue() throws Exception - { - nonStringTestHolder.testIntegerDefaultValue(); - } - - public void testLong() throws Exception - { - nonStringTestHolder.testLong(); - } - public void testLongDefaultValue() throws Exception - { - nonStringTestHolder.testLongDefaultValue(); - } - - public void testShort() throws Exception - { - nonStringTestHolder.testShort(); - } - - public void testShortDefaultValue() throws Exception - { - nonStringTestHolder.testShortDefaultValue(); - } - - public void testListMissing() throws Exception - { - nonStringTestHolder.testListMissing(); - } - public void testSubset() throws Exception - { - // seems to always be failing. - //nonStringTestHolder.testSubset(); - - } - - public void testProperties() throws Exception{ - Object o = conf.getProperty("test.boolean"); - assertNotNull(o); - assertEquals("true",o.toString()); - - } - - /** - * Currently failing in that we don't get back any keys! - * @throws Exception - */ - public void testGetKeys() throws Exception{ - Iterator i = conf.getKeys(); - for (;i.hasNext();){ - System.out.println(i.next()); - } - } - + public void testFloatDefaultValue() throws Exception { + nonStringTestHolder.testFloatDefaultValue(); + } + + public void testInteger() throws Exception { + nonStringTestHolder.testInteger(); + } + + public void testIntegerDefaultValue() throws Exception { + nonStringTestHolder.testIntegerDefaultValue(); + } + + public void testLong() throws Exception { + nonStringTestHolder.testLong(); + } + + public void testLongDefaultValue() throws Exception { + nonStringTestHolder.testLongDefaultValue(); + } + + public void testShort() throws Exception { + nonStringTestHolder.testShort(); + } + + public void testShortDefaultValue() throws Exception { + nonStringTestHolder.testShortDefaultValue(); + } + + public void testListMissing() throws Exception { + nonStringTestHolder.testListMissing(); + } + + public void testSubset() throws Exception { + nonStringTestHolder.testSubset(); + } + + public void testProperties() throws Exception { + Object o = conf.getProperty("test.boolean"); + assertNotNull(o); + assertEquals("true", o.toString()); + } + + /** + * Currently failing in that we don't get back any keys! + * @throws Exception + */ + public void testGetKeys() throws Exception { + + boolean found = false; + Iterator it = conf.getKeys(); + + assertTrue("no key found", it.hasNext()); + + while (it.hasNext() && !found) { + found = "test.boolean".equals(it.next()); + } + + assertTrue("'test.boolean' key not found", found); + } + + public void testClearProperty() { + assertNotNull("null boolean for the 'test.boolean' key", conf.getBoolean("test.boolean", null)); + conf.clearProperty("test.boolean"); + assertNull("'test.boolean' property not cleared", conf.getBoolean("test.boolean", null)); + } + + public void testIsEmpty() { + assertFalse("the configuration shouldn't be empty", conf.isEmpty()); + } } 1.10 +84 -417 jakarta-commons/configuration/src/java/org/apache/commons/configuration/JNDIConfiguration.java Index: JNDIConfiguration.java =================================================================== RCS file: /home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/JNDIConfiguration.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- JNDIConfiguration.java 13 Mar 2004 17:30:42 -0000 1.9 +++ JNDIConfiguration.java 28 Mar 2004 14:42:45 -0000 1.10 @@ -1,4 +1,3 @@ -package org.apache.commons.configuration; /* * Copyright 2001-2004 The Apache Software Foundation. * @@ -14,65 +13,69 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Properties; + +package org.apache.commons.configuration; + import javax.naming.Binding; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingEnumeration; import javax.naming.NamingException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Properties; +import java.util.Set; + import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.BooleanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * This Configuration class allows you to interface with a JNDI datasource. - * + * A JNDIConfiguration is read-only, write operations will throw an + * UnsupportedOperationException. The clear operations are supported but the + * underlying JNDI data source is not changed. + * * @version $Id$ */ -public class JNDIConfiguration - extends BaseConfiguration - implements Configuration +public class JNDIConfiguration extends AbstractConfiguration { private static Log log = LogFactory.getLog(JNDIConfiguration.class); + + /** The prefix of the context. */ private String prefix; - private Context envCtx; - private List clearedProperties = new ArrayList(); - /** - * Creates an empty JNDIConfiguration object which can then - * be added some other Configuration files - */ - public JNDIConfiguration() - { - } + + /** The JNDI context. */ + private Context context; + + /** The Set of keys that have been virtually cleared. */ + private Set clearedProperties = new HashSet(); + /** - * JNDIConfigurations can not be added to + * JNDIConfigurations can not be added to. * * @param key The Key to add the property to. * @param token The Value to add. */ public void addProperty(String key, Object token) { - throw new Error("This operation is not supported"); + throw new UnsupportedOperationException("This operation is not supported"); } + /** * This method recursive traverse the JNDI tree, looking for Context objects. * When it finds them, it traverses them as well. Otherwise it just adds the * values to the list of keys found. + * * @param keys All the keys that have been found. * @param enum An enumeration of all the elements found at a specific context * @param key What key we are building on. * @throws NamingException If JNDI has an issue. */ - private void recursiveGetKeys( - List keys, - NamingEnumeration enum, - String key) - throws NamingException + private void recursiveGetKeys(List keys, NamingEnumeration enum, String key) throws NamingException { while (enum.hasMoreElements()) { @@ -86,9 +89,8 @@ newKey.append(binding.getName()); if (binding.getObject() instanceof Context) { - Context c = (Context) binding.getObject(); - NamingEnumeration enum2 = c.listBindings(""); - recursiveGetKeys(keys, enum2, newKey.toString()); + Context context = (Context) binding.getObject(); + recursiveGetKeys(keys, context.listBindings(""), newKey.toString()); } else { @@ -99,9 +101,9 @@ } } } + /** - * Get the list of the keys contained in the configuration - * repository. + * Get the list of the keys contained in the configuration repository. * * @return An Iterator. */ @@ -109,6 +111,7 @@ { return getKeys(""); } + /** * Get the list of the keys contained in the configuration * repository that match a passed in beginning pattern. @@ -126,23 +129,22 @@ { keys.add(splitKeys[i]); } + Context context = null; - if (keys.size() == 0) + + if (keys.isEmpty()) { context = getContext(); } else { - context = - getStartingContextPoint( - keys, - getContext().listBindings("")); + context = getStartingContextPoint(keys, getContext().listBindings("")); } + if (context != null) { - NamingEnumeration enum = context.listBindings(""); - + recursiveGetKeys(keys, enum, key); } } @@ -150,19 +152,20 @@ { log.warn(ne); } + return keys.iterator(); } + /** * Because JNDI is based on a tree configuration, we need to filter down the - * tree, till we find the Context specified by the key to start from. + * tree, till we find the Context specified by the key to start from. * Otherwise return null. - * + * * @param The key (or name) of the Context we are looking to start from. * @return The context at that key's location in the JNDI tree, or null if not found * @throws NamingException if JNDI has an issue */ - private Context getStartingContextPoint(List keys, NamingEnumeration enum) - throws NamingException + private Context getStartingContextPoint(List keys, NamingEnumeration enum) throws NamingException { String keyToSearchFor = (String) keys.get(0); log.debug("Key to search for is " + keyToSearchFor); @@ -181,7 +184,7 @@ { keys.remove(0); Context c = (Context) binding.getObject(); - if (keys.size() > 0) + if (!keys.isEmpty()) { return getStartingContextPoint(keys, c.listBindings("")); } @@ -193,22 +196,20 @@ } return null; } + /** - * Get a list of properties associated with the given - * configuration key. + * Get a list of properties associated with the given configuration key. * * @param key The configuration key. * @return The associated properties if key is found. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String/List. - * @throws IllegalArgumentException if one of the tokens is - * malformed (does not contain an equals sign). - * @see #getProperties(String, Properties) + * @throws ClassCastException is thrown if the key maps to an object that is not a String/List. + * @throws IllegalArgumentException if one of the tokens is malformed (does not contain an equals sign). */ public Properties getProperties(String key) { - throw new Error("This operation is not supported"); + throw new UnsupportedOperationException("This operation is not supported"); } + public boolean isEmpty() { try @@ -222,45 +223,44 @@ return true; } } + /** - * Gets a property from the configuration. + * Gets a property from the configuration. * - * @param key property to retrieve - * @return value as object. Will return user value if exists, + * @param key property to retrieve + * @return value as object. Will return user value if exists, * if not then default value if exists, otherwise null */ public Object getProperty(String key) { - return getValueFromJNDI(key); + return getPropertyDirect(key); } + /** - * Set a property, this will replace any previously - * set values. Set values is implicitly a call - * to clearProperty(key), addProperty(key,value). + * Set a property, this will replace any previously set values. Set values + * is implicitly a call to clearProperty(key), addProperty(key,value). * * @param key * @param value */ public void setProperty(String key, Object value) { - throw new Error("This operation is not supported"); + throw new UnsupportedOperationException("This operation is not supported"); } + /** - * Clear a property in the configuration. Just marks it as cleared, + * Clear a property in the configuration. Just marks it as cleared, * doesn't change the underlying JNDI data source. * * @param key the key to remove along with corresponding value. */ public void clearProperty(String key) { - if (!clearedProperties.contains(key)) - { - clearedProperties.add(key); - } + clearedProperties.add(key); } + /** - * check if the configuration contains the key, or the key - * has been removed. + * Check if the configuration contains the key, or the key has been removed. */ public boolean containsKey(String key) { @@ -275,354 +275,12 @@ getContext().lookup(key); return true; } - catch (javax.naming.NamingException ne) + catch (NamingException ne) { return false; } } - - /** - * Get a boolean associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated boolean if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Boolean. - */ - public Boolean getBoolean(String key, Boolean defaultValue) - { - Object value = getValueFromJNDI(key); - if (value instanceof Boolean) - { - return (Boolean) value; - } - else if (value instanceof String) - { - return BooleanUtils.toBooleanObject((String) value); - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Boolean object"); - } - } - - /** - * Get a byte associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated byte if key is found and has valid format, default - * value otherwise. - * @throws ClassCastException is thrown if the key maps to an object that - * is not a Byte. - * @throws NumberFormatException is thrown if the value mapped by the key - * has not a valid number format. - */ - public Byte getByte(String key, Byte defaultValue) - { - Object value = getValueFromJNDI(key); - if (value instanceof Byte) - { - return (Byte) value; - } - else if (value instanceof String) - { - Byte b = new Byte((String) value); - return b; - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Byte object"); - } - } - - /** - * Get a double associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated double if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Double. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Double getDouble(String key, Double defaultValue) - { - Object value = this.getValueFromJNDI(key); - if (value instanceof Double) - { - return (Double) value; - } - else if (value instanceof String) - { - Double d = new Double((String) value); - return d; - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Double object"); - } - } - - /** - * Get a float associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated float if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Float. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Float getFloat(String key, Float defaultValue) - { - Object value = getValueFromJNDI(key); - if (value instanceof Float) - { - return (Float) value; - } - else if (value instanceof String) - { - Float f = new Float((String) value); - return f; - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Float object"); - } - } - - /** - * Get a int associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated int if key is found and has valid format, default - * value otherwise. - * @throws ClassCastException is thrown if the key maps to an object that - * is not a Integer. - * @throws NumberFormatException is thrown if the value mapped by the key - * has not a valid number format. - */ - public Integer getInteger(String key, Integer defaultValue) - { - Object value = getValueFromJNDI(key); - if (value instanceof Integer) - { - return (Integer) value; - } - else if (value instanceof String) - { - Integer i = new Integer((String) value); - return i; - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Integer object"); - } - } - - /** - * Get a long associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated long if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Long. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Long getLong(String key, Long defaultValue) - { - Object value = getValueFromJNDI(key); - if (value instanceof Long) - { - return (Long) value; - } - else if (value instanceof String) - { - Long l = new Long((String) value); - return l; - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Long object"); - } - } - - /** - * Get a short associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated short if key is found and has valid - * format, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a Short. - * @throws NumberFormatException is thrown if the value mapped - * by the key has not a valid number format. - */ - public Short getShort(String key, Short defaultValue) - { - Object value = getValueFromJNDI(key); - if (value instanceof Short) - { - return (Short) value; - } - else if (value instanceof String) - { - Short s = new Short((String) value); - return s; - } - else if (value == null) - { - return defaultValue; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a Short object"); - } - } - - /** - * Get a string associated with the given configuration key. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated string if key is found, default value otherwise. - * @throws ClassCastException is thrown if the key maps to an object that - * is not a String. - */ - public String getString(String key, String defaultValue) - { - try - { - Object o = getValueFromJNDI(key); - if (o == null) - { - return defaultValue; - } - else - { - return (String) o; - } - } - catch (NoSuchElementException nsee) - { - return defaultValue; - } - } - /** - * Get an array of strings associated with the given configuration - * key. - * - * @param key The configuration key. - * @return The associated string array if key is found. - * @throws ClassCastException is thrown if the key maps to an - * object that is not a String/List of Strings. - */ - public String[] getStringArray(String key) - { - Object value = getValueFromJNDI(key); - String[] tokens; - if (value instanceof String) - { - tokens = new String[1]; - tokens[0] = interpolate((String) value); - } - else if (value instanceof Container) - { - tokens = new String[((Container) value).size()]; - for (int i = 0; i < tokens.length; i++) - { - tokens[i] = interpolate((String) ((Container) value).get(i)); - } - } - else if (value == null) - { - tokens = new String[0]; - } - else - { - throw new ClassCastException( - '\'' + key + "' doesn't map to a String/List object"); - } - return tokens; - } - - /** - * Get a List of strings associated with the given configuration key. - * Typically this will be just a single item, as you can't have multiple - * properties with the same name. - * - * @param key The configuration key. - * @param defaultValue The default value. - * @return The associated List. - */ - public List getList(String key, List defaultValue) - { - try - { - Object value = this.getValueFromJNDI(key); - if (value != null) - { - List list = new ArrayList(1); - list.add(value.toString()); - return list; - } - else - { - if (defaultValue == null) - { - defaultValue = new ArrayList(); - } - return defaultValue; - } - } - catch (NoSuchElementException nsse) - { - return defaultValue; - } - } + /** * @return String */ @@ -630,26 +288,30 @@ { return prefix; } + /** * Sets the prefix. + * * @param prefix The prefix to set */ public void setPrefix(String prefix) { this.prefix = prefix; } - private Object getValueFromJNDI(String key) + + protected Object getPropertyDirect(String key) { if (clearedProperties.contains(key)) { return null; } + try { key = StringUtils.replace(key, ".", "/"); return getContext().lookup(key); } - catch (java.util.NoSuchElementException nsse) + catch (NoSuchElementException nsse) { return null; } @@ -658,13 +320,18 @@ return null; } } + + protected void addPropertyDirect(String key, Object obj) { + throw new UnsupportedOperationException("This operation is not supported"); + } + private Context getContext() throws NamingException { - if (envCtx == null) + if (context == null) { Context initCtx = new InitialContext(); - envCtx = (Context) initCtx.lookup(getPrefix()); + context = (Context) initCtx.lookup(getPrefix()); } - return envCtx; + return context; } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]