Return-Path: Delivered-To: apmail-jakarta-avalon-cvs-archive@apache.org Received: (qmail 85453 invoked from network); 16 Jul 2002 18:09:08 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 16 Jul 2002 18:09:08 -0000 Received: (qmail 24725 invoked by uid 97); 16 Jul 2002 18:09:25 -0000 Delivered-To: qmlist-jakarta-archive-avalon-cvs@jakarta.apache.org Received: (qmail 24706 invoked by uid 97); 16 Jul 2002 18:09:24 -0000 Mailing-List: contact avalon-cvs-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Avalon CVS List" Reply-To: "Avalon Developers List" Delivered-To: mailing list avalon-cvs@jakarta.apache.org Received: (qmail 24695 invoked by uid 97); 16 Jul 2002 18:09:24 -0000 X-Antivirus: nagoya (v4198 created Apr 24 2002) Date: 16 Jul 2002 18:09:01 -0000 Message-ID: <20020716180901.76949.qmail@icarus.apache.org> From: proyal@apache.org To: jakarta-avalon-phoenix-cvs@apache.org Subject: cvs commit: jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration ConfigurationDirectoryFilter.java ConfigurationFileFilter.java ConfigurationKey.java MergedConfiguration.java FileSystemPersistentConfigurationRepository.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N proyal 2002/07/16 11:09:01 Modified: src/java/org/apache/avalon/phoenix/components/configuration FileSystemPersistentConfigurationRepository.java Added: src/java/org/apache/avalon/phoenix/components/configuration ConfigurationDirectoryFilter.java ConfigurationFileFilter.java ConfigurationKey.java MergedConfiguration.java Log: * Repository will now load config blocks from PHOENIX_HOME/conf/apps//.xml. The config loaded from disk is merged with the config from the SAR using a MergedConfiguration. * Inner classes removed and made package level. Revision Changes Path 1.3 +69 -71 jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/FileSystemPersistentConfigurationRepository.java Index: FileSystemPersistentConfigurationRepository.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/FileSystemPersistentConfigurationRepository.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- FileSystemPersistentConfigurationRepository.java 15 Jul 2002 16:17:23 -0000 1.2 +++ FileSystemPersistentConfigurationRepository.java 16 Jul 2002 18:09:00 -0000 1.3 @@ -24,7 +24,7 @@ import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.configuration.DefaultConfiguration; +import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.avalon.framework.configuration.DefaultConfigurationSerializer; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.DefaultContext; @@ -47,6 +47,7 @@ private static final Resources REZ = ResourceManager.getPackageResources( FileSystemPersistentConfigurationRepository.class ); + private final HashMap m_persistedConfigurations = new HashMap(); private final HashMap m_configurations = new HashMap(); private String m_phoenixHome; @@ -129,57 +130,84 @@ public void start() throws Exception { + loadConfigurations(); } public void stop() throws Exception { - writeJoinedConfigurationsToDisk( joinConfigurations() ); + persistConfigurations(); } - private Map joinConfigurations() + private void loadConfigurations() + throws IOException, SAXException, ConfigurationException { - final Map joinedConfigurations = new HashMap(); + final File[] apps = m_storageDirectory.listFiles( new ConfigurationDirectoryFilter() ); - for( Iterator i = this.m_configurations.entrySet().iterator(); i.hasNext(); ) + for( int i = 0; i < apps.length; i++ ) { - final Map.Entry entry = ( Map.Entry ) i.next(); - final ConfigurationKey key = ( ConfigurationKey ) entry.getKey(); + loadConfigurations( apps[i] ); + } + } - DefaultConfiguration joined = - ( DefaultConfiguration ) joinedConfigurations.get( key.getApplication() ); + private void loadConfigurations( File appPath ) + throws IOException, SAXException, ConfigurationException + { + final DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); + final String app = appPath.getName(); + final File[] blocks = appPath.listFiles( new ConfigurationFileFilter() ); - if( null == joined ) - { - joined = new DefaultConfiguration( key.getApplication(), "-" ); + for( int i = 0; i < blocks.length; i++ ) + { + final String block = + blocks[i].getName().substring( 0, blocks[i].getName().indexOf( ".xml" ) ); - joinedConfigurations.put( key.getApplication(), joined ); - } + this.m_persistedConfigurations.put( new ConfigurationKey( app, block ), + builder.buildFromFile( blocks[i] ) ); - joined.addChild( ( Configuration ) entry.getValue() ); + if( getLogger().isDebugEnabled() ) + getLogger().debug( "Loaded persistent configuration [app: " + app + + ", block: " + block + "]" ); } + } + + private void persistConfigurations() + throws SAXException, IOException, ConfigurationException + { + for( Iterator i = this.m_persistedConfigurations.entrySet().iterator(); i.hasNext(); ) + { + final Map.Entry entry = ( Map.Entry ) i.next(); + final ConfigurationKey key = ( ConfigurationKey ) entry.getKey(); - return joinedConfigurations; + persistConfiguration( key.getApplication(), + key.getBlock(), + ( Configuration ) entry.getValue() ); + } } - private void writeJoinedConfigurationsToDisk( Map joinedConfigurations ) + private void persistConfiguration( final String application, + final String block, + final Configuration configuration ) throws SAXException, IOException, ConfigurationException { final DefaultConfigurationSerializer serializer = new DefaultConfigurationSerializer(); + final File directory = new File( this.m_storageDirectory, application ); - serializer.setIndent( true ); + FileUtil.forceMkdir( directory ); - for( Iterator i = joinedConfigurations.entrySet().iterator(); i.hasNext(); ) - { - final Map.Entry entry = ( Map.Entry ) i.next(); - final String application = ( String ) entry.getKey(); + if( getLogger().isDebugEnabled() ) + getLogger().debug( "Serializing configuration to disk [app: " + application + + ", block: " + block + "]" ); - if( getLogger().isDebugEnabled() ) - getLogger().debug( "Serializing configuration to disk: " + application ); + serializer.setIndent( true ); + serializer.serializeToFile( new File( directory, block + ".xml" ), configuration ); + } - serializer.serializeToFile( new File( this.m_storageDirectory, application + ".xml" ), - ( Configuration ) entry.getValue() ); - } + public void removeConfiguration( String application, String block ) + { + final String name = application + "." + block; + + m_configurations.remove( name ); } public synchronized void storeConfiguration( final String application, @@ -187,15 +215,15 @@ final Configuration configuration ) throws ConfigurationException { - final ConfigurationKey key = new ConfigurationKey( application, block ); + final String name = application + "." + block; if( null == configuration ) { - //do nothing right now. + m_configurations.remove( name ); } else { - m_configurations.put( key, configuration ); + m_configurations.put( name, configuration ); } } @@ -203,57 +231,27 @@ final String block ) throws ConfigurationException { - final ConfigurationKey key = new ConfigurationKey( application, block ); - final Configuration configuration = ( Configuration ) m_configurations.get( key ); + final String name = application + "." + block; + final Configuration c = ( Configuration ) m_configurations.get( name ); + final Configuration p = ( Configuration ) m_persistedConfigurations.get( + new ConfigurationKey( application, block ) ); - if( null == configuration ) + if( null == c && p == null ) { final String message = REZ.getString( "config.error.noconfig", block, application ); throw new ConfigurationException( message ); } - - return configuration; - } - - private final class ConfigurationKey - { - private final String m_application; - private final String m_block; - - public ConfigurationKey( String application, String block ) + else if( null == c ) { - this.m_application = application; - this.m_block = block; + return p; } - - public int hashCode() + else if( null == p ) { - return this.getApplication().hashCode() + this.getBlock().hashCode(); + return c; } - - public boolean equals( Object obj ) - { - if( obj instanceof ConfigurationKey ) - { - final ConfigurationKey key = ( ConfigurationKey ) obj; - - return this.getApplication().equals( key.getApplication() ) - && this.getBlock().equals( key.getBlock() ); - } - else - { - return false; - } - } - - public String getApplication() - { - return m_application; - } - - public String getBlock() + else { - return m_block; + return new MergedConfiguration( p, c ); } } } 1.1 jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/ConfigurationDirectoryFilter.java Index: ConfigurationDirectoryFilter.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phoenix.components.configuration; import java.io.FileFilter; import java.io.File; class ConfigurationDirectoryFilter implements FileFilter { public boolean accept( File pathname ) { return pathname.isDirectory(); } } 1.1 jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/ConfigurationFileFilter.java Index: ConfigurationFileFilter.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phoenix.components.configuration; import java.io.FileFilter; import java.io.File; class ConfigurationFileFilter implements FileFilter { public boolean accept( File pathname ) { return pathname.isFile() && pathname.getName().endsWith( ".xml" ); } } 1.1 jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/ConfigurationKey.java Index: ConfigurationKey.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phoenix.components.configuration; final class ConfigurationKey { private final String m_application; private final String m_block; public ConfigurationKey( String application, String block ) { this.m_application = application; this.m_block = block; } public int hashCode() { return this.getApplication().hashCode() + this.getBlock().hashCode(); } public boolean equals( Object obj ) { if( obj instanceof ConfigurationKey ) { final ConfigurationKey key = ( ConfigurationKey ) obj; return this.getApplication().equals( key.getApplication() ) && this.getBlock().equals( key.getBlock() ); } else { return false; } } public String getApplication() { return m_application; } public String getBlock() { return m_block; } } 1.1 jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/MergedConfiguration.java Index: MergedConfiguration.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.TXT file. */ package org.apache.avalon.phoenix.components.configuration; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.DefaultConfiguration; /** * The MergedConfiguration is a classic Configuration backed by parent * Configuration. Operations such as getChild return a MergedConfiguration * encapsulating both a primary and parent configuration. Requests for attribute * values are resolved against the base configuration initially. If the result * of the resolution is unsucessful, the request is applied against the parent * configuration. As a parent may also be a MergedConfiguration, the evaluation * will be applied until a value is resolved against a class parent Configuration. * * The MergedConfiguration will use special attributes on the base configuration's * children to control how children of the parent and base are combined. In order for * a child of the base to be merged with a child of the parent, the following must hold true: *
    *
  1. There is only a single child of both the parent and child with a specified name * (TODO: enable a "key attribute" to support merging when multiple items with * the same name exist *
  2. *
  3. The child in the base Configuration has an attribute named * phoenix-configuration:merge and its value is equal to a boolean * TRUE *
  4. *
* * When viewing the list of attributes for a MergedConfiguration, the * phoenix-configuration:merge is not included. * * @author Peter Royal */ class MergedConfiguration implements Configuration { private static final String MERGE_ATTR = "phoenix-configuration:merge"; //TOOD: implement support for key attribute private static final String KEY_ATTR = "phoenix-configuration:key-attribute"; //============================================================================= // state //============================================================================= /** * The primary configuration. */ private final Configuration m_base; /** * The fallback configuration. */ private final Configuration m_parent; //============================================================================= // constructors //============================================================================= /** * Create a MergedConfiguration with specified parent. The base * configuration shall override a parent configuration on request for * attribute values and configuration body values. Unresolved request * are redirected up the parent chain until a classic configuration is * reached. Request for child configurations will return a * new MergedConfiguration referencing the child of the base and * the child of the primary (i.e. a child configuration chain). * * @param base the base Configuration * @param parent the parent Configuration */ public MergedConfiguration( final Configuration base, final Configuration parent ) { if( base == null ) { m_base = new DefaultConfiguration( "-", null ); } else { m_base = base; } if( parent == null ) { m_parent = new DefaultConfiguration( "-", null ); } else { m_parent = parent; } } //============================================================================= // Configuration //============================================================================= /** * Return the name of the base node. * @return name of the Configuration node. */ public String getName() { return m_base.getName(); } /** * Return a string describing location of the base Configuration. * Location can be different for different mediums (ie "file:line" for normal XML files or * "table:primary-key" for DB based configurations); * * @return a string describing location of Configuration */ public String getLocation() { return m_base.getLocation(); } /** * Returns the namespace the main Configuration node * belongs to. * @exception ConfigurationException may be thrown by the underlying configuration * @since 4.1 * @return a Namespace identifying the namespace of this Configuration. */ public String getNamespace() throws ConfigurationException { return m_base.getNamespace(); } /** * Return a new MergedConfiguration instance. The configuration may be merged * depending upon the value of the phoenix-configuration:merge attribute in * the base configuration * * @param child The name of the child node. * @return Configuration */ public Configuration getChild( String child ) { return getChild( child, true ); } /** * Return a Configuration instance encapsulating the specified * child node. * * @param child The name of the child node. * @param createNew If true, a new Configuration * will be created and returned if the specified child does not exist in either * the base or parent configuratioin. If false, null * will be returned when the specified child doesn't exist in either the base or * the parent. * @return Configuration */ public Configuration getChild( String child, boolean createNew ) { final Configuration b = m_base.getChild( child, false ); if( null == b ) { return m_parent.getChild( child, createNew ); } else if( b.getAttributeAsBoolean( MERGE_ATTR, false ) ) { return new MergedConfiguration( b, m_parent.getChild( child ) ); } else { return b; } } /** * Return an Array of Configuration * elements containing all node children of both base and parent configurations. * The array order will reflect the order in the source config file, commencing * with the base configuration. This list will be merged for any children that satisfy the * phoenix-configuration:merge rules. * * @return All child nodes */ public Configuration[] getChildren() { final Configuration[] b = m_base.getChildren(); final Configuration[] p = m_parent.getChildren(); final List children = new ArrayList(); final Set parentUsed = new HashSet(); for( int i = 0; i < b.length; i++ ) { final String name = b[i].getName(); if( isLoneConfiguration( name, b ) //is the only one with this name as a child here.. && b[i].getAttributeAsBoolean( MERGE_ATTR, false ) // and we can merge it && isLoneConfiguration( name, p ) ) //and there is only a single item in the parent to merge to { final Configuration parent = m_parent.getChild( name, true ); children.add( new MergedConfiguration( b[i], parent ) ); parentUsed.add( parent ); } else { children.add( b[i] ); } } for( int i = 0; i < p.length; i++ ) { if( !parentUsed.contains( p[i] ) ) { children.add( p[i] ); } } return ( Configuration[] ) children.toArray( new Configuration[children.size()] ); } private boolean isLoneConfiguration( String name, Configuration list[] ) { boolean found = false; for( int i = 0; i < list.length; i++ ) { if( name.equals( list[i].getName() ) ) { if( found ) { return false; } else { found = true; } } } return true; } /** * Return an Array of Configuration * elements containing all node children with the specified name from * both base and parent configurations. The array * order will reflect the order in the source config file commencing * with the base configuration. The configuration may be merged according to the rules for * phoenix-configuration:merge * * @param name The name of the children to get. * @return The child nodes with name name */ public Configuration[] getChildren( String name ) { final Configuration[] b = m_base.getChildren( name ); final Configuration[] p = m_parent.getChildren( name ); if( b.length == 0 && p.length == 0 ) //both are zero, no need to do anything { return new Configuration[0]; } else if( b.length == 0 ) // base is empty, return parent { return p; } else if( p.length == 0 ) //parent is empty, return base { return b; } else if( p.length == 1 && b.length == 1 && b[0].getAttributeAsBoolean( MERGE_ATTR, false ) ) { return new Configuration[]{new MergedConfiguration( b[0], p[0] )}; } else { Configuration[] result = new Configuration[b.length + p.length]; System.arraycopy( b, 0, result, 0, b.length ); System.arraycopy( p, 0, result, b.length, p.length ); return result; } } /** * Return an array of all attribute names in both base and parent. *

* The order of attributes in this array can not be relied on. As * with XML, a Configuration's attributes are an * unordered set. If your code relies on order, eg * conf.getAttributeNames()[0], then it is liable to break if a * different XML parser is used. *

* * If an attribute named phoenix-configuration:merge exists in either the * parent or base, it will not be shown in this list. * * @return an array of all attribute names */ public String[] getAttributeNames() { List list = new ArrayList(); String[] names = m_base.getAttributeNames(); String[] names2 = m_parent.getAttributeNames(); for( int i = 0; i < names.length; i++ ) { if( !( MERGE_ATTR.equals( names[i] ) || KEY_ATTR.equals( names[i] ) ) ) { list.add( names[i] ); } } for( int i = 0; i < names2.length; i++ ) { final String name = names2[i]; if( !( MERGE_ATTR.equals( name ) || KEY_ATTR.equals( name ) ) && list.indexOf( name ) < 0 ) { list.add( name ); } } return ( String[] ) list.toArray( new String[list.size()] ); } /** * Return the value of specified attribute. If the base configuration * does not contain the attribute, the equivialent operation is applied to * the parent configuration. * * @param paramName The name of the parameter you ask the value of. * @return String value of attribute. * @exception ConfigurationException If no attribute with that name exists. */ public String getAttribute( String paramName ) throws ConfigurationException { try { return m_base.getAttribute( paramName ); } catch( ConfigurationException e ) { return m_parent.getAttribute( paramName ); } } /** * Return the int value of the specified attribute contained * in this node or the parent. * @param paramName The name of the parameter you ask the value of. * @return int value of attribute * @exception ConfigurationException If no parameter with that name exists. * or if conversion to int fails. */ public int getAttributeAsInteger( String paramName ) throws ConfigurationException { try { return m_base.getAttributeAsInteger( paramName ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsInteger( paramName ); } } /** * Returns the value of the attribute specified by its name as a * long. * * @param name The name of the parameter you ask the value of. * @return long value of attribute * @exception ConfigurationException If no parameter with that name exists. * or if conversion to long fails. */ public long getAttributeAsLong( String name ) throws ConfigurationException { try { return m_base.getAttributeAsLong( name ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsLong( name ); } } /** * Return the float value of the specified parameter contained * in this node. * @param paramName The name of the parameter you ask the value of. * @return float value of attribute * @exception ConfigurationException If no parameter with that name exists. * or if conversion to float fails. */ public float getAttributeAsFloat( String paramName ) throws ConfigurationException { try { return m_base.getAttributeAsFloat( paramName ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsFloat( paramName ); } } /** * Return the boolean value of the specified parameter contained * in this node. * * @param paramName The name of the parameter you ask the value of. * @return boolean value of attribute * @exception ConfigurationException If no parameter with that name exists. * or if conversion to boolean fails. */ public boolean getAttributeAsBoolean( String paramName ) throws ConfigurationException { try { return m_base.getAttributeAsBoolean( paramName ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsBoolean( paramName ); } } /** * Return the String value of the node. * * @return the value of the node. * @exception ConfigurationException May be raised by underlying * base or parent configuration. */ public String getValue() throws ConfigurationException { try { return m_base.getValue(); } catch( ConfigurationException e ) { return m_parent.getValue(); } } /** * Return the int value of the node. * @return int the value as an integer * @exception ConfigurationException If conversion to int fails. */ public int getValueAsInteger() throws ConfigurationException { try { return m_base.getValueAsInteger(); } catch( ConfigurationException e ) { return m_parent.getValueAsInteger(); } } /** * Return the float value of the node. * * @return the value of the node. * @exception ConfigurationException If conversion to float fails. */ public float getValueAsFloat() throws ConfigurationException { try { return m_base.getValueAsFloat(); } catch( ConfigurationException e ) { return m_parent.getValueAsFloat(); } } /** * Return the boolean value of the node. * * @return the value of the node. * @exception ConfigurationException If conversion to boolean fails. */ public boolean getValueAsBoolean() throws ConfigurationException { try { return m_base.getValueAsBoolean(); } catch( ConfigurationException e ) { return m_parent.getValueAsBoolean(); } } /** * Return the long value of the node. * * @return the value of the node. * @exception ConfigurationException If conversion to long fails. */ public long getValueAsLong() throws ConfigurationException { try { return m_base.getValueAsLong(); } catch( ConfigurationException e ) { return m_parent.getValueAsLong(); } } /** * Returns the value of the configuration element as a String. * If the configuration value is not set, the default value will be * used. * * @param defaultValue The default value desired. * @return String value of the Configuration, or default * if none specified. */ public String getValue( String defaultValue ) { try { return m_base.getValue(); } catch( ConfigurationException e ) { return m_parent.getValue( defaultValue ); } } /** * Returns the value of the configuration element as an int. * If the configuration value is not set, the default value will be * used. * * @param defaultValue The default value desired. * @return int value of the Configuration, or default * if none specified. */ public int getValueAsInteger( int defaultValue ) { try { return m_base.getValueAsInteger(); } catch( ConfigurationException e ) { return m_parent.getValueAsInteger( defaultValue ); } } /** * Returns the value of the configuration element as a long. * If the configuration value is not set, the default value will be * used. * * @param defaultValue The default value desired. * @return long value of the Configuration, or default * if none specified. */ public long getValueAsLong( long defaultValue ) { try { return m_base.getValueAsLong(); } catch( ConfigurationException e ) { return m_parent.getValueAsLong( defaultValue ); } } /** * Returns the value of the configuration element as a float. * If the configuration value is not set, the default value will be * used. * * @param defaultValue The default value desired. * @return float value of the Configuration, or default * if none specified. */ public float getValueAsFloat( float defaultValue ) { try { return m_base.getValueAsFloat(); } catch( ConfigurationException e ) { return m_parent.getValueAsFloat( defaultValue ); } } /** * Returns the value of the configuration element as a boolean. * If the configuration value is not set, the default value will be * used. * * @param defaultValue The default value desired. * @return boolean value of the Configuration, or default * if none specified. */ public boolean getValueAsBoolean( boolean defaultValue ) { try { return m_base.getValueAsBoolean(); } catch( ConfigurationException e ) { return m_parent.getValueAsBoolean( defaultValue ); } } /** * Returns the value of the attribute specified by its name as a * String, or the default value if no attribute by * that name exists or is empty. * * @param name The name of the attribute you ask the value of. * @param defaultValue The default value desired. * @return String value of attribute. It will return the default * value if the named attribute does not exist, or if * the value is not set. */ public String getAttribute( String name, String defaultValue ) { try { return m_base.getAttribute( name ); } catch( ConfigurationException e ) { return m_parent.getAttribute( name, defaultValue ); } } /** * Returns the value of the attribute specified by its name as a * int, or the default value if no attribute by * that name exists or is empty. * * @param name The name of the attribute you ask the value of. * @param defaultValue The default value desired. * @return int value of attribute. It will return the default * value if the named attribute does not exist, or if * the value is not set. */ public int getAttributeAsInteger( String name, int defaultValue ) { try { return m_base.getAttributeAsInteger( name ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsInteger( name, defaultValue ); } } /** * Returns the value of the attribute specified by its name as a * long, or the default value if no attribute by * that name exists or is empty. * * @param name The name of the attribute you ask the value of. * @param defaultValue The default value desired. * @return long value of attribute. It will return the default * value if the named attribute does not exist, or if * the value is not set. */ public long getAttributeAsLong( String name, long defaultValue ) { try { return m_base.getAttributeAsLong( name ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsLong( name, defaultValue ); } } /** * Returns the value of the attribute specified by its name as a * float, or the default value if no attribute by * that name exists or is empty. * * @param name The name of the attribute you ask the value of. * @param defaultValue The default value desired. * @return float value of attribute. It will return the default * value if the named attribute does not exist, or if * the value is not set. */ public float getAttributeAsFloat( String name, float defaultValue ) { try { return m_base.getAttributeAsFloat( name ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsFloat( name, defaultValue ); } } /** * Returns the value of the attribute specified by its name as a * boolean, or the default value if no attribute by * that name exists or is empty. * * @param name The name of the attribute you ask the value of. * @param defaultValue The default value desired. * @return boolean value of attribute. It will return the default * value if the named attribute does not exist, or if * the value is not set. */ public boolean getAttributeAsBoolean( String name, boolean defaultValue ) { try { return m_base.getAttributeAsBoolean( name ); } catch( ConfigurationException e ) { return m_parent.getAttributeAsBoolean( name, defaultValue ); } } } -- To unsubscribe, e-mail: For additional commands, e-mail: