<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-339</id>
	<title>Nabble - Tapestry - Dev</title>
	<updated>2009-11-11T01:42:39Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/Tapestry---Dev-f339.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Tapestry---Dev-f339.html" />
	<subtitle type="html"></subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26298572</id>
	<title>[jira] Commented: (TAP5-815) Asset dispatcher allows any file inside the webapp visible and downloadable</title>
	<published>2009-11-11T01:42:39Z</published>
	<updated>2009-11-11T01:42:39Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; [ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-815?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12776391#action_12776391&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-815?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12776391#action_12776391&lt;/a&gt;&amp;nbsp;] 
&lt;br&gt;&lt;br&gt;J le Roux commented on TAP5-815:
&lt;br&gt;--------------------------------
&lt;br&gt;&lt;br&gt;I can confirm that it works with 5.0.19-SNAPSHOT (svn version 834439, &lt;a href=&quot;https://svn.apache.org/repos/asf/tapestry/tapestry5/branches/5.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://svn.apache.org/repos/asf/tapestry/tapestry5/branches/5.0&lt;/a&gt;).
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Asset dispatcher allows any file inside the webapp visible and downloadable
&lt;br&gt;&amp;gt; ---------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-815
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-815&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-815&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Thiago H. de Paula Figueiredo
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Robert Zeigler
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Priority: Blocker
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Take any asset and you have an URL like domain.com/assets/ctx/f10407a6c1753e39/css/main.css. If you request domain.com/assets/ctx/f10407a6c1753e39/, a list containing all the files inside the webapp root is shown. It gives you the hint at downloading any file you want, including anyting inside WEB-INF and assets that should be protected by ResourceDigestGenerator.
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-815%29-Asset-dispatcher-allows-any-file-inside-the-webapp-visible-and-downloadable-tp24984184p26298572.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26290100</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk: 	src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ 	tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T11:51:02Z</published>
	<updated>2009-11-10T11:51:02Z</updated>
	<author>
		<name>Ulrich Stärk</name>
	</author>
	<content type="html">In this case it's about requests to 
&lt;br&gt;&lt;a href=&quot;http://my.site/somecontext/assets/ctx/something/WEB-INF/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://my.site/somecontext/assets/ctx/something/WEB-INF/&lt;/a&gt;&amp;nbsp;and similar. 
&lt;br&gt;since accessing those via the asset dispatcher is forbidden, regardless 
&lt;br&gt;whether the request is for an existing asset or not, I guess returning 
&lt;br&gt;403 is ok.
&lt;br&gt;&lt;br&gt;Uli
&lt;br&gt;&lt;br&gt;Andreas Andreou schrieb:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; ok, well, all i'm saying is it should return 404 in all those cases
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Last time i checked that's what jetty/tomcat are doing for requests such as
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://my.site/WEB-INF/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://my.site/WEB-INF/&lt;/a&gt;&amp;nbsp; (but i'm not sure if that's in the servlet
&lt;br&gt;&amp;gt; specs or not)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Tue, Nov 10, 2009 at 8:03 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; That's because the AssetProtectionDispatcher doesn't know whether the
&lt;br&gt;&amp;gt;&amp;gt; resource actually exists. It just checks the requested url against a
&lt;br&gt;&amp;gt;&amp;gt; whitelist consisting of allowed patterns.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Andreas Andreou schrieb:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Interesting... So, why then is it returning 403-forbidden for
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; something that doesn't exist?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Anyone knows/remembers the reasoning?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On Tue, Nov 10, 2009 at 6:43 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; since it returns 403 also on non-existent resources, an attacker wouldn't
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; know whether the resource he requested actually exists.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Am 10.11.2009 17:23 schrieb Andreas Andreou:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; hmm, i'd argue it needs to return a 404 error though, so as not to give
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; attackers a way to know which libraries/jars/resources exist...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Tue, Nov 10, 2009 at 2:52 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ust tested it in trunk, works as expected: Trying to access templates
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; other stuff, as well as directory listings result in a 403. An
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; integration
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; test making sure that the protection isn't accidentally removed again
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; would
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; be nice though.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM, &amp;nbsp;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Date: Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; downloadable (5.2 branch)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Cheers
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26290100&amp;i=11&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26290100.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26289441</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk:  src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/  tapestry-core/src/main/java/org/apache/tapestry5/services/  tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T11:07:10Z</published>
	<updated>2009-11-10T11:07:10Z</updated>
	<author>
		<name>Andreas Andreou-4</name>
	</author>
	<content type="html">ok, well, all i'm saying is it should return 404 in all those cases
&lt;br&gt;&lt;br&gt;Last time i checked that's what jetty/tomcat are doing for requests such as
&lt;br&gt;&lt;a href=&quot;http://my.site/WEB-INF/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://my.site/WEB-INF/&lt;/a&gt;&amp;nbsp; (but i'm not sure if that's in the servlet
&lt;br&gt;specs or not)
&lt;br&gt;&lt;br&gt;On Tue, Nov 10, 2009 at 8:03 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; That's because the AssetProtectionDispatcher doesn't know whether the
&lt;br&gt;&amp;gt; resource actually exists. It just checks the requested url against a
&lt;br&gt;&amp;gt; whitelist consisting of allowed patterns.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Andreas Andreou schrieb:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Interesting... So, why then is it returning 403-forbidden for
&lt;br&gt;&amp;gt;&amp;gt; something that doesn't exist?
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Anyone knows/remembers the reasoning?
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Tue, Nov 10, 2009 at 6:43 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; since it returns 403 also on non-existent resources, an attacker wouldn't
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; know whether the resource he requested actually exists.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Am 10.11.2009 17:23 schrieb Andreas Andreou:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; hmm, i'd argue it needs to return a 404 error though, so as not to give
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; attackers a way to know which libraries/jars/resources exist...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Tue, Nov 10, 2009 at 2:52 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ust tested it in trunk, works as expected: Trying to access templates
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; other stuff, as well as directory listings result in a 403. An
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; integration
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; test making sure that the protection isn't accidentally removed again
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; would
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; be nice though.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM,  &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Date: Mon Nov  9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; downloadable (5.2 branch)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Cheers
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Andreas Andreou - &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andyhot@...&lt;/a&gt; - &lt;a href=&quot;http://blog.andyhot.gr&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://blog.andyhot.gr&lt;/a&gt;&lt;br&gt;Tapestry / Tacos developer
&lt;br&gt;Open Source / JEE Consulting
&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=11&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26289441&amp;i=12&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26289441.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26288879</id>
	<title>[jira] Updated: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T10:33:28Z</published>
	<updated>2009-11-10T10:33:28Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Andreas Fink updated TAP5-785:
&lt;br&gt;------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Comment: was deleted
&lt;br&gt;&lt;br&gt;(was: -)
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: blackbird.js.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288879&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26288879.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26288846</id>
	<title>[jira] Updated: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T10:31:28Z</published>
	<updated>2009-11-10T10:31:28Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Andreas Fink updated TAP5-785:
&lt;br&gt;------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Attachment: &amp;nbsp; &amp;nbsp; (was: blackbird.js.patch)
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: blackbird.js.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288846&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26288846.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26288847</id>
	<title>[jira] Updated: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T10:31:28Z</published>
	<updated>2009-11-10T10:31:28Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Andreas Fink updated TAP5-785:
&lt;br&gt;------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Attachment: blackbird.js.patch
&lt;br&gt;&lt;br&gt;-
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: blackbird.js.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288847&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26288847.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26288376</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk: 	src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ 	tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T10:03:43Z</published>
	<updated>2009-11-10T10:03:43Z</updated>
	<author>
		<name>Ulrich Stärk</name>
	</author>
	<content type="html">That's because the AssetProtectionDispatcher doesn't know whether the 
&lt;br&gt;resource actually exists. It just checks the requested url against a 
&lt;br&gt;whitelist consisting of allowed patterns.
&lt;br&gt;&lt;br&gt;Uli
&lt;br&gt;&lt;br&gt;Andreas Andreou schrieb:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Interesting... So, why then is it returning 403-forbidden for
&lt;br&gt;&amp;gt; something that doesn't exist?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Anyone knows/remembers the reasoning?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Tue, Nov 10, 2009 at 6:43 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; since it returns 403 also on non-existent resources, an attacker wouldn't
&lt;br&gt;&amp;gt;&amp;gt; know whether the resource he requested actually exists.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Am 10.11.2009 17:23 schrieb Andreas Andreou:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; hmm, i'd argue it needs to return a 404 error though, so as not to give
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; attackers a way to know which libraries/jars/resources exist...
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On Tue, Nov 10, 2009 at 2:52 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ust tested it in trunk, works as expected: Trying to access templates and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; other stuff, as well as directory listings result in a 403. An
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; integration
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; test making sure that the protection isn't accidentally removed again
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; would
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; be nice though.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM, &amp;nbsp;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Date: Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; downloadable (5.2 branch)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Cheers
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26288376&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26288376.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26287120</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk:  src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/  tapestry-core/src/main/java/org/apache/tapestry5/services/  tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T08:59:18Z</published>
	<updated>2009-11-10T08:59:18Z</updated>
	<author>
		<name>Andreas Andreou-4</name>
	</author>
	<content type="html">Interesting... So, why then is it returning 403-forbidden for
&lt;br&gt;something that doesn't exist?
&lt;br&gt;&lt;br&gt;Anyone knows/remembers the reasoning?
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Tue, Nov 10, 2009 at 6:43 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; since it returns 403 also on non-existent resources, an attacker wouldn't
&lt;br&gt;&amp;gt; know whether the resource he requested actually exists.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Am 10.11.2009 17:23 schrieb Andreas Andreou:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; hmm, i'd argue it needs to return a 404 error though, so as not to give
&lt;br&gt;&amp;gt;&amp;gt; attackers a way to know which libraries/jars/resources exist...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Tue, Nov 10, 2009 at 2:52 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ust tested it in trunk, works as expected: Trying to access templates and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; other stuff, as well as directory listings result in a 403. An
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; integration
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; test making sure that the protection isn't accidentally removed again
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; would
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; be nice though.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM,  &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Date: Mon Nov  9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; downloadable (5.2 branch)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Cheers
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Andreas Andreou - &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andyhot@...&lt;/a&gt; - &lt;a href=&quot;http://blog.andyhot.gr&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://blog.andyhot.gr&lt;/a&gt;&lt;br&gt;Tapestry / Tacos developer
&lt;br&gt;Open Source / JEE Consulting
&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26287120&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26287120.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286799</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk: 	src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ 	tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T08:43:34Z</published>
	<updated>2009-11-10T08:43:34Z</updated>
	<author>
		<name>Ulrich Stärk</name>
	</author>
	<content type="html">since it returns 403 also on non-existent resources, an attacker wouldn't know whether the resource 
&lt;br&gt;he requested actually exists.
&lt;br&gt;&lt;br&gt;Am 10.11.2009 17:23 schrieb Andreas Andreou:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; hmm, i'd argue it needs to return a 404 error though, so as not to give
&lt;br&gt;&amp;gt; attackers a way to know which libraries/jars/resources exist...
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Tue, Nov 10, 2009 at 2:52 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286799&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; ust tested it in trunk, works as expected: Trying to access templates and
&lt;br&gt;&amp;gt;&amp;gt; other stuff, as well as directory listings result in a 403. An integration
&lt;br&gt;&amp;gt;&amp;gt; test making sure that the protection isn't accidentally removed again would
&lt;br&gt;&amp;gt;&amp;gt; be nice though.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM, &amp;nbsp;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286799&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Date: Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; downloadable (5.2 branch)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Cheers
&lt;br&gt;&amp;gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286799&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286799&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286799&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286799&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26286799.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286729</id>
	<title>[jira] Updated: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T08:39:28Z</published>
	<updated>2009-11-10T08:39:28Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Andreas Fink updated TAP5-785:
