scolebourne    2003/09/20 04:26:33

  Modified:    collections/src/java/org/apache/commons/collections
                        MapUtils.java
  Log:
  Make MapUtils threadsafe and remove synchronized keyword.
  Change is partially backwards incompatible:
  - protected method is removed
  - two threads outputting a Map may now overlap
  
  Revision  Changes    Path
  1.35      +35 -35    
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.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- MapUtils.java     17 Sep 2003 19:59:45 -0000      1.34
  +++ MapUtils.java     20 Sep 2003 11:26:32 -0000      1.35
  @@ -82,7 +82,7 @@
   import org.apache.commons.collections.decorators.TypedSortedMap;
   
   /** 
  - * A helper class for using [EMAIL PROTECTED] Map Map} instances.
  + * Provides useful utility methods for [EMAIL PROTECTED] Map Map} instances.
    * <p>
    * It contains various typesafe methods
    * as well as other useful features like deep copying.
  @@ -129,9 +129,9 @@
        * This is not provided in the JDK.
        */
       public static final SortedMap EMPTY_SORTED_MAP = 
Collections.unmodifiableSortedMap(new TreeMap());
  -
  -    private static int indentDepth = 0;  // must be synchronized
  -
  +    /**
  +     * String used to indent the verbose and debug Map prints.
  +     */
       private static final String INDENT_STRING = "    ";
   
       /**
  @@ -142,7 +142,6 @@
       
       // Type safe getters
       //-------------------------------------------------------------------------
  -
       /**
        *  Synonym for [EMAIL PROTECTED] Map#get(Object)}.
        *
  @@ -410,7 +409,6 @@
   
       // Type safe getters with default values
       //-------------------------------------------------------------------------
  -
       /**
        *  Looks up the given key in the given map, converting null into the
        *  given default value.
  @@ -633,7 +631,6 @@
   
       // Conversion methods
       //-------------------------------------------------------------------------
  -
       /**
        * Gets a new Properties object initialised with the values from a Map.
        * A null input will return an empty properties object.
  @@ -676,13 +673,15 @@
    
       // Printing methods
       //-------------------------------------------------------------------------
  -
       /**
        * Prints the given map with nice line breaks.
        * <p>
        * This method prints a nicely formatted String describing the Map.
        * Each map entry will be printed with key and value.
        * When the value is a Map, recursive behaviour occurs.
  +     * <p>
  +     * This method is NOT thread-safe in any special way. You must manually
  +     * synchronize on either this class or the stream as required.
        *
        * @param out  the stream to print to, must not be null
        * @param label  The label to be used, may be <code>null</code>.
  @@ -692,12 +691,11 @@
        *  If <code>null</code>, the text 'null' is output.
        * @throws NullPointerException if the stream is <code>null</code>
        */
  -    public static synchronized void verbosePrint(
  +    public static void verbosePrint(
           final PrintStream out,
           final Object label,
           final Map map) {
   
  -        indentDepth = 0;
           verbosePrintInternal(out, label, map, new ArrayStack(), false);
       }
   
  @@ -707,6 +705,9 @@
        * This method prints a nicely formatted String describing the Map.
        * Each map entry will be printed with key, value and value classname.
        * When the value is a Map, recursive behaviour occurs.
  +     * <p>
  +     * This method is NOT thread-safe in any special way. You must manually
  +     * synchronize on either this class or the stream as required.
        *
        * @param out  the stream to print to, must not be null
        * @param label  The label to be used, may be <code>null</code>.
  @@ -716,31 +717,20 @@
        *  If <code>null</code>, the text 'null' is output.
        * @throws NullPointerException if the stream is <code>null</code>
        */
  -    public static synchronized void debugPrint(
  +    public static void debugPrint(
           final PrintStream out,
           final Object label,
           final Map map) {
   
  -        indentDepth = 0;
           verbosePrintInternal(out, label, map, new ArrayStack(), true);
       }
   
       // Implementation methods
       //-------------------------------------------------------------------------
  -
  -    /**
  -     * Writes indentation to the given stream.
  -     *
  -     * @param out  the stream to indent
  -     */
  -    protected static void printIndent(final PrintStream out) {
  -        for (int i = 0; i < indentDepth; i++) {
  -            out.print(INDENT_STRING);
  -        }
  -    }
  -    
       /**
        * Logs the given exception to <code>System.out</code>.
  +     * <p>
  +     * This method exists as Jakarta Collections does not depend on logging.
        *
        * @param ex  the exception to log
        */
  @@ -768,18 +758,17 @@
        * @param lineage  a stack consisting of any maps in which the previous 
        *  argument is contained. This is checked to avoid infinite recursion when
        *  printing the output
  -     *                   
  -     * @param debug flag indicating whether type names should be output.
  +     * @param debug  flag indicating whether type names should be output.
        * @throws NullPointerException if the stream is <code>null</code>
        */
  -    private static void verbosePrintInternal(  // externally synchronized
  +    private static void verbosePrintInternal(
           final PrintStream out,
           final Object label,
           final Map map,
           final ArrayStack lineage,
           final boolean debug) {
           
  -        printIndent(out);
  +        printIndent(out, lineage.size());
   
           if (map == null) {
               if (label != null) {
  @@ -794,10 +783,9 @@
               out.println(" = ");
           }
   
  -        printIndent(out);
  +        printIndent(out, lineage.size());
           out.println("{");
   
  -        indentDepth++;
           lineage.push(map);
   
           for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
  @@ -812,7 +800,7 @@
                       lineage,
                       debug);
               } else {
  -                printIndent(out);
  +                printIndent(out, lineage.size());
                   out.print(childKey);
                   out.print(" = ");
                   
  @@ -838,12 +826,22 @@
           }
           
           lineage.pop();
  -        indentDepth--;
   
  -        printIndent(out);
  +        printIndent(out, lineage.size());
           out.println(debug ? "} " + map.getClass().getName() : "}");
       }
   
  +    /**
  +     * Writes indentation to the given stream.
  +     *
  +     * @param out  the stream to indent
  +     */
  +    private static void printIndent(final PrintStream out, final int indent) {
  +        for (int i = 0; i < indent; i++) {
  +            out.print(INDENT_STRING);
  +        }
  +    }
  +    
       // Misc
       //-----------------------------------------------------------------------
       /**
  @@ -891,6 +889,7 @@
           }
       }
   
  +    // Map decorators
       //-----------------------------------------------------------------------
       /**
        * Returns a synchronized map backed by the given map.
  @@ -1065,6 +1064,7 @@
           return LazyMap.decorate(map, transformerFactory);
       }
   
  +    // SortedMap decorators
       //-----------------------------------------------------------------------
       /**
        * Returns a synchronized sorted map backed by the given sorted map.
  
  
  

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

Reply via email to