This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.scripting.sightly.js.provider-1.0.10 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-js-provider.git
commit e00f9f548f4e72614614d2e75f212b641bb7fcc8 Author: Radu Cotescu <[email protected]> AuthorDate: Tue Jul 14 12:01:45 2015 +0000 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 git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/sightly/js-use-provider@1690906 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 +++- .../scripting/sightly/js/impl/JsEnvironment.java | 15 +++++-- .../scripting/sightly/js/impl/JsUseProvider.java | 46 +++++++++++++++++++--- .../sling/scripting/sightly/js/impl/Utils.java | 4 +- 4 files changed, 62 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 588584c..f7a08cd 100644 --- a/pom.xml +++ b/pom.xml @@ -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> diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java index b2d096a..a82b264 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java +++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java @@ -21,8 +21,8 @@ package org.apache.sling.scripting.sightly.js.impl; 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.ResourceResolver; 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(); } diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java index ac2c886..2f6f3b5 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java +++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java @@ -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.Component; 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.sightly.render.RenderContext; 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 UseProvider { @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 UseProvider { } } } + + @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)."); + } + } } diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java index 7d22159..3b21ede 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java +++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java @@ -30,7 +30,7 @@ import org.apache.sling.api.scripting.SlingScriptHelper; * 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); } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
