Fix some bugs found by Findbugs.



git-svn-id: https://svn.apache.org/repos/asf/commons/proper/sanselan/trunk@1291921 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/sanselan/ImageParser.java b/src/main/java/org/apache/commons/sanselan/ImageParser.java
index 48c5ca0..7479324 100644
--- a/src/main/java/org/apache/commons/sanselan/ImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/ImageParser.java
@@ -82,7 +82,7 @@
     public final IImageMetadata getMetadata(byte bytes[])
             throws ImageReadException, IOException
     {
-        return getMetadata(bytes);
+        return getMetadata(bytes, null);
     }
 
     public final IImageMetadata getMetadata(byte bytes[], Map params)
diff --git a/src/main/java/org/apache/commons/sanselan/common/BinaryConstant.java b/src/main/java/org/apache/commons/sanselan/common/BinaryConstant.java
index 9761e7d..4790d0c 100644
--- a/src/main/java/org/apache/commons/sanselan/common/BinaryConstant.java
+++ b/src/main/java/org/apache/commons/sanselan/common/BinaryConstant.java
@@ -29,7 +29,7 @@
     
     @Override
     public BinaryConstant clone() throws CloneNotSupportedException {
-        return new BinaryConstant(value);
+        return (BinaryConstant) super.clone();
     }
     
     @Override
diff --git a/src/main/java/org/apache/commons/sanselan/common/BinaryFileFunctions.java b/src/main/java/org/apache/commons/sanselan/common/BinaryFileFunctions.java
index 208f815..efeab86 100644
--- a/src/main/java/org/apache/commons/sanselan/common/BinaryFileFunctions.java
+++ b/src/main/java/org/apache/commons/sanselan/common/BinaryFileFunctions.java
@@ -761,7 +761,7 @@
         System.out.println(msg + ": '" + Integer.toBinaryString(0xff & i));
     }
 
-    public final static int CharsToQuad(char c1, char c2, char c3, char c4)
+    public final static int charsToQuad(char c1, char c2, char c3, char c4)
     {
         return (((0xff & c1) << 24) | ((0xff & c2) << 16) | ((0xff & c3) << 8) | ((0xff & c4) << 0));
     }
diff --git a/src/main/java/org/apache/commons/sanselan/common/BinaryInputStream.java b/src/main/java/org/apache/commons/sanselan/common/BinaryInputStream.java
index b970550..d682202 100644
--- a/src/main/java/org/apache/commons/sanselan/common/BinaryInputStream.java
+++ b/src/main/java/org/apache/commons/sanselan/common/BinaryInputStream.java
@@ -630,7 +630,7 @@
         System.out.println(msg + ": '" + Integer.toBinaryString(0xff & i));
     }
 
-    protected final static int CharsToQuad(char c1, char c2, char c3, char c4)
+    protected final static int charsToQuad(char c1, char c2, char c3, char c4)
     {
         return (((0xff & c1) << 24) | ((0xff & c2) << 16) | ((0xff & c3) << 8) | ((0xff & c4) << 0));
     }
diff --git a/src/main/java/org/apache/commons/sanselan/common/bytesource/ByteSourceInputStream.java b/src/main/java/org/apache/commons/sanselan/common/bytesource/ByteSourceInputStream.java
index 4d5295f..4475900 100644
--- a/src/main/java/org/apache/commons/sanselan/common/bytesource/ByteSourceInputStream.java
+++ b/src/main/java/org/apache/commons/sanselan/common/bytesource/ByteSourceInputStream.java
@@ -180,7 +180,12 @@
         }
 
         InputStream is = getInputStream();
-        is.skip(blockStart);
+        for (long skipped = 0; skipped < blockStart; ) {
+            long ret = is.skip(blockStart - skipped);
+            if (ret >= 0) {
+                skipped += ret;
+            }
+        }
 
         byte bytes[] = new byte[blockLength];
         int total = 0;
