/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.portal.resource.compressor;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.container.xml.ValueParam;
import org.exoplatform.portal.resource.AbstractWebResourceTest;
import org.exoplatform.portal.resource.compressor.impl.ClosureCompressorPlugin;
import org.exoplatform.portal.resource.compressor.impl.JSMinCompressorPlugin;
import org.exoplatform.portal.resource.compressor.impl.ResourceCompressorService;
import com.google.javascript.jscomp.CompilationLevel;
import com.google.javascript.jscomp.Compiler;
import com.google.javascript.jscomp.CompilerOptions;
import com.google.javascript.jscomp.JSSourceFile;
/**
* @author <a href="trong.tran@exoplatform.com">Trong Tran</a>
* @version $Revision$
*/
public class TestResourceCompressorService extends AbstractWebResourceTest {
public void testInitializing() {
ResourceCompressorService compressor = (ResourceCompressorService) getContainer().getComponentInstanceOfType(
ResourceCompressor.class);
assertNotNull(compressor);
assertTrue(compressor instanceof ResourceCompressorService);
assertNotNull(compressor.getCompressorPlugin(ResourceType.JAVASCRIPT, "MockCompressorPlugin"));
assertNotNull(compressor.getCompressorPlugin(ResourceType.JAVASCRIPT, "JSMinCompressorPlugin"));
}
public void testPriority() {
ResourceCompressorService compressor = (ResourceCompressorService) getContainer().getComponentInstanceOfType(
ResourceCompressor.class);
ResourceCompressorPlugin plugin = compressor.getHighestPriorityCompressorPlugin(ResourceType.JAVASCRIPT);
assertTrue(plugin instanceof JSMinCompressorPlugin);
}
public void testJSMinCompressing() throws IOException {
File jsFile = new File("src/test/resources/javascript.js");
File jsCompressedFile = new File("target/jsmin-compressed-file.js");
Reader reader = new FileReader(jsFile);
Writer writer = new FileWriter(jsCompressedFile);
ResourceCompressorService compressor = (ResourceCompressorService) getContainer().getComponentInstanceOfType(
ResourceCompressor.class);
try {
compressor.compress(reader, writer, ResourceType.JAVASCRIPT);
} catch (Exception e) {
fail(e.getLocalizedMessage());
}
writer.close();
assertTrue(jsCompressedFile.length() > 0);
assertTrue(jsFile.length() > jsCompressedFile.length());
log.info("The original javascript (" + getFileSize(jsFile) + ") is compressed by JSMIN into "
+ jsCompressedFile.getAbsolutePath() + " (" + getFileSize(jsCompressedFile) + ")");
}
public void testClosureCompressing() throws Exception {
File jsFile = new File("src/test/resources/javascript.js");
File jsCompressedFile = new File("target/closure-compressed-file.js");
Reader reader = new FileReader(jsFile);
Writer writer = new FileWriter(jsCompressedFile);
ResourceCompressorService compressor = (ResourceCompressorService) getContainer().getComponentInstanceOfType(
ResourceCompressor.class);
InitParams priorityParam = new InitParams();
ValueParam param = new ValueParam();
param.setName("plugin.priority");
param.setValue("10");
priorityParam.addParameter(param);
ClosureCompressorPlugin plugin = new ClosureCompressorPlugin(priorityParam);
compressor.registerCompressorPlugin(plugin);
try {
compressor.compress(reader, writer, ResourceType.JAVASCRIPT);
} catch (Exception e) {
fail(e.getLocalizedMessage());
} finally {
unregisterCompressorPlugin(compressor, plugin);
reader.close();
writer.close();
}
assertTrue(jsCompressedFile.length() > 0);
assertTrue(jsFile.length() > jsCompressedFile.length());
log.info("The original javascript (" + getFileSize(jsFile) + ") is compressed by CLOSURE COMPILER into "
+ jsCompressedFile.getAbsolutePath() + " (" + getFileSize(jsCompressedFile) + ")");
String expectedJS = closureCompress(jsFile);
assertEquals(expectedJS.length(), jsCompressedFile.length());
}
private void unregisterCompressorPlugin(ResourceCompressorService compressor, ResourceCompressorPlugin plugin)
throws Exception {
Field pluginsField = compressor.getClass().getDeclaredField("plugins");
pluginsField.setAccessible(true);
@SuppressWarnings("unchecked")
Map<ResourceType, List<ResourceCompressorPlugin>> plugins = (Map<ResourceType, List<ResourceCompressorPlugin>>) pluginsField
.get(compressor);
plugins.get(plugin.getResourceType()).remove(plugin);
}
private String closureCompress(File input) throws Exception {
Compiler compiler = new Compiler();
CompilerOptions options = new CompilerOptions();
CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options);
JSSourceFile extern = JSSourceFile.fromCode("extern", "");
JSSourceFile jsInput;
try {
jsInput = JSSourceFile.fromFile(input);
} catch (Exception ex) {
throw new ResourceCompressorException(ex);
}
compiler.compile(extern, jsInput, options);
return compiler.toSource();
}
public void testYUICSSCompressing() throws IOException {
File cssFile = new File("src/test/resources/Stylesheet.css");
File compressedCssFile = new File("target/yui-compressed-file.css");
Reader reader = new FileReader(cssFile);
Writer writer = new FileWriter(compressedCssFile);
ResourceCompressorService compressor = (ResourceCompressorService) getContainer().getComponentInstanceOfType(
ResourceCompressor.class);
try {
compressor.compress(reader, writer, ResourceType.STYLESHEET);
} catch (Exception e) {
fail(e.getLocalizedMessage());
}
writer.close();
assertTrue(compressedCssFile.length() > 0);
assertTrue(cssFile.length() > compressedCssFile.length());
log.info("The original CSS (" + getFileSize(cssFile) + ") is compressed by YUI library into "
+ compressedCssFile.getAbsolutePath() + " (" + getFileSize(compressedCssFile) + ")");
}
private String getFileSize(File file) {
return (file.length() / 1024) + " KB";
}
}