You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by il...@apache.org on 2014/03/01 18:26:20 UTC

svn commit: r1573201 - in /cocoon/branches/BRANCH_2_1_X/src: blocks/captcha/java/org/apache/cocoon/reading/CaptchaReader.java blocks/captcha/samples/sitemap.xmap java/org/apache/cocoon/reading/ImageReader.java

Author: ilgrosso
Date: Sat Mar  1 17:26:19 2014
New Revision: 1573201

URL: http://svn.apache.org/r1573201
Log:
[COCOON-2341] Applying provided patches

Modified:
    cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/java/org/apache/cocoon/reading/CaptchaReader.java
    cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/samples/sitemap.xmap
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ImageReader.java

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/java/org/apache/cocoon/reading/CaptchaReader.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/java/org/apache/cocoon/reading/CaptchaReader.java?rev=1573201&r1=1573200&r2=1573201&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/java/org/apache/cocoon/reading/CaptchaReader.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/java/org/apache/cocoon/reading/CaptchaReader.java Sat Mar  1 17:26:19 2014
@@ -25,14 +25,15 @@ import java.awt.RenderingHints;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.awt.image.WritableRaster;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.util.Iterator;
 import java.util.Random;
 
-import com.sun.image.codec.jpeg.JPEGCodec;
-import com.sun.image.codec.jpeg.JPEGEncodeParam;
-import com.sun.image.codec.jpeg.JPEGImageEncoder;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
 
 /**
  * <p>The {@link CaptchaReader} is a simple tool generating JPEG images for the text
@@ -297,14 +298,16 @@ public class CaptchaReader extends Abstr
         warped = null;
 
         /* Write the processed image as a JPEG image */
-        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(buffer);
-        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(result);
-        param.setQuality(quality, true);
-        encoder.encode(result, param);
-        buffer.flush();
-        buffer.close();
-        this.out.write(buffer.toByteArray());
+        Iterator writers = ImageIO.getImageWritersByFormatName("jpeg");
+        ImageOutputStream ios = ImageIO.createImageOutputStream(out);
+        ImageWriter writer = (ImageWriter) writers.next();
+        writer.setOutput(ios);
+        ImageWriteParam p = writer.getDefaultWriteParam();
+        p.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+        p.setCompressionQuality(quality);
+        writer.write(result);
+        
+        ios.flush();
         this.out.flush();
     }
 }

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/samples/sitemap.xmap
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/samples/sitemap.xmap?rev=1573201&r1=1573200&r2=1573201&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/samples/sitemap.xmap (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/captcha/samples/sitemap.xmap Sat Mar  1 17:26:19 2014
@@ -30,7 +30,9 @@
     </map:generators>
   </map:components>
   
-  <map:flow language="javascript" />
+  <map:flow language="javascript">
+    <map:script src="flow/captcha.js"/>
+  </map:flow>
 
   <map:pipelines>
     <map:pipeline type="caching">

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ImageReader.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ImageReader.java?rev=1573201&r1=1573200&r2=1573201&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ImageReader.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ImageReader.java Sat Mar  1 17:26:19 2014
@@ -27,20 +27,20 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
+import java.util.Iterator;
 import java.util.Map;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
 import javax.swing.ImageIcon;
 
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.environment.SourceResolver;
-import org.apache.commons.lang.SystemUtils;
 import org.xml.sax.SAXException;
 
-import com.sun.image.codec.jpeg.ImageFormatException;
-import com.sun.image.codec.jpeg.JPEGCodec;
-import com.sun.image.codec.jpeg.JPEGEncodeParam;
-import com.sun.image.codec.jpeg.JPEGImageEncoder;
-
 /**
  * The <code>ImageReader</code> component is used to serve binary image data
  * in a sitemap pipeline. It makes use of HTTP Headers to determine if
@@ -97,9 +97,6 @@ final public class ImageReader extends R
     private static final boolean ENLARGE_DEFAULT = true;
     private static final boolean FIT_DEFAULT = false;
 
-    /* See http://developer.java.sun.com/developer/bugParade/bugs/4502892.html */
-    private static final boolean JVMBugFixed = SystemUtils.isJavaVersionAtLeast(1.4f);
-
     private int width;
     private int height;
     private float[] scaleColor = new float[3];
@@ -263,28 +260,6 @@ final public class ImageReader extends R
                                   + " expires: " + expires);
             }
 
-            /*
-             * NOTE (SM):
-             * Due to Bug Id 4502892 (which is found in *all* JVM implementations from
-             * 1.2.x and 1.3.x on all OS!), we must buffer the JPEG generation to avoid
-             * that connection resetting by the peer (user pressing the stop button,
-             * for example) crashes the entire JVM (yes, dude, the bug is *that* nasty
-             * since it happens in JPEG routines which are native!)
-             * I'm perfectly aware of the huge memory problems that this causes (almost
-             * doubling memory consumption for each image and making the GC work twice
-             * as hard) but it's *far* better than restarting the JVM every 2 minutes
-             * (since this is the average experience for image-intensive web application
-             * such as an image gallery).
-             * Please, go to the <a href="http://developer.java.sun.com/developer/bugParade/bugs/4502892.html">Sun Developers Connection</a>
-             * and vote this BUG as the one you would like fixed sooner rather than
-             * later and all this hack will automagically go away.
-             * Many deep thanks to Michael Hartle <mh...@hartle-klug.com> for tracking
-             * this down and suggesting the workaround.
-             *
-             * UPDATE (SM):
-             * This appears to be fixed on JDK 1.4
-             */
-
             try {
                 byte content[] = readFully(inputStream);
                 ImageIcon icon = new ImageIcon(content);
@@ -321,25 +296,17 @@ final public class ImageReader extends R
                     colorFilter.filter(currentImage, currentImage);
                 }
 
-                // JVM Bug handling
-                if (JVMBugFixed) {
-                    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
-                    JPEGEncodeParam p = encoder.getDefaultJPEGEncodeParam(currentImage);
-                    p.setQuality(this.quality[0], true);
-                    encoder.setJPEGEncodeParam(p);
-                    encoder.encode(currentImage);
-                } else {
-                    ByteArrayOutputStream bstream = new ByteArrayOutputStream();
-                    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bstream);
-                    JPEGEncodeParam p = encoder.getDefaultJPEGEncodeParam(currentImage);
-                    p.setQuality(this.quality[0], true);
-                    encoder.setJPEGEncodeParam(p);
-                    encoder.encode(currentImage);
-                    out.write(bstream.toByteArray());
-                }
+                Iterator writers = ImageIO.getImageWritersByFormatName("jpeg");
+                ImageOutputStream ios = ImageIO.createImageOutputStream(out);
+                ImageWriter writer = (ImageWriter) writers.next();
+                writer.setOutput(ios);
+                ImageWriteParam p = writer.getDefaultWriteParam();
+                p.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+                p.setCompressionQuality(this.quality[0]);
+                writer.write(currentImage);
 
-                out.flush();
-            } catch (ImageFormatException e) {
+                ios.flush();
+            } catch (IOException e) {
                 throw new ProcessingException("Error reading the image. " +
                                               "Note that only JPEG images are currently supported.");
             } finally {