<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-302</id>
	<title>Nabble - Tapestry</title>
	<updated>2009-11-09T14:12:52Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/Tapestry-f302.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Tapestry-f302.html" />
	<subtitle type="html">Tapestry is a powerful, open-source, all-Java framework for creating leading edge web applications in Java. Jakarta Tapestry home is &lt;a href=&quot;http://jakarta.apache.org/tapestry/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26274666</id>
	<title>Re: GAE and Tapestry5 integration</title>
	<published>2009-11-09T14:12:52Z</published>
	<updated>2009-11-09T14:12:52Z</updated>
	<author>
		<name>sodium</name>
	</author>
	<content type="html">Hi Dmitry,
&lt;br&gt;&lt;br&gt;Thanks for sharing. I tried integrating the Spring in it but it keep spitting out all sorts of errors when its constructing the bean from the applicationContext.xml. Can u share how u integrate Spring in it? I noticed that u r using the Spring 3.x instead.
&lt;br&gt;&lt;br&gt;I tried integrate with TapestrySpringFilter and it seems to be using Spring 2.5.6. So i decided to change your applicationContext.xml schema to 2.5 instead.
&lt;br&gt;&lt;br&gt;Here's my &lt;b&gt;web.xml&lt;/b&gt;&lt;br&gt;&amp;lt;!-- 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;filter&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;filter-name&amp;gt;app&amp;lt;/filter-name&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;filter-class&amp;gt;org.apache.tapestry5.TapestryFilter&amp;lt;/filter-class&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/filter&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; --&amp;gt;
&lt;br&gt;&amp;lt;filter&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;filter-name&amp;gt;app&amp;lt;/filter-name&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;filter-class&amp;gt;org.apache.tapestry5.spring.TapestrySpringFilter&amp;lt;/filter-class&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/filter&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;context-param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;param-value&amp;gt;/WEB-INF/applicationContext.xml&amp;lt;/param-value&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/context-param&amp;gt;
&lt;br&gt;&lt;br&gt;Here's my maven build to include more dependencies from your given applicationContext.xml
&lt;br&gt;&lt;br&gt;&amp;lt;dependency&amp;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;lt;groupId&amp;gt;org.apache.tapestry&amp;lt;/groupId&amp;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;lt;artifactId&amp;gt;tapestry-spring&amp;lt;/artifactId&amp;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;lt;version&amp;gt;${tapestry-release-version}&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;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;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;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;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;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;lt;version&amp;gt;2.5.6&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;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;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;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;lt;artifactId&amp;gt;spring-orm&amp;lt;/artifactId&amp;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;lt;version&amp;gt;2.5.6&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;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;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;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;lt;artifactId&amp;gt;spring-aspects&amp;lt;/artifactId&amp;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;lt;version&amp;gt;2.5.6&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;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;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;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;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;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;lt;version&amp;gt;2.5.6&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;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;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;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;lt;artifactId&amp;gt;spring-aop&amp;lt;/artifactId&amp;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;lt;version&amp;gt;2.5.6&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;
&lt;br&gt;&lt;br&gt;Am i missing out something here? I tried using Tapestry 5.1.0.5 and also the 5.2 built from trunk. 
&lt;br&gt;&lt;br&gt;Here's the &lt;b&gt;error&lt;/b&gt;:
&lt;br&gt;&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class org.apache.tapestry5.ioc.services.TapestryIOCModule
&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class com.kenai.tapestryjpa.JPAModule
&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class com.kenai.tapestryjpa.JPACoreModule
&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class org.apache.tapestry5.spring.SpringModule
&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class org.apache.tapestry5.services.TapestryModule
&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class org.apache.tapestry5.internal.services.InternalModule
&lt;br&gt;[INFO] ioc.RegistryBuilder Adding module definition for class com.myproject.services.AppModule
&lt;br&gt;[INFO] SpringModuleDef.ApplicationContext Starting Spring (version 2.5.6)
&lt;br&gt;[INFO] context.ContextLoader Root WebApplicationContext: initialization started
&lt;br&gt;[INFO] spring.TapestryApplicationContext Refreshing org.apache.tapestry5.spring.TapestryApplicationContext@39060b: display name [Root WebApplicationContext]; startup date [Mon Nov 09 22:03:52 UTC 2009]; root of context hierarchy
&lt;br&gt;[INFO] xml.XmlBeanDefinitionReader Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
&lt;br&gt;[INFO] spring.TapestryApplicationContext Bean factory for application context [org.apache.tapestry5.spring.TapestryApplicationContext@39060b]: org.apache.tapestry5.internal.spring.TapestyBeanFactory@d23e53
&lt;br&gt;[INFO] spring.TapestyBeanFactory Pre-instantiating singletons in org.apache.tapestry5.internal.spring.TapestyBeanFactory@d23e53: defining beans [txAdvice,org.springframework.aop.config.internalAutoProxyCreator,daoOperations,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,entityManagerFactory,txManager,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,personDAO]; root of factory hierarchy
&lt;br&gt;[INFO] jpa.LocalEntityManagerFactoryBean Building JPA EntityManagerFactory for persistence unit 'transactions-optional'
&lt;br&gt;[INFO] DataNucleus.Plugin Bundle &amp;quot;org.datanucleus.jpa&amp;quot; has an optional dependency to &amp;quot;org.datanucleus.enhancer&amp;quot; but it cannot be resolved
&lt;br&gt;[INFO] DataNucleus.Plugin Bundle &amp;quot;org.datanucleus&amp;quot; has an optional dependency to &amp;quot;org.eclipse.equinox.registry&amp;quot; but it cannot be resolved
&lt;br&gt;[INFO] DataNucleus.Plugin Bundle &amp;quot;org.datanucleus&amp;quot; has an optional dependency to &amp;quot;org.eclipse.core.runtime&amp;quot; but it cannot be resolved
&lt;br&gt;[WARN] DataNucleus.JPA No META-INF/persistence.xml files were found in the CLASSPATH of the current thread!
&lt;br&gt;[WARN] DataNucleus.JPA No persistence unit of name &amp;quot;transactions-optional&amp;quot; is found in the CLASSPATH of the current thread!
&lt;br&gt;[INFO] spring.TapestyBeanFactory Destroying singletons in org.apache.tapestry5.internal.spring.TapestyBeanFactory@d23e53: defining beans [txAdvice,org.springframework.aop.config.internalAutoProxyCreator,daoOperations,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,entityManagerFactory,txManager,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,personDAO]; root of factory hierarchy
&lt;br&gt;[ERROR] context.ContextLoader Context initialization failed
&lt;br&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txAdvice': Cannot resolve reference to bean 'txManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.internal.spring.SpringModuleDef$3$1.invoke(SpringModuleDef.java:176)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:941)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.internal.spring.SpringModuleDef$3.createObject(SpringModuleDef.java:166)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:941)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.SingletonServiceLifecycle.createService(SingletonServiceLifecycle.java:29)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.LifecycleWrappedServiceCreator.createObject(LifecycleWrappedServiceCreator.java:46)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.AdvisorStackBuilder.createObject(AdvisorStackBuilder.java:60)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.InterceptorStackBuilder.createObject(InterceptorStackBuilder.java:52)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:60)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:941)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:57)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ConfigurableWebApplicationContext_124daf973a0.delegate($ConfigurableWebApplicationContext_124daf973a0.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ConfigurableWebApplicationContext_124daf973a0.getBeanDefinitionCount($ConfigurableWebApplicationContext_124daf973a0.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.spring.SpringModule$1.initializeApplication(SpringModule.java:53)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ApplicationInitializer_124daf973bb.initializeApplication($ApplicationInitializer_124daf973bb.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.services.TapestryModule$35.initializeApplication(TapestryModule.java:2132)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ApplicationInitializer_124daf973bb.initializeApplication($ApplicationInitializer_124daf973bb.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ApplicationInitializer_124daf973b7.initializeApplication($ApplicationInitializer_124daf973b7.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.services.TapestryModule$ServletApplicationInitializerTerminator.initializeApplication(TapestryModule.java:223)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ServletApplicationInitializer_124daf9739b.initializeApplication($ServletApplicationInitializer_124daf9739b.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.TapestryFilter.init(TapestryFilter.java:85)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:99)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:589)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.servlet.Context.startContext(Context.java:139)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.Server.doStart(Server.java:217)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:181)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:116)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:217)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:162)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerMain.&amp;lt;init&amp;gt;(DevAppServerMain.java:113)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
&lt;br&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 69 more
&lt;br&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 82 more
&lt;br&gt;Caused by: javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at javax.persistence.Persistence.createFactory(Persistence.java:176)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:112)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:91)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 92 more
&lt;br&gt;Caused by: java.lang.NullPointerException
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.jpa.EntityManagerFactoryImpl.initialisePMF(EntityManagerFactoryImpl.java:452)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.jpa.EntityManagerFactoryImpl.&amp;lt;init&amp;gt;(EntityManagerFactoryImpl.java:355)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.store.appengine.jpa.DatastoreEntityManagerFactory.&amp;lt;init&amp;gt;(DatastoreEntityManagerFactory.java:63)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider.createEntityManagerFactory(DatastorePersistenceProvider.java:35)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at javax.persistence.Persistence.createFactory(Persistence.java:172)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 97 more
&lt;br&gt;[ERROR] ioc.Registry Error creating bean with name 'txAdvice': Cannot resolve reference to bean 'txManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;[ERROR] ioc.Registry Operations trace:
&lt;br&gt;[ERROR] ioc.Registry [ 1] Realizing service ApplicationContext
&lt;br&gt;[ERROR] ioc.Registry [ 2] Invoking ObjectCreator for Spring ApplicationContext
&lt;br&gt;[ERROR] ioc.Registry [ 3] Creating Spring ApplicationContext via ContextLoader
&lt;br&gt;[ERROR] SpringModuleDef.ApplicationContext Construction of service ApplicationContext failed: Error creating bean with name 'txAdvice': Cannot resolve reference to bean 'txManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;org.apache.tapestry5.ioc.internal.OperationException: Error creating bean with name 'txAdvice': Cannot resolve reference to bean 'txManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:90)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:941)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.internal.spring.SpringModuleDef$3.createObject(SpringModuleDef.java:166)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:941)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.SingletonServiceLifecycle.createService(SingletonServiceLifecycle.java:29)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.LifecycleWrappedServiceCreator.createObject(LifecycleWrappedServiceCreator.java:46)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.AdvisorStackBuilder.createObject(AdvisorStackBuilder.java:60)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.InterceptorStackBuilder.createObject(InterceptorStackBuilder.java:52)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:60)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:941)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:57)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ConfigurableWebApplicationContext_124daf973a0.delegate($ConfigurableWebApplicationContext_124daf973a0.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ConfigurableWebApplicationContext_124daf973a0.getBeanDefinitionCount($ConfigurableWebApplicationContext_124daf973a0.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.spring.SpringModule$1.initializeApplication(SpringModule.java:53)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ApplicationInitializer_124daf973bb.initializeApplication($ApplicationInitializer_124daf973bb.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.services.TapestryModule$35.initializeApplication(TapestryModule.java:2132)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ApplicationInitializer_124daf973bb.initializeApplication($ApplicationInitializer_124daf973bb.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ApplicationInitializer_124daf973b7.initializeApplication($ApplicationInitializer_124daf973b7.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.services.TapestryModule$ServletApplicationInitializerTerminator.initializeApplication(TapestryModule.java:223)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at $ServletApplicationInitializer_124daf9739b.initializeApplication($ServletApplicationInitializer_124daf9739b.java)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.TapestryFilter.init(TapestryFilter.java:85)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:99)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:589)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.servlet.Context.startContext(Context.java:139)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.jetty.Server.doStart(Server.java:217)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:181)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:116)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:217)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:162)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerMain.&amp;lt;init&amp;gt;(DevAppServerMain.java:113)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
&lt;br&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txAdvice': Cannot resolve reference to bean 'txManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.internal.spring.SpringModuleDef$3$1.invoke(SpringModuleDef.java:176)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:68)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 50 more
&lt;br&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 69 more
&lt;br&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 82 more
&lt;br&gt;Caused by: javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at javax.persistence.Persistence.createFactory(Persistence.java:176)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:112)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:91)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 92 more
&lt;br&gt;Caused by: java.lang.NullPointerException
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.jpa.EntityManagerFactoryImpl.initialisePMF(EntityManagerFactoryImpl.java:452)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.jpa.EntityManagerFactoryImpl.&amp;lt;init&amp;gt;(EntityManagerFactoryImpl.java:355)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.store.appengine.jpa.DatastoreEntityManagerFactory.&amp;lt;init&amp;gt;(DatastoreEntityManagerFactory.java:63)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider.createEntityManagerFactory(DatastorePersistenceProvider.java:35)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; at javax.persistence.Persistence.createFactory(Persistence.java:172)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ... 97 more
&lt;br&gt;The server is running at &lt;a href=&quot;http://localhost:8080/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://localhost:8080/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;Dmitry Gusev wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message shrinkable-quote&quot;&gt;Here's some examples:
&lt;br&gt;&lt;br&gt;*ping-service\src\META-INF\persistence.xml:*
&lt;br&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;
&lt;br&gt;&amp;lt;persistence xmlns=&amp;quot;&lt;a href=&quot;http://java.sun.com/xml/ns/persistence&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://java.sun.com/xml/ns/persistence&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xmlns:xsi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xsi:schemaLocation=&amp;quot;&lt;a href=&quot;http://java.sun.com/xml/ns/persistence&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://java.sun.com/xml/ns/persistence&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&lt;/a&gt;&amp;quot;
&lt;br&gt;version=&amp;quot;1.0&amp;quot;&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;persistence-unit name=&amp;quot;transactions-optional&amp;quot;&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;lt;provider&amp;gt;org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider&amp;lt;/provider&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;properties&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;datanucleus.NontransactionalRead&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;datanucleus.NontransactionalWrite&amp;quot;
&lt;br&gt;value=&amp;quot;true&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;datanucleus.ConnectionURL&amp;quot; value=&amp;quot;appengine&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/properties&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/persistence-unit&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;lt;/persistence&amp;gt;
&lt;br&gt;&lt;br&gt;*ping-service\war\WEB-INF\applicationContext.xml:*
&lt;br&gt;&lt;br&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&lt;br&gt;&amp;lt;beans xmlns=&amp;quot;&lt;a href=&quot;http://www.springframework.org/schema/beans&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/beans&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xsi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:aop=&amp;quot;&lt;a href=&quot;http://www.springframework.org/schema/aop&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/aop&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:tx=&amp;quot;&lt;a href=&quot;http://www.springframework.org/schema/tx&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/tx&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:context=&amp;quot;&lt;a href=&quot;http://www.springframework.org/schema/context&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/context&lt;/a&gt;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xsi:schemaLocation=&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/beans&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/beans&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/tx&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/tx&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/aop&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/aop&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/context&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/context&lt;/a&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.springframework.org/schema/context/spring-context-3.0.xsd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;/a&gt;&lt;br&gt;&amp;quot;&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;tx:advice id=&amp;quot;txAdvice&amp;quot; transaction-manager=&amp;quot;txManager&amp;quot;&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tx:attributes&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tx:method name=&amp;quot;*&amp;quot; propagation=&amp;quot;REQUIRES_NEW&amp;quot; /&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tx:attributes&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/tx:advice&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;aop:config&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;aop:pointcut id=&amp;quot;daoOperations&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; expression=&amp;quot;execution(* dmitrygusev.ping.services.dao.*.*(..))&amp;quot;
&lt;br&gt;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;aop:advisor advice-ref=&amp;quot;txAdvice&amp;quot; pointcut-ref=&amp;quot;daoOperations&amp;quot; /&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/aop:config&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean id=&amp;quot;entityManagerFactory&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; class=&amp;quot;org.springframework.orm.jpa.LocalEntityManagerFactoryBean&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lazy-init=&amp;quot;true&amp;quot;&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;persistenceUnitName&amp;quot; value=&amp;quot;transactions-optional&amp;quot;
&lt;br&gt;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/bean&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean name=&amp;quot;txManager&amp;quot;
&lt;br&gt;class=&amp;quot;org.springframework.orm.jpa.JpaTransactionManager&amp;quot;&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;entityManagerFactory&amp;quot; ref=&amp;quot;entityManagerFactory&amp;quot; /&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/bean&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;context:annotation-config/&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean name=&amp;quot;jobsDAO&amp;quot;
&lt;br&gt;class=&amp;quot;dmitrygusev.ping.services.dao.impl.JobDAOImpl&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean name=&amp;quot;refDAO&amp;quot;
&lt;br&gt;class=&amp;quot;dmitrygusev.ping.services.dao.impl.RefDAOImpl&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean name=&amp;quot;accountDAO&amp;quot;
&lt;br&gt;class=&amp;quot;dmitrygusev.ping.services.dao.impl.AccountDAOImpl&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean name=&amp;quot;scheduleDAO&amp;quot;
&lt;br&gt;class=&amp;quot;dmitrygusev.ping.services.dao.impl.ScheduleDAOImpl&amp;quot;/&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;lt;bean name=&amp;quot;jobResultDAO&amp;quot;
&lt;br&gt;class=&amp;quot;dmitrygusev.ping.services.dao.impl.JobResultDAOImpl&amp;quot;/&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;lt;/beans&amp;gt;
&lt;br&gt;&lt;br&gt;*ping-service\src\dmitrygusev\ping\services\dao\ScheduleDAO.java :*
&lt;br&gt;package dmitrygusev.ping.services.dao;
&lt;br&gt;&lt;br&gt;import com.google.appengine.api.datastore.Key;
&lt;br&gt;&lt;br&gt;import dmitrygusev.ping.entities.Schedule;
&lt;br&gt;&lt;br&gt;public interface ScheduleDAO {
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; public abstract void update(Schedule schedule);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; public abstract void delete(Long id);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; public abstract Schedule createSchedule(String name);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; public abstract Schedule find(Key scheduleKey);
&lt;br&gt;&lt;br&gt;}
&lt;br&gt;&lt;br&gt;*ping-service\src\dmitrygusev\ping\services\dao\impl\ScheduleDAOImpl.java :*
&lt;br&gt;package dmitrygusev.ping.services.dao.impl;
&lt;br&gt;&lt;br&gt;import static com.google.appengine.api.datastore.KeyFactory.createKey;
&lt;br&gt;&lt;br&gt;import javax.persistence.EntityManager;
&lt;br&gt;import javax.persistence.PersistenceContext;
&lt;br&gt;&lt;br&gt;import com.google.appengine.api.datastore.Key;
&lt;br&gt;&lt;br&gt;import dmitrygusev.ping.entities.Schedule;
&lt;br&gt;import dmitrygusev.ping.services.dao.ScheduleDAO;
&lt;br&gt;&lt;br&gt;public class ScheduleDAOImpl implements ScheduleDAO {
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; @PersistenceContext
&lt;br&gt;&amp;nbsp; &amp;nbsp; private EntityManager em;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; public Schedule createSchedule(String name) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Schedule schedule = new Schedule();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; schedule.setName(name);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; em.persist(schedule);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return schedule;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; @Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; public void update(Schedule schedule) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; em.merge(schedule);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; @Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; public void delete(Long id) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Schedule schedule = find(createKey(Schedule.class.getSimpleName(),
&lt;br&gt;id));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; em.remove(schedule);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; @Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; public Schedule find(Key scheduleKey) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return em.find(Schedule.class, scheduleKey);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;*Then inject ScheduleDAO in your page class using T5's @Inject annotation
&lt;br&gt;and use it.*
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;On Sun, Nov 8, 2009 at 17:46, Dmitry Gusev &amp;lt;dmitry.gusev@gmail.com&amp;gt; wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; Tapestry 5.1 should run on GAE 1.2.6(7) as is.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I used T5.1 w/ Spring/JPA on GAE and didn't get any troubles at the cloud
&lt;br&gt;&amp;gt; except some issues on development machine:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://dmitrygusev.blogspot.com/2009/10/develope-java-applications-with-gae-sdk.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://dmitrygusev.blogspot.com/2009/10/develope-java-applications-with-gae-sdk.html&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://dmitrygusev.blogspot.com/2009/08/turn-java-security-manager-off-in.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://dmitrygusev.blogspot.com/2009/08/turn-java-security-manager-off-in.html&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Sun, Nov 8, 2009 at 16:51, sodium &amp;lt;sodium78@yahoo.com&amp;gt; wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I have been using Tapestry5 for few of my projects and loving it, but i am
&lt;br&gt;&amp;gt;&amp;gt; thinking of integrating it in Google App Engine.
&lt;br&gt;&amp;gt;&amp;gt; As for Tapestry 5.0.18, i have managed to run it without jpa support by
&lt;br&gt;&amp;gt;&amp;gt; following an example of
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/SUCCESSFULL-deploy-Tapestry5-on-google-appengine-ts23018048.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/SUCCESSFULL-deploy-Tapestry5-on-google-appengine-ts23018048.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/SUCCESSFULL-deploy-Tapestry5-on-google-appengine-ts23018048.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/SUCCESSFULL-deploy-Tapestry5-on-google-appengine-ts23018048.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; For Tapestry5.1, i still very confused about
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/Tapestry-5.1-running-in-Google-App-Engine-%28GAE%29-tp24923950p24927028.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/Tapestry-5.1-running-in-Google-App-Engine-%28GAE%29-tp24923950p24927028.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/Tapestry-5.1-running-in-Google-App-Engine-%28GAE%29-tp24923950p24927028.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/Tapestry-5.1-running-in-Google-App-Engine-%28GAE%29-tp24923950p24927028.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Actually my biggest concern is using jpa in GAE with Tapestry5, can anyone
&lt;br&gt;&amp;gt;&amp;gt; provide some clues on how to go about integrating Tap5 with jpa for GAE ?
&lt;br&gt;&amp;gt;&amp;gt; If
&lt;br&gt;&amp;gt;&amp;gt; someone can provide a sample project for GAE(1.2.6) Tapestry5(hopefully
&lt;br&gt;&amp;gt;&amp;gt; 5.1)
&lt;br&gt;&amp;gt;&amp;gt; integration with jpa support, i will definitely bow down to u like a
&lt;br&gt;&amp;gt;&amp;gt; slave.
&lt;br&gt;&amp;gt;&amp;gt; Been scratching my head so hard that my hair is starting to fall...
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I tried integration Tapestry 5.0.18 with guice2 for jpa support from
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/Integration-of-T5-with-the-domain-model-ts9953748s302.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/Integration-of-T5-with-the-domain-model-ts9953748s302.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/Integration-of-T5-with-the-domain-model-ts9953748s302.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/Integration-of-T5-with-the-domain-model-ts9953748s302.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; but the EntityManager keep returning null. Sigh..
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Any pointers and advice is very much appreciated.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; --
&lt;br&gt;&amp;gt;&amp;gt; View this message in context:
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/GAE-and-Tapestry5-integration-tp26253952p26253952.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/GAE-and-Tapestry5-integration-tp26253952p26253952.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; Sent from the Tapestry - User mailing list archive at Nabble.com.
&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;&amp;gt; To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
&lt;br&gt;&amp;gt;&amp;gt; For additional commands, e-mail: users-help@tapestry.apache.org
&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; Dmitry Gusev
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; AnjLab Team
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://anjlab.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://anjlab.com&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Dmitry Gusev
&lt;br&gt;&lt;br&gt;AnjLab Team
&lt;br&gt;&lt;a href=&quot;http://anjlab.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://anjlab.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/GAE-and-Tapestry5-integration-tp26253952s302p26274666.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26274573</id>
	<title>Re: Problem with ComponentResources.getElementName()?</title>
	<published>2009-11-09T14:06:24Z</published>
	<updated>2009-11-09T14:06:24Z</updated>
	<author>
		<name>Howard Lewis Ship</name>
	</author>
	<content type="html">Looks like a bug .... with a tricky fix.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 4:28 AM, Alfie Kirkpatrick
&lt;br&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274573&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Alfie.Kirkpatrick@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; This call appears to remove any namespace information, so the following
&lt;br&gt;&amp;gt; are not equivalent:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                &amp;lt;t:mycomponent element=&amp;quot;ns:something&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;                &amp;lt;ns:something t:type=&amp;quot;mycomponent&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In the first case the element parameter is &amp;quot;ns:something&amp;quot;. In the second
&lt;br&gt;&amp;gt; case calling getElementName() returns 'something' without the namespace.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Is this intentional?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thanks, Alfie.
&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;/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=26274573&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274573&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Problem-with-ComponentResources.getElementName%28%29--tp26265704s302p26274573.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26274446</id>
	<title>Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T13:57:25Z</published>
	<updated>2009-11-09T13:57:25Z</updated>
	<author>
		<name>Michael Gentry-2</name>
	</author>
	<content type="html">I thought I had been through most of the site, but I had never seen
&lt;br&gt;the shadow services page.
&lt;br&gt;&lt;br&gt;Thanks for the link, Howard!
&lt;br&gt;&lt;br&gt;mrg
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 4:43 PM, Howard Lewis Ship &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274446&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hlship@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; You know how you can inject the Request?  Well the Request service is
&lt;br&gt;&amp;gt; really an extension of the per-thread RequestGlobals object, which
&lt;br&gt;&amp;gt; stores the Request and Response.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Turns out, Tapestry can implement this approach for you automatically;
&lt;br&gt;&amp;gt; creating a proxy object that delegates all of its method invocations
&lt;br&gt;&amp;gt; to another object (accessed as a property of some known service or
&lt;br&gt;&amp;gt; object).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; There's a few special builders used for edge cases like this.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 1:35 PM, Michael Gentry &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274446&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mgentry@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; Shadow builders?  I've only been using T5 for about 2 months now.
&lt;br&gt;&amp;gt;&amp;gt; When do I learn about shadow builders?  :-)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://tapestry.apache.org/tapestry5.1/tapestry-ioc/shadow.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestry.apache.org/tapestry5.1/tapestry-ioc/shadow.html&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; mrg
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Sat, Nov 7, 2009 at 4:34 PM, Carl Crowder &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274446&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;carl.crowder@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Agreed: the main thing Tapestry is lacking is a book that explains not just
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; the basics but also concepts that it takes months of working with Tapestry
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; to discover. Things like shadow builders and so on. I don't care who writes
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; one as long as there's a definitive guide!
&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=26274446&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274446&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; Howard M. Lewis Ship
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Creator of Apache Tapestry
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The source for Tapestry training, mentoring and support. Contact me to
&lt;br&gt;&amp;gt; learn how I can get you up and productive in Tapestry fast!
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; (971) 678-5210
&lt;br&gt;&amp;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;&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=26274446&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274446&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&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=26274446&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274446&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26274446.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26274347</id>
	<title>Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T13:50:35Z</published>
	<updated>2009-11-09T13:50:35Z</updated>
	<author>
		<name>Michael Gentry-2</name>
	</author>
	<content type="html">I think documentation and small/focused cookbook-type examples (thank
&lt;br&gt;goodness for JumpStart) are the biggest hurdle to people learning and
&lt;br&gt;using T5 currently. &amp;nbsp;(At least that is my experience.) &amp;nbsp;The user
&lt;br&gt;community and framework are robust, but figuring out how to do
&lt;br&gt;something can be challenging at times (even when searching the mailing
&lt;br&gt;list).
&lt;br&gt;&lt;br&gt;I'm not exactly sure what the motivation for writing a book would be.
&lt;br&gt;Maybe you want to make some money off of it or use it as a marketing
&lt;br&gt;tool (developers can tell their PHBs there is a Tapestry book)? &amp;nbsp;My
&lt;br&gt;personal preference would be to have good documentation at
&lt;br&gt;tapestry.apache.org -- something that can be updated (paper dates
&lt;br&gt;itself quickly, especially when Tapestry 5.2.0.24 comes out) and is
&lt;br&gt;searchable (Google is my brain these days). &amp;nbsp;Maybe even have it as a
&lt;br&gt;downloadable PDF that people can put on digital readers. &amp;nbsp;My hope for
&lt;br&gt;you (and us) would be that with good documentation (including
&lt;br&gt;examples/tutorials) and marketing, more developers would come, and a
&lt;br&gt;larger developer base could increase your consulting business.
&lt;br&gt;&lt;br&gt;As for a 5.2 release, it is important, but not as important as good
&lt;br&gt;documentation at this point. &amp;nbsp;At least that's my opinion. &amp;nbsp;You could
&lt;br&gt;even do a few bug-fix releases (5.1.0.x) before 5.2 while working on
&lt;br&gt;the documentation/book.
&lt;br&gt;&lt;br&gt;Thanks!
&lt;br&gt;&lt;br&gt;mrg
&lt;br&gt;&lt;br&gt;PS. I also think having fragmented documentation (the web site, the
&lt;br&gt;wiki, etc) makes things harder to find, too.
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Sat, Nov 7, 2009 at 1:11 PM, Howard &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274347&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hlship@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; [lots of things about books and coding]
&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=26274347&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274347&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26274347.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26274242</id>
	<title>Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T13:44:03Z</published>
	<updated>2009-11-09T13:44:03Z</updated>
	<author>
		<name>Thiago H. de Paula Figueiredo</name>
	</author>
	<content type="html">Em Mon, 09 Nov 2009 19:35:09 -0200, Michael Gentry &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274242&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mgentry@...&lt;/a&gt;&amp;gt; &amp;nbsp;