&lt;br&gt;------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Comment: was deleted
&lt;br&gt;&lt;br&gt;(was: see comment above)
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: blackbird.js.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286729&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26286729.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286731</id>
	<title>[jira] Issue Comment Edited: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T08:39:28Z</published>
	<updated>2009-11-10T08:39:28Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; [ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12775932#action_12775932&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12775932#action_12775932&lt;/a&gt;&amp;nbsp;] 
&lt;br&gt;&lt;br&gt;Andreas Fink edited comment on TAP5-785 at 11/10/09 4:39 PM:
&lt;br&gt;-------------------------------------------------------------
&lt;br&gt;&lt;br&gt;In the RFC &lt;a href=&quot;http://www.w3.org/Protocols/rfc2109/rfc2109&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/Protocols/rfc2109/rfc2109&lt;/a&gt;&amp;nbsp;- &amp;quot;10.1.3 Punctuation&amp;quot; - it says the value (json-data) can be quoted to allow whitespace and waht not.
&lt;br&gt;I patched tapestries' (5.1.0.5) blackbird.js and configured the patched version like described in &lt;a href=&quot;http://tapestryjava.blogspot.com/2009/10/tapestry-51-and-ie-8-customizing.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestryjava.blogspot.com/2009/10/tapestry-51-and-ie-8-customizing.html&lt;/a&gt;&amp;nbsp;... it works!
&lt;br&gt;See attachment &amp;quot;blackbird.js.patch&amp;quot;.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; was (Author: alma):
&lt;br&gt;&amp;nbsp; &amp;nbsp; In the RFC &lt;a href=&quot;http://www.w3.org/Protocols/rfc2109/rfc2109&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/Protocols/rfc2109/rfc2109&lt;/a&gt;&amp;nbsp;- &amp;quot;10.1.3 Punctuation&amp;quot; - it says the value (json-data) can be quoted to allow whitespace and waht not.
&lt;br&gt;I patched tapestries' (5.1.0.5) blackbird.js and configured the patched version like described in &lt;a href=&quot;http://tapestryjava.blogspot.com/2009/10/tapestry-51-and-ie-8-customizing.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestryjava.blogspot.com/2009/10/tapestry-51-and-ie-8-customizing.html&lt;/a&gt;&amp;nbsp;... it works!
&lt;br&gt;See attached patch.
&lt;br&gt;&lt;br&gt;&amp;nbsp; 
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: blackbird.js.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286731&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26286731.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286730</id>
	<title>[jira] Updated: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T08:39:27Z</published>
	<updated>2009-11-10T08:39:27Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Andreas Fink updated TAP5-785:
&lt;br&gt;------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Attachment: blackbird.js.patch
&lt;br&gt;&lt;br&gt;see comment above
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: blackbird.js.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286730&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26286730.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286699</id>
	<title>[jira] Commented: (TAP5-785) Logfiles contain many warnings that something is wrong with Blackbird cookies</title>
	<published>2009-11-10T08:37:27Z</published>
	<updated>2009-11-10T08:37:27Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; [ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12775932#action_12775932&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12775932#action_12775932&lt;/a&gt;&amp;nbsp;] 
&lt;br&gt;&lt;br&gt;Andreas Fink commented on TAP5-785:
&lt;br&gt;-----------------------------------
&lt;br&gt;&lt;br&gt;In the RFC &lt;a href=&quot;http://www.w3.org/Protocols/rfc2109/rfc2109&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/Protocols/rfc2109/rfc2109&lt;/a&gt;&amp;nbsp;- &amp;quot;10.1.3 Punctuation&amp;quot; - it says the value (json-data) can be quoted to allow whitespace and waht not.
&lt;br&gt;I patched tapestries' (5.1.0.5) blackbird.js and configured the patched version like described in &lt;a href=&quot;http://tapestryjava.blogspot.com/2009/10/tapestry-51-and-ie-8-customizing.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestryjava.blogspot.com/2009/10/tapestry-51-and-ie-8-customizing.html&lt;/a&gt;&amp;nbsp;... it works!
&lt;br&gt;See attached patch.
&lt;br&gt;&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Logfiles contain many warnings that something is wrong with Blackbird cookies
&lt;br&gt;&amp;gt; -----------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-785
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-785&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-785&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Andy Pahne
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Environment: 
&lt;br&gt;&amp;gt; - Tapestry 5.1.0.5, 
&lt;br&gt;&amp;gt; - running in maven jetty plugin
&lt;br&gt;&amp;gt; 2009-07-16 10:42:03.629::INFO: &amp;nbsp;Started &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286699&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;SelectChannelConnector@...&lt;/a&gt;:7080
&lt;br&gt;&amp;gt; [INFO] Started Jetty Server
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.385::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:47.401::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;size&amp;quot;: 0&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49.510::WARN: &amp;nbsp;java.lang.IllegalArgumentException: Cookie name &amp;quot;&amp;quot;load&amp;quot;: null}&amp;quot; is a reserved token
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - DWR Version 2.0.5 starting.
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Servlet Engine: jetty/6.1.19
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Version: &amp;nbsp; 1.6.0_12
&lt;br&gt;&amp;gt; 2009-07-16 10:43:49,525 &amp;nbsp;INFO (CommonsLoggingOutput.java:51) - - Java Vendor: &amp;nbsp; &amp;nbsp;Sun Microsystems Inc.
&lt;br&gt;&amp;gt; Those are the cookies set (besides JSESSIONID):
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/search/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 30 Jul 2009 08:43:50 GMT
&lt;br&gt;&amp;gt; Name &amp;nbsp; &amp;nbsp;blackbird
&lt;br&gt;&amp;gt; Val &amp;nbsp; &amp;nbsp;{&amp;quot;pos&amp;quot;: 1, &amp;quot;size&amp;quot;: 0, &amp;quot;load&amp;quot;: null}
&lt;br&gt;&amp;gt; Host &amp;nbsp; &amp;nbsp;localhost
&lt;br&gt;&amp;gt; Path &amp;nbsp; &amp;nbsp;/tb/
&lt;br&gt;&amp;gt; Gültig bis &amp;nbsp; &amp;nbsp;Thu, 16 Jul 2009 11:26:09 GMT
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-785%29-Logfiles-contain-many-warnings-that-something-is-wrong-with-Blackbird-cookies-tp24531204p26286699.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286445</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk:  src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/  tapestry-core/src/main/java/org/apache/tapestry5/services/  tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T08:23:19Z</published>
	<updated>2009-11-10T08:23:19Z</updated>
	<author>
		<name>Andreas Andreou-4</name>
	</author>
	<content type="html">hmm, i'd argue it needs to return a 404 error though, so as not to give
&lt;br&gt;attackers a way to know which libraries/jars/resources exist...
&lt;br&gt;&lt;br&gt;On Tue, Nov 10, 2009 at 2:52 PM, Ulrich Stärk &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;uli@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; ust tested it in trunk, works as expected: Trying to access templates and
&lt;br&gt;&amp;gt; other stuff, as well as directory listings result in a 403. An integration
&lt;br&gt;&amp;gt; test making sure that the protection isn't accidentally removed again would
&lt;br&gt;&amp;gt; be nice though.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Uli
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM,  &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Date: Mon Nov  9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible and
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; downloadable (5.2 branch)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Cheers
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Andreas Andreou - &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andyhot@...&lt;/a&gt; - &lt;a href=&quot;http://blog.andyhot.gr&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://blog.andyhot.gr&lt;/a&gt;&lt;br&gt;Tapestry / Tacos developer
&lt;br&gt;Open Source / JEE Consulting
&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26286445&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26286445.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26286204</id>
	<title>[jira] Created: (TAP5-923) Injeting Tapestry Services to Spring Beans is completely undocumented</title>
	<published>2009-11-10T08:11:29Z</published>
	<updated>2009-11-10T08:11:29Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">Injeting Tapestry Services to Spring Beans is completely undocumented
&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Key: TAP5-923
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-923&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-923&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Project: Tapestry 5
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Issue Type: Bug
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Components: documentation, tapestry-spring
&lt;br&gt;&amp;nbsp; &amp;nbsp; Affects Versions: 5.1.0.5
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reporter: Michael Wyraz
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Priority: Critical
&lt;br&gt;&lt;br&gt;&lt;br&gt;The documentation says that it is possible to inject tapestry services into spring beans but does not state HOW. It's almost impossible to find any information about this in the web. After hours of searching I found in a post that it works with:
&lt;br&gt;&lt;br&gt;@Inject @Autowired
&lt;br&gt;privateService myService;
&lt;br&gt;&lt;br&gt;PLEASE! Add this to the documentation since without only half of tapestry-spring is usable!
&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-923%29-Injeting-Tapestry-Services-to-Spring-Beans-is-completely-undocumented-tp26286204p26286204.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26282878</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk: 	src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ 	tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T04:52:19Z</published>
	<updated>2009-11-10T04:52:19Z</updated>
	<author>
		<name>Ulrich Stärk</name>
	</author>
	<content type="html">ust tested it in trunk, works as expected: Trying to access templates and other stuff, as well as 
&lt;br&gt;directory listings result in a 403. An integration test making sure that the protection isn't 
&lt;br&gt;accidentally removed again would be nice though.
&lt;br&gt;&lt;br&gt;Uli
&lt;br&gt;&lt;br&gt;Am 10.11.2009 11:28 schrieb Massimo Lusetti:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 6:23 PM, &amp;nbsp;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26282878&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt;&amp;gt; Date: Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;&amp;gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; Log:
&lt;br&gt;&amp;gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible and downloadable (5.2 branch)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;&amp;gt; for (back)porting to the other two dev branch.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Cheers
&lt;/div&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26282878&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26282878&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26282878.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26281233</id>
	<title>Re: svn commit: r834151 - in /tapestry/tapestry5/trunk:  src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/  tapestry-core/src/main/java/org/apache/tapestry5/services/  tapestry-core/src/test/java/org/apache/tapestry</title>
	<published>2009-11-10T02:28:46Z</published>
	<updated>2009-11-10T02:28:46Z</updated>
	<author>
		<name>Massimo Lusetti</name>
	</author>
	<content type="html">On Mon, Nov 9, 2009 at 6:23 PM, &amp;nbsp;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26281233&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;robertdzeigler@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; Author: robertdzeigler
&lt;br&gt;&amp;gt; Date: Mon Nov  9 17:23:10 2009
&lt;br&gt;&amp;gt; New Revision: 834151
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt; Log:
&lt;br&gt;&amp;gt; TAP5-815: Asset dispatcher allows any file inside the webapp visible and downloadable (5.2 branch)
&lt;br&gt;&lt;br&gt;Looking for testing this one soon but thanks for the work! Especially
&lt;br&gt;for (back)porting to the other two dev branch.
&lt;br&gt;&lt;br&gt;Cheers
&lt;br&gt;-- 
&lt;br&gt;Massimo
&lt;br&gt;&lt;a href=&quot;http://meridio.blogspot.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://meridio.blogspot.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26281233&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26281233&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A--src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services---tapestry-core-src-main-java-org-apache-tapestry5-services---tapestry-core-src-test-java-org-apache-tapestry-tp26281233p26281233.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26276309</id>
	<title>[jira] Created: (TAP5-922) Allow null in LinkImpl.addParameter</title>
	<published>2009-11-09T16:31:32Z</published>
	<updated>2009-11-09T16:31:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">Allow null in LinkImpl.addParameter
&lt;br&gt;-----------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Key: TAP5-922
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-922&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-922&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Project: Tapestry 5
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Issue Type: Bug
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Components: tapestry-core
&lt;br&gt;&amp;nbsp; &amp;nbsp; Affects Versions: 5.1.0.5
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Reporter: Angelo Chen
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Priority: Minor
&lt;br&gt;&lt;br&gt;&lt;br&gt;I have a query string that I need to append to a &amp;nbsp;Link object, the query string is:
&lt;br&gt;&lt;br&gt;?gender=M&amp;country=
&lt;br&gt;&lt;br&gt;&amp;nbsp;Link lnk = renderLinkSource.createPageRenderLink(&amp;quot;SamplePage&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp;lnk.addParameter(&amp;quot;gender&amp;quot;, &amp;quot;M&amp;quot;);		// this works
&lt;br&gt;&amp;nbsp;
&lt;br&gt;lnk.addParameter(&amp;quot;country&amp;quot;, null);		
&lt;br&gt;&lt;br&gt;above line failed with :
&lt;br&gt;&lt;br&gt;&amp;nbsp;RequestExceptionHandler Unexpected runtime exception: Parameter value was null or contained only whitespace.
&lt;br&gt;&lt;br&gt;A null parameter should be valid in a URL, sometimes it is needed to have Google Analytics pick up the complete URL even it is null.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-922%29-Allow-null-in-LinkImpl.addParameter-tp26276309p26276309.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26272353</id>
	<title>[jira] Commented: (TAP5-815) Asset dispatcher allows any file inside the webapp visible and downloadable</title>
	<published>2009-11-09T11:35:32Z</published>
	<updated>2009-11-09T11:35:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; [ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-815?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12775085#action_12775085&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-815?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12775085#action_12775085&lt;/a&gt;&amp;nbsp;] 
&lt;br&gt;&lt;br&gt;Robert Zeigler commented on TAP5-815:
&lt;br&gt;-------------------------------------
&lt;br&gt;&lt;br&gt;Hey Chris,
&lt;br&gt;&lt;br&gt;I just committed the AssetProtectionDispatcher stuff (to 5.0 and 5.1 branches and to trunk). &amp;nbsp;That should solve your issue, but if you want to double check that, it would be great.
&lt;br&gt;Leaving this issue open for the time being to give people a chance to review. &amp;nbsp;I'll close it tonight or tomorrow if I don't hear anything more.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Asset dispatcher allows any file inside the webapp visible and downloadable
&lt;br&gt;&amp;gt; ---------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-815
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-815&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-815&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Thiago H. de Paula Figueiredo
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Robert Zeigler
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Priority: Blocker
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Take any asset and you have an URL like domain.com/assets/ctx/f10407a6c1753e39/css/main.css. If you request domain.com/assets/ctx/f10407a6c1753e39/, a list containing all the files inside the webapp root is shown. It gives you the hint at downloading any file you want, including anyting inside WEB-INF and assets that should be protected by ResourceDigestGenerator.
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-815%29-Asset-dispatcher-allows-any-file-inside-the-webapp-visible-and-downloadable-tp24984184p26272353.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26272250</id>
	<title>svn commit: r834180 - in /tapestry/tapestry5/branches/5.0: src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache/tapestr...</title>
	<published>2009-11-09T11:28:33Z</published>
	<updated>2009-11-09T11:28:33Z</updated>
	<author>
		<name>robertdzeigler</name>
	</author>
	<content type="html">Author: robertdzeigler
&lt;br&gt;Date: Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;New Revision: 834180
&lt;br&gt;&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834180&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834180&amp;view=rev&lt;/a&gt;&lt;br&gt;Log:
&lt;br&gt;TAP5-815: Asset dispatcher allows any file inside the webapp visible and downloadable (5.0 branch)
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/src/site/apt/guide/assets.apt
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/branches/5.0/src/site/apt/guide/assets.apt
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/src/site/apt/guide/assets.apt?rev=834180&amp;r1=834179&amp;r2=834180&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/src/site/apt/guide/assets.apt?rev=834180&amp;r1=834179&amp;r2=834180&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/src/site/apt/guide/assets.apt (original)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/src/site/apt/guide/assets.apt Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -98,4 +98,28 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;Care should be taken to not create overlapping mappings, as the results would not be predictable. &amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;
&lt;br&gt;\ No newline at end of file
&lt;br&gt;+Securing Assets
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;Securing assets is an important consideration for any web application. &amp;nbsp;Many assets, such as hibernate configuration
&lt;br&gt;+ &amp;nbsp;files, sit in the classpath and are exposable via the Asset service, which is not desirable. &amp;nbsp;To protect these and
&lt;br&gt;+ &amp;nbsp;other sensitive assets, Tapestry provides the AssetProtectionDispatcher. &amp;nbsp;This dispatcher sits in front of the
&lt;br&gt;+ &amp;nbsp;AssetDispatcher, the service responsible for streaming assets to the client, and watches for Asset requests.
&lt;br&gt;+ &amp;nbsp;When an asset request comes in, the protection dispatcher checks for authorization to view the file against a
&lt;br&gt;+ &amp;nbsp;contributed list of AssetPathAuthorizer implementations. &amp;nbsp;Determination of whether the client can view the requested
&lt;br&gt;+ &amp;nbsp;resource is then made based on whether any of the contributed AssetPathAuthorizer implementations explicitly allowed
&lt;br&gt;+ &amp;nbsp;or denied access to the resource.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;Tapestry provides two AssetPathAuthorizer implemenations &amp;quot;out of the box&amp;quot; to which users may contribute: RegexAuthorizer
&lt;br&gt;+ &amp;nbsp;and WhitelistAuthorizer. &amp;nbsp;RegexAuthorizer uses regular expressions to determine assets which are viewable by the
&lt;br&gt;+ &amp;nbsp;client; any assets that match one of its (contributed) regular expressions are authorized. Anything not matched is
&lt;br&gt;+ &amp;nbsp;passed through to the WhitelistAuthorizer. &amp;nbsp;WhitelistAuthorizer uses an exact-matching whitelist. &amp;nbsp;Anything matching
&lt;br&gt;+ &amp;nbsp;exactly one its contributions is allowed; all other asset requests are denied. &amp;nbsp;The default tapestry configuration
&lt;br&gt;+ &amp;nbsp;contributes nothing to WhitelistAuthorizer (access will be denied to all asset requests passed through to it), and
&lt;br&gt;+ &amp;nbsp;explicitly allows access to css, jpg, jpeg, js, png, and gif files associated with tapestry (tapestry.js, blackbird
&lt;br&gt;+ &amp;nbsp;files, date picker files, etc.). &amp;nbsp;The default contribution also enables access to the css, jpg, jpeg, js, png, and gif
&lt;br&gt;+ &amp;nbsp;files provided by the popular chenille-kit 3rd party library. The default configuration denies access to all other
&lt;br&gt;+ &amp;nbsp;assets. &amp;nbsp;To enable access to your application's assets, either contribute a custom AssetPathAnalyzer, or contribute
&lt;br&gt;+ &amp;nbsp;appropriate regular expression or exact path contributions to RegexAuthorizer or WhitelistAuthorizer, respectively.
&lt;br&gt;+ &amp;nbsp;See TapestryModule.contribteRegexAuthorizer for examples.
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,92 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import javax.servlet.http.HttpServletResponse;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.internal.services.RequestConstants;
&lt;br&gt;+import org.apache.tapestry5.services.*;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Dispatcher that handles whether to allow or deny access to particular 
&lt;br&gt;+ * assets. Actual work of authorizing a particular url is handled by
&lt;br&gt;+ * implementations of AssetPathAuthorizer. Configuration is an ordered
&lt;br&gt;+ * list of AssetPathAuthorizers. &amp;nbsp;Each authorizer specifies an order of
&lt;br&gt;+ * operations as a list (see AssetPathAuthorizer.Order).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+public class AssetProtectionDispatcher implements Dispatcher
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Collection&amp;lt;AssetPathAuthorizer&amp;gt; authorizers;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ClasspathAssetAliasManager assetAliasManager;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Logger logger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AssetProtectionDispatcher(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClasspathAssetAliasManager manager,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.authorizers = Collections.unmodifiableList(auths);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.assetAliasManager = manager;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.logger = logger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean dispatch(Request request, Response response)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String path = request.getPath();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//we only protect assets, and don't examine any other url's.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!path.startsWith(RequestConstants.ASSET_PATH_PREFIX))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String resourcePath = assetAliasManager.toResourcePath(path);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(AssetPathAuthorizer auth : authorizers)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(AssetPathAuthorizer.Order o : auth.order())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (o == AssetPathAuthorizer.Order.ALLOW)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (auth.accessAllowed(resourcePath))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Allowing access to &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (auth.accessDenied(resourcePath))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Denying access to &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.sendError(HttpServletResponse.SC_FORBIDDEN,resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if we get here, no Authorizer had anything useful to say about the resourcePath.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//so let it fall through.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Fell through the list of authorizers. Allowing access to: &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.regex.Pattern;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Provides a regex-based authorization scheme for asset-access authorization.
&lt;br&gt;+ * Note that this implementation doesn't actually deny access to anything.
&lt;br&gt;+ * But it's placement within the chain of command of authorizers is just before
&lt;br&gt;+ * the whitelist authorizer, which has an explicit deny policy.
&lt;br&gt;+ * Hence, as long as the whitelist authorizer is being used in conjunction with
&lt;br&gt;+ * the regex authorizer, there is no need to worry about accessDenied in this authorizer.
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+public class RegexAuthorizer implements AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Collection&amp;lt;Pattern&amp;gt; _regexes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public RegexAuthorizer(final Collection&amp;lt;String&amp;gt; regex)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//an alternate way to construct this would be to make sure that each pattern is grouped
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//and then to regex or the various patterns together into a single pattern.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//that might be faster, but probably not enough to make a difference, and this is cleaner.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;Pattern&amp;gt; tmp = new ArrayList&amp;lt;Pattern&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String exp : regex)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp.add(Pattern.compile(exp));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_regexes = Collections.unmodifiableCollection(tmp);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessAllowed(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(Pattern regex : _regexes)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (regex.matcher(resourcePath).matches())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessDenied(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;Order&amp;gt; order() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(Order.ALLOW);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,59 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.Map;
&lt;br&gt;+import java.util.concurrent.ConcurrentHashMap;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * AssetPathAuthorizer that determines access rights based on exact matching to a contributed whitelist. 
&lt;br&gt;+ * Any resource not explicitly specified in the whitelist is denied access.
&lt;br&gt;+ */
&lt;br&gt;+public class WhitelistAuthorizer implements AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;Order&amp;gt; order()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(Order.ALLOW, Order.DENY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;//hash the resource paths for fast lookups.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Map&amp;lt;String, Boolean&amp;gt; _paths;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public WhitelistAuthorizer(Collection&amp;lt;String&amp;gt; paths)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_paths = new ConcurrentHashMap&amp;lt;String, Boolean&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String path : paths)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_paths.put(path, true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessAllowed(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (_paths.containsKey(resourcePath));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessDenied(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return !_paths.containsKey(resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Determines whether access to an asset is allowed, denied, or undetermined.
&lt;br&gt;+ * Each contributed authorizer makes up part of a chain of command for determining access.
&lt;br&gt;+ * Access is explicitly allowed if accessAllowed returns true.
&lt;br&gt;+ * Access is explicitly denied if accessDenied returns true.
&lt;br&gt;+ * Ordering depends on the order specified by the &amp;quot;order&amp;quot; parameter.
&lt;br&gt;+ * Hence, an implementation which specifies an order of:
&lt;br&gt;+ * ALLOW, DENY, and returns true from both accessAllowed and accessDenied
&lt;br&gt;+ * will allow access for all resources. With the same return values for the
&lt;br&gt;+ * access* methods but the order switched to DENY, ALLOW, access to all resources
&lt;br&gt;+ * would be denied. &amp;nbsp;It is possible for an authorizer to have &amp;quot;nothing 
&lt;br&gt;+ * to say&amp;quot; regarding a particular resource. &amp;nbsp;If accessAllowed returns false,
&lt;br&gt;+ * it does not mean that access is denied, merely that it is not explicitly allowed.
&lt;br&gt;+ * If accessDenied returns false, it does not mean that access is allowed, merely that
&lt;br&gt;+ * it is not explicitly denied. &amp;nbsp;Hence, if both accessAllowed and accessDenied return false,
&lt;br&gt;+ * control will pass to the next authorizer in the chain.
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+public interface AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Types of orderings, either ALLOW or DENY.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;enum Order {ALLOW, DENY;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Specify the ordering for this authorizer.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the operations for this authorizer. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Operations will be performed in the order returned by the iterator.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * It is assumed that the authorizer correctly implements each form of
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * ordering returned. It is acceptable to only return only ALLOW or DENY.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;List&amp;lt;Order&amp;gt; order();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Determines whether a request to &amp;quot;resourcePath&amp;quot; is allowed. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param resourcePath
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return true if access is explicitly allowed for the path. False otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * For example, a whitelist implementation would return true if the resource
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * was listed, and false otherwise. &amp;nbsp;A blacklist implementation would return
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * false regardless of whether the path was in the blacklist.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Alternatively, if the blacklist specified an order of DENY, ALLOW, it could
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * return true from accessAllowed if the resource was not explicitly listed in its
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * blacklist.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;boolean accessAllowed(String resourcePath);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param resourcePath
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return true if access is explicitly prohibited for the path. False otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * For example, a whitelist implementation would return true if the resource was
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * not explicitly listed, and false otherwise. A blacklist implementation would 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * return true if the resource was explicitly denied, and false otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;boolean accessDenied(String resourcePath);
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=834180&amp;r1=834179&amp;r2=834180&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=834180&amp;r1=834179&amp;r2=834180&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -191,6 +191,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;NullFieldStrategyBindingFactory&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(URLEncoder.class, URLEncoderImpl.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(ContextPathEncoder.class, ContextPathEncoderImpl.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(Dispatcher.class, AssetProtectionDispatcher.class).withId(&amp;quot;AssetProtectionDispatcher&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(AssetPathAuthorizer.class, WhitelistAuthorizer.class).withId(&amp;quot;WhitelistAuthorizer&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(AssetPathAuthorizer.class, RegexAuthorizer.class).withId(&amp;quot;RegexAuthorizer&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// ========================================================================
&lt;br&gt;@@ -1385,6 +1388,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * and forwards onto the {@link ComponentEventRequestHandler}&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void contributeMasterDispatcher(OrderedConfiguration&amp;lt;Dispatcher&amp;gt; configuration,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @InjectService(&amp;quot;AssetProtectionDispatcher&amp;quot;) Dispatcher assetProt,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ObjectLocator locator)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Looks for the root path and renders the start page. This is maintained for compatibility
&lt;br&gt;@@ -1394,6 +1398,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locator.autobuild(RootPathDispatcher.class),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;before:Asset&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//this goes before asset to make sure that only allowed assets are streamed to the client.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;AssetProtection&amp;quot;, assetProt, &amp;quot;before:Asset&amp;quot;);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// This goes first because an asset to be streamed may have an file extension, such as
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;quot;.html&amp;quot;, that will confuse the later dispatchers.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -2157,4 +2164,38 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return service;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Contributes the default set of AssetPathAuthorizers into the AssetProtectionDispatcher.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param whitelist authorization based on explicit whitelisting.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param regex authorization based on pattern matching.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param conf
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeAssetProtectionDispatcher(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;WhitelistAuthorizer&amp;quot;) AssetPathAuthorizer whitelist,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;RegexAuthorizer&amp;quot;) AssetPathAuthorizer regex,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OrderedConfiguration&amp;lt;AssetPathAuthorizer&amp;gt; conf)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//putting whitelist after everything ensures that, in fact, nothing falls through.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//also ensures that whitelist gives other authorizers the chance to act...
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;conf.add(&amp;quot;regex&amp;quot;,regex,&amp;quot;before:whitelist&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;conf.add(&amp;quot;whitelist&amp;quot;, whitelist,&amp;quot;after:*&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void contributeRegexAuthorizer(Configuration&amp;lt;String&amp;gt; regex,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.scriptaculous.path&amp;quot;) String scriptPath,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.datepicker.path&amp;quot;) String datepickerPath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//allow any js, jpg, jpeg, png, or css under org/chenillekit/tapstry. The funky bit of ([^/.]+/)* is what allows
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//multiple paths, while not allowing any of those paths to contains ./ or ../ thereby preventing paths like:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//org/chenillekit/tapestry/../../../foo.js
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String pathPattern = &amp;quot;([^/.]+/)*[^/.]+\\.((css)|(js)|(jpg)|(jpeg)|(png)|(gif))$&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;^org/chenillekit/tapestry/&amp;quot; + pathPattern);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;^org/apache/tapestry5/&amp;quot; + pathPattern);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(datepickerPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(scriptPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java?rev=834180&amp;r1=834179&amp;r2=834180&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java?rev=834180&amp;r1=834179&amp;r2=834180&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -238,4 +238,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;ReverseStringsWorker&amp;quot;, new ReverseStringsWorker());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeRegexAuthorizer(Configuration&amp;lt;String&amp;gt; configuration) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//use this rather than a blanket regex (^.*.jpg$, etc.); want to be sure that tests pass from the default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//configuration setup, (eg: this way, I realized that the &amp;quot;virtual&amp;quot; assets folder
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//needed to be opened up in the tapestry-provided contributions) rather than from some blanket configuration in the appmodule
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//opening up all css, js, etc. files.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//would contribute to whitelist except that the resource path between ctxt and the rest of the path can change.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/css/app\\.css$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/style\\.css$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/bg\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/header\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/rightsmall\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/rightbig\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/bottom\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/footer\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/images/tapestry_banner\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/images/asf_logo_wide\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,92 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import static org.easymock.EasyMock.createMock;
&lt;br&gt;+import static org.easymock.EasyMock.expect;
&lt;br&gt;+import static org.easymock.EasyMock.*;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import javax.servlet.http.HttpServletResponse;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.internal.services.RequestConstants;
&lt;br&gt;+import org.apache.tapestry5.internal.services.AssetProtectionDispatcher;
&lt;br&gt;+import org.apache.tapestry5.services.ClasspathAssetAliasManager;
&lt;br&gt;+import org.apache.tapestry5.services.Request;
&lt;br&gt;+import org.apache.tapestry5.services.Response;
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;+
&lt;br&gt;+public class AssetProtectionDispatcherTest extends Assert
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void ignores_nonassets() throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//shouldn't need any configuration here...
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths = Collections.emptyList();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger = createMock(Logger.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetProtectionDispatcher disp = new AssetProtectionDispatcher(auths,null,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request request = createMock(Request.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(&amp;quot;start&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Response response = createMock(Response.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replay(request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(disp.dispatch(request, response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verify(request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void checks_authorizers() throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger = createMock(Logger.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths = new ArrayList&amp;lt;AssetPathAuthorizer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetPathAuthorizer auth = createMock(AssetPathAuthorizer.class);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.order()).andReturn(Arrays.asList(AssetPathAuthorizer.Order.ALLOW, AssetPathAuthorizer.Order.DENY)).times(2);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessAllowed(&amp;quot;/cayenne.xml&amp;quot;)).andReturn(false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessDenied(&amp;quot;/cayenne.xml&amp;quot;)).andReturn(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessAllowed(&amp;quot;/org/apache/tapestry/default.css&amp;quot;)).andReturn(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;auths.add(auth);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Denying access to /cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Allowing access to /org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request request = createMock(Request.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Response response = createMock(Response.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.sendError(HttpServletResponse.SC_FORBIDDEN, &amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClasspathAssetAliasManager manager = createMock(ClasspathAssetAliasManager.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(manager.toResourcePath(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/cayenne.xml&amp;quot;)).andReturn(&amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(manager.toResourcePath(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/org/apache/tapestry/default.css&amp;quot;))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.andReturn(&amp;quot;/org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replay(auth,request,response,manager,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetProtectionDispatcher disp = new AssetProtectionDispatcher(auths,manager,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(disp.dispatch(request,response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(disp.dispatch(request, response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verify(auth,request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,53 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.apache.tapestry5.internal.services.RegexAuthorizer;
&lt;br&gt;+
&lt;br&gt;+public class RegexAuthorizerTest extends Assert
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void test_regexes()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;String&amp;gt; patterns = Arrays.asList(&amp;quot;^.*\\.png$&amp;quot;,&amp;quot;^.*\\.jpg&amp;quot;,&amp;quot;^.*\\.jpeg&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegexAuthorizer auth = new RegexAuthorizer(patterns);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String pkg = &amp;quot;assets/com/saiwaisolutions/resources/&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String png = pkg + &amp;quot;foo.png&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String jpg = pkg + &amp;quot;foo.jpg&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String jpeg = pkg + &amp;quot;foo.jpeg&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String xml = pkg + &amp;quot;foo.xml&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,png,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,jpg,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,jpeg,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,xml,false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static void test(RegexAuthorizer auth, String one,boolean allowed)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.accessAllowed(one),allowed);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;auth.accessAllowed(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&lt;a href=&quot;http://localhost:8080&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080&lt;/a&gt;&amp;quot; + one),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;allowed);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(one));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(&amp;quot;&lt;a href=&quot;http://localhost:8080&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080&lt;/a&gt;&amp;quot; + one));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java?rev=834180&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java?rev=834180&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.0/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java Mon Nov &amp;nbsp;9 19:28:32 2009
&lt;br&gt;@@ -0,0 +1,45 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * Created on Jul 28, 2007
&lt;br&gt;+ * 
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.apache.tapestry5.internal.services.WhitelistAuthorizer;
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+public class WhitelistAuthorizerTest extends Assert {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void run()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WhitelistAuthorizer auth = new WhitelistAuthorizer(Arrays.asList(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().get(0), AssetPathAuthorizer.Order.ALLOW);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().get(1), AssetPathAuthorizer.Order.DENY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().size(),2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(auth.accessAllowed(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessAllowed(&amp;quot;bar&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(auth.accessDenied(&amp;quot;bar&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/svn-commit%3A-r834180---in--tapestry-tapestry5-branches-5.0%3A-src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services--tapestry-core-src-main-java-org-apache-tapestry5-services--tapestry-core-src-test-java-org-apache-tapestr...-tp26272250p26272250.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26271292</id>
	<title>svn commit: r834167 - in /tapestry/tapestry5/branches/5.1.0.x-dev: src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache...</title>
	<published>2009-11-09T10:26:49Z</published>
	<updated>2009-11-09T10:26:49Z</updated>
	<author>
		<name>robertdzeigler</name>
	</author>
	<content type="html">Author: robertdzeigler
&lt;br&gt;Date: Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;New Revision: 834167
&lt;br&gt;&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834167&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834167&amp;view=rev&lt;/a&gt;&lt;br&gt;Log:
&lt;br&gt;TAP5-815: Asset dispatcher allows any file inside the webapp visible and downloadable (5.1 branch)
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/src/site/apt/guide/assets.apt
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/branches/5.1.0.x-dev/src/site/apt/guide/assets.apt
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/src/site/apt/guide/assets.apt?rev=834167&amp;r1=834166&amp;r2=834167&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/src/site/apt/guide/assets.apt?rev=834167&amp;r1=834166&amp;r2=834167&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/src/site/apt/guide/assets.apt (original)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/src/site/apt/guide/assets.apt Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -138,6 +138,31 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;In addition, context assets will use the URL prefix &amp;lt;&amp;lt;&amp;lt;/assets/ctx/&amp;gt;&amp;gt;&amp;gt;&amp;lt;app-version&amp;gt;&amp;lt;&amp;lt;&amp;lt;/&amp;gt;&amp;gt;&amp;gt;.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+Securing Assets
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;Securing assets is an important consideration for any web application. &amp;nbsp;Many assets, such as hibernate configuration
&lt;br&gt;+ &amp;nbsp;files, sit in the classpath and are exposable via the Asset service, which is not desirable. &amp;nbsp;To protect these and
&lt;br&gt;+ &amp;nbsp;other sensitive assets, Tapestry provides the AssetProtectionDispatcher. &amp;nbsp;This dispatcher sits in front of the
&lt;br&gt;+ &amp;nbsp;AssetDispatcher, the service responsible for streaming assets to the client, and watches for Asset requests.
&lt;br&gt;+ &amp;nbsp;When an asset request comes in, the protection dispatcher checks for authorization to view the file against a
&lt;br&gt;+ &amp;nbsp;contributed list of AssetPathAuthorizer implementations. &amp;nbsp;Determination of whether the client can view the requested
&lt;br&gt;+ &amp;nbsp;resource is then made based on whether any of the contributed AssetPathAuthorizer implementations explicitly allowed
&lt;br&gt;+ &amp;nbsp;or denied access to the resource.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;Tapestry provides two AssetPathAuthorizer implemenations &amp;quot;out of the box&amp;quot; to which users may contribute: RegexAuthorizer
&lt;br&gt;+ &amp;nbsp;and WhitelistAuthorizer. &amp;nbsp;RegexAuthorizer uses regular expressions to determine assets which are viewable by the
&lt;br&gt;+ &amp;nbsp;client; any assets that match one of its (contributed) regular expressions are authorized. Anything not matched is
&lt;br&gt;+ &amp;nbsp;passed through to the WhitelistAuthorizer. &amp;nbsp;WhitelistAuthorizer uses an exact-matching whitelist. &amp;nbsp;Anything matching
&lt;br&gt;+ &amp;nbsp;exactly one its contributions is allowed; all other asset requests are denied. &amp;nbsp;The default tapestry configuration
&lt;br&gt;+ &amp;nbsp;contributes nothing to WhitelistAuthorizer (access will be denied to all asset requests passed through to it), and
&lt;br&gt;+ &amp;nbsp;explicitly allows access to css, jpg, jpeg, js, png, and gif files associated with tapestry (tapestry.js, blackbird
&lt;br&gt;+ &amp;nbsp;files, date picker files, etc.). &amp;nbsp;The default contribution also enables access to the css, jpg, jpeg, js, png, and gif
&lt;br&gt;+ &amp;nbsp;files provided by the popular chenille-kit 3rd party library. The default configuration denies access to all other
&lt;br&gt;+ &amp;nbsp;assets. &amp;nbsp;To enable access to your application's assets, either contribute a custom AssetPathAnalyzer, or contribute
&lt;br&gt;+ &amp;nbsp;appropriate regular expression or exact path contributions to RegexAuthorizer or WhitelistAuthorizer, respectively.
&lt;br&gt;+ &amp;nbsp;See TapestryModule.contribteRegexAuthorizer for examples.
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;Performance Notes
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;Assets are expected to be entirely static (not changing while the application is deployed). When Tapestry generates a URL
&lt;br&gt;@@ -146,4 +171,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;asset.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;In addition, Tapestry will {{{compress.html}GZIP compress}} the content of &amp;lt;all&amp;gt; assets (if the asset
&lt;br&gt;- &amp;nbsp;is compressable, and the client supports it).
&lt;br&gt;\ No newline at end of file
&lt;br&gt;+ &amp;nbsp;is compressable, and the client supports it).
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,92 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import javax.servlet.http.HttpServletResponse;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.internal.services.RequestConstants;
&lt;br&gt;+import org.apache.tapestry5.services.*;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Dispatcher that handles whether to allow or deny access to particular 
&lt;br&gt;+ * assets. Actual work of authorizing a particular url is handled by
&lt;br&gt;+ * implementations of AssetPathAuthorizer. Configuration is an ordered
&lt;br&gt;+ * list of AssetPathAuthorizers. &amp;nbsp;Each authorizer specifies an order of
&lt;br&gt;+ * operations as a list (see AssetPathAuthorizer.Order).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+public class AssetProtectionDispatcher implements Dispatcher
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Collection&amp;lt;AssetPathAuthorizer&amp;gt; authorizers;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ClasspathAssetAliasManager assetAliasManager;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Logger logger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AssetProtectionDispatcher(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClasspathAssetAliasManager manager,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.authorizers = Collections.unmodifiableList(auths);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.assetAliasManager = manager;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.logger = logger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean dispatch(Request request, Response response)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String path = request.getPath();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//we only protect assets, and don't examine any other url's.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!path.startsWith(RequestConstants.ASSET_PATH_PREFIX))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String resourcePath = assetAliasManager.toResourcePath(path);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(AssetPathAuthorizer auth : authorizers)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(AssetPathAuthorizer.Order o : auth.order())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (o == AssetPathAuthorizer.Order.ALLOW)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (auth.accessAllowed(resourcePath))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Allowing access to &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (auth.accessDenied(resourcePath))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Denying access to &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.sendError(HttpServletResponse.SC_FORBIDDEN,resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if we get here, no Authorizer had anything useful to say about the resourcePath.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//so let it fall through.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Fell through the list of authorizers. Allowing access to: &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.regex.Pattern;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Provides a regex-based authorization scheme for asset-access authorization.
&lt;br&gt;+ * Note that this implementation doesn't actually deny access to anything.
&lt;br&gt;+ * But it's placement within the chain of command of authorizers is just before
&lt;br&gt;+ * the whitelist authorizer, which has an explicit deny policy.
&lt;br&gt;+ * Hence, as long as the whitelist authorizer is being used in conjunction with
&lt;br&gt;+ * the regex authorizer, there is no need to worry about accessDenied in this authorizer.
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+public class RegexAuthorizer implements AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Collection&amp;lt;Pattern&amp;gt; _regexes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public RegexAuthorizer(final Collection&amp;lt;String&amp;gt; regex)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//an alternate way to construct this would be to make sure that each pattern is grouped
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//and then to regex or the various patterns together into a single pattern.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//that might be faster, but probably not enough to make a difference, and this is cleaner.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;Pattern&amp;gt; tmp = new ArrayList&amp;lt;Pattern&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String exp : regex)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp.add(Pattern.compile(exp));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_regexes = Collections.unmodifiableCollection(tmp);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessAllowed(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(Pattern regex : _regexes)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (regex.matcher(resourcePath).matches())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessDenied(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;Order&amp;gt; order() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(Order.ALLOW);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,59 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.Map;
&lt;br&gt;+import java.util.concurrent.ConcurrentHashMap;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * AssetPathAuthorizer that determines access rights based on exact matching to a contributed whitelist. 
&lt;br&gt;+ * Any resource not explicitly specified in the whitelist is denied access.
&lt;br&gt;+ */
&lt;br&gt;+public class WhitelistAuthorizer implements AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;Order&amp;gt; order()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(Order.ALLOW, Order.DENY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;//hash the resource paths for fast lookups.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Map&amp;lt;String, Boolean&amp;gt; _paths;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public WhitelistAuthorizer(Collection&amp;lt;String&amp;gt; paths)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_paths = new ConcurrentHashMap&amp;lt;String, Boolean&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String path : paths)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_paths.put(path, true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessAllowed(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (_paths.containsKey(resourcePath));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessDenied(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return !_paths.containsKey(resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Determines whether access to an asset is allowed, denied, or undetermined.
&lt;br&gt;+ * Each contributed authorizer makes up part of a chain of command for determining access.
&lt;br&gt;+ * Access is explicitly allowed if accessAllowed returns true.
&lt;br&gt;+ * Access is explicitly denied if accessDenied returns true.
&lt;br&gt;+ * Ordering depends on the order specified by the &amp;quot;order&amp;quot; parameter.
&lt;br&gt;+ * Hence, an implementation which specifies an order of:
&lt;br&gt;+ * ALLOW, DENY, and returns true from both accessAllowed and accessDenied
&lt;br&gt;+ * will allow access for all resources. With the same return values for the
&lt;br&gt;+ * access* methods but the order switched to DENY, ALLOW, access to all resources
&lt;br&gt;+ * would be denied. &amp;nbsp;It is possible for an authorizer to have &amp;quot;nothing 
&lt;br&gt;+ * to say&amp;quot; regarding a particular resource. &amp;nbsp;If accessAllowed returns false,
&lt;br&gt;+ * it does not mean that access is denied, merely that it is not explicitly allowed.
&lt;br&gt;+ * If accessDenied returns false, it does not mean that access is allowed, merely that
&lt;br&gt;+ * it is not explicitly denied. &amp;nbsp;Hence, if both accessAllowed and accessDenied return false,
&lt;br&gt;+ * control will pass to the next authorizer in the chain.
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+public interface AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Types of orderings, either ALLOW or DENY.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;enum Order {ALLOW, DENY;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Specify the ordering for this authorizer.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the operations for this authorizer. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Operations will be performed in the order returned by the iterator.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * It is assumed that the authorizer correctly implements each form of
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * ordering returned. It is acceptable to only return only ALLOW or DENY.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;List&amp;lt;Order&amp;gt; order();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Determines whether a request to &amp;quot;resourcePath&amp;quot; is allowed. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param resourcePath
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return true if access is explicitly allowed for the path. False otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * For example, a whitelist implementation would return true if the resource
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * was listed, and false otherwise. &amp;nbsp;A blacklist implementation would return
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * false regardless of whether the path was in the blacklist.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Alternatively, if the blacklist specified an order of DENY, ALLOW, it could
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * return true from accessAllowed if the resource was not explicitly listed in its
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * blacklist.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;boolean accessAllowed(String resourcePath);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param resourcePath
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return true if access is explicitly prohibited for the path. False otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * For example, a whitelist implementation would return true if the resource was
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * not explicitly listed, and false otherwise. A blacklist implementation would 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * return true if the resource was explicitly denied, and false otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;boolean accessDenied(String resourcePath);
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=834167&amp;r1=834166&amp;r2=834167&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=834167&amp;r1=834166&amp;r2=834167&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -303,6 +303,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(PageRenderLinkSource.class, PageRenderLinkSourceImpl.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(ClientInfrastructure.class, ClientInfrastructureImpl.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(URLRewriter.class, URLRewriterImpl.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(Dispatcher.class, AssetProtectionDispatcher.class).withId(&amp;quot;AssetProtectionDispatcher&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(AssetPathAuthorizer.class, WhitelistAuthorizer.class).withId(&amp;quot;WhitelistAuthorizer&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(AssetPathAuthorizer.class, RegexAuthorizer.class).withId(&amp;quot;RegexAuthorizer&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// ========================================================================
&lt;br&gt;@@ -1548,13 +1551,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * and forwards onto {@link PageRenderRequestHandler}&amp;lt;/dd&amp;gt; &amp;lt;dt&amp;gt;ComponentEvent&amp;lt;/dt&amp;gt; &amp;lt;dd&amp;gt;Identifies the {@link
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * ComponentEventRequestParameters} and forwards onto the {@link ComponentEventRequestHandler}&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void contributeMasterDispatcher(OrderedConfiguration&amp;lt;Dispatcher&amp;gt; configuration)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeMasterDispatcher(OrderedConfiguration&amp;lt;Dispatcher&amp;gt; configuration,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;AssetProtectionDispatcher&amp;quot;) Dispatcher assetProt)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Looks for the root path and renders the start page. This is maintained for compatibility
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// with earlier versions of Tapestry 5, it is recommended that an Index page be used instead.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.addInstance(&amp;quot;RootPath&amp;quot;, RootPathDispatcher.class, &amp;quot;before:Asset&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//this goes before asset to make sure that only allowed assets are streamed to the client.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;AssetProtection&amp;quot;, assetProt, &amp;quot;before:Asset&amp;quot;);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// This goes first because an asset to be streamed may have an file extension, such as
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;quot;.html&amp;quot;, that will confuse the later dispatchers.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -2405,4 +2412,41 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Contributes the default set of AssetPathAuthorizers into the AssetProtectionDispatcher.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param whitelist authorization based on explicit whitelisting.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param regex authorization based on pattern matching.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param conf
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeAssetProtectionDispatcher(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;WhitelistAuthorizer&amp;quot;) AssetPathAuthorizer whitelist,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;RegexAuthorizer&amp;quot;) AssetPathAuthorizer regex,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OrderedConfiguration&amp;lt;AssetPathAuthorizer&amp;gt; conf)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//putting whitelist after everything ensures that, in fact, nothing falls through.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//also ensures that whitelist gives other authorizers the chance to act...
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;conf.add(&amp;quot;regex&amp;quot;,regex,&amp;quot;before:whitelist&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;conf.add(&amp;quot;whitelist&amp;quot;, whitelist,&amp;quot;after:*&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void contributeRegexAuthorizer(Configuration&amp;lt;String&amp;gt; regex,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.scriptaculous.path&amp;quot;) String scriptPath,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.blackbird.path&amp;quot;) String blackbirdPath,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.datepicker.path&amp;quot;) String datepickerPath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//allow any js, jpg, jpeg, png, or css under org/chenillekit/tapstry. The funky bit of ([^/.]+/)* is what allows
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//multiple paths, while not allowing any of those paths to contains ./ or ../ thereby preventing paths like:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//org/chenillekit/tapestry/../../../foo.js
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String pathPattern = &amp;quot;([^/.]+/)*[^/.]+\\.((css)|(js)|(jpg)|(jpeg)|(png)|(gif))$&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;^org/chenillekit/tapestry/&amp;quot; + pathPattern);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;^org/apache/tapestry5/&amp;quot; + pathPattern);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(blackbirdPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(datepickerPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(scriptPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//allow access to virtual assets. Critical for tapestry-combined js files.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;virtual/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java?rev=834167&amp;r1=834166&amp;r2=834167&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java?rev=834167&amp;r1=834166&amp;r2=834167&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -255,4 +255,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;ReverseStringsWorker&amp;quot;, new ReverseStringsWorker());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeRegexAuthorizer(Configuration&amp;lt;String&amp;gt; configuration) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//use this rather than a blanket regex (^.*.jpg$, etc.); want to be sure that tests pass from the default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//configuration setup, (eg: this way, I realized that the &amp;quot;virtual&amp;quot; assets folder
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//needed to be opened up in the tapestry-provided contributions) rather than from some blanket configuration in the appmodule
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//opening up all css, js, etc. files.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//would contribute to whitelist except that the resource path between ctxt and the rest of the path can change.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/css/app\\.css$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/style\\.css$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/bg\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/header\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/rightsmall\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/rightbig\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/bottom\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/footer\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/images/tapestry_banner\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/images/asf_logo_wide\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,92 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import static org.easymock.EasyMock.createMock;
&lt;br&gt;+import static org.easymock.EasyMock.expect;
&lt;br&gt;+import static org.easymock.EasyMock.*;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import javax.servlet.http.HttpServletResponse;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.internal.services.RequestConstants;
&lt;br&gt;+import org.apache.tapestry5.internal.services.AssetProtectionDispatcher;
&lt;br&gt;+import org.apache.tapestry5.services.ClasspathAssetAliasManager;
&lt;br&gt;+import org.apache.tapestry5.services.Request;
&lt;br&gt;+import org.apache.tapestry5.services.Response;
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;+
&lt;br&gt;+public class AssetProtectionDispatcherTest extends Assert
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void ignores_nonassets() throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//shouldn't need any configuration here...
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths = Collections.emptyList();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger = createMock(Logger.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetProtectionDispatcher disp = new AssetProtectionDispatcher(auths,null,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request request = createMock(Request.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(&amp;quot;start&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Response response = createMock(Response.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replay(request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(disp.dispatch(request, response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verify(request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void checks_authorizers() throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger = createMock(Logger.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths = new ArrayList&amp;lt;AssetPathAuthorizer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetPathAuthorizer auth = createMock(AssetPathAuthorizer.class);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.order()).andReturn(Arrays.asList(AssetPathAuthorizer.Order.ALLOW, AssetPathAuthorizer.Order.DENY)).times(2);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessAllowed(&amp;quot;/cayenne.xml&amp;quot;)).andReturn(false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessDenied(&amp;quot;/cayenne.xml&amp;quot;)).andReturn(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessAllowed(&amp;quot;/org/apache/tapestry/default.css&amp;quot;)).andReturn(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;auths.add(auth);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Denying access to /cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Allowing access to /org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request request = createMock(Request.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Response response = createMock(Response.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.sendError(HttpServletResponse.SC_FORBIDDEN, &amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClasspathAssetAliasManager manager = createMock(ClasspathAssetAliasManager.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(manager.toResourcePath(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/cayenne.xml&amp;quot;)).andReturn(&amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(manager.toResourcePath(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/org/apache/tapestry/default.css&amp;quot;))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.andReturn(&amp;quot;/org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replay(auth,request,response,manager,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetProtectionDispatcher disp = new AssetProtectionDispatcher(auths,manager,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(disp.dispatch(request,response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(disp.dispatch(request, response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verify(auth,request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,53 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.apache.tapestry5.internal.services.RegexAuthorizer;
&lt;br&gt;+
&lt;br&gt;+public class RegexAuthorizerTest extends Assert
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void test_regexes()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;String&amp;gt; patterns = Arrays.asList(&amp;quot;^.*\\.png$&amp;quot;,&amp;quot;^.*\\.jpg&amp;quot;,&amp;quot;^.*\\.jpeg&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegexAuthorizer auth = new RegexAuthorizer(patterns);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String pkg = &amp;quot;assets/com/saiwaisolutions/resources/&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String png = pkg + &amp;quot;foo.png&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String jpg = pkg + &amp;quot;foo.jpg&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String jpeg = pkg + &amp;quot;foo.jpeg&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String xml = pkg + &amp;quot;foo.xml&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,png,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,jpg,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,jpeg,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,xml,false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static void test(RegexAuthorizer auth, String one,boolean allowed)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.accessAllowed(one),allowed);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;auth.accessAllowed(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&lt;a href=&quot;http://localhost:8080&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080&lt;/a&gt;&amp;quot; + one),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;allowed);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(one));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(&amp;quot;&lt;a href=&quot;http://localhost:8080&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080&lt;/a&gt;&amp;quot; + one));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java?rev=834167&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java?rev=834167&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/branches/5.1.0.x-dev/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java Mon Nov &amp;nbsp;9 18:26:48 2009
&lt;br&gt;@@ -0,0 +1,45 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * Created on Jul 28, 2007
&lt;br&gt;+ * 
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.apache.tapestry5.internal.services.WhitelistAuthorizer;
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+public class WhitelistAuthorizerTest extends Assert {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void run()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WhitelistAuthorizer auth = new WhitelistAuthorizer(Arrays.asList(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().get(0), AssetPathAuthorizer.Order.ALLOW);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().get(1), AssetPathAuthorizer.Order.DENY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().size(),2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(auth.accessAllowed(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessAllowed(&amp;quot;bar&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(auth.accessDenied(&amp;quot;bar&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/svn-commit%3A-r834167---in--tapestry-tapestry5-branches-5.1.0.x-dev%3A-src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services--tapestry-core-src-main-java-org-apache-tapestry5-services--tapestry-core-src-test-java-org-apache...-tp26271292p26271292.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26270226</id>
	<title>svn commit: r834151 - in /tapestry/tapestry5/trunk: src/site/apt/guide/ tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ tapestry-core/src/main/java/org/apache/tapestry5/services/ tapestry-core/src/test/java/org/apache/tapestry5/inte...</title>
	<published>2009-11-09T09:23:18Z</published>
	<updated>2009-11-09T09:23:18Z</updated>
	<author>
		<name>robertdzeigler</name>
	</author>
	<content type="html">Author: robertdzeigler
&lt;br&gt;Date: Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;New Revision: 834151
&lt;br&gt;&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=834151&amp;view=rev&lt;/a&gt;&lt;br&gt;Log:
&lt;br&gt;TAP5-815: Asset dispatcher allows any file inside the webapp visible and downloadable (5.2 branch)
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/src/site/apt/guide/assets.apt
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/src/site/apt/guide/assets.apt
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/src/site/apt/guide/assets.apt?rev=834151&amp;r1=834150&amp;r2=834151&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/src/site/apt/guide/assets.apt?rev=834151&amp;r1=834150&amp;r2=834151&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/src/site/apt/guide/assets.apt (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/src/site/apt/guide/assets.apt Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -138,6 +138,31 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;In addition, context assets will use the URL prefix &amp;lt;&amp;lt;&amp;lt;/assets/ctx/&amp;gt;&amp;gt;&amp;gt;&amp;lt;app-version&amp;gt;&amp;lt;&amp;lt;&amp;lt;/&amp;gt;&amp;gt;&amp;gt;.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+Securing Assets
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;Securing assets is an important consideration for any web application. &amp;nbsp;Many assets, such as hibernate configuration
&lt;br&gt;+ &amp;nbsp;files, sit in the classpath and are exposable via the Asset service, which is not desirable. &amp;nbsp;To protect these and
&lt;br&gt;+ &amp;nbsp;other sensitive assets, Tapestry provides the AssetProtectionDispatcher. &amp;nbsp;This dispatcher sits in front of the
&lt;br&gt;+ &amp;nbsp;AssetDispatcher, the service responsible for streaming assets to the client, and watches for Asset requests.
&lt;br&gt;+ &amp;nbsp;When an asset request comes in, the protection dispatcher checks for authorization to view the file against a
&lt;br&gt;+ &amp;nbsp;contributed list of AssetPathAuthorizer implementations. &amp;nbsp;Determination of whether the client can view the requested
&lt;br&gt;+ &amp;nbsp;resource is then made based on whether any of the contributed AssetPathAuthorizer implementations explicitly allowed
&lt;br&gt;+ &amp;nbsp;or denied access to the resource.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;Tapestry provides two AssetPathAuthorizer implemenations &amp;quot;out of the box&amp;quot; to which users may contribute: RegexAuthorizer
&lt;br&gt;+ &amp;nbsp;and WhitelistAuthorizer. &amp;nbsp;RegexAuthorizer uses regular expressions to determine assets which are viewable by the
&lt;br&gt;+ &amp;nbsp;client; any assets that match one of its (contributed) regular expressions are authorized. Anything not matched is
&lt;br&gt;+ &amp;nbsp;passed through to the WhitelistAuthorizer. &amp;nbsp;WhitelistAuthorizer uses an exact-matching whitelist. &amp;nbsp;Anything matching
&lt;br&gt;+ &amp;nbsp;exactly one its contributions is allowed; all other asset requests are denied. &amp;nbsp;The default tapestry configuration
&lt;br&gt;+ &amp;nbsp;contributes nothing to WhitelistAuthorizer (access will be denied to all asset requests passed through to it), and
&lt;br&gt;+ &amp;nbsp;explicitly allows access to css, jpg, jpeg, js, png, and gif files associated with tapestry (tapestry.js, blackbird
&lt;br&gt;+ &amp;nbsp;files, date picker files, etc.). &amp;nbsp;The default contribution also enables access to the css, jpg, jpeg, js, png, and gif
&lt;br&gt;+ &amp;nbsp;files provided by the popular chenille-kit 3rd party library. The default configuration denies access to all other
&lt;br&gt;+ &amp;nbsp;assets. &amp;nbsp;To enable access to your application's assets, either contribute a custom AssetPathAnalyzer, or contribute
&lt;br&gt;+ &amp;nbsp;appropriate regular expression or exact path contributions to RegexAuthorizer or WhitelistAuthorizer, respectively.
&lt;br&gt;+ &amp;nbsp;See TapestryModule.contribteRegexAuthorizer for examples.
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;Performance Notes
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;Assets are expected to be entirely static (not changing while the application is deployed). When Tapestry generates a URL
&lt;br&gt;@@ -146,4 +171,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;asset.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;In addition, Tapestry will {{{compress.html}GZIP compress}} the content of &amp;lt;all&amp;gt; assets (if the asset
&lt;br&gt;- &amp;nbsp;is compressable, and the client supports it).
&lt;br&gt;\ No newline at end of file
&lt;br&gt;+ &amp;nbsp;is compressable, and the client supports it).
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcher.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,92 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import javax.servlet.http.HttpServletResponse;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.internal.services.RequestConstants;
&lt;br&gt;+import org.apache.tapestry5.services.*;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Dispatcher that handles whether to allow or deny access to particular 
&lt;br&gt;+ * assets. Actual work of authorizing a particular url is handled by
&lt;br&gt;+ * implementations of AssetPathAuthorizer. Configuration is an ordered
&lt;br&gt;+ * list of AssetPathAuthorizers. &amp;nbsp;Each authorizer specifies an order of
&lt;br&gt;+ * operations as a list (see AssetPathAuthorizer.Order).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+public class AssetProtectionDispatcher implements Dispatcher
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Collection&amp;lt;AssetPathAuthorizer&amp;gt; authorizers;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ClasspathAssetAliasManager assetAliasManager;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Logger logger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AssetProtectionDispatcher(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClasspathAssetAliasManager manager,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.authorizers = Collections.unmodifiableList(auths);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.assetAliasManager = manager;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.logger = logger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean dispatch(Request request, Response response)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String path = request.getPath();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//we only protect assets, and don't examine any other url's.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!path.startsWith(RequestConstants.ASSET_PATH_PREFIX))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String resourcePath = assetAliasManager.toResourcePath(path);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(AssetPathAuthorizer auth : authorizers)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(AssetPathAuthorizer.Order o : auth.order())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (o == AssetPathAuthorizer.Order.ALLOW)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (auth.accessAllowed(resourcePath))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Allowing access to &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (auth.accessDenied(resourcePath))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Denying access to &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.sendError(HttpServletResponse.SC_FORBIDDEN,resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if we get here, no Authorizer had anything useful to say about the resourcePath.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//so let it fall through.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Fell through the list of authorizers. Allowing access to: &amp;quot; + resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RegexAuthorizer.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.regex.Pattern;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Provides a regex-based authorization scheme for asset-access authorization.
&lt;br&gt;+ * Note that this implementation doesn't actually deny access to anything.
&lt;br&gt;+ * But it's placement within the chain of command of authorizers is just before
&lt;br&gt;+ * the whitelist authorizer, which has an explicit deny policy.
&lt;br&gt;+ * Hence, as long as the whitelist authorizer is being used in conjunction with
&lt;br&gt;+ * the regex authorizer, there is no need to worry about accessDenied in this authorizer.
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+public class RegexAuthorizer implements AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Collection&amp;lt;Pattern&amp;gt; _regexes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public RegexAuthorizer(final Collection&amp;lt;String&amp;gt; regex)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//an alternate way to construct this would be to make sure that each pattern is grouped
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//and then to regex or the various patterns together into a single pattern.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//that might be faster, but probably not enough to make a difference, and this is cleaner.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;Pattern&amp;gt; tmp = new ArrayList&amp;lt;Pattern&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String exp : regex)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp.add(Pattern.compile(exp));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_regexes = Collections.unmodifiableCollection(tmp);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessAllowed(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(Pattern regex : _regexes)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (regex.matcher(resourcePath).matches())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessDenied(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;Order&amp;gt; order() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(Order.ALLOW);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/WhitelistAuthorizer.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,59 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.Map;
&lt;br&gt;+import java.util.concurrent.ConcurrentHashMap;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * AssetPathAuthorizer that determines access rights based on exact matching to a contributed whitelist. 
&lt;br&gt;+ * Any resource not explicitly specified in the whitelist is denied access.
&lt;br&gt;+ */
&lt;br&gt;+public class WhitelistAuthorizer implements AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;Order&amp;gt; order()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(Order.ALLOW, Order.DENY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;//hash the resource paths for fast lookups.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Map&amp;lt;String, Boolean&amp;gt; _paths;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public WhitelistAuthorizer(Collection&amp;lt;String&amp;gt; paths)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_paths = new ConcurrentHashMap&amp;lt;String, Boolean&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String path : paths)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_paths.put(path, true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessAllowed(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (_paths.containsKey(resourcePath));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean accessDenied(String resourcePath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return !_paths.containsKey(resourcePath);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetPathAuthorizer.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Determines whether access to an asset is allowed, denied, or undetermined.
&lt;br&gt;+ * Each contributed authorizer makes up part of a chain of command for determining access.
&lt;br&gt;+ * Access is explicitly allowed if accessAllowed returns true.
&lt;br&gt;+ * Access is explicitly denied if accessDenied returns true.
&lt;br&gt;+ * Ordering depends on the order specified by the &amp;quot;order&amp;quot; parameter.
&lt;br&gt;+ * Hence, an implementation which specifies an order of:
&lt;br&gt;+ * ALLOW, DENY, and returns true from both accessAllowed and accessDenied
&lt;br&gt;+ * will allow access for all resources. With the same return values for the
&lt;br&gt;+ * access* methods but the order switched to DENY, ALLOW, access to all resources
&lt;br&gt;+ * would be denied. &amp;nbsp;It is possible for an authorizer to have &amp;quot;nothing 
&lt;br&gt;+ * to say&amp;quot; regarding a particular resource. &amp;nbsp;If accessAllowed returns false,
&lt;br&gt;+ * it does not mean that access is denied, merely that it is not explicitly allowed.
&lt;br&gt;+ * If accessDenied returns false, it does not mean that access is allowed, merely that
&lt;br&gt;+ * it is not explicitly denied. &amp;nbsp;Hence, if both accessAllowed and accessDenied return false,
&lt;br&gt;+ * control will pass to the next authorizer in the chain.
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+public interface AssetPathAuthorizer
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Types of orderings, either ALLOW or DENY.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;enum Order {ALLOW, DENY;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Specify the ordering for this authorizer.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the operations for this authorizer. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Operations will be performed in the order returned by the iterator.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * It is assumed that the authorizer correctly implements each form of
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * ordering returned. It is acceptable to only return only ALLOW or DENY.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;List&amp;lt;Order&amp;gt; order();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Determines whether a request to &amp;quot;resourcePath&amp;quot; is allowed. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param resourcePath
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return true if access is explicitly allowed for the path. False otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * For example, a whitelist implementation would return true if the resource
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * was listed, and false otherwise. &amp;nbsp;A blacklist implementation would return
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * false regardless of whether the path was in the blacklist.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Alternatively, if the blacklist specified an order of DENY, ALLOW, it could
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * return true from accessAllowed if the resource was not explicitly listed in its
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * blacklist.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;boolean accessAllowed(String resourcePath);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param resourcePath
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return true if access is explicitly prohibited for the path. False otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * For example, a whitelist implementation would return true if the resource was
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * not explicitly listed, and false otherwise. A blacklist implementation would 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * return true if the resource was explicitly denied, and false otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;boolean accessDenied(String resourcePath);
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=834151&amp;r1=834150&amp;r2=834151&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=834151&amp;r1=834150&amp;r2=834151&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -305,6 +305,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(PageRenderLinkSource.class, PageRenderLinkSourceImpl.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(ClientInfrastructure.class, ClientInfrastructureImpl.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(URLRewriter.class, URLRewriterImpl.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(Dispatcher.class, AssetProtectionDispatcher.class).withId(&amp;quot;AssetProtectionDispatcher&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(AssetPathAuthorizer.class, WhitelistAuthorizer.class).withId(&amp;quot;WhitelistAuthorizer&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;binder.bind(AssetPathAuthorizer.class, RegexAuthorizer.class).withId(&amp;quot;RegexAuthorizer&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// ========================================================================
&lt;br&gt;@@ -1572,13 +1575,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * and forwards onto {@link PageRenderRequestHandler}&amp;lt;/dd&amp;gt; &amp;lt;dt&amp;gt;ComponentEvent&amp;lt;/dt&amp;gt; &amp;lt;dd&amp;gt;Identifies the {@link
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * ComponentEventRequestParameters} and forwards onto the {@link ComponentEventRequestHandler}&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void contributeMasterDispatcher(OrderedConfiguration&amp;lt;Dispatcher&amp;gt; configuration)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeMasterDispatcher(OrderedConfiguration&amp;lt;Dispatcher&amp;gt; configuration,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;AssetProtectionDispatcher&amp;quot;) Dispatcher assetProt)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Looks for the root path and renders the start page. This is maintained for compatibility
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// with earlier versions of Tapestry 5, it is recommended that an Index page be used instead.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.addInstance(&amp;quot;RootPath&amp;quot;, RootPathDispatcher.class, &amp;quot;before:Asset&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//this goes before asset to make sure that only allowed assets are streamed to the client.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;AssetProtection&amp;quot;, assetProt, &amp;quot;before:Asset&amp;quot;);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// This goes first because an asset to be streamed may have an file extension, such as
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;quot;.html&amp;quot;, that will confuse the later dispatchers.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -1591,6 +1598,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.addInstance(&amp;quot;PageRender&amp;quot;, PageRenderDispatcher.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Contributes a default object renderer for type Object, plus specialized renderers for {@link
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * org.apache.tapestry5.services.Request}, {@link org.apache.tapestry5.ioc.Location}, {@link
&lt;br&gt;@@ -2480,4 +2488,41 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Contributes the default set of AssetPathAuthorizers into the AssetProtectionDispatcher.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param whitelist authorization based on explicit whitelisting.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param regex authorization based on pattern matching.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param conf
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeAssetProtectionDispatcher(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;WhitelistAuthorizer&amp;quot;) AssetPathAuthorizer whitelist,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@InjectService(&amp;quot;RegexAuthorizer&amp;quot;) AssetPathAuthorizer regex,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OrderedConfiguration&amp;lt;AssetPathAuthorizer&amp;gt; conf)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//putting whitelist after everything ensures that, in fact, nothing falls through.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//also ensures that whitelist gives other authorizers the chance to act...
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;conf.add(&amp;quot;regex&amp;quot;,regex,&amp;quot;before:whitelist&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;conf.add(&amp;quot;whitelist&amp;quot;, whitelist,&amp;quot;after:*&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void contributeRegexAuthorizer(Configuration&amp;lt;String&amp;gt; regex,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.scriptaculous.path&amp;quot;) String scriptPath,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.blackbird.path&amp;quot;) String blackbirdPath,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Symbol(&amp;quot;tapestry.datepicker.path&amp;quot;) String datepickerPath)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//allow any js, jpg, jpeg, png, or css under org/chenillekit/tapstry. The funky bit of ([^/.]+/)* is what allows
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//multiple paths, while not allowing any of those paths to contains ./ or ../ thereby preventing paths like:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//org/chenillekit/tapestry/../../../foo.js
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String pathPattern = &amp;quot;([^/.]+/)*[^/.]+\\.((css)|(js)|(jpg)|(jpeg)|(png)|(gif))$&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;^org/chenillekit/tapestry/&amp;quot; + pathPattern);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;^org/apache/tapestry5/&amp;quot; + pathPattern);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(blackbirdPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(datepickerPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(scriptPath + &amp;quot;/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//allow access to virtual assets. Critical for tapestry-combined js files.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regex.add(&amp;quot;virtual/&amp;quot; + pathPattern);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java?rev=834151&amp;r1=834150&amp;r2=834151&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java?rev=834151&amp;r1=834150&amp;r2=834151&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -257,4 +257,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;ReverseStringsWorker&amp;quot;, new ReverseStringsWorker());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void contributeRegexAuthorizer(Configuration&amp;lt;String&amp;gt; configuration) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//use this rather than a blanket regex (^.*.jpg$, etc.); want to be sure that tests pass from the default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//configuration setup, (eg: this way, I realized that the &amp;quot;virtual&amp;quot; assets folder
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//needed to be opened up in the tapestry-provided contributions) rather than from some blanket configuration in the appmodule
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//opening up all css, js, etc. files.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//would contribute to whitelist except that the resource path between ctxt and the rest of the path can change.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/css/app\\.css$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/style\\.css$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/bg\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/header\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/rightsmall\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/rightbig\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/bottom\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/layout/images/footer\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/images/tapestry_banner\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;^ctx/[^/]+/images/asf_logo_wide\\.gif$&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AssetProtectionDispatcherTest.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,92 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import static org.easymock.EasyMock.createMock;
&lt;br&gt;+import static org.easymock.EasyMock.expect;
&lt;br&gt;+import static org.easymock.EasyMock.*;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import javax.servlet.http.HttpServletResponse;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.internal.services.RequestConstants;
&lt;br&gt;+import org.apache.tapestry5.internal.services.AssetProtectionDispatcher;
&lt;br&gt;+import org.apache.tapestry5.services.ClasspathAssetAliasManager;
&lt;br&gt;+import org.apache.tapestry5.services.Request;
&lt;br&gt;+import org.apache.tapestry5.services.Response;
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;+
&lt;br&gt;+public class AssetProtectionDispatcherTest extends Assert
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void ignores_nonassets() throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//shouldn't need any configuration here...
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths = Collections.emptyList();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger = createMock(Logger.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetProtectionDispatcher disp = new AssetProtectionDispatcher(auths,null,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request request = createMock(Request.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(&amp;quot;start&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Response response = createMock(Response.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replay(request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(disp.dispatch(request, response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verify(request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void checks_authorizers() throws IOException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger logger = createMock(Logger.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;AssetPathAuthorizer&amp;gt; auths = new ArrayList&amp;lt;AssetPathAuthorizer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetPathAuthorizer auth = createMock(AssetPathAuthorizer.class);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.order()).andReturn(Arrays.asList(AssetPathAuthorizer.Order.ALLOW, AssetPathAuthorizer.Order.DENY)).times(2);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessAllowed(&amp;quot;/cayenne.xml&amp;quot;)).andReturn(false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessDenied(&amp;quot;/cayenne.xml&amp;quot;)).andReturn(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(auth.accessAllowed(&amp;quot;/org/apache/tapestry/default.css&amp;quot;)).andReturn(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;auths.add(auth);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Denying access to /cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.debug(&amp;quot;Allowing access to /org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Request request = createMock(Request.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Response response = createMock(Response.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(request.getPath()).andReturn(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.sendError(HttpServletResponse.SC_FORBIDDEN, &amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClasspathAssetAliasManager manager = createMock(ClasspathAssetAliasManager.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(manager.toResourcePath(RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/cayenne.xml&amp;quot;)).andReturn(&amp;quot;/cayenne.xml&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expect(manager.toResourcePath(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RequestConstants.ASSET_PATH_PREFIX + &amp;quot;/org/apache/tapestry/default.css&amp;quot;))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.andReturn(&amp;quot;/org/apache/tapestry/default.css&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;replay(auth,request,response,manager,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssetProtectionDispatcher disp = new AssetProtectionDispatcher(auths,manager,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(disp.dispatch(request,response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(disp.dispatch(request, response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verify(auth,request,response,logger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RegexAuthorizerTest.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,53 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.apache.tapestry5.internal.services.RegexAuthorizer;
&lt;br&gt;+
&lt;br&gt;+public class RegexAuthorizerTest extends Assert
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void test_regexes()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;String&amp;gt; patterns = Arrays.asList(&amp;quot;^.*\\.png$&amp;quot;,&amp;quot;^.*\\.jpg&amp;quot;,&amp;quot;^.*\\.jpeg&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RegexAuthorizer auth = new RegexAuthorizer(patterns);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String pkg = &amp;quot;assets/com/saiwaisolutions/resources/&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String png = pkg + &amp;quot;foo.png&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String jpg = pkg + &amp;quot;foo.jpg&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String jpeg = pkg + &amp;quot;foo.jpeg&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String xml = pkg + &amp;quot;foo.xml&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,png,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,jpg,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,jpeg,true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test(auth,xml,false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static void test(RegexAuthorizer auth, String one,boolean allowed)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.accessAllowed(one),allowed);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;auth.accessAllowed(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&lt;a href=&quot;http://localhost:8080&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080&lt;/a&gt;&amp;quot; + one),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;allowed);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(one));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(&amp;quot;&lt;a href=&quot;http://localhost:8080&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080&lt;/a&gt;&amp;quot; + one));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java?rev=834151&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java?rev=834151&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/WhitelistAuthorizerTest.java Mon Nov &amp;nbsp;9 17:23:10 2009
&lt;br&gt;@@ -0,0 +1,45 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * Created on Jul 28, 2007
&lt;br&gt;+ * 
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+package org.apache.tapestry5.internal.services;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+
&lt;br&gt;+import org.testng.Assert;
&lt;br&gt;+import org.testng.annotations.Test;
&lt;br&gt;+import org.apache.tapestry5.internal.services.WhitelistAuthorizer;
&lt;br&gt;+import org.apache.tapestry5.services.AssetPathAuthorizer;
&lt;br&gt;+
&lt;br&gt;+public class WhitelistAuthorizerTest extends Assert {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void run()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WhitelistAuthorizer auth = new WhitelistAuthorizer(Arrays.asList(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().get(0), AssetPathAuthorizer.Order.ALLOW);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().get(1), AssetPathAuthorizer.Order.DENY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(auth.order().size(),2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(auth.accessAllowed(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessDenied(&amp;quot;foo&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(auth.accessAllowed(&amp;quot;bar&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(auth.accessDenied(&amp;quot;bar&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/svn-commit%3A-r834151---in--tapestry-tapestry5-trunk%3A-src-site-apt-guide--tapestry-core-src-main-java-org-apache-tapestry5-internal-services--tapestry-core-src-main-java-org-apache-tapestry5-services--tapestry-core-src-test-java-org-apache-tapestry5-inte...-tp26270226p26270226.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26269707</id>
	<title>Re: TemplateParseException: Tag &lt;&gt; on line xxx contains more than one  'y' attribute.</title>
	<published>2009-11-09T08:52:48Z</published>
	<updated>2009-11-09T08:52:48Z</updated>
	<author>
		<name>Howard Lewis Ship</name>
	</author>
	<content type="html">Please take this to the users mailing list; this is the developer
&lt;br&gt;list, used to discuss framework development (not user support). You'll
&lt;br&gt;get a faster answer there.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 7:02 AM, Rayden30
&lt;br&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269707&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dmourereau.ext@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; First I m a beginer in Tapestry... Actually I m developping a webview which
&lt;br&gt;&amp;gt; has to display an ordered array as below:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Root 1
&lt;br&gt;&amp;gt; Root 2
&lt;br&gt;&amp;gt; Root 3
&lt;br&gt;&amp;gt;  |----Child1
&lt;br&gt;&amp;gt;  |----Child2
&lt;br&gt;&amp;gt;           |---Child 2.1
&lt;br&gt;&amp;gt;           |---Child 2.2
&lt;br&gt;&amp;gt; ....
&lt;br&gt;&amp;gt; ...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; My code in local working perfectly... However when I intrated in my tapestry
&lt;br&gt;&amp;gt; application it idisplays the following exception:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Tag &amp;lt;&amp;gt; on line 158 contains more than one 'valuebool' attribute.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I checked on webview and there is no tags which are using this variable
&lt;br&gt;&amp;gt; name. I try to rename in toto. And the results is the same:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Below you can see the code:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In bold where Apache detects an exception.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                function clear(result)
&lt;br&gt;&amp;gt;                {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                var res= result.replace('&amp;quot;','');
&lt;br&gt;&amp;gt;                                var res= res.replace('&amp;quot;','');
&lt;br&gt;&amp;gt;                                var res= res.replace('[','');
&lt;br&gt;&amp;gt;                                var res= res.replace(']','');
&lt;br&gt;&amp;gt;                                var res= res.replace('[','');
&lt;br&gt;&amp;gt;                                var res= res.replace(']','');
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                return res;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                }
&lt;br&gt;&amp;gt;                function who_is_root(tab_result)
&lt;br&gt;&amp;gt;                {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                var i=3;
&lt;br&gt;&amp;gt;                var root=new Array();
&lt;br&gt;&amp;gt;                var y=0;
&lt;br&gt;&amp;gt;                var valuebool;
&lt;br&gt;&amp;gt;                var z;
&lt;br&gt;&amp;gt;                        while (i &amp;lt; tab_result.length)
&lt;br&gt;&amp;gt;                        {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        var id_parent=clear(tab_result[i]);
&lt;br&gt;&amp;gt;                        valuebool=false;
&lt;br&gt;&amp;gt;                        z=1;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                        while (z &amp;lt; tab_result.length)
&lt;br&gt;&amp;gt;                                        {
&lt;br&gt;&amp;gt;                                                if(clear(tab_result[z])==id_parent)
&lt;br&gt;&amp;gt;                                                {
&lt;br&gt;&amp;gt;                                                // An exception is up
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                                valuebool=true;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                                }
&lt;br&gt;&amp;gt;                                                 //Sometimes the exception is up for z variables
&lt;br&gt;&amp;gt;                                                z=z+4;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                        }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                        if (!valuebool)
&lt;br&gt;&amp;gt;                                        {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                        root[y]=clear(tab_result[i-3]);
&lt;br&gt;&amp;gt;                                        root[y+1]=clear(tab_result[i-2]);
&lt;br&gt;&amp;gt;                                        root[y+2]=clear(tab_result[i-1]);
&lt;br&gt;&amp;gt;                                        root[y+3]=clear(tab_result[i]);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                        y=y+4;
&lt;br&gt;&amp;gt;                                        }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        i=i+4;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                return(root);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                function afficher_enfant(id_root,y,result)
&lt;br&gt;&amp;gt;                {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        if (y &amp;lt;result.length)
&lt;br&gt;&amp;gt;                        {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                if(id_root==clear(result[y]))
&lt;br&gt;&amp;gt;                                {
&lt;br&gt;&amp;gt;                                //Afficher l'enfant ci-dessous
&lt;br&gt;&amp;gt;                                document.write(&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                                document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y-3]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                                document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y-2]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                                document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y-1]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                                document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                                document.write(&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                                }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        y=y+4;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        afficher_enfant(id_root,y,result);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  function afficher_ma_config(code,result)
&lt;br&gt;&amp;gt;  {
&lt;br&gt;&amp;gt;        result=result.split(&amp;quot;,&amp;quot;);
&lt;br&gt;&amp;gt;        var tab_root=who_is_root(result);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        var i=1;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        document.write(&amp;quot;&amp;lt;table align='center' class='tablesorter'&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;        document.write(&amp;quot;&amp;lt;thead&amp;gt;&amp;lt;tr &amp;gt;&amp;lt;td&amp;gt;Zone
&lt;br&gt;&amp;gt; List&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Type&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Parents&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;        document.write(&amp;quot;&amp;lt;tbody&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                while(i&amp;lt;tab_root.length)
&lt;br&gt;&amp;gt;                {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        document.write(&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                        document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i-1]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                        document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                        document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i+1]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                        document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i+2]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                        document.write(&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;                        afficher_enfant(tab_root[i],3,result);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                        i=i+4;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        document.write(&amp;quot;&amp;lt;/tbody&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;        document.write(&amp;quot;&amp;lt;/table&amp;gt;&amp;quot;);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        var reqparam=&amp;quot;&lt;a href=&quot;http://10.192.168.2/zones/list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://10.192.168.2/zones/list&lt;/a&gt;&amp;quot;;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        triggerAction('listrules',[reqparam],afficher_ma_config,'text/html');
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  Thank you for answering to this question,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  I think this subject was already underlined in either part of this forum
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  Best Regards,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; View this message in context: &lt;a href=&quot;http://old.nabble.com/TemplateParseException%3A-Tag-%3C%3E-on-line-xxx-contains-more-than-one-%27y%27-attribute.-tp26267695p26267695.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/TemplateParseException%3A-Tag-%3C%3E-on-line-xxx-contains-more-than-one-%27y%27-attribute.-tp26267695p26267695.html&lt;/a&gt;&lt;br&gt;&amp;gt; Sent from the Tapestry - Dev mailing list archive at Nabble.com.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269707&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt; For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269707&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Howard M. Lewis Ship
&lt;br&gt;&lt;br&gt;Creator of Apache Tapestry
&lt;br&gt;&lt;br&gt;The source for Tapestry training, mentoring and support. Contact me to
&lt;br&gt;learn how I can get you up and productive in Tapestry fast!
&lt;br&gt;&lt;br&gt;(971) 678-5210
&lt;br&gt;&lt;a href=&quot;http://howardlewisship.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://howardlewisship.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269707&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-unsubscribe@...&lt;/a&gt;
&lt;br&gt;For additional commands, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269707&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dev-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/TemplateParseException%3A-Tag-%3C%3E-on-line-xxx-contains-more-than-one-%27y%27-attribute.-tp26267695p26269707.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26267695</id>
	<title>TemplateParseException: Tag &lt;&gt; on line xxx contains more than one 'y' attribute.</title>
	<published>2009-11-09T07:01:28Z</published>
	<updated>2009-11-09T07:01:28Z</updated>
	<author>
		<name>Rayden30</name>
	</author>
	<content type="html">Hello,
&lt;br&gt;&lt;br&gt;&lt;br&gt;First I m a beginer in Tapestry... Actually I m developping a webview which has to display an ordered array as below:
&lt;br&gt;&lt;br&gt;Root 1
&lt;br&gt;Root 2
&lt;br&gt;Root 3
&lt;br&gt;&amp;nbsp;|----Child1
&lt;br&gt;&amp;nbsp;|----Child2
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|---Child 2.1
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|---Child 2.2
&lt;br&gt;....
&lt;br&gt;...
&lt;br&gt;&lt;br&gt;My code in local working perfectly... However when I intrated in my tapestry application it idisplays the following exception:
&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;i&gt;Tag &amp;lt;&amp;gt; on line 158 contains more than one 'valuebool' attribute.&lt;/i&gt;&lt;/b&gt;&lt;br&gt;&lt;br&gt;I checked on webview and there is no tags which are using this variable name. I try to rename in toto. And the results is the same:
&lt;br&gt;&lt;br&gt;Below you can see the code:
&lt;br&gt;&lt;br&gt;In bold where Apache detects an exception.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; function clear(result)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var res= result.replace('&amp;quot;','');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var res= res.replace('&amp;quot;','');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var res= res.replace('[','');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var res= res.replace(']','');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var res= res.replace('[','');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var res= res.replace(']','');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return res;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; function who_is_root(tab_result)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var i=3;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var root=new Array();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var y=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var valuebool;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var z;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (i &amp;lt; tab_result.length)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var id_parent=clear(tab_result[i]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; valuebool=false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; z=1;	
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (z &amp;lt; tab_result.length)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(clear(tab_result[z])==id_parent)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;// An exception is up&lt;/b&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;valuebool=true;&lt;/b&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;&amp;nbsp;//Sometimes the exception is up for z variables&lt;/b&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;z=z+4;&lt;/b&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!valuebool)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root[y]=clear(tab_result[i-3]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root[y+1]=clear(tab_result[i-2]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root[y+2]=clear(tab_result[i-1]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root[y+3]=clear(tab_result[i]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y=y+4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i=i+4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return(root);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;
&lt;br&gt;&amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; function afficher_enfant(id_root,y,result)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (y &amp;lt;result.length)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(id_root==clear(result[y]))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Afficher l'enfant ci-dessous
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y-3]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y-2]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y-1]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(result[y]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y=y+4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; afficher_enfant(id_root,y,result);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; function afficher_ma_config(code,result)
&lt;br&gt;&amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result=result.split(&amp;quot;,&amp;quot;);
&lt;br&gt;&amp;nbsp; 	var tab_root=who_is_root(result);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var i=1;
&lt;br&gt;&amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;table align='center' class='tablesorter'&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;thead&amp;gt;&amp;lt;tr &amp;gt;&amp;lt;td&amp;gt;Zone List&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Type&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Parents&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;tbody&amp;gt;&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(i&amp;lt;tab_root.length)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i-1]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i+1]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;td&amp;gt;&amp;quot; + clear(tab_root[i+2]) + &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; afficher_enfant(tab_root[i],3,result);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i=i+4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;/tbody&amp;gt;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&amp;quot;&amp;lt;/table&amp;gt;&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var reqparam=&amp;quot;&lt;a href=&quot;http://10.192.168.2/zones/list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://10.192.168.2/zones/list&lt;/a&gt;&amp;quot;;
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; triggerAction('listrules',[reqparam],afficher_ma_config,'text/html');
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;Thank you for answering to this question,
&lt;br&gt;&lt;br&gt;&amp;nbsp;I think this subject was already underlined in either part of this forum
&lt;br&gt;&lt;br&gt;&amp;nbsp;Best Regards,
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/TemplateParseException%3A-Tag-%3C%3E-on-line-xxx-contains-more-than-one-%27y%27-attribute.-tp26267695p26267695.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26265726</id>
	<title>[jira] Commented: (TAP5-633) Allow page classes to have a &quot;Page&quot; suffix that is not included in the URL</title>
	<published>2009-11-09T04:36:32Z</published>
	<updated>2009-11-09T04:36:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; [ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-633?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12774946#action_12774946&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-633?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;focusedCommentId=12774946#action_12774946&lt;/a&gt;&amp;nbsp;] 
&lt;br&gt;&lt;br&gt;Paul Field commented on TAP5-633:
&lt;br&gt;---------------------------------
&lt;br&gt;&lt;br&gt;Thanks for the URL rewriting idea - I've tried it out quickly but I wasn't keen that I still had to use the Page postfix in the .tml files (e.g. when creating a link to the page) - I think that would be confusing.
&lt;br&gt;&lt;br&gt;I also had a quick go at advising ComponentClassResolver, but I realised that when Tapestry reports the list of known components (on startup and on exception pages) it would still list the paths including the &amp;quot;Page&amp;quot; postfix - which, again, I think would be confusing.
&lt;br&gt;&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Allow page classes to have a &amp;quot;Page&amp;quot; suffix that is not included in the URL
&lt;br&gt;&amp;gt; --------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-633
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-633&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-633&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Improvement
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.2
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Paul Field
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Priority: Minor
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I have an application with a lot of read-only pages. For example, I have a page that shows a company and I would like a URI such as: &amp;nbsp;/company/1234
&lt;br&gt;&amp;gt; However, if I name the page class &amp;quot;Company&amp;quot; then I get a naming clash with the domain object &amp;quot;Company&amp;quot;. What I would like to do is call the Tapestry 5 class &amp;quot;CompanyPage&amp;quot; - after all, that is what the class represents and it's certainly how the team refers to that thing internally and with our business (i.e. &amp;quot;Have you seen the new company page?&amp;quot;).
&lt;br&gt;&amp;gt; So, please could the ComponentClassResolverImpl remove the suffix &amp;quot;Page&amp;quot; (if it exists) from the class name when it constructs the logical page name?
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-633%29-Allow-page-classes-to-have-a-%22Page%22-suffix-that-is-not-included-in-the-URL-tp22947275p26265726.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258198</id>
	<title>svn commit: r833930 - /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java</title>
	<published>2009-11-08T13:32:01Z</published>
	<updated>2009-11-08T13:32:01Z</updated>
	<author>
		<name>drobiazko</name>
	</author>
	<content type="html">Author: drobiazko
&lt;br&gt;Date: Sun Nov &amp;nbsp;8 21:32:00 2009
&lt;br&gt;New Revision: 833930
&lt;br&gt;&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=833930&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=833930&amp;view=rev&lt;/a&gt;&lt;br&gt;Log:
&lt;br&gt;TAP5-138: Add Zone parameter to Select component
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java?rev=833930&amp;r1=833929&amp;r2=833930&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java?rev=833930&amp;r1=833929&amp;r2=833930&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java Sun Nov &amp;nbsp;8 21:32:00 2009
&lt;br&gt;@@ -128,6 +128,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Parameter(required = true, principal = true, autoconnect = true)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private Object value;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Binding the zone parameter will cause any change of Select's value to be handled as an Ajax request that updates the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * indicated zone. The component will trigger the event {@link EventConstants#VALUE_CHANGED} to inform its
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * container that Select's value has changed.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @since 5.2.0.0
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Parameter(defaultPrefix = BindingConstants.LITERAL)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String zone;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/svn-commit%3A-r833930----tapestry-tapestry5-trunk-tapestry-core-src-main-java-org-apache-tapestry5-corelib-components-Select.java-tp26258198p26258198.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258128</id>
	<title>[jira] Updated: (TAP5-734) Tapestry tutorial documentation refers to old archtype command</title>
	<published>2009-11-08T13:25:32Z</published>
	<updated>2009-11-08T13:25:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-734?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-734?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko updated TAP5-734:
&lt;br&gt;--------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix Version/s: &amp;nbsp; &amp;nbsp; (was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&amp;nbsp; &amp;nbsp; Affects Version/s: &amp;nbsp; &amp;nbsp; (was: 5.1.0.5)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Tapestry tutorial documentation refers to old archtype command
&lt;br&gt;&amp;gt; --------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-734
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-734&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-734&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: documentation
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.2.0.0
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Ben Gidley
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Ted Steen
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: 0001-Fixed-archetype-line.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The tapestry tutorial build instructions refer to the old archtype command
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-734%29-Tapestry-tutorial-documentation-refers-to-old-archtype-command-tp23853770p26258128.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258098</id>
	<title>[jira] Updated: (TAP5-819) remove ide-specific files from all sub-modules and add them to svn:ignore</title>
	<published>2009-11-08T13:23:32Z</published>
	<updated>2009-11-08T13:23:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-819?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-819?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko updated TAP5-819:
&lt;br&gt;--------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Fix Version/s: &amp;nbsp; &amp;nbsp; (was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; remove ide-specific files from all sub-modules and add them to svn:ignore
&lt;br&gt;&amp;gt; -------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-819
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-819&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-819&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Task
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Ulrich Stärk
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Kevin Menard
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Priority: Minor
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; remove ide-specific files from all sub-modules and add them to svn:ignore, along with any output directories like target.
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-819%29-remove-ide-specific-files-from-all-sub-modules-and-add-them-to-svn%3Aignore-tp25044536p26258098.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258099</id>
	<title>[jira] Updated: (TAP5-807) PageRenderLinkSource should add additional methods for creating a Link when you have the page's activation context as an EventContext</title>
	<published>2009-11-08T13:23:32Z</published>
	<updated>2009-11-08T13:23:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-807?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-807?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko updated TAP5-807:
&lt;br&gt;--------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Fix Version/s: &amp;nbsp; &amp;nbsp; (was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; PageRenderLinkSource should add additional methods for creating a Link when you have the page's activation context as an EventContext
&lt;br&gt;&amp;gt; -------------------------------------------------------------------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-807
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-807&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-807&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Improvement
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Howard M. Lewis Ship
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Ted Steen
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Priority: Minor
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-807%29-PageRenderLinkSource-should-add-additional-methods-for-creating-a-Link-when-you-have-the-page%27s-activation-context-as-an-EventContext-tp24845453p26258099.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258100</id>
	<title>[jira] Updated: (TAP5-764) Hidden should support ClientElement and support informal parameters.</title>
	<published>2009-11-08T13:23:32Z</published>
	<updated>2009-11-08T13:23:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-764?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-764?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko updated TAP5-764:
&lt;br&gt;--------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; Fix Version/s: &amp;nbsp; &amp;nbsp; (was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hidden should support ClientElement and support informal parameters.
&lt;br&gt;&amp;gt; --------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-764
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-764&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-764&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Improvement
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Norman Franke
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Ted Steen
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Per our discussion on the mailing list:
&lt;br&gt;&amp;gt; The hidden component needs to support ClientElement and it should pass through informal parameters, e.g. &amp;quot;id&amp;quot;.
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-764%29-Hidden-should-support-ClientElement-and-support-informal-parameters.-tp24362443p26258100.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258076</id>
	<title>[jira] Closed: (TAP5-138) Add Zone parameter to Select component</title>
	<published>2009-11-08T13:21:32Z</published>
	<updated>2009-11-08T13:21:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-138?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-138?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko closed TAP5-138.
&lt;br&gt;-------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Resolution: Fixed
&lt;br&gt;&amp;nbsp; &amp;nbsp; Fix Version/s: 5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Add Zone parameter to Select component
&lt;br&gt;&amp;gt; --------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-138
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-138&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-138&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: New Feature
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.0.15
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Geoff Callender
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Igor Drobiazko
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Add AJAX ability to selection in a Select component to allow the classic chaining of Select components.
&lt;br&gt;&amp;gt; Eg. for filtering car advertisements: &amp;nbsp;3 Select components - Brand, Make, Model. &amp;nbsp;Choosing a Brand causes the Make to be enabled, showing the possible makes. &amp;nbsp;Similarly, choosing a Make causes the Model to be enabled, showing the possible models.
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Closed%3A-%28TAP5-138%29-Add-Zone-parameter-to-Select-component-tp26258076p26258076.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258077</id>
	<title>[jira] Closed: (TAP5-896) Contribute 'properties' file extension to the configuration of ResourceDigestGenerator</title>
	<published>2009-11-08T13:21:32Z</published>
	<updated>2009-11-08T13:21:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko closed TAP5-896.
&lt;br&gt;-------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Resolution: Fixed
&lt;br&gt;&amp;nbsp; &amp;nbsp; Fix Version/s: 5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Contribute 'properties' file extension to the configuration of ResourceDigestGenerator
&lt;br&gt;&amp;gt; --------------------------------------------------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-896
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-896&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-896&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.1.0.5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Igor Drobiazko
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Igor Drobiazko
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Priority: Blocker
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This is a partly solution for TAP5-815 (only for *.properties files).
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-896%29-Contribute-%27properties%27-file-extension-to-the-configuration-of-ResourceDigestGenerator-tp25925611p26258077.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258079</id>
	<title>[jira] Updated: (TAP5-913) java.lang.VerifyError Stack size too large</title>
	<published>2009-11-08T13:21:32Z</published>
	<updated>2009-11-08T13:21:32Z</updated>
	<author>
		<name>JIRA jira@apache.org</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel&lt;/a&gt;&amp;nbsp;]
&lt;br&gt;&lt;br&gt;Igor Drobiazko updated TAP5-913:
&lt;br&gt;--------------------------------
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix Version/s: &amp;nbsp; &amp;nbsp; (was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&amp;nbsp; &amp;nbsp; Affects Version/s: &amp;nbsp; &amp;nbsp; (was: 5.2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5.2.0.0
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; java.lang.VerifyError Stack size too large
&lt;br&gt;&amp;gt; ------------------------------------------
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Key: TAP5-913
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; URL: &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-913&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.apache.org/jira/browse/TAP5-913&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Project: Tapestry 5
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Issue Type: Bug
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Components: tapestry-core
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Affects Versions: 5.2.0.0
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Reporter: Dmitry Gusev
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assignee: Kevin Menard
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fix For: 5.2.0.0
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Attachments: 0001-Fixes-java.lang.VerifyError-Stack-size-too-large.patch
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; java.lang.VerifyError: (class: org/apache/tapestry5/internal/antlr/PropertyExpressionLexer, method: mDECIMAL signature: ()V) Stack size too large
&lt;br&gt;&amp;gt; This error could be with mDECIMAL method as well as with mRANGEOP, mINTEGER, mREDEF
&lt;br&gt;&amp;gt; As I found out this might be because of unnecessary code: &lt;a href=&quot;http://forums.terracotta.org/forums/posts/list/872.page&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://forums.terracotta.org/forums/posts/list/872.page&lt;/a&gt;&lt;br&gt;&amp;gt; -------
&lt;br&gt;&amp;gt; Windows Vista 32
&lt;br&gt;&amp;gt; Google AppEngine SDK 1.2.6
&lt;br&gt;&amp;gt; java version &amp;quot;1.6.0_15&amp;quot;
&lt;br&gt;&amp;gt; Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
&lt;br&gt;&amp;gt; Java HotSpot(TM) Client VM (build 14.1-b02, mixed mode, sharing)
&lt;br&gt;&amp;gt; Stack trace:
&lt;br&gt;&amp;gt; HTTP ERROR: 500
&lt;br&gt;&amp;gt; (class: org/apache/tapestry5/internal/antlr/PropertyExpressionLexer, method: mDECIMAL signature: ()V) Stack size too large
&lt;br&gt;&amp;gt; RequestURI=/welcome
&lt;br&gt;&amp;gt; Caused by:
&lt;br&gt;&amp;gt; java.lang.VerifyError: (class: org/apache/tapestry5/internal/antlr/PropertyExpressionLexer, method: mDECIMAL signature: ()V) Stack size too large
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.parse(PropertyConduitSourceImpl.java:1230)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.build(PropertyConduitSourceImpl.java:1125)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.create(PropertyConduitSourceImpl.java:1081)
&lt;br&gt;&amp;gt; 	at $PropertyConduitSource_1249b3a8cbc.create($PropertyConduitSource_1249b3a8cbc.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.bindings.PropBindingFactory.newBinding(PropBindingFactory.java:49)
&lt;br&gt;&amp;gt; 	at $BindingFactory_1249b3a8cbd.newBinding($BindingFactory_1249b3a8cbd.java)
&lt;br&gt;&amp;gt; 	at $BindingFactory_1249b3a8cb5.newBinding($BindingFactory_1249b3a8cb5.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.BindingSourceImpl.newBinding(BindingSourceImpl.java:81)
&lt;br&gt;&amp;gt; 	at $BindingSource_1249b3a8c93.newBinding($BindingSource_1249b3a8c93.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.PageElementFactoryImpl.newBinding(PageElementFactoryImpl.java:184)
&lt;br&gt;&amp;gt; 	at $PageElementFactory_1249b3a8caf.newBinding($PageElementFactory_1249b3a8caf.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.pageload.PageLoaderImpl$10.execute(PageLoaderImpl.java:859)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.runActions(ComponentAssemblerImpl.java:207)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.assembleRootComponent(ComponentAssemblerImpl.java:88)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.pageload.PageLoaderImpl.loadPage(PageLoaderImpl.java:159)
&lt;br&gt;&amp;gt; 	at $PageLoader_1249b3a8ca0.loadPage($PageLoader_1249b3a8ca0.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.PagePoolCache.checkout(PagePoolCache.java:210)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.PagePoolImpl.checkout(PagePoolImpl.java:99)
&lt;br&gt;&amp;gt; 	at $PagePool_1249b3a8c9f.checkout($PagePool_1249b3a8c9f.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.RequestPageCacheImpl.get(RequestPageCacheImpl.java:51)
&lt;br&gt;&amp;gt; 	at $RequestPageCache_1249b3a8c9e.get($RequestPageCache_1249b3a8c9e.java)
&lt;br&gt;&amp;gt; 	at $RequestPageCache_1249b3a8c86.get($RequestPageCache_1249b3a8c86.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.DefaultRequestExceptionHandler.handleRequestException(DefaultRequestExceptionHandler.java:69)
&lt;br&gt;&amp;gt; 	at $RequestExceptionHandler_1249b3a8c71.handleRequestException($RequestExceptionHandler_1249b3a8c71.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:42)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.services.TapestryModule$4.service(TapestryModule.java:791)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:780)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:85)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at dmitrygusev.ping.services.AppModule$1.service(AppModule.java:138)
&lt;br&gt;&amp;gt; 	at $RequestFilter_1249b3a8c6d.service($RequestFilter_1249b3a8c6d.java)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at dmitrygusev.ping.services.AppModule$2.service(AppModule.java:190)
&lt;br&gt;&amp;gt; 	at $RequestFilter_1249b3a8c6e.service($RequestFilter_1249b3a8c6e.java)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:90)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:80)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:85)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:103)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c73.service($RequestHandler_1249b3a8c73.java)
&lt;br&gt;&amp;gt; 	at $RequestHandler_1249b3a8c67.service($RequestHandler_1249b3a8c67.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:199)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:53)
&lt;br&gt;&amp;gt; 	at $HttpServletRequestHandler_1249b3a8c69.service($HttpServletRequestHandler_1249b3a8c69.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
&lt;br&gt;&amp;gt; 	at $HttpServletRequestFilter_1249b3a8c66.service($HttpServletRequestFilter_1249b3a8c66.java)
&lt;br&gt;&amp;gt; 	at $HttpServletRequestHandler_1249b3a8c69.service($HttpServletRequestHandler_1249b3a8c69.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:739)
&lt;br&gt;&amp;gt; 	at $HttpServletRequestHandler_1249b3a8c69.service($HttpServletRequestHandler_1249b3a8c69.java)
&lt;br&gt;&amp;gt; 	at $HttpServletRequestHandler_1249b3a8c64.service($HttpServletRequestHandler_1249b3a8c64.java)
&lt;br&gt;&amp;gt; 	at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:127)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
&lt;br&gt;&amp;gt; 	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
&lt;br&gt;&amp;gt; 	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:121)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
&lt;br&gt;&amp;gt; 	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
&lt;br&gt;&amp;gt; 	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:342)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.Server.handle(Server.java:313)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
&lt;br&gt;&amp;gt; 	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
&lt;br&gt;&amp;gt; 	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
&lt;br&gt;&amp;gt; 	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
&lt;br&gt;&amp;gt; Powered by Jetty://
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;This message is automatically generated by JIRA.
&lt;br&gt;-
&lt;br&gt;You can reply to this email to add a comment to the issue online.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-jira--Created%3A-%28TAP5-913%29-java.lang.VerifyError-Stack-size-too-large-tp26094332p26258079.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258060</id>
	<title>svn commit: r833929 - /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java</title>
	<published>2009-11-08T13:19:25Z</published>
	<updated>2009-11-08T13:19:25Z</updated>
	<author>
		<name>drobiazko</name>
	</author>
	<content type="html">Author: drobiazko
&lt;br&gt;Date: Sun Nov &amp;nbsp;8 21:19:23 2009
&lt;br&gt;New Revision: 833929
&lt;br&gt;&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=833929&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=833929&amp;view=rev&lt;/a&gt;&lt;br&gt;Log:
&lt;br&gt;TAP5-896: Contribute 'properties' file extension to the configuration of ResourceDigestGenerator
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=833929&amp;r1=833928&amp;r2=833929&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=833929&amp;r1=833928&amp;r2=833929&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Sun Nov &amp;nbsp;8 21:19:23 2009
&lt;br&gt;@@ -1979,7 +1979,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;lt;p/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * The extensions must be all lower case.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;lt;p/&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * This contributes &amp;quot;class&amp;quot; and &amp;quot;tml&amp;quot; (the template extension).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * This contributes &amp;quot;class&amp;quot;, &amp;quot;properties&amp;quot; and &amp;quot;tml&amp;quot; (the template extension).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param configuration collection of extensions
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;@@ -1988,6 +1988,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Java class files always require a digest.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;class&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Even though properties don't contain sensible data we should protect them.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(&amp;quot;properties&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Likewise, we don't want people fishing for templates.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configuration.add(InternalConstants.TEMPLATE_EXTENSION);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/svn-commit%3A-r833929----tapestry-tapestry5-trunk-tapestry-core-src-main-java-org-apache-tapestry5-services-TapestryModule.java-tp26258060p26258060.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26258113</id>
	<title>svn commit: r833928 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/ main/java/org/apache/tapestry5/corelib/components/ main/resources/org/apache/tapestry5/ test/app1/ test/java/org/apache/tapestry5/integration/ test/ja...</title>
	<published>2009-11-08T13:16:57Z</published>
	<updated>2009-11-08T13:16:57Z</updated>
	<author>
		<name>drobiazko</name>
	</author>
	<content type="html">Author: drobiazko
&lt;br&gt;Date: Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;New Revision: 833928
&lt;br&gt;&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc?rev=833928&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc?rev=833928&amp;view=rev&lt;/a&gt;&lt;br&gt;Log:
&lt;br&gt;TAP5-138: Add Zone parameter to Select component
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/app1/SelectZoneDemo.tml
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java &amp;nbsp; (with props)
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java &amp;nbsp; (with props)
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
&lt;br&gt;&amp;nbsp; &amp;nbsp; tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -144,9 +144,17 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Event triggered by an {@link org.apache.tapestry5.corelib.mixins.Autocomplete} mixin to request completions of
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * the current input. The context is the partial string provided by the cient.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * the current input. The context is the partial string provided by the client.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @SINCE 5.1.0.4
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final String PROVIDE_COMPLETIONS = &amp;quot;providecompletions&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Event triggered by {@link org.apache.tapestry5.corelib.components.Select} component to inform its
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * container that Select's value has changed.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @since 5.2.0.0
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String VALUE_CHANGED = &amp;quot;valuechanged&amp;quot;;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -18,14 +18,22 @@
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.annotations.*;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.corelib.base.AbstractField;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.corelib.data.BlankOption;
&lt;br&gt;+import org.apache.tapestry5.corelib.internal.ComponentActionSink;
&lt;br&gt;+import org.apache.tapestry5.corelib.internal.HiddenFieldPositioner;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.corelib.mixins.RenderDisabled;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.internal.TapestryInternalUtils;
&lt;br&gt;+import org.apache.tapestry5.internal.services.PageRenderQueue;
&lt;br&gt;+import org.apache.tapestry5.internal.util.Holder;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.internal.util.SelectModelRenderer;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.ioc.Messages;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.ioc.annotations.Inject;
&lt;br&gt;+import org.apache.tapestry5.ioc.internal.util.IdAllocator;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.ioc.internal.util.InternalUtils;
&lt;br&gt;+import org.apache.tapestry5.json.JSONArray;
&lt;br&gt;+import org.apache.tapestry5.json.JSONObject;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.services.*;
&lt;br&gt;&amp;nbsp;import org.apache.tapestry5.util.EnumSelectModel;
&lt;br&gt;+import org.slf4j.Logger;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import java.util.Locale;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -39,9 +47,12 @@
&lt;br&gt;&amp;nbsp; * can be overriden by binding the encoder parameter, or extended by contributing a {@link ValueEncoderFactory} into the
&lt;br&gt;&amp;nbsp; * service's configuration.
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-@Events(EventConstants.VALIDATE)
&lt;br&gt;+@Events({EventConstants.VALIDATE, EventConstants.VALUE_CHANGED + &amp;quot; when 'zone' parameter is bound&amp;quot;})
&lt;br&gt;&amp;nbsp;public class Select extends AbstractField
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String FORM_COMPONENTID_PARAMETER = &amp;quot;t:formcomponentid&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String CHANGE_EVENT = &amp;quot;change&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private class Renderer extends SelectModelRenderer
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -116,9 +127,39 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Parameter(required = true, principal = true, autoconnect = true)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private Object value;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Parameter(defaultPrefix = BindingConstants.LITERAL)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String zone;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FieldValidationSupport fieldValidationSupport;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Environmental
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FormSupport formSupport;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Environment environment;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private RenderSupport renderSupport;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ComponentResources componentResources;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HiddenFieldLocationRules rules;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Logger logger;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ClientDataEncoder clientDataEncoder;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ComponentSource componentSource;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private PageRenderQueue pageRenderQueue;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Mixin
&lt;br&gt;@@ -139,9 +180,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tracker.recordInput(this, submittedValue);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object selectedValue = InternalUtils.isBlank(submittedValue)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ? null :
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; encoder.toValue(submittedValue);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object selectedValue = toValue(submittedValue);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;@@ -169,6 +208,83 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;resources.renderInformalParameters(writer);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Disabled is via a mixin
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (this.zone != null) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Link link = this.resources.createEventLink(CHANGE_EVENT);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;link.addParameter(FORM_COMPONENTID_PARAMETER, this.formSupport.getFormComponentId());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final JSONArray spec = new JSONArray();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spec.put(&amp;quot;change&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spec.put(getClientId());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spec.put(this.zone);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spec.put(link.toAbsoluteURI());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.renderSupport.addInit(&amp;quot;updateZoneOnEvent&amp;quot;, spec);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Object onChange() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final String formId = this.request.getParameter(FORM_COMPONENTID_PARAMETER);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final String changedValue = this.request.getParameter(&amp;quot;t:selectvalue&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Object newValue = toValue(changedValue);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Holder&amp;lt;Object&amp;gt; holder = Holder.create();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ComponentEventCallback callback = new ComponentEventCallback() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public boolean handleResult(final Object result) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;holder.put(result);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Select.this.value = newValue;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.componentResources.triggerEvent(EventConstants.VALUE_CHANGED, new Object[] { newValue }, callback);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final PartialMarkupRendererFilter filter = new PartialMarkupRendererFilter() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HiddenFieldPositioner hiddenFieldPositioner = new HiddenFieldPositioner(writer, Select.this.rules);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ComponentActionSink actionSink = new ComponentActionSink(Select.this.logger, Select.this.clientDataEncoder);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Form form = (Form) Select.this.componentSource.getComponent(formId);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FormSupport formSupport = form.createRenderTimeFormSupport(form.getClientId(), actionSink, new IdAllocator());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Select.this.environment.push(FormSupport.class, formSupport);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Select.this.environment.push(ValidationTracker.class, new ValidationTrackerImpl());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;renderer.renderMarkup(writer, reply);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Select.this.environment.pop(ValidationTracker.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Select.this.environment.pop(FormSupport.class);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hiddenFieldPositioner.getElement().attributes(&amp;quot;type&amp;quot;, &amp;quot;hidden&amp;quot;, &amp;quot;name&amp;quot;, Form.FORM_DATA, 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;value&amp;quot;, actionSink.getClientData());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pageRenderQueue.addPartialMarkupRendererFilter(filter);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return holder.get();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected Object toValue(final String submittedValue) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return InternalUtils.isBlank(submittedValue) ? null : this.encoder.toValue(submittedValue);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.xdoc Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -170,6 +170,120 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/subsection&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/section&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;section name=&amp;quot;Chaining of Select components&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	There is often a requirement for chaining Select components. When a value of a Select component is changed 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	another Select should become visible. Let's consider the following example: you create an online shop for a car seller.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	A make is modeled as enumeration CarMaker. &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	&amp;lt;subsection name=&amp;quot;CarMaker.java&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;source&amp;gt;&amp;lt;![CDATA[ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;+public enum CarMaker
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MERCEDES, AUDI, BMW;
&lt;br&gt;+}]]&amp;gt;&amp;lt;/source&amp;gt; &amp;nbsp;
&lt;br&gt;+			&amp;lt;/subsection&amp;gt;
&lt;br&gt;+			
&lt;br&gt;+			&amp;lt;subsection name=&amp;quot;SelectZoneDemo.tml&amp;quot;&amp;gt;
&lt;br&gt;+				The Select component 'carMaker' of the page SelectZoneDemo shows all available car makers. 
&lt;br&gt;+				When a user selects a car maker, another Select component for selecting available models of the make should appear.
&lt;br&gt;+				This can be accomplished by the parameter &amp;lt;em&amp;gt;zone&amp;lt;/em&amp;gt; of the Select component 'carMaker'. When &amp;lt;em&amp;gt;zone&amp;lt;/em&amp;gt; parameter is bound 
&lt;br&gt;+				every change of the Select's value causes an ajax request. In this case the Select component publishes the event &amp;lt;em&amp;gt;valuechanged&amp;lt;/em&amp;gt; which can 
&lt;br&gt;+				be used to provide the &amp;lt;em&amp;gt;model&amp;lt;/em&amp;gt; for the second Select component.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; 	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;source&amp;gt;&amp;lt;![CDATA[ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;+&amp;lt;html xmlns:t=&amp;quot;&lt;a href=&quot;http://tapestry.apache.org/schema/tapestry_5_1_0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestry.apache.org/schema/tapestry_5_1_0.xsd&lt;/a&gt;&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;lt;t:form&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;t:errors /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;t:select t:id=&amp;quot;carMaker&amp;quot; validate=&amp;quot;required&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; model=&amp;quot;makeModel&amp;quot; zone=&amp;quot;modelZone&amp;quot; encoder=&amp;quot;makeEncoder&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:zone t:id=&amp;quot;modelZone&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;t:if test=&amp;quot;carMaker&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:delegate to=&amp;quot;modelBlock&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/t:if&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/t:zone&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:block id=&amp;quot;modelBlock&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:select t:id=&amp;quot;carModel&amp;quot; model=&amp;quot;availableModels&amp;quot; validate=&amp;quot;required&amp;quot;/&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/t:block&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;t:submit value=&amp;quot;literal:Submit&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/p&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;lt;/t:form&amp;gt;
&lt;br&gt;+
&lt;br&gt;+&amp;lt;/html&amp;gt;]]&amp;gt;&amp;lt;/source&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/subsection&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;&amp;lt;subsection name=&amp;quot;SelectZoneDemo.java&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;		The event handler method for the event &amp;lt;em&amp;gt;valuechanged&amp;lt;/em&amp;gt; is used to provide the available car models of the currently selected car maker.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;		The new Select's value is passed as context. 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;source&amp;gt;&amp;lt;![CDATA[ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;+public class SelectZoneDemo
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; @Inject
&lt;br&gt;+ &amp;nbsp; private Messages messages;
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; @Property
&lt;br&gt;+ &amp;nbsp; @Persist
&lt;br&gt;+ &amp;nbsp; private CarMaker carMaker;
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; @Property
&lt;br&gt;+ &amp;nbsp; @Persist
&lt;br&gt;+ &amp;nbsp; private String carModel;
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; @Inject
&lt;br&gt;+ &amp;nbsp; @Property
&lt;br&gt;+ &amp;nbsp; private Block modelBlock;
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; @Property
&lt;br&gt;+ &amp;nbsp; @Persist
&lt;br&gt;+ &amp;nbsp; private List&amp;lt;String&amp;gt; availableModels;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public Object onValueChanged(final CarMaker maker) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; availableModels = findAvailableModels(maker);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; return this.modelBlock;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;String&amp;gt; findAvailableModels(final CarMaker maker) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (maker) 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case AUDI:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(&amp;quot;A4&amp;quot;, &amp;quot;A6&amp;quot;, &amp;quot;A8&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case BMW:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(&amp;quot;3 Series&amp;quot;, &amp;quot;5 Series&amp;quot;, &amp;quot;7 Series&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case MERCEDES:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(&amp;quot;C-Class&amp;quot;, &amp;quot;E-Class&amp;quot;, &amp;quot;S-Class&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SelectModel getMakeModel()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; return new EnumSelectModel(CarMaker.class, this.messages);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ValueEncoder&amp;lt;CarMaker&amp;gt; getMakeEncoder() 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; return new EnumValueEncoder&amp;lt;CarMaker&amp;gt;(CarMaker.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}]]&amp;gt;&amp;lt;/source&amp;gt;
&lt;br&gt;+
&lt;br&gt;+			&amp;lt;/subsection&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/section&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/body&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;/document&amp;gt;
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -763,6 +763,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;linkZone : function(element, zoneId, url)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	Tapestry.Initializer.updateZoneOnEvent(&amp;quot;click&amp;quot;, element, zoneId, url);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;},
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;updateZoneOnEvent : function(eventName, element, zoneId, url)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;element = $(element);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Update the element with the id of zone div. This may be changed dynamically on the client
&lt;br&gt;@@ -799,17 +804,24 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Otherwise, assume it's just an ordinary link.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Otherwise, assume it's just an ordinary link or input field.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;element.observe(&amp;quot;click&amp;quot;, function(event)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;element.observe(eventName, function(event)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Event.stop(event);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var zoneObject = Tapestry.findZoneManager(element);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!zoneObject) return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var newUrl = url;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(element.tagName == &amp;quot;SELECT&amp;quot; &amp;&amp; element.value)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	newUrl+='&amp;t:selectvalue='+element.value;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;zoneObject.updateFromURL(url);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;zoneObject.updateFromURL(newUrl);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;},
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/SelectZoneDemo.tml
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/SelectZoneDemo.tml?rev=833928&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/SelectZoneDemo.tml?rev=833928&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/SelectZoneDemo.tml (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/SelectZoneDemo.tml Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -0,0 +1,30 @@
&lt;br&gt;+&amp;lt;t:border xmlns:t=&amp;quot;&lt;a href=&quot;http://tapestry.apache.org/schema/tapestry_5_1_0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestry.apache.org/schema/tapestry_5_1_0.xsd&lt;/a&gt;&amp;quot;&amp;gt;
&lt;br&gt;+	&amp;lt;p&amp;gt;Car Maker: ${carMaker}&amp;lt;/p&amp;gt;
&lt;br&gt;+	&amp;lt;p&amp;gt;Car Model: ${carModel}&amp;lt;/p&amp;gt;
&lt;br&gt;+	&amp;lt;t:form&amp;gt;
&lt;br&gt;+		&amp;lt;p&amp;gt;
&lt;br&gt;+			&amp;lt;t:errors /&amp;gt;
&lt;br&gt;+		&amp;lt;/p&amp;gt;
&lt;br&gt;+		&amp;lt;p&amp;gt;
&lt;br&gt;+			&amp;lt;t:select t:id=&amp;quot;carMaker&amp;quot; validate=&amp;quot;required&amp;quot;
&lt;br&gt;+				model=&amp;quot;makeModel&amp;quot; zone=&amp;quot;modelZone&amp;quot; encoder=&amp;quot;makeEncoder&amp;quot; /&amp;gt;
&lt;br&gt;+		&amp;lt;/p&amp;gt;
&lt;br&gt;+
&lt;br&gt;+		&amp;lt;t:zone t:id=&amp;quot;modelZone&amp;quot;&amp;gt;
&lt;br&gt;+			&amp;lt;t:if test=&amp;quot;carMaker&amp;quot;&amp;gt;
&lt;br&gt;+				&amp;lt;t:delegate to=&amp;quot;modelBlock&amp;quot; /&amp;gt;
&lt;br&gt;+			&amp;lt;/t:if&amp;gt;
&lt;br&gt;+		&amp;lt;/t:zone&amp;gt;
&lt;br&gt;+
&lt;br&gt;+		&amp;lt;t:block id=&amp;quot;modelBlock&amp;quot;&amp;gt;
&lt;br&gt;+			&amp;lt;p id=&amp;quot;carModelContainer&amp;quot;&amp;gt;
&lt;br&gt;+				&amp;lt;t:select t:id=&amp;quot;carModel&amp;quot; model=&amp;quot;availableModels&amp;quot; validate=&amp;quot;required&amp;quot; blankOption=&amp;quot;always&amp;quot; /&amp;gt;
&lt;br&gt;+			&amp;lt;/p&amp;gt;
&lt;br&gt;+		&amp;lt;/t:block&amp;gt;
&lt;br&gt;+		
&lt;br&gt;+		&amp;lt;p&amp;gt;
&lt;br&gt;+			&amp;lt;t:submit value=&amp;quot;literal:Submit&amp;quot; /&amp;gt;
&lt;br&gt;+		&amp;lt;/p&amp;gt;
&lt;br&gt;+	&amp;lt;/t:form&amp;gt;
&lt;br&gt;+
&lt;br&gt;+&amp;lt;/t:border&amp;gt;
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -2318,6 +2318,15 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waitForCondition(condition, PAGE_LOAD_TIMEOUT);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void waitForElementToDisappear(String elementId)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String condition = String.format(&amp;quot;selenium.browserbot.getCurrentWindow().$(\&amp;quot;%s\&amp;quot;).hide()&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elementId);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waitForCondition(condition, PAGE_LOAD_TIMEOUT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;@@ -3173,4 +3182,47 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertText(&amp;quot;eventfired&amp;quot;, &amp;quot;true&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * TAP5-138
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void select_zone()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;start(&amp;quot;Select Zone Demo&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type(&amp;quot;carMaker&amp;quot;, &amp;quot;BMW&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waitForElementToAppear(&amp;quot;carModelContainer&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;click(SUBMIT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String condition = String.format(&amp;quot;selenium.browserbot.getCurrentWindow().$$(\&amp;quot;%s\&amp;quot;)&amp;quot;, &amp;quot;t-error-popup&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waitForCondition(condition, PAGE_LOAD_TIMEOUT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertText(String.format(&amp;quot;//div[@class='%s']/span&amp;quot;, &amp;quot;t-error-popup&amp;quot;), &amp;quot;You must provide a value for Car Model.&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type(&amp;quot;carModel&amp;quot;, &amp;quot;7 Series&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clickAndWait(SUBMIT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTextPresent(&amp;quot;Car Maker: BMW&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTextPresent(&amp;quot;Car Model: 7 Series&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waitForElementToDisappear(&amp;quot;carModelContainer&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type(&amp;quot;carMaker&amp;quot;, &amp;quot;MERCEDES&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waitForElementToAppear(&amp;quot;carModelContainer&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type(&amp;quot;carModel&amp;quot;, &amp;quot;E-Class&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clickAndWait(SUBMIT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTextPresent(&amp;quot;Car Maker: MERCEDES&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTextPresent(&amp;quot;Car Model: E-Class&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java?rev=833928&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java?rev=833928&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -0,0 +1,19 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+package org.apache.tapestry5.integration.app1.data;
&lt;br&gt;+
&lt;br&gt;+public enum CarMaker
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;MERCEDES, AUDI, BMW;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java
&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;&amp;nbsp; &amp;nbsp; svn:eol-style = native
&lt;br&gt;&lt;br&gt;Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/CarMaker.java
&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;&amp;nbsp; &amp;nbsp; svn:mime-type = text/plain
&lt;br&gt;&lt;br&gt;Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=833928&amp;r1=833927&amp;r2=833928&amp;view=diff&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java (original)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -387,9 +387,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Item(&amp;quot;BeanEditCalendarDemo&amp;quot;, &amp;quot;BeanEditor / Calendar Demo&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;Use of calendar properties inside BeanEditor and BeanDisplay&amp;quot;),
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new Item(&amp;quot;TriggerDemo&amp;quot;, &amp;quot;Trigger Demo&amp;quot;,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Use of Trigger component&amp;quot;),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Item(&amp;quot;ImageSubmitDemo&amp;quot;, &amp;quot;Submit with an Image Demo&amp;quot;, &amp;quot;Make sure that submit with the image parameter set triggers the 'selected' event.&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Item(&amp;quot;TriggerDemo&amp;quot;, &amp;quot;Trigger Demo&amp;quot;, &amp;quot;Use of Trigger component&amp;quot;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Item(&amp;quot;ImageSubmitDemo&amp;quot;, &amp;quot;Submit with an Image Demo&amp;quot;, &amp;quot;Make sure that submit with the image parameter set triggers the 'selected' event.&amp;quot;),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Item(&amp;quot;SelectZoneDemo&amp;quot;, &amp;quot;Select Zone Demo&amp;quot;, &amp;quot;Use a Select component to update a zone.&amp;quot;)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java
&lt;br&gt;URL: &lt;a href=&quot;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java?rev=833928&amp;view=auto&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java?rev=833928&amp;view=auto&lt;/a&gt;&lt;br&gt;==============================================================================
&lt;br&gt;--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java (added)
&lt;br&gt;+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java Sun Nov &amp;nbsp;8 21:16:52 2009
&lt;br&gt;@@ -0,0 +1,84 @@
&lt;br&gt;+// Copyright 2009 The Apache Software Foundation
&lt;br&gt;+//
&lt;br&gt;+// Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
&lt;br&gt;+// you may not use this file except in compliance with the License.
&lt;br&gt;+// You may obtain a copy of the License at
&lt;br&gt;+//
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+//
&lt;br&gt;+// Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+// distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
&lt;br&gt;+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&lt;br&gt;+// See the License for the specific language governing permissions and
&lt;br&gt;+// limitations under the License.
&lt;br&gt;+package org.apache.tapestry5.integration.app1.pages;
&lt;br&gt;+
&lt;br&gt;+import java.util.Arrays;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.apache.tapestry5.Block;
&lt;br&gt;+import org.apache.tapestry5.SelectModel;
&lt;br&gt;+import org.apache.tapestry5.ValueEncoder;
&lt;br&gt;+import org.apache.tapestry5.annotations.Persist;
&lt;br&gt;+import org.apache.tapestry5.annotations.Property;
&lt;br&gt;+import org.apache.tapestry5.integration.app1.data.CarMaker;
&lt;br&gt;+import org.apache.tapestry5.ioc.Messages;
&lt;br&gt;+import org.apache.tapestry5.ioc.annotations.Inject;
&lt;br&gt;+import org.apache.tapestry5.util.EnumSelectModel;
&lt;br&gt;+import org.apache.tapestry5.util.EnumValueEncoder;
&lt;br&gt;+
&lt;br&gt;+public class SelectZoneDemo
&lt;br&gt;+{
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Messages messages;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Property
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Persist
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private CarMaker carMaker;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Property
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Persist
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String carModel;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Inject
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Property
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Block modelBlock;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Property
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Persist
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private List&amp;lt;String&amp;gt; availableModels;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public Object onValueChanged(final CarMaker maker)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;availableModels = findAvailableModels(maker);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this.modelBlock;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;String&amp;gt; findAvailableModels(final CarMaker maker)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (maker)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case AUDI:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(&amp;quot;A4&amp;quot;, &amp;quot;A6&amp;quot;, &amp;quot;A8&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case BMW:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(&amp;quot;3 Series&amp;quot;, &amp;quot;5 Series&amp;quot;, &amp;quot;7 Series&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case MERCEDES:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList(&amp;quot;C-Class&amp;quot;, &amp;quot;E-Class&amp;quot;, &amp;quot;S-Class&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.asList();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SelectModel getMakeModel()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new EnumSelectModel(CarMaker.class, this.messages);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ValueEncoder&amp;lt;CarMaker&amp;gt; getMakeEncoder()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new EnumValueEncoder&amp;lt;CarMaker&amp;gt;(CarMaker.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java
&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;&amp;nbsp; &amp;nbsp; svn:eol-style = native
&lt;br&gt;&lt;br&gt;Propchange: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectZoneDemo.java
&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;&amp;nbsp; &amp;nbsp; svn:mime-type = text/plain
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/svn-commit%3A-r833928---in--tapestry-tapestry5-trunk-tapestry-core-src%3A-main-java-org-apache-tapestry5--main-java-org-apache-tapestry5-corelib-components--main-resources-org-apache-tapestry5--test-app1--test-java-org-apache-tapestry5-integration--test-ja...-tp26258113p26258113.html" />
</entry>

</feed>
