You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by bl...@apache.org on 2002/06/07 22:04:11 UTC

cvs commit: jakarta-avalon/src/proposal/avalon5/org/apache/framework/service/impl DefaultServiceManager.java

bloritsch    2002/06/07 13:04:11

  Modified:    src/proposal/avalon5/org/apache/framework/configuration/impl
                        DefaultConfiguration.java
                        DefaultConfigurationSerializer.java
  Added:       src/proposal/avalon5/org/apache/framework/component
                        ComponentException.java ComponentManager.java
                        Composable.java package.html
               src/proposal/avalon5/org/apache/framework/component/impl
                        DefaultComponentManager.java
               src/proposal/avalon5/org/apache/framework/configuration/impl
                        AbstractConfiguration.java
  Removed:     src/proposal/avalon5/org/apache/framework/configuration
                        AbstractConfiguration.java
               src/proposal/avalon5/org/apache/framework/service
                        ServiceException.java ServiceManager.java
                        Serviceable.java package.html
               src/proposal/avalon5/org/apache/framework/service/impl
                        DefaultServiceManager.java
  Log:
  update avalon5 interfaces with what they should be
  
  Revision  Changes    Path
  1.1                  jakarta-avalon/src/proposal/avalon5/org/apache/framework/component/ComponentException.java
  
  Index: ComponentException.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.framework.component;
  
  /**
   * The exception thrown to indicate a problem with service.
   * It is usually thrown by ComponentManager or ServiceSelector.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:fumagalli@exoffice.com">Pierpaolo Fumagalli</a>
   * @author <a href="mailto:fede@apache.org">Federico Barbieri</a>
   * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   */
  public class ComponentException
      extends RuntimeException
  {
      /**
       * The Throwable that caused this exception to be thrown.
       */
      private final Throwable m_throwable;
  
      /**
       * Construct a new <code>ComponentException</code> instance.
       *
       * @param message the exception message
       */
      public ComponentException( final String message )
      {
          this( message, null );
      }
  
      /**
       * Construct a new <code>ComponentException</code> instance.
       *
       * @param message the exception message
       * @param throwable the throwable
       */
      public ComponentException( final String message, final Throwable throwable )
      {
          super( message );
          m_throwable = throwable;
      }
  
      /**
       * Retrieve root cause of the exception.
       *
       * @return the root cause
       */
      public final Throwable getCause()
      {
          return m_throwable;
      }
  }
  
  
  
  1.1                  jakarta-avalon/src/proposal/avalon5/org/apache/framework/component/ComponentManager.java
  
  Index: ComponentManager.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.framework.component;
  
  /**
   * A <code>ComponentManager</code> selects <code>Object</code>s based on a
   * role.  The contract is that all the <code>Object</code>s implement the
   * differing roles and there is one <code>Object</code> per role.  If you
   * need to select on of many <code>Object</code>s that implement the same
   * role, then you need to use a <code>ServiceSelector</code>.  Roles are
   * usually the full interface name.
   *
   * A role is better understood by the analogy of a play.  There are many
   * different roles in a script.  Any actor or actress can play any given part
   * and you get the same results (phrases said, movements made, etc.).  The exact
   * nuances of the performance is different.
   *
   * Below is a list of things that might be considered the different roles:
   *
   * <ul>
   *   <li> InputAdaptor and OutputAdaptor</li>
   *   <li> Store and Spool</li>
   * </ul>
   *
   * The <code>ComponentManager</code> does not specify the methodology of
   * getting the <code>Object</code>, merely the interface used to get it.
   * Therefore the <code>ComponentManager</code> can be implemented with a
   * factory pattern, an object pool, or a simple Hashtable.
   *
   * @author <a href="mailto:scoobie@betaversion.org">Federico Barbieri</a>
   * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
   * @author <a href="mailto:fumagalli@exoffice.com">Pierpaolo Fumagalli</a>
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version 1.0
   * @see org.apache.framework.component.Composable
   */
  public interface ComponentManager
  {
      /**
       * Get the <code>Object</code> associated with the given role.  For
       * instance, If the <code>ComponentManager</code> had a
       * <code>LoggerComponent</code> stored and referenced by role, I would use
       * the following call:
       * <pre>
       * try
       * {
       *     MyComponent log;
       *     myComponent = (MyComponent) manager.lookup(MyComponent.ROLE);
       * }
       * catch (...)
       * {
       *     ...
       * }
       * </pre>
       *
       * @param role The role name of the <code>Object</code> to retrieve.
       * @return an <code>Object</code> value
       * @throws ComponentException if the component is not available
       */
      Object lookup( String role );
  
      /**
       * Get the <code>Object</code> associated with the given role.  For
       * instance, If the <code>ComponentManager</code> had a
       * <code>LoggerComponent</code> stored and referenced by role, I would use
       * the following call:
       * <pre>
       * try
       * {
       *     MyComponent log;
       *     myComponent = (MyComponent) manager.lookup(MyComponent.ROLE,
       *                                                "myhint");
       * }
       * catch (...)
       * {
       *     ...
       * }
       * </pre>
       *
       * @param role The role name of the <code>Object</code> to retrieve.
       * @return an <code>Object</code> value
       * @throws ComponentException if the component is not available
       */
      Object lookup( String role, Object hint );
  
      /**
       * Check to see if a <code>Object</code> exists for a role.
       *
       * @param role  a string identifying the role to check.
       * @return True if the object exists, False if it does not.
       */
      boolean exists( String role );   
  }
  
  
  
  1.1                  jakarta-avalon/src/proposal/avalon5/org/apache/framework/component/Composable.java
  
  Index: Composable.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.framework.component;
  
  /**
   * A Composable is a class that need to connect to software components using
   * a "role" abstraction, thus not depending on particular implementations
   * but on behavioral interfaces.
   * <br />
   *
   * The contract surrounding a <code>Composable</code> is that it is a user.
   * The <code>Composable</code> is able to use <code>Object</code>s managed
   * by the <code>ComponentManager</code> it was initialized with.  As part
   * of the contract with the system, the instantiating entity must call
   * the <code>compose</code> method before the <code>Composable</code>
   * can be considered valid.
   *
   * @author <a href="mailto:fede@apache.org">Federico Barbieri</a>
   * @author <a href="mailto:pier@apache.org">Pierpaolo Fumagalli</a>
   * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version 1.0
   * @see org.apache.framework.component.ComponentManager
   *
   */
  public interface Composable
  {
      /**
       * Pass the <code>ComponentManager</code> to the <code>Composable</code>.
       * The <code>Composable</code> implementation should use the specified
       * <code>ComponentManager</code> to acquire the components it needs for
       * execution.
       *
       * @param manager The <code>ComponentManager</code> which this
       *                <code>Composable</code> uses.
       * @exception ComponentException if an error occurs
       */
      void compose( ComponentManager manager )
          throws ComponentException;
  }
  
  
  
  1.1                  jakarta-avalon/src/proposal/avalon5/org/apache/framework/component/package.html
  
  Index: package.html
  ===================================================================
  <body>
  Interfaces and default implementation of a service management framework supporting container based service lookup and decommissioning. 
  </body>
  
  
  
  1.1                  jakarta-avalon/src/proposal/avalon5/org/apache/framework/component/impl/DefaultComponentManager.java
  
  Index: DefaultComponentManager.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.framework.component.impl;
  
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Map;
  import org.apache.framework.component.ComponentManager;
  import org.apache.framework.component.ComponentException;
  
  /**
   * This class is a static implementation of a ComponentManager. Allow ineritance
   * and extension so you can generate a tree of ComponentManager each defining
   * Object scope.
   *
   * @author <a href="mailto:fede@apache.org">Federico Barbieri</a>
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version 1.0
   */
  public class DefaultComponentManager
      implements ComponentManager
  {
      private final HashMap               m_objects = new HashMap();
      private final ComponentManager      m_parent;
      private boolean                     m_readOnly;
  
      /**
       * Construct ComponentManager with no parent.
       *
       */
      public DefaultComponentManager()
      {
          this( null );
      }
  
      /**
       * Construct ComponentManager with specified parent.
       *
       * @param parent the ComponentManager parent
       */
      public DefaultComponentManager( final ComponentManager parent )
      {
          m_parent = parent;
      }
  
      /**
       * Retrieve Object by role from ComponentManager.
       *
       * @param role the role
       * @return the Object
       * @exception org.apache.framework.component.ComponentException if an error occurs
       */
      public Object lookup( final String role )
      {
          return lookup( role, null );
      }
  
      /**
       * Retrieve Object by role/hint from ComponentManager.
       *
       * @param role the role
       * @return the Object
       * @exception org.apache.framework.component.ComponentException if an error occurs
       */
      public Object lookup( final String role, Object hint )
      {
          // the default version of the method ignores the hint
          final Object object = m_objects.get( role );
  
          if( null != object )
          {
              return object;
          }
          else if( null != m_parent )
          {
              return m_parent.lookup( role );
          }
          else
          {
              throw new ComponentException( "Unable to provide implementation for " + role );
          }
      }
  
      /**
       * Check to see if a <code>Object</code> exists for a role.
       *
       * @param role  a string identifying the role to check.
       * @return True if the object exists, False if it does not.
       */
      public boolean exists( final String role )
      {
          boolean objectExists = false;
  
          try
          {
              this.lookup(role);
              objectExists = true;
          }
          catch (Throwable t)
          {
              // Ignore all throwables--we want a yes or no answer.
          }
          return objectExists;
      }
  
      /**
       * Place Object into ComponentManager.
       *
       * @param role the components role
       * @param object an <code>Object</code> value
       */
      public void put( final String role, final Object object )
      {
          checkWriteable();
          m_objects.put( role, object );
      }
  
      /**
       * Build a human readable representation of the ComponentManager.
       *
       * @return the description of the ComponentManager
       */
      public String toString()
      {
          final StringBuffer buffer = new StringBuffer();
          final Iterator objects = m_objects.keySet().iterator();
          buffer.append( "Services:" );
  
          while( objects.hasNext() )
          {
              buffer.append( "[" );
              buffer.append( objects.next() );
              buffer.append( "]" );
          }
  
          return buffer.toString();
      }
  
      /**
       * Helper method for subclasses to retrieve parent.
       *
       * @return the parent ComponentManager
       */
      protected final ComponentManager getParent()
      {
          return m_parent;
      }
  
      /**
       * Helper method for subclasses to retrieve object map.
       *
       * @return the object map
       */
      protected final Map getObjectMap()
      {
          return m_objects;
      }
  
      /**
       * Makes this service manager read-only.
       *
       */
      public void makeReadOnly()
      {
          m_readOnly = true;
      }
  
      /**
       * Checks if this service manager is writeable.
       *
       * @exception java.lang.IllegalStateException if this service manager is read-only
       */
      protected final void checkWriteable()
          throws IllegalStateException
      {
          if( m_readOnly )
          {
              throw new IllegalStateException
                  ( "ComponentManager is read only and can not be modified" );
          }
      }
  
      
  }
  
  
  
  1.2       +0 -1      jakarta-avalon/src/proposal/avalon5/org/apache/framework/configuration/impl/DefaultConfiguration.java
  
  Index: DefaultConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/proposal/avalon5/org/apache/framework/configuration/impl/DefaultConfiguration.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultConfiguration.java	31 Mar 2002 13:27:56 -0000	1.1
  +++ DefaultConfiguration.java	7 Jun 2002 20:04:11 -0000	1.2
  @@ -10,7 +10,6 @@
   import java.io.Serializable;
   import java.util.ArrayList;
   import java.util.HashMap;
  -import org.apache.framework.configuration.AbstractConfiguration;
   import org.apache.framework.configuration.Configuration;
   import org.apache.framework.configuration.ConfigurationException;
   
  
  
  
  1.2       +0 -1      jakarta-avalon/src/proposal/avalon5/org/apache/framework/configuration/impl/DefaultConfigurationSerializer.java
  
  Index: DefaultConfigurationSerializer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/proposal/avalon5/org/apache/framework/configuration/impl/DefaultConfigurationSerializer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultConfigurationSerializer.java	31 Mar 2002 13:27:56 -0000	1.1
  +++ DefaultConfigurationSerializer.java	7 Jun 2002 20:04:11 -0000	1.2
  @@ -23,7 +23,6 @@
   import org.xml.sax.helpers.NamespaceSupport;
   import org.apache.framework.configuration.Configuration;
   import org.apache.framework.configuration.ConfigurationException;
  -import org.apache.framework.configuration.AbstractConfiguration;
   
   /**
    * A ConfigurationSerializer serializes configurations via SAX2 compliant parser.
  
  
  
  1.1                  jakarta-avalon/src/proposal/avalon5/org/apache/framework/configuration/impl/AbstractConfiguration.java
  
  Index: AbstractConfiguration.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.framework.configuration.impl;
  
  import org.apache.framework.configuration.Configuration;
  import org.apache.framework.configuration.ConfigurationException;
  
  /**
   * This is an abstract <code>Configuration</code> implementation that deals
   * with methods that can be abstracted away from underlying implementations.
   *
   * @author <a href="mailto:fede@apache.org">Federico Barbieri</a>
   * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:fumagalli@exoffice.com">Pierpaolo Fumagalli</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/06/07 20:04:11 $
   */
  public abstract class AbstractConfiguration
      implements Configuration
  {
      /**
       * Returns the prefix of the namespace.  This is only used as a serialization
       * hint, therefore is not part of the client API.  It should be included in
       * all Configuration implementations though.
       * @return A non-null String (defaults to "")
       * @throws ConfigurationException if no prefix was defined (prefix is
       * <code>null</code>.
       */
      protected abstract String getPrefix() throws ConfigurationException;
  
      /**
       * Returns the value of the configuration element as an <code>int</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public int getValueAsInteger()
          throws ConfigurationException
      {
          final String value = getValue();
          try
          {
              if( value.startsWith( "0x" ) )
              {
                  return Integer.parseInt( value.substring( 2 ), 16 );
              }
              else if( value.startsWith( "0o" ) )
              {
                  return Integer.parseInt( value.substring( 2 ), 8 );
              }
              else if( value.startsWith( "0b" ) )
              {
                  return Integer.parseInt( value.substring( 2 ), 2 );
              }
              else
              {
                  return Integer.parseInt( value );
              }
          }
          catch( final Exception nfe )
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as an integer in the configuration element \"" +
                                                getName() + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the configuration element as an <code>int</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public int getValueAsInteger( final int defaultValue )
      {
          try
          {
              return getValueAsInteger();
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>long</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public long getValueAsLong()
          throws ConfigurationException
      {
          final String value = getValue();
          try
          {
              if( value.startsWith( "0x" ) )
              {
                  return Long.parseLong( value.substring( 2 ), 16 );
              }
              else if( value.startsWith( "0o" ) )
              {
                  return Long.parseLong( value.substring( 2 ), 8 );
              }
              else if( value.startsWith( "0b" ) )
              {
                  return Long.parseLong( value.substring( 2 ), 2 );
              }
              else
              {
                  return Integer.parseInt(value);
              }
          }
          catch( final Exception nfe )
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as a long in the configuration element \"" +
                                                getName() + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>long</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public long getValueAsLong( final long defaultValue )
      {
          try
          {
              return getValueAsLong();
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>float</code>.
       *
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public float getValueAsFloat()
          throws ConfigurationException
      {
          final String value = getValue();
          try
          {
              return Float.parseFloat( value );
          }
          catch( final Exception nfe )
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as a float in the configuration element \"" +
                                                getName() + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>float</code>.
       *
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public float getValueAsFloat( final float defaultValue )
      {
          try
          {
              return getValueAsFloat();
          }
          catch( final ConfigurationException ce )
          {
              return(defaultValue);
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>boolean</code>.
       *
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public boolean getValueAsBoolean()
          throws ConfigurationException
      {
          final String value = getValue();
          if( value.equals( "true" ) )
          {
              return true;
          }
          else if( value.equals( "false" ) )
          {
              return false;
          }
          else
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as a boolean in the configuration element \"" +
                                                getName() + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>boolean</code>.
       *
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public boolean getValueAsBoolean( final boolean defaultValue )
      {
          try
          {
              return getValueAsBoolean();
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the configuration element as a <code>String</code>.
       *
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public String getValue( final String defaultValue )
      {
          try
          {
              return getValue();
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as an
       * <code>int</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @param name the name of the attribute
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public int getAttributeAsInteger( final String name )
          throws ConfigurationException
      {
          final String value = getAttribute( name );
          try
          {
              if( value.startsWith( "0x" ) )
              {
                  return Integer.parseInt( value.substring( 2 ), 16 );
              }
              else if( value.startsWith( "0o" ) )
              {
                  return Integer.parseInt( value.substring( 2 ), 8);
              }
              else if( value.startsWith( "0b" ) )
              {
                  return Integer.parseInt( value.substring( 2 ), 2 );
              }
              else
              {
                  return Integer.parseInt(value);
              }
          }
          catch( final Exception nfe )
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as an integer in the attribute \"" +
                                                name + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as an
       * <code>int</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @param name the name of the attribute
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public int getAttributeAsInteger( final String name, final int defaultValue )
      {
          try
          {
              return getAttributeAsInteger( name );
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>long</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @param name the name of the attribute
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public long getAttributeAsLong( final String name )
          throws ConfigurationException
      {
          final String value = getAttribute( name );
  
          try
          {
              if( value.startsWith( "0x" ) )
              {
                  return Long.parseLong( value.substring( 2 ), 16 );
              }
              else if( value.startsWith( "0o" ) )
              {
                  return Long.parseLong( value.substring( 2 ), 8 );
              }
              else if( value.startsWith( "0b" ) )
              {
                  return Long.parseLong( value.substring( 2 ), 2);
              }
              else
              {
                  return Long.parseLong( value );
              }
          }
          catch( final Exception nfe )
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as a long in the attribute \"" +
                                                name + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>long</code>.
       *
       * Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
       * numbers begin with 0b, all other values are assumed to be decimal.
       *
       * @param name the name of the attribute
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public long getAttributeAsLong( final String name, final long defaultValue )
      {
          try
          {
              return getAttributeAsLong( name );
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>float</code>.
       *
       * @param name the name of the attribute
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public float getAttributeAsFloat( final String name )
          throws ConfigurationException
      {
          final String value = getAttribute( name );
          try
          {
              return Float.parseFloat( value );
          }
          catch( final Exception e )
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as a float in the attribute \"" +
                                                name + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>float</code>.
       *
       * @param name the name of the attribute
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public float getAttributeAsFloat( final String name, final float defaultValue )
      {
          try
          {
              return getAttributeAsFloat( name );
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>boolean</code>.
       *
       * @param name the name of the attribute
       * @exception ConfigurationException if an error occurs
       * @return the value
       */
      public boolean getAttributeAsBoolean( final String name )
          throws ConfigurationException
      {
          final String value = getAttribute( name );
  
          if( value.equalsIgnoreCase( "true" ) )
          {
              return true;
          }
          else if( value.equalsIgnoreCase( "false" ) )
          {
              return false;
          }
          else
          {
              throw new ConfigurationException( "Cannot parse the value \"" + value +
                                                "\" as a boolean in the attribute \"" +
                                                name + "\" at " + getLocation() );
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>boolean</code>.
       *
       * @param name the name of the attribute
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public boolean getAttributeAsBoolean( final String name, final boolean defaultValue )
      {
          try
          {
              return getAttributeAsBoolean( name );
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Returns the value of the attribute specified by its name as a
       * <code>String</code>.
       *
       * @param name the name of the attribute
       * @param defaultValue the default value to return if value malformed or empty
       * @return the value
       */
      public String getAttribute( final String name, final String defaultValue )
      {
          try
          {
              return getAttribute( name );
          }
          catch( final ConfigurationException ce )
          {
              return defaultValue;
          }
      }
  
      /**
       * Return the first <code>Configuration</code> object child of this
       * associated with the given name. If no such child exists, a new one
       * will be created.
       *
       * @param name the name of the child
       * @return the child Configuration
       */
      public Configuration getChild( final String name )
      {
          return getChild( name, true );
      }
  
      /**
       * Return the first <code>Configuration</code> object child of this
       * associated with the given name.
       *
       * @param name the name of the child
       * @param createNew true if you want to create a new Configuration object if none exists
       * @return the child Configuration
       */
      public Configuration getChild( final String name, final boolean createNew )
      {
          final Configuration[] children = getChildren( name );
          if( children.length > 0 )
          {
              return children[ 0 ];
          }
          else
          {
              if( createNew )
              {
                  return new DefaultConfiguration( name, "-" );
              }
              else
              {
                  return null;
              }
          }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>