package org.smartly.packages.htmldeployer.impl.compressor;
import compressor.CssCompressor;
import compressor.JavaScriptCompressor;
import old.mozilla.javascript.ErrorReporter;
import old.mozilla.javascript.EvaluatorException;
import org.lesscss.LessCompiler;
import org.smartly.Smartly;
import org.smartly.commons.logging.Level;
import org.smartly.commons.logging.Logger;
import org.smartly.commons.logging.util.LoggingUtils;
import org.smartly.commons.util.FileUtils;
import org.smartly.commons.util.PathUtils;
import java.io.*;
/**
* User: angelo.geminiani
*/
public class Compressor {
private static final String ENCODING = Smartly.getCharset();
private boolean _obfuscate;
private boolean _preserveAllSemicolons;
private boolean _disableOptimizations;
private boolean _verbose;
private int _linebreakpos;
public Compressor() {
_obfuscate = false;
_preserveAllSemicolons = false;
_disableOptimizations = false;
_verbose = false;
_linebreakpos = -1;
}
public boolean isObfuscate() {
return _obfuscate;
}
public void setObfuscate(boolean value) {
this._obfuscate = value;
}
public boolean isPreserveAllSemicolons() {
return _preserveAllSemicolons;
}
public void setPreserveAllSemicolons(boolean value) {
this._preserveAllSemicolons = value;
}
public boolean isDisableOptimizations() {
return _disableOptimizations;
}
public void setDisableOptimizations(boolean value) {
this._disableOptimizations = value;
}
public boolean isVerbose() {
return _verbose;
}
public void setVerbose(boolean value) {
this._verbose = value;
}
public int getLinebreakpos() {
return _linebreakpos;
}
public void setLinebreakpos(int value) {
this._linebreakpos = value;
}
public byte[] compressBytes(final byte[] bytes, final String fileName) throws Exception {
final String ext = PathUtils.getFilenameExtension(fileName, true);
final Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes));
final Writer out = new StringWriter();
if (".js".equalsIgnoreCase(ext)) {
this.compressJs(reader, out);
} else if (".css".equalsIgnoreCase(ext)) {
this.compressCss(reader, out);
} else if (".less".equalsIgnoreCase(ext)) {
this.compressLess(reader, out);
} else {
this.compressCss(reader, out);
}
final byte[] result = out.toString().getBytes();
try {
reader.close();
} catch (Throwable ignored) {
}
try {
out.close();
} catch (Throwable ignored) {
}
return result;
}
public void compress(final String text, final String outputFilename) throws Exception {
final String ext = PathUtils.getFilenameExtension(outputFilename, true);
final StringReader reader = new StringReader(text);
Writer out = null;
try {
out = new OutputStreamWriter(new FileOutputStream(outputFilename), ENCODING);
if (".js".equalsIgnoreCase(ext)) {
this.compressJs(reader, out);
} else if (".css".equalsIgnoreCase(ext)) {
this.compressCss(reader, out);
} else if (".less".equalsIgnoreCase(ext)) {
this.compressLess(reader, out);
} else {
this.compressCss(reader, out);
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
this.getLogger().log(Level.SEVERE, null, e);
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
this.getLogger().log(Level.SEVERE, null, e);
}
}
}
}
public void compressJs(final Reader reader, final Writer out) throws Exception {
final JavaScriptCompressor compressor = this.getJsCompressor(reader);
compressor.compress(out, _linebreakpos, _obfuscate, _verbose,
_preserveAllSemicolons, _disableOptimizations);
}
public void compressCss(final Reader reader, final Writer out) throws Exception {
final CssCompressor compressor = this.getCssCompressor(reader);
compressor.compress(out, _linebreakpos);
}
public void compressLess(final Reader reader, final Writer out) throws Exception {
final LessCompiler less = this.getLessCompiler();
final String source = FileUtils.copyToString(reader);
final String sout = less.compile(source);
out.write(sout);
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
private Logger getLogger() {
return LoggingUtils.getLogger(this);
}
private JavaScriptCompressor getJsCompressor(final Reader reader) throws IOException {
final Logger logger = this.getLogger();
JavaScriptCompressor compressor = new JavaScriptCompressor(reader, new ErrorReporter() {
public void warning(String message, String sourceName,
int line, String lineSource, int lineOffset) {
if (line < 0) {
logger.warning("[WARNING] " + message);
} else {
logger.warning("[WARNING] " + line + ':' + lineOffset + ':' + message);
}
}
public void error(String message, String sourceName,
int line, String lineSource, int lineOffset) {
if (line < 0) {
logger.severe("[ERROR] " + message);
} else {
logger.severe("[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);
}
});
return compressor;
}
private CssCompressor getCssCompressor(final Reader reader) throws IOException {
final CssCompressor compressor = new CssCompressor(reader);
return compressor;
}
private LessCompiler getLessCompiler() {
final LessCompiler lessCompiler = new LessCompiler();
return lessCompiler;
}
}