You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by do...@apache.org on 2002/11/16 14:48:40 UTC

cvs commit: jakarta-avalon/src/java/org/apache/avalon/framework/configuration ConfigurationUtil.java

donaldp     2002/11/16 05:48:40

  Modified:    src/java/org/apache/avalon/framework/configuration Tag:
                        FORREST-branch ConfigurationUtil.java
  Log:
  Migrate equals into framework
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.5.2.1   +120 -1    jakarta-avalon/src/java/org/apache/avalon/framework/configuration/ConfigurationUtil.java
  
  Index: ConfigurationUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/avalon/framework/configuration/ConfigurationUtil.java,v
  retrieving revision 1.5
  retrieving revision 1.5.2.1
  diff -u -r1.5 -r1.5.2.1
  --- ConfigurationUtil.java	7 Nov 2002 08:35:27 -0000	1.5
  +++ ConfigurationUtil.java	16 Nov 2002 13:48:40 -0000	1.5.2.1
  @@ -13,12 +13,16 @@
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
   import org.w3c.dom.Text;
  +import java.util.ArrayList;
  +import java.util.Arrays;
  +import java.util.Iterator;
   
   /**
    * This class has a bunch of utility methods to work
    * with configuration objects.
    *
    * @author <a href="mailto:peter at apache.org">Peter Donald</a>
  + * @author <a href="mailto:proyal@apache.org">Peter Royal</a>
    * @version $Revision$ $Date$
    */
   public class ConfigurationUtil
  @@ -50,6 +54,121 @@
           {
               throw new IllegalStateException( pce.toString() );
           }
  +    }
  +
  +    /**
  +     * Test to see if two Configuration's can be considered the same. Name, value, attributes
  +     * and children are test. The <b>order</b> of children is not taken into consideration
  +     * for equality.
  +     *
  +     * @param c1 Configuration to test
  +     * @param c2 Configuration to test
  +     * @return true if the configurations can be considered equals
  +     */
  +    public static boolean equals( final Configuration c1, final Configuration c2 )
  +    {
  +        return c1.getName().equals( c2.getName() )
  +            && areValuesEqual( c1, c2 )
  +            && areAttributesEqual( c1, c2 )
  +            && areChildrenEqual( c1, c2 );
  +    }
  +
  +    /**
  +     * Return true if the children of both configurations are equal.
  +     *
  +     * @param c1 configuration1
  +     * @param c2 configuration2
  +     * @return true if the children of both configurations are equal.
  +     */
  +    private static boolean areChildrenEqual( final Configuration c1,
  +                                             final Configuration c2 )
  +    {
  +        final Configuration[] kids1 = c1.getChildren();
  +        final ArrayList kids2 = new ArrayList( Arrays.asList( c2.getChildren() ) );
  +        if( kids1.length != kids2.size() )
  +        {
  +            return false;
  +        }
  +
  +        for( int i = 0; i < kids1.length; i++ )
  +        {
  +            if( !findMatchingChild( kids1[ i ], kids2 ) )
  +            {
  +                return false;
  +            }
  +        }
  +
  +        return kids2.isEmpty() ? true : false;
  +    }
  +
  +    /**
  +     * Return true if find a matching child and remove child from list.
  +     *
  +     * @param c the configuration
  +     * @param matchAgainst the list of items to match against
  +     * @return true if the found.
  +     */
  +    private static boolean findMatchingChild( final Configuration c,
  +                                              final ArrayList matchAgainst )
  +    {
  +        final Iterator i = matchAgainst.iterator();
  +        while( i.hasNext() )
  +        {
  +            if( equals( c, (Configuration)i.next() ) )
  +            {
  +                i.remove();
  +                return true;
  +            }
  +        }
  +
  +        return false;
  +    }
  +
  +    /**
  +     * Return true if the attributes of both configurations are equal.
  +     *
  +     * @param c1 configuration1
  +     * @param c2 configuration2
  +     * @return true if the attributes of both configurations are equal.
  +     */
  +    private static boolean areAttributesEqual( final Configuration c1,
  +                                               final Configuration c2 )
  +    {
  +        final String[] names1 = c1.getAttributeNames();
  +        final String[] names2 = c2.getAttributeNames();
  +        if( names1.length != names2.length )
  +        {
  +            return false;
  +        }
  +
  +        for( int i = 0; i < names1.length; i++ )
  +        {
  +            final String name = names1[ i ];
  +            final String value1 = c1.getAttribute( name, null );
  +            final String value2 = c2.getAttribute( name, null );
  +            if( !value1.equals( value2 ) )
  +            {
  +                return false;
  +            }
  +        }
  +
  +        return true;
  +    }
  +
  +    /**
  +     * Return true if the values of two configurations are equal.
  +     *
  +     * @param c1 configuration1
  +     * @param c2 configuration2
  +     * @return true if the values of two configurations are equal.
  +     */
  +    private static boolean areValuesEqual( final Configuration c1,
  +                                           final Configuration c2 )
  +    {
  +        final String value1 = c1.getValue( null );
  +        final String value2 = c2.getValue( null );
  +        return ( value1 == null && value2 == null ) ||
  +            ( value1 != null && value1.equals( value2 ) );
       }
   
       /**
  
  
  

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