&lt;br&gt;escreveu:
&lt;br&gt;&lt;br&gt;&amp;gt; Shadow builders? &amp;nbsp;I've only been using T5 for about 2 months now.
&lt;br&gt;&amp;gt; When do I learn about shadow builders? &amp;nbsp;:-)
&lt;br&gt;&lt;br&gt;The documentation is here. The concept is simple. :)
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Thiago H. de Paula Figueiredo
&lt;br&gt;Independent Java, Apache Tapestry 5 and Hibernate consultant, developer, &amp;nbsp;
&lt;br&gt;and instructor
&lt;br&gt;Owner, software architect and developer, Ars Machina Tecnologia da &amp;nbsp;
&lt;br&gt;Informação Ltda.
&lt;br&gt;&lt;a href=&quot;http://www.arsmachina.com.br&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.arsmachina.com.br&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=26274242&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274242&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26274242.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26274231</id>
	<title>Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T13:43:17Z</published>
	<updated>2009-11-09T13:43:17Z</updated>
	<author>
		<name>Howard Lewis Ship</name>
	</author>
	<content type="html">You know how you can inject the Request? &amp;nbsp;Well the Request service is
&lt;br&gt;really an extension of the per-thread RequestGlobals object, which
&lt;br&gt;stores the Request and Response.
&lt;br&gt;&lt;br&gt;Turns out, Tapestry can implement this approach for you automatically;
&lt;br&gt;creating a proxy object that delegates all of its method invocations
&lt;br&gt;to another object (accessed as a property of some known service or
&lt;br&gt;object).
&lt;br&gt;&lt;br&gt;There's a few special builders used for edge cases like this.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 1:35 PM, Michael Gentry &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274231&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mgentry@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; Shadow builders?  I've only been using T5 for about 2 months now.
&lt;br&gt;&amp;gt; When do I learn about shadow builders?  :-)
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://tapestry.apache.org/tapestry5.1/tapestry-ioc/shadow.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tapestry.apache.org/tapestry5.1/tapestry-ioc/shadow.html&lt;/a&gt;&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; mrg
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Sat, Nov 7, 2009 at 4:34 PM, Carl Crowder &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274231&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;carl.crowder@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; Agreed: the main thing Tapestry is lacking is a book that explains not just
&lt;br&gt;&amp;gt;&amp;gt; the basics but also concepts that it takes months of working with Tapestry
&lt;br&gt;&amp;gt;&amp;gt; to discover. Things like shadow builders and so on. I don't care who writes
&lt;br&gt;&amp;gt;&amp;gt; one as long as there's a definitive guide!
&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=26274231&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274231&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274231&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274231&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26274231.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26274117</id>
	<title>Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T13:35:09Z</published>
	<updated>2009-11-09T13:35:09Z</updated>
	<author>
		<name>Michael Gentry-2</name>
	</author>
	<content type="html">Shadow builders? &amp;nbsp;I've only been using T5 for about 2 months now.