diff --git a/src/main/java/org/apache/commons/sanselan/common/itu_t4/T4AndT6Compression.java b/src/main/java/org/apache/commons/sanselan/common/itu_t4/T4AndT6Compression.java
index 3b13dc0..f07ee32 100644
--- a/src/main/java/org/apache/commons/sanselan/common/itu_t4/T4AndT6Compression.java
+++ b/src/main/java/org/apache/commons/sanselan/common/itu_t4/T4AndT6Compression.java
@@ -641,7 +641,7 @@
         int first = 0;
         int last = entries.length - 1;
         do {
-            int middle = (first + last) / 2;
+            int middle = (first + last) >>> 2;
             if (entries[middle].value.intValue() <= value &&
                     ((middle + 1) >= entries.length || value < entries[middle + 1].value.intValue())) {
                 return entries[middle];
diff --git a/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java b/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java
index 35a014a..e88f463 100644
--- a/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java
+++ b/src/main/java/org/apache/commons/sanselan/common/mylzw/MyLzwCompressor.java
@@ -133,19 +133,22 @@
 
         public final boolean equals(Object o)
         {
-            ByteArray other = (ByteArray) o;
-            if (other.hash != hash)
-                return false;
-            if (other.length != length)
-                return false;
-
-            for (int i = 0; i < length; i++)
-            {
-                if (other.bytes[i + other.start] != bytes[i + start])
+            if (o instanceof ByteArray) {
+                ByteArray other = (ByteArray) o;
+                if (other.hash != hash)
                     return false;
-            }
+                if (other.length != length)
+                    return false;
 
-            return true;
+                for (int i = 0; i < length; i++)
+                {
+                    if (other.bytes[i + other.start] != bytes[i + start])
+                        return false;
+                }
+
+                return true;
+            }
+            return false;
         }
     }
 
diff --git a/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/App2Segment.java b/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/App2Segment.java
index 1a580c7..a200fd4 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/App2Segment.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/jpeg/segments/App2Segment.java
@@ -64,6 +64,20 @@
             icc_bytes = null;
         }
     }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof App2Segment) {
+            App2Segment other = (App2Segment)obj;
+            return cur_marker == other.cur_marker;
+        }
+        return false;
+    }
+    
+    @Override
+    public int hashCode() {
+        return cur_marker;
+    }
 
     public int compareTo(App2Segment other)
     {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/png/PngConstants.java b/src/main/java/org/apache/commons/sanselan/formats/png/PngConstants.java
index a5b8952..2197e54 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/png/PngConstants.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/png/PngConstants.java
@@ -17,6 +17,7 @@
 package org.apache.commons.sanselan.formats.png;
 
 import org.apache.commons.sanselan.SanselanConstants;
+import org.apache.commons.sanselan.common.BinaryFileFunctions;
 
 public interface PngConstants extends SanselanConstants
 {
@@ -46,31 +47,31 @@
             0x74, //
     };
 
-    public final static int IEND = PngImageParser.CharsToQuad('I', 'E', 'N',
+    public final static int IEND = BinaryFileFunctions.charsToQuad('I', 'E', 'N',
             'D');
-    public final static int IHDR = PngImageParser.CharsToQuad('I', 'H', 'D',
+    public final static int IHDR = BinaryFileFunctions.charsToQuad('I', 'H', 'D',
             'R');
-    public final static int iCCP = PngImageParser.CharsToQuad('i', 'C', 'C',
+    public final static int iCCP = BinaryFileFunctions.charsToQuad('i', 'C', 'C',
             'P');
-    public final static int tEXt = PngImageParser.CharsToQuad('t', 'E', 'X',
+    public final static int tEXt = BinaryFileFunctions.charsToQuad('t', 'E', 'X',
             't');
-    public final static int zTXt = PngImageParser.CharsToQuad('z', 'T', 'X',
+    public final static int zTXt = BinaryFileFunctions.charsToQuad('z', 'T', 'X',
             't');
-    public final static int pHYs = PngImageParser.CharsToQuad('p', 'H', 'Y',
+    public final static int pHYs = BinaryFileFunctions.charsToQuad('p', 'H', 'Y',
             's');
-    public final static int PLTE = PngImageParser.CharsToQuad('P', 'L', 'T',
+    public final static int PLTE = BinaryFileFunctions.charsToQuad('P', 'L', 'T',
             'E');
-    public final static int IDAT = PngImageParser.CharsToQuad('I', 'D', 'A',
+    public final static int IDAT = BinaryFileFunctions.charsToQuad('I', 'D', 'A',
             'T');
-    public final static int tRNS = PngImageParser.CharsToQuad('t', 'R', 'N',
+    public final static int tRNS = BinaryFileFunctions.charsToQuad('t', 'R', 'N',
             'S');
-    public final static int gAMA = PngImageParser.CharsToQuad('g', 'A', 'M',
+    public final static int gAMA = BinaryFileFunctions.charsToQuad('g', 'A', 'M',
             'A');
-    public final static int sRGB = PngImageParser.CharsToQuad('s', 'R', 'G',
+    public final static int sRGB = BinaryFileFunctions.charsToQuad('s', 'R', 'G',
             'B');
 
     // XMP chunk type.
-    public final static int iTXt = PngImageParser.CharsToQuad('i', 'T', 'X',
+    public final static int iTXt = BinaryFileFunctions.charsToQuad('i', 'T', 'X',
             't');
 
     public static final byte PNG_Signature[] = {
diff --git a/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java b/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java
index ddaf496..5b9430e 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/pnm/PnmImageParser.java
@@ -330,7 +330,11 @@
             writer = new PpmWriter(useRawbits);
 
         // make copy of params; we'll clear keys as we consume them.
-        params = new HashMap(params);
+        if (params != null) {
+            params = new HashMap(params);
+        } else {
+            params = new HashMap();
+        }
 
         // clear format key.
         if (params.containsKey(PARAM_KEY_FORMAT))
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java
index 9edf504..0f5d86b 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/TiffReader.java
@@ -137,8 +137,14 @@
         try
         {
             is = byteSource.getInputStream();
-            if (offset > 0)
-                is.skip(offset);
+            if (offset > 0) {
+                for (long skipped = 0; skipped < offset; ) {
+                    long ret = is.skip(offset - skipped);
+                    if (ret >= 0) {
+                        skipped += ret;
+                    }
+                }
+            }
 
             List<TiffField> fields = new ArrayList<TiffField>();
 
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/fieldtypes/FieldTypeAscii.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/fieldtypes/FieldTypeAscii.java
index 811b6a1..1535c4c 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/fieldtypes/FieldTypeAscii.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/fieldtypes/FieldTypeAscii.java
@@ -91,7 +91,12 @@
             String[] strings = (String[])o;
             int totalLength = 0;
             for (int i = 0; i < strings.length; i++) {
-                totalLength += (strings[i].getBytes().length + 1);
+                byte[] bytes = null;
+                try {
+                    bytes = strings[i].getBytes("UTF-8");
+                } catch (UnsupportedEncodingException cannotHappen) {
+                }
+                totalLength += (bytes.length + 1);
             }
             byte[] result = new byte[totalLength];
             int position = 0;
diff --git a/src/main/java/org/apache/commons/sanselan/icc/IccProfileParser.java b/src/main/java/org/apache/commons/sanselan/icc/IccProfileParser.java
index 56b33e3..7572acd 100644
--- a/src/main/java/org/apache/commons/sanselan/icc/IccProfileParser.java
+++ b/src/main/java/org/apache/commons/sanselan/icc/IccProfileParser.java
@@ -370,7 +370,7 @@
 
             boolean result = ((DeviceManufacturer == IEC) && (DeviceModel == sRGB));
 
-            return new Boolean(result);
+            return result;
         }
         catch (Exception e)
         {
diff --git a/src/main/java/org/apache/commons/sanselan/icc/IccTag.java b/src/main/java/org/apache/commons/sanselan/icc/IccTag.java
index e567657..1860f43 100644
--- a/src/main/java/org/apache/commons/sanselan/icc/IccTag.java
+++ b/src/main/java/org/apache/commons/sanselan/icc/IccTag.java
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.util.Arrays;
 
 import org.apache.commons.sanselan.ImageReadException;
 import org.apache.commons.sanselan.common.BinaryConstants;
@@ -97,7 +98,7 @@
                 }) + ")");
 
         if (data == null)
-            pw.println(prefix + "data: " + data);
+            pw.println(prefix + "data: " + Arrays.toString(data));
         else
         {
             pw.println(prefix + "data: " + data.length);
diff --git a/src/main/java/org/apache/commons/sanselan/palette/ColorSpaceSubset.java b/src/main/java/org/apache/commons/sanselan/palette/ColorSpaceSubset.java
index cbef8e1..6173cd2 100644
--- a/src/main/java/org/apache/commons/sanselan/palette/ColorSpaceSubset.java
+++ b/src/main/java/org/apache/commons/sanselan/palette/ColorSpaceSubset.java
@@ -173,5 +173,5 @@
     {
         index = i;
     }
-
+    
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java b/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java
index 873094f..4155bf0 100644
--- a/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java
+++ b/src/main/java/org/apache/commons/sanselan/palette/MedianCutQuantizer.java
@@ -61,8 +61,11 @@
 
         public boolean equals(Object o)
         {
-            ColorCount other = (ColorCount) o;
-            return other.argb == this.argb;
+            if (o instanceof ColorCount) {
+                ColorCount other = (ColorCount) o;
+                return other.argb == this.argb;
+            }
+            return false;
         }
 
     }
diff --git a/src/main/java/org/apache/commons/sanselan/util/Debug.java b/src/main/java/org/apache/commons/sanselan/util/Debug.java
index 88c3120..1c6d368 100644
--- a/src/main/java/org/apache/commons/sanselan/util/Debug.java
+++ b/src/main/java/org/apache/commons/sanselan/util/Debug.java
@@ -208,7 +208,7 @@
     }
 
     //    public static String newline = System.getProperty("line.separator");
-    public static String newline = "\r\n";
+    public static final String newline = "\r\n";
 
     private static void log(StringBuffer buffer, String s)
     {
@@ -517,9 +517,6 @@
         debug(fClass.getName(), e);
     }
 
-    private static final SimpleDateFormat timestamp = new SimpleDateFormat(
-            "yyyy-MM-dd kk:mm:ss:SSS");
-
     public static void debug(String message, boolean value)
     {
         debug(message + " " + ((value) ? ("true") : ("false")));
@@ -662,6 +659,8 @@
     {
         StringBuffer result = new StringBuffer();
 
+        final SimpleDateFormat timestamp = new SimpleDateFormat(
+                "yyyy-MM-dd kk:mm:ss:SSS");
         String datetime = timestamp.format(new Date()).toLowerCase();
 
         result.append(newline);
@@ -869,7 +868,7 @@
             for (int i = 0; i < array.length; i++)
                 debug(prefix + "\t" + i + ": ", array[i]);
         }
-        else if (value instanceof byte[])
+        else if (value instanceof double[])
         {
             double[] array = (double[]) value;
             debug(prefix, array);
diff --git a/src/main/java/org/apache/commons/sanselan/util/IoUtils.java b/src/main/java/org/apache/commons/sanselan/util/IoUtils.java
index ae60437..9978ac8 100644
--- a/src/main/java/org/apache/commons/sanselan/util/IoUtils.java
+++ b/src/main/java/org/apache/commons/sanselan/util/IoUtils.java
@@ -142,8 +142,11 @@
 
         try
         {
-            if (file.getParentFile() != null)
-                file.getParentFile().mkdirs();
+            if (file.getParentFile() != null && !file.getParentFile().exists()) {
+                if (!file.getParentFile().mkdirs()) {
+                    throw new IOException("Could not create directory for file " + file);
+                }
+            }
             stream = new FileOutputStream(file);
 
             copyStreamToStream(src, stream);