/*
* Copyright (C) 2011 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.gatein.portal.controller.resource;
import java.io.ByteArrayOutputStream;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import org.exoplatform.commons.cache.future.Loader;
import org.exoplatform.commons.utils.CharsetTextEncoder;
import org.exoplatform.commons.utils.Safe;
import org.exoplatform.commons.utils.TextEncoder;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.web.ControllerContext;
import org.exoplatform.web.application.javascript.JavascriptConfigService;
import org.gatein.common.io.IOTools;
import com.google.javascript.jscomp.CompilationLevel;
import com.google.javascript.jscomp.Compiler;
import com.google.javascript.jscomp.CompilerOptions;
import com.google.javascript.jscomp.JSError;
import com.google.javascript.jscomp.JSSourceFile;
import com.google.javascript.jscomp.LoggerErrorManager;
import com.google.javascript.jscomp.Result;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
*/
class ScriptLoader implements Loader<ScriptKey, ScriptResult, ControllerContext> {
public ScriptResult retrieve(ControllerContext context, ScriptKey key) throws Exception {
JavascriptConfigService service = (JavascriptConfigService) PortalContainer.getComponent(JavascriptConfigService.class);
//
Reader script = service.getScript(key.id, key.locale);
String sourceName = key.id.getScope() + "/" + key.id.getName() + ".js";
//
if (script != null) {
if (key.minified) {
CompilationLevel level = CompilationLevel.SIMPLE_OPTIMIZATIONS;
CompilerOptions options = new CompilerOptions();
level.setOptionsForCompilationLevel(options);
com.google.javascript.jscomp.Compiler compiler = new Compiler();
compiler.setErrorManager(new LoggerErrorManager(java.util.logging.Logger.getLogger(ResourceRequestHandler.class
.getName())));
StringWriter code = new StringWriter();
IOTools.copy(script, code);
JSSourceFile[] inputs = new JSSourceFile[] { JSSourceFile.fromCode(sourceName, code.toString()) };
Result res = compiler.compile(new JSSourceFile[0], inputs, options);
if (res.success) {
script = new StringReader(compiler.toSource());
} else {
StringBuilder msg = new StringBuilder("Handle me gracefully JS errors\n");
for (JSError error : res.errors) {
msg.append(error.sourceName).append(":").append(error.lineNumber).append(" ").append(error.description)
.append("\n");
}
return new ScriptResult.Error(msg.toString());
}
}
// Encode data
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
TextEncoder encoder = CharsetTextEncoder.getUTF8();
char[] buffer = new char[256];
for (int l = script.read(buffer); l != -1; l = script.read(buffer)) {
encoder.encode(buffer, 0, l, out);
}
return new ScriptResult.Resolved(out.toByteArray());
} finally {
Safe.close(script);
}
}
//
return ScriptResult.NOT_FOUND;
}
}