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 2016/04/15 00:37:23 UTC

svn commit: r1739203 - /sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java

Author: olli
Date: Thu Apr 14 22:37:23 2016
New Revision: 1739203

URL: http://svn.apache.org/viewvc?rev=1739203&view=rev
Log:
SLING-5663 Make Thymeleaf TemplateEngine available as service

Modified:
    sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java

Modified: sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java?rev=1739203&r1=1739202&r2=1739203&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java (original)
+++ sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java Thu Apr 14 22:37:23 2016
@@ -18,7 +18,9 @@
  */
 package org.apache.sling.scripting.thymeleaf.internal;
 
+import java.util.Dictionary;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
@@ -27,7 +29,9 @@ import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
 import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
+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;
@@ -39,6 +43,7 @@ import org.osgi.service.component.annota
 import org.osgi.service.metatype.annotations.Designate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.thymeleaf.ITemplateEngine;
 import org.thymeleaf.TemplateEngine;
 import org.thymeleaf.cache.ICacheManager;
 import org.thymeleaf.dialect.IDialect;
@@ -92,8 +97,12 @@ public final class ThymeleafScriptEngine
     )
     private volatile ICacheManager cacheManager;
 
+    private BundleContext bundleContext;
+
     private TemplateEngine templateEngine;
 
+    private ServiceRegistration<ITemplateEngine> serviceRegistration;
+
     private final Object lock = new Object();
 
     private final Logger logger = LoggerFactory.getLogger(ThymeleafScriptEngineFactory.class);
@@ -104,63 +113,82 @@ public final class ThymeleafScriptEngine
     protected void addTemplateResolver(final ITemplateResolver templateResolver) {
         synchronized (lock) {
             logger.debug("adding template resolver '{}'", templateResolver.getName());
-            templateEngine = null;
+            if (templateEngine == null || templateEngine.isInitialized()) {
+                serviceTemplateEngine();
+            } else {
+                templateEngine.addTemplateResolver(templateResolver);
+            }
         }
     }
 
     protected void removeTemplateResolver(final ITemplateResolver templateResolver) {
         synchronized (lock) {
             logger.debug("removing template resolver '{}'", templateResolver.getName());
-            templateEngine = null;
+            serviceTemplateEngine();
         }
     }
 
     protected void addMessageResolver(final IMessageResolver messageResolver) {
         synchronized (lock) {
             logger.debug("adding message resolver '{}'", messageResolver.getName());
-            templateEngine = null;
+            if (templateEngine == null || templateEngine.isInitialized()) {
+                serviceTemplateEngine();
+            } else {
+                templateEngine.addMessageResolver(messageResolver);
+            }
         }
     }
 
     protected void removeMessageResolver(final IMessageResolver messageResolver) {
         synchronized (lock) {
             logger.debug("removing message resolver '{}'", messageResolver.getName());
-            templateEngine = null;
+            serviceTemplateEngine();
         }
     }
 
     protected void addDialect(final IDialect dialect) {
         synchronized (lock) {
             logger.debug("adding dialect '{}'", dialect.getName());
-            templateEngine = null;
+            if (templateEngine == null || templateEngine.isInitialized()) {
+                serviceTemplateEngine();
+            } else {
+                templateEngine.addDialect(dialect);
+            }
         }
     }
 
     protected void removeDialect(final IDialect dialect) {
         synchronized (lock) {
             logger.debug("removing dialect '{}'", dialect.getName());
-            templateEngine = null;
+            serviceTemplateEngine();
         }
     }
 
     protected void setCacheManager(final ICacheManager cacheManager) {
         synchronized (lock) {
             logger.debug("setting cache manager '{}'", cacheManager.getClass().getName());
-            templateEngine = null;
+            if (templateEngine == null || templateEngine.isInitialized()) {
+                serviceTemplateEngine();
+            } else {
+                templateEngine.setCacheManager(cacheManager);
+            }
         }
     }
 
     protected void unsetCacheManager(final ICacheManager cacheManager) {
         synchronized (lock) {
             logger.debug("unsetting cache manager '{}'", cacheManager.getClass().getName());
-            templateEngine = null;
+            serviceTemplateEngine();
         }
     }
 
     @Activate
