package jj.document.servable; import static jj.server.ServerLocation.*; import static jj.document.DocumentScriptEnvironment.*; import javax.inject.Inject; import javax.inject.Singleton; import jj.document.DocumentConfiguration; import jj.document.DocumentScriptEnvironment; import jj.http.server.resource.StaticResource; import jj.resource.ResourceFinder; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; /** * Add our standard dependencies (jQuery, socket-connect) and any automatic * client scripts to the outgoing document * * @author jason * */ @Singleton class ScriptHelperDocumentFilter implements DocumentFilter { private final DocumentConfiguration configuration; private final ResourceFinder resourceFinder; @Inject public ScriptHelperDocumentFilter( final DocumentConfiguration configuration, final ResourceFinder resourceFinder ) { this.configuration = configuration; this.resourceFinder = resourceFinder; } private Element makeScriptTag(Document document, String uri) { return document .createElement("script") .attr("type", "text/javascript") .attr("src", uri); } private void addScript(Document document, Element scriptTag) { document.select("body").append(scriptTag.toString()); } private void addScript(Document document, String uri) { addScript(document, makeScriptTag(document, uri)); } @Override public void filter(final DocumentRequestProcessor documentRequestProcessor) { DocumentScriptEnvironment scriptEnvironment = documentRequestProcessor.documentScriptEnvironment(); if (scriptEnvironment != null && scriptEnvironment.hasServerScript()) { // internal version of jquery // it's versioned already, so no need for sha-ing StaticResource jquery = resourceFinder.findResource(StaticResource.class, Assets, JQUERY_JS); jquery.addDependent(documentRequestProcessor.documentScriptEnvironment()); addScript(documentRequestProcessor.document(), "/" + jquery.name()); // jj script String wsURI = "ws" + (documentRequestProcessor.httpRequest().secure() ? "s" : "") + "://" + documentRequestProcessor.httpRequest().host() + scriptEnvironment.socketUri(); StaticResource jj = resourceFinder.findResource(StaticResource.class, Assets, JJ_JS); jj.addDependent(documentRequestProcessor.documentScriptEnvironment()); Element jjScript = makeScriptTag(documentRequestProcessor.document(), jj.serverPath()) .attr("id", "jj-connector-script") .attr("data-jj-socket-url", wsURI) .attr( "data-jj-startup-messages", documentRequestProcessor.startupJJMessages().toString() ); if (configuration.clientDebug()) { jjScript.attr("data-jj-debug", "true"); } addScript(documentRequestProcessor.document(), jjScript); // associated scripts if (scriptEnvironment.sharedScriptResource() != null) { addScript(documentRequestProcessor.document(), scriptEnvironment.sharedScriptResource().serverPath()); } if (scriptEnvironment.clientScriptResource() != null) { addScript(documentRequestProcessor.document(), scriptEnvironment.clientScriptResource().serverPath()); } } } public boolean needsIO(final DocumentRequestProcessor documentRequestProcessor) { return false; } }