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/03/04 11:48:58 UTC

svn commit: r1785468 - in /sling/trunk/contrib/scripting/freemarker: ./ src/main/java/org/apache/sling/scripting/freemarker/internal/

Author: olli
Date: Sat Mar  4 11:48:57 2017
New Revision: 1785468

URL: http://svn.apache.org/viewvc?rev=1785468&view=rev
Log:
SLING-6606 Use TemplateModels provided as OSGi services

Modified:
    sling/trunk/contrib/scripting/freemarker/pom.xml
    sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngine.java
    sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngineFactory.java

Modified: sling/trunk/contrib/scripting/freemarker/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/freemarker/pom.xml?rev=1785468&r1=1785467&r2=1785468&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/freemarker/pom.xml (original)
+++ sling/trunk/contrib/scripting/freemarker/pom.xml Sat Mar  4 11:48:57 2017
@@ -171,6 +171,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.osgi</artifactId>
+      <version>2.4.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.engine</artifactId>
       <version>2.6.6</version>
       <scope>test</scope>

Modified: sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngine.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngine.java?rev=1785468&r1=1785467&r2=1785468&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngine.java (original)
+++ sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngine.java Sat Mar  4 11:48:57 2017
@@ -50,8 +50,11 @@ public class FreemarkerScriptEngine exte
 
     private final TemplateHashModel statics;
 
-    public FreemarkerScriptEngine(ScriptEngineFactory factory) {
-        super(factory);
+    private final FreemarkerScriptEngineFactory freemarkerScriptEngineFactory;
+
+    public FreemarkerScriptEngine(final FreemarkerScriptEngineFactory freemarkerScriptEngineFactory) {
+        super(freemarkerScriptEngineFactory);
+        this.freemarkerScriptEngineFactory = freemarkerScriptEngineFactory;
         configuration = new Configuration(version);
         configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
         beansWrapper = new BeansWrapper(version);
@@ -77,6 +80,7 @@ public class FreemarkerScriptEngine exte
         try {
             Template tmpl = new Template(scriptName, reader, configuration);
             bindings.put("statics", statics);
+            freemarkerScriptEngineFactory.getTemplateModels().forEach(bindings::put);
             tmpl.process(bindings, scriptContext.getWriter());
         } catch (Throwable t) {
             log.error("Failure running Freemarker script.", t);

Modified: sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngineFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngineFactory.java?rev=1785468&r1=1785467&r2=1785468&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngineFactory.java (original)
+++ sling/trunk/contrib/scripting/freemarker/src/main/java/org/apache/sling/scripting/freemarker/internal/FreemarkerScriptEngineFactory.java Sat Mar  4 11:48:57 2017
@@ -20,13 +20,19 @@ package org.apache.sling.scripting.freem
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
+import freemarker.template.TemplateModel;
+import org.apache.sling.commons.osgi.SortingServiceTracker;
 import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -77,6 +83,10 @@ public class FreemarkerScriptEngineFacto
      */
     private final String languageVersion;
 
+    private BundleContext bundleContext;
+
+    private SortingServiceTracker<TemplateModel> templateModelTracker;
+
     private final Logger logger = LoggerFactory.getLogger(FreemarkerScriptEngineFactory.class);
 
     public FreemarkerScriptEngineFactory() {
@@ -111,9 +121,12 @@ public class FreemarkerScriptEngineFacto
     }
 
     @Activate
-    private void activate(final FreemarkerScriptEngineFactoryConfiguration configuration) {
+    private void activate(final FreemarkerScriptEngineFactoryConfiguration configuration, final BundleContext bundleContext) {
         logger.debug("activate");
         configure(configuration);
+        this.bundleContext = bundleContext;
+        templateModelTracker = new SortingServiceTracker<>(bundleContext, TemplateModel.class.getName());
+        templateModelTracker.open();
     }
 
     @Modified
@@ -125,6 +138,9 @@ public class FreemarkerScriptEngineFacto
     @Deactivate
     private void deactivate() {
         logger.debug("deactivate");
+        templateModelTracker.close();
+        templateModelTracker = null;
+        bundleContext = null;
     }
 
     private void configure(final FreemarkerScriptEngineFactoryConfiguration configuration) {
@@ -144,4 +160,13 @@ public class FreemarkerScriptEngineFacto
     public String getLanguageVersion() {
         return languageVersion;
     }
+
+    Map<String, TemplateModel> getTemplateModels() {
+        final Map<String, TemplateModel> models = new HashMap<>();
+        for (final ServiceReference<TemplateModel> serviceReference : templateModelTracker.getSortedServiceReferences()) {
+            models.put(serviceReference.getProperty("name").toString(), bundleContext.getService(serviceReference));
+        }
+        return models;
+    }
+
 }