Author: lryan
Date: Mon Mar  9 18:09:06 2009
New Revision: 751782

URL: http://svn.apache.org/viewvc?rev=751782&view=rev
Log:
Move image reading to optimizing class associated with image type.
Clarify failure mode for reading ICC profiles from JPEG's. Dont rely on 
Sanselan brittle exception for this case.

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
 Mon Mar  9 18:09:06 2009
@@ -17,19 +17,26 @@
  */
 package org.apache.shindig.gadgets.rewrite.image;
 
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
 import org.apache.shindig.gadgets.http.HttpResponse;
 
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-
 import javax.imageio.ImageIO;
 import javax.imageio.ImageWriter;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * Optimize BMP by converting to PNG
  */
 public class BMPOptimizer extends PNGOptimizer {
 
+  public static BufferedImage readBmp(InputStream is)
+      throws ImageReadException, IOException {
+    return Sanselan.getBufferedImage(is);
+  }
+
   public BMPOptimizer(OptimizerConfig config, HttpResponse original)
       throws IOException {
     super(config, original);

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
 Mon Mar  9 18:09:06 2009
@@ -36,8 +36,6 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.imageio.ImageIO;
-
 /**
  * Rewrite images to more efficiently compress their content. Can rewrite 
images
  * from one format to another for better efficiency.
@@ -187,22 +185,18 @@
   // image reading mechanisms
 
   protected BufferedImage readBmp(HttpResponse response) throws 
ImageReadException, IOException {
-    return Sanselan.getBufferedImage(response.getResponse());
+    return BMPOptimizer.readBmp(response.getResponse());
   }
 
   protected BufferedImage readPng(HttpResponse response) throws 
ImageReadException, IOException {
-    return Sanselan.getBufferedImage(response.getResponse());
+    return PNGOptimizer.readPng(response.getResponse());
   }
 
   protected BufferedImage readGif(HttpResponse response) throws 
ImageReadException, IOException {
-    return Sanselan.getBufferedImage(response.getResponse());
+    return GIFOptimizer.readGif(response.getResponse());
   }
 
   protected BufferedImage readJpeg(HttpResponse response) throws 
ImageReadException, IOException {
-    // We cant use Sanselan to read JPEG but we can use it to read all the 
metadata which is
-    // where most security issues reside anyway in ImageIO
-    Sanselan.getMetadata(response.getResponse(), null);
-    Sanselan.getICCProfile(response.getResponse(), null);
-    return ImageIO.read(response.getResponse());
+    return JPEGOptimizer.readJpeg(response.getResponse());
   }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
 Mon Mar  9 18:09:06 2009
@@ -17,18 +17,25 @@
  */
 package org.apache.shindig.gadgets.rewrite.image;
 
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
 import org.apache.shindig.gadgets.http.HttpResponse;
 
+import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
-
-import javax.imageio.ImageIO;
+import java.io.InputStream;
 
 /**
  * Optimize GIF images by converting them to PNGs or even JPEGs depending on 
content
  */
 public class GIFOptimizer extends PNGOptimizer {
 
+  public static BufferedImage readGif(InputStream is)
+      throws ImageReadException, IOException {
+    return Sanselan.getBufferedImage(is);
+  }
+
   private boolean usePng;
 
   public GIFOptimizer(OptimizerConfig config, HttpResponse original)

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
 Mon Mar  9 18:09:06 2009
@@ -17,11 +17,17 @@
  */
 package org.apache.shindig.gadgets.rewrite.image;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
 import org.apache.shindig.gadgets.http.HttpResponse;
 
+import javax.imageio.ImageIO;
+import java.awt.color.ICC_Profile;
 import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * Optimize JPEG images by either converting them to PNGs or re-encoding them 
with a more
@@ -29,6 +35,22 @@
  */
 public class JPEGOptimizer extends BaseOptimizer {
 
+  public static BufferedImage readJpeg(InputStream is)
+      throws ImageReadException, IOException {
+    byte[] bytes = IOUtils.toByteArray(is);
+    // We cant use Sanselan to read JPEG but we can use it to read all the 
metadata which is
+    // where most security issues reside anyway in ImageIO
+    Sanselan.getMetadata(bytes, null);
+    byte[] iccBytes = Sanselan.getICCProfileBytes(bytes);
+    if (iccBytes != null && iccBytes.length > 0) {
+      ICC_Profile iccProfile = Sanselan.getICCProfile(bytes, null);
+      if (iccProfile == null) {
+        throw new ImageReadException("Image has ICC but it is corrupt and 
cannot be read");
+      }
+    }
+    return ImageIO.read(new ByteArrayInputStream(bytes));
+  }
+
   private boolean usePng;
 
   public JPEGOptimizer(OptimizerConfig config, HttpResponse original)

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
 Mon Mar  9 18:09:06 2009
@@ -17,21 +17,28 @@
  */
 package org.apache.shindig.gadgets.rewrite.image;
 
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
 import org.apache.shindig.gadgets.http.HttpResponse;
 
-import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
-import java.io.IOException;
-
 import javax.imageio.ImageIO;
 import javax.imageio.ImageWriteParam;
 import javax.imageio.ImageWriter;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * Optimize a PNG image and possibly convert it to a JPEG.
  */
 class PNGOptimizer extends BaseOptimizer {
 
+  public static BufferedImage readPng(InputStream is)
+      throws ImageReadException, IOException {
+    return Sanselan.getBufferedImage(is);
+  }
+
   private boolean useJpeg;
 
   public PNGOptimizer(OptimizerConfig config, HttpResponse original)


Reply via email to