proyal      2002/07/12 13:11:34

  Added:       src/java/org/apache/avalon/framework/configuration
                        ConfigurationUtil.java
  Log:
  * Moved from org.apache.excalibur.configuration.ConfigurationUtil (inside merlin)
   * Added branch() per thread http://marc.theaimsgroup.com/?t=102347724100002&r=1&w=2
  
  Revision  Changes    Path
  1.1                  
jakarta-avalon/src/java/org/apache/avalon/framework/configuration/ConfigurationUtil.java
  
  Index: ConfigurationUtil.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.
   *
   * Original contribution by OSM SARL, http://www.osm.net
   */
  
  package org.apache.avalon.framework.configuration;
  
  import java.util.Vector;
  
  import org.apache.avalon.framework.CascadingRuntimeException;
  
  /**
   * General utility supporting static operations for generating string
   * representations of a configuration suitable for debugging.
   * @author Stephen McConnell <[EMAIL PROTECTED]>
   */
  public class ConfigurationUtil
  {
      private static final Configuration[] EMPTY_CONFS = new Configuration[0];
  
      /**
       * Returns a simple string representation of the the supplied configuration.
       * @param config a configuration
       * @return a simplified text representation of a configuration suitable
       *     for debugging
       */
      public static String list( Configuration config )
      {
          final StringBuffer buffer = new StringBuffer();
          list( buffer, "  ", config );
          buffer.append( "\n" );
          return buffer.toString();
      }
  
      private static void list( StringBuffer buffer, String lead, Configuration config 
)
      {
  
          buffer.append( "\n" + lead + "<" + config.getName() );
          String[] names = config.getAttributeNames();
          if( names.length > 0 )
          {
              for( int i = 0; i < names.length; i++ )
              {
                  buffer.append( " "
                                 + names[i] + "=\""
                                 + config.getAttribute( names[i], "???" ) + "\"" );
              }
          }
          Configuration[] children = config.getChildren();
          if( children.length > 0 )
          {
              buffer.append( ">" );
              for( int j = 0; j < children.length; j++ )
              {
                  list( buffer, lead + "  ", children[j] );
              }
              buffer.append( "\n" + lead + "</" + config.getName() + ">" );
          }
          else
          {
              if( config.getValue( null ) != null )
              {
                  buffer.append( ">...</" + config.getName() + ">" );
              }
              else
              {
                  buffer.append( "/>" );
              }
          }
      }
  
      /**
       * Return all occurance of a configuration child containing the supplied 
attribute name.
       * @param config the configuration
       * @param element the name of child elements to select from the configuration
       * @param attribute the attribute name to filter
       * @param value the attribute value to match (null will match any attribute 
value)
       * @return an array of configuration instances matching the query
       */
      public static Configuration[] match( Configuration config, String element, 
String attribute )
      {
          return match( config, element, attribute, null );
      }
  
      /**
       * Return occurance of a configuration child containing the supplied attribute 
name and value.
       * @param config the configuration
       * @param element the name of child elements to select from the configuration
       * @param attribute the attribute name to filter
       * @param value the attribute value to match (null will match any attribute 
value)
       * @return an array of configuration instances matching the query
       */
      public static Configuration[] match(
        final Configuration config, final String element, final String attribute, 
final String value )
      {
          Vector vector = new Vector();
  
          Configuration[] children = config.getChildren( element );
          for( int i = 0; i < children.length; i++ )
          {
              String v = children[i].getAttribute( attribute, null );
              if( v != null )
              {
                  if( ( value == null ) || v.equals( value ) )
                  {
                      // it's a match
                      vector.add( children[i] );
                  }
              }
          }
          return ( Configuration[] ) vector.toArray( EMPTY_CONFS );
      }
  
      /**
       * Return the first occurance of a configuration child containing the supplied 
attribute name and value
       * or create a new empty configuration if no match found.
       * @param config the configuration
       * @param element the name of child elements to select from the configuration
       * @param attribute the attribute name to filter
       * @param value the attribute value to match (null will match any attribute 
value)
       * @return a configuration instances matching the query or empty configuration
       */
      public static Configuration matchFirstOccurance(
        Configuration config, String element, String attribute, String value )
      {
          try
          {
              return matchFirstOccurance( config, element, attribute, value, true );
          }
          catch( ConfigurationException e )
          {
              // will not happen
              throw new CascadingRuntimeException( "Unexpected exception condition.", 
e );
          }
      }
  
      /**
       * Return the first occurance of a configuration child containing the supplied 
attribute
       * name and value.  If the supplied creation policy if TRUE and no match is 
found, an
       * empty configuration instance is returned, otherwise a null will returned.
       * @param config the configuration
       * @param element the name of child elements to select from the configuration
       * @param attribute the attribute name to filter
       * @param value the attribute value to match (null will match any attribute 
value)
       * @param create the creation policy if no match
       * @return a configuration instances matching the query
       */
      public static Configuration matchFirstOccurance(
        Configuration config, String element, String attribute, String value, boolean 
create )
        throws ConfigurationException
      {
          Configuration[] children = config.getChildren( element );
          for( int i = 0; i < children.length; i++ )
          {
              String v = children[i].getAttribute( attribute, null );
              if( v != null )
              {
                  if( ( value == null ) || v.equals( value ) )
                  {
                      // it's a match
                      return children[i];
                  }
              }
          }
  
          if( create )
              return new DefaultConfiguration( element, null );
          return null;
      }
  
      public static Configuration branch( final Configuration config, final String 
name )
      {
          final DefaultConfiguration c = createNew( config, name );
          final String[] attributes = config.getAttributeNames();
          final Configuration[] kids = config.getChildren();
  
          c.setValue( config.getValue( null ) );
  
          for( int i = 0; i < attributes.length; i++ )
          {
              try
              {
                  c.setAttribute( attributes[i], config.getAttribute( attributes[i] ) 
);
              }
              catch( ConfigurationException e )
              {
                  throw new CascadingRuntimeException( "Configuration is missing 
advertised attribute", e );
              }
          }
  
          for( int i = 0; i < kids.length; i++ )
          {
              c.addChild( kids[i] );
          }
  
          c.makeReadOnly();
  
          return c;
      }
  
      private static DefaultConfiguration createNew( final Configuration config, final 
String name )
      {
          if( config instanceof AbstractConfiguration )
          {
              try
              {
                  return new DefaultConfiguration( name,
                                                   config.getLocation(),
                                                   config.getNamespace(),
                                                   ( ( AbstractConfiguration ) config 
).getPrefix() );
              }
              catch( ConfigurationException e )
              {
                  //Ignore. If there is an error in the namespaces, we won't copy 
namespaces stuff
              }
          }
  
          return new DefaultConfiguration( name, config.getLocation() );
      }
  }
  
  
  
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to