&lt;br&gt;When do I learn about shadow builders? &amp;nbsp;:-)
&lt;br&gt;&lt;br&gt;mrg
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Sat, Nov 7, 2009 at 4:34 PM, Carl Crowder &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26274117&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;carl.crowder@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; Agreed: the main thing Tapestry is lacking is a book that explains not just
&lt;br&gt;&amp;gt; the basics but also concepts that it takes months of working with Tapestry
&lt;br&gt;&amp;gt; to discover. Things like shadow builders and so on. I don't care who writes
&lt;br&gt;&amp;gt; one as long as there's a definitive guide!
&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=26274117&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26274117&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26274117.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26273998</id>
	<title>Re: Accessing autoconnect-parameter by reference, not by value</title>
	<published>2009-11-09T13:26:37Z</published>
	<updated>2009-11-09T13:26:37Z</updated>
	<author>
		<name>Alexey Hanin</name>
	</author>
	<content type="html">Oh, I finally found what I was doing wrong :) Just misread the
&lt;br&gt;documentation. The parameter bound to the property which is named
&lt;br&gt;exactly as component. In fact only one property can be bound.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 2:14 PM, Alexey Hanin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273998&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gagarin61@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Seriously, guys? Anyone?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Sun, Nov 8, 2009 at 8:55 AM, Alexey Hanin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273998&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gagarin61@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; Hmm... Seems like autoconnect does not work for me as I expect.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I checked in setupRender() inside EditorComponent and found that
&lt;br&gt;&amp;gt;&amp;gt; 'entity' is null, while Page.setupRender() assigns new value to its
&lt;br&gt;&amp;gt;&amp;gt; same named property.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; What am I doing wrong?
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Sat, Nov 7, 2009 at 7:50 PM, Alexey Hanin &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273998&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gagarin61@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Recently I found that autoconnect-parameters are being copied instead
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; of being set as reference to parent parameter.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; What I want is to implement various editor-components containing
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; BeanEditForm accessing parent property.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; class Page {
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  @Property
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  private EntityObject entity;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  void onSuccess() {
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;   // save entity here
&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; }
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; class EditorComponent {
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  @Property
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  @Parameter(autoconnect = true)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  private EntityObject entity;
&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;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Which way do I have to start to dig to?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Alexey.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;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=26273998&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26273998&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Accessing-autoconnect-parameter-by-reference%2C-not-by-value-tp26247031s302p26273998.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26273788</id>
	<title>Re: Complete Sample Tapestry Application</title>
	<published>2009-11-09T13:13:00Z</published>
	<updated>2009-11-09T13:13:00Z</updated>
	<author>
		<name>keykubat</name>
	</author>
	<content type="html">Hello There,
&lt;br&gt;&lt;br&gt;More examples, functional tutorials please...
&lt;br&gt;it is good news that the tutorials will come out...
&lt;br&gt;&lt;br&gt;So that an expansion will occur in user base,&amp; popularity.
&lt;br&gt;&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;Howard Lewis Ship wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message shrinkable-quote&quot;&gt;There's several options.
&lt;br&gt;&lt;br&gt;You can use the Tapestry Quickstart archetype (i.e., maven template).
&lt;br&gt;&lt;br&gt;You can use the Jumpstart which is a more complete application
&lt;br&gt;template &amp; tutorial.
&lt;br&gt;&lt;br&gt;Here's a small example I use in my presentations:
&lt;br&gt;&lt;a href=&quot;http://github.com/hlship/t5intro&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://github.com/hlship/t5intro&lt;/a&gt;&lt;br&gt;&lt;br&gt;Please check the Tapestry web site for more links.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 7:55 AM, Jonhy Pear &amp;lt;jonhy.pear@gmail.com&amp;gt; wrote:
&lt;br&gt;&amp;gt; Hello all,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Is there any fully functional Web application in Tapestry5 that can be used
&lt;br&gt;&amp;gt; as a guide to bootstrap our skills in Tapestry5?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thank you
&lt;br&gt;&amp;gt;
&lt;br&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: users-unsubscribe@tapestry.apache.org
&lt;br&gt;For additional commands, e-mail: users-help@tapestry.apache.org
&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Complete-Sample-Tapestry-Application-tp26268771s302p26273788.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26273063</id>
	<title>Re: i18n overhead</title>
	<published>2009-11-09T12:22:25Z</published>
	<updated>2009-11-09T12:22:25Z</updated>
	<author>
		<name>Howard Lewis Ship</name>
	</author>
	<content type="html">There's a lot of room for optimizations here; Tapestry is using the
&lt;br&gt;ClassLoader.getResource() method extensively, and it is very, very
&lt;br&gt;slow. More work to ensure that we don't constantly check and re-check
&lt;br&gt;for the existence of files would make a huge difference in performance
&lt;br&gt;when you are talking about this many properties files. The same may
&lt;br&gt;apply to component templates (which can be localized if you like, thus
&lt;br&gt;the same lookup overhead).
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 4:11 AM, Blower, Andy &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273063&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Andy.Blower@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; We also have a lot of properties files, but so far only one translation. We will have 20+ translations in due course, so I would be concerned if there were performance problems/implications. We're already using 5.1, so I'd be interested if this version has issues will many files.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt;&amp;gt; From: Thiago H. de Paula Figueiredo [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273063&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;thiagohp@...&lt;/a&gt;]
&lt;br&gt;&amp;gt;&amp;gt; Sent: 08 November 2009 13:30
&lt;br&gt;&amp;gt;&amp;gt; To: Tapestry users
&lt;br&gt;&amp;gt;&amp;gt; Subject: Re: i18n overhead
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Em Sun, 08 Nov 2009 11:20:48 -0200, Melidramo &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273063&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;a5@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; escreveu:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; Why so many property files? Just curious. :)
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; This is a big project...
&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;&amp;gt; &amp;gt;&amp;gt; What exact version? 5.1.05? 5.0.18?
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; 5.0.18
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; There are some changes between 5.0.18 to 5.1.0.5 that can affect
&lt;br&gt;&amp;gt;&amp;gt; performance.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; Is your question an incentive to migrate to 5.1?
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Regardless of performance issues, I think it's a good thing to do.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; --
&lt;br&gt;&amp;gt;&amp;gt; Thiago H. de Paula Figueiredo
&lt;br&gt;&amp;gt;&amp;gt; Independent Java, Apache Tapestry 5 and Hibernate consultant,
&lt;br&gt;&amp;gt;&amp;gt; developer,
&lt;br&gt;&amp;gt;&amp;gt; and instructor
&lt;br&gt;&amp;gt;&amp;gt; Owner, software architect and developer, Ars Machina Tecnologia da
&lt;br&gt;&amp;gt;&amp;gt; Informação Ltda.
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://www.arsmachina.com.br&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.arsmachina.com.br&lt;/a&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=26273063&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26273063&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&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; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26273063&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26273063&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26273063&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26273063&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/i18n-overhead-tp26252169s302p26273063.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26272410</id>
	<title>Re: Complete Sample Tapestry Application</title>
	<published>2009-11-09T11:38:47Z</published>
	<updated>2009-11-09T11:38:47Z</updated>
	<author>
		<name>Jonhy Pear</name>
	</author>
	<content type="html">That's it! Thank you.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 7:09 PM, Michael Gentry &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272410&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mgentry@...&lt;/a&gt;&amp;gt;wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; JumpStart Examples:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://jumpstart.doublenegative.com.au:8080/jumpstart/examples&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jumpstart.doublenegative.com.au:8080/jumpstart/examples&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 2:00 PM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272410&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; Thanks for the link.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; I've started with the Maven archetype.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Where is the Jumpstart app you mention? can you send me that link?
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; On Mon, Nov 9, 2009 at 4:12 PM, Howard Lewis Ship &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272410&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hlship@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; There's several options.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; You can use the Tapestry Quickstart archetype (i.e., maven template).
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; You can use the Jumpstart which is a more complete application
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; template &amp; tutorial.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Here's a small example I use in my presentations:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &lt;a href=&quot;http://github.com/hlship/t5intro&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://github.com/hlship/t5intro&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Please check the Tapestry web site for more links.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 7:55 AM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272410&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; Hello all,
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; Is there any fully functional Web application in Tapestry5 that can be
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; used
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; as a guide to bootstrap our skills in Tapestry5?
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; Thank you
&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;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; --
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Howard M. Lewis Ship
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Creator of Apache Tapestry
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; The source for Tapestry training, mentoring and support. Contact me to
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; learn how I can get you up and productive in Tapestry fast!
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; (971) 678-5210
&lt;br&gt;&amp;gt; &amp;gt;&amp;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;&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=26272410&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26272410&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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;
&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=26272410&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26272410&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Complete-Sample-Tapestry-Application-tp26268771s302p26272410.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;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---Dev-f339.html&quot; embed=&quot;fixTarget[339]&quot; target=&quot;_top&quot; &gt;Tapestry - Dev&lt;/a&gt;&lt;/p&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-tp24984184s302p26272353.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;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---Dev-f339.html&quot; embed=&quot;fixTarget[339]&quot; target=&quot;_top&quot; &gt;Tapestry - Dev&lt;/a&gt;&lt;/p&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...-tp26272250s302p26272250.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26272234</id>
	<title>Re: beaneditform question</title>
	<published>2009-11-09T11:27:04Z</published>
	<updated>2009-11-09T11:27:04Z</updated>
	<author>
		<name>Jonhy Pear</name>
	</author>
	<content type="html">I'm experimenting your code but I'm blocked :(
&lt;br&gt;&lt;br&gt;I have in my page.java
&lt;br&gt;@Property
&lt;br&gt;private String password;
&lt;br&gt;@Property
&lt;br&gt;private String confirmPassword;
&lt;br&gt;&lt;br&gt;in my tml:
&lt;br&gt;&amp;lt;form t:id=&amp;quot;userRegistrationForm&amp;quot; t:type=&amp;quot;beaneditform&amp;quot; object=&amp;quot;user&amp;quot;
&lt;br&gt;add=&amp;quot;password, confirmPassword&amp;quot; exclude=&amp;quot;id, active&amp;quot;&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;lt;p:passsword&amp;gt;
&lt;br&gt;&amp;lt;t:label for=&amp;quot;password&amp;quot; /&amp;gt;
&lt;br&gt;&amp;lt;t:passwordfield t:id=&amp;quot;password&amp;quot; validate=&amp;quot;required&amp;quot; /&amp;gt;
&lt;br&gt;&amp;lt;/p:passsword&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;p:confirmPassword&amp;gt;
&lt;br&gt;&amp;lt;t:label for=&amp;quot;confirmPassword&amp;quot; /&amp;gt;
&lt;br&gt;&amp;lt;t:passwordfield t:id=&amp;quot;confirmPassword&amp;quot; validate=&amp;quot;required&amp;quot; /&amp;gt;
&lt;br&gt;&amp;lt;/p:confirmPassword&amp;gt;
&lt;br&gt;&amp;lt;/form&amp;gt;
&lt;br&gt;&lt;br&gt;But I get this error:
&lt;br&gt;&lt;br&gt;Render queue error in
&lt;br&gt;BeginRender[user/New:userregistrationform.editor.propertyeditor]: The data
&lt;br&gt;type for property 'password' of org.code.sandbox.model.User@d9973a is null.
&lt;br&gt;*
&lt;br&gt;*
&lt;br&gt;*Can you help me?*
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 4:13 PM, ningdh &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272234&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ningdhcn@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; I am sorry that &amp;quot;Object onValidate&amp;quot; should be &amp;quot;Object onValidateForm&amp;quot;.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; DH
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ----- Original Message -----
&lt;br&gt;&amp;gt; From: &amp;quot;João Pereira&amp;quot;
&lt;br&gt;&amp;gt; To: &amp;quot;Tapestry users&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272234&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; Sent: Monday, November 09, 2009 11:53 PM
&lt;br&gt;&amp;gt; Subject: Re: beaneditform question
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thank you.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 1:50 AM, DH &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26272234&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ningdhcn@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Hi
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Simple sample(t5.1):
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; In tml:
&lt;br&gt;&amp;gt; &amp;gt; &amp;lt;form t:id=&amp;quot;regForm&amp;quot; t:type=&amp;quot;beaneditform&amp;quot; object=&amp;quot;user&amp;quot;
&lt;br&gt;&amp;gt; &amp;gt; include=&amp;quot;nick,firstName,lastName&amp;quot; add=&amp;quot;password,retypePassword&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;p:password&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:label for=&amp;quot;password&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:passwordfield t:id=&amp;quot;password&amp;quot; validate=&amp;quot;required&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;/p:password&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;p:retypePassword&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:label for=&amp;quot;retypePassword&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:passwordfield t:id=&amp;quot;retypePassword&amp;quot; validate=&amp;quot;required&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;/p:retypePassword&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;lt;/form&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; In java:
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; @Component
&lt;br&gt;&amp;gt; &amp;gt; private BeanEditForm regForm;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; @Property
&lt;br&gt;&amp;gt; &amp;gt; private User user; // your user entity
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; @Property
&lt;br&gt;&amp;gt; &amp;gt; private String password;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; @Property
&lt;br&gt;&amp;gt; &amp;gt; private String retypePassword;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Object onValidate() {
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;if (!password.equals(retypePassword)) {
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regForm.recordError(&amp;quot;password and retypepassword must be == &amp;quot;);
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this; // meaning validation failed
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;return null; // validation successfully.
&lt;br&gt;&amp;gt; &amp;gt; }
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Object onSuccess() {
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;user.setPassword(encodeutil.encode(password));
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;service.save(user);
&lt;br&gt;&amp;gt; &amp;gt; &amp;nbsp; &amp;nbsp;return successpage or other;
&lt;br&gt;&amp;gt; &amp;gt; }
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; DH
&lt;br&gt;&amp;gt; &amp;gt; &lt;a href=&quot;http://www.gaonline.com.cn&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.gaonline.com.cn&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-beaneditform-question-tp26259992s302p26272234.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26272041</id>
	<title>Re: Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T11:13:53Z</published>
	<updated>2009-11-09T11:13:53Z</updated>
	<author>
		<name>Sergey Didenko</name>
	</author>
	<content type="html">I would prioritize the directions in the following way:
&lt;br&gt;&lt;br&gt;1) T5.1.1.x with important bugfixes
&lt;br&gt;&lt;br&gt;2) The website ( the future book can be just a compilation and
&lt;br&gt;extension of website materials)
&lt;br&gt;&lt;br&gt;3-4) T5.2 and book
&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=26272041&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26272041&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26272041.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26271971</id>
	<title>Re: Complete Sample Tapestry Application</title>
	<published>2009-11-09T11:09:25Z</published>
	<updated>2009-11-09T11:09:25Z</updated>
	<author>
		<name>Michael Gentry-2</name>
	</author>
	<content type="html">JumpStart Examples:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://jumpstart.doublenegative.com.au:8080/jumpstart/examples&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jumpstart.doublenegative.com.au:8080/jumpstart/examples&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 2:00 PM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26271971&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Thanks for the link.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I've started with the Maven archetype.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Where is the Jumpstart app you mention? can you send me that link?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 4:12 PM, Howard Lewis Ship &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26271971&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hlship@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; There's several options.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; You can use the Tapestry Quickstart archetype (i.e., maven template).
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; You can use the Jumpstart which is a more complete application
&lt;br&gt;&amp;gt;&amp;gt; template &amp; tutorial.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Here's a small example I use in my presentations:
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://github.com/hlship/t5intro&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://github.com/hlship/t5intro&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Please check the Tapestry web site for more links.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 7:55 AM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26271971&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; Hello all,
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; Is there any fully functional Web application in Tapestry5 that can be
&lt;br&gt;&amp;gt;&amp;gt; used
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; as a guide to bootstrap our skills in Tapestry5?
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; Thank you
&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;&amp;gt; --
&lt;br&gt;&amp;gt;&amp;gt; Howard M. Lewis Ship
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Creator of Apache Tapestry
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; The source for Tapestry training, mentoring and support. Contact me to
&lt;br&gt;&amp;gt;&amp;gt; learn how I can get you up and productive in Tapestry fast!
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; (971) 678-5210
&lt;br&gt;&amp;gt;&amp;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;&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=26271971&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26271971&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;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=26271971&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26271971&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Complete-Sample-Tapestry-Application-tp26268771s302p26271971.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26271828</id>
	<title>Re: Complete Sample Tapestry Application</title>
	<published>2009-11-09T11:00:52Z</published>
	<updated>2009-11-09T11:00:52Z</updated>
	<author>
		<name>Jonhy Pear</name>
	</author>
	<content type="html">Thanks for the link.
