Return-Path: Mailing-List: contact commons-dev-help@jakarta.apache.org; run by ezmlm Delivered-To: mailing list commons-dev@jakarta.apache.org Received: (qmail 90707 invoked by uid 500); 20 Aug 2003 21:03:16 -0000 Received: (qmail 90682 invoked from network); 20 Aug 2003 21:03:15 -0000 Received: from unknown (HELO minotaur.apache.org) (209.237.227.194) by daedalus.apache.org with SMTP; 20 Aug 2003 21:03:15 -0000 Received: (qmail 78059 invoked by uid 1529); 20 Aug 2003 21:03:16 -0000 Date: 20 Aug 2003 21:03:16 -0000 Message-ID: <20030820210316.78058.qmail@minotaur.apache.org> From: scolebourne@apache.org To: jakarta-commons-cvs@apache.org Subject: cvs commit: jakarta-commons/collections/src/java/org/apache/commons/collections MapUtils.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N scolebourne 2003/08/20 14:03:16 Modified: collections/src/test/org/apache/commons/collections TestMapUtils.java collections/src/java/org/apache/commons/collections MapUtils.java Log: Fix debugPrint(Map) methods to handle more than just String keys bug 20740, from Max Rydahl Anderson Revision Changes Path 1.6 +25 -3 jakarta-commons/collections/src/test/org/apache/commons/collections/TestMapUtils.java Index: TestMapUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/TestMapUtils.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- TestMapUtils.java 26 Apr 2003 14:27:46 -0000 1.5 +++ TestMapUtils.java 20 Aug 2003 21:03:16 -0000 1.6 @@ -57,6 +57,8 @@ */ package org.apache.commons.collections; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -67,7 +69,6 @@ import junit.framework.Test; - /** * Tests for MapUtils. * @@ -75,6 +76,7 @@ * * @author Stephen Colebourne * @author Arun Mammen Thomas + * @author Max Rydahl Andersen */ public class TestMapUtils extends BulkTest { @@ -309,5 +311,25 @@ final Map out = MapUtils.toMap(b); assertTrue( in.equals(out)); + } + + public void testDebugAndVerbosePrintCasting() { + final Map inner = new HashMap(2, 1); + inner.put( new Integer(2) , "B" ); + inner.put( new Integer(3) , "C" ); + + final Map outer = new HashMap(2, 1); + outer.put( new Integer(0) , inner ); + outer.put( new Integer(1) , "A"); + + + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + final PrintStream outPrint = new PrintStream(out); + + try { + MapUtils.debugPrint(outPrint, "Print Map", outer); + } catch (final ClassCastException e) { + fail("No Casting should be occurring!"); + } } } 1.26 +72 -53 jakarta-commons/collections/src/java/org/apache/commons/collections/MapUtils.java Index: MapUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/MapUtils.java,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- MapUtils.java 20 Jun 2003 07:50:21 -0000 1.25 +++ MapUtils.java 20 Aug 2003 21:03:16 -0000 1.26 @@ -115,6 +115,7 @@ * @author Matthew Hawthorne * @author Arun Mammen Thomas * @author Janek Bogucki + * @author Max Rydahl Andersen */ public class MapUtils { @@ -679,69 +680,34 @@ * Prints the given map with nice line breaks. * * @param out the stream to print to - * @param key the key that maps to the map in some other map + * @param label the label to be applied to the output generated. This + * may well be the key associated with this map within a + * surrounding map in which this is nested. * @param map the map to print */ - public static synchronized void verbosePrint( PrintStream out, Object key, Map map ) { - debugPrintIndent( out ); - out.println( key + " = " ); + public static synchronized void verbosePrint( + final PrintStream out, + final Object label, + final Map map) { - debugPrintIndent( out ); - out.println( "{" ); - ++debugIndent; - - for ( Iterator iter = map.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry) iter.next(); - String childKey = (String) entry.getKey(); - Object childValue = entry.getValue(); - if ( childValue instanceof Map ) { - verbosePrint( out, childKey, (Map) childValue ); - } - else { - debugPrintIndent( out ); - out.println( childKey + " = " + childValue); - } - } - --debugIndent; - debugPrintIndent( out ); - out.println( "}" ); + verbosePrintInternal(out, label, map, false); } /** * Prints the given map with nice line breaks. * * @param out the stream to print to - * @param key the key that maps to the map in some other map + * @param label the label to be applied to the output generated. This + * may well be the key associated with this map within a + * surrounding map in which this is nested. * @param map the map to print */ - public static synchronized void debugPrint( PrintStream out, Object key, Map map ) { - debugPrintIndent( out ); - out.println( key + " = " ); + public static synchronized void debugPrint( + final PrintStream out, + final Object label, + final Map map) { - debugPrintIndent( out ); - out.println( "{" ); - ++debugIndent; - - for ( Iterator iter = map.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry) iter.next(); - String childKey = (String) entry.getKey(); - Object childValue = entry.getValue(); - if ( childValue instanceof Map ) { - verbosePrint( out, childKey, (Map) childValue ); - } - else { - debugPrintIndent( out ); - - String typeName = ( childValue != null ) - ? childValue.getClass().getName() - : null; - - out.println( childKey + " = " + childValue + " class: " + typeName ); - } - } - --debugIndent; - debugPrintIndent( out ); - out.println( "}" ); + verbosePrintInternal(out, label, map, true); } // Implementation methods @@ -765,6 +731,59 @@ */ protected static void logInfo(Exception ex) { System.out.println("INFO: Exception: " + ex); + } + + /** + * Implementation providing functionality for {@link #debugPrint} and for + * {@link #verbosePrint}. This prints the given map with nice line breaks. + * If the debug flag is true, it additionally prints the type of the object + * value. . + * + * @param out the stream to print to + * @param label the label to be applied to the output generated. This + * may well be the key associated with this map within a + * surrounding map in which this is nested. + * @param map the map to print + * @param debug flag indicating whether type names should be output. + */ + private static void verbosePrintInternal( + final PrintStream out, + final Object label, + final Map map, + final boolean debug) { + + debugPrintIndent(out); + out.println(label + " = "); + + debugPrintIndent(out); + out.println("{"); + ++debugIndent; + + for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { + Map.Entry entry = (Map.Entry) iter.next(); + Object childKey = entry.getKey(); + Object childValue = entry.getValue(); + if (childValue instanceof Map) { + verbosePrintInternal(out, childKey, (Map) childValue, false); + } else { + debugPrintIndent(out); + + if (debug) { + String typeName = + (childValue != null) + ? childValue.getClass().getName() + : null; + + out.println( + childKey + " = " + childValue + " class: " + typeName); + } else { + out.println(childKey + " = " + childValue); + } + } + } + --debugIndent; + debugPrintIndent(out); + out.println("}"); } // Misc