This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.scripting.thymeleaf-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-thymeleaf.git
commit 757a230ec864f66d8b5ca8676a3cf1cee124c3c4 Author: Oliver Lietz <[email protected]> AuthorDate: Thu Apr 14 22:37:23 2016 +0000 SLING-5663 Make Thymeleaf TemplateEngine available as service git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf@1739203 13f79535-47bb-0310-9956-ffa450edef68 --- .../internal/ThymeleafScriptEngineFactory.java | 108 +++++++++++++++++---- 1 file changed, 87 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java index ea01cbe..3ef0d09 100644 --- a/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java +++ b/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java @@ -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.annotations.ReferencePolicyOption; 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 ThymeleafScriptEngineFactory extends AbstractScriptEngineFact ) 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 ThymeleafScriptEngineFactory extends AbstractScriptEngineFact 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 ThymeleafScriptEngineFactory extends AbstractScriptEngineFact @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 ThymeleafScriptEngineFactory extends AbstractScriptEngineFact 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; } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
