You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2016/04/21 18:36:24 UTC

svn commit: r1740352 - in /sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf: ./ src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/ src/main/java/org/thymeleaf/engine/ src/main/java/org/thymeleaf/templateresolver/

Author: olli
Date: Thu Apr 21 16:36:24 2016
New Revision: 1740352

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

update to Thymeleaf 3.0.0.BETA03 and unbescape 1.1.3.RELEASE

Modified:
    sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/pom.xml
    sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java
    sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/engine/TemplateManager.java
    sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/AbstractTemplateResolver.java
    sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/ITemplateResolver.java

Modified: sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/pom.xml?rev=1740352&r1=1740351&r2=1740352&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/pom.xml (original)
+++ sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/pom.xml Thu Apr 21 16:36:24 2016
@@ -39,9 +39,9 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     <sling.java.version>7</sling.java.version>
-    <org.thymeleaf.version>3.0.0.BETA02</org.thymeleaf.version>
+    <org.thymeleaf.version>3.0.0.BETA03</org.thymeleaf.version>
     <org.attoparser.version>2.0.0.BETA05</org.attoparser.version>
-    <org.unbescape.version>1.1.2.RELEASE</org.unbescape.version>
+    <org.unbescape.version>1.1.3.RELEASE</org.unbescape.version>
     <ognl.version>3.1.2</ognl.version>
     <com.fasterxml.jackson.version>2.6.3</com.fasterxml.jackson.version>
   </properties>

Modified: sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java?rev=1740352&r1=1740351&r2=1740352&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java (original)
+++ sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java Thu Apr 21 16:36:24 2016
@@ -36,7 +36,6 @@ import org.slf4j.LoggerFactory;
 import org.thymeleaf.IEngineConfiguration;
 import org.thymeleaf.context.ITemplateContext;
 import org.thymeleaf.engine.AttributeName;
-import org.thymeleaf.model.IElementAttributes;
 import org.thymeleaf.model.IProcessableElementTag;
 import org.thymeleaf.processor.element.AbstractAttributeTagProcessor;
 import org.thymeleaf.processor.element.IElementTagStructureHandler;
@@ -90,11 +89,11 @@ public class SlingIncludeAttributeTagPro
                 resource = (Resource) include;
             }
             // request dispatcher options
-            final RequestDispatcherOptions requestDispatcherOptions = prepareRequestDispatcherOptions(expressionParser, templateContext, processableElementTag);
+            final RequestDispatcherOptions requestDispatcherOptions = prepareRequestDispatcherOptions(expressionParser, templateContext, processableElementTag, elementTagStructureHandler);
             // dispatch
             final String content = dispatch(resource, path, slingHttpServletRequest, slingHttpServletResponse, requestDispatcherOptions);
             // add output
-            final Boolean unwrap = (Boolean) parseAttribute(expressionParser, templateContext, processableElementTag, UNWRAP_ATTRIBUTE_NAME);
+            final Boolean unwrap = (Boolean) parseAttribute(expressionParser, templateContext, processableElementTag, elementTagStructureHandler, UNWRAP_ATTRIBUTE_NAME);
             if (unwrap != null && unwrap) {
                 elementTagStructureHandler.replaceWith(content, false);
             } else {
@@ -105,30 +104,22 @@ public class SlingIncludeAttributeTagPro
         }
     }
 
