Author: radu Date: Tue Jul 14 12:01:45 2015 New Revision: 1690906 URL: http://svn.apache.org/r1690906 Log: SLING-4855 - Add support for Compilable Script Engines in the Sightly JS Use Provider
* run Compilable#eval for ScriptEngine implementations that support Compilable * added JS scripts to the scripts monitored by the ScriptCache implementation provided by Sling * updated the Sightly tests launchpad to use the bundle versions corresponding to SLING-913, SLING-915 Modified: sling/trunk/bundles/scripting/sightly/js-use-provider/pom.xml sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt Modified: sling/trunk/bundles/scripting/sightly/js-use-provider/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/js-use-provider/pom.xml?rev=1690906&r1=1690905&r2=1690906&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/js-use-provider/pom.xml (original) +++ sling/trunk/bundles/scripting/sightly/js-use-provider/pom.xml Tue Jul 14 12:01:45 2015 @@ -96,8 +96,14 @@ </dependency> <dependency> <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.scripting.core</artifactId> + <version>2.0.29-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.scripting.api</artifactId> - <version>2.1.0</version> + <version>2.1.7-SNAPSHOT</version> <scope>provided</scope> </dependency> <dependency> Modified: sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java?rev=1690906&r1=1690905&r2=1690906&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java (original) +++ sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java Tue Jul 14 12:01:45 2015 @@ -21,8 +21,8 @@ package org.apache.sling.scripting.sight import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; - import javax.script.Bindings; +import javax.script.Compilable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptException; @@ -36,6 +36,7 @@ import org.apache.sling.api.resource.Res import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.scripting.SlingBindings; import org.apache.sling.api.scripting.SlingScriptHelper; +import org.apache.sling.scripting.core.ScriptNameAwareReader; import org.apache.sling.scripting.sightly.ResourceResolution; import org.apache.sling.scripting.sightly.SightlyException; import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer; @@ -109,6 +110,7 @@ public class JsEnvironment { CommonJsModule module = new CommonJsModule(); Bindings scriptBindings = buildBindings(scriptResource, globalBindings, arguments, module); scriptContext.setBindings(scriptBindings, ScriptContext.ENGINE_SCOPE); + scriptContext.setAttribute(ScriptEngine.FILENAME, scriptResource.getPath(), ScriptContext.ENGINE_SCOPE); runScript(scriptResource, scriptContext, callback, module); } @@ -156,8 +158,15 @@ public class JsEnvironment { public void run() { Reader reader = null; try { - reader = new InputStreamReader(scriptResource.adaptTo(InputStream.class)); - Object result = jsEngine.eval(reader, scriptContext); + Object result; + if (jsEngine instanceof Compilable) { + reader = new ScriptNameAwareReader(new InputStreamReader(scriptResource.adaptTo(InputStream.class)), + scriptResource.getPath()); + result = ((Compilable) jsEngine).compile(reader).eval(scriptContext); + } else { + reader = new InputStreamReader(scriptResource.adaptTo(InputStream.class)); + result = jsEngine.eval(reader, scriptContext); + } if (commonJsModule.isModified()) { result = commonJsModule.getExports(); } Modified: sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java?rev=1690906&r1=1690905&r2=1690906&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java (original) +++ sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java Tue Jul 14 12:01:45 2015 @@ -18,6 +18,12 @@ ******************************************************************************/ package org.apache.sling.scripting.sightly.js.impl; +import java.io.IOException; +import java.util.Arrays; +import java.util.Dictionary; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Set; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; @@ -26,15 +32,14 @@ import org.apache.felix.scr.annotations. import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferencePolicy; import org.apache.felix.scr.annotations.Service; -import org.apache.sling.api.SlingException; -import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; -import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.scripting.SlingScriptHelper; +import org.apache.sling.commons.osgi.PropertiesUtil; +import org.apache.sling.scripting.api.ScriptCache; import org.apache.sling.scripting.sightly.SightlyException; -import org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl; import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer; import org.apache.sling.scripting.sightly.js.impl.async.AsyncExtractor; import org.apache.sling.scripting.sightly.js.impl.jsapi.SlyBindingsValuesProvider; @@ -43,6 +48,9 @@ import org.apache.sling.scripting.sightl import org.apache.sling.scripting.sightly.use.ProviderOutcome; import org.apache.sling.scripting.sightly.use.UseProvider; import org.osgi.framework.Constants; +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,8 +76,10 @@ import org.slf4j.LoggerFactory; public class JsUseProvider implements UseProvider { private static final String JS_ENGINE_NAME = "javascript"; + private static final String SCRIPT_CACHE_PID = "org.apache.sling.scripting.core.impl.ScriptCacheImpl"; + private static final String SCRIPT_CACHE_ADDITIONAL_EXTENSIONS = "org.apache.sling.scripting.cache.additional_extensions"; - private static final Logger log = LoggerFactory.getLogger(JsUseProvider.class); + private static final Logger LOGGER = LoggerFactory.getLogger(JsUseProvider.class); private static final JsValueAdapter jsValueAdapter = new JsValueAdapter(new AsyncExtractor()); @Reference @@ -78,6 +88,9 @@ public class JsUseProvider implements Us @Reference private SlyBindingsValuesProvider slyBindingsValuesProvider = null; + @Reference + private ConfigurationAdmin configurationAdmin = null; + @Override public ProviderOutcome provide(String identifier, RenderContext renderContext, Bindings arguments) { Bindings globalBindings = renderContext.getBindings(); @@ -105,4 +118,27 @@ public class JsUseProvider implements Us } } } + + @SuppressWarnings({"unused", "unchecked"}) + protected void activate(ComponentContext componentContext) { + try { + Configuration configuration = configurationAdmin.getConfiguration(SCRIPT_CACHE_PID); + Dictionary properties = configuration.getProperties(); + if (properties == null) { + properties = new Hashtable(1); + } + String[] additionalExtensions = PropertiesUtil.toStringArray(properties.get(SCRIPT_CACHE_ADDITIONAL_EXTENSIONS)); + Set<String> extensionsSet = new HashSet<String>(1); + if (additionalExtensions != null) { + extensionsSet = new HashSet<String>(Arrays.asList(additionalExtensions)); + } + extensionsSet.add(Utils.JS_EXTENSION); + properties.put(SCRIPT_CACHE_ADDITIONAL_EXTENSIONS, extensionsSet.toArray(new String[extensionsSet.size()])); + configuration.setBundleLocation(null); + configuration.update(properties); + } catch (IOException e) { + LOGGER.error("Unable to retrieve " + SCRIPT_CACHE_PID + " configuration. The Script Cache will not invalidate JavaScript file" + + " changes (e.g. files with the .js extension)."); + } + } } Modified: sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java?rev=1690906&r1=1690905&r2=1690906&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java (original) +++ sling/trunk/bundles/scripting/sightly/js-use-provider/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java Tue Jul 14 12:01:45 2015 @@ -30,7 +30,7 @@ import org.apache.sling.api.scripting.Sl * Utilities for script evaluation */ public class Utils { - private static final String EXTENSION = "js"; + public static final String JS_EXTENSION = "js"; public static final Bindings EMPTY_BINDINGS = new SimpleBindings(Collections.<String, Object>emptyMap()); @@ -40,7 +40,7 @@ public class Utils { public static boolean isJsScript(String identifier) { String extension = StringUtils.substringAfterLast(identifier, "."); - return EXTENSION.equalsIgnoreCase(extension); + return JS_EXTENSION.equalsIgnoreCase(extension); } } Modified: sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt?rev=1690906&r1=1690905&r2=1690906&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt (original) +++ sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt Tue Jul 14 12:01:45 2015 @@ -21,7 +21,11 @@ [artifacts] org.apache.sling/org.apache.sling.launchpad/8-SNAPSHOT/slingstart org.apache.sling/org.apache.sling.scripting.sightly.testing-content/1.0.5-SNAPSHOT - org.apache.sling/org.apache.sling.scripting.javascript/2.0.17-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.api/2.1.7-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.core/2.0.29-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.javascript/2.0.19-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.sightly.js.provider/1.0.5-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.sightly.repl/1.0.1-SNAPSHOT # additional configuration for testing [configurations]