You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:11:22 UTC

[sling-org-apache-sling-scripting-sightly-js-provider] 06/24: SLING-4855 - Add support for Compilable Script Engines in the Sightly JS Use Provider

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 <ra...@apache.org>
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
"commits@sling.apache.org" <co...@sling.apache.org>.