&lt;br&gt;&lt;br&gt;I've started with the Maven archetype.
&lt;br&gt;&lt;br&gt;Where is the Jumpstart app you mention? can you send me that link?
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 4:12 PM, Howard Lewis Ship &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26271828&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hlship@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; There's several options.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; You can use the Tapestry Quickstart archetype (i.e., maven template).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; You can use the Jumpstart which is a more complete application
&lt;br&gt;&amp;gt; template &amp; tutorial.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Here's a small example I use in my presentations:
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://github.com/hlship/t5intro&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://github.com/hlship/t5intro&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Please check the Tapestry web site for more links.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 7:55 AM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26271828&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hello all,
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Is there any fully functional Web application in Tapestry5 that can be
&lt;br&gt;&amp;gt; used
&lt;br&gt;&amp;gt; &amp;gt; as a guide to bootstrap our skills in Tapestry5?
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Thank you
&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; --
&lt;br&gt;&amp;gt; Howard M. Lewis Ship
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Creator of Apache Tapestry
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The source for Tapestry training, mentoring and support. Contact me to
&lt;br&gt;&amp;gt; learn how I can get you up and productive in Tapestry fast!
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; (971) 678-5210
&lt;br&gt;&amp;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;&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=26271828&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26271828&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Complete-Sample-Tapestry-Application-tp26268771s302p26271828.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26271415</id>
	<title>LinkSubmit problem - invalid form action</title>
	<published>2009-11-09T10:38:10Z</published>
	<updated>2009-11-09T10:38:10Z</updated>
	<author>
		<name>shymon</name>
	</author>
	<content type="html">&lt;br&gt;Hi,
