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:13:29 UTC
[sling-org-apache-sling-scripting-thymeleaf] 18/50: SLING-5663 Make
Thymeleaf TemplateEngine available as service
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 <ol...@apache.org>
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
"commits@sling.apache.org" <co...@sling.apache.org>.