/**
*
*/
package com.google.gwt.chrome.crx.linker;
import java.util.SortedSet;
import com.google.gwt.chrome.crx.client.GwtContentScript;
import com.google.gwt.core.ext.LinkerContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.linker.AbstractLinker;
import com.google.gwt.core.ext.linker.ArtifactSet;
import com.google.gwt.core.ext.linker.CompilationResult;
import com.google.gwt.core.ext.linker.LinkerOrder;
import com.google.gwt.core.ext.linker.LinkerOrder.Order;
/**
* Linker for {@link GwtContentScript} for Chrome Extension
*
* @author Izzet_Mustafaiev
*
*/
@LinkerOrder(Order.PRIMARY)
public class GwtContentScriptLinker extends AbstractLinker {
/*
* (non-Javadoc)
*
* @see com.google.gwt.core.ext.Linker#getDescription()
*/
@Override
public String getDescription() {
return "Chrome Extension GwtContentScript Linker";
}
/*
* (non-Javadoc)
*
* @see
* com.google.gwt.core.ext.Linker#link(com.google.gwt.core.ext.TreeLogger,
* com.google.gwt.core.ext.LinkerContext,
* com.google.gwt.core.ext.linker.ArtifactSet)
*/
@Override
public ArtifactSet link(TreeLogger logger, LinkerContext context, ArtifactSet artifacts)
throws UnableToCompleteException {
String scriptFileName = context.getModuleName() + ".js";
final SortedSet<CompilationResult> compilations = artifacts.find(CompilationResult.class);
ensureOnlyOneCompilationResult(logger, compilations);
CompilationResult compilationResult = compilations.first();
String javascript = compilationResult.getJavaScript()[0];
ensureJavaScriptPresent(logger, javascript);
String contentScript = enhanceJavaScript(javascript);
ArtifactSet resultArtifactSet = new ArtifactSet(artifacts);
resultArtifactSet.add(emitString(logger, contentScript, scriptFileName));
return resultArtifactSet;
}
private String enhanceJavaScript(final String javascript) {
StringBuffer contentScript = new StringBuffer(javascript.length() + 16);
contentScript.append("(function() {\n");
contentScript.append("$wnd=window,");
contentScript.append("$doc=document,");
contentScript.append("$stats=$wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);}:null;\n");
contentScript.append(javascript);
contentScript.append("gwtOnLoad();\n}());");
return contentScript.toString();
}
private void ensureJavaScriptPresent(TreeLogger logger, String javascript) throws UnableToCompleteException {
if (null == javascript || (null != javascript && javascript.length() < 1)) {
logger.log(TreeLogger.ERROR,
"JavaScript is empty, please provide some code or remove GwtContentScript definition.");
throw new UnableToCompleteException();
}
}
private void ensureOnlyOneCompilationResult(TreeLogger logger, final SortedSet<CompilationResult> compilations)
throws UnableToCompleteException {
if (compilations.size() > 1) {
logger.log(TreeLogger.ERROR,
"One permutation per module, please. Seriously, you changed something you weren't supposed to.");
throw new UnableToCompleteException();
}
}
}