Author: markt
Date: Fri Mar 15 14:21:24 2013
New Revision: 1456963

URL: http://svn.apache.org/r1456963
Log:
Update to Commons IO 2.4 and run UCDetector over the copied classes

Modified:
    
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java
    
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java
    
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileCleaningTracker.java
    
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileDeleteStrategy.java
    tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileUtils.java
    tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/IOUtils.java
    
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java
 Fri Mar 15 14:21:24 2013
@@ -19,7 +19,6 @@ package org.apache.tomcat.util.http.file
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,7 +34,7 @@ import java.util.List;
  * this class can be called after the stream has been closed without
  * generating an <tt>IOException</tt>.
  * <p>
- * This is an alternative implementation of the java.io.ByteArrayOutputStream
+ * This is an alternative implementation of the {@link 
java.io.ByteArrayOutputStream}
  * class. The original implementation only allocates 32 bytes at the beginning.
  * As this class is designed for heavy duty it starts at 1024 bytes. In 
contrast
  * to the original it doesn't reallocate the whole memory block but allocates
@@ -44,8 +43,6 @@ import java.util.List;
  * designed to behave exactly like the original. The only exception is the
  * deprecated toString(int) method that has been ignored.
  *
- * @author <a href="mailto:jerem...@apache.org";>Jeremias Maerki</a>
- * @author Holger Hoffstatte
  * @version $Id$
  */
 public class ByteArrayOutputStream extends OutputStream {
@@ -54,7 +51,7 @@ public class ByteArrayOutputStream exten
     private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
 
     /** The list of buffers, which grows and never reduces. */
-    private List<byte[]> buffers = new ArrayList<>();
+    private final List<byte[]> buffers = new ArrayList<>();
     /** The index of the current buffer. */
     private int currentBufferIndex;
     /** The total count of bytes in all the filled buffers. */
@@ -84,18 +81,9 @@ public class ByteArrayOutputStream exten
             throw new IllegalArgumentException(
                 "Negative initial size: " + size);
         }