-    private void activate(final ThymeleafScriptEngineFactoryConfiguration configuration) {
+    private void activate(final ThymeleafScriptEngineFactoryConfiguration configuration, final BundleContext bundleContext) {
         logger.debug("activate");
+        this.bundleContext = bundleContext;
         configure(configuration);
+        setupTemplateEngine();
+        registerTemplateEngine();
     }
 
     @Modified
@@ -172,7 +200,9 @@ public final class ThymeleafScriptEngine
     @Deactivate
     private void deactivate() {
         logger.debug("deactivate");
+        unregisterTemplateEngine();
         templateEngine = null;
+        bundleContext = null;
     }
 
     private void configure(final ThymeleafScriptEngineFactoryConfiguration configuration) {
@@ -204,20 +234,56 @@ public final class ThymeleafScriptEngine
         return new ThymeleafScriptEngine(this);
     }
 
+    private void serviceTemplateEngine() {
+        unregisterTemplateEngine();
+        setupTemplateEngine();
+        registerTemplateEngine();
+    }
+
+    private void setupTemplateEngine() {
+        logger.info("setting up new template engine");
+        templateEngine = null;
+        // setup template engine
+        final TemplateEngine templateEngine = new TemplateEngine();
+        if (this.templateResolvers != null) {
+            final Set<ITemplateResolver> templateResolvers = new HashSet<>(this.templateResolvers);
+            templateEngine.setTemplateResolvers(templateResolvers);
+        }
+        if (this.messageResolvers != null) {
+            final Set<IMessageResolver> messageResolvers = new HashSet<>(this.messageResolvers);
+            templateEngine.setMessageResolvers(messageResolvers);
+        }
+        if (this.dialects != null) {
+            final Set<IDialect> dialects = new HashSet<>(this.dialects);
+            templateEngine.setDialects(dialects);
+        }
+        final IDialect standardDialect = new StandardDialect();
+        templateEngine.addDialect(standardDialect);
+        templateEngine.setCacheManager(cacheManager);
+        this.templateEngine = templateEngine;
+    }
+
+    private void registerTemplateEngine() {
+        if (bundleContext != null) {
+            final Dictionary<String, String> properties = new Hashtable<>();
+            properties.put(Constants.SERVICE_DESCRIPTION, "Thymeleaf TemplateEngine");
+            properties.put(Constants.SERVICE_VENDOR, "Thymeleaf");
+            logger.info("{}, {}, {}", bundleContext, templateEngine, properties);
+            serviceRegistration = bundleContext.registerService(ITemplateEngine.class, templateEngine, properties);
+        }
+    }
+
+    private void unregisterTemplateEngine() {
+        if (serviceRegistration != null) {
+            serviceRegistration.unregister();
+            serviceRegistration = null;
+        }
+    }
+
     TemplateEngine getTemplateEngine() {
         synchronized (lock) {
-            if (this.templateEngine == null) {
-                logger.info("setting up new template engine");
-                templateEngine = new TemplateEngine();
-                final Set<ITemplateResolver> templateResolvers = new HashSet<>(this.templateResolvers);
-                templateEngine.setTemplateResolvers(templateResolvers);
-                final Set<IMessageResolver> messageResolvers = new HashSet<>(this.messageResolvers);
-                templateEngine.setMessageResolvers(messageResolvers);
-                final Set<IDialect> dialects = new HashSet<>(this.dialects);
-                templateEngine.setDialects(dialects);
-                final IDialect standardDialect = new StandardDialect();
-                templateEngine.addDialect(standardDialect);
-                templateEngine.setCacheManager(cacheManager);
+            if (templateEngine == null) {
+                serviceTemplateEngine();
             }
             return templateEngine;
         }