-    protected Object parseAttribute(final IStandardExpressionParser expressionParser, final ITemplateContext templateContext, final IProcessableElementTag processableElementTag, final String name) {
-        final IElementAttributes attributes = processableElementTag.getAttributes();
-        final String value = attributes.getValue(dialectPrefix, name);
+    protected Object parseAttribute(final IStandardExpressionParser expressionParser, final ITemplateContext templateContext, final IProcessableElementTag processableElementTag, final IElementTagStructureHandler elementTagStructureHandler, final String name) {
+        final String value = processableElementTag.getAttributeValue(dialectPrefix, name);
         Object result = null;
         if (value != null) {
             final IStandardExpression expression = expressionParser.parseExpression(templateContext, value);
             result = expression.execute(templateContext);
         }
-        attributes.removeAttribute(dialectPrefix, name);
+        elementTagStructureHandler.removeAttribute(dialectPrefix, name);
         return result;
     }
 
-    protected RequestDispatcherOptions prepareRequestDispatcherOptions(final IStandardExpressionParser expressionParser, final ITemplateContext templateContext, final IProcessableElementTag processableElementTag) {
-        final String resourceType = (String) parseAttribute(expressionParser, templateContext, processableElementTag, RESOURCE_TYPE_ATTRIBUTE_NAME);
-        processableElementTag.getAttributes().removeAttribute(dialectPrefix, RESOURCE_TYPE_ATTRIBUTE_NAME);
-
-        final String replaceSelectors = (String) parseAttribute(expressionParser, templateContext, processableElementTag, REPLACE_SELECTORS_ATTRIBUTE_NAME);
-        processableElementTag.getAttributes().removeAttribute(dialectPrefix, REPLACE_SELECTORS_ATTRIBUTE_NAME);
-
-        final String addSelectors = (String) parseAttribute(expressionParser, templateContext, processableElementTag, ADD_SELECTORS_ATTRIBUTE_NAME);
-        processableElementTag.getAttributes().removeAttribute(dialectPrefix, ADD_SELECTORS_ATTRIBUTE_NAME);
-
-        final String replaceSuffix = (String) parseAttribute(expressionParser, templateContext, processableElementTag, REPLACE_SUFFIX_ATTRIBUTE_NAME);
-        processableElementTag.getAttributes().removeAttribute(dialectPrefix, REPLACE_SUFFIX_ATTRIBUTE_NAME);
+    protected RequestDispatcherOptions prepareRequestDispatcherOptions(final IStandardExpressionParser expressionParser, final ITemplateContext templateContext, final IProcessableElementTag processableElementTag, final IElementTagStructureHandler elementTagStructureHandler) {
+        final String resourceType = (String) parseAttribute(expressionParser, templateContext, processableElementTag, elementTagStructureHandler, RESOURCE_TYPE_ATTRIBUTE_NAME);
+        final String replaceSelectors = (String) parseAttribute(expressionParser, templateContext, processableElementTag, elementTagStructureHandler, REPLACE_SELECTORS_ATTRIBUTE_NAME);
+        final String addSelectors = (String) parseAttribute(expressionParser, templateContext, processableElementTag, elementTagStructureHandler, ADD_SELECTORS_ATTRIBUTE_NAME);
+        final String replaceSuffix = (String) parseAttribute(expressionParser, templateContext, processableElementTag, elementTagStructureHandler, REPLACE_SUFFIX_ATTRIBUTE_NAME);
 
         final RequestDispatcherOptions options = new RequestDispatcherOptions();
         options.setForceResourceType(resourceType);

Modified: sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/engine/TemplateManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/engine/TemplateManager.java?rev=1740352&r1=1740351&r2=1740352&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/engine/TemplateManager.java (original)
+++ sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/engine/TemplateManager.java Thu Apr 21 16:36:24 2016
@@ -1,7 +1,7 @@
 /*
  * =============================================================================
  * 
- *   Copyright (c) 2011-2014, The THYMELEAF team (http://www.thymeleaf.org)
+ *   Copyright (c) 2011-2016, The THYMELEAF team (http://www.thymeleaf.org)
  * 
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.
@@ -291,15 +291,9 @@ public final class TemplateManager {
 
 
         /*
-         * Build the TemplateModel that we will end up returning
-         */
-        final TemplateModel templateModel = new TemplateModel(this.configuration, templateData);
-
-
-        /*
          *  Create the Template Handler that will be in charge of building the TemplateModel
          */
-        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(templateModel.getInternalModel());
+        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(this.configuration, templateData);
 
 
         /*
@@ -311,6 +305,8 @@ public final class TemplateManager {
                 ownerTemplate, template, cleanTemplateSelectors, templateData.getTemplateResource(),
                 templateData.getTemplateMode(), templateResolution.getUseDecoupledLogic(), builderHandler);
 
+        final TemplateModel templateModel = builderHandler.getModel();
+
 
         /*
          * Cache the template if it is cacheable
@@ -358,16 +354,15 @@ public final class TemplateManager {
         final IEngineContext engineContext =
                 EngineContextManager.prepareEngineContext(this.configuration, templateData, context.getTemplateResolutionAttributes(), context);
 
-        final TemplateModel preProcessedTemplateModel = new TemplateModel(this.configuration, templateData);
-        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(preProcessedTemplateModel.getInternalModel());
+        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(this.configuration, templateData);
         final ITemplateHandler processingHandlerChain =
                 createTemplateProcessingHandlerChain(engineContext, true, false, builderHandler, null);
 
-        templateModel.getInternalModel().process(processingHandlerChain);
+        templateModel.process(processingHandlerChain);
 
         EngineContextManager.disposeEngineContext(engineContext);
 
-        return preProcessedTemplateModel;
+        return builderHandler.getModel();
 
     }
 
@@ -441,19 +436,13 @@ public final class TemplateManager {
 
 
         /*
-         * Build the TemplateModel
+         * Create the Template Handler that will be in charge of building the TemplateModel
          *
          * NOTE how we are using the owner's TemplateData and not a new one created for this fragment, because
          * we want the elements inside the fragment to me reported as belonging to the container template,
          * not to the fragment String considered as a fragment in its own (which wouldn't make sense)
          */
-        final TemplateModel parsedTemplate = new TemplateModel(this.configuration, templateData);
-
-
-        /*
-         *  Create the Template Handler that will be in charge of building the TemplateModel
-         */
-        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(parsedTemplate.getInternalModel());
+        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(this.configuration, templateData);
 
 
         /*
@@ -463,6 +452,8 @@ public final class TemplateManager {
         // NO RESOURCE is sent to the parser, in this case. We simply pass the String template
         parser.parseString(this.configuration, ownerTemplate, template, lineOffset, colOffset, definitiveTemplateMode, builderHandler);
 
+        final TemplateModel parsedTemplate = builderHandler.getModel();
+
 
         /*
          * Cache the template if it is cacheable
@@ -526,7 +517,7 @@ public final class TemplateManager {
         /*
          *  Process the template
          */
-        template.getInternalModel().process(processingHandlerChain);
+        template.process(processingHandlerChain);
 
 
         /*
@@ -599,7 +590,7 @@ public final class TemplateManager {
                 final ITemplateHandler processingHandlerChain =
                         createTemplateProcessingHandlerChain(engineContext, true, true, processorTemplateHandler, writer);
 
-                cached.getInternalModel().process(processingHandlerChain);
+                cached.process(processingHandlerChain);
 
                 EngineContextManager.disposeEngineContext(engineContext);
 
@@ -652,23 +643,23 @@ public final class TemplateManager {
          */
         if (templateResolution.getValidity().isCacheable() && this.templateCache != null) {
 
-            // Build the TemplateModel
-            final TemplateModel templateModel = new TemplateModel(this.configuration, templateData);
-
             // Create the handler chain to create the Template object
-            final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(templateModel.getInternalModel());
+            final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(this.configuration, templateData);
 
-            // Process the cached template itself
+            // Process the template into a TemplateModel
             parser.parseStandalone(
                     this.configuration,
                     null, template, templateSelectors, templateData.getTemplateResource(),
                     engineContext.getTemplateMode(), templateResolution.getUseDecoupledLogic(), builderHandler);
 
+            // Obtain the TemplateModel
+            final TemplateModel templateModel = builderHandler.getModel();
+
             // Put the new template into cache
             this.templateCache.put(cacheKey, templateModel);
 
             // Process the read (+cached) template itself
-            templateModel.getInternalModel().process(processingHandlerChain);
+            templateModel.process(processingHandlerChain);
 
         } else {
 
@@ -690,6 +681,146 @@ public final class TemplateManager {
     }
 
 
+    public ThrottledTemplateProcessor parseAndProcessThrottled(
+            final TemplateSpec templateSpec,
+            final IContext context,
+            final Writer writer) {
+
+        Validate.notNull(templateSpec, "Template Specification cannot be null");
+        Validate.notNull(context, "Context cannot be null");
+        Validate.notNull(writer, "Writer cannot be null");
+
+
+        // TemplateSpec will already have validated its contents, so need to do it here (template selectors,
+        // resolution attributes, etc.)
+
+        final String template = templateSpec.getTemplate();
+        final Set<String> templateSelectors = templateSpec.getTemplateSelectors();
+        final TemplateMode templateMode = templateSpec.getTemplateMode();
+        final Map<String, Object> templateResolutionAttributes = templateSpec.getTemplateResolutionAttributes();
+
+        final TemplateCacheKey cacheKey =
+                new TemplateCacheKey(
+                        null, // ownerTemplate
+                        template, templateSelectors,
+                        0, 0, // lineOffset, colOffset
+                        templateMode,
+                        templateResolutionAttributes);
+
+
+        /*
+         * Instantiate the throttling artifacts
+         */
+        final TemplateFlowController flowController = new TemplateFlowController();
+        final ThrottledTemplateWriter throttledTemplateWriter = new ThrottledTemplateWriter(template, flowController, writer);
+
+
+        /*
+         * First look at the cache - it might be already cached
+         */
+        if (this.templateCache != null) {
+
+            final TemplateModel cached =  this.templateCache.get(cacheKey);
+
+            if (cached != null) {
+
+                final IEngineContext engineContext =
+                        EngineContextManager.prepareEngineContext(this.configuration, cached.getTemplateData(), templateResolutionAttributes, context);
+
+                /*
+                 * Create the handler chain to process the data.
+                 * This is PARSE + PROCESS, so its called from the TemplateEngine, and the only case in which we should apply
+                 * both pre-processors and post-processors (besides creating a last output-to-writer step)
+                 */
+                final ProcessorTemplateHandler processorTemplateHandler = new ProcessorTemplateHandler();
+                processorTemplateHandler.setFlowController(flowController);
+                final ITemplateHandler processingHandlerChain =
+                        createTemplateProcessingHandlerChain(engineContext, true, true, processorTemplateHandler, throttledTemplateWriter);
+
+                /*
+                 * Return the throttled template processor
+                 */
+                return new ThrottledTemplateProcessor(
+                        templateSpec, engineContext, cached, processingHandlerChain,
+                        processorTemplateHandler, flowController, throttledTemplateWriter);
+
+            }
+
+        }
+
+
+        /*
+         * Resolve the template
+         */
+        final TemplateResolution templateResolution =
+                resolveTemplate(this.configuration, context, null, template, templateResolutionAttributes, true);
+
+
+        /*
+         * Build the TemplateData object
+         */
+        final TemplateData templateData =
+                buildTemplateData(templateResolution, template, templateSelectors, templateMode, true);
+
+
+        /*
+         * Prepare the context instance that corresponds to this execution of the template engine
+         */
+        final IEngineContext engineContext =
+                EngineContextManager.prepareEngineContext(this.configuration, templateData, templateResolutionAttributes, context);
+
+
+        /*
+         * Create the handler chain to process the data.
+         * This is PARSE + PROCESS, so its called from the TemplateEngine, and the only case in which we should apply
+         * both pre-processors and post-processors (besides creating a last output-to-writer step)
+         */
+        final ProcessorTemplateHandler processorTemplateHandler = new ProcessorTemplateHandler();
+        processorTemplateHandler.setFlowController(flowController);
+        final ITemplateHandler processingHandlerChain =
+                createTemplateProcessingHandlerChain(engineContext, true, true, processorTemplateHandler, throttledTemplateWriter);
+
+
+        /*
+         * Obtain the parser
+         */
+        final ITemplateParser parser = getParserForTemplateMode(engineContext.getTemplateMode());
+
+
+        /*
+         * Parse the template into a TemplateModel. Even if we are not using the cache, throttled template processings
+         * will always be processed first into a TemplateModel, so that throttling can then be applied on an
+         * already-in-memory sequence of events
+         */
+        final ModelBuilderTemplateHandler builderHandler = new ModelBuilderTemplateHandler(this.configuration, templateData);
+        parser.parseStandalone(
+                this.configuration,
+                null, template, templateSelectors, templateData.getTemplateResource(),
+                engineContext.getTemplateMode(), templateResolution.getUseDecoupledLogic(), builderHandler);
+        final TemplateModel templateModel = builderHandler.getModel();
+
+
+        /*
+         * If cache is active, put the cached TemplateModel into cache
+         */
+        if (templateResolution.getValidity().isCacheable() && this.templateCache != null) {
+
+            // Put the new template into cache
+            this.templateCache.put(cacheKey, templateModel);
+
+        }
+
+
+        /*
+         * Return the throttled template processor
+         */
+        return new ThrottledTemplateProcessor(
+                templateSpec, engineContext, templateModel, processingHandlerChain,
+                processorTemplateHandler, flowController, throttledTemplateWriter);
+
+    }
+
+
 
 
 
@@ -802,7 +933,7 @@ public final class TemplateManager {
          */
         if (setPreProcessors) {
             final Set<IPreProcessor> preProcessors = configuration.getPreProcessors(context.getTemplateMode());
-            if (preProcessors != null) {
+            if (preProcessors != null && preProcessors.size() > 0) {
                 for (final IPreProcessor preProcessor : preProcessors) {
                     final Class<? extends ITemplateHandler> preProcessorClass = preProcessor.getHandlerClass();
                     final ITemplateHandler preProcessorHandler;
@@ -845,7 +976,7 @@ public final class TemplateManager {
          */
         if (setPostProcessors) {
             final Set<IPostProcessor> postProcessors = configuration.getPostProcessors(context.getTemplateMode());
-            if (postProcessors != null) {
+            if (postProcessors != null && postProcessors.size() > 0) {
                 for (final IPostProcessor postProcessor : postProcessors) {
                     final Class<? extends ITemplateHandler> postProcessorClass = postProcessor.getHandlerClass();
                     final ITemplateHandler postProcessorHandler;

Modified: sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/AbstractTemplateResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/AbstractTemplateResolver.java?rev=1740352&r1=1740351&r2=1740352&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/AbstractTemplateResolver.java (original)
+++ sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/AbstractTemplateResolver.java Thu Apr 21 16:36:24 2016
@@ -1,7 +1,7 @@
 /*
  * =============================================================================
  * 
- *   Copyright (c) 2011-2014, The THYMELEAF team (http://www.thymeleaf.org)
+ *   Copyright (c) 2011-2016, The THYMELEAF team (http://www.thymeleaf.org)
  * 
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.

Modified: sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/ITemplateResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/ITemplateResolver.java?rev=1740352&r1=1740351&r2=1740352&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/ITemplateResolver.java (original)
+++ sling/trunk/contrib/scripting/org.apache.sling.scripting.thymeleaf/src/main/java/org/thymeleaf/templateresolver/ITemplateResolver.java Thu Apr 21 16:36:24 2016
@@ -1,7 +1,7 @@
 /*
  * =============================================================================
  * 
- *   Copyright (c) 2011-2014, The THYMELEAF team (http://www.thymeleaf.org)
+ *   Copyright (c) 2011-2016, The THYMELEAF team (http://www.thymeleaf.org)
  * 
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.