Package com.softwarementors.extjs.djn.jscodegen

Source Code of com.softwarementors.extjs.djn.jscodegen.Minifier

/*
* Copyright © 2008, 2012 Pedro Agulló Soliveres.
*
* This file is part of DirectJNgine.
*
* DirectJNgine is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* Commercial use is permitted to the extent that the code/component(s)
* do NOT become part of another Open Source or Commercially developed
* licensed development library or toolkit without explicit permission.
*
* DirectJNgine is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with DirectJNgine.  If not, see <http://www.gnu.org/licenses/>.
*
* This software uses the ExtJs library (http://extjs.com), which is
* distributed under the GPL v3 license (see http://extjs.com/license).
*/

package com.softwarementors.extjs.djn.jscodegen;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;

import org.apache.log4j.Logger;
import org.mozilla.javascript.ErrorReporter;
import org.mozilla.javascript.EvaluatorException;

import com.softwarementors.extjs.djn.StringUtils;
import com.softwarementors.extjs.djn.Timer;
import com.yahoo.platform.yui.compressor.JavaScriptCompressor;

import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;

public class Minifier {

  @NonNull
  private static final Logger logger = Logger.getLogger( Minifier.class);

  private Minifier() {
    // Avoid instantation
  }

  public static String getMinifiedFileName(String file) {
    assert !StringUtils.isEmpty(file);
   
    String result = file.replace( ".js", "-min.js" );
    return result;
  }

  @CheckForNull public static final String minify( String input, String inputFilename, int debugCodeLength ) {
    assert input != null;
    assert !StringUtils.isEmpty(inputFilename);
    assert debugCodeLength > 0;

    try {
      Timer timer = new Timer();     
      // logger.debug( "Starting minification for '" + inputFilename + "'...");
      Reader in = new StringReader( input );
      JavaScriptCompressor compressor = new JavaScriptCompressor(in, new ErrorReporter() {
        public void warning(String message, String sourceName,
            int line, String lineSource, int lineOffset) {
          if (line < 0) {
            logger.warn("Minifier Warning: " + message);
          } else {
            logger.warn("Minifier Warning, " + line + ':' + lineOffset + ':' + message);
          }
        }

        public void error(String message, String sourceName,
            int line, String lineSource, int lineOffset) {
          if (line < 0) {
            logger.warn("Minifier Error: " + message);
          } else {
            logger.warn("Minifier Error, " + line + ':' + lineOffset + ':' + message);
          }
        }

        public EvaluatorException runtimeError(String message, String sourceName,
            int line, String lineSource, int lineOffset) {
          error(message, sourceName, line, lineSource, lineOffset);
          return new EvaluatorException(message);
        }
      });

      // Close the input stream first, and then open the output stream,
      // in case the output file should override the input file.
      in.close();

      try {
        Writer out = new StringWriter();
        boolean munge = true;
        boolean preserveAllSemiColons = false;
        boolean disableOptimizations = false;
        boolean verbose = false;
        int linebreakpos = 0;

        compressor.compress(out, linebreakpos, munge, verbose,
            preserveAllSemiColons, disableOptimizations);
        out.close();
        String result = out.toString();
        if( logger.isDebugEnabled() ) {
          timer.stop();
          int compressionPercentage = 100 - (result.length() * 100 / debugCodeLength);
          timer.logDebugTimeInMilliseconds( "Finished minification for '" + inputFilename + "'. Debug code length: " + debugCodeLength + ", Minified length: " + result.length() + ", Compression: " + compressionPercentage + "%. Time");
        }
        return result;
      }
      catch (UnsupportedEncodingException e) {
        logger.warn( "Unable to minify '" + inputFilename + "'.", e );
        return null;
      }
    }
    catch( IOException e) {
      logger.warn( "Unable to minify '" + inputFilename + "' due to an IOException.", e );
      return null;
    }
    catch (EvaluatorException e) {
      logger.warn( "Unable to minify '" + inputFilename + "' due to a problem with the Javascript evaluator.", e );
      return null;
    }
  }

}
TOP

Related Classes of com.softwarementors.extjs.djn.jscodegen.Minifier

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.