Hi Oliver,

thanks for the clarification. I see where you are going with the design.
What do you think of my proposal to implement the configuration interfaces
like the java collections framework? I can think of
Configurations.unmodifiableConfiguration(Configuration config).

Benedikt


2012/11/6 Oliver Heger <oliver.he...@oliver-heger.de>

> Hi Benedikt,
>
> Am 05.11.2012 21:04, schrieb Benedikt Ritter:
>
>  2012/11/5 Benedikt Ritter <benerit...@gmail.com>
>>
>>  Hi Oliver,
>>>
>>>
>>> 2012/11/5 <ohe...@apache.org>
>>>
>>> Author: oheger
>>>
>>>> Date: Mon Nov  5 17:29:01 2012
>>>> New Revision: 1405889
>>>>
>>>> URL: 
>>>> http://svn.apache.org/viewvc?**rev=1405889&view=rev<http://svn.apache.org/viewvc?rev=1405889&view=rev>
>>>> Log:
>>>> Initial version of an immutable configuration interface.
>>>>
>>>> Added:
>>>>
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>>    (with props)
>>>> Modified:
>>>>
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**Configuration.java
>>>>
>>>> Modified:
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**Configuration.java
>>>> URL:
>>>> http://svn.apache.org/viewvc/**commons/proper/configuration/**
>>>> trunk/src/main/java/org/**apache/commons/configuration/**
>>>> Configuration.java?rev=**1405889&r1=1405888&r2=1405889&**view=diff<http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/Configuration.java?rev=1405889&r1=1405888&r2=1405889&view=diff>
>>>>
>>>> ==============================**==============================**
>>>> ==================
>>>> ---
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**Configuration.java
>>>> (original)
>>>> +++
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**Configuration.java
>>>> Mon Nov  5 17:29:01 2012
>>>> @@ -17,11 +17,6 @@
>>>>
>>>>   package org.apache.commons.**configuration;
>>>>
>>>> -import java.math.BigDecimal;
>>>> -import java.math.BigInteger;
>>>> -import java.util.Iterator;
>>>> -import java.util.List;
>>>> -import java.util.Properties;
>>>>
>>>>   /**
>>>>    * <p>The main Configuration interface.</p>
>>>> @@ -54,7 +49,7 @@ import java.util.Properties;
>>>>    * @author Commons Configuration team
>>>>    * @version $Id$
>>>>    */
>>>> -public interface Configuration
>>>> +public interface Configuration extends ImmutableConfiguration
>>>>
>>>>
>>> A Configuration IS_A ImmutableConfiguration sounds rather akward. The
>>> JavaDoc of ImmutableConfiguration says "The main interface for accessing
>>> configuration data in a read-only fashion." Maybe ImmutableConfiguration
>>> should be renamed to ReadOnlyConfiguration?
>>>
>>> Regards,
>>> Benedikt
>>>
>>>
>> Looking at the code base, there is no class that implements
>> ImmutableConfiguration directly and Configuration is the only interface
>> that extends ImmutableConfiguration. So maybe the two can be merged
>> together?
>>
>
> The ImmutableConfiguration interface has just been extracted from
> Configuration in order to implement the feature of immutable
> configurations. It contains all methods that do not manipulate the
> configuration. A full-blown configuration extends this functionality by
> additional update operations.
>
> It is true that currently all concrete Configuration implementations
> support the extended interface with update operations. However,
> ImmutableConfiguration is implemented by dynamic proxies which provide an
> immutable view on an arbitrary Configuration object.
>
> Regarding the name: I am open for suggestions. ReadOnlyConfiguration,
> ImmutableConfiguration, UnmodifiableConfiguration,... Maybe a native
> speaker can comment?
>
> Oliver
>
>
>
>> Benedikt
>>
>>
>>
>>>
>>>    {
>>>>       /**
>>>>        * Return a decorator Configuration containing every key from the
>>>> current
>>>> @@ -90,24 +85,6 @@ public interface Configuration
>>>>       Configuration subset(String prefix);
>>>>
>>>>       /**
>>>> -     * Check if the configuration is empty.
>>>> -     *
>>>> -     * @return {@code true} if the configuration contains no property,
>>>> -     *         {@code false} otherwise.
>>>> -     */
>>>> -    boolean isEmpty();
>>>> -
>>>> -    /**
>>>> -     * Check if the configuration contains the specified key.
>>>> -     *
>>>> -     * @param key the key whose presence in this configuration is to be
>>>> tested
>>>> -     *
>>>> -     * @return {@code true} if the configuration contains a value for
>>>> this
>>>> -     *         key, {@code false} otherwise
>>>> -     */
>>>> -    boolean containsKey(String key);
>>>> -
>>>> -    /**
>>>>        * Add a property to the configuration. If it already exists then
>>>> the value
>>>>        * stated here will be added to the configuration entry. For
>>>> example, if
>>>>        * the property:
>>>> @@ -147,452 +124,4 @@ public interface Configuration
>>>>        * Remove all properties from the configuration.
>>>>        */
>>>>       void clear();
>>>> -
>>>> -    /**
>>>> -     * Gets a property from the configuration. This is the most basic
>>>> get
>>>> -     * method for retrieving values of properties. In a typical
>>>> implementation
>>>> -     * of the {@code Configuration} interface the other get methods
>>>> (that
>>>> -     * return specific data types) will internally make use of this
>>>> method. On
>>>> -     * this level variable substitution is not yet performed. The
>>>> returned
>>>> -     * object is an internal representation of the property value for
>>>> the passed
>>>> -     * in key. It is owned by the {@code Configuration} object. So a
>>>> caller
>>>> -     * should not modify this object. It cannot be guaranteed that this
>>>> object
>>>> -     * will stay constant over time (i.e. further update operations on
>>>> the
>>>> -     * configuration may change its internal state).
>>>> -     *
>>>> -     * @param key property to retrieve
>>>> -     * @return the value to which this configuration maps the specified
>>>> key, or
>>>> -     *         null if the configuration contains no mapping for this
>>>> key.
>>>> -     */
>>>> -    Object getProperty(String key);
>>>> -
>>>> -    /**
>>>> -     * Get the list of the keys contained in the configuration that
>>>> match the
>>>> -     * specified prefix. For instance, if the configuration contains
>>>> the
>>>> -     * following keys:<br>
>>>> -     * {@code db.user, db.pwd, db.url, window.xpos, window.ypos},<br>
>>>> -     * an invocation of {@code getKeys("db");}<br>
>>>> -     * will return the keys below:<br>
>>>> -     * {@code db.user, db.pwd, db.url}.<br>
>>>> -     * Note that the prefix itself is included in the result set if
>>>> there is a
>>>> -     * matching key. The exact behavior - how the prefix is actually
>>>> -     * interpreted - depends on a concrete implementation.
>>>> -     *
>>>> -     * @param prefix The prefix to test against.
>>>> -     * @return An Iterator of keys that match the prefix.
>>>> -     * @see #getKeys()
>>>> -     */
>>>> -    Iterator<String> getKeys(String prefix);
>>>> -
>>>> -    /**
>>>> -     * Get the list of the keys contained in the configuration. The
>>>> returned
>>>> -     * iterator can be used to obtain all defined keys. Note that the
>>>> exact
>>>> -     * behavior of the iterator's {@code remove()} method is specific
>>>> to
>>>> -     * a concrete implementation. It <em>may</em> remove the
>>>> corresponding
>>>> -     * property from the configuration, but this is not guaranteed. In
>>>> any case
>>>> -     * it is no replacement for calling
>>>> -     * {@link #clearProperty(String)} for this property. So it is
>>>> -     * highly recommended to avoid using the iterator's {@code
>>>> remove()}
>>>> -     * method.
>>>> -     *
>>>> -     * @return An Iterator.
>>>> -     */
>>>> -    Iterator<String> getKeys();
>>>> -
>>>> -    /**
>>>> -     * Get a list of properties associated with the given configuration
>>>> key.
>>>> -     * This method expects the given key to have an arbitrary number of
>>>> String
>>>> -     * values, each of which is of the form {code key=value}. These
>>>> -     * strings are split at the equals sign, and the key parts will
>>>> become
>>>> -     * keys of the returned {@code Properties} object, the value parts
>>>> -     * become values.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated properties if key is found.
>>>> -     *
>>>> -     * @throws ConversionException 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).
>>>> -     */
>>>> -    Properties getProperties(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a boolean associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated boolean.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Boolean.
>>>> -     */
>>>> -    boolean getBoolean(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a boolean associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated boolean.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Boolean.
>>>> -     */
>>>> -    boolean getBoolean(String key, boolean defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link 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 ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Boolean.
>>>> -     */
>>>> -    Boolean getBoolean(String key, Boolean defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a byte associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated byte.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Byte.
>>>> -     */
>>>> -    byte getByte(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a byte associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated byte.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Byte.
>>>> -     */
>>>> -    byte getByte(String key, byte defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link 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 ConversionException is thrown if the key maps to an
>>>> object that
>>>> -     *         is not a Byte.
>>>> -     */
>>>> -    Byte getByte(String key, Byte defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a double associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated double.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Double.
>>>> -     */
>>>> -    double getDouble(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a double associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated double.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Double.
>>>> -     */
>>>> -    double getDouble(String key, double defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link 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 ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Double.
>>>> -     */
>>>> -    Double getDouble(String key, Double defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a float associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated float.
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Float.
>>>> -     */
>>>> -    float getFloat(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a float associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated float.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Float.
>>>> -     */
>>>> -    float getFloat(String key, float defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link Float} associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @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 ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Float.
>>>> -     */
>>>> -    Float getFloat(String key, Float defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a int associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated int.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Integer.
>>>> -     */
>>>> -    int getInt(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a int associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated int.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Integer.
>>>> -     */
>>>> -    int getInt(String key, int defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get an {@link Integer} associated with the given configuration
>>>> key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @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 ConversionException is thrown if the key maps to an
>>>> object that
>>>> -     *         is not a Integer.
>>>> -     */
>>>> -    Integer getInteger(String key, Integer defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a long associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated long.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Long.
>>>> -     */
>>>> -    long getLong(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a long associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated long.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Long.
>>>> -     */
>>>> -    long getLong(String key, long defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link Long} associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @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 ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Long.
>>>> -     */
>>>> -    Long getLong(String key, Long defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a short associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated short.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Short.
>>>> -     */
>>>> -    short getShort(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a short associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated short.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Short.
>>>> -     */
>>>> -    short getShort(String key, short defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link Short} associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @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 ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a Short.
>>>> -     */
>>>> -    Short getShort(String key, Short defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link BigDecimal} associated with the given configuration
>>>> key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated BigDecimal if key is found and has valid
>>>> format
>>>> -     */
>>>> -    BigDecimal getBigDecimal(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link BigDecimal} associated with the given configuration
>>>> key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key          The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     *
>>>> -     * @return The associated BigDecimal if key is found and has valid
>>>> -     *         format, default value otherwise.
>>>> -     */
>>>> -    BigDecimal getBigDecimal(String key, BigDecimal defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link BigInteger} associated with the given configuration
>>>> key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     *
>>>> -     * @return The associated BigInteger if key is found and has valid
>>>> format
>>>> -     */
>>>> -    BigInteger getBigInteger(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a {@link BigInteger} associated with the given configuration
>>>> key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key          The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     *
>>>> -     * @return The associated BigInteger if key is found and has valid
>>>> -     *         format, default value otherwise.
>>>> -     */
>>>> -    BigInteger getBigInteger(String key, BigInteger defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get a string associated with the given configuration key.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated string.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> object that
>>>> -     *         is not a String.
>>>> -     */
>>>> -    String getString(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a string associated with the given configuration key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated string if key is found and has valid
>>>> -     *         format, default value otherwise.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> object that
>>>> -     *         is not a String.
>>>> -     */
>>>> -    String getString(String key, String defaultValue);
>>>> -
>>>> -    /**
>>>> -     * Get an array of strings associated with the given configuration
>>>> key.
>>>> -     * If the key doesn't map to an existing object an empty array is
>>>> returned
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated string array if key is found.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a String/List of Strings.
>>>> -     */
>>>> -    String[] getStringArray(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a List of strings associated with the given configuration
>>>> key.
>>>> -     * If the key doesn't map to an existing object an empty List is
>>>> returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @return The associated List.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a List.
>>>> -     */
>>>> -    List<Object> getList(String key);
>>>> -
>>>> -    /**
>>>> -     * Get a List of strings associated with the given configuration
>>>> key.
>>>> -     * If the key doesn't map to an existing object, the default value
>>>> -     * is returned.
>>>> -     *
>>>> -     * @param key The configuration key.
>>>> -     * @param defaultValue The default value.
>>>> -     * @return The associated List of strings.
>>>> -     *
>>>> -     * @throws ConversionException is thrown if the key maps to an
>>>> -     *         object that is not a List.
>>>> -     */
>>>> -    List<Object> getList(String key, List<Object> defaultValue);
>>>>   }
>>>>
>>>> Added:
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>> URL:
>>>> http://svn.apache.org/viewvc/**commons/proper/configuration/**
>>>> trunk/src/main/java/org/**apache/commons/configuration/**
>>>> ImmutableConfiguration.java?**rev=1405889&view=auto<http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/ImmutableConfiguration.java?rev=1405889&view=auto>
>>>>
>>>> ==============================**==============================**
>>>> ==================
>>>> ---
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>> (added)
>>>> +++
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>> Mon Nov  5 17:29:01 2012
>>>> @@ -0,0 +1,518 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file distributed
>>>> with
>>>> + * this work for additional information regarding copyright ownership.
>>>> + * The ASF licenses this file to You 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<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 org.apache.commons.**configuration;
>>>> +
>>>> +import java.math.BigDecimal;
>>>> +import java.math.BigInteger;
>>>> +import java.util.Iterator;
>>>> +import java.util.List;
>>>> +import java.util.Properties;
>>>> +
>>>> +/**
>>>> + * <p>The main interface for accessing configuration data in a
>>>> read-only
>>>> fashion.</p>
>>>> + * <p>
>>>> + * The major part of the methods defined in this interface deals with
>>>> accessing
>>>> + * properties of various data types. There is a generic {@code
>>>> getProperty()}
>>>> + * method, which returns the value of the queried property in its raw
>>>> data
>>>> + * type. Other getter methods try to convert this raw data type into a
>>>> specific
>>>> + * data type. If this fails, a {@code ConversionException} will be
>>>> thrown.</p>
>>>> + * <p>For most of the property getter methods an overloaded version
>>>> exists that
>>>> + * allows to specify a default value, which will be returned if the
>>>> queried
>>>> + * property cannot be found in the configuration. The behavior of the
>>>> methods
>>>> + * that do not take a default value in case of a missing property is
>>>> not
>>>> defined
>>>> + * by this interface and depends on a concrete implementation. E.g. the
>>>> + * {@link AbstractConfiguration} class, which is the base class
>>>> + * of most configuration implementations provided by this package, per
>>>> default
>>>> + * returns <b>null</b> if a property is not found, but provides the
>>>> + * {@link AbstractConfiguration#**setThrowExceptionOnMissing(**
>>>> boolean)
>>>> + * setThrowExceptionOnMissing()}
>>>> + * method, with which it can be configured to throw a {@code
>>>> NoSuchElementException}
>>>> + * exception in that case. (Note that getter methods for primitive
>>>> types
>>>> in
>>>> + * {@code AbstractConfiguration} always throw an exception for missing
>>>> + * properties because there is no way of overloading the return
>>>> value.)</p>
>>>> + *
>>>> + * @version $Id$
>>>> + * @since 2.0
>>>> + */
>>>> +public interface ImmutableConfiguration
>>>> +{
>>>> +    /**
>>>> +     * Check if the configuration is empty.
>>>> +     *
>>>> +     * @return {@code true} if the configuration contains no property,
>>>> +     *         {@code false} otherwise.
>>>> +     */
>>>> +    boolean isEmpty();
>>>> +
>>>> +    /**
>>>> +     * Check if the configuration contains the specified key.
>>>> +     *
>>>> +     * @param key the key whose presence in this configuration is to be
>>>> tested
>>>> +     *
>>>> +     * @return {@code true} if the configuration contains a value for
>>>> this
>>>> +     *         key, {@code false} otherwise
>>>> +     */
>>>> +    boolean containsKey(String key);
>>>> +
>>>> +    /**
>>>> +     * Gets a property from the configuration. This is the most basic
>>>> get
>>>> +     * method for retrieving values of properties. In a typical
>>>> implementation
>>>> +     * of the {@code Configuration} interface the other get methods
>>>> (that
>>>> +     * return specific data types) will internally make use of this
>>>> method. On
>>>> +     * this level variable substitution is not yet performed. The
>>>> returned
>>>> +     * object is an internal representation of the property value for
>>>> the passed
>>>> +     * in key. It is owned by the {@code Configuration} object. So a
>>>> caller
>>>> +     * should not modify this object. It cannot be guaranteed that this
>>>> object
>>>> +     * will stay constant over time (i.e. further update operations on
>>>> the
>>>> +     * configuration may change its internal state).
>>>> +     *
>>>> +     * @param key property to retrieve
>>>> +     * @return the value to which this configuration maps the specified
>>>> key, or
>>>> +     *         null if the configuration contains no mapping for this
>>>> key.
>>>> +     */
>>>> +    Object getProperty(String key);
>>>> +
>>>> +    /**
>>>> +     * Get the list of the keys contained in the configuration that
>>>> match the
>>>> +     * specified prefix. For instance, if the configuration contains
>>>> the
>>>> +     * following keys:<br>
>>>> +     * {@code db.user, db.pwd, db.url, window.xpos, window.ypos},<br>
>>>> +     * an invocation of {@code getKeys("db");}<br>
>>>> +     * will return the keys below:<br>
>>>> +     * {@code db.user, db.pwd, db.url}.<br>
>>>> +     * Note that the prefix itself is included in the result set if
>>>> there is a
>>>> +     * matching key. The exact behavior - how the prefix is actually
>>>> +     * interpreted - depends on a concrete implementation.
>>>> +     *
>>>> +     * @param prefix The prefix to test against.
>>>> +     * @return An Iterator of keys that match the prefix.
>>>> +     * @see #getKeys()
>>>> +     */
>>>> +    Iterator<String> getKeys(String prefix);
>>>> +
>>>> +    /**
>>>> +     * Get the list of the keys contained in the configuration. The
>>>> returned
>>>> +     * iterator can be used to obtain all defined keys. Note that the
>>>> exact
>>>> +     * behavior of the iterator's {@code remove()} method is specific
>>>> to
>>>> +     * a concrete implementation. It <em>may</em> remove the
>>>> corresponding
>>>> +     * property from the configuration, but this is not guaranteed. In
>>>> any case
>>>> +     * it is no replacement for calling
>>>> +     * {@link #clearProperty(String)} for this property. So it is
>>>> +     * highly recommended to avoid using the iterator's {@code
>>>> remove()}
>>>> +     * method.
>>>> +     *
>>>> +     * @return An Iterator.
>>>> +     */
>>>> +    Iterator<String> getKeys();
>>>> +
>>>> +    /**
>>>> +     * Get a list of properties associated with the given configuration
>>>> key.
>>>> +     * This method expects the given key to have an arbitrary number of
>>>> String
>>>> +     * values, each of which is of the form {code key=value}. These
>>>> +     * strings are split at the equals sign, and the key parts will
>>>> become
>>>> +     * keys of the returned {@code Properties} object, the value parts
>>>> +     * become values.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated properties if key is found.
>>>> +     *
>>>> +     * @throws ConversionException 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).
>>>> +     */
>>>> +    Properties getProperties(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a boolean associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated boolean.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Boolean.
>>>> +     */
>>>> +    boolean getBoolean(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a boolean associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated boolean.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Boolean.
>>>> +     */
>>>> +    boolean getBoolean(String key, boolean defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link 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 ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Boolean.
>>>> +     */
>>>> +    Boolean getBoolean(String key, Boolean defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a byte associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated byte.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Byte.
>>>> +     */
>>>> +    byte getByte(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a byte associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated byte.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Byte.
>>>> +     */
>>>> +    byte getByte(String key, byte defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link 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 ConversionException is thrown if the key maps to an
>>>> object that
>>>> +     *         is not a Byte.
>>>> +     */
>>>> +    Byte getByte(String key, Byte defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a double associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated double.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Double.
>>>> +     */
>>>> +    double getDouble(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a double associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated double.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Double.
>>>> +     */
>>>> +    double getDouble(String key, double defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link 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 ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Double.
>>>> +     */
>>>> +    Double getDouble(String key, Double defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a float associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated float.
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Float.
>>>> +     */
>>>> +    float getFloat(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a float associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated float.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Float.
>>>> +     */
>>>> +    float getFloat(String key, float defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link Float} associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @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 ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Float.
>>>> +     */
>>>> +    Float getFloat(String key, Float defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a int associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated int.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Integer.
>>>> +     */
>>>> +    int getInt(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a int associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated int.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Integer.
>>>> +     */
>>>> +    int getInt(String key, int defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get an {@link Integer} associated with the given configuration
>>>> key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @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 ConversionException is thrown if the key maps to an
>>>> object that
>>>> +     *         is not a Integer.
>>>> +     */
>>>> +    Integer getInteger(String key, Integer defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a long associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated long.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Long.
>>>> +     */
>>>> +    long getLong(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a long associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated long.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Long.
>>>> +     */
>>>> +    long getLong(String key, long defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link Long} associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @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 ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Long.
>>>> +     */
>>>> +    Long getLong(String key, Long defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a short associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated short.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Short.
>>>> +     */
>>>> +    short getShort(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a short associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated short.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Short.
>>>> +     */
>>>> +    short getShort(String key, short defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link Short} associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @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 ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a Short.
>>>> +     */
>>>> +    Short getShort(String key, Short defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link BigDecimal} associated with the given configuration
>>>> key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated BigDecimal if key is found and has valid
>>>> format
>>>> +     */
>>>> +    BigDecimal getBigDecimal(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link BigDecimal} associated with the given configuration
>>>> key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key          The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     *
>>>> +     * @return The associated BigDecimal if key is found and has valid
>>>> +     *         format, default value otherwise.
>>>> +     */
>>>> +    BigDecimal getBigDecimal(String key, BigDecimal defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link BigInteger} associated with the given configuration
>>>> key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     *
>>>> +     * @return The associated BigInteger if key is found and has valid
>>>> format
>>>> +     */
>>>> +    BigInteger getBigInteger(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a {@link BigInteger} associated with the given configuration
>>>> key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key          The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     *
>>>> +     * @return The associated BigInteger if key is found and has valid
>>>> +     *         format, default value otherwise.
>>>> +     */
>>>> +    BigInteger getBigInteger(String key, BigInteger defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get a string associated with the given configuration key.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated string.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> object that
>>>> +     *         is not a String.
>>>> +     */
>>>> +    String getString(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a string associated with the given configuration key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated string if key is found and has valid
>>>> +     *         format, default value otherwise.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> object that
>>>> +     *         is not a String.
>>>> +     */
>>>> +    String getString(String key, String defaultValue);
>>>> +
>>>> +    /**
>>>> +     * Get an array of strings associated with the given configuration
>>>> key.
>>>> +     * If the key doesn't map to an existing object an empty array is
>>>> returned
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated string array if key is found.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a String/List of Strings.
>>>> +     */
>>>> +    String[] getStringArray(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a List of strings associated with the given configuration
>>>> key.
>>>> +     * If the key doesn't map to an existing object an empty List is
>>>> returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @return The associated List.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a List.
>>>> +     */
>>>> +    List<Object> getList(String key);
>>>> +
>>>> +    /**
>>>> +     * Get a List of strings associated with the given configuration
>>>> key.
>>>> +     * If the key doesn't map to an existing object, the default value
>>>> +     * is returned.
>>>> +     *
>>>> +     * @param key The configuration key.
>>>> +     * @param defaultValue The default value.
>>>> +     * @return The associated List of strings.
>>>> +     *
>>>> +     * @throws ConversionException is thrown if the key maps to an
>>>> +     *         object that is not a List.
>>>> +     */
>>>> +    List<Object> getList(String key, List<Object> defaultValue);
>>>> +}
>>>>
>>>> Propchange:
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>>
>>>> ------------------------------**------------------------------**
>>>> ------------------
>>>>      svn:eol-style = native
>>>>
>>>> Propchange:
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>>
>>>> ------------------------------**------------------------------**
>>>> ------------------
>>>>      svn:keywords = Date Author Id Revision HeadURL
>>>>
>>>> Propchange:
>>>> commons/proper/configuration/**trunk/src/main/java/org/**
>>>> apache/commons/configuration/**ImmutableConfiguration.java
>>>>
>>>> ------------------------------**------------------------------**
>>>> ------------------
>>>>      svn:mime-type = text/plain
>>>>
>>>>
>>>>
>>>>
>>>
>>
>
> ------------------------------**------------------------------**---------
> To unsubscribe, e-mail: 
> dev-unsubscribe@commons.**apache.org<dev-unsubscr...@commons.apache.org>
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to