You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2017/12/29 10:57:02 UTC

[sling-org-apache-sling-scripting-groovy] branch master updated: SLING-7338 Make Groovy GStringTemplateEngine available as service

This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new d4b6999  SLING-7338 Make Groovy GStringTemplateEngine available as service
d4b6999 is described below

commit d4b6999fc85bf20816f0a81eea7af725deb9aeed
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Dec 29 11:56:56 2017 +0100

    SLING-7338 Make Groovy GStringTemplateEngine available as service
---
 .../scripting/groovy/internal/GspScriptEngine.java | 13 +++---
 .../groovy/internal/GspScriptEngineFactory.java    | 49 +++++++++++++++++++++-
 .../scripting/groovy/it/GroovyTestSupport.java     |  4 ++
 3 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngine.java b/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngine.java
index b7ddf20..bb2f94e 100644
--- a/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngine.java
+++ b/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngine.java
@@ -22,13 +22,10 @@ import java.io.Writer;
 
 import javax.script.Bindings;
 import javax.script.ScriptContext;
-import javax.script.ScriptEngineFactory;
 import javax.script.ScriptException;
 
 import groovy.lang.Writable;
-import groovy.text.GStringTemplateEngine;
 import groovy.text.Template;
-import groovy.text.TemplateEngine;
 import org.apache.sling.scripting.api.AbstractSlingScriptEngine;
 
 /**
@@ -36,17 +33,17 @@ import org.apache.sling.scripting.api.AbstractSlingScriptEngine;
  */
 public class GspScriptEngine extends AbstractSlingScriptEngine {
 
-    private final TemplateEngine templateEngine;
+    private final GspScriptEngineFactory gspScriptEngineFactory;
 
-    public GspScriptEngine(final ScriptEngineFactory scriptEngineFactory, final ClassLoader classLoader) {
-        super(scriptEngineFactory);
-        this.templateEngine = new GStringTemplateEngine(classLoader);
+    public GspScriptEngine(final GspScriptEngineFactory gspScriptEngineFactory) {
+        super(gspScriptEngineFactory);
+        this.gspScriptEngineFactory = gspScriptEngineFactory;
     }
 
     public Object eval(final Reader reader, final ScriptContext scriptContext) throws ScriptException {
         Template template;
         try {
-            template = templateEngine.createTemplate(reader);
+            template = gspScriptEngineFactory.getTemplateEngine().createTemplate(reader);
         } catch (IOException | ClassNotFoundException e) {
             throw new ScriptException("Unable to compile GSP script: " + e.getMessage());
         }
diff --git a/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngineFactory.java
index 1d245c0..82bc85c 100644
--- a/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngineFactory.java
+++ b/src/main/java/org/apache/sling/scripting/groovy/internal/GspScriptEngineFactory.java
@@ -16,12 +16,20 @@
  */
 package org.apache.sling.scripting.groovy.internal;
 
+import java.util.Dictionary;
+import java.util.Hashtable;
+
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
+import groovy.text.GStringTemplateEngine;
+import groovy.text.TemplateEngine;
 import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
 import org.codehaus.groovy.util.ReleaseInfo;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -51,16 +59,25 @@ public class GspScriptEngineFactory extends AbstractScriptEngineFactory {
 
     private GspScriptEngineFactoryConfiguration configuration;
 
+    private BundleContext bundleContext;
+
+    private TemplateEngine templateEngine;
+
+    private ServiceRegistration<TemplateEngine> serviceRegistration;
+
     private final Logger logger = LoggerFactory.getLogger(GspScriptEngineFactory.class);
 
     public GspScriptEngineFactory() {
     }
 
     @Activate
-    private void activate(final GspScriptEngineFactoryConfiguration configuration) {
+    private void activate(final GspScriptEngineFactoryConfiguration configuration, final BundleContext bundleContext) {
         logger.debug("activating");
         this.configuration = configuration;
+        this.bundleContext = bundleContext;
         configure(configuration);
+        templateEngine = new GStringTemplateEngine(dynamicClassLoaderManager.getDynamicClassLoader());
+        registerTemplateEngine();
     }
 
     @Modified
@@ -73,6 +90,9 @@ public class GspScriptEngineFactory extends AbstractScriptEngineFactory {
     @Deactivate
     private void deactivate() {
         logger.debug("deactivating");
+        unregisterTemplateEngine();
+        templateEngine = null;
+        bundleContext = null;
     }
 
     private void configure(final GspScriptEngineFactoryConfiguration configuration) {
@@ -81,16 +101,41 @@ public class GspScriptEngineFactory extends AbstractScriptEngineFactory {
         setNames(configuration.names());
     }
 
+    @Override
     public String getLanguageName() {
         return "Groovy Server Pages";
     }
 
+    @Override
     public String getLanguageVersion() {
         return ReleaseInfo.getVersion();
     }
 
+    @Override
     public ScriptEngine getScriptEngine() {
-        return new GspScriptEngine(this, dynamicClassLoaderManager.getDynamicClassLoader());
+        return new GspScriptEngine(this);
+    }
+
+    private void registerTemplateEngine() {
+        if (templateEngine == null) {
+            return;
+        }
+        final Dictionary<String, String> properties = new Hashtable<>();
+        properties.put(Constants.SERVICE_DESCRIPTION, "Groovy's GStringTemplateEngine");
+        properties.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
+        logger.info("registering {} as service {} with properties {}", templateEngine, TemplateEngine.class.getName(), properties);
+        serviceRegistration = bundleContext.registerService(TemplateEngine.class, templateEngine, properties);
+    }
+
+    private void unregisterTemplateEngine() {
+        if (serviceRegistration != null) {
+            serviceRegistration.unregister();
+            serviceRegistration = null;
+        }
+    }
+
+    TemplateEngine getTemplateEngine() {
+        return templateEngine;
     }
 
 }
diff --git a/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java b/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java
index 8aad7f5..bd29f5b 100644
--- a/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java
+++ b/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 import javax.script.ScriptEngineFactory;
 
 import aQute.bnd.osgi.Constants;
+import groovy.text.TemplateEngine;
 import org.apache.sling.api.servlets.ServletResolver;
 import org.apache.sling.auth.core.AuthenticationSupport;
 import org.apache.sling.engine.SlingRequestProcessor;
@@ -58,6 +59,9 @@ public class GroovyTestSupport extends TestSupport {
     @Filter(value = "(names=gsp)")
     protected ScriptEngineFactory scriptEngineFactory;
 
+    @Inject
+    protected TemplateEngine templateEngine;
+
     public Option baseConfiguration() {
         return composite(
             super.baseConfiguration(),

-- 
To stop receiving notification emails like this one, please contact
['"commits@sling.apache.org" <co...@sling.apache.org>'].