Author: lryan
Date: Thu Jun  4 16:13:19 2009
New Revision: 781787

URL: http://svn.apache.org/viewvc?rev=781787&view=rev
Log:
Fixes for image resizing pipeline. Contributed by Filip Miletic. SHINDIG-1073

Added:
    
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif
   (with props)
    
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif
   (with props)
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/BaseOptimizer.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/ImageRewriter.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
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.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=781787&r1=781786&r2=781787&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
 Thu Jun  4 16:13:19 2009
@@ -37,17 +37,18 @@
     return Sanselan.getBufferedImage(is);
   }
 
-  public BMPOptimizer(OptimizerConfig config, HttpResponse original)
-      throws IOException {
+  public BMPOptimizer(OptimizerConfig config, HttpResponse original) {
     super(config, original);
     ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
     outputter = new ImageIOOutputter(writer, null);
   }
 
-  protected void rewriteImpl(BufferedImage image) throws IOException {
+  @Override
+  protected void rewriteImpl(BufferedImage image) throws IOException  {
     super.rewriteImpl(image);
   }
 
+  @Override
   protected String getOriginalContentType() {
     return "image/bmp";
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BaseOptimizer.java
 Thu Jun  4 16:13:19 2009
@@ -60,8 +60,7 @@
   int reductionPct;
 
 
-  public BaseOptimizer(OptimizerConfig config, HttpResponse original)
-      throws IOException {
+  public BaseOptimizer(OptimizerConfig config, HttpResponse original) {
     this.config = config;
     this.originalResponse = original;
     this.minLength = original.getContentLength();
@@ -124,7 +123,6 @@
 
   /**
    * Get the rewritten image if available
-   * @return
    */
   protected final byte[] getRewrittenImage() {
     return minBytes;

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=781787&r1=781786&r2=781787&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
 Thu Jun  4 16:13:19 2009
@@ -33,6 +33,8 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageIOOutputter;
+import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageOutputter;
 
 import java.awt.Color;
 import java.awt.Graphics2D;
@@ -45,6 +47,7 @@
 import java.util.logging.Logger;
 
 import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
 
 /**
  * Rewrite images to more efficiently compress their content. Can output to a 
different format file
@@ -55,6 +58,13 @@
  */
 public class BasicImageRewriter implements ImageRewriter {
 
+  private static final String CONTENT_TYPE_IMAGE_PNG = "image/png";
+  /** Returned as the output message if a huge image is submitted to be scaled 
*/
+  private static final String RESIZE_IMAGE_TOO_LARGE = "The image is too large 
to resize";
+  /** With resizing active, all images become PNGs */
+  private static final String RESIZE_OUTPUT_FORMAT = "png";
+
+  private static final String CONTENT_LENGTH = "Content-Length";
   /** Parameter used to request image rendering quality */
   public static final String PARAM_RESIZE_QUALITY = "resize_q";
   /** Parameter used to request image width change */
@@ -71,12 +81,12 @@
 
   private static final int DEFAULT_QUALITY = 100;
   private static final int BITS_PER_BYTE = 8;
-  private static final Color COLOR_TRANSPARENT = new Color(0, 0, 0, 0);
+  private static final Color COLOR_TRANSPARENT = new Color(255, 255, 255, 0);
   private static final String CONTENT_TYPE = "Content-Type";
   private static final Logger log = 
Logger.getLogger(BasicImageRewriter.class.getName());
 
   private static final Set<String> SUPPORTED_MIME_TYPES = ImmutableSet.of(
-      "image/gif", "image/png", "image/jpeg", "image/bmp");
+      "image/gif", CONTENT_TYPE_IMAGE_PNG, "image/jpeg", "image/bmp");
 
   private static final Set<String> SUPPORTED_FILE_EXTENSIONS = ImmutableSet.of(
       ".gif", ".png", ".jpeg", ".jpg", ".bmp");
@@ -129,13 +139,20 @@
 
       ImageInfo imageInfo = Sanselan.getImageInfo(response.getResponse(), 
uri.getPath());
 
+      boolean isOversizedImage = isImageTooLarge(imageInfo);
+      if (isResizeRequested && isOversizedImage) {
+        HttpResponseBuilder rejectedResponseBuilder = new HttpResponseBuilder()
+            .setHttpStatusCode(HttpResponse.SC_FORBIDDEN)
+            .setResponseString(RESIZE_IMAGE_TOO_LARGE);
+        return rejectedResponseBuilder.create();
+      }
+
       // Don't handle animations.
       // TODO: This doesn't work as current Sanselan doesn't return accurate 
image counts.
       // See animated GIF detection below.
-      if (imageInfo.getNumberOfImages() > 1 || isImageTooLarge(imageInfo)) {
+      if (imageInfo.getNumberOfImages() > 1 || isOversizedImage) {
         return response;
       }
-
       int originalContentSize = response.getContentLength();
       totalSourceImageSize.addAndGet(originalContentSize);
       BufferedImage image = ImageIO.read(response.getResponse());
@@ -173,8 +190,10 @@
           resizeQuality = DEFAULT_QUALITY;
         }
 
-        if (isResizeRequired(requestedWidth, requestedHeight, imageInfo)) {
+        if (isResizeRequired(requestedWidth, requestedHeight, imageInfo)
+            && !isTargetImageTooLarge(requestedWidth, requestedHeight, 
imageInfo)) {
           image = resizeImage(image, requestedWidth, requestedHeight, 
widthDelta, heightDelta);
+          response = updateResponse(response, image);
         }
       }
       response = getOptimizer(response, imageFormat, image);
@@ -191,6 +210,27 @@
     return response;
   }
 
+  /**
+   * As the image is resized, the request needs to change so that the 
optimizer can
+   * make sensible image size-related decisions down the pipeline.  GIF images 
are rewritten
+   * as PNGs though, so as not to include the dependency on the GIF decoder.
+   *
+   * @param response the base response that will be modified with the resized 
image
+   * @param image the resized image that needs to be substituted for the 
original image from
+   *        the response
+   */
+  private HttpResponse updateResponse(HttpResponse response, BufferedImage 
image)
+      throws IOException {
+    ImageWriter imageWriter = 
ImageIO.getImageWritersByFormatName(RESIZE_OUTPUT_FORMAT).next();
+    ImageOutputter outputter = new ImageIOOutputter(imageWriter, null);
+    byte[] imageBytes = outputter.toBytes(image);
+    HttpResponseBuilder newResponseBuilder = new HttpResponseBuilder(response)
+        .setResponse(imageBytes)
+        .setHeader(CONTENT_TYPE, CONTENT_TYPE_IMAGE_PNG)
+        .setHeader(CONTENT_LENGTH, String.valueOf(imageBytes.length));
+    return newResponseBuilder.create();
+  }
+
   private boolean isUsableParameter(Integer parameterValue) {
     if (parameterValue == null) {
       return true;
@@ -241,7 +281,7 @@
   private BufferedImage stretchImage(BufferedImage image, Integer 
requestedWidth,
       Integer requestedHeight) {
     BufferedImage scaledImage = new BufferedImage(requestedWidth, 
requestedHeight,
-        BufferedImage.TYPE_INT_RGB);
+        BufferedImage.TYPE_INT_ARGB_PRE);
 
     Graphics2D g2d = scaledImage.createGraphics();
     g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
@@ -256,7 +296,8 @@
   }
 
   private HttpResponse getOptimizer(HttpResponse response, ImageFormat 
imageFormat,
-      BufferedImage image) throws IOException, ImageReadException {
+      BufferedImage image) throws IOException {
+
     if (imageFormat == ImageFormat.IMAGE_FORMAT_GIF) {
       // Detecting the existence of the NETSCAPE2.0 extension by string 
comparison
       // is not exactly clean but is good enough to determine if a GIF is 
animated
@@ -275,7 +316,19 @@
   }
 
   private boolean isImageTooLarge(ImageInfo imageInfo) {
-    long imagePixels = abs((long) imageInfo.getWidth()) * abs((long) 
imageInfo.getHeight());
+    return isTargetImageTooLarge(imageInfo.getWidth(), imageInfo.getHeight(), 
imageInfo);
+  }
+
+  /**
+   * @param requestedHeight the requested image height, assumed always 
nonnegative
+   * @param requestedWidth the requested image width, assumed always 
nonnegative
+   * @param imageInfo the image information to analyze
+   * @return {...@code true} if the image size given by the parameters is too 
large to be acceptable
+   *         for serving
+   */
+  private boolean isTargetImageTooLarge(int requestedHeight, int 
requestedWidth,
+      ImageInfo imageInfo) {
+    long imagePixels = abs(requestedHeight) * abs(requestedWidth);
     long imageSizeBits = imagePixels * imageInfo.getBitsPerPixel();
     return imageSizeBits > config.getMaxInMemoryBytes() * BITS_PER_BYTE;
   }

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=781787&r1=781786&r2=781787&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
 Thu Jun  4 16:13:19 2009
@@ -38,17 +38,17 @@
 
   private boolean usePng;
 
-  public GIFOptimizer(OptimizerConfig config, HttpResponse original)
-      throws IOException {
+  public GIFOptimizer(OptimizerConfig config, HttpResponse original) {
     super(config, original);
   }
 
+  @Override
   protected void rewriteImpl(BufferedImage image) throws IOException {
     if (!ImageUtils.isOpaque(image)) {
-      // We can rewrite tranparent GIFs to PNG but for IE6 it requires the use 
of
+      // We can rewrite transparent GIFs to PNG but for IE6 it requires the 
use of
       // the AlphaImageReader and some pain. Deferring this until that is 
proven to work
 
-      // Write to stip any metadata and re-compute the palette. We allow 
arbitrary large palettes
+      // Write to strip any metadata and re-compute the palette. We allow 
arbitrary large palettes
       // here as if the image is already in a direct color model it will 
already have been
       // constrained by the max in-mem constraint.
       write(ImageUtils.palettize(image, Integer.MAX_VALUE));

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriter.java
 Thu Jun  4 16:13:19 2009
@@ -25,7 +25,7 @@
 /**
  * Rewrite an image when it is read from the network
  */
-...@implementedby(NoOpImageRewriter.class)
+...@implementedby(BasicImageRewriter.class)
 public interface ImageRewriter {
 
   /**

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=781787&r1=781786&r2=781787&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
 Thu Jun  4 16:13:19 2009
@@ -53,11 +53,11 @@
 
   private boolean usePng;
 
-  public JPEGOptimizer(OptimizerConfig config, HttpResponse original)
-      throws IOException, ImageReadException {
+  public JPEGOptimizer(OptimizerConfig config, HttpResponse original) {
     super(config, original);
   }
 
+  @Override
   protected void rewriteImpl(BufferedImage image) throws IOException {
     // Create a new optimizer config and disable JPEG conversion
     OptimizerConfig pngConfig = new 
OptimizerConfig(config.getMaxInMemoryBytes(),
@@ -85,6 +85,7 @@
     }
   }
 
+  @Override
   protected String getOutputContentType() {
     if (usePng) {
       return "image/png";
@@ -92,10 +93,12 @@
     return "image/jpeg";
   }
 
+  @Override
   protected String getOriginalContentType() {
     return "image/jpeg";
   }
 
+  @Override
   protected String getOriginalFormatName() {
     return "jpeg";
   }

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=781787&r1=781786&r2=781787&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
 Thu Jun  4 16:13:19 2009
@@ -41,11 +41,11 @@
 
   private boolean useJpeg;
 
-  public PNGOptimizer(OptimizerConfig config, HttpResponse original)
-      throws IOException {
+  public PNGOptimizer(OptimizerConfig config, HttpResponse original) {
     super(config, original);
   }
 
+  @Override
   protected void rewriteImpl(BufferedImage bufferedImage) throws IOException {
     BufferedImage palettized = ImageUtils.palettize(bufferedImage, 
config.getMaxPaletteSize());
     if (palettized != null) {
@@ -53,7 +53,7 @@
     }
 
     if (palettized == null) {
-      // If we are efficiently palettized then only JPEG can really win
+      // If we are efficiently palletized then only JPEG can really win
       if  (this.minBytes == null) {
         // nothing has been written yet, so just strip metadata
         write(bufferedImage);
@@ -105,6 +105,7 @@
     }
   }
 
+  @Override
   protected String getOutputContentType() {
     if (useJpeg) {
       return "image/jpeg";
@@ -112,10 +113,12 @@
     return "image/png";
   }
 
+  @Override
   protected String getOriginalContentType() {
     return "image/png";
   }
 
+  @Override
   protected String getOriginalFormatName() {
     return "png";
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java?rev=781787&r1=781786&r2=781787&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
 Thu Jun  4 16:13:19 2009
@@ -38,6 +38,7 @@
 
 import java.awt.image.BufferedImage;
 import java.io.IOException;
+import java.util.Arrays;
 
 import javax.imageio.ImageIO;
 
@@ -46,10 +47,20 @@
  */
 public class ImageRewriterTest extends TestCase {
 
-  /** The image used for the scaling tests, a head-shot of a white dog, 600pix 
x 600pix */
+  /** The image used for the scaling tests, a head-shot of a white dog, 500pix 
x 500pix */
   private static final String SCALE_IMAGE = 
"org/apache/shindig/gadgets/rewrite/image/dog.gif";
 
+  /** A 60 x 30 image whose size in bytes expands when resized to 120 x 60 */
+  private static final String EXPAND_IMAGE = 
"org/apache/shindig/gadgets/rewrite/image/expand.gif";
+
+  /**
+   * This image has a huge memory footprint that the rewriter should refuse to 
resize, but not
+   * refuse to render.  The response containing this image should not be 
rewritten.
+   */
+  private static final String HUGE_IMAGE = 
"org/apache/shindig/gadgets/rewrite/image/huge.gif";
+
   private static final String CONTENT_TYPE_BOGUS = "notimage/anything";
+  private static final String CONTENT_TYPE_JPG = "image/jpeg";
   private static final String CONTENT_TYPE_GIF = "image/gif";
   private static final String CONTENT_TYPE_PNG = "image/png";
   private static final String CONTENT_TYPE_HEADER = "Content-Type";
@@ -88,11 +99,7 @@
       String targetContentType, String imageName, Integer width, Integer 
height, Integer quality)
       throws Exception {
     HttpResponse originalResponse = getImageResponse(sourceContentType, 
getImageBytes(imageName));
-    HttpRequest request = mockControl.createMock(HttpRequest.class);
-    expect(request.getUri()).andReturn(IMAGE_URL);
-    expect(request.getParamAsInteger(PARAM_RESIZE_QUALITY)).andReturn(quality);
-    expect(request.getParamAsInteger(PARAM_RESIZE_WIDTH)).andReturn(width);
-    expect(request.getParamAsInteger(PARAM_RESIZE_HEIGHT)).andReturn(height);
+    HttpRequest request = getMockRequest(width, height, quality);
 
     mockControl.replay();
     HttpResponse rewrittenResponse = rewriter.rewrite(request, 
originalResponse);
@@ -102,6 +109,15 @@
     return ImageIO.read(rewrittenResponse.getResponse());
   }
 
+  private HttpRequest getMockRequest(Integer width, Integer height, Integer 
quality) {
+    HttpRequest request = mockControl.createMock(HttpRequest.class);
+    expect(request.getUri()).andReturn(IMAGE_URL);
+    expect(request.getParamAsInteger(PARAM_RESIZE_QUALITY)).andReturn(quality);
+    expect(request.getParamAsInteger(PARAM_RESIZE_WIDTH)).andReturn(width);
+    expect(request.getParamAsInteger(PARAM_RESIZE_HEIGHT)).andReturn(height);
+    return request;
+  }
+
   public void testRewriteValidImageWithValidMimeAndExtn() throws Exception {
     byte[] bytes = 
getImageBytes("org/apache/shindig/gadgets/rewrite/image/inefficient.png");
     HttpResponse original = getImageResponse(CONTENT_TYPE_PNG, bytes);
@@ -157,7 +173,7 @@
   // image content, as the ImageIO implementations vary across JVMs, so we 
have to skip it.
 
   public void testResize_width() throws Exception {
-    BufferedImage image = getResizedHttpResponseContent(CONTENT_TYPE_GIF, 
CONTENT_TYPE_PNG,
+    BufferedImage image = getResizedHttpResponseContent(CONTENT_TYPE_GIF, 
CONTENT_TYPE_JPG,
         SCALE_IMAGE, 100 /* width */, null /* height */, null /* quality */);
     assertEquals(100, image.getWidth());
     assertEquals(100, image.getHeight());
@@ -165,14 +181,14 @@
 
   public void testResize_height() throws Exception {
     BufferedImage image = getResizedHttpResponseContent(
-        CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE,  null, 100, null);
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE,  null, 100, null);
     assertEquals(100, image.getWidth());
     assertEquals(100, image.getHeight());
   }
 
   public void testResize_both() throws Exception {
     BufferedImage image = getResizedHttpResponseContent(
-        CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 100, 100, null);
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 100, 100, null);
     assertEquals(100, image.getWidth());
     assertEquals(100, image.getHeight());
   }
@@ -180,29 +196,63 @@
   public void testResize_all() throws Exception {
     // The quality hint apparently has no effect on the result here
     BufferedImage image = getResizedHttpResponseContent(
-        CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 100, 100, 10);
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 100, 100, 10);
     assertEquals(100, image.getWidth());
     assertEquals(100, image.getHeight());
   }
 
   public void testResize_wideImage() throws Exception {
     BufferedImage image = getResizedHttpResponseContent(
-        CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE, 100, 50, null);
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 100, 50, null);
     assertEquals(100, image.getWidth());
     assertEquals(50, image.getHeight());
   }
 
   public void testResize_tallImage() throws Exception {
     BufferedImage image = getResizedHttpResponseContent(
-        CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, SCALE_IMAGE,  50, 100, null);
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE,  50, 100, null);
     assertEquals(50, image.getWidth());
     assertEquals(100, image.getHeight());
   }
 
+  public void testResize_skipResizeHugeOutputImage() throws Exception {
+    BufferedImage image = getResizedHttpResponseContent(
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, SCALE_IMAGE, 10000, 10000, null);
+    assertEquals(500, image.getWidth());
+    assertEquals(500, image.getHeight());
+  }
+
   public void testResize_brokenParameter() throws Exception {
     BufferedImage image = getResizedHttpResponseContent(
         CONTENT_TYPE_GIF, CONTENT_TYPE_GIF, SCALE_IMAGE, -1, null, null);
     assertEquals(500, image.getWidth());
     assertEquals(500, image.getHeight());
   }
+
+  public void testResize_expandImage() throws Exception {
+    BufferedImage image = getResizedHttpResponseContent(
+        CONTENT_TYPE_GIF, CONTENT_TYPE_JPG, EXPAND_IMAGE, 120, 60, null);
+    assertEquals(120, image.getWidth());
+    assertEquals(60, image.getHeight());
+  }
+
+  public void testResize_refuseHugeInputImages() throws Exception {
+    HttpResponse originalResponse = getImageResponse(CONTENT_TYPE_GIF, 
getImageBytes(HUGE_IMAGE));
+    HttpRequest request = getMockRequest(120, 60, null);
+    mockControl.replay();
+    HttpResponse rewrittenResponse = rewriter.rewrite(request, 
originalResponse);
+    mockControl.verify();
+    assertEquals(HttpResponse.SC_FORBIDDEN, 
rewrittenResponse.getHttpStatusCode());
+  }
+
+  public void testResize_acceptServeHugeImages() throws Exception {
+    byte[] imageBytes = getImageBytes(HUGE_IMAGE);
+    HttpResponse originalResponse = getImageResponse(CONTENT_TYPE_GIF, 
imageBytes);
+    HttpRequest request = getMockRequest(null, null, null);
+    mockControl.replay();
+    HttpResponse rewrittenResponse = rewriter.rewrite(request, 
originalResponse);
+    mockControl.verify();
+    assertEquals(HttpResponse.SC_OK, rewrittenResponse.getHttpStatusCode());
+    assertTrue(Arrays.equals(imageBytes, 
IOUtils.toByteArray(rewrittenResponse.getResponse())));
+  }
 }

Added: 
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif?rev=781787&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/expand.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: 
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif?rev=781787&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
incubator/shindig/trunk/java/gadgets/src/test/resources/org/apache/shindig/gadgets/rewrite/image/huge.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream


Reply via email to