&lt;br&gt;&lt;br&gt;I use LinkSubmit on two pages of my app. On one page it works fine but on the other it's not; when I click on that link nothing happens. The only difference I have noticed is in form action generated by T5. On &amp;quot;working&amp;quot; page it looks like:
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; action=&amp;quot;/appContext/pageName.formId&amp;quot;
&lt;br&gt;&lt;br&gt;and on &amp;quot;not-working&amp;quot; page
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; action=&amp;quot;pageName.formId&amp;quot;
&lt;br&gt;&lt;br&gt;What can cause this problem?&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/LinkSubmit-problem---invalid-form-action-tp26271415s302p26271415.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;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---Dev-f339.html&quot; embed=&quot;fixTarget[339]&quot; target=&quot;_top&quot; &gt;Tapestry - Dev&lt;/a&gt;&lt;/p&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...-tp26271292s302p26271292.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;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---Dev-f339.html&quot; embed=&quot;fixTarget[339]&quot; target=&quot;_top&quot; &gt;Tapestry - Dev&lt;/a&gt;&lt;/p&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...-tp26270226s302p26270226.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;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---Dev-f339.html&quot; embed=&quot;fixTarget[339]&quot; target=&quot;_top&quot; &gt;Tapestry - Dev&lt;/a&gt;&lt;/p&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.-tp26267695s302p26269707.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26269675</id>
	<title>Re: How do you pass a context to PageTester?</title>
	<published>2009-11-09T08:51:05Z</published>
	<updated>2009-11-09T08:51:05Z</updated>
	<author>
		<name>Paul Field-4</name>
	</author>
	<content type="html">Or you can just create the URL manually with the parameter in your test:
&lt;br&gt;tester.renderPage(&amp;quot;mypage/1234&amp;quot;); &amp;nbsp; // 1234 is the id
&lt;br&gt;&lt;br&gt;- Paul
&lt;br&gt;&lt;br&gt;&lt;br&gt;Igor Drobiazko &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269675&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;igor.drobiazko@...&lt;/a&gt;&amp;gt; wrote on 09/11/2009 06:30:34:
&lt;br&gt;&amp;gt; Just create another page containg a link to target page and click on 
&lt;br&gt;&amp;gt; it. The link can contain a context.
&lt;br&gt;&lt;br&gt;&amp;gt; &amp;gt; Basically, I'm looking to invoke a page
&lt;br&gt;&amp;gt; &amp;gt; and pass it a request parameter. Is this possible?
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;---
&lt;br&gt;&lt;br&gt;This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden.
&lt;br&gt;&lt;br&gt;Please refer to &lt;a href=&quot;http://www.db.com/en/content/eu_disclosures.htm&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.db.com/en/content/eu_disclosures.htm&lt;/a&gt;&amp;nbsp;for additional EU corporate and regulatory disclosures.&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-do-you-pass-a-context-to-PageTester--tp25274401s302p26269675.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26269052</id>
	<title>Re: beaneditform question</title>
	<published>2009-11-09T08:13:04Z</published>
	<updated>2009-11-09T08:13:04Z</updated>
	<author>
		<name>DH-14</name>
	</author>
	<content type="html">I am sorry that &amp;quot;Object onValidate&amp;quot; should be &amp;quot;Object onValidateForm&amp;quot;.