-        needNewBuffer(size);
-    }
-
-    /**
-     * Return the appropriate <code>byte[]</code> buffer
-     * specified by index.
-     *
-     * @param index  the index of the buffer required
-     * @return the buffer
-     */
-    private byte[] getBuffer(int index) {
-        return buffers.get(index);
+        synchronized (this) {
+            needNewBuffer(size);
+        }
     }
 
     /**
@@ -110,7 +98,7 @@ public class ByteArrayOutputStream exten
             filledBufferSum += currentBuffer.length;
 
             currentBufferIndex++;
-            currentBuffer = getBuffer(currentBufferIndex);
+            currentBuffer = buffers.get(currentBufferIndex);
         } else {
             //Creating new buffer
             int newBufferSize;
@@ -188,7 +176,7 @@ public class ByteArrayOutputStream exten
      * @return total number of bytes read from the input stream
      *         (and written to this stream)
      * @throws IOException if an I/O error occurs while reading the input 
stream
-     * @since Commons IO 1.4
+     * @since 1.4
      */
     public synchronized int write(InputStream in) throws IOException {
         int readCount = 0;
@@ -208,14 +196,6 @@ public class ByteArrayOutputStream exten
     }
 
     /**
-     * Return the current size of the byte array.
-     * @return the current size of the byte array
-     */
-    public synchronized int size() {
-        return count;
-    }
-
-    /**
      * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
      * this class can be called after the stream has been closed without
      * generating an <tt>IOException</tt>.
@@ -229,16 +209,6 @@ public class ByteArrayOutputStream exten
     }
 
     /**
-     * @see java.io.ByteArrayOutputStream#reset()
-     */
-    public synchronized void reset() {
-        count = 0;
-        filledBufferSum = 0;
-        currentBufferIndex = 0;
-        currentBuffer = getBuffer(currentBufferIndex);
-    }
-
-    /**
      * Writes the entire contents of this byte stream to the
      * specified output stream.
      *
@@ -248,8 +218,7 @@ public class ByteArrayOutputStream exten
      */
     public synchronized void writeTo(OutputStream out) throws IOException {
         int remaining = count;
-        for (int i = 0; i < buffers.size(); i++) {
-            byte[] buf = getBuffer(i);
+        for (byte[] buf : buffers) {
             int c = Math.min(buf.length, remaining);
             out.write(buf, 0, c);
             remaining -= c;
@@ -273,8 +242,7 @@ public class ByteArrayOutputStream exten
         }
         byte newbuf[] = new byte[remaining];
         int pos = 0;
-        for (int i = 0; i < buffers.size(); i++) {
-            byte[] buf = getBuffer(i);
+        for (byte[] buf : buffers) {
             int c = Math.min(buf.length, remaining);
             System.arraycopy(buf, 0, newbuf, pos, c);
             pos += c;
@@ -295,18 +263,4 @@ public class ByteArrayOutputStream exten
     public String toString() {
         return new String(toByteArray());
     }
-
-    /**
-     * Gets the curent contents of this byte stream as a string
-     * using the specified encoding.
-     *
-     * @param enc  the name of the character encoding
-     * @return the string converted from the byte array
-     * @throws UnsupportedEncodingException if the encoding is not supported
-     * @see java.io.ByteArrayOutputStream#toString(String)
-     */
-    public String toString(String enc) throws UnsupportedEncodingException {
-        return new String(toByteArray(), enc);
-    }
-
 }

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java
 Fri Mar 15 14:21:24 2013
@@ -17,7 +17,6 @@
 package org.apache.tomcat.util.http.fileupload;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -34,9 +33,6 @@ import java.io.OutputStream;
  * you want to store it in memory (for speed), but if the file is large you 
want
  * to store it to file (to avoid memory issues).
  *
- * @author <a href="mailto:mart...@apache.org";>Martin Cooper</a>
- * @author gaxzerow
- *
  * @version $Id$
  */
 public class DeferredFileOutputStream
@@ -69,23 +65,17 @@ public class DeferredFileOutputStream
     /**
      * The temporary file prefix.
      */
-    private String prefix;
+    private final String prefix;
 
     /**
      * The temporary file suffix.
      */
-    private String suffix;
+    private final String suffix;
 
     /**
      * The directory to use for temporary files.
      */
-    private File directory;
-
-
-    /**
-     * True when close() has been called successfully.
-     */
-    private boolean closed = false;
+    private final File directory;
 
     // ----------------------------------------------------------- Constructors
 
@@ -99,31 +89,26 @@ public class DeferredFileOutputStream
      */
     public DeferredFileOutputStream(int threshold, File outputFile)
     {
-        super(threshold);
-        this.outputFile = outputFile;
-
-        memoryOutputStream = new ByteArrayOutputStream();
-        currentOutputStream = memoryOutputStream;
+        this(threshold,  outputFile, null, null, null);
     }
 
 
     /**
      * Constructs an instance of this class which will trigger an event at the
-     * specified threshold, and save data to a temporary file beyond that 
point.
+     * specified threshold, and save data either to a file beyond that point.
      *
      * @param threshold  The number of bytes at which to trigger an event.
+     * @param outputFile The file to which data is saved beyond the threshold.
      * @param prefix Prefix to use for the temporary file.
      * @param suffix Suffix to use for the temporary file.
      * @param directory Temporary file directory.
-     *
-     * @since Commons IO 1.4
      */
-    public DeferredFileOutputStream(int threshold, String prefix, String 
suffix, File directory)
-    {
-        this(threshold, (File)null);
-        if (prefix == null) {
-            throw new IllegalArgumentException("Temporary file prefix is 
missing");
-        }
+    private DeferredFileOutputStream(int threshold, File outputFile, String 
prefix, String suffix, File directory) {
+        super(threshold);
+        this.outputFile = outputFile;
+
+        memoryOutputStream = new ByteArrayOutputStream();
+        currentOutputStream = memoryOutputStream;
         this.prefix = prefix;
         this.suffix = suffix;
         this.directory = directory;
@@ -176,21 +161,21 @@ public class DeferredFileOutputStream
      * Determines whether or not the data for this output stream has been
      * retained in memory.
      *
-     * @return <code>true</code> if the data is available in memory;
-     *         <code>false</code> otherwise.
+     * @return {@code true} if the data is available in memory;
+     *         {@code false} otherwise.
      */
     public boolean isInMemory()
     {
-        return (!isThresholdExceeded());
+        return !isThresholdExceeded();
     }
 
 
     /**
      * Returns the data for this output stream as an array of bytes, assuming
      * that the data has been retained in memory. If the data was written to
-     * disk, this method returns <code>null</code>.
+     * disk, this method returns {@code null}.
      *
-     * @return The data for this output stream, or <code>null</code> if no such
+     * @return The data for this output stream, or {@code null} if no such
      *         data is available.
      */
     public byte[] getData()
@@ -208,13 +193,13 @@ public class DeferredFileOutputStream
      * the temporary file created or null.
      * <p>
      * If the constructor specifying the file is used then it returns that
-     * same output file, even when threashold has not been reached.
+     * same output file, even when threshold has not been reached.
      * <p>
      * If constructor specifying a temporary file prefix/suffix is used
-     * then the temporary file created once the threashold is reached is 
returned
-     * If the threshold was not reached then <code>null</code> is returned.
+     * then the temporary file created once the threshold is reached is 
returned
+     * If the threshold was not reached then {@code null} is returned.
      *
-     * @return The file for this output stream, or <code>null</code> if no such
+     * @return The file for this output stream, or {@code null} if no such
      *         file exists.
      */
     public File getFile()
@@ -232,39 +217,5 @@ public class DeferredFileOutputStream
     public void close() throws IOException
     {
         super.close();
-        closed = true;
-    }
-
-
-    /**
-     * Writes the data from this output stream to the specified output stream,
-     * after it has been closed.
-     *
-     * @param out output stream to write to.
-     * @exception IOException if this stream is not yet closed or an error 
occurs.
-     */
-    public void writeTo(OutputStream out) throws IOException
-    {
-        // we may only need to check if this is closed if we are working with 
a file
-        // but we should force the habit of closing wether we are working with
-        // a file or memory.
-        if (!closed)
-        {
-            throw new IOException("Stream not closed");
-        }
-
-        if(isInMemory())
-        {
-            memoryOutputStream.writeTo(out);
-        }
-        else
-        {
-            FileInputStream fis = new FileInputStream(outputFile);
-            try {
-                IOUtils.copy(fis, out);
-            } finally {
-                IOUtils.closeQuietly(fis);
-            }
-        }
     }
 }

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileCleaningTracker.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileCleaningTracker.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileCleaningTracker.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileCleaningTracker.java
 Fri Mar 15 14:21:24 2013
@@ -45,23 +45,23 @@ public class FileCleaningTracker {
     /**
      * Queue of <code>Tracker</code> instances being watched.
      */
-    ReferenceQueue<Object> q = new ReferenceQueue<>();
+    private final ReferenceQueue<Object> q = new ReferenceQueue<>();
     /**
      * Collection of <code>Tracker</code> instances in existence.
      */
-    final Collection<Tracker> trackers = Collections.synchronizedSet(new 
HashSet<Tracker>()); // synchronized
+    private final Collection<Tracker> trackers = 
Collections.synchronizedSet(new HashSet<Tracker>()); // synchronized
     /**
      * Collection of File paths that failed to delete.
      */
-    final List<String> deleteFailures = Collections.synchronizedList(new 
ArrayList<String>());
+    private final List<String> deleteFailures = 
Collections.synchronizedList(new ArrayList<String>());
     /**
      * Whether to terminate the thread when the tracking is complete.
      */
-    volatile boolean exitWhenFinished = false;
+    private volatile boolean exitWhenFinished = false;
     /**
      * The thread that will clean up registered files.
      */
-    Thread reaper;
+    private Thread reaper;
 
     //-----------------------------------------------------------------------
     /**
@@ -95,36 +95,6 @@ public class FileCleaningTracker {
     }
 
     /**
-     * Track the specified file, using the provided marker, deleting the file
-     * when the marker instance is garbage collected.
-     * The {@link FileDeleteStrategy#NORMAL normal} deletion strategy will be 
used.
-     *
-     * @param path  the full path to the file to be tracked, not null
-     * @param marker  the marker object used to track the file, not null
-     * @throws NullPointerException if the path is null
-     */
-    public void track(String path, Object marker) {
-        track(path, marker, (FileDeleteStrategy) null);
-    }
-
-    /**
-     * Track the specified file, using the provided marker, deleting the file
-     * when the marker instance is garbage collected.
-     * The speified deletion strategy is used.
-     *
-     * @param path  the full path to the file to be tracked, not null
-     * @param marker  the marker object used to track the file, not null
-     * @param deleteStrategy  the strategy to delete the file, null means 
normal
-     * @throws NullPointerException if the path is null
-     */
-    public void track(String path, Object marker, FileDeleteStrategy 
deleteStrategy) {
-        if (path == null) {
-            throw new NullPointerException("The path must not be null");
-        }
-        addTracker(path, marker, deleteStrategy);
-    }
-
-    /**
      * Adds a tracker to the list of trackers.
      *
      * @param path  the full path to the file to be tracked, not null
@@ -145,57 +115,6 @@ public class FileCleaningTracker {
 
     //-----------------------------------------------------------------------
     /**
-     * Retrieve the number of files currently being tracked, and therefore
-     * awaiting deletion.
-     *
-     * @return the number of files being tracked
-     */
-    public int getTrackCount() {
-        return trackers.size();
-    }
-
-    /**
-     * Return the file paths that failed to delete.
-     *
-     * @return the file paths that failed to delete
-     */
-    public List<String> getDeleteFailures() {
-        return deleteFailures;
-    }
-
-    /**
-     * Call this method to cause the file cleaner thread to terminate when
-     * there are no more objects being tracked for deletion.
-     * <p>
-     * In a simple environment, you don't need this method as the file cleaner
-     * thread will simply exit when the JVM exits. In a more complex 
environment,
-     * with multiple class loaders (such as an application server), you should 
be
-     * aware that the file cleaner thread will continue running even if the 
class
-     * loader it was started from terminates. This can consitute a memory leak.
-     * <p>
-     * For example, suppose that you have developed a web application, which
-     * contains the commons-io jar file in your WEB-INF/lib directory. In other
-     * words, the FileCleaner class is loaded through the class loader of your
-     * web application. If the web application is terminated, but the servlet
-     * container is still running, then the file cleaner thread will still 
exist,
-     * posing a memory leak.
-     * <p>
-     * This method allows the thread to be terminated. Simply call this method
-     * in the resource cleanup code, such as {@link 
javax.servlet.ServletContextListener#contextDestroyed}.
-     * Once called, no new objects can be tracked by the file cleaner.
-     */
-    public synchronized void exitWhenFinished() {
-        // synchronized block protects reaper
-        exitWhenFinished = true;
-        if (reaper != null) {
-            synchronized (reaper) {
-                reaper.interrupt();
-            }
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
      * The reaper thread.
      */
     private final class Reaper extends Thread {

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileDeleteStrategy.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileDeleteStrategy.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileDeleteStrategy.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileDeleteStrategy.java
 Fri Mar 15 14:21:24 2013
@@ -28,9 +28,8 @@ import java.io.IOException;
  * <p>
  * This class captures the strategy to use and is designed for user 
subclassing.
  *
- * @author Stephen Colebourne
  * @version $Id$
- * @since Commons IO 1.3
+ * @since 1.3
  */
 public class FileDeleteStrategy {
 
@@ -39,11 +38,6 @@ public class FileDeleteStrategy {
      * the deletion of directories that are not empty.
      */
     public static final FileDeleteStrategy NORMAL = new 
FileDeleteStrategy("Normal");
-    /**
-     * The singleton instance for forced file deletion, which always deletes,
-     * even if the file represents a non-empty directory.
-     */
-    public static final FileDeleteStrategy FORCE = new 
ForceFileDeleteStrategy();
 
     /** The name of the strategy. */
     private final String name;
@@ -81,22 +75,6 @@ public class FileDeleteStrategy {
     }
 
     /**
-     * Deletes the file object, which may be a file or a directory.
-     * If the file does not exist, the method just returns.
-     * <p>
-     * Subclass writers should override {@link #doDelete(File)}, not this 
method.
-     *
-     * @param fileToDelete  the file to delete, not null
-     * @throws NullPointerException if the file is null
-     * @throws IOException if an error occurs during file deletion
-     */
-    public void delete(File fileToDelete) throws IOException {
-        if (fileToDelete.exists() && doDelete(fileToDelete) == false) {
-            throw new IOException("Deletion failed: " + fileToDelete);
-        }
-    }
-
-    /**
      * Actually deletes the file object, which may be a file or a directory.
      * <p>
      * This method is designed for subclasses to override.
@@ -144,7 +122,7 @@ public class FileDeleteStrategy {
          * if the file exists.
          *
          * @param fileToDelete  the file to delete, not null
-         * @return Always returns <code>true</code>
+         * @return Always returns {@code true}
          * @throws NullPointerException if the file is null
          * @throws IOException if an error occurs during file deletion
          */

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileUtils.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileUtils.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileUtils.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/FileUtils.java Fri 
Mar 15 14:21:24 2013
@@ -40,20 +40,6 @@ import java.io.IOException;
  * <p>
  * Origin of code: Excalibur, Alexandria, Commons-Utils
  *
- * @author <a href="mailto:bur...@relativity.yi.org";>Kevin A. Burton</A>
- * @author <a href="mailto:sand...@apache.org";>Scott Sanders</a>
- * @author <a href="mailto:d...@finemaltcoding.com";>Daniel Rall</a>
- * @author <a href="mailto:christoph.r...@dlr.de";>Christoph.Reck</a>
- * @author <a href="mailto:pe...@apache.org";>Peter Donald</a>
- * @author <a href="mailto:je...@apache.org";>Jeff Turner</a>
- * @author Matthew Hawthorne
- * @author <a href="mailto:jerem...@apache.org";>Jeremias Maerki</a>
- * @author Stephen Colebourne
- * @author Ian Springer
- * @author Chris Eldredge
- * @author Jim Harrington
- * @author Niall Pemberton
- * @author Sandy McArthur
  * @version $Id$
  */
 public class FileUtils {
@@ -77,7 +63,10 @@ public class FileUtils {
             return;
         }
 
-        cleanDirectory(directory);
+        if (!isSymlink(directory)) {
+            cleanDirectory(directory);
+        }
+
         if (!directory.delete()) {
             String message =
                 "Unable to delete directory " + directory + ".";
@@ -85,7 +74,6 @@ public class FileUtils {
         }
     }
 
-
     /**
      * Cleans a directory without deleting it.
      *
@@ -109,8 +97,7 @@ public class FileUtils {
         }
 
         IOException exception = null;
-        for (int i = 0; i < files.length; i++) {
-            File file = files[i];
+        for (File file : files) {
             try {
                 forceDelete(file);
             } catch (IOException ioe) {
@@ -123,7 +110,6 @@ public class FileUtils {
         }
     }
 
-
     //-----------------------------------------------------------------------
     /**
      * Deletes a file. If file is a directory, delete it and all 
sub-directories.
@@ -135,8 +121,8 @@ public class FileUtils {
      *      (java.io.File methods returns a boolean)</li>
      * </ul>
      *
-     * @param file  file or directory to delete, must not be <code>null</code>
-     * @throws NullPointerException if the directory is <code>null</code>
+     * @param file  file or directory to delete, must not be {@code null}
+     * @throws NullPointerException if the directory is {@code null}
      * @throws FileNotFoundException if the file was not found
      * @throws IOException in case deletion is unsuccessful
      */
@@ -160,8 +146,8 @@ public class FileUtils {
      * Schedules a file to be deleted when JVM exits.
      * If file is directory delete it and all sub-directories.
      *
-     * @param file  file or directory to delete, must not be <code>null</code>
-     * @throws NullPointerException if the file is <code>null</code>
+     * @param file  file or directory to delete, must not be {@code null}
+     * @throws NullPointerException if the file is {@code null}
      * @throws IOException in case deletion is unsuccessful
      */
     public static void forceDeleteOnExit(File file) throws IOException {
@@ -175,8 +161,8 @@ public class FileUtils {
     /**
      * Schedules a directory recursively for deletion on JVM exit.
      *
-     * @param directory  directory to delete, must not be <code>null</code>
-     * @throws NullPointerException if the directory is <code>null</code>
+     * @param directory  directory to delete, must not be {@code null}
+     * @throws NullPointerException if the directory is {@code null}
      * @throws IOException in case deletion is unsuccessful
      */
     private static void deleteDirectoryOnExit(File directory) throws 
IOException {
@@ -184,15 +170,17 @@ public class FileUtils {
             return;
         }
 
-        cleanDirectoryOnExit(directory);
         directory.deleteOnExit();
+        if (!isSymlink(directory)) {
+            cleanDirectoryOnExit(directory);
+        }
     }
 
     /**
      * Cleans a directory without deleting it.
      *
-     * @param directory  directory to clean, must not be <code>null</code>
-     * @throws NullPointerException if the directory is <code>null</code>
+     * @param directory  directory to clean, must not be {@code null}
+     * @throws NullPointerException if the directory is {@code null}
      * @throws IOException in case cleaning is unsuccessful
      */
     private static void cleanDirectoryOnExit(File directory) throws 
IOException {
@@ -212,8 +200,7 @@ public class FileUtils {
         }
 
         IOException exception = null;
-        for (int i = 0; i < files.length; i++) {
-            File file = files[i];
+        for (File file : files) {
             try {
                 forceDeleteOnExit(file);
             } catch (IOException ioe) {
@@ -225,4 +212,43 @@ public class FileUtils {
             throw exception;
         }
     }
+
+
+    /**
+     * Determines whether the specified file is a Symbolic Link rather than an 
actual file.
+     * <p>
+     * Will not return true if there is a Symbolic Link anywhere in the path,
+     * only if the specific file is.
+     * <p>
+     * <b>Note:</b> the current implementation always returns {@code false} if
+     * the system is detected as Windows using
+     * {@link File#separatorChar} == '\\'
+     *
+     * @param file the file to check
+     * @return true if the file is a Symbolic Link
+     * @throws IOException if an IO error occurs while checking the file
+     * @since 2.0
+     */
+    public static boolean isSymlink(File file) throws IOException {
+        if (file == null) {
+            throw new NullPointerException("File must not be null");
+        }
+        //FilenameUtils.isSystemWindows()
+        if (File.separatorChar == '\\') {
+            return false;
+        }
+        File fileInCanonicalDir = null;
+        if (file.getParent() == null) {
+            fileInCanonicalDir = file;
+        } else {
+            File canonicalDir = file.getParentFile().getCanonicalFile();
+            fileInCanonicalDir = new File(canonicalDir, file.getName());
+        }
+
+        if 
(fileInCanonicalDir.getCanonicalFile().equals(fileInCanonicalDir.getAbsoluteFile()))
 {
+            return false;
+        } else {
+            return true;
+        }
+    }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/IOUtils.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/IOUtils.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/IOUtils.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/IOUtils.java Fri 
Mar 15 14:21:24 2013
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-
 /**
  * General IO stream manipulation utilities.
  * <p>
@@ -52,14 +51,6 @@ import java.io.OutputStream;
  * <p>
  * Origin of code: Excalibur.
  *
- * @author Peter Donald
- * @author Jeff Turner
- * @author Matthew Hawthorne
- * @author Stephen Colebourne
- * @author Gareth Davis
- * @author Ian Springer
- * @author Niall Pemberton
- * @author Sandy McArthur
  * @version $Id$
  */
 public class IOUtils {
@@ -67,8 +58,13 @@ public class IOUtils {
     // Writer. Each method should take at least one of these as a parameter,
     // or return one of them.
 
+    private static final int EOF = -1;
+
     /**
-     * The default buffer size to use.
+     * The default buffer size ({@value}) to use for
+     * {@link #copyLarge(InputStream, OutputStream)}
+     * and
+     * {@link #copyLarge(Reader, Writer)}
      */
     private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
 
@@ -79,25 +75,6 @@ public class IOUtils {
         super();
     }
 
-
-    /**
-     * Unconditionally close an <code>InputStream</code>.
-     * <p>
-     * Equivalent to {@link InputStream#close()}, except any exceptions will 
be ignored.
-     * This is typically used in finally blocks.
-     *
-     * @param input  the InputStream to close, may be null or already closed
-     */
-    public static void closeQuietly(InputStream input) {
-        try {
-            if (input != null) {
-                input.close();
-            }
-        } catch (IOException ioe) {
-            // ignore
-        }
-    }
-
     // copy from InputStream
     //-----------------------------------------------------------------------
     /**
@@ -114,11 +91,10 @@ public class IOUtils {
      *
      * @param input  the <code>InputStream</code> to read from
      * @param output  the <code>OutputStream</code> to write to
-     * @return the number of bytes copied
+     * @return the number of bytes copied, or -1 if &gt; Integer.MAX_VALUE
      * @throws NullPointerException if the input or output is null
      * @throws IOException if an I/O error occurs
-     * @throws ArithmeticException if the byte count is too large
-     * @since Commons IO 1.1
+     * @since 1.1
      */
     public static int copy(InputStream input, OutputStream output) throws 
IOException {
         long count = copyLarge(input, output);
@@ -134,25 +110,26 @@ public class IOUtils {
      * <p>
      * This method buffers the input internally, so there is no need to use a
      * <code>BufferedInputStream</code>.
+     * <p>
+     * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}.
      *
      * @param input  the <code>InputStream</code> to read from
      * @param output  the <code>OutputStream</code> to write to
      * @return the number of bytes copied
      * @throws NullPointerException if the input or output is null
      * @throws IOException if an I/O error occurs
-     * @since Commons IO 1.3
+     * @since 1.3
      */
     public static long copyLarge(InputStream input, OutputStream output)
             throws IOException {
+
         byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
         long count = 0;
         int n = 0;
-        while (-1 != (n = input.read(buffer))) {
+        while (EOF != (n = input.read(buffer))) {
             output.write(buffer, 0, n);
             count += n;
         }
         return count;
     }
-
-
 }

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java?rev=1456963&r1=1456962&r2=1456963&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java
 Fri Mar 15 14:21:24 2013
@@ -34,8 +34,6 @@ import java.io.OutputStream;
  * is actually reached, since it triggers when a pending write operation would
  * cause the threshold to be exceeded.
  *
- * @author <a href="mailto:mart...@apache.org";>Martin Cooper</a>
- *
  * @version $Id$
  */
 public abstract class ThresholdingOutputStream
@@ -48,7 +46,7 @@ public abstract class ThresholdingOutput
     /**
      * The threshold at which the event will be triggered.
      */
-    private int threshold;
+    private final int threshold;
 
 
     /**
@@ -171,37 +169,15 @@ public abstract class ThresholdingOutput
 
 
     /**
-     * Returns the threshold, in bytes, at which an event will be triggered.
-     *
-     * @return The threshold point, in bytes.
-     */
-    public int getThreshold()
-    {
-        return threshold;
-    }
-
-
-    /**
-     * Returns the number of bytes that have been written to this output 
stream.
-     *
-     * @return The number of bytes written.
-     */
-    public long getByteCount()
-    {
-        return written;
-    }
-
-
-    /**
      * Determines whether or not the configured threshold has been exceeded for
      * this output stream.
      *
-     * @return <code>true</code> if the threshold has been reached;
-     *         <code>false</code> otherwise.
+     * @return {@code true} if the threshold has been reached;
+     *         {@code false} otherwise.
      */
     public boolean isThresholdExceeded()
     {
-        return (written > threshold);
+        return written > threshold;
     }
 
 
@@ -220,23 +196,13 @@ public abstract class ThresholdingOutput
      */
     protected void checkThreshold(int count) throws IOException
     {
-        if (!thresholdExceeded && (written + count > threshold))
+        if (!thresholdExceeded && written + count > threshold)
         {
             thresholdExceeded = true;
             thresholdReached();
         }
     }
 
-    /**
-     * Resets the byteCount to zero.  You can call this from
-     * {@link #thresholdReached()} if you want the event to be triggered again.
-     */
-    protected void resetByteCount()
-    {
-        this.thresholdExceeded = false;
-        this.written = 0;
-    }
-
     // ------------------------------------------------------- Abstract methods
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to