You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/04/01 01:16:15 UTC

svn commit: r1087498 - in /tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor: AbstractMinimizer.java JavaScriptResourceMinimizer.java

Author: hlship
Date: Thu Mar 31 23:16:15 2011
New Revision: 1087498

URL: http://svn.apache.org/viewvc?rev=1087498&view=rev
Log:
TAP5-73: Refactor out a base class for implementing minimizers

Added:
    tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/AbstractMinimizer.java
      - copied, changed from r1087497, tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java
Modified:
    tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java

Copied: tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/AbstractMinimizer.java (from r1087497, tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/AbstractMinimizer.java?p2=tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/AbstractMinimizer.java&p1=tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java&r1=1087497&r2=1087498&rev=1087498&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java (original)
+++ tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/AbstractMinimizer.java Thu Mar 31 23:16:15 2011
@@ -35,12 +35,7 @@ import org.mozilla.javascript.ErrorRepor
 import org.mozilla.javascript.EvaluatorException;
 import org.slf4j.Logger;
 
-import com.yahoo.platform.yui.compressor.JavaScriptCompressor;
-
-/**
- * JavaScript resource minimizer based on the YUI {@link JavaScriptCompressor}.
- */
-public class JavaScriptResourceMinimizer implements ResourceMinimizer
+public abstract class AbstractMinimizer implements ResourceMinimizer
 {
     private static final double NANOS_TO_MILLIS = 1.0d / 1000000.0d;
 
@@ -48,40 +43,15 @@ public class JavaScriptResourceMinimizer
 
     private final OperationTracker tracker;
 
-    public JavaScriptResourceMinimizer(Logger logger, OperationTracker tracker)
+    private final String resourceType;
+
+    public AbstractMinimizer(Logger logger, OperationTracker tracker, String resourceType)
     {
         this.logger = logger;
         this.tracker = tracker;
+        this.resourceType = resourceType;
     }
 
-    private final ErrorReporter errorReporter = new ErrorReporter()
-    {
-        private String format(String message, int line, int lineOffset)
-        {
-            if (line < 0)
-                return message;
-
-            return String.format("(%d:%d): %s", line, lineOffset, message);
-        }
-
-        public void warning(String message, String sourceName, int line, String lineSource, int lineOffset)
-        {
-            logger.warn(format(message, line, lineOffset));
-        }
-
-        public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource,
-                int lineOffset)
-        {
-            error(message, sourceName, line, lineSource, lineOffset);
-
-            return new EvaluatorException(message);
-        }
-
-        public void error(String message, String sourceName, int line, String lineSource, int lineOffset)
-        {
-        }
-    };
-
     public StreamableResource minimize(StreamableResource input) throws IOException
     {
         long startNanos = System.nanoTime();
@@ -94,19 +64,17 @@ public class JavaScriptResourceMinimizer
 
         final Writer writer = new OutputStreamWriter(bos);
 
-        TapestryInternalUtils.performIO(tracker, "Compressing JavaScript using YUICompressor", new IOOperation()
+        TapestryInternalUtils.performIO(tracker, "Minimizing " + resourceType, new IOOperation()
         {
             public void perform() throws IOException
             {
                 try
                 {
-                    JavaScriptCompressor compressor = new JavaScriptCompressor(reader, errorReporter);
-
-                    compressor.compress(writer, 0, true, false, false, false);
+                    doMinimize(reader, writer);
                 }
                 catch (EvaluatorException ex)
                 {
-                    throw new RuntimeException(String.format("Unable to compress JavaScript: %s",
+                    throw new RuntimeException(String.format("Unable to minimize %s: %s", resourceType,
                             InternalUtils.toMessage(ex)), ex);
                 }
             }
@@ -126,8 +94,8 @@ public class JavaScriptResourceMinimizer
         {
             double elapsedMillis = ((double) elapsedNanos) * NANOS_TO_MILLIS;
 
-            logger.debug(String.format("Minimized %,d input bytes to %,d output bytes in %.2f ms", input.getSize(),
-                    output.getSize(), elapsedMillis));
+            logger.debug(String.format("Minimized %,d input bytes of %s to %,d output bytes in %.2f ms",
+                    input.getSize(), resourceType, output.getSize(), elapsedMillis));
         }
 
         return output;
@@ -137,4 +105,14 @@ public class JavaScriptResourceMinimizer
     {
         return new InputStreamReader(input, "UTF-8");
     }
+
+    /**
+     * Implemented in subclasses to do the actual work.
+     * 
+     * @param input
+     *            content to minimize
+     * @param output
+     *            writer for minimized version of input
+     */
+    protected abstract void doMinimize(Reader input, Writer output) throws IOException;
 }

Modified: tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java?rev=1087498&r1=1087497&r2=1087498&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java (original)
+++ tapestry/tapestry5/trunk/tapestry-yuicompressor/src/main/java/org/apache/tapestry5/internal/yuicompressor/JavaScriptResourceMinimizer.java Thu Mar 31 23:16:15 2011
@@ -14,23 +14,11 @@
 
 package org.apache.tapestry5.internal.yuicompressor;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
 import java.io.Reader;
 import java.io.Writer;
 
-import org.apache.tapestry5.internal.IOOperation;
-import org.apache.tapestry5.internal.TapestryInternalUtils;
-import org.apache.tapestry5.internal.services.assets.BytestreamCache;
-import org.apache.tapestry5.internal.services.assets.StreamableResourceImpl;
 import org.apache.tapestry5.ioc.OperationTracker;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.services.assets.CompressionStatus;
-import org.apache.tapestry5.services.assets.ResourceMinimizer;
-import org.apache.tapestry5.services.assets.StreamableResource;
 import org.mozilla.javascript.ErrorReporter;
 import org.mozilla.javascript.EvaluatorException;
 import org.slf4j.Logger;
@@ -40,101 +28,49 @@ import com.yahoo.platform.yui.compressor
 /**
  * JavaScript resource minimizer based on the YUI {@link JavaScriptCompressor}.
  */
-public class JavaScriptResourceMinimizer implements ResourceMinimizer
+public class JavaScriptResourceMinimizer extends AbstractMinimizer
 {
-    private static final double NANOS_TO_MILLIS = 1.0d / 1000000.0d;
+    private final ErrorReporter errorReporter;
 
-    private final Logger logger;
-
-    private final OperationTracker tracker;
-
-    public JavaScriptResourceMinimizer(Logger logger, OperationTracker tracker)
-    {
-        this.logger = logger;
-        this.tracker = tracker;
-    }
-
-    private final ErrorReporter errorReporter = new ErrorReporter()
+    public JavaScriptResourceMinimizer(final Logger logger, OperationTracker tracker)
     {
-        private String format(String message, int line, int lineOffset)
-        {
-            if (line < 0)
-                return message;
+        super(logger, tracker, "JavaScript");
 
-            return String.format("(%d:%d): %s", line, lineOffset, message);
-        }
-
-        public void warning(String message, String sourceName, int line, String lineSource, int lineOffset)
+        errorReporter = new ErrorReporter()
         {
-            logger.warn(format(message, line, lineOffset));
-        }
-
-        public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource,
-                int lineOffset)
-        {
-            error(message, sourceName, line, lineSource, lineOffset);
-
-            return new EvaluatorException(message);
-        }
-
-        public void error(String message, String sourceName, int line, String lineSource, int lineOffset)
-        {
-        }
-    };
-
-    public StreamableResource minimize(StreamableResource input) throws IOException
-    {
-        long startNanos = System.nanoTime();
-
-        InputStream inputStream = input.openStream();
-
-        final Reader reader = toReader(inputStream);
-
-        ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
+            private String format(String message, int line, int lineOffset)
+            {
+                if (line < 0)
+                    return message;
 
-        final Writer writer = new OutputStreamWriter(bos);
+                return String.format("(%d:%d): %s", line, lineOffset, message);
+            }
 
-        TapestryInternalUtils.performIO(tracker, "Compressing JavaScript using YUICompressor", new IOOperation()
-        {
-            public void perform() throws IOException
+            public void warning(String message, String sourceName, int line, String lineSource, int lineOffset)
             {
-                try
-                {
-                    JavaScriptCompressor compressor = new JavaScriptCompressor(reader, errorReporter);
-
-                    compressor.compress(writer, 0, true, false, false, false);
-                }
-                catch (EvaluatorException ex)
-                {
-                    throw new RuntimeException(String.format("Unable to compress JavaScript: %s",
-                            InternalUtils.toMessage(ex)), ex);
-                }
+                logger.warn(format(message, line, lineOffset));
             }
-        });
-
-        inputStream.close();
-        writer.close();
-
-        // The content is minimized, but can still be (GZip) compressed.
 
-        StreamableResource output = new StreamableResourceImpl(input.getContentType(), CompressionStatus.COMPRESSABLE,
-                input.getLastModified(), new BytestreamCache(bos));
-
-        long elapsedNanos = System.nanoTime() - startNanos;
+            public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource,
+                    int lineOffset)
+            {
+                error(message, sourceName, line, lineSource, lineOffset);
 
-        if (logger.isDebugEnabled())
-        {
-            double elapsedMillis = ((double) elapsedNanos) * NANOS_TO_MILLIS;
+                return new EvaluatorException(message);
+            }
 
-            logger.debug(String.format("Minimized %,d input bytes to %,d output bytes in %.2f ms", input.getSize(),
-                    output.getSize(), elapsedMillis));
-        }
+            public void error(String message, String sourceName, int line, String lineSource, int lineOffset)
+            {
+                logger.error(format(message, line, lineOffset));
+            }
+        };
 
-        return output;
     }
 
-    private Reader toReader(InputStream input) throws IOException
+    protected void doMinimize(Reader input, Writer output) throws IOException
     {
-        return new InputStreamReader(input, "UTF-8");
+        JavaScriptCompressor compressor = new JavaScriptCompressor(input, errorReporter);
+
+        compressor.compress(output, 0, true, false, false, false);
     }
 }