/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.bundle; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import org.mozilla.javascript.ErrorReporter; import org.mozilla.javascript.EvaluatorException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.util.ArgumentChecker; import com.yahoo.platform.yui.compressor.CssCompressor; import com.yahoo.platform.yui.compressor.JavaScriptCompressor; /** * Compressor implementation using YUI compressor. */ public class YUIBundleCompressor implements BundleCompressor { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(YUIBundleCompressor.class); /** * The compressor options. */ private final YUICompressorOptions _compressorOptions; /** * Create a compressor. * * @param compressorOptions the YUICompressor options, not null */ public YUIBundleCompressor(final YUICompressorOptions compressorOptions) { ArgumentChecker.notNull(compressorOptions, "compressorOptions"); _compressorOptions = compressorOptions; } //------------------------------------------------------------------------- @Override public String compressBundle(Bundle bundle) { String source = BundleUtils.readBundleSource(bundle); return compress(source, bundle.getId()); } private String compress(String content, String bundleId) { BundleType type = BundleType.getType(bundleId); switch (type) { case CSS: return compressCss(content); case JS: return compressJs(content); default: return content; } } private String compressJs(String content) { StringWriter writer = new StringWriter(1024); StringReader reader = new StringReader(content); try { JavaScriptCompressor jsCompressor = createJavaScriptCompressor(reader); jsCompressor.compress(writer, _compressorOptions.getLineBreakPosition(), _compressorOptions.isMunge(), _compressorOptions.isWarn(), _compressorOptions.isPreserveAllSemiColons(), !_compressorOptions.isOptimize()); } catch (IOException ex) { s_logger.error("Unexpected IOException", ex); } return writer.toString(); } private JavaScriptCompressor createJavaScriptCompressor(Reader in) throws IOException { return new JavaScriptCompressor(in, new ErrorReporter() { private String getMessage(String source, String message, int line, int lineOffset) { String logMessage; if (line < 0) { logMessage = (source != null) ? source + ":" : "" + message; } else { logMessage = (source != null) ? source + ":" : "" + line + ":" + lineOffset + ":" + message; } return logMessage; } @Override public void warning(String message, String sourceName, int line, String lineSource, int lineOffset) { s_logger.warn(getMessage(sourceName, message, line, lineOffset)); } @Override public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource, int lineOffset) { s_logger.error(getMessage(sourceName, message, line, lineOffset)); return new EvaluatorException(message); } @Override public void error(String message, String sourceName, int line, String lineSource, int lineOffset) { s_logger.error(getMessage(sourceName, message, line, lineOffset)); } }); } private String compressCss(String content) { StringWriter stringWriter = new StringWriter(1024); try { CssCompressor compressor = new CssCompressor(new StringReader(content)); compressor.compress(stringWriter, _compressorOptions.getLineBreakPosition()); } catch (IOException ex) { s_logger.error("Unexpected IOException", ex); } return stringWriter.toString(); } }