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:[EMAIL PROTECTED]">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: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>