Author: robertdzeigler Date: Fri Aug 12 05:50:43 2011 New Revision: 1156971
URL: http://svn.apache.org/viewvc?rev=1156971&view=rev Log: TAP5-1605: Template parsing of expansions can't handle map expressions Added: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MapExpressionInExpansions.tml tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MapExpressionInExpansions.java tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/expansions_with_maps.tml - copied, changed from r1155574, tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/multiple_expansions_on_one_line.tml Modified: tapestry/tapestry5/trunk/build.gradle tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SaxTemplateParser.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/TemplateParserImplTest.java Modified: tapestry/tapestry5/trunk/build.gradle URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/build.gradle?rev=1156971&r1=1156970&r2=1156971&view=diff ============================================================================== --- tapestry/tapestry5/trunk/build.gradle (original) +++ tapestry/tapestry5/trunk/build.gradle Fri Aug 12 05:50:43 2011 @@ -88,7 +88,7 @@ subprojects { } ideaModule { - scopes.PROVIDED.plus += configurations.provided +// scopes.PROVIDED.plus += configurations.provided } dependencies { Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SaxTemplateParser.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SaxTemplateParser.java?rev=1156971&r1=1156970&r2=1156971&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SaxTemplateParser.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SaxTemplateParser.java Fri Aug 12 05:50:43 2011 @@ -129,7 +129,7 @@ public class SaxTemplateParser // expansions on the same text line into a single large // but invalid expansion. - private static final Pattern EXPANSION_PATTERN = Pattern.compile("\\$\\{\\s*(.*?)\\s*}"); + private static final Pattern EXPANSION_PATTERN = Pattern.compile("\\$\\{\\s*(((?!\\$\\{).)*)\\s*}"); private static final Set<String> MUST_BE_ROOT = CollectionFactory.newSet("extend", "container"); Added: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MapExpressionInExpansions.tml URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MapExpressionInExpansions.tml?rev=1156971&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MapExpressionInExpansions.tml (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MapExpressionInExpansions.tml Fri Aug 12 05:50:43 2011 @@ -0,0 +1,9 @@ +<html t:type="border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> + <h1>Map Expression in Template Expansion Demo</h1> + + <ul> + <li>Empty Map: <span id="emptymap">${echoMap({})}</span></li> + <li>String Keys Map: <span id="stringmap">${echoMap({'A':1})}</span></li> + <li>Number Keys Map: <span id="numberkeysmap">${echoMap({1: 'one'})}</span></li> + </ul> +</html> Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java?rev=1156971&r1=1156970&r2=1156971&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java Fri Aug 12 05:50:43 2011 @@ -126,6 +126,16 @@ public class CoreBehaviorsTests extends assertTextPresent("[value provided by a template expansion]"); } + @Test + public void maps_in_expansions() throws Exception + { + openLinks("Map Expressions in Expansions Demo"); + + assertText("emptymap", "{}"); + assertText("stringmap", "{A:1}"); + assertText("numberkeysmap", "{1:one}"); + } + /** * {@link org.apache.tapestry5.internal.transform.InjectContainerWorker} is * largely tested by the forms tests Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=1156971&r1=1156970&r2=1156971&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java Fri Aug 12 05:50:43 2011 @@ -489,7 +489,9 @@ public class Index new Item("BeanEditFormPrepareBubbling", "BeanEditor Prepare Bubbling Demo", "Prepare event bubbling"), - new Item("NestedFormFragment", "Nested Form Fragment Demo", "Nesting Form Fragments work properly") + new Item("NestedFormFragment", "Nested Form Fragment Demo", "Nesting Form Fragments work properly"), + + new Item("MapExpressionInExpansions", "Map Expressions in Expansions Demo", "Maps can be used in expansions") ); Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MapExpressionInExpansions.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MapExpressionInExpansions.java?rev=1156971&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MapExpressionInExpansions.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MapExpressionInExpansions.java Fri Aug 12 05:50:43 2011 @@ -0,0 +1,48 @@ +// Copyright 2011 The Apache Software Foundation +// +// Licensed 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.tapestry5.integration.app1.pages; + +import java.util.Iterator; +import java.util.Map; + +/** + * Demonstrates the use of Map expressions in template expansions (eg: ${{'a': 1, 'b': 2}} + */ +public class MapExpressionInExpansions +{ + + public String echoMap(Map<?,?> value) + { + if (value == null) + return ""; + + StringBuilder builder = new StringBuilder("{"); + + for (Map.Entry entry : value.entrySet()) + { + builder.append(entry.getKey()) + .append(":") + .append(entry.getValue()) + .append(","); + } + + if (builder.length() > 1) + builder.deleteCharAt(builder.length()-1); + + builder.append("}"); + + return builder.toString(); + } + +} Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/TemplateParserImplTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/TemplateParserImplTest.java?rev=1156971&r1=1156970&r2=1156971&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/TemplateParserImplTest.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/TemplateParserImplTest.java Fri Aug 12 05:50:43 2011 @@ -565,6 +565,29 @@ public class TemplateParserImplTest exte } @Test + public void expansions_with_maps() + { + List<TemplateToken> tokens= tokens("expansions_with_maps.tml"); + + System.out.println(tokens); + assertEquals(tokens.size(), 11); + + //note that a single expansion on a line and two expansions on a line are tested individually elsewhere, + //so we group them together here just to cover all of the bases when using maps. + ExpansionToken expansion = get(tokens, 2); + assertEquals(expansion.getExpression(), "{}", "Empty map parsed incorrectly in an expansion"); + + expansion = get(tokens, 4); + assertEquals(expansion.getExpression(), "{'a': 'b'}", "Non-empty map parsed incorrectly in an expansion"); + + expansion = get(tokens, 6); + assertEquals(expansion.getExpression(), "{'one': 1}", "First expansion in a line with two expansions parsed incorrectly"); + + expansion = get(tokens, 8); + assertEquals(expansion.getExpression(), "{'two': 2}", "Second expansion in a line with two expansions parsed incorrectly"); + } + + @Test public void parameter_element() { List<TemplateToken> tokens = tokens("parameter_element.tml"); Copied: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/expansions_with_maps.tml (from r1155574, tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/multiple_expansions_on_one_line.tml) URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/expansions_with_maps.tml?p2=tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/expansions_with_maps.tml&p1=tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/multiple_expansions_on_one_line.tml&r1=1155574&r2=1156971&rev=1156971&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/multiple_expansions_on_one_line.tml (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/internal/services/expansions_with_maps.tml Fri Aug 12 05:50:43 2011 @@ -1,3 +1,5 @@ <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xml:space="preserve"> - <dd>${classLoader} [${classLoader.class.name}]</dd> + Empty map: ${{}} + Non-empty map: ${{'a': 'b'}} + Two expansions with maps: ${{'one': 1}} ${{'two': 2}} </html>