&lt;br&gt;&lt;br&gt;DH
&lt;br&gt;&lt;br&gt;----- Original Message ----- 
&lt;br&gt;From: &amp;quot;João Pereira&amp;quot; 
&lt;br&gt;To: &amp;quot;Tapestry users&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269052&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Sent: Monday, November 09, 2009 11:53 PM
&lt;br&gt;Subject: Re: beaneditform question
&lt;br&gt;&lt;br&gt;&lt;br&gt;Thank you.
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 1:50 AM, DH &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269052&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ningdhcn@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Simple sample(t5.1):
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In tml:
&lt;br&gt;&amp;gt; &amp;lt;form t:id=&amp;quot;regForm&amp;quot; t:type=&amp;quot;beaneditform&amp;quot; object=&amp;quot;user&amp;quot;
&lt;br&gt;&amp;gt; include=&amp;quot;nick,firstName,lastName&amp;quot; add=&amp;quot;password,retypePassword&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;p:password&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:label for=&amp;quot;password&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:passwordfield t:id=&amp;quot;password&amp;quot; validate=&amp;quot;required&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;/p:password&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;p:retypePassword&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:label for=&amp;quot;retypePassword&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:passwordfield t:id=&amp;quot;retypePassword&amp;quot; validate=&amp;quot;required&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;/p:retypePassword&amp;gt;
&lt;br&gt;&amp;gt; &amp;lt;/form&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In java:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Component
&lt;br&gt;&amp;gt; private BeanEditForm regForm;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Property
&lt;br&gt;&amp;gt; private User user; // your user entity
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Property
&lt;br&gt;&amp;gt; private String password;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Property
&lt;br&gt;&amp;gt; private String retypePassword;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Object onValidate() {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;if (!password.equals(retypePassword)) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regForm.recordError(&amp;quot;password and retypepassword must be == &amp;quot;);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this; // meaning validation failed
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;return null; // validation successfully.
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Object onSuccess() {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;user.setPassword(encodeutil.encode(password));
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;service.save(user);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;return successpage or other;
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; DH
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://www.gaonline.com.cn&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.gaonline.com.cn&lt;/a&gt;&lt;/div&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-beaneditform-question-tp26259992s302p26269052.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26269137</id>
	<title>Re: Complete Sample Tapestry Application</title>
	<published>2009-11-09T08:12:24Z</published>
	<updated>2009-11-09T08:12:24Z</updated>
	<author>
		<name>Howard Lewis Ship</name>
	</author>
	<content type="html">There's several options.
&lt;br&gt;&lt;br&gt;You can use the Tapestry Quickstart archetype (i.e., maven template).
&lt;br&gt;&lt;br&gt;You can use the Jumpstart which is a more complete application
&lt;br&gt;template &amp; tutorial.
&lt;br&gt;&lt;br&gt;Here's a small example I use in my presentations:
&lt;br&gt;&lt;a href=&quot;http://github.com/hlship/t5intro&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://github.com/hlship/t5intro&lt;/a&gt;&lt;br&gt;&lt;br&gt;Please check the Tapestry web site for more links.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 7:55 AM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26269137&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; Hello all,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Is there any fully functional Web application in Tapestry5 that can be used
&lt;br&gt;&amp;gt; as a guide to bootstrap our skills in Tapestry5?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thank you
&lt;br&gt;&amp;gt;
&lt;br&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=26269137&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26269137&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Complete-Sample-Tapestry-Application-tp26268771s302p26269137.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26268958</id>
	<title>Re: IoC container performance issues</title>
	<published>2009-11-09T08:07:33Z</published>
	<updated>2009-11-09T08:07:33Z</updated>
	<author>
		<name>Howard Lewis Ship</name>
	</author>
	<content type="html">The container is organized for functionality, not performance, with
&lt;br&gt;service lookups because lookups normally occur once.
&lt;br&gt;&lt;br&gt;Suggestion: create a &amp;quot;lookup&amp;quot; service that has getters for all the
&lt;br&gt;other keys services you want. Inject those other services into its
&lt;br&gt;implementation. Obtain it from the Registry. Store it in a global and
&lt;br&gt;use that for non-service code to gain access to IoC services.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 2:15 AM, Adriaan Joubert &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26268958&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;adriaan.ml@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; we hit some performance issues using the tapestry IoC. The problem is
&lt;br&gt;&amp;gt; that we have legacy apps where we do need to do a lot of registry
&lt;br&gt;&amp;gt; look-ups - takes a while to rewrite everything to have services
&lt;br&gt;&amp;gt; injected via constructors everywhere. In our particular case we have a
&lt;br&gt;&amp;gt; few hundred services and in one instance a static call was replaced
&lt;br&gt;&amp;gt; with a registry look-up and a call on the service. It turns out that a
&lt;br&gt;&amp;gt; registry look-up is rather slower than we expected.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; A colleague has looked into this and says:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;quot;We are having some performance issues with the getService() method in
&lt;br&gt;&amp;gt; the 'RegistryImpl' class. Looking at the source code it seems that there
&lt;br&gt;&amp;gt; are some linear list searches going on in there that could perhaps be
&lt;br&gt;&amp;gt; replaced by more efficient map lookups, if possible.&amp;quot;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Has anybody looked into the performance of the IoC?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thanks,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Adriaan
&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=26268958&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26268958&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26268958&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26268958&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/IoC-container-performance-issues-tp26263931s302p26268958.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26268771</id>
	<title>Complete Sample Tapestry Application</title>
	<published>2009-11-09T07:55:50Z</published>
	<updated>2009-11-09T07:55:50Z</updated>
	<author>
		<name>Jonhy Pear</name>
	</author>
	<content type="html">Hello all,
&lt;br&gt;&lt;br&gt;Is there any fully functional Web application in Tapestry5 that can be used
&lt;br&gt;as a guide to bootstrap our skills in Tapestry5?
&lt;br&gt;&lt;br&gt;Thank you
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Complete-Sample-Tapestry-Application-tp26268771s302p26268771.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26268723</id>
	<title>Re: beaneditform question</title>
	<published>2009-11-09T07:53:08Z</published>
	<updated>2009-11-09T07:53:08Z</updated>
	<author>
		<name>J. mp</name>
	</author>
	<content type="html">Thank you.
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 1:50 AM, DH &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26268723&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ningdhcn@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Simple sample(t5.1):
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In tml:
&lt;br&gt;&amp;gt; &amp;lt;form t:id=&amp;quot;regForm&amp;quot; t:type=&amp;quot;beaneditform&amp;quot; object=&amp;quot;user&amp;quot;
&lt;br&gt;&amp;gt; include=&amp;quot;nick,firstName,lastName&amp;quot; add=&amp;quot;password,retypePassword&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;p:password&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:label for=&amp;quot;password&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:passwordfield t:id=&amp;quot;password&amp;quot; validate=&amp;quot;required&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;/p:password&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;p:retypePassword&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:label for=&amp;quot;retypePassword&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;t:passwordfield t:id=&amp;quot;retypePassword&amp;quot; validate=&amp;quot;required&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;lt;/p:retypePassword&amp;gt;
&lt;br&gt;&amp;gt; &amp;lt;/form&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In java:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Component
&lt;br&gt;&amp;gt; private BeanEditForm regForm;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Property
&lt;br&gt;&amp;gt; private User user; // your user entity
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Property
&lt;br&gt;&amp;gt; private String password;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Property
&lt;br&gt;&amp;gt; private String retypePassword;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Object onValidate() {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;if (!password.equals(retypePassword)) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;regForm.recordError(&amp;quot;password and retypepassword must be == &amp;quot;);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this; // meaning validation failed
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;return null; // validation successfully.
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Object onSuccess() {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;user.setPassword(encodeutil.encode(password));
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;service.save(user);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;return successpage or other;
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; DH
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://www.gaonline.com.cn&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.gaonline.com.cn&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ----- Original Message -----
&lt;br&gt;&amp;gt; From: &amp;quot;Jonhy Pear&amp;quot;
&lt;br&gt;&amp;gt; To: &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26268723&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; Sent: Monday, November 09, 2009 9:21 AM
&lt;br&gt;&amp;gt; Subject: Re: beaneditform question
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Sorry, I mean beaneditform, not beaneditform
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, Nov 9, 2009 at 1:05 AM, Jonhy Pear &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26268723&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jonhy.pear@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&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; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Hello all,
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; This is my first message to the list. I'm new to tapestry and I'm
&lt;br&gt;&amp;gt; &amp;gt; evaluating it and looking for some guidance.
&lt;br&gt;&amp;gt; &amp;gt; Let's say I have a java bean with:
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; String nick;
&lt;br&gt;&amp;gt; &amp;gt; String firstName;
&lt;br&gt;&amp;gt; &amp;gt; String lastName;
&lt;br&gt;&amp;gt; &amp;gt; String hashPassword;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; I want to use beaneditform to create a new user but I want to add new
&lt;br&gt;&amp;gt; &amp;gt; fields:
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; password
&lt;br&gt;&amp;gt; &amp;gt; retypePassword
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; and validade the presence of both and their equality. You know, that
&lt;br&gt;&amp;gt; &amp;gt; typical registration process.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; When user submit the new data I want to validate the equality of both
&lt;br&gt;&amp;gt; &amp;gt; password and confirmPassword and set a hash based on password in the
&lt;br&gt;&amp;gt; field
&lt;br&gt;&amp;gt; &amp;gt; hashPassword in the bean.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Does anybody have a sample code that I can use to know what is the best
&lt;br&gt;&amp;gt; way
&lt;br&gt;&amp;gt; &amp;gt; to achieve this with tapestry?
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; thank you
&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; &amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; João Miguel Pereira
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://jpereira.eu&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jpereira.eu&lt;/a&gt;&lt;br&gt;&amp;gt; LinkedIn: &lt;a href=&quot;http://www.linkedin.com/in/joaomiguelpereira&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.linkedin.com/in/joaomiguelpereira&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26268723&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joaomiguel.pereira@...&lt;/a&gt;
&lt;br&gt;&amp;gt; (351) 96 275 68 58
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;João Miguel Pereira
&lt;br&gt;&lt;a href=&quot;http://jpereira.eu&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jpereira.eu&lt;/a&gt;&lt;br&gt;LinkedIn: &lt;a href=&quot;http://www.linkedin.com/in/joaomiguelpereira&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.linkedin.com/in/joaomiguelpereira&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26268723&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joaomiguel.pereira@...&lt;/a&gt;
&lt;br&gt;(351) 96 275 68 58
&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A-beaneditform-question-tp26259992s302p26268723.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26268022</id>
	<title>RE: [Tapestry Central] Tapestry 5.1 and IE 8 -- Customizing Tapestry</title>
	<published>2009-11-09T07:13:16Z</published>
	<updated>2009-11-09T07:13:16Z</updated>
	<author>
		<name>Andy Blower</name>
	</author>
	<content type="html">&lt;div class='shrinkable-quote'&gt;&amp;gt; Picture an existing application that's been deployed using Tapestry
&lt;br&gt;&amp;gt; 5.1.0.5; the prototype.js is exposed to the client as
&lt;br&gt;&amp;gt; /assets/scriptaculous/5.1.0.5/prototype.js.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Now the application is rebuild with tapx-prototype and redeployed.
&lt;br&gt;&amp;gt; Without the remapping, the URL would be unchanged and some clients
&lt;br&gt;&amp;gt; would continue to use the old prototype.js.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; With the new contribution, the URL will now be
&lt;br&gt;&amp;gt; /assets/tapx-prototype/1.6.1/prototype.js which will force the browser
&lt;br&gt;&amp;gt; to reload.
&lt;/div&gt;&lt;br&gt;Right, I understand now - thanks. So we don't need this since we've not released yet and it'll only change again if we upgrade T5 versions.
&lt;br&gt;&amp;nbsp;
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; That being said, I'm finding the current version number system too
&lt;br&gt;&amp;gt; complicated. Rather than hide assets behind a mish-mash of application
&lt;br&gt;&amp;gt; version numbers, library version numbers and Tapestry's version
&lt;br&gt;&amp;gt; number, I'm thinking of simplifying it to be just the application
&lt;br&gt;&amp;gt; version number. So all asset URLs would be /asset/XYZ/... &amp;nbsp;where XYZ
&lt;br&gt;&amp;gt; was the application version number. That means that on an update to
&lt;br&gt;&amp;gt; the application, clients would have to download a fresh copy of
&lt;br&gt;&amp;gt; prototype.js, tapestry.js, etc. (the core Tapestry stack) but it would
&lt;br&gt;&amp;gt; be harder to screw up some of these other path &amp; version number
&lt;br&gt;&amp;gt; details.
&lt;/div&gt;&lt;br&gt;I like it the way it is personally, seems elegant and efficient.
&lt;br&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=26268022&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26268022&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Tapestry-5.1-and-IE-8----Customizing-Tapestry-tp25729583s302p26268022.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;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---Dev-f339.html&quot; embed=&quot;fixTarget[339]&quot; target=&quot;_top&quot; &gt;Tapestry - Dev&lt;/a&gt;&lt;/p&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.-tp26267695s302p26267695.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26267409</id>
	<title>Re: Re: [Tapestry Central] Next Steps for Tapestry</title>
	<published>2009-11-09T06:32:20Z</published>
	<updated>2009-11-09T06:32:20Z</updated>
	<author>
		<name>Wilson Ikeda</name>
	</author>
	<content type="html">I think that Inge Solvoli is right, but rather than writing a book &amp;nbsp;
&lt;br&gt;first i think that the Tapestry site need to be redone (what happened &amp;nbsp;
&lt;br&gt;to the redesign?), it's the first place that people new to Tapestry &amp;nbsp;
&lt;br&gt;will look at and i think that today's design and layout give people &amp;nbsp;
&lt;br&gt;the impressions: complex, difficult to understand how to create and &amp;nbsp;
&lt;br&gt;use zones for example, needs organization: components -&amp;gt; Tapestry &amp;nbsp;
&lt;br&gt;version x, how to for specific versions etc. People convinced that &amp;nbsp;
&lt;br&gt;it's a good framework will buy the book but if not they will not spend &amp;nbsp;
&lt;br&gt;money and time on a Tapestry 5.1 book. What if rather than writing a &amp;nbsp;
&lt;br&gt;book and selling it, write and redesign the site using the material &amp;nbsp;
&lt;br&gt;that was to go for the book? It's the Main Store for Tapestry. If the &amp;nbsp;
&lt;br&gt;site's documentation is good enough it will be echoed on the net: &amp;nbsp;
&lt;br&gt;&amp;quot;Want to learn Tapestry, go to the tapestry site, the documentation is &amp;nbsp;
&lt;br&gt;awesome!&amp;quot;.
&lt;br&gt;&lt;br&gt;Just my thoughts!
&lt;br&gt;&lt;br&gt;On Nov 9, 2009, at 9:35 PM, Inge Solvoll wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; From: Inge Solvoll &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26267409&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;inge.tapestry@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; Date: November 9, 2009 5:34:33 PM GMT+09:00
&lt;br&gt;&amp;gt; To: Tapestry users &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26267409&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; Subject: Re: [Tapestry Central] Next Steps for Tapestry
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Book. Web site. Marketing. Strategy.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Just to make a statement here: THE TAPESTRY 5 CODE IS MORE THAN GOOD
&lt;br&gt;&amp;gt; ENOUGH!! The quality of the code and the framework just isn't the
&lt;br&gt;&amp;gt; bottleneck. I think we all can agree on that?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Who cares about Spring Web Flow or portlet support? Do we really &amp;nbsp;
&lt;br&gt;&amp;gt; think that
&lt;br&gt;&amp;gt; such features would generate exponential amounts of traffic to the T5
&lt;br&gt;&amp;gt; website? Because that's what we need. Exponential growth in the user &amp;nbsp;
&lt;br&gt;&amp;gt; base.
&lt;br&gt;&amp;gt; My fear is that T5 will simply die within a couple of years if we &amp;nbsp;
&lt;br&gt;&amp;gt; don't get
&lt;br&gt;&amp;gt; massive growth and popularity. So what can we do to achieve that? &amp;nbsp;
&lt;br&gt;&amp;gt; Exposing
&lt;br&gt;&amp;gt; internal services as public sounds like a great idea to me, but it &amp;nbsp;
&lt;br&gt;&amp;gt; sure
&lt;br&gt;&amp;gt; won't help much for the exponential growth.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I think the best way for Howard to spend his time would be to find &amp;nbsp;
&lt;br&gt;&amp;gt; more
&lt;br&gt;&amp;gt; people to delegate work to, and spend some quality time with those &amp;nbsp;
&lt;br&gt;&amp;gt; people.
&lt;br&gt;&amp;gt; And after that, focus on marketing and documentation.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Hope I didn't offend anyone with this rather brutal post. I want &amp;nbsp;
&lt;br&gt;&amp;gt; only the
&lt;br&gt;&amp;gt; best for this excellent framework and its very talented founder :)
&lt;/div&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-Tapestry-Central--Next-Steps-for-Tapestry-tp26248673s302p26267409.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26267345</id>
	<title>Re: t5: Link s addParameter and null</title>
	<published>2009-11-09T06:28:12Z</published>
	<updated>2009-11-09T06:28:12Z</updated>
	<author>
		<name>Thiago H. de Paula Figueiredo</name>
	</author>
	<content type="html">Em Mon, 09 Nov 2009 11:24:21 -0200, Angelo Chen &amp;nbsp;
&lt;br&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26267345&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;angelochen960@...&lt;/a&gt;&amp;gt; escreveu:
&lt;br&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&lt;br&gt;Hi!
&lt;br&gt;&lt;br&gt;&amp;gt; 2) if I do a lnk.addParameter(&amp;quot;country&amp;quot;, null) and I got following:
&lt;br&gt;&amp;gt; &amp;nbsp;RequestExceptionHandler Unexpected runtime exception: Parameter value &amp;nbsp;
&lt;br&gt;&amp;gt; was null or contained only whitespace.
&lt;br&gt;&lt;br&gt;Please post a JIRA about it. I think that you use of a query parameter &amp;nbsp;
&lt;br&gt;without a value is valid, but the framework thinks otherwise now.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Thiago H. de Paula Figueiredo
&lt;br&gt;Independent Java, Apache Tapestry 5 and Hibernate consultant, developer, &amp;nbsp;
&lt;br&gt;and instructor
&lt;br&gt;Owner, software architect and developer, Ars Machina Tecnologia da &amp;nbsp;
&lt;br&gt;Informação Ltda.
&lt;br&gt;&lt;a href=&quot;http://www.arsmachina.com.br&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.arsmachina.com.br&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=26267345&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26267345&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356s302p26267345.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26267272</id>
	<title>Re: [ANN] t5components - release 0.5.4</title>
	<published>2009-11-09T06:24:31Z</published>
	<updated>2009-11-09T06:24:31Z</updated>
	<author>
		<name>Kumar_2106</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;I need to Update the TextBox on Change of Select Box. So I am trying to use t5components/OnEvent. 
&lt;br&gt;&lt;br&gt;So I am trying to update Maven POM &amp;nbsp;for t5-common dependency for mixins 't5components/OnEvent' on my tml ,but I am getting below error message when I run mvn clean install 
&lt;br&gt;&lt;br&gt;&amp;nbsp;(For OnEvent mixins &amp;nbsp;I succesfully added &amp;nbsp;&amp;gt;&amp;lt;chenillekit-tapestry&amp;gt; to my Repository but it does not work fine..So I am trying t5Component now and se &amp;nbsp;if it works).
&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.tapestry&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;t5c-commons&amp;lt;/artifactId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;0.5.15-SNAPSHOT&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;lt;repository&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;id&amp;gt;t5components&amp;lt;/id&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;name&amp;gt;T5Components Maven Repository&amp;lt;/name&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url&amp;gt; &lt;a href=&quot;http://213.160.23.119:8080/t5components&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://213.160.23.119:8080/t5components&lt;/a&gt;&amp;lt;/url&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/repository&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-------------------------------------------
&lt;br&gt;] Scanning for projects...
&lt;br&gt;[INFO] ------------------------------------------------------------------------
&lt;br&gt;[INFO] Building Data Spend Manager
&lt;br&gt;[INFO] &amp;nbsp; &amp;nbsp;task-segment: [clean, install]
&lt;br&gt;[INFO] ------------------------------------------------------------------------
&lt;br&gt;[INFO] [clean:clean]
&lt;br&gt;[INFO] snapshot nu.localhost.tapestry:tapestry-spring-security:2.1.0-SNAPSHOT: checking for updates from t5components
&lt;br&gt;[WARNING] repository metadata for: 'snapshot nu.localhost.tapestry:tapestry-spring-security:2.1.0-SNAPSHOT' could not be retrieved from repository: t5components due to an error: Error transferring file
&lt;br&gt;[INFO] Repository 't5components' will be blacklisted
&lt;br&gt;[INFO] ------------------------------------------------------------------------
&lt;br&gt;[ERROR] BUILD ERROR
&lt;br&gt;[INFO] ------------------------------------------------------------------------
&lt;br&gt;[INFO] Failed to resolve artifact.
&lt;br&gt;&lt;br&gt;Missing:
&lt;br&gt;----------
&lt;br&gt;1) org.apache.tapestry:t5c-commons:jar:0.5.15-SNAPSHOT
&lt;br&gt;&lt;br&gt;&amp;nbsp; Try downloading the file manually from the project website.
&lt;br&gt;&lt;br&gt;&amp;nbsp; Then, install it using the command: 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mvn install:install-file -DgroupId=org.apache.tapestry -DartifactId=t5c-commons -Dversion=0.5.15-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file
&lt;br&gt;&lt;br&gt;&amp;nbsp; Alternatively, if you host your own repository you can deploy the file there: 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mvn deploy:deploy-file -DgroupId=org.apache.tapestry -DartifactId=t5c-commons -Dversion=0.5.15-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
&lt;br&gt;&lt;br&gt;&amp;nbsp; Path to dependency: 
&lt;br&gt;&amp;nbsp; 	1) net.rockshore.dsm:DataSpendManager:war:1.0-SNAPSHOT
&lt;br&gt;&amp;nbsp; 	2) org.apache.tapestry:t5c-commons:jar:0.5.15-SNAPSHOT
&lt;br&gt;&lt;br&gt;----------
&lt;br&gt;1 required artifact is missing.
&lt;br&gt;&lt;br&gt;for artifact: 
&lt;br&gt;&amp;nbsp; net.rockshore.dsm:DataSpendManager:war:1.0-SNAPSHOT
&lt;br&gt;&lt;br&gt;from the specified remote repositories:
&lt;br&gt;&amp;nbsp; t5components (&lt;a href=&quot;http://213.160.23.119:8080/t5components&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://213.160.23.119:8080/t5components&lt;/a&gt;),
&lt;br&gt;&amp;nbsp; nexus (&lt;a href=&quot;https://rockshore.net/nexus/content/groups/public&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://rockshore.net/nexus/content/groups/public&lt;/a&gt;),
&lt;br&gt;&amp;nbsp; chenillekit (&lt;a href=&quot;http://www.chenillekit.org/mvnrepo/release&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.chenillekit.org/mvnrepo/release&lt;/a&gt;)
&lt;br&gt;&lt;br&gt;&lt;br&gt;[INFO] ------------------------------------------------------------------------
&lt;br&gt;[INFO] For more information, run Maven with the -e switch
&lt;br&gt;[INFO] ------------------------------------------------------------------------
&lt;br&gt;[INFO] Total time: 7 seconds
&lt;br&gt;[INFO] Finished at: Mon Nov 09 14:14:26 GMT 2009
&lt;br&gt;[INFO] Final Memory: 15M/119M
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Can You pleas help on this ?? Any piece of advise is highly appreciated.
&lt;br&gt;&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Kumar
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;Sven Homburg wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message&quot;&gt;Hi there,
&lt;br&gt;&lt;br&gt;the t5components release 0.5.4 is out now.
&lt;br&gt;special thanks to Tod Orr and Ted Steen to let include 
&lt;br&gt;their components into T5Components
&lt;br&gt;&lt;br&gt;project page with demo &amp;nbsp;click here &lt;a href=&quot;http://213.160.23.119:8080/t5components/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://213.160.23.119:8080/t5components/&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-ANN--t5components---release-0.5.4-tp15145466s302p26267272.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26267129</id>
	<title>Re: t5: Link s addParameter and null</title>
	<published>2009-11-09T06:15:43Z</published>
	<updated>2009-11-09T06:15:43Z</updated>
	<author>
		<name>Angelo Chen</name>
	</author>
	<content type="html">I need that to be in the url so it can be captured by Google Analytics.
&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;Alexey Hanin wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message shrinkable-quote&quot;&gt;Don't have an opportunity to check this but as I know Tapestry treats
&lt;br&gt;empty parameters as nulls. Just curious, why do you want empty
&lt;br&gt;parameter in query string? Conceptually, parameters not being set
&lt;br&gt;makes it null.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 3:50 PM, Angelo Chen &amp;lt;angelochen960@yahoo.com.hk&amp;gt; wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt; Thanks for the reply, but it does not work, still same error, i check the
&lt;br&gt;&amp;gt; LinkImpl:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  public void addParameter(String parameterName, String value)
&lt;br&gt;&amp;gt;    {
&lt;br&gt;&amp;gt;        Defense.notBlank(parameterName, &amp;quot;parameterName&amp;quot;);
&lt;br&gt;&amp;gt;        Defense.notBlank(value, &amp;quot;value&amp;quot;);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        if (parameters == null)
&lt;br&gt;&amp;gt;            parameters = CollectionFactory.newMap();
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        parameters.put(parameterName, value);
&lt;br&gt;&amp;gt;    }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; it is making sure the value is not blank, but I believe query string having
&lt;br&gt;&amp;gt; blank value is often.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Alexey Hanin wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Just make it empty string when it's null:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; lnk.addParameter(&amp;quot;country&amp;quot;, country == null ? &amp;quot;&amp;quot; : country);
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 3:24 PM, Angelo Chen &amp;lt;angelochen960@yahoo.com.hk&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I have a query string that I need to append to a  Link object, the query
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; string is:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ?gender=M&amp;country=
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I got two questions:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 1) is there a simple way to append this string to a Link object instead
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; of
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; using addParameter?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 2) if I do a lnk.addParameter(&amp;quot;country&amp;quot;, null) and I got following:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  RequestExceptionHandler Unexpected runtime exception: Parameter value
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; was
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; null or contained only whitespace.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; and I need to make the country part of query string even it is null, any
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; idea? thanks,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; A.C.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; --
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; View this message in context:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266356.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266356.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Sent from the Tapestry - User mailing list archive at Nabble.com.
&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; ---------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; For additional commands, e-mail: users-help@tapestry.apache.org
&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: users-unsubscribe@tapestry.apache.org
&lt;br&gt;&amp;gt;&amp;gt; For additional commands, e-mail: users-help@tapestry.apache.org
&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; View this message in context: &lt;a href=&quot;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266715.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266715.html&lt;/a&gt;&lt;br&gt;&amp;gt; Sent from the Tapestry - User 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: users-unsubscribe@tapestry.apache.org
&lt;br&gt;&amp;gt; For additional commands, e-mail: users-help@tapestry.apache.org
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
&lt;br&gt;For additional commands, e-mail: users-help@tapestry.apache.org
&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356s302p26267129.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26266881</id>
	<title>Re: t5: Link s addParameter and null</title>
	<published>2009-11-09T06:00:50Z</published>
	<updated>2009-11-09T06:00:50Z</updated>
	<author>
		<name>Alexey Hanin</name>
	</author>
	<content type="html">Don't have an opportunity to check this but as I know Tapestry treats
&lt;br&gt;empty parameters as nulls. Just curious, why do you want empty
&lt;br&gt;parameter in query string? Conceptually, parameters not being set
&lt;br&gt;makes it null.
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 3:50 PM, Angelo Chen &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26266881&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;angelochen960@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt; Thanks for the reply, but it does not work, still same error, i check the
&lt;br&gt;&amp;gt; LinkImpl:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  public void addParameter(String parameterName, String value)
&lt;br&gt;&amp;gt;    {
&lt;br&gt;&amp;gt;        Defense.notBlank(parameterName, &amp;quot;parameterName&amp;quot;);
&lt;br&gt;&amp;gt;        Defense.notBlank(value, &amp;quot;value&amp;quot;);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        if (parameters == null)
&lt;br&gt;&amp;gt;            parameters = CollectionFactory.newMap();
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;        parameters.put(parameterName, value);
&lt;br&gt;&amp;gt;    }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; it is making sure the value is not blank, but I believe query string having
&lt;br&gt;&amp;gt; blank value is often.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Alexey Hanin wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Just make it empty string when it's null:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; lnk.addParameter(&amp;quot;country&amp;quot;, country == null ? &amp;quot;&amp;quot; : country);
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Mon, Nov 9, 2009 at 3:24 PM, Angelo Chen &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26266881&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;angelochen960@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I have a query string that I need to append to a  Link object, the query
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; string is:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ?gender=M&amp;country=
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I got two questions:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 1) is there a simple way to append this string to a Link object instead
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; of
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; using addParameter?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 2) if I do a lnk.addParameter(&amp;quot;country&amp;quot;, null) and I got following:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;  RequestExceptionHandler Unexpected runtime exception: Parameter value
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; was
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; null or contained only whitespace.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; and I need to make the country part of query string even it is null, any
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; idea? thanks,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; A.C.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; --
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; View this message in context:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266356.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266356.html&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Sent from the Tapestry - User mailing list archive at Nabble.com.
&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; ---------------------------------------------------------------------
&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=26266881&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26266881&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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; To unsubscribe, e-mail: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26266881&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26266881&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&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; View this message in context: &lt;a href=&quot;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266715.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266715.html&lt;/a&gt;&lt;br&gt;&amp;gt; Sent from the Tapestry - User 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=26266881&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26266881&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&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=26266881&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-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=26266881&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;users-help@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356s302p26266881.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26266715</id>
	<title>Re: t5: Link s addParameter and null</title>
	<published>2009-11-09T05:50:57Z</published>
	<updated>2009-11-09T05:50:57Z</updated>
	<author>
		<name>Angelo Chen</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;Thanks for the reply, but it does not work, still same error, i check the LinkImpl:
