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 2015/09/29 16:13:45 UTC

svn commit: r1705867 - in /sling/trunk/contrib/scripting/thymeleaf: ./ src/main/java/org/apache/sling/scripting/thymeleaf/ src/main/java/org/apache/sling/scripting/thymeleaf/internal/ src/main/java/org/apache/sling/scripting/thymeleaf/internal/dialect/...

Author: olli
Date: Tue Sep 29 14:13:44 2015
New Revision: 1705867

URL: http://svn.apache.org/viewvc?rev=1705867&view=rev
Log:
SLING-5075 upgrade Thymeleaf to 3.0

* use Thymeleaf 3.0.0.ALPHA03 and adjust dependencies
* refactor and use new Thymeleaf APIs

Added:
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/DefaultSlingContext.java
      - copied, changed from r1705866, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingWebContext.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingAddSelectorsAttributeProcessor.java
      - copied, changed from r1704832, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingAddSelectorsAttrProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingHtmlAttributeTagProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java
      - copied, changed from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingIncludeAttrProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingLocalVariableAttributeTagProcessor.java
      - copied, changed from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingNodePropertyAttrProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSelectorsAttributeTagProcessor.java
      - copied, changed from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSelectorsAttrProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSuffixAttributeTagProcessor.java
      - copied, changed from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSuffixAttrProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingResourceTypeAttributeTagProcessor.java
      - copied, changed from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingResourceTypeAttrProcessor.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingUnwrapAttributeTagProcessor.java
      - copied, changed from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingUnwrapAttrProcessor.java
Removed:
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/SlingTemplateModeHandler.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingWebContext.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/dom/
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/templatemodehandler/
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/thymeleaf/
Modified:
    sling/trunk/contrib/scripting/thymeleaf/README.md
    sling/trunk/contrib/scripting/thymeleaf/pom.xml
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/NonCachingTemplateResolver.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ResourceBundleMessageResolver.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingResourceResolver.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngine.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/dialect/SlingDialect.java
    sling/trunk/contrib/scripting/thymeleaf/src/main/resources/OSGI-INF/metatype/metatype.properties