&lt;br&gt;&lt;br&gt;&amp;nbsp; public void addParameter(String parameterName, String value)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Defense.notBlank(parameterName, &amp;quot;parameterName&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Defense.notBlank(value, &amp;quot;value&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (parameters == null)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parameters = CollectionFactory.newMap();
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parameters.put(parameterName, value);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;it is making sure the value is not blank, but I believe query string having blank value is often.
&lt;br&gt;&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;Alexey Hanin wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message shrinkable-quote&quot;&gt;Just make it empty string when it's null:
&lt;br&gt;&lt;br&gt;lnk.addParameter(&amp;quot;country&amp;quot;, country == null ? &amp;quot;&amp;quot; : country);
&lt;br&gt;&lt;br&gt;On Mon, Nov 9, 2009 at 3:24 PM, Angelo Chen &amp;lt;angelochen960@yahoo.com.hk&amp;gt; wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I have a query string that I need to append to a  Link object, the query
&lt;br&gt;&amp;gt; string is:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ?gender=M&amp;country=
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I got two questions:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 1) is there a simple way to append this string to a Link object instead of
&lt;br&gt;&amp;gt; using addParameter?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 2) if I do a lnk.addParameter(&amp;quot;country&amp;quot;, null) and I got following:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  RequestExceptionHandler Unexpected runtime exception: Parameter value was
&lt;br&gt;&amp;gt; null or contained only whitespace.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; and I need to make the country part of query string even it is null, any
&lt;br&gt;&amp;gt; idea? thanks,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; A.C.
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; View this message in context: &lt;a href=&quot;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266356.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356p26266356.html&lt;/a&gt;&lt;br&gt;&amp;gt; Sent from the Tapestry - User 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: users-unsubscribe@tapestry.apache.org
&lt;br&gt;&amp;gt; For additional commands, e-mail: users-help@tapestry.apache.org
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;---------------------------------------------------------------------
&lt;br&gt;To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
&lt;br&gt;For additional commands, e-mail: users-help@tapestry.apache.org
&lt;br&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/Tapestry---User-f340.html&quot; embed=&quot;fixTarget[340]&quot; target=&quot;_top&quot; &gt;Tapestry - User&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/t5%3A-Link-s-addParameter-and-null-tp26266356s302p26266715.html" />
</entry>

</feed>