Modified: sling/trunk/contrib/scripting/thymeleaf/README.md
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/README.md?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/README.md (original)
+++ sling/trunk/contrib/scripting/thymeleaf/README.md Tue Sep 29 14:13:44 2015
@@ -6,8 +6,7 @@ scripting engine for [_Thymeleaf_](http:
 Features
 --------
 
-* out of the box support for _legacy_ HTML5 through embedded _NekoHTML_
-* runtime configurable `TemplateModeHandler`s for _XML_, _VALIDXML_, _XHTML_, _VALIDXHTML_, _HTML5_ and _LEGACYHTML5_
+* simple non-caching `TemplateResolver` supporting `PatternSpec` configurations for all template modes (`HTML`, `XML`, `TEXT`, `JAVASCRIPT`, `CSS`) 
 * `ResourceResolver` backed by Sling's `ResourceResolver`
 * `MessageResolver` backed by `ResourceBundleProvider` from `org.apache.sling.i18n`
 * `SlingDialect`
@@ -20,8 +19,6 @@ For running Sling Scripting Thymeleaf wi
     mvn:org.apache.sling/org.apache.sling.i18n/2.2.10
     mvn:org.javassist/javassist/3.18.2-GA
     mvn:commons-io/commons-io/2.4
-    mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xerces/2.11.0_1
-    mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlresolver/1.2_5
 
 There is a feature for Karaf:
 
@@ -33,3 +30,4 @@ relevant Thymeleaf issues
 
 * [Create OSGi bundle](https://github.com/thymeleaf/thymeleaf/issues/32)
 * [Remove initialize() steps in extension points](https://github.com/thymeleaf/thymeleaf/issues/54)
+* [keep (custom) IContext accessible](https://github.com/thymeleaf/thymeleaf/issues/388)

Modified: sling/trunk/contrib/scripting/thymeleaf/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/pom.xml?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/pom.xml (original)
+++ sling/trunk/contrib/scripting/thymeleaf/pom.xml Tue Sep 29 14:13:44 2015
@@ -29,7 +29,7 @@
   </parent>
 
   <artifactId>org.apache.sling.scripting.thymeleaf</artifactId>
-  <version>0.0.7-SNAPSHOT</version>
+  <version>0.1.7-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
   <name>Apache Sling Scripting Thymeleaf</name>
@@ -38,6 +38,10 @@
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <org.thymeleaf.version>3.0.0.ALPHA03</org.thymeleaf.version>
+    <org.attoparser.version>2.0.0.BETA3</org.attoparser.version>
+    <org.unbescape.version>1.1.1.RELEASE</org.unbescape.version>
+    <ognl.version>3.1</ognl.version>
   </properties>
 
   <scm>
@@ -119,33 +123,27 @@
     <dependency>
       <groupId>org.thymeleaf</groupId>
       <artifactId>thymeleaf</artifactId>
-      <version>2.1.4.RELEASE</version>
+      <version>${org.thymeleaf.version}</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
-      <groupId>org.unbescape</groupId>
-      <artifactId>unbescape</artifactId>
-      <version>1.1.0.RELEASE</version>
+      <groupId>org.attoparser</groupId>
+      <artifactId>attoparser</artifactId>
+      <version>${org.attoparser.version}</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
-      <groupId>net.sourceforge.nekohtml</groupId>
-      <artifactId>nekohtml</artifactId>
-      <version>1.9.21</version>
+      <groupId>org.unbescape</groupId>
+      <artifactId>unbescape</artifactId>
+      <version>${org.unbescape.version}</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>ognl</groupId>
       <artifactId>ognl</artifactId>
-      <version>3.0.8</version>
+      <version>${ognl.version}</version>
       <scope>compile</scope>
     </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>2.11.0</version>
-      <scope>provided</scope>
-    </dependency>
     <!-- logging -->
     <dependency>
       <groupId>org.slf4j</groupId>
@@ -174,7 +172,10 @@
           <instructions>
             <Export-Package>
               org.apache.sling.scripting.thymeleaf,
-              org.thymeleaf.*;version="2.1.4.RELEASE"
+              org.thymeleaf.*;version=${org.thymeleaf.version},
+              org.attoparser.*;version=${org.attoparser.version},
+              org.unbescape.*;version=${org.unbescape.version},
+              ognl.*;version=${ognl.version}
             </Export-Package>
             <Import-Package>
               org.apache.commons.io.input;version="1.4.9999",
@@ -184,7 +185,7 @@
               *
             </DynamicImport-Package>
             <Embed-Dependency>
-              *;scope=compile;inline=true;inline=!**/AbstractHtmlTemplateParser*.class
+              *;scope=compile;inline=true
             </Embed-Dependency>
             <ScriptEngine-Name>${project.name}</ScriptEngine-Name>
             <ScriptEngine-Version>${project.version}</ScriptEngine-Version>

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/DefaultSlingContext.java (from r1705866, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingWebContext.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/DefaultSlingContext.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/DefaultSlingContext.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingWebContext.java&r1=1705866&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingWebContext.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/DefaultSlingContext.java Tue Sep 29 14:13:44 2015
@@ -18,64 +18,20 @@
  */
 package org.apache.sling.scripting.thymeleaf.internal;
 
-import java.util.Calendar;
 import java.util.Locale;
 import java.util.Map;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpSession;
-
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.scripting.thymeleaf.SlingContext;
 import org.thymeleaf.context.AbstractContext;
-import org.thymeleaf.context.IWebContext;
-import org.thymeleaf.context.VariablesMap;
-import org.thymeleaf.context.WebContextExecutionInfo;
-import org.thymeleaf.util.Validate;
-
-public final class SlingWebContext implements SlingContext, IWebContext {
-
-    private final SlingHttpServletRequest servletRequest;
 
-    private final SlingHttpServletResponse servletResponse;
-
-    private final ServletContext servletContext;
+public final class DefaultSlingContext extends AbstractContext implements SlingContext {
 
     private final ResourceResolver resourceResolver;
 
-    private final Locale locale;
-
-    private final VariablesMap<String, Object> variables = new VariablesMap<String, Object>();
-
-    public SlingWebContext(final SlingHttpServletRequest servletRequest, final SlingHttpServletResponse servletResponse, final ServletContext servletContext, final ResourceResolver resourceResolver, final Locale locale, final Map<String, ?> variables) {
-        this.servletRequest = servletRequest;
-        this.servletResponse = servletResponse;
-        this.servletContext = servletContext;
+    public DefaultSlingContext(final ResourceResolver resourceResolver, final Locale locale, final Map<String, Object> variables) {
+        super(locale, variables);
         this.resourceResolver = resourceResolver;
-        this.locale = locale;
-        this.variables.putAll(variables);
-    }
-
-    @Override
-    public SlingHttpServletRequest getHttpServletRequest() {
-        return servletRequest;
-    }
-
-    @Override
-    public SlingHttpServletResponse getHttpServletResponse() {
-        return servletResponse;
-    }
-
-    @Override
-    public HttpSession getHttpSession() {
-        return servletRequest.getSession(false);
-    }
-
-    @Override
-    public ServletContext getServletContext() {
-        return servletContext;
     }
 
     @Override
@@ -83,42 +39,4 @@ public final class SlingWebContext imple
         return resourceResolver;
     }
 
-    @Override
-    public Locale getLocale() {
-        return locale;
-    }
-
-    @Override
-    public VariablesMap<String, Object> getVariables() {
-        return variables;
-    }
-
-    @Override
-    public VariablesMap<String, String[]> getRequestParameters() {
-        throw new UnsupportedOperationException("Deprecated method is not supported.");
-    }
-
-    @Override
-    public VariablesMap<String, Object> getRequestAttributes() {
-        throw new UnsupportedOperationException("Deprecated method is not supported.");
-    }
-
-    @Override
-    public VariablesMap<String, Object> getSessionAttributes() {
-        throw new UnsupportedOperationException("Deprecated method is not supported.");
-    }
-
-    @Override
-    public VariablesMap<String, Object> getApplicationAttributes() {
-        throw new UnsupportedOperationException("Deprecated method is not supported.");
-    }
-
-    @Override
-    public void addContextExecutionInfo(String templateName) {
-        Validate.notEmpty(templateName, "Template name cannot be null or empty");
-        final Calendar now = Calendar.getInstance();
-        final WebContextExecutionInfo webContextExecutionInfo = new WebContextExecutionInfo(templateName, now);
-        variables.put(AbstractContext.EXEC_INFO_VARIABLE_NAME, webContextExecutionInfo);
-    }
-
 }

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/NonCachingTemplateResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/NonCachingTemplateResolver.java?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/NonCachingTemplateResolver.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/NonCachingTemplateResolver.java Tue Sep 29 14:13:44 2015
@@ -18,8 +18,9 @@
  */
 package org.apache.sling.scripting.thymeleaf.internal;
 
+import java.util.Collections;
 import java.util.Dictionary;
-import java.util.LinkedHashSet;
+import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.felix.scr.annotations.Activate;
@@ -28,22 +29,23 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Modified;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.PropertyUnbounded;
 import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.scripting.thymeleaf.SlingTemplateModeHandler;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.thymeleaf.TemplateProcessingParameters;
+import org.thymeleaf.IEngineConfiguration;
+import org.thymeleaf.cache.ICacheEntryValidity;
+import org.thymeleaf.cache.NonCacheableCacheEntryValidity;
+import org.thymeleaf.context.IContext;
 import org.thymeleaf.resourceresolver.IResourceResolver;
-import org.thymeleaf.templateresolver.ITemplateResolutionValidity;
+import org.thymeleaf.templatemode.TemplateMode;
 import org.thymeleaf.templateresolver.ITemplateResolver;
-import org.thymeleaf.templateresolver.NonCacheableTemplateResolutionValidity;
 import org.thymeleaf.templateresolver.TemplateResolution;
+import org.thymeleaf.util.PatternSpec;
 
 @Component(
     label = "Apache Sling Scripting Thymeleaf “Non-Caching Template Resolver”",
@@ -53,17 +55,20 @@ import org.thymeleaf.templateresolver.Te
 )
 @Service
 @Properties({
-    @Property(name = Constants.SERVICE_VENDOR, value = "The Apache Software Foundation"),
-    @Property(name = Constants.SERVICE_DESCRIPTION, value = "non-caching template resolver for Sling Scripting Thymeleaf")
+    @Property(
+        name = Constants.SERVICE_VENDOR,
+        value = "The Apache Software Foundation"
+    ),
+    @Property(
+        name = Constants.SERVICE_DESCRIPTION,
+        value = "non-caching template resolver for Sling Scripting Thymeleaf"
+    )
 })
 public class NonCachingTemplateResolver implements ITemplateResolver {
 
     @Reference
     private IResourceResolver resourceResolver;
 
-    @Reference(referenceInterface = SlingTemplateModeHandler.class, cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
-    private final Set<SlingTemplateModeHandler> templateModeHandlers = new LinkedHashSet<SlingTemplateModeHandler>();
-
     private Integer order;
 
     public static final int DEFAULT_ORDER = 0;
@@ -78,6 +83,31 @@ public class NonCachingTemplateResolver
     @Property(value = DEFAULT_ENCODING)
     public static final String ENCODING_PARAMETER = "org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.encoding";
 
+    private final PatternSpec htmlPatternSpec = new PatternSpec();
+
+    @Property(unbounded = PropertyUnbounded.ARRAY)
+    public static final String HTML_PATTERNS_PARAMETER = "org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.htmlPatterns";
+
+    private final PatternSpec xmlPatternSpec = new PatternSpec();
+
+    @Property(unbounded = PropertyUnbounded.ARRAY)
+    public static final String XML_PATTERNS_PARAMETER = "org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.xmlPatterns";
+
+    private final PatternSpec textPatternSpec = new PatternSpec();
+
+    @Property(unbounded = PropertyUnbounded.ARRAY)
+    public static final String TEXT_PATTERNS_PARAMETER = "org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.textPatterns";
+
+    private final PatternSpec javascriptPatternSpec = new PatternSpec();
+
+    @Property(unbounded = PropertyUnbounded.ARRAY)
+    public static final String JAVASCRIPT_PATTERNS_PARAMETER = "org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.javascriptPatterns";
+
+    private final PatternSpec cssPatternSpec = new PatternSpec();
+
+    @Property(unbounded = PropertyUnbounded.ARRAY)
+    public static final String CSS_PATTERNS_PARAMETER = "org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.cssPatterns";
+
     private final Logger logger = LoggerFactory.getLogger(NonCachingTemplateResolver.class);
 
     public NonCachingTemplateResolver() {
@@ -100,20 +130,31 @@ public class NonCachingTemplateResolver
         logger.debug("deactivate");
     }
 
-    protected synchronized void bindTemplateModeHandlers(final SlingTemplateModeHandler templateModeHandler) {
-        logger.debug("binding template mode handler '{}'", templateModeHandler.getTemplateModeName());
-        templateModeHandlers.add(templateModeHandler);
-    }
-
-    protected synchronized void unbindTemplateModeHandlers(final SlingTemplateModeHandler templateModeHandler) {
-        logger.debug("unbinding template mode handler '{}'", templateModeHandler.getTemplateModeName());
-        templateModeHandlers.remove(templateModeHandler);
-    }
-
     private void configure(final ComponentContext componentContext) {
         final Dictionary properties = componentContext.getProperties();
         order = PropertiesUtil.toInteger(properties.get(ORDER_PARAMETER), DEFAULT_ORDER);
         encoding = PropertiesUtil.toString(properties.get(ENCODING_PARAMETER), DEFAULT_ENCODING);
+        // HTML
+        final String[] htmlPatterns = PropertiesUtil.toStringArray(properties.get(HTML_PATTERNS_PARAMETER), new String[]{});
+        setPatterns(htmlPatterns, htmlPatternSpec);
+        // XML
+        final String[] xmlPatterns = PropertiesUtil.toStringArray(properties.get(XML_PATTERNS_PARAMETER), new String[]{});
+        setPatterns(xmlPatterns, htmlPatternSpec);
+        // TEXT
+        final String[] textPatterns = PropertiesUtil.toStringArray(properties.get(TEXT_PATTERNS_PARAMETER), new String[]{});
+        setPatterns(textPatterns, textPatternSpec);
+        // JAVASCRIPT
+        final String[] javascriptPatterns = PropertiesUtil.toStringArray(properties.get(JAVASCRIPT_PATTERNS_PARAMETER), new String[]{});
+        setPatterns(javascriptPatterns, javascriptPatternSpec);
+        // CSS
+        final String[] cssPatterns = PropertiesUtil.toStringArray(properties.get(CSS_PATTERNS_PARAMETER), new String[]{});
+        setPatterns(cssPatterns, cssPatternSpec);
+    }
+
+    private void setPatterns(final String[] strings, final PatternSpec patternSpec) {
+        final Set<String> set = new HashSet<String>();
+        Collections.addAll(set, strings);
+        patternSpec.setPatterns(set);
     }
 
     @Override
@@ -127,27 +168,35 @@ public class NonCachingTemplateResolver
     }
 
     @Override
-    public TemplateResolution resolveTemplate(TemplateProcessingParameters templateProcessingParameters) {
-        final String templateName = templateProcessingParameters.getTemplateName();
-        final String resourceName = templateName; // TODO
+    public TemplateResolution resolveTemplate(final IEngineConfiguration configuration, final IContext context, final String templateName) {
+        final String resourceName = templateName;
         final String characterEncoding = encoding;
-        final String templateMode = computeTemplateMode(templateName);
-        final ITemplateResolutionValidity validity = new NonCacheableTemplateResolutionValidity();
-        return new TemplateResolution(templateName, resourceName, resourceResolver, characterEncoding, templateMode, validity);
-    }
-
-    @Override
-    public void initialize() {
+        final TemplateMode templateMode = computeTemplateMode(templateName);
+        final ICacheEntryValidity cacheEntryValidity = new NonCacheableCacheEntryValidity();
+        if (templateMode != null) {
+            logger.debug("using template mode '{}' for template '{}'", templateMode, templateName);
+            return new TemplateResolution(templateName, resourceName, resourceResolver, characterEncoding, templateMode, cacheEntryValidity);
+        } else {
+            logger.warn("no template mode for template '{}'", templateName);
+            return null; // will fail at caller
+        }
     }
 
-    protected String computeTemplateMode(final String templateName) {
-        for (final SlingTemplateModeHandler templateModeHandler : templateModeHandlers) {
-            final String templateMode = templateModeHandler.getTemplateModeName();
-            logger.debug("template mode handler '{}' with patterns {}", templateMode, templateModeHandler.getPatternSpec().getPatterns());
-            if (templateModeHandler.getPatternSpec().matches(templateName)) {
-                logger.debug("using template mode '{}' for template '{}'", templateMode, templateName);
-                return templateMode;
-            }
+    private TemplateMode computeTemplateMode(final String templateName) {
+        if (htmlPatternSpec.matches(templateName)) {
+            return TemplateMode.HTML;
+        }
+        if (xmlPatternSpec.matches(templateName)) {
+            return TemplateMode.XML;
+        }
+        if (textPatternSpec.matches(templateName)) {
+            return TemplateMode.TEXT;
+        }
+        if (javascriptPatternSpec.matches(templateName)) {
+            return TemplateMode.JAVASCRIPT;
+        }
+        if (cssPatternSpec.matches(templateName)) {
+            return TemplateMode.CSS;
         }
         return null;
     }

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ResourceBundleMessageResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ResourceBundleMessageResolver.java?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ResourceBundleMessageResolver.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ResourceBundleMessageResolver.java Tue Sep 29 14:13:44 2015
@@ -37,8 +37,7 @@ import org.osgi.framework.Constants;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.thymeleaf.Arguments;
-import org.thymeleaf.context.IContext;
+import org.thymeleaf.context.ITemplateProcessingContext;
 import org.thymeleaf.messageresolver.IMessageResolver;
 import org.thymeleaf.messageresolver.MessageResolution;
 
@@ -105,10 +104,9 @@ public class ResourceBundleMessageResolv
     }
 
     @Override
-    public MessageResolution resolveMessage(final Arguments arguments, final String key, final Object[] messageParameters) {
-        logger.debug("arguments: {}, key: {}, message parameters: {}", arguments, key, messageParameters);
-        final IContext context = arguments.getContext();
-        final Locale locale = context.getLocale();
+    public MessageResolution resolveMessage(final ITemplateProcessingContext processingContext, final String key, final Object[] messageParameters) {
+        logger.debug("processingContext: {}, key: {}, message parameters: {}", processingContext, key, messageParameters);
+        final Locale locale = processingContext.getLocale();
         final ResourceBundle resourceBundle = resourceBundleProvider.getResourceBundle(locale);
         final String string = resourceBundle.getString(key);
         final MessageFormat messageFormat = new MessageFormat(string, locale);
@@ -116,8 +114,4 @@ public class ResourceBundleMessageResolv
         return new MessageResolution(message);
     }
 
-    @Override
-    public void initialize() {
-    }
-
 }

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingResourceResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingResourceResolver.java?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingResourceResolver.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/SlingResourceResolver.java Tue Sep 29 14:13:44 2015
@@ -18,19 +18,25 @@
  */
 package org.apache.sling.scripting.thymeleaf.internal;
 
+import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.scripting.SlingScriptConstants;
 import org.apache.sling.scripting.thymeleaf.SlingContext;
 import org.osgi.framework.Constants;
-import org.thymeleaf.TemplateProcessingParameters;
+import org.thymeleaf.IEngineConfiguration;
 import org.thymeleaf.context.IContext;
+import org.thymeleaf.context.IWebVariablesMap;
 import org.thymeleaf.exceptions.TemplateProcessingException;
+import org.thymeleaf.resource.CharArrayResource;
+import org.thymeleaf.resource.IResource;
 import org.thymeleaf.resourceresolver.IResourceResolver;
 import org.thymeleaf.util.Validate;
 
@@ -57,18 +63,32 @@ public class SlingResourceResolver imple
     }
 
     @Override
-    public InputStream getResourceAsStream(final TemplateProcessingParameters templateProcessingParameters, final String resourceName) {
-
-        Validate.notNull(templateProcessingParameters, "Template Processing Parameters cannot be null");
-
-        final IContext context = templateProcessingParameters.getContext();
+    public IResource resolveResource(final IEngineConfiguration engineConfiguration, final IContext context, final String resourceName, final String characterEncoding) {
+        Validate.notNull(context, "context cannot be null");
+        Validate.notNull(context, "resource name cannot be null");
         if (context instanceof SlingContext) {
             final SlingContext slingContext = (SlingContext) context;
             final ResourceResolver resourceResolver = slingContext.getResourceResolver();
-            final Resource resource = resourceResolver.getResource(resourceName);
-            return resource.adaptTo(InputStream.class);
+            return resolveResource(resourceResolver, resourceName);
+        } else if (context instanceof IWebVariablesMap) { // TODO Thymeleaf #388
+            final IWebVariablesMap webVariablesMap = (IWebVariablesMap) context;
+            final ResourceResolver resourceResolver = (ResourceResolver) webVariablesMap.getVariable(SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER);
+            return resolveResource(resourceResolver, resourceName);
         } else {
-            throw new TemplateProcessingException("Cannot handle context: " + context.getClass().getName());
+            final String message = String.format("Cannot handle context: %s", context.getClass().getName());
+            throw new TemplateProcessingException(message);
+        }
+    }
+
+    private IResource resolveResource(final ResourceResolver resourceResolver, final String resourceName) {
+        final Resource resource = resourceResolver.getResource(resourceName);
+        final InputStream inputStream = resource.adaptTo(InputStream.class);
+        try {
+            final char[] content = IOUtils.toCharArray(inputStream);
+            return new CharArrayResource(resourceName, content);
+        } catch (IOException e) {
+            final String message = String.format("Cannot read from resource '%s'", resourceName);
+            throw new TemplateProcessingException(message, e);
         }
     }
 

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngine.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngine.java?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngine.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngine.java Tue Sep 29 14:13:44 2015
@@ -25,10 +25,7 @@ import java.util.Locale;
 import javax.script.Bindings;
 import javax.script.ScriptContext;
 import javax.script.ScriptException;
-import javax.servlet.ServletContext;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.scripting.SlingScriptConstants;
@@ -58,10 +55,6 @@ public final class ThymeleafScriptEngine
             throw new ScriptException("SlingScriptHelper missing from bindings");
         }
 
-        final SlingHttpServletRequest request = helper.getRequest();
-        final SlingHttpServletResponse response = helper.getResponse();
-        final ServletContext servletContext = null; // only used by Thymeleaf's ServletContextResourceResolver
-
         ResourceResolver resourceResolver = (ResourceResolver) scriptContext.getAttribute(SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER, SlingScriptConstants.SLING_SCOPE);
         if (resourceResolver == null) {
             resourceResolver = helper.getScript().getScriptResource().getResourceResolver();
@@ -71,8 +64,10 @@ public final class ThymeleafScriptEngine
         final String scriptName = helper.getScript().getScriptResource().getPath();
         final Writer writer = scriptContext.getWriter();
 
+        bindings.put(SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER, resourceResolver); // TODO #388
+
         try {
-            final IContext context = new SlingWebContext(request, response, servletContext, resourceResolver, locale, bindings);
+            final IContext context = new DefaultSlingContext(resourceResolver, locale, bindings);
             thymeleafScriptEngineFactory.getTemplateEngine().process(scriptName, context, writer);
         } catch (Exception e) {
             logger.error("Failure rendering Thymeleaf template '{}': {}", scriptName, e.getMessage());

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/ThymeleafScriptEngineFactory.java Tue Sep 29 14:13:44 2015
@@ -42,6 +42,7 @@ import org.osgi.service.component.Compon
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.Thymeleaf;
 import org.thymeleaf.dialect.IDialect;
 import org.thymeleaf.messageresolver.IMessageResolver;
 import org.thymeleaf.standard.StandardDialect;
@@ -137,13 +138,13 @@ public final class ThymeleafScriptEngine
     }
 
     protected synchronized void bindDialects(final IDialect dialect) {
-        logger.debug("binding a dialect for prefix '{}'", dialect.getPrefix());
+        logger.debug("binding dialect '{}'", dialect.getName());
         dialects.add(dialect);
         configureTemplateEngine();
     }
 
     protected synchronized void unbindDialects(final IDialect dialect) {
-        logger.debug("unbinding a dialect for prefix '{}'", dialect.getPrefix());
+        logger.debug("unbinding dialect '{}'", dialect.getName());
         dialects.remove(dialect);
         configureTemplateEngine();
     }
@@ -164,9 +165,7 @@ public final class ThymeleafScriptEngine
     // the configuration of the Thymeleaf TemplateEngine is static and we need to recreate on modification
     private synchronized void configureTemplateEngine() {
         logger.info("configure template engine");
-        if (templateEngine == null || templateEngine.isInitialized()) {
-            templateEngine = new TemplateEngine();
-        }
+        final TemplateEngine templateEngine = new TemplateEngine();
         if (templateResolvers.size() > 0) {
             templateEngine.setTemplateResolvers(templateResolvers);
         }
@@ -178,6 +177,10 @@ public final class ThymeleafScriptEngine
             final IDialect standardDialect = new StandardDialect();
             templateEngine.addDialect(standardDialect);
         }
+        // TODO
+        // final ICacheManager cacheManager = null;
+        // templateEngine.setCacheManager(cacheManager);
+        this.templateEngine = templateEngine;
     }
 
     @Override
@@ -187,7 +190,7 @@ public final class ThymeleafScriptEngine
 
     @Override
     public String getLanguageVersion() {
-        return "2.1"; // TODO get version from Thymeleaf
+        return Thymeleaf.VERSION;
     }
 
     @Override

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/dialect/SlingDialect.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/dialect/SlingDialect.java?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/dialect/SlingDialect.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/dialect/SlingDialect.java Tue Sep 29 14:13:44 2015
@@ -25,14 +25,14 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.scripting.thymeleaf.internal.processor.attr.SlingAddSelectorsAttrProcessor;
-import org.apache.sling.scripting.thymeleaf.internal.processor.attr.SlingIncludeAttrProcessor;
-import org.apache.sling.scripting.thymeleaf.internal.processor.attr.SlingReplaceSelectorsAttrProcessor;
-import org.apache.sling.scripting.thymeleaf.internal.processor.attr.SlingReplaceSuffixAttrProcessor;
-import org.apache.sling.scripting.thymeleaf.internal.processor.attr.SlingResourceTypeAttrProcessor;
-import org.apache.sling.scripting.thymeleaf.internal.processor.attr.SlingUnwrapAttrProcessor;
+import org.apache.sling.scripting.thymeleaf.internal.processor.SlingAddSelectorsAttributeProcessor;
+import org.apache.sling.scripting.thymeleaf.internal.processor.SlingIncludeAttributeTagProcessor;
+import org.apache.sling.scripting.thymeleaf.internal.processor.SlingReplaceSelectorsAttributeTagProcessor;
+import org.apache.sling.scripting.thymeleaf.internal.processor.SlingReplaceSuffixAttributeTagProcessor;
+import org.apache.sling.scripting.thymeleaf.internal.processor.SlingResourceTypeAttributeTagProcessor;
+import org.apache.sling.scripting.thymeleaf.internal.processor.SlingUnwrapAttributeTagProcessor;
 import org.osgi.framework.Constants;
-import org.thymeleaf.dialect.AbstractDialect;
+import org.thymeleaf.dialect.AbstractProcessorDialect;
 import org.thymeleaf.processor.IProcessor;
 
 @Component(
@@ -40,27 +40,34 @@ import org.thymeleaf.processor.IProcesso
 )
 @Service
 @Properties({
-    @Property(name = Constants.SERVICE_VENDOR, value = "The Apache Software Foundation"),
-    @Property(name = Constants.SERVICE_DESCRIPTION, value = "Sling dialect for Sling Scripting Thymeleaf")
+    @Property(
+        name = Constants.SERVICE_VENDOR,
+        value = "The Apache Software Foundation"
+    ),
+    @Property(
+        name = Constants.SERVICE_DESCRIPTION,
+        value = "Sling dialect for Sling Scripting Thymeleaf"
+    )
 })
-public final class SlingDialect extends AbstractDialect {
+public final class SlingDialect extends AbstractProcessorDialect {
+
+    public static final String NAME = "Sling";
 
     public static final String PREFIX = "sling";
 
-    @Override
-    public String getPrefix() {
-        return PREFIX;
+    public SlingDialect() {
+        super(NAME, PREFIX, 0);
     }
 
     @Override
-    public Set<IProcessor> getProcessors() {
+    public Set<IProcessor> getProcessors(final String prefix) {
         final Set<IProcessor> processors = new HashSet<IProcessor>();
-        processors.add(new SlingAddSelectorsAttrProcessor());
-        processors.add(new SlingIncludeAttrProcessor());
-        processors.add(new SlingReplaceSelectorsAttrProcessor());
-        processors.add(new SlingReplaceSuffixAttrProcessor());
-        processors.add(new SlingResourceTypeAttrProcessor());
-        processors.add(new SlingUnwrapAttrProcessor());
+        processors.add(new SlingAddSelectorsAttributeProcessor(this, prefix));
+        processors.add(new SlingIncludeAttributeTagProcessor(this, prefix));
+        processors.add(new SlingReplaceSelectorsAttributeTagProcessor(this, prefix));
+        processors.add(new SlingReplaceSuffixAttributeTagProcessor(this, prefix));
+        processors.add(new SlingResourceTypeAttributeTagProcessor(this, prefix));
+        processors.add(new SlingUnwrapAttributeTagProcessor(this, prefix));
         return processors;
     }
 

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingAddSelectorsAttributeProcessor.java (from r1704832, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingAddSelectorsAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingAddSelectorsAttributeProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingAddSelectorsAttributeProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingAddSelectorsAttrProcessor.java&r1=1704832&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingAddSelectorsAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingAddSelectorsAttributeProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,27 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
-public final class SlingAddSelectorsAttrProcessor extends SlingNodePropertyAttrProcessor {
+import org.thymeleaf.dialect.IProcessorDialect;
 
-    public static final int ATTR_PRECEDENCE = 99;
+public final class SlingAddSelectorsAttributeProcessor extends SlingLocalVariableAttributeTagProcessor {
 
-    public static final String ATTR_NAME = "addSelectors";
+    public static final int ATTRIBUTE_PRECEDENCE = 99;
 
-    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", PREFIX, ATTR_NAME);
+    public static final String ATTRIBUTE_NAME = "addSelectors";
 
-    public SlingAddSelectorsAttrProcessor() {
-        super(ATTR_NAME);
-    }
+    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", LOCAL_VARIABLE_PREFIX, ATTRIBUTE_NAME);
 
-    @Override
-    public int getPrecedence() {
-        return ATTR_PRECEDENCE;
+    public SlingAddSelectorsAttributeProcessor(final IProcessorDialect processorDialect, final String dialectPrefix) {
+        super(processorDialect, dialectPrefix, ATTRIBUTE_NAME, ATTRIBUTE_PRECEDENCE);
     }
 
     @Override
-    protected String getNodePropertyName() {
+    protected String getLocalVariableName() {
         return NODE_PROPERTY_NAME;
     }
 

Added: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingHtmlAttributeTagProcessor.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingHtmlAttributeTagProcessor.java?rev=1705867&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingHtmlAttributeTagProcessor.java (added)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingHtmlAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.scripting.thymeleaf.internal.processor;
+
+import org.thymeleaf.dialect.IProcessorDialect;
+import org.thymeleaf.processor.element.AbstractAttributeTagProcessor;
+import org.thymeleaf.templatemode.TemplateMode;
+
+public abstract class SlingHtmlAttributeTagProcessor extends AbstractAttributeTagProcessor {
+
+    public SlingHtmlAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix, final String attributeName, final int precedence, final boolean removeAttribute) {
+        super(processorDialect, TemplateMode.HTML, dialectPrefix, null, false, attributeName, false, precedence, removeAttribute);
+    }
+
+}

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java (from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingIncludeAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingIncludeAttrProcessor.java&r1=1701282&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingIncludeAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
 import java.io.IOException;
 
@@ -30,51 +30,46 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.scripting.core.servlet.CaptureResponseWrapper;
-import org.apache.sling.scripting.thymeleaf.internal.SlingWebContext;
-import org.apache.sling.scripting.thymeleaf.internal.dom.NodeUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.thymeleaf.Arguments;
-import org.thymeleaf.Configuration;
-import org.thymeleaf.context.IContext;
-import org.thymeleaf.dom.Element;
-import org.thymeleaf.dom.Macro;
-import org.thymeleaf.processor.ProcessorResult;
-import org.thymeleaf.processor.attr.AbstractAttrProcessor;
+import org.thymeleaf.IEngineConfiguration;
+import org.thymeleaf.context.ITemplateProcessingContext;
+import org.thymeleaf.context.IVariablesMap;
+import org.thymeleaf.context.IWebVariablesMap;
+import org.thymeleaf.dialect.IProcessorDialect;
+import org.thymeleaf.engine.AttributeName;
+import org.thymeleaf.model.IProcessableElementTag;
+import org.thymeleaf.processor.element.IElementTagStructureHandler;
 import org.thymeleaf.standard.expression.IStandardExpression;
 import org.thymeleaf.standard.expression.IStandardExpressionParser;
 import org.thymeleaf.standard.expression.StandardExpressions;
 
-public class SlingIncludeAttrProcessor extends AbstractAttrProcessor {
+public class SlingIncludeAttributeTagProcessor extends SlingHtmlAttributeTagProcessor {
 
-    public static final int ATTR_PRECEDENCE = 100;
+    public static final int ATTRIBUTE_PRECEDENCE = 100;
 
-    public static final String ATTR_NAME = "include";
+    public static final String ATTRIBUTE_NAME = "include";
 
-    private final Logger logger = LoggerFactory.getLogger(SlingIncludeAttrProcessor.class);
+    private final Logger logger = LoggerFactory.getLogger(SlingIncludeAttributeTagProcessor.class);
 
-    public SlingIncludeAttrProcessor() {
-        super(ATTR_NAME);
+    public SlingIncludeAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix) {
+        super(processorDialect, dialectPrefix, ATTRIBUTE_NAME, ATTRIBUTE_PRECEDENCE, true);
     }
 
     @Override
-    public int getPrecedence() {
-        return ATTR_PRECEDENCE;
-    }
+    protected void doProcess(final ITemplateProcessingContext processingContext, final IProcessableElementTag tag, final AttributeName attributeName, final String attributeValue, final String tagTemplateName, final int tagLine, final int tagCol, final IElementTagStructureHandler elementTagStructureHandler) {
+        // final IContext context = arguments.getTemplateProcessingParameters().getContext();
+        // if (context instanceof SlingWebContext) {
+        try {
+            final IWebVariablesMap webVariablesMap = (IWebVariablesMap) processingContext.getVariables();
+            final SlingHttpServletRequest slingHttpServletRequest = (SlingHttpServletRequest) webVariablesMap.getRequest();
+            final SlingHttpServletResponse slingHttpServletResponse = (SlingHttpServletResponse) webVariablesMap.getResponse();
+
+            final IEngineConfiguration configuration = processingContext.getConfiguration();
+            final IStandardExpressionParser expressionParser = StandardExpressions.getExpressionParser(configuration);
+            final IStandardExpression expression = expressionParser.parseExpression(processingContext, attributeValue);
+            final Object include = expression.execute(processingContext);
 
-    @Override
-    protected ProcessorResult processAttribute(final Arguments arguments, final Element element, final String attributeName) {
-        final IContext context = arguments.getTemplateProcessingParameters().getContext();
-        if (context instanceof SlingWebContext) {
-            final SlingWebContext slingWebContext = (SlingWebContext) context;
-            final SlingHttpServletRequest slingHttpServletRequest = slingWebContext.getHttpServletRequest();
-            final SlingHttpServletResponse slingHttpServletResponse = slingWebContext.getHttpServletResponse();
-            // resource or path to include
-            final Configuration configuration = arguments.getConfiguration();
-            final String attributeValue = element.getAttributeValue(attributeName);
-            final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration);
-            final IStandardExpression expression = parser.parseExpression(configuration, arguments, attributeValue);
-            final Object include = expression.execute(configuration, arguments);
             String path = null;
             if (include instanceof String) {
                 path = (String) include;
@@ -84,30 +79,29 @@ public class SlingIncludeAttrProcessor e
                 resource = (Resource) include;
             }
             // request dispatcher options
-            final RequestDispatcherOptions requestDispatcherOptions = prepareRequestDispatcherOptions(element);
+            final RequestDispatcherOptions requestDispatcherOptions = prepareRequestDispatcherOptions(webVariablesMap);
             // dispatch
             final String content = dispatch(resource, path, slingHttpServletRequest, slingHttpServletResponse, requestDispatcherOptions);
             // cleanup
-            element.removeAttribute(attributeName);
-            element.clearChildren();
+            tag.getAttributes().removeAttribute(attributeName);
+            // element.clearChildren();
             // add output
-            final Macro macro = new Macro(content);
-            element.addChild(macro);
-            final Boolean unwrap = NodeUtil.getNodeProperty(element, SlingUnwrapAttrProcessor.NODE_PROPERTY_NAME, Boolean.class);
+            final Boolean unwrap = (Boolean) webVariablesMap.getVariable(SlingUnwrapAttributeTagProcessor.NODE_PROPERTY_NAME);
             if (unwrap != null && unwrap) {
-                element.getParent().extractChild(element);
+                elementTagStructureHandler.replaceWith(content, false);
+            } else {
+                elementTagStructureHandler.setBody(content, false);
             }
-        } else {
-            throw new RuntimeException("Context is not an instance of SlingWebContext, unable to process include attribute");
+        } catch (Exception e) {
+            throw new RuntimeException("unable to process include attribute", e);
         }
-        return ProcessorResult.OK;
     }
 
-    protected RequestDispatcherOptions prepareRequestDispatcherOptions(final Element element) {
-        final String resourceType = NodeUtil.getNodeProperty(element, SlingResourceTypeAttrProcessor.NODE_PROPERTY_NAME, String.class);
-        final String replaceSelectors = NodeUtil.getNodeProperty(element, SlingReplaceSelectorsAttrProcessor.NODE_PROPERTY_NAME, String.class);
-        final String addSelectors = NodeUtil.getNodeProperty(element, SlingAddSelectorsAttrProcessor.NODE_PROPERTY_NAME, String.class);
-        final String replaceSuffix = NodeUtil.getNodeProperty(element, SlingReplaceSuffixAttrProcessor.NODE_PROPERTY_NAME, String.class);
+    protected RequestDispatcherOptions prepareRequestDispatcherOptions(final IVariablesMap variablesMap) {
+        final String resourceType = (String) variablesMap.getVariable(SlingResourceTypeAttributeTagProcessor.NODE_PROPERTY_NAME);
+        final String replaceSelectors = (String) variablesMap.getVariable(SlingReplaceSelectorsAttributeTagProcessor.NODE_PROPERTY_NAME);
+        final String addSelectors = (String) variablesMap.getVariable(SlingAddSelectorsAttributeProcessor.NODE_PROPERTY_NAME);
+        final String replaceSuffix = (String) variablesMap.getVariable(SlingReplaceSuffixAttributeTagProcessor.NODE_PROPERTY_NAME);
         final RequestDispatcherOptions options = new RequestDispatcherOptions();
         options.setForceResourceType(resourceType);
         options.setReplaceSelectors(replaceSelectors);
@@ -117,14 +111,13 @@ public class SlingIncludeAttrProcessor e
     }
 
     /**
-     * @see "org.apache.sling.scripting.jsp.taglib.IncludeTagHandler"
-     *
      * @param resource the resource to include
      * @param path the path to include
      * @param slingHttpServletRequest the current request
      * @param slingHttpServletResponse the current response
      * @param requestDispatcherOptions the options for the request dispatcher
      * @return the character response from the include call to request dispatcher
+     * @see "org.apache.sling.scripting.jsp.taglib.IncludeTagHandler"
      */
     protected String dispatch(Resource resource, String path, final SlingHttpServletRequest slingHttpServletRequest, final SlingHttpServletResponse slingHttpServletResponse, final RequestDispatcherOptions requestDispatcherOptions) {
 

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingLocalVariableAttributeTagProcessor.java (from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingNodePropertyAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingLocalVariableAttributeTagProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingLocalVariableAttributeTagProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingNodePropertyAttrProcessor.java&r1=1701282&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingNodePropertyAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingLocalVariableAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,37 +16,35 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
-import org.thymeleaf.Arguments;
-import org.thymeleaf.Configuration;
-import org.thymeleaf.dom.Element;
-import org.thymeleaf.processor.ProcessorResult;
-import org.thymeleaf.processor.attr.AbstractAttrProcessor;
+import org.thymeleaf.IEngineConfiguration;
+import org.thymeleaf.context.ITemplateProcessingContext;
+import org.thymeleaf.dialect.IProcessorDialect;
+import org.thymeleaf.engine.AttributeName;
+import org.thymeleaf.model.IProcessableElementTag;
+import org.thymeleaf.processor.element.IElementTagStructureHandler;
 import org.thymeleaf.standard.expression.IStandardExpression;
 import org.thymeleaf.standard.expression.IStandardExpressionParser;
 import org.thymeleaf.standard.expression.StandardExpressions;
 
-public abstract class SlingNodePropertyAttrProcessor extends AbstractAttrProcessor {
+public abstract class SlingLocalVariableAttributeTagProcessor extends SlingHtmlAttributeTagProcessor {
 
-    public static final String PREFIX = "sling";
+    public static final String LOCAL_VARIABLE_PREFIX = "sling";
 
-    public SlingNodePropertyAttrProcessor(final String attributeName) {
-        super(attributeName);
+    public SlingLocalVariableAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix, final String attributeName, final int precedence) {
+        super(processorDialect, dialectPrefix, attributeName, precedence, true);
     }
 
-    protected abstract String getNodePropertyName();
+    protected abstract String getLocalVariableName();
 
     @Override
-    protected ProcessorResult processAttribute(final Arguments arguments, final Element element, final String attributeName) {
-        final Configuration configuration = arguments.getConfiguration();
-        final String attributeValue = element.getAttributeValue(attributeName);
-        final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration);
-        final IStandardExpression expression = parser.parseExpression(configuration, arguments, attributeValue);
-        final Object result = expression.execute(configuration, arguments);
-        element.setNodeProperty(getNodePropertyName(), result);
-        element.removeAttribute(attributeName);
-        return ProcessorResult.OK;
+    protected void doProcess(final ITemplateProcessingContext templateProcessingContext, final IProcessableElementTag processableElementTag, final AttributeName attributeName, final String attributeValue, final String attributeTemplateName, final int attributeLine, final int attributeCol, final IElementTagStructureHandler structureHandler) {
+        final IEngineConfiguration configuration = templateProcessingContext.getConfiguration();
+        final IStandardExpressionParser expressionParser = StandardExpressions.getExpressionParser(configuration);
+        final IStandardExpression expression = expressionParser.parseExpression(templateProcessingContext, attributeValue);
+        final Object result = expression.execute(templateProcessingContext);
+        structureHandler.setLocalVariable(getLocalVariableName(), result);
     }
 
 }

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSelectorsAttributeTagProcessor.java (from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSelectorsAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSelectorsAttributeTagProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSelectorsAttributeTagProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSelectorsAttrProcessor.java&r1=1701282&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSelectorsAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSelectorsAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,27 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
-public final class SlingReplaceSelectorsAttrProcessor extends SlingNodePropertyAttrProcessor {
+import org.thymeleaf.dialect.IProcessorDialect;
 
-    public static final int ATTR_PRECEDENCE = 99;
+public final class SlingReplaceSelectorsAttributeTagProcessor extends SlingLocalVariableAttributeTagProcessor {
 
-    public static final String ATTR_NAME = "replaceSelectors";
+    public static final int ATTRIBUTE_PRECEDENCE = 99;
 
-    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", PREFIX, ATTR_NAME);
+    public static final String ATTRIBUTE_NAME = "replaceSelectors";
 
-    public SlingReplaceSelectorsAttrProcessor() {
-        super(ATTR_NAME);
-    }
+    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", LOCAL_VARIABLE_PREFIX, ATTRIBUTE_NAME);
 
-    @Override
-    public int getPrecedence() {
-        return ATTR_PRECEDENCE;
+    public SlingReplaceSelectorsAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix) {
+        super(processorDialect, dialectPrefix, ATTRIBUTE_NAME, ATTRIBUTE_PRECEDENCE);
     }
 
     @Override
-    protected String getNodePropertyName() {
+    protected String getLocalVariableName() {
         return NODE_PROPERTY_NAME;
     }
 

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSuffixAttributeTagProcessor.java (from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSuffixAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSuffixAttributeTagProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSuffixAttributeTagProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSuffixAttrProcessor.java&r1=1701282&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingReplaceSuffixAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingReplaceSuffixAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,27 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
-public final class SlingReplaceSuffixAttrProcessor extends SlingNodePropertyAttrProcessor {
+import org.thymeleaf.dialect.IProcessorDialect;
 
-    public static final int ATTR_PRECEDENCE = 99;
+public final class SlingReplaceSuffixAttributeTagProcessor extends SlingLocalVariableAttributeTagProcessor {
 
-    public static final String ATTR_NAME = "replaceSuffix";
+    public static final int ATTRIBUTE_PRECEDENCE = 99;
 
-    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", PREFIX, ATTR_NAME);
+    public static final String ATTRIBUTE_NAME = "replaceSuffix";
 
-    public SlingReplaceSuffixAttrProcessor() {
-        super(ATTR_NAME);
-    }
+    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", LOCAL_VARIABLE_PREFIX, ATTRIBUTE_NAME);
 
-    @Override
-    public int getPrecedence() {
-        return ATTR_PRECEDENCE;
+    public SlingReplaceSuffixAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix) {
+        super(processorDialect, dialectPrefix, ATTRIBUTE_NAME, ATTRIBUTE_PRECEDENCE);
     }
 
     @Override
-    protected String getNodePropertyName() {
+    protected String getLocalVariableName() {
         return NODE_PROPERTY_NAME;
     }
 

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingResourceTypeAttributeTagProcessor.java (from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingResourceTypeAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingResourceTypeAttributeTagProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingResourceTypeAttributeTagProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingResourceTypeAttrProcessor.java&r1=1701282&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingResourceTypeAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingResourceTypeAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,27 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
-public final class SlingResourceTypeAttrProcessor extends SlingNodePropertyAttrProcessor {
+import org.thymeleaf.dialect.IProcessorDialect;
 
-    public static final int ATTR_PRECEDENCE = 99;
+public final class SlingResourceTypeAttributeTagProcessor extends SlingLocalVariableAttributeTagProcessor {
 
-    public static final String ATTR_NAME = "resourceType";
+    public static final int ATTRIBUTE_PRECEDENCE = 99;
 
-    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", PREFIX, ATTR_NAME);
+    public static final String ATTRIBUTE_NAME = "resourceType";
 
-    public SlingResourceTypeAttrProcessor() {
-        super(ATTR_NAME);
-    }
+    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", LOCAL_VARIABLE_PREFIX, ATTRIBUTE_NAME);
 
-    @Override
-    public int getPrecedence() {
-        return ATTR_PRECEDENCE;
+    public SlingResourceTypeAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix) {
+        super(processorDialect, dialectPrefix, ATTRIBUTE_NAME, ATTRIBUTE_PRECEDENCE);
     }
 
     @Override
-    protected String getNodePropertyName() {
+    protected String getLocalVariableName() {
         return NODE_PROPERTY_NAME;
     }
 

Copied: sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingUnwrapAttributeTagProcessor.java (from r1701282, sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingUnwrapAttrProcessor.java)
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingUnwrapAttributeTagProcessor.java?p2=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingUnwrapAttributeTagProcessor.java&p1=sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingUnwrapAttrProcessor.java&r1=1701282&r2=1705867&rev=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/attr/SlingUnwrapAttrProcessor.java (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingUnwrapAttributeTagProcessor.java Tue Sep 29 14:13:44 2015
@@ -16,27 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.thymeleaf.internal.processor.attr;
+package org.apache.sling.scripting.thymeleaf.internal.processor;
 
-public final class SlingUnwrapAttrProcessor extends SlingNodePropertyAttrProcessor {
+import org.thymeleaf.dialect.IProcessorDialect;
 
-    public static final int ATTR_PRECEDENCE = 99;
+public final class SlingUnwrapAttributeTagProcessor extends SlingLocalVariableAttributeTagProcessor {
 
-    public static final String ATTR_NAME = "unwrap";
+    public static final int ATTRIBUTE_PRECEDENCE = 99;
 
-    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", PREFIX, ATTR_NAME);
+    public static final String ATTRIBUTE_NAME = "unwrap";
 
-    public SlingUnwrapAttrProcessor() {
-        super(ATTR_NAME);
-    }
+    public static final String NODE_PROPERTY_NAME = String.format("%s.%s", LOCAL_VARIABLE_PREFIX, ATTRIBUTE_NAME);
 
-    @Override
-    public int getPrecedence() {
-        return ATTR_PRECEDENCE;
+    public SlingUnwrapAttributeTagProcessor(final IProcessorDialect processorDialect, final String dialectPrefix) {
+        super(processorDialect, dialectPrefix, ATTRIBUTE_NAME, ATTRIBUTE_PRECEDENCE);
     }
 
     @Override
-    protected String getNodePropertyName() {
+    protected String getLocalVariableName() {
         return NODE_PROPERTY_NAME;
     }
 

Modified: sling/trunk/contrib/scripting/thymeleaf/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/thymeleaf/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1705867&r1=1705866&r2=1705867&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/thymeleaf/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ sling/trunk/contrib/scripting/thymeleaf/src/main/resources/OSGI-INF/metatype/metatype.properties Tue Sep 29 14:13:44 2015
@@ -37,30 +37,21 @@ org.apache.sling.scripting.thymeleaf.int
 org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.encoding.name = encoding
 org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.encoding.description = encoding for reading templates
 
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.htmlPatterns.name = patterns for Template Mode HTML
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.htmlPatterns.description = the template patterns (regular expressions) which should be handled by Template Mode HTML (e.g. /apps/sling/*.html - NOTE: extension needs to be enabled for this script engine)
+
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.xmlPatterns.name = patterns for Template Mode XML
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.xmlPatterns.description = the template patterns (regular expressions) which should be handled by Template Mode XML (e.g. /apps/sling/*.xml - NOTE: extension needs to be enabled for this script engine)
+
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.textPatterns.name = patterns for Template Mode TEXT
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.textPatterns.description = the template patterns (regular expressions) which should be handled by Template Mode TEXT (e.g. /apps/sling/*.txt - NOTE: extension needs to be enabled for this script engine)
+
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.javascriptPatterns.name = patterns for Template Mode JAVASCRIPT
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.javascriptPatterns.description = the template patterns (regular expressions) which should be handled by Template Mode JAVASCRIPT (e.g. /apps/sling/*.js - NOTE: extension needs to be enabled for this script engine)
+
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.cssPatterns.name = patterns for Template Mode CSS
+org.apache.sling.scripting.thymeleaf.internal.NonCachingTemplateResolver.cssPatterns.description = the template patterns (regular expressions) which should be handled by Template Mode CSS (e.g. /apps/sling/*.css) - NOTE: extension needs to be enabled for this script engine)
+
 # ResourceBundleMessageResolver
 org.apache.sling.scripting.thymeleaf.internal.ResourceBundleMessageResolver.order.name = order
 org.apache.sling.scripting.thymeleaf.internal.ResourceBundleMessageResolver.order.description = property for ordering message resolvers inside the Thymeleaf template engine
-
-# XmlTemplateModeHandler
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.XmlTemplateModeHandler.patterns.name = patterns
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.XmlTemplateModeHandler.patterns.description = the template patterns (regular expressions) this service should handle (e.g. /apps/sling/*.xml - NOTE: extension needs to be enabled for this script engine)
-
-# ValidatingXmlTemplateModeHandler
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.ValidatingXmlTemplateModeHandler.patterns.name = patterns
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.ValidatingXmlTemplateModeHandler.patterns.description = the template patterns (regular expressions) this service should handle (e.g. /apps/sling/*.xml - NOTE: extension needs to be enabled for this script engine)
-
-# XhtmlTemplateModeHandler
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.XhtmlTemplateModeHandler.patterns.name = patterns
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.XhtmlTemplateModeHandler.patterns.description = the template patterns (regular expressions) this service should handle (e.g. /apps/sling/*.xhtml - NOTE: extension needs to be enabled for this script engine)
-
-# ValidatingXhtmlTemplateModeHandler
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.ValidatingXhtmlTemplateModeHandler.patterns.name = patterns
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.ValidatingXhtmlTemplateModeHandler.patterns.description = the template patterns (regular expressions) this service should handle (e.g. /apps/sling/*.xhtml - NOTE: extension needs to be enabled for this script engine)
-
-# Html5TemplateModeHandler
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.Html5TemplateModeHandler.patterns.name = patterns
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.Html5TemplateModeHandler.patterns.description = the template patterns (regular expressions) this service should handle (e.g. /apps/sling/*.html) - NOTE: extension needs to be enabled for this script engine)
-
-# LegacyHtml5TemplateModeHandler
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.LegacyHtml5TemplateModeHandler.patterns.name = patterns
-org.apache.sling.scripting.thymeleaf.internal.templatemodehandler.LegacyHtml5TemplateModeHandler.patterns.description = the template patterns (regular expressions) this service should handle (e.g. /apps/sling/*.html) - NOTE: extension needs to be enabled for this script engine)