Modified: 
websites/production/tapestry/content/creating-the-skeleton-application.html
==============================================================================
--- websites/production/tapestry/content/creating-the-skeleton-application.html 
(original)
+++ websites/production/tapestry/content/creating-the-skeleton-application.html 
Fri Feb 28 18:18:17 2025
@@ -170,15 +170,7 @@
   
<localRepository>C:/Users/joeuser/.m2/repository</localRepository>
 </settings>
 </code></pre>
-</div></div><p>Of course, adjust the <code>localRepository</code> element to 
match the correct path for your computer.</p><h3 
id="CreatingTheSkeletonApplication-CreateProject">Create Project</h3><p>Okay, 
let's get started creating our new project.</p><div 
class="confluence-information-macro confluence-information-macro-tip"><span 
class="aui-icon aui-icon-small aui-iconfont-approve 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>The instructions below use 
Eclipse's New Project wizard to create the project from a Maven archetype. If 
you'd rather use the <strong>mvn</strong> command line, see the <a 
href="getting-started.html">Getting Started</a> instructions, then skip to <a 
href="creating-the-skeleton-application.html">Creating The Skeleton 
Application</a> page.</p></div></div><p></p><p>In Eclipse, go to <strong>File 
&gt; New &gt;</strong> <strong>Project... &gt; Maven &gt; Maven 
Project</strong></p><p><strong><span class="confluence-embedd
 ed-file-wrapper confluence-embedded-manual-size"><img 
class="confluence-embedded-image" draggable="false" width="613" 
src="creating-the-skeleton-application.data/select-a-wizard.png"></span></strong></p><p>Then
 click <strong>Next</strong>, <strong>Next</strong> (again), and then on the 
<strong>Select an Archetype</strong> page click the <strong>Configure</strong> 
button on the Catalog line. The <strong>Archetype</strong> preferences dialog 
should appear. Click the <strong>Add Remote Catalog...</strong> button, as 
shown below:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="900" 
src="creating-the-skeleton-application.data/add-archetype-catalog.png"></span></p><p>As
 shown above, enter <span class="nolink"><span class="nolink">"<span 
class="nolink">http://tapestry.apache.org</span>"</span></span> in the Catalog 
File field, and "Apache Tapestry" in the Description field.</p><div class="c
 onfluence-information-macro confluence-information-macro-information"><span 
class="aui-icon aui-icon-small aui-iconfont-info 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>If you want to try an unreleased 
(alpha or beta) version of Tapestry, use <span class="nolink">the <strong><a 
class="external-link" 
href="https://repository.apache.org/content/repositories/staging";>https://repository.apache.org/content/repositories/staging</a></strong></span>
 archetype catalog file instead.</p></div></div><p>Click <strong>OK</strong>, 
then<strong> OK</strong> again.</p><p>On the Select an Archetype dialog (shown 
below), select the newly-added Apache Tapestry catalog, then select the 
"quickstart" artifact from the list and click 
<strong>Next</strong>.</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="804" 
src="creating-the-skeleton-application.data/select-a
 rchetype.png"></span></p><p></p><p><em><strong>Note:</strong> Screenshots in 
this tutorial may show different (either newer or older) versions of Tapestry 
than you may see.</em></p><p>Fill in the Group Id, Artifact Id, Version and 
Package&#160; as follows:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="530" 
src="creating-the-skeleton-application.data/specify-archetype-parameters.png"></span></p><p>then
 click Finish.</p><div class="confluence-information-macro 
confluence-information-macro-information"><span class="aui-icon aui-icon-small 
aui-iconfont-info confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>The first time you use Maven, 
project creation may take a while as Maven downloads a large number of JAR 
dependencies for Maven, Jetty and Tapestry. These downloaded files are cached 
locally and will not need to be downloaded again, but you d
 o have to be patient on first use.</p></div></div><p>After Maven finishes, 
you'll see a new directory, <code>tutorial1, in your Package Explorer view in 
Eclipse.</code></p><h2 
id="CreatingTheSkeletonApplication-RunningtheApplicationusingJetty">Running the 
Application using Jetty</h2><p>One of the first things you can do is use Maven 
to run Jetty directly.</p><p>Right-click on the <code>tutorial1</code> project 
in your Package Explorer view and select <strong>Run As &gt; Maven Build... 
&gt;</strong>, enter a Goal of <strong>"jetty:run"</strong>. This creates a 
"Run Configuration" named "tutorial1" that we'll use throughout this tutorial 
to start the app:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="568" 
src="creating-the-skeleton-application.data/run-configuration.png"></span></p><p>Tapestry
 runs best with a couple of additional options; click the "JRE" tab and enter 
the following 
 VM Arguments:</p>                    
-    
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning 
adaptavist-psl-js">
-    <b>This page contains macros or features from a plugin which requires a 
valid license.</b>
-
-            <p>You will need to contact your administrator.</p>
-    
-</div>
-<pre></pre><p>-Xmx600m</p><p>-Dtapestry.execution-mode=development</p>
+</div></div><p>Of course, adjust the <code>localRepository</code> element to 
match the correct path for your computer.</p><h3 
id="CreatingTheSkeletonApplication-CreateProject">Create Project</h3><p>Okay, 
let's get started creating our new project.</p><div 
class="confluence-information-macro confluence-information-macro-tip"><span 
class="aui-icon aui-icon-small aui-iconfont-approve 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>The instructions below use 
Eclipse's New Project wizard to create the project from a Maven archetype. If 
you'd rather use the <strong>mvn</strong> command line, see the <a 
href="getting-started.html">Getting Started</a> instructions, then skip to <a 
href="creating-the-skeleton-application.html">Creating The Skeleton 
Application</a> page.</p></div></div><p></p><p>In Eclipse, go to <strong>File 
&gt; New &gt;</strong> <strong>Project... &gt; Maven &gt; Maven 
Project</strong></p><p><strong><span class="confluence-embedd
 ed-file-wrapper confluence-embedded-manual-size"><img 
class="confluence-embedded-image" draggable="false" width="613" 
src="creating-the-skeleton-application.data/select-a-wizard.png"></span></strong></p><p>Then
 click <strong>Next</strong>, <strong>Next</strong> (again), and then on the 
<strong>Select an Archetype</strong> page click the <strong>Configure</strong> 
button on the Catalog line. The <strong>Archetype</strong> preferences dialog 
should appear. Click the <strong>Add Remote Catalog...</strong> button, as 
shown below:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="900" 
src="creating-the-skeleton-application.data/add-archetype-catalog.png"></span></p><p>As
 shown above, enter <span class="nolink"><span class="nolink">"<span 
class="nolink">http://tapestry.apache.org</span>"</span></span> in the Catalog 
File field, and "Apache Tapestry" in the Description field.</p><div class="c
 onfluence-information-macro confluence-information-macro-information"><span 
class="aui-icon aui-icon-small aui-iconfont-info 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>If you want to try an unreleased 
(alpha or beta) version of Tapestry, use <span class="nolink">the <strong><a 
class="external-link" 
href="https://repository.apache.org/content/repositories/staging";>https://repository.apache.org/content/repositories/staging</a></strong></span>
 archetype catalog file instead.</p></div></div><p>Click <strong>OK</strong>, 
then<strong> OK</strong> again.</p><p>On the Select an Archetype dialog (shown 
below), select the newly-added Apache Tapestry catalog, then select the 
"quickstart" artifact from the list and click 
<strong>Next</strong>.</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="804" 
src="creating-the-skeleton-application.data/select-a
 rchetype.png"></span></p><p></p><p><em><strong>Note:</strong> Screenshots in 
this tutorial may show different (either newer or older) versions of Tapestry 
than you may see.</em></p><p>Fill in the Group Id, Artifact Id, Version and 
Package&#160; as follows:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="530" 
src="creating-the-skeleton-application.data/specify-archetype-parameters.png"></span></p><p>then
 click Finish.</p><div class="confluence-information-macro 
confluence-information-macro-information"><span class="aui-icon aui-icon-small 
aui-iconfont-info confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>The first time you use Maven, 
project creation may take a while as Maven downloads a large number of JAR 
dependencies for Maven, Jetty and Tapestry. These downloaded files are cached 
locally and will not need to be downloaded again, but you d
 o have to be patient on first use.</p></div></div><p>After Maven finishes, 
you'll see a new directory, <code>tutorial1, in your Package Explorer view in 
Eclipse.</code></p><h2 
id="CreatingTheSkeletonApplication-RunningtheApplicationusingJetty">Running the 
Application using Jetty</h2><p>One of the first things you can do is use Maven 
to run Jetty directly.</p><p>Right-click on the <code>tutorial1</code> project 
in your Package Explorer view and select <strong>Run As &gt; Maven Build... 
&gt;</strong>, enter a Goal of <strong>"jetty:run"</strong>. This creates a 
"Run Configuration" named "tutorial1" that we'll use throughout this tutorial 
to start the app:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="568" 
src="creating-the-skeleton-application.data/run-configuration.png"></span></p><p>Tapestry
 runs best with a couple of additional options; click the "JRE" tab and enter 
the following 
 VM 
Arguments:</p><pre></pre><p>-Xmx600m</p><p>-Dtapestry.execution-mode=development</p>
 
 
 <p><code>Here's how it looks:</code></p><p><code><span 
class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img 
class="confluence-embedded-image" draggable="false" width="666" 
src="creating-the-skeleton-application.data/run-configuration-jre.png"></span></code></p><p>Finally,
 click <strong>Run</strong>.</p><p>Again, the first time, there's a dizzying 
number of downloads, but before you know it, the Jetty servlet container is up 
and running.</p><p>Once Jetty is initialized (which only takes a few seconds 
after the first time), you'll see the following in your console:</p><p><span 
class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img 
class="confluence-embedded-image" draggable="false" width="865" 
src="creating-the-skeleton-application.data/console-startup.png"></span></p><p><em>Note
 the red square icon above. Later on you'll use that icon to stop Jetty before 
restarting the app.</em></p><p>You can now open a web browser to <a 
class="externa
 l-link" href="http://localhost:8080/tutorial1/"; 
rel="nofollow">http://localhost:8080/tutorial1/</a> to see the running 
application:</p><p><span class="confluence-embedded-file-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image" 
draggable="false" width="785" 
src="creating-the-skeleton-application.data/startpage.png"></span></p><p></p><p 
style="text-align: left;"><strong><em>NOTE: Your screen may look very different 
depending on the version of Tapestry you are using!</em></strong></p><p 
style="text-align: left;">The date and time in the middle of the page shows 
that this is a live application.</p><p>This is a complete little web app; it 
doesn't do much, but it demonstrate how to create a number of pages sharing a 
common layout, and demonstrates some simple navigation and link handling. You 
can see that it has several different pages that share a common layout. 
(<span><em>Layout</em> is a loose term meaning common look and feel and 
navigation across many or 
 all of the pages of an application. Often an application will include a Layout 
component to provide that commonness.)</span></p><p><span>Next:&#160;<a 
href="exploring-the-project.html">Exploring the 
Project</a></span></p><p><span></span></p></div>

Modified: websites/production/tapestry/content/css.html
==============================================================================
--- websites/production/tapestry/content/css.html (original)
+++ websites/production/tapestry/content/css.html Fri Feb 28 18:18:17 2025
@@ -154,15 +154,7 @@
             
             <!-- /// Content Start -->
             <div id="content">
-                            <div id="ConfluenceContent"><p></p><p>Most web 
applications delegate to <strong>Cascading Style Sheets</strong> (CSS) the 
stylistic details of the page &#8211; fonts, colors, margins, borders and 
alignment. This helps the remaining HTML to remain simple and semantic, which 
usually makes it easier to read and maintain.</p>                    
-    
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning 
adaptavist-psl-js">
-    <b>This page contains macros or features from a plugin which requires a 
valid license.</b>
-
-            <p>You will need to contact your administrator.</p>
-    
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+                            <div id="ConfluenceContent"><p></p><p>Most web 
applications delegate to <strong>Cascading Style Sheets</strong> (CSS) the 
stylistic details of the page &#8211; fonts, colors, margins, borders and 
alignment. This helps the remaining HTML to remain simple and semantic, which 
usually makes it easier to read and maintain.</p><div class="aui-label" 
style="float:right" title="Related Articles">
 
 
 

Modified: websites/production/tapestry/content/default-parameter.html
==============================================================================
--- websites/production/tapestry/content/default-parameter.html (original)
+++ websites/production/tapestry/content/default-parameter.html Fri Feb 28 
18:18:17 2025
@@ -154,15 +154,7 @@
             
             <!-- /// Content Start -->
             <div id="content">
-                            <div id="ConfluenceContent"><p>Many of the 
components provided with Tapestry share a common behavior: if the component's 
id matches a property of the container, then some parameter of the component 
(usually value) defaults to that property.</p>                    
-    
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning 
adaptavist-psl-js">
-    <b>This page contains macros or features from a plugin which requires a 
valid license.</b>
-
-            <p>You will need to contact your administrator.</p>
-    
-</div>
-<div class="aui-label" style="float:right; margin: 1em" title="Related 
Articles">
+                            <div id="ConfluenceContent"><p>Many of the 
components provided with Tapestry share a common behavior: if the component's 
id matches a property of the container, then some parameter of the component 
(usually value) defaults to that property.</p><div class="aui-label" 
style="float:right; margin: 1em" title="Related Articles">
 
 
 

Modified: websites/production/tapestry/content/developer-bible.html
==============================================================================
--- websites/production/tapestry/content/developer-bible.html (original)
+++ websites/production/tapestry/content/developer-bible.html Fri Feb 28 
18:18:17 2025
@@ -154,15 +154,7 @@
             
             <!-- /// Content Start -->
             <div id="content">
-                            <div id="ConfluenceContent"><p>IDE choices, coding 
style and formatting, commit practices, naming conventions and other issues 
relevant to Tapestry committers &amp; contributers.</p>                    
-    
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning 
adaptavist-psl-js">
-    <b>This page contains macros or features from a plugin which requires a 
valid license.</b>
-
-            <p>You will need to contact your administrator.</p>
-    
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+                            <div id="ConfluenceContent"><p>IDE choices, coding 
style and formatting, commit practices, naming conventions and other issues 
relevant to Tapestry committers &amp; contributers.</p><div class="aui-label" 
style="float:right" title="Related Articles">
 
 
 
@@ -233,7 +225,7 @@
 </div>
 
 
-<h2 id="DeveloperBible-IDEChoices">IDE Choices</h2><h3 
id="DeveloperBible-IntelliJ">IntelliJ</h3><p>It's a free license for all 
committers and it's just better. Yes, the first few days can be an unpleasant 
fumble because everything is almost, but not quite, familiar. Pretty soon 
you'll love IDEA and recognize that Eclipse has been bending you over and doing 
unspeakable things.</p><p>There are shared code formatting settings in the <a 
class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=tree;f=support";>support
 directory</a> (idea-settings.jar). This will prevent unexpected conflicts due 
to formatting.</p><h3 id="DeveloperBible-Eclipse">Eclipse</h3><p>Howard uses 
this ... because he can't manage to switch IDEs constantly (he uses Eclipse for 
training). Lately its gotten better.</p><p>As with IntelliJ, there are shared 
code formatting settings for Eclipse in the <a class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=t
 ree;f=support">support directory</a> (tapestry-indent-eclipse.xml).</p><h2 
id="DeveloperBible-Copyrights">Copyrights</h2><p>All source files should have 
the ASF copyright comment on top, except where such a comment would interfere 
with its behavior. For example, component template files omit the 
comment.</p><p>As you make changes to files, update the copyright to add the 
current year to the list. The goal is that the copyright notice includes the 
year in which files change. When creating a new file, don't back date the 
copyright year ... start with the current year. Try not to change the copyright 
year on files that haven't actually changed.</p><p>IntelliJ has a great 
comparison view: Cmd-9 to see the local changes, the Cmd-D to see the 
differences. You can whip through the changes (using Cmd-forward arrow) and 
make sure copyrights are up to date as you review the changes prior to a 
commit.</p><h2 id="DeveloperBible-CommitMessages">Commit Messages</h2><p>Always 
provide a commit mess
 age. Howard generally tries to work off the JIRA, so his commit message is 
often:</p><blockquote><p>TAP5-1234: Make the Foo Widget more 
Ajax-tastic!</p></blockquote><p>It is <em>very important</em> to include the 
JIRA issue id in the commit. This is used in many places: JIRA links issues to 
the Git&#160;commits for that issue (very handy for seeing what changed as part 
of a bug fix). The Hudson CI server does as well, and will actually link 
Git&#160;commits to issues after succesfully building.</p><h2 
id="DeveloperBible-JIRAProcedures">JIRA Procedures</h2><p>All Tapestry 
committers should be registerred with JIRA and part of the tapestry-developers 
JIRA group.</p><p>Every committer is invited to look at the list of <a 
class="external-link" 
href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;requestId=12317068";>'Review
 for closing'</a> issues and review them as it contains probably outdated or no 
more valid issues.</p><p>There's also a list of all <a class="
 external-link" 
href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;requestId=12316792";>Open</a>
 issue about the project.</p><p>Ideally, we would always work top priortity to 
low priority. Howard sometimes jump out of order, if there's something cool to 
work on that fits in an available time slot. Alternately, you are always 
allowed to change the priority of a bug before or as you work it.</p><p>As a 
general rule issues which are "<em>Invalid</em>" or "<em>Won't</em> 
<em>Fix</em>" shouldn't have a "<em>Fix</em> <em>version</em>".</p><h3 
id="DeveloperBible-Startingwork">Starting work</h3><p>When you start to work on 
an issue, make sure it is <em>assigned to you</em> and use the <em>start 
progress</em> option.</p><p>Add comments about the state of the fix, or the 
challenges in creating a fix. This often spurs the Issue's adder to provide 
more details.</p><p>Update the issue description to make it more legible and 
more precise if needed, i.e., "NPE in CheckUpda
 tes" might become "NullPointerException when checking for updates to files 
that have been deleted". Verbose is good.</p><h3 
id="DeveloperBible-Closingbugs">Closing bugs</h3><p>Is it a bug fix without 
tests? <strong>No.</strong> A good plan is to write a test that fails then work 
the code until the test passes. Often code works in a unit test but fails 
unexpectedly in an integration test. As the G-Man says <em>"Expect unforeseen 
consequences"</em>.</p><p>When you check in a fix, you should 
<strong>close</strong> the issue and make sure the <strong>fix release</strong> 
is correct.</p><p>We're playing fast and loose &#8211; a better procedure would 
be to mark the bug resolved and verify the fix before closing it. That's ok, we 
have a community to double check our work <img class="emoticon emoticon-smile" 
src="https://cwiki.apache.org/confluence/s/5tj15x/8804/z1btw/_/images/icons/emoticons/smile.svg";
 data-emoticon-name="smile" alt="(smile)">.</p><p>For anything non-trivial, 
wait for the
  Hudson CI server to build. It catches a lot of things ... such as files that 
were not added to Git. And even IntelliJ has a bit of trouble with wildly 
refactored code. Hudson will catch all that.</p><h3 
id="DeveloperBible-Invalidissuesandduplicates">Invalid issues and 
duplicates</h3><p>Always provide comments about why_ an issue is invalid 
(<em>"A Ruby implementation of Tapestry is out of scope for the 
project."</em>), or at least, a link to the duplicate issues.</p><p>Consider 
writing new tests to prove that an issue is not valid and then leave the tests 
in place &#8211; then close the bug as invalid.</p><p>Close the issue but 
<em>make sure the fix release is blank</em>. Otherwise, the issue <em>will be 
listed in the release notes</em>, which we don't want.</p><h2 
id="DeveloperBible-Publicvs.Private/Internal">Public vs. 
Private/Internal</h2><p>This is a real big deal. As long as code is in the 
internal package, we have a high degree of carte-blanche to change it. As soon 
as code i
 s public, we become handcuffed to backwards 
compatibility.</p><p><em>Interfaces are public, implementations are 
private</em>. You can see this is the bulk of the code, where 
org.apache.tapestry5.services is almost all interfaces and the implementations 
are in org.apache.tapestry5.internal.services.</p><p>Many more services have 
both the interface and the implementation in 
org.apache.tapestry5.internal.services.</p><p>We absolutely <em>do not</em> 
want to make Page or ComponentPageElement public. You will often see public 
service facades that take a page name as a method parameter, and convert it to 
a page instance before invoking methods on internal services.</p><h2 
id="DeveloperBible-EvolvingComponents">Evolving Components</h2><p>We do not 
have a specific plan for this yet. Future Tapestry 5 will add features to allow 
clean renames of parameters, and a way to deprecated and eventually remove 
components.</p><h2 id="DeveloperBible-EvolvingInterfaces">Evolving 
Interfaces</h2><p>Tapest
 ry uses interfaces quite extensively.</p><p>Interfaces fall into two 
categories: service interfaces called by user code, and interfaces implemented 
by user code.</p><p>Internal interfaces may be changed at any time. That's why 
so much is kept internal.</p><h3 id="DeveloperBible-ServiceInterfaces">Service 
Interfaces</h3><p>New methods may be added if absolutely necessary, but this 
should be avoided if at all possible. Don't forget the <code>@since</code> 
Javadoc annotation.</p><p>Consider having a stable public facade service whose 
implementation calls into one or more internal service.</p><h3 
id="DeveloperBible-UserInterfaces">User Interfaces</h3><p>These should be 
frozen, no changes once released. Failure to do so causes <em>non-backwards 
compatible upgrade problems</em>; that is, classes that implement the (old) 
interface are suddenly invalid, missing methods from the (new) 
interface.</p><p>Consider introducing a new interface that extends the old one 
and adds new methods. Make su
 re you support both.</p><p>You can see this with ServiceDef and ServiceDef2 
(which extends ServiceDef). Yes this can be a bit ugly.</p><p>Howard uses 
utility methods that convert from ServiceDef to ServiceDef2, adding a wrapper 
implementation around a ServiceDef instance if necessary:</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<h2 id="DeveloperBible-IDEChoices">IDE Choices</h2><h3 
id="DeveloperBible-IntelliJ">IntelliJ</h3><p>It's a free license for all 
committers and it's just better. Yes, the first few days can be an unpleasant 
fumble because everything is almost, but not quite, familiar. Pretty soon 
you'll love IDEA and recognize that Eclipse has been bending you over and doing 
unspeakable things.</p><p>There are shared code formatting settings in the <a 
class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=tree;f=support";>support
 directory</a> (idea-settings.jar). This will prevent unexpected conflicts due 
to formatting.</p><h3 id="DeveloperBible-Eclipse">Eclipse</h3><p>Howard uses 
this ... because he can't manage to switch IDEs constantly (he uses Eclipse for 
training). Lately its gotten better.</p><p>As with IntelliJ, there are shared 
code formatting settings for Eclipse in the <a class="external-link" 
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=t
 ree;f=support">support directory</a> (tapestry-indent-eclipse.xml).</p><h2 
id="DeveloperBible-Copyrights">Copyrights</h2><p>All source files should have 
the ASF copyright comment on top, except where such a comment would interfere 
with its behavior. For example, component template files omit the 
comment.</p><p>As you make changes to files, update the copyright to add the 
current year to the list. The goal is that the copyright notice includes the 
year in which files change. When creating a new file, don't back date the 
copyright year ... start with the current year. Try not to change the copyright 
year on files that haven't actually changed.</p><p>IntelliJ has a great 
comparison view: Cmd-9 to see the local changes, the Cmd-D to see the 
differences. You can whip through the changes (using Cmd-forward arrow) and 
make sure copyrights are up to date as you review the changes prior to a 
commit.</p><h2 id="DeveloperBible-CommitMessages">Commit Messages</h2><p>Always 
provide a commit mess
 age. Howard generally tries to work off the JIRA, so his commit message is 
often:</p><blockquote><p>TAP5-1234: Make the Foo Widget more 
Ajax-tastic!</p></blockquote><p>It is <em>very important</em> to include the 
JIRA issue id in the commit. This is used in many places: JIRA links issues to 
the Git&#160;commits for that issue (very handy for seeing what changed as part 
of a bug fix). The Hudson CI server does as well, and will actually link 
Git&#160;commits to issues after succesfully building.</p><h2 
id="DeveloperBible-JIRAProcedures">JIRA Procedures</h2><p>All Tapestry 
committers should be registerred with JIRA and part of the tapestry-developers 
JIRA group.</p><p>Every committer is invited to look at the list of <a 
class="external-link" 
href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;requestId=12317068";>'Review
 for closing'</a> issues and review them as it contains probably outdated or no 
more valid issues.</p><p>There's also a list of all <a class="
 external-link" 
href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;requestId=12316792";>Open</a>
 issue about the project.</p><p>Ideally, we would always work top priortity to 
low priority. Howard sometimes jump out of order, if there's something cool to 
work on that fits in an available time slot. Alternately, you are always 
allowed to change the priority of a bug before or as you work it.</p><p>As a 
general rule issues which are "<em>Invalid</em>" or "<em>Won't</em> 
<em>Fix</em>" shouldn't have a "<em>Fix</em> <em>version</em>".</p><h3 
id="DeveloperBible-Startingwork">Starting work</h3><p>When you start to work on 
an issue, make sure it is <em>assigned to you</em> and use the <em>start 
progress</em> option.</p><p>Add comments about the state of the fix, or the 
challenges in creating a fix. This often spurs the Issue's adder to provide 
more details.</p><p>Update the issue description to make it more legible and 
more precise if needed, i.e., "NPE in CheckUpda
 tes" might become "NullPointerException when checking for updates to files 
that have been deleted". Verbose is good.</p><h3 
id="DeveloperBible-Closingbugs">Closing bugs</h3><p>Is it a bug fix without 
tests? <strong>No.</strong> A good plan is to write a test that fails then work 
the code until the test passes. Often code works in a unit test but fails 
unexpectedly in an integration test. As the G-Man says <em>"Expect unforeseen 
consequences"</em>.</p><p>When you check in a fix, you should 
<strong>close</strong> the issue and make sure the <strong>fix release</strong> 
is correct.</p><p>We're playing fast and loose &#8211; a better procedure would 
be to mark the bug resolved and verify the fix before closing it. That's ok, we 
have a community to double check our work <img class="emoticon emoticon-smile" 
src="https://cwiki.apache.org/confluence/s/alfxyv/8804/z1btw/_/images/icons/emoticons/smile.svg";
 data-emoticon-name="smile" alt="(smile)">.</p><p>For anything non-trivial, 
wait for the
  Hudson CI server to build. It catches a lot of things ... such as files that 
were not added to Git. And even IntelliJ has a bit of trouble with wildly 
refactored code. Hudson will catch all that.</p><h3 
id="DeveloperBible-Invalidissuesandduplicates">Invalid issues and 
duplicates</h3><p>Always provide comments about why_ an issue is invalid 
(<em>"A Ruby implementation of Tapestry is out of scope for the 
project."</em>), or at least, a link to the duplicate issues.</p><p>Consider 
writing new tests to prove that an issue is not valid and then leave the tests 
in place &#8211; then close the bug as invalid.</p><p>Close the issue but 
<em>make sure the fix release is blank</em>. Otherwise, the issue <em>will be 
listed in the release notes</em>, which we don't want.</p><h2 
id="DeveloperBible-Publicvs.Private/Internal">Public vs. 
Private/Internal</h2><p>This is a real big deal. As long as code is in the 
internal package, we have a high degree of carte-blanche to change it. As soon 
as code i
 s public, we become handcuffed to backwards 
compatibility.</p><p><em>Interfaces are public, implementations are 
private</em>. You can see this is the bulk of the code, where 
org.apache.tapestry5.services is almost all interfaces and the implementations 
are in org.apache.tapestry5.internal.services.</p><p>Many more services have 
both the interface and the implementation in 
org.apache.tapestry5.internal.services.</p><p>We absolutely <em>do not</em> 
want to make Page or ComponentPageElement public. You will often see public 
service facades that take a page name as a method parameter, and convert it to 
a page instance before invoking methods on internal services.</p><h2 
id="DeveloperBible-EvolvingComponents">Evolving Components</h2><p>We do not 
have a specific plan for this yet. Future Tapestry 5 will add features to allow 
clean renames of parameters, and a way to deprecated and eventually remove 
components.</p><h2 id="DeveloperBible-EvolvingInterfaces">Evolving 
Interfaces</h2><p>Tapest
 ry uses interfaces quite extensively.</p><p>Interfaces fall into two 
categories: service interfaces called by user code, and interfaces implemented 
by user code.</p><p>Internal interfaces may be changed at any time. That's why 
so much is kept internal.</p><h3 id="DeveloperBible-ServiceInterfaces">Service 
Interfaces</h3><p>New methods may be added if absolutely necessary, but this 
should be avoided if at all possible. Don't forget the <code>@since</code> 
Javadoc annotation.</p><p>Consider having a stable public facade service whose 
implementation calls into one or more internal service.</p><h3 
id="DeveloperBible-UserInterfaces">User Interfaces</h3><p>These should be 
frozen, no changes once released. Failure to do so causes <em>non-backwards 
compatible upgrade problems</em>; that is, classes that implement the (old) 
interface are suddenly invalid, missing methods from the (new) 
interface.</p><p>Consider introducing a new interface that extends the old one 
and adds new methods. Make su
 re you support both.</p><p>You can see this with ServiceDef and ServiceDef2 
(which extends ServiceDef). Yes this can be a bit ugly.</p><p>Howard uses 
utility methods that convert from ServiceDef to ServiceDef2, adding a wrapper 
implementation around a ServiceDef instance if necessary:</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre><code class="language-java">  public static ServiceDef2 
toServiceDef2(final ServiceDef sd)
   {
     if (sd instanceof ServiceDef2)
@@ -255,7 +247,7 @@
     };
   }
 </code></pre>
-</div></div><h2 id="DeveloperBible-Useof@since">Use of @since</h2><p>When 
adding new classes or interface, or adding new methods to existing types, add 
an @since Javadoc comment.</p><p>Use the complete version number of the release 
in which the type or method was added: i.e., <em>@since 5.1.0.3</em>.</p><h2 
id="DeveloperBible-CodeStyle&amp;Formatting">Code Style &amp; 
Formatting</h2><p>Yes, at one time Howard used leading underscores for field 
names. He has since changed my mind, but this unfortunately infected other 
people; please try to make your code blend in when modifying existing 
source.</p><p>Long ago, Tapestry (3) code used the regrettable 
"leading-I-on-interfaces" style. Don't do that. Instead, name the 
implementation class with an "Impl" at the end.</p><p>Howard prefers braces on 
a new line (and thus, open braces lined up with close braces), so that's what 
the default code formatting is set up for. It's okay to omit braces for trivial 
one-liner if statements, such as <code
 >if (!test) return;</code>.</p><p>Indent with 4 spaces instead of 
 >tabs.</p><p>Use a lot of vertical whitespace to break methods into logical 
 >sections.</p><p>We're coding Java, not Pascal; it's better to have a few 
 >checks early on with quick returns or exceptions than have ten-levels deep 
 >block nesting just so a method can have a single return statement. In other 
 >words, <em>else considered harmful</em>. Low code complexity is better, more 
 >readable, more maintainable code.</p><p>Don't bother alphabetizing things, 
 >because the IDE lets you jump around easily.</p><p><em>Final is the new 
 >private.</em> Final fields are great for multi-threaded code. Especially when 
 >creating service implementations with dependencies, store those dependencies 
 >into final fields. Once we're all running on 100 core workstations, you'll 
 >thank me. Seriously, Java's memory model is seriously twisted stuff, and 
 >assigning to a non-final field from a constructor opens up a tiny window of 
 >non-thread safety.</p><h2 id=
 "DeveloperBible-Comments">Comments</h2><p>Comments are overwhelmingly 
important. Try to capture the <em>why</em> of a class or method. Add lots of 
links, to code that will be invoked by the method, to related methods or 
classes, and so forth. For instance, you may often have an annotation, a worker 
class for the annotation, and a related service all cross-linked.</p><p>Comment 
the <em>interfaces</em> and don't get worked up on the 
<em>implementations</em>. Javadoc does a perfectly good job of copying 
interface comments to implementations, so this falls under the <em>Don't Repeat 
Yourself</em> guideline.</p><p>Be very careful about documenting what methods 
can accept null, and what methods may return null. Generally speaking, people 
will assume that null is not allowed for parameters, and method will never 
return null, unless it is explicitly documented that null is allowed (or 
potentially returned).</p><h2 
id="DeveloperBible-Documentation">Documentation</h2><p>Try and keep the docum
 entation up-to date as you make changes; it is <em>much</em> harder to do so 
later. This is now much easier using the Confluence wiki (you're reading the 
result <img class="emoticon emoticon-smile" 
src="https://cwiki.apache.org/confluence/s/5tj15x/8804/z1btw/_/images/icons/emoticons/smile.svg";
 data-emoticon-name="smile" alt="(smile)">).</p><p>Documentation was at one 
point the <em>#1 criticism</em> of Tapestry!</p><h2 
id="DeveloperBible-ClassandMethodNamingConventions">Class and Method Naming 
Conventions</h2><p>Naming things is hard. Names that make sense to one person 
won't to another.</p><p>That being said, Howard has tried to be somewhat 
consistent with naming. Not perfectly.</p><h3 
id="DeveloperBible-Factory,Creator">Factory, Creator</h3><p>A factory class 
creates new objects. Methods will often be prefixed with "create" or "new". 
Don't expect a Factory to cache anything, it just creates new things.</p><h3 
id="DeveloperBible-Source">Source</h3><p>A source is a level up from a Fa
 ctory. It <em>may</em> combine multiple factories together. It 
<em>usually</em> will cache the result. Method are often prefixed with 
"get".</p><h3 id="DeveloperBible-Findvs.Get">Find vs. Get</h3><p>For methods: A 
"find" prefix indicates that a non-match is valid and null may be returned. A 
"get" prefix indicates that a non-match is invalid and an exception will be 
thrown in that case (and null will never be returned).</p><h3 
id="DeveloperBible-Contribution">Contribution</h3><p>A data object usually 
associated with a Tapestry IoC service's configuration.</p><h3 
id="DeveloperBible-Filter">Filter</h3><p>Part of a pipeline, where there's an 
associated main interface, and the Filter wraps around that main interface. 
Each main interface method is duplicated in the Filter, with an extra parameter 
used to chain the interface.</p><h3 
id="DeveloperBible-Manager">Manager</h3><p>Often a wrapper around a service 
configuration, it provides access to the contributed values (possibly after 
some tr
 ansformation).</p><h3 id="DeveloperBible-To">To</h3><p>A method prefix that 
indicates a conversion or coersion from one type to another. I.e., 
<code>toUserPresentable()</code>.</p><h3 
id="DeveloperBible-Worker">Worker</h3><p>An object that peforms a specific job. 
Workers will be stateless, but will be passed a stateful object to perform some 
operation upon.</p><h3 id="DeveloperBible-Builder">Builder</h3><p>An object 
whose job is to create other objects, typically in the context of creating a 
core service implementation for a Tapestry IoC service (such as PipelineBuilder 
or ChainBuilder).</p><h3 id="DeveloperBible-Support">Support</h3><p>An object 
that provides supporting operations to other objects; this is a kind of "loose 
aggregation".</p><h3 id="DeveloperBible-Parameters">Parameters</h3><p>A data 
object that holds a number of related values that would otherwise be separate 
parameter values to a method. This tends to streamline code (especially when 
using a Filter interface) and a
 llows the parameters to be evolved without changing the method 
signature.</p><h3 id="DeveloperBible-Strategy">Strategy</h3><p>An object that 
"plugs into" some other code, allowing certain decisions to be deferred to the 
Strategy. Often a Strategy is selected based on the type of some object being 
operated upon.</p><h3 id="DeveloperBible-Context">Context</h3><p>Captures some 
stateful information that may be passed around between stateless 
services.</p><h3 id="DeveloperBible-Constants">Constants</h3><p>A 
non-instantiable class that contains public static fields that are referenced 
in multiple places.</p><h3 id="DeveloperBible-Hub">Hub</h3><p>An object that 
allows listeners to be registered. Often includes a method prefixed with 
"trigger" that will send notifications to listeners.</p><h2 
id="DeveloperBible-ImplementtoString()">Implement 
<code>toString()</code></h2><p>Objects that are exposed to user code should 
generally implement a meaningful toString() method. And that method should 
 be tested.</p><h2 id="DeveloperBible-Subclassing">Subclassing</h2><p>You'll 
notice there isn't a lot of inheritance in Tapestry. Given the function of the 
IoC container, it is much more common to use some variation of 
<em>aggregation</em> rather than <em>inheritance</em>.</p><p>Where subclassing 
exists, the guideline for constructor parameters is: the subclass should 
include all the constructor parameters of the superclass, in the same 
positions. Thus subclass constructor parameters are appended to the list of 
super-class constructor parameters.</p></div>
+</div></div><h2 id="DeveloperBible-Useof@since">Use of @since</h2><p>When 
adding new classes or interface, or adding new methods to existing types, add 
an @since Javadoc comment.</p><p>Use the complete version number of the release 
in which the type or method was added: i.e., <em>@since 5.1.0.3</em>.</p><h2 
id="DeveloperBible-CodeStyle&amp;Formatting">Code Style &amp; 
Formatting</h2><p>Yes, at one time Howard used leading underscores for field 
names. He has since changed my mind, but this unfortunately infected other 
people; please try to make your code blend in when modifying existing 
source.</p><p>Long ago, Tapestry (3) code used the regrettable 
"leading-I-on-interfaces" style. Don't do that. Instead, name the 
implementation class with an "Impl" at the end.</p><p>Howard prefers braces on 
a new line (and thus, open braces lined up with close braces), so that's what 
the default code formatting is set up for. It's okay to omit braces for trivial 
one-liner if statements, such as <code
 >if (!test) return;</code>.</p><p>Indent with 4 spaces instead of 
 >tabs.</p><p>Use a lot of vertical whitespace to break methods into logical 
 >sections.</p><p>We're coding Java, not Pascal; it's better to have a few 
 >checks early on with quick returns or exceptions than have ten-levels deep 
 >block nesting just so a method can have a single return statement. In other 
 >words, <em>else considered harmful</em>. Low code complexity is better, more 
 >readable, more maintainable code.</p><p>Don't bother alphabetizing things, 
 >because the IDE lets you jump around easily.</p><p><em>Final is the new 
 >private.</em> Final fields are great for multi-threaded code. Especially when 
 >creating service implementations with dependencies, store those dependencies 
 >into final fields. Once we're all running on 100 core workstations, you'll 
 >thank me. Seriously, Java's memory model is seriously twisted stuff, and 
 >assigning to a non-final field from a constructor opens up a tiny window of 
 >non-thread safety.</p><h2 id=
 "DeveloperBible-Comments">Comments</h2><p>Comments are overwhelmingly 
important. Try to capture the <em>why</em> of a class or method. Add lots of 
links, to code that will be invoked by the method, to related methods or 
classes, and so forth. For instance, you may often have an annotation, a worker 
class for the annotation, and a related service all cross-linked.</p><p>Comment 
the <em>interfaces</em> and don't get worked up on the 
<em>implementations</em>. Javadoc does a perfectly good job of copying 
interface comments to implementations, so this falls under the <em>Don't Repeat 
Yourself</em> guideline.</p><p>Be very careful about documenting what methods 
can accept null, and what methods may return null. Generally speaking, people 
will assume that null is not allowed for parameters, and method will never 
return null, unless it is explicitly documented that null is allowed (or 
potentially returned).</p><h2 
id="DeveloperBible-Documentation">Documentation</h2><p>Try and keep the docum
 entation up-to date as you make changes; it is <em>much</em> harder to do so 
later. This is now much easier using the Confluence wiki (you're reading the 
result <img class="emoticon emoticon-smile" 
src="https://cwiki.apache.org/confluence/s/alfxyv/8804/z1btw/_/images/icons/emoticons/smile.svg";
 data-emoticon-name="smile" alt="(smile)">).</p><p>Documentation was at one 
point the <em>#1 criticism</em> of Tapestry!</p><h2 
id="DeveloperBible-ClassandMethodNamingConventions">Class and Method Naming 
Conventions</h2><p>Naming things is hard. Names that make sense to one person 
won't to another.</p><p>That being said, Howard has tried to be somewhat 
consistent with naming. Not perfectly.</p><h3 
id="DeveloperBible-Factory,Creator">Factory, Creator</h3><p>A factory class 
creates new objects. Methods will often be prefixed with "create" or "new". 
Don't expect a Factory to cache anything, it just creates new things.</p><h3 
id="DeveloperBible-Source">Source</h3><p>A source is a level up from a Fa
 ctory. It <em>may</em> combine multiple factories together. It 
<em>usually</em> will cache the result. Method are often prefixed with 
"get".</p><h3 id="DeveloperBible-Findvs.Get">Find vs. Get</h3><p>For methods: A 
"find" prefix indicates that a non-match is valid and null may be returned. A 
"get" prefix indicates that a non-match is invalid and an exception will be 
thrown in that case (and null will never be returned).</p><h3 
id="DeveloperBible-Contribution">Contribution</h3><p>A data object usually 
associated with a Tapestry IoC service's configuration.</p><h3 
id="DeveloperBible-Filter">Filter</h3><p>Part of a pipeline, where there's an 
associated main interface, and the Filter wraps around that main interface. 
Each main interface method is duplicated in the Filter, with an extra parameter 
used to chain the interface.</p><h3 
id="DeveloperBible-Manager">Manager</h3><p>Often a wrapper around a service 
configuration, it provides access to the contributed values (possibly after 
some tr
 ansformation).</p><h3 id="DeveloperBible-To">To</h3><p>A method prefix that 
indicates a conversion or coersion from one type to another. I.e., 
<code>toUserPresentable()</code>.</p><h3 
id="DeveloperBible-Worker">Worker</h3><p>An object that peforms a specific job. 
Workers will be stateless, but will be passed a stateful object to perform some 
operation upon.</p><h3 id="DeveloperBible-Builder">Builder</h3><p>An object 
whose job is to create other objects, typically in the context of creating a 
core service implementation for a Tapestry IoC service (such as PipelineBuilder 
or ChainBuilder).</p><h3 id="DeveloperBible-Support">Support</h3><p>An object 
that provides supporting operations to other objects; this is a kind of "loose 
aggregation".</p><h3 id="DeveloperBible-Parameters">Parameters</h3><p>A data 
object that holds a number of related values that would otherwise be separate 
parameter values to a method. This tends to streamline code (especially when 
using a Filter interface) and a
 llows the parameters to be evolved without changing the method 
signature.</p><h3 id="DeveloperBible-Strategy">Strategy</h3><p>An object that 
"plugs into" some other code, allowing certain decisions to be deferred to the 
Strategy. Often a Strategy is selected based on the type of some object being 
operated upon.</p><h3 id="DeveloperBible-Context">Context</h3><p>Captures some 
stateful information that may be passed around between stateless 
services.</p><h3 id="DeveloperBible-Constants">Constants</h3><p>A 
non-instantiable class that contains public static fields that are referenced 
in multiple places.</p><h3 id="DeveloperBible-Hub">Hub</h3><p>An object that 
allows listeners to be registered. Often includes a method prefixed with 
"trigger" that will send notifications to listeners.</p><h2 
id="DeveloperBible-ImplementtoString()">Implement 
<code>toString()</code></h2><p>Objects that are exposed to user code should 
generally implement a meaningful toString() method. And that method should 
 be tested.</p><h2 id="DeveloperBible-Subclassing">Subclassing</h2><p>You'll 
notice there isn't a lot of inheritance in Tapestry. Given the function of the 
IoC container, it is much more common to use some variation of 
<em>aggregation</em> rather than <em>inheritance</em>.</p><p>Where subclassing 
exists, the guideline for constructor parameters is: the subclass should 
include all the constructor parameters of the superclass, in the same 
positions. Thus subclass constructor parameters are appended to the list of 
super-class constructor parameters.</p></div>
             </div>
             <!-- /// Content End -->
           </div>

Modified: websites/production/tapestry/content/documentation.html
==============================================================================
--- websites/production/tapestry/content/documentation.html (original)
+++ websites/production/tapestry/content/documentation.html Fri Feb 28 18:18:17 
2025
@@ -154,15 +154,7 @@
             
             <!-- /// Content Start -->
             <div id="content">
-                            <div id="ConfluenceContent">                    
-    
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning 
adaptavist-psl-js">
-    <b>This page contains macros or features from a plugin which requires a 
valid license.</b>
-
-            <p>You will need to contact your administrator.</p>
-    
-</div>
-<div style="float:right;margin-left:1em"><h2 id="Documentation-AllTopics">All 
Topics</h2><ul class="childpages-macro"><li><a 
href="introduction.html">Introduction</a></li><li><a 
href="getting-started.html">Getting Started</a></li><li><a 
href="principles.html">Principles</a></li><li><a 
href="tapestry-tutorial.html">Tapestry Tutorial</a><ul 
class="childpages-macro"><li><a 
href="dependencies-tools-and-plugins.html">Dependencies, Tools and 
Plugins</a></li><li><a href="creating-the-skeleton-application.html">Creating 
The Skeleton Application</a></li><li><a 
href="exploring-the-project.html">Exploring the Project</a></li><li><a 
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo 
Guessing Game</a></li><li><a 
href="using-beaneditform-to-create-user-forms.html">Using BeanEditForm To 
Create User Forms</a></li><li><a 
href="using-tapestry-with-hibernate.html">Using Tapestry With 
Hibernate</a></li></ul></li><li><a href="user-guide.html">User Guide</a><ul 
class="childpages-macr
 o"><li><a href="supported-environments-and-versions.html">Supported 
Environments and Versions</a></li><li><a href="project-layout.html">Project 
Layout</a></li><li><a href="configuration.html">Configuration</a></li><li><a 
href="runtime-exceptions.html">Runtime Exceptions</a></li><li><a 
href="class-reloading.html">Class Reloading</a></li><li><a 
href="component-reference.html">Component Reference</a></li><li><a 
href="annotations.html">Annotations</a></li><li><a 
href="component-classes.html">Component Classes</a></li><li><a 
href="component-templates.html">Component Templates</a></li><li><a 
href="property-expressions.html">Property Expressions</a></li><li><a 
href="component-parameters.html">Component Parameters</a></li><li><a 
href="parameter-type-coercion.html">Parameter Type Coercion</a></li><li><a 
href="layout-component.html">Layout Component</a></li><li><a 
href="component-mixins.html">Component Mixins</a><ul 
class="childpages-macro"><li><a href="built-in-mixins.html">Built-in Mixins</
 a></li></ul></li><li><a href="page-navigation.html">Page 
Navigation</a></li><li><a href="localization.html">Localization</a></li><li><a 
href="page-life-cycle.html">Page Life Cycle</a></li><li><a 
href="request-processing.html">Request Processing</a></li><li><a 
href="component-rendering.html">Component Rendering</a></li><li><a 
href="component-events.html">Component Events</a></li><li><a 
href="url-rewriting.html">URL rewriting</a></li><li><a 
href="dom.html">DOM</a></li><li><a href="response-compression.html">Response 
Compression</a></li><li><a href="security.html">Security</a></li><li><a 
href="https.html">HTTPS</a></li><li><a 
href="content-type-and-markup.html">Content Type and Markup</a></li><li><a 
href="persistent-page-data.html">Persistent Page Data</a></li><li><a 
href="session-storage.html">Session Storage</a><ul 
class="childpages-macro"><li><a href="clustering-issues.html">Clustering 
Issues</a></li></ul></li><li><a href="injection.html">Injection</a></li><li><a 
href="environmental
 -services.html">Environmental Services</a></li><li><a 
href="css.html">CSS</a></li><li><a href="assets.html">Assets</a></li><li><a 
href="forms-and-validation.html">Forms and Validation</a></li><li><a 
href="beaneditform-guide.html">BeanEditForm Guide</a></li><li><a 
href="uploading-files.html">Uploading Files</a></li><li><a 
href="logging.html">Logging</a></li><li><a 
href="unit-testing-pages-or-components.html">Unit testing pages or 
components</a></li><li><a href="integration-testing.html">Integration 
Testing</a></li><li><a href="development-dashboard.html">Development 
Dashboard</a></li><li><a href="modules.html">Modules</a><ul 
class="childpages-macro"><li><a href="built-in-modules.html">Built In 
Modules</a></li><li><a href="third-party-modules.html">Third Party 
Modules</a></li></ul></li><li><a href="ioc.html">IOC</a><ul 
class="childpages-macro"><li><a href="tapestry-ioc-overview.html">Tapestry IoC 
Overview</a></li><li><a href="tapestry-ioc-modules.html">Tapestry IoC 
Modules</a></li><li
 ><a href="defining-tapestry-ioc-services.html">Defining Tapestry IOC 
 >Services</a></li><li><a href="service-advisors.html">Service 
 >Advisors</a></li><li><a href="tapestry-ioc-decorators.html">Tapestry IoC 
 >Decorators</a></li><li><a href="tapestry-ioc-configuration.html">Tapestry IoC 
 >Configuration</a></li><li><a href="case-insensitivity.html">Case 
 >Insensitivity</a></li><li><a href="autoloading-modules.html">Autoloading 
 >Modules</a></li><li><a href="service-implementation-reloading.html">Service 
 >Implementation Reloading</a></li><li><a 
 >href="ordering-by-constraints.html">Ordering by Constraints</a></li><li><a 
 >href="symbols.html">Symbols</a></li><li><a 
 >href="chainbuilder-service.html">ChainBuilder Service</a></li><li><a 
 >href="pipelinebuilder-service.html">PipelineBuilder Service</a></li><li><a 
 >href="shadowbuilder-service.html">ShadowBuilder Service</a></li><li><a 
 >href="strategybuilder-service.html">StrategyBuilder Service</a></li><li><a 
 >href="injection-in-detail.html">Injection in Detail</a
 ></li><li><a href="object-providers.html">Object Providers</a></li><li><a 
 >href="service-serialization.html">Service Serialization</a></li><li><a 
 >href="type-coercion.html">Type Coercion</a></li><li><a 
 >href="starting-the-ioc-registry.html">Starting the IoC 
 >Registry</a></li><li><a href="registry-startup.html">Registry 
 >Startup</a></li><li><a href="parallel-execution.html">Parallel 
 >Execution</a></li><li><a href="logging-in-tapestry.html">Logging in 
 >Tapestry</a></li><li><a href="using-jsr-330-standard-annotations.html">Using 
 >JSR 330 standard annotations</a></li><li><a 
 >href="operation-tracker.html">Operation Tracker</a></li></ul></li><li><a 
 >href="hibernate-core.html">Hibernate - Core</a><ul 
 >class="childpages-macro"><li><a href="hibernate-core-conf.html">Hibernate - 
 >Core - Conf</a></li><li><a href="hibernate.html">Hibernate</a></li><li><a 
 >href="hibernate-user-guide.html">Hibernate User 
 >Guide</a></li></ul></li><li><a 
 >href="integrating-with-spring-framework.html">Integrating with Spring Frame
 work</a></li><li><a href="bean-validation.html">Bean Validation</a></li><li><a 
href="component-report.html">Component Report</a></li><li><a 
href="aliases.html">Aliases</a></li><li><a 
href="integrating-with-jpa.html">Integrating with JPA</a></li><li><a 
href="client-side-javascript.html">Client-Side JavaScript</a><ul 
class="childpages-macro"><li><a href="javascript-modules.html">JavaScript 
Modules</a></li><li><a href="coffeescript.html">CoffeeScript</a></li><li><a 
href="typescript.html">TypeScript</a></li><li><a 
href="legacy-javascript.html">Legacy JavaScript</a></li><li><a 
href="ajax-and-zones.html">Ajax and Zones</a></li></ul></li><li><a 
href="rest-support-580.html">REST Support (5.8.0+)</a></li><li><a 
href="cors-cross-origin-resource-sharing-support-582.html">CORS (Cross-Origin 
Resource Sharing) Support (5.8.2+)</a></li></ul></li><li><a 
href="cheat-sheets.html">Cheat Sheets</a><ul class="childpages-macro"><li><a 
href="application-module-class-cheat-sheet.html">Application Module Cl
 ass Cheat Sheet</a></li><li><a href="component-cheat-sheet.html">Component 
Cheat Sheet</a></li><li><a href="tapestry-for-jsf-users.html">Tapestry for JSF 
Users</a></li></ul></li><li><a href="cookbook.html">Cookbook</a><ul 
class="childpages-macro"><li><a href="default-parameter.html">Default 
Parameter</a></li><li><a href="overriding-exception-reporting.html">Overriding 
Exception Reporting</a></li><li><a href="error-page-recipe.html">Error Page 
Recipe</a></li><li><a href="supporting-informal-parameters.html">Supporting 
Informal Parameters</a></li><li><a href="component-libraries.html">Component 
Libraries</a></li><li><a href="switching-cases.html">Switching 
Cases</a></li><li><a href="enum-parameter-recipe.html">Enum Parameter 
Recipe</a></li><li><a href="extending-the-if-component.html">Extending the If 
Component</a></li><li><a 
href="meta-programming-page-content.html">Meta-Programming Page 
Content</a></li><li><a href="using-select-with-a-list.html">Using Select With a 
List</a></li><li>
 <a href="ioc-cookbook.html">IoC cookbook</a><ul 
class="childpages-macro"><li><a 
href="ioc-cookbook-basic-services-and-injection.html">IoC Cookbook - Basic 
Services and Injection</a></li><li><a 
href="ioc-cookbook-overriding-ioc-services.html">IoC Cookbook - Overriding IoC 
Services</a></li><li><a href="ioc-cookbook-patterns.html">IoC Cookbook - 
Patterns</a></li><li><a href="ioc-cookbook-service-configurations.html">IoC 
cookbook - Service Configurations</a></li></ul></li><li><a 
href="performance-and-clustering.html">Performance and 
Clustering</a></li><li><a href="google-app-engine.html">Google App 
Engine</a></li></ul></li><li><a 
href="frequently-asked-questions.html">Frequently Asked Questions</a><ul 
class="childpages-macro"><li><a href="general-questions.html">General 
Questions</a></li><li><a href="templating-and-markup-faq.html">Templating and 
Markup FAQ</a></li><li><a href="page-and-component-classes-faq.html">Page And 
Component Classes FAQ</a></li><li><a href="forms-and-form-compon
 ents-faq.html">Forms and Form Components FAQ</a></li><li><a 
href="beaneditform-faq.html">BeanEditForm FAQ</a></li><li><a 
href="link-components-faq.html">Link Components FAQ</a></li><li><a 
href="component-events-faq.html">Component Events FAQ</a></li><li><a 
href="javascript-faq.html">JavaScript FAQ</a></li><li><a 
href="ajax-components-faq.html">Ajax Components FAQ</a></li><li><a 
href="injection-faq.html">Injection FAQ</a></li><li><a 
href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control 
FAQ</a></li><li><a href="security-faq.html">Security FAQ</a></li><li><a 
href="integration-with-existing-applications.html">Integration with existing 
applications</a></li><li><a href="request-processing-faq.html">Request 
Processing FAQ</a></li><li><a 
href="limitations.html">Limitations</a></li><li><a 
href="specific-errors-faq.html">Specific Errors FAQ</a></li><li><a 
href="hibernate-support-faq.html">Hibernate Support FAQ</a></li><li><a 
href="maven-support-faq.html">Maven Support FA
 Q</a></li><li><a href="release-upgrade-faq.html">Release Upgrade 
FAQ</a></li></ul></li><li><a href="release-notes.html">Release Notes</a><ul 
class="childpages-macro"><li><a href="how-to-upgrade.html">How to 
Upgrade</a></li><li><a href="release-notes-50.html">Release Notes 
5.0</a></li><li><a href="release-notes-51.html">Release Notes 
5.1</a></li><li><a href="release-notes-52.html">Release Notes 5.2</a><ul 
class="childpages-macro"><li><a href="release-notes-520.html">Release Notes 
5.2.0</a></li><li><a href="release-notes-521.html">Release Notes 
5.2.1</a></li><li><a href="release-notes-522.html">Release Notes 
5.2.2</a></li><li><a href="release-notes-523.html">Release Notes 
5.2.3</a></li><li><a href="release-notes-524.html">Release Notes 
5.2.4</a></li><li><a href="release-notes-525.html">Release Notes 
5.2.5</a></li><li><a href="release-notes-526.html">Release Notes 
5.2.6</a></li></ul></li><li><a href="release-notes-53.html">Release Notes 
5.3</a></li><li><a href="release-notes-531.html">
 Release Notes 5.3.1</a></li><li><a href="release-notes-532.html">Release Notes 
5.3.2</a></li><li><a href="release-notes-533.html">Release Notes 
5.3.3</a></li><li><a href="release-notes-534.html">Release Notes 
5.3.4</a></li><li><a href="release-notes-535.html">Release Notes 
5.3.5</a></li><li><a href="release-notes-536.html">Release Notes 
5.3.6</a></li><li><a href="release-notes-537.html">Release Notes 
5.3.7</a></li><li><a href="release-notes-538.html">Release Notes 
5.3.8</a></li><li><a href="release-notes-54.html">Release Notes 
5.4</a></li><li><a href="release-notes-541.html">Release Notes 
5.4.1</a></li><li><a href="release-notes-542.html">Release Notes 
5.4.2</a></li><li><a href="release-notes-543.html">Release Notes 
5.4.3</a></li><li><a href="release-notes-544.html">Release Notes 
5.4.4</a></li><li><a href="release-notes-545.html">Release Notes 
5.4.5</a></li><li><a href="release-notes-550.html">Release Notes 
5.5.0</a></li><li><a href="release-notes-560.html">Release Notes 5.6.0</a></
 li><li><a href="release-notes-561.html">Release Notes 5.6.1</a></li><li><a 
href="release-notes-562.html">Release Notes 5.6.2</a></li><li><a 
href="release-notes-563.html">Release Notes 5.6.3</a></li><li><a 
href="release-notes-570.html">Release Notes 5.7.0</a></li><li><a 
href="release-notes-571.html">Release Notes 5.7.1</a></li><li><a 
href="release-notes-572.html">Release Notes 5.7.2</a></li><li><a 
href="release-notes-564.html">Release Notes 5.6.4</a></li><li><a 
href="release-notes-573.html">Release Notes 5.7.3</a></li><li><a 
href="release-notes-580.html">Release Notes 5.8.0</a></li><li><a 
href="release-notes-581.html">Release Notes 5.8.1</a></li><li><a 
href="release-notes-582.html">Release Notes 5.8.2</a></li><li><a 
href="release-notes-583.html">Release Notes 5.8.3</a></li><li><a 
href="release-notes-584.html">Release Notes 5.8.4</a></li><li><a 
href="release-notes-585.html">Release Notes 5.8.5</a></li><li><a 
href="release-notes-586.html">Release Notes 5.8.6</a></li><li><a href="releas
 e-notes-587.html">Release Notes 5.8.7</a></li><li><a 
href="release-notes-590.html">Release Notes 5.9.0</a></li></ul></li><li><a 
href="javascript-rewrite-in-54.html">JavaScript Rewrite in 5.4</a></li><li><a 
href="support.html">Support</a></li><li><a 
href="developer-information.html">Developer Information</a><ul 
class="childpages-macro"><li><a 
href="building-tapestry-from-source.html">Building Tapestry from 
Source</a></li><li><a href="confluence-site-setup.html">Confluence Site 
Setup</a><ul class="childpages-macro"><li><a 
href="since-and-deprecated-user-macros.html">Since and Deprecated User 
Macros</a></li></ul></li><li><a href="developer-bible.html">Developer 
Bible</a></li><li><a href="release-process.html">Release Process</a></li><li><a 
href="the-tapestry-jail.html">The tapestry jail</a></li><li><a 
href="version-numbers.html">Version Numbers</a></li><li><a 
href="development-roadmap.html">Development 
Roadmap</a></li></ul></li></ul></div>
+                            <div id="ConfluenceContent"><div 
style="float:right;margin-left:1em"><h2 id="Documentation-AllTopics">All 
Topics</h2><ul class="childpages-macro"><li><a 
href="introduction.html">Introduction</a></li><li><a 
href="getting-started.html">Getting Started</a></li><li><a 
href="principles.html">Principles</a></li><li><a 
href="tapestry-tutorial.html">Tapestry Tutorial</a><ul 
class="childpages-macro"><li><a 
href="dependencies-tools-and-plugins.html">Dependencies, Tools and 
Plugins</a></li><li><a href="creating-the-skeleton-application.html">Creating 
The Skeleton Application</a></li><li><a 
href="exploring-the-project.html">Exploring the Project</a></li><li><a 
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo 
Guessing Game</a></li><li><a 
href="using-beaneditform-to-create-user-forms.html">Using BeanEditForm To 
Create User Forms</a></li><li><a 
href="using-tapestry-with-hibernate.html">Using Tapestry With 
Hibernate</a></li></ul></li><li><a href="u
 ser-guide.html">User Guide</a><ul class="childpages-macro"><li><a 
href="supported-environments-and-versions.html">Supported Environments and 
Versions</a></li><li><a href="project-layout.html">Project 
Layout</a></li><li><a href="configuration.html">Configuration</a></li><li><a 
href="runtime-exceptions.html">Runtime Exceptions</a></li><li><a 
href="class-reloading.html">Class Reloading</a></li><li><a 
href="component-reference.html">Component Reference</a></li><li><a 
href="annotations.html">Annotations</a></li><li><a 
href="component-classes.html">Component Classes</a></li><li><a 
href="component-templates.html">Component Templates</a></li><li><a 
href="property-expressions.html">Property Expressions</a></li><li><a 
href="component-parameters.html">Component Parameters</a></li><li><a 
href="parameter-type-coercion.html">Parameter Type Coercion</a></li><li><a 
href="layout-component.html">Layout Component</a></li><li><a 
href="component-mixins.html">Component Mixins</a><ul class="childpages-mac
 ro"><li><a href="built-in-mixins.html">Built-in 
Mixins</a></li></ul></li><li><a href="page-navigation.html">Page 
Navigation</a></li><li><a href="localization.html">Localization</a></li><li><a 
href="page-life-cycle.html">Page Life Cycle</a></li><li><a 
href="request-processing.html">Request Processing</a></li><li><a 
href="component-rendering.html">Component Rendering</a></li><li><a 
href="component-events.html">Component Events</a></li><li><a 
href="url-rewriting.html">URL rewriting</a></li><li><a 
href="dom.html">DOM</a></li><li><a href="response-compression.html">Response 
Compression</a></li><li><a href="security.html">Security</a></li><li><a 
href="https.html">HTTPS</a></li><li><a 
href="content-type-and-markup.html">Content Type and Markup</a></li><li><a 
href="persistent-page-data.html">Persistent Page Data</a></li><li><a 
href="session-storage.html">Session Storage</a><ul 
class="childpages-macro"><li><a href="clustering-issues.html">Clustering 
Issues</a></li></ul></li><li><a href="inje
 ction.html">Injection</a></li><li><a 
href="environmental-services.html">Environmental Services</a></li><li><a 
href="css.html">CSS</a></li><li><a href="assets.html">Assets</a></li><li><a 
href="forms-and-validation.html">Forms and Validation</a></li><li><a 
href="beaneditform-guide.html">BeanEditForm Guide</a></li><li><a 
href="uploading-files.html">Uploading Files</a></li><li><a 
href="logging.html">Logging</a></li><li><a 
href="unit-testing-pages-or-components.html">Unit testing pages or 
components</a></li><li><a href="integration-testing.html">Integration 
Testing</a></li><li><a href="development-dashboard.html">Development 
Dashboard</a></li><li><a href="modules.html">Modules</a><ul 
class="childpages-macro"><li><a href="built-in-modules.html">Built In 
Modules</a></li><li><a href="third-party-modules.html">Third Party 
Modules</a></li></ul></li><li><a href="ioc.html">IOC</a><ul 
class="childpages-macro"><li><a href="tapestry-ioc-overview.html">Tapestry IoC 
Overview</a></li><li><a href="tap
 estry-ioc-modules.html">Tapestry IoC Modules</a></li><li><a 
href="defining-tapestry-ioc-services.html">Defining Tapestry IOC 
Services</a></li><li><a href="service-advisors.html">Service 
Advisors</a></li><li><a href="tapestry-ioc-decorators.html">Tapestry IoC 
Decorators</a></li><li><a href="tapestry-ioc-configuration.html">Tapestry IoC 
Configuration</a></li><li><a href="case-insensitivity.html">Case 
Insensitivity</a></li><li><a href="autoloading-modules.html">Autoloading 
Modules</a></li><li><a href="service-implementation-reloading.html">Service 
Implementation Reloading</a></li><li><a 
href="ordering-by-constraints.html">Ordering by Constraints</a></li><li><a 
href="symbols.html">Symbols</a></li><li><a 
href="chainbuilder-service.html">ChainBuilder Service</a></li><li><a 
href="pipelinebuilder-service.html">PipelineBuilder Service</a></li><li><a 
href="shadowbuilder-service.html">ShadowBuilder Service</a></li><li><a 
href="strategybuilder-service.html">StrategyBuilder Service</a></li><li><
 a href="injection-in-detail.html">Injection in Detail</a></li><li><a 
href="object-providers.html">Object Providers</a></li><li><a 
href="service-serialization.html">Service Serialization</a></li><li><a 
href="type-coercion.html">Type Coercion</a></li><li><a 
href="starting-the-ioc-registry.html">Starting the IoC Registry</a></li><li><a 
href="registry-startup.html">Registry Startup</a></li><li><a 
href="parallel-execution.html">Parallel Execution</a></li><li><a 
href="logging-in-tapestry.html">Logging in Tapestry</a></li><li><a 
href="using-jsr-330-standard-annotations.html">Using JSR 330 standard 
annotations</a></li><li><a href="operation-tracker.html">Operation 
Tracker</a></li></ul></li><li><a href="hibernate-core.html">Hibernate - 
Core</a><ul class="childpages-macro"><li><a 
href="hibernate-core-conf.html">Hibernate - Core - Conf</a></li><li><a 
href="hibernate.html">Hibernate</a></li><li><a 
href="hibernate-user-guide.html">Hibernate User Guide</a></li></ul></li><li><a 
href="integrating-w
 ith-spring-framework.html">Integrating with Spring Framework</a></li><li><a 
href="bean-validation.html">Bean Validation</a></li><li><a 
href="component-report.html">Component Report</a></li><li><a 
href="aliases.html">Aliases</a></li><li><a 
href="integrating-with-jpa.html">Integrating with JPA</a></li><li><a 
href="client-side-javascript.html">Client-Side JavaScript</a><ul 
class="childpages-macro"><li><a href="javascript-modules.html">JavaScript 
Modules</a></li><li><a href="coffeescript.html">CoffeeScript</a></li><li><a 
href="typescript.html">TypeScript</a></li><li><a 
href="legacy-javascript.html">Legacy JavaScript</a></li><li><a 
href="ajax-and-zones.html">Ajax and Zones</a></li></ul></li><li><a 
href="rest-support-580.html">REST Support (5.8.0+)</a></li><li><a 
href="cors-cross-origin-resource-sharing-support-582.html">CORS (Cross-Origin 
Resource Sharing) Support (5.8.2+)</a></li></ul></li><li><a 
href="cheat-sheets.html">Cheat Sheets</a><ul class="childpages-macro"><li><a 
href="applicat
 ion-module-class-cheat-sheet.html">Application Module Class Cheat 
Sheet</a></li><li><a href="component-cheat-sheet.html">Component Cheat 
Sheet</a></li><li><a href="tapestry-for-jsf-users.html">Tapestry for JSF 
Users</a></li></ul></li><li><a href="cookbook.html">Cookbook</a><ul 
class="childpages-macro"><li><a href="default-parameter.html">Default 
Parameter</a></li><li><a href="overriding-exception-reporting.html">Overriding 
Exception Reporting</a></li><li><a href="error-page-recipe.html">Error Page 
Recipe</a></li><li><a href="supporting-informal-parameters.html">Supporting 
Informal Parameters</a></li><li><a href="component-libraries.html">Component 
Libraries</a></li><li><a href="switching-cases.html">Switching 
Cases</a></li><li><a href="enum-parameter-recipe.html">Enum Parameter 
Recipe</a></li><li><a href="extending-the-if-component.html">Extending the If 
Component</a></li><li><a 
href="meta-programming-page-content.html">Meta-Programming Page 
Content</a></li><li><a href="using-select
 -with-a-list.html">Using Select With a List</a></li><li><a 
href="ioc-cookbook.html">IoC cookbook</a><ul class="childpages-macro"><li><a 
href="ioc-cookbook-basic-services-and-injection.html">IoC Cookbook - Basic 
Services and Injection</a></li><li><a 
href="ioc-cookbook-overriding-ioc-services.html">IoC Cookbook - Overriding IoC 
Services</a></li><li><a href="ioc-cookbook-patterns.html">IoC Cookbook - 
Patterns</a></li><li><a href="ioc-cookbook-service-configurations.html">IoC 
cookbook - Service Configurations</a></li></ul></li><li><a 
href="performance-and-clustering.html">Performance and 
Clustering</a></li><li><a href="google-app-engine.html">Google App 
Engine</a></li></ul></li><li><a 
href="frequently-asked-questions.html">Frequently Asked Questions</a><ul 
class="childpages-macro"><li><a href="general-questions.html">General 
Questions</a></li><li><a href="templating-and-markup-faq.html">Templating and 
Markup FAQ</a></li><li><a href="page-and-component-classes-faq.html">Page And 
Componen
 t Classes FAQ</a></li><li><a href="forms-and-form-components-faq.html">Forms 
and Form Components FAQ</a></li><li><a 
href="beaneditform-faq.html">BeanEditForm FAQ</a></li><li><a 
href="link-components-faq.html">Link Components FAQ</a></li><li><a 
href="component-events-faq.html">Component Events FAQ</a></li><li><a 
href="javascript-faq.html">JavaScript FAQ</a></li><li><a 
href="ajax-components-faq.html">Ajax Components FAQ</a></li><li><a 
href="injection-faq.html">Injection FAQ</a></li><li><a 
href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control 
FAQ</a></li><li><a href="security-faq.html">Security FAQ</a></li><li><a 
href="integration-with-existing-applications.html">Integration with existing 
applications</a></li><li><a href="request-processing-faq.html">Request 
Processing FAQ</a></li><li><a 
href="limitations.html">Limitations</a></li><li><a 
href="specific-errors-faq.html">Specific Errors FAQ</a></li><li><a 
href="hibernate-support-faq.html">Hibernate Support FAQ</a></
 li><li><a href="maven-support-faq.html">Maven Support FAQ</a></li><li><a 
href="release-upgrade-faq.html">Release Upgrade FAQ</a></li></ul></li><li><a 
href="release-notes.html">Release Notes</a><ul class="childpages-macro"><li><a 
href="how-to-upgrade.html">How to Upgrade</a></li><li><a 
href="release-notes-50.html">Release Notes 5.0</a></li><li><a 
href="release-notes-51.html">Release Notes 5.1</a></li><li><a 
href="release-notes-52.html">Release Notes 5.2</a><ul 
class="childpages-macro"><li><a href="release-notes-520.html">Release Notes 
5.2.0</a></li><li><a href="release-notes-521.html">Release Notes 
5.2.1</a></li><li><a href="release-notes-522.html">Release Notes 
5.2.2</a></li><li><a href="release-notes-523.html">Release Notes 
5.2.3</a></li><li><a href="release-notes-524.html">Release Notes 
5.2.4</a></li><li><a href="release-notes-525.html">Release Notes 
5.2.5</a></li><li><a href="release-notes-526.html">Release Notes 
5.2.6</a></li></ul></li><li><a href="release-notes-53.html">Release
  Notes 5.3</a></li><li><a href="release-notes-531.html">Release Notes 
5.3.1</a></li><li><a href="release-notes-532.html">Release Notes 
5.3.2</a></li><li><a href="release-notes-533.html">Release Notes 
5.3.3</a></li><li><a href="release-notes-534.html">Release Notes 
5.3.4</a></li><li><a href="release-notes-535.html">Release Notes 
5.3.5</a></li><li><a href="release-notes-536.html">Release Notes 
5.3.6</a></li><li><a href="release-notes-537.html">Release Notes 
5.3.7</a></li><li><a href="release-notes-538.html">Release Notes 
5.3.8</a></li><li><a href="release-notes-54.html">Release Notes 
5.4</a></li><li><a href="release-notes-541.html">Release Notes 
5.4.1</a></li><li><a href="release-notes-542.html">Release Notes 
5.4.2</a></li><li><a href="release-notes-543.html">Release Notes 
5.4.3</a></li><li><a href="release-notes-544.html">Release Notes 
5.4.4</a></li><li><a href="release-notes-545.html">Release Notes 
5.4.5</a></li><li><a href="release-notes-550.html">Release Notes 
5.5.0</a></li><li><a
  href="release-notes-560.html">Release Notes 5.6.0</a></li><li><a 
href="release-notes-561.html">Release Notes 5.6.1</a></li><li><a 
href="release-notes-562.html">Release Notes 5.6.2</a></li><li><a 
href="release-notes-563.html">Release Notes 5.6.3</a></li><li><a 
href="release-notes-570.html">Release Notes 5.7.0</a></li><li><a 
href="release-notes-571.html">Release Notes 5.7.1</a></li><li><a 
href="release-notes-572.html">Release Notes 5.7.2</a></li><li><a 
href="release-notes-564.html">Release Notes 5.6.4</a></li><li><a 
href="release-notes-573.html">Release Notes 5.7.3</a></li><li><a 
href="release-notes-580.html">Release Notes 5.8.0</a></li><li><a 
href="release-notes-581.html">Release Notes 5.8.1</a></li><li><a 
href="release-notes-582.html">Release Notes 5.8.2</a></li><li><a 
href="release-notes-583.html">Release Notes 5.8.3</a></li><li><a 
href="release-notes-584.html">Release Notes 5.8.4</a></li><li><a 
href="release-notes-585.html">Release Notes 5.8.5</a></li><li><a 
href="release-notes-5
 86.html">Release Notes 5.8.6</a></li><li><a 
href="release-notes-587.html">Release Notes 5.8.7</a></li><li><a 
href="release-notes-590.html">Release Notes 5.9.0</a></li></ul></li><li><a 
href="javascript-rewrite-in-54.html">JavaScript Rewrite in 5.4</a></li><li><a 
href="support.html">Support</a></li><li><a 
href="developer-information.html">Developer Information</a><ul 
class="childpages-macro"><li><a 
href="building-tapestry-from-source.html">Building Tapestry from 
Source</a></li><li><a href="confluence-site-setup.html">Confluence Site 
Setup</a><ul class="childpages-macro"><li><a 
href="since-and-deprecated-user-macros.html">Since and Deprecated User 
Macros</a></li></ul></li><li><a href="developer-bible.html">Developer 
Bible</a></li><li><a href="release-process.html">Release Process</a></li><li><a 
href="the-tapestry-jail.html">The tapestry jail</a></li><li><a 
href="version-numbers.html">Version Numbers</a></li><li><a 
href="development-roadmap.html">Development Roadmap</a></li></ul></li></
 ul></div>
 
 
 <p>Welcome to the Tapestry 5 Documentation, a collection of guides to teach 
beginners the basics and help experienced developers deepen their understanding 
of Tapestry's power.</p><h1 
id="Documentation-Highlights">Highlights</h1><p>These are the most useful 
starting points for common needs.</p><div class="table-wrap"><table 
class="table table-bordered table-responsive"><colgroup span="1"><col 
span="1"><col span="1"></colgroup><tbody><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><a 
href="introduction.html">Introduction</a></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>An overview of Tapestry's general approach and 
philosophy</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><a href="getting-started.html">Getting 
Started</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>A quick 
guide to creating your first Tapestry project, using Maven</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p><a href="tapestry-tutoria
 l.html">Tapestry Tutorial</a></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Picks up where <em>Getting Started</em> leaves off, 
explaining in greater detail how Tapestry works</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p><a href="user-guide.html">User 
Guide</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Detailed 
articles on every Tapestry feature</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><a href="community.html">Community</a></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Getting support, mailing lists, 
JIRA, outside resources, and access to the source</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p><a 
href="cookbook.html">Cookbook</a></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Guides to doing common things with 
Tapestry</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong><a 
href="frequently-asked-questions.html">FAQ</a></stron
 g></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>A quick place 
to check for common problems and solutions</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><a 
href="component-cheat-sheet.html">Component Cheat Sheet</a></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>A concise guide to component 
classes, methods and annotations</p></td></tr></tbody></table></div><h1 
id="Documentation-APIandComponentReference">API and Component 
Reference</h1><div class="table-wrap"><table class="table table-bordered 
table-responsive"><colgroup span="1"><col span="1" style="width: 18.81%;"><col 
span="1" style="width: 9.02111%;"><col span="1" style="width: 9.02111%;"><col 
span="1" style="width: 9.02111%;"><col span="1" style="width: 9.78887%;"><col 
span="1" style="width: 9.78887%;"><col span="1" style="width: 9.78887%;"><col 
span="1" style="width: 9.78887%;"><col span="1" style="width: 14.9712%;"><col 
span="1"></colgroup><tbody><tr><th colspan="1" rowspan="1"
  class="confluenceTh"><p>API (Javadoc):</p></th><td colspan="1" rowspan="1" 
class="confluenceTd"><p>5.0<sup>1</sup></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>5.1<sup>1</sup></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>5.2<sup>1</sup></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><a class="external-link" 
href="http://tapestry.apache.org/5.3.7/apidocs/";>5.3.8</a></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><a class="external-link" 
href="http://tapestry.apache.org/5.4";>5.4</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><a class="external-link" 
href="http://tapestry.apache.org/5.5.0";>5.5</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><a class="external-link" 
href="http://tapestry.apache.org/5.6.3";>5.6.3</a></td><td colspan="1" 
rowspan="1" class="confluenceTd"><a class="external-link" 
href="http://tapestry.apache.org/5.7.3";>5.7.3</a></td><td colspan="1" 
rowspan="1" class="confluenceTd"><a class="external-lin
 k" href="http://tapestry.apache.org/current";>5.8.7 
(current)</a></td></tr><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Component Reference:</p></th><td colspan="1" 
rowspan="1" class="confluenceTd"><p>5.0<sup>1</sup></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>5.1<sup>1</sup></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>5.2<sup>1</sup></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><em><span class="confluence-link">see 
5.7.2</span></em></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><em>see 5.7.2</em></td><td colspan="1" rowspan="1" 
class="confluenceTd">see 5.7.2</td><td colspan="1" rowspan="1" 
class="confluenceTd">see 5.7.2</td><td colspan="1" rowspan="1" 
class="confluenceTd"><a class="external-link" 
href="https://tapestry.apache.org/component-reference.html";>5.7.3</a></td><td 
colspan="1" rowspan="1" class="confluenceTd"><a class="external-link" 
href="https://tapestry.apache.org/component-reference.html";>5.8.7</a></td>
 </tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Release 
Notes:</p></th><td colspan="1" rowspan="1" class="confluenceTd"><p><a 
href="release-notes-50.html">5.0</a></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><a href="release-notes-51.html">5.1</a></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><a 
href="release-notes-52.html">5.2</a></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><a href="release-notes-538.html">5.3.8</a></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><a 
href="release-notes-54.html">5.4</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><a href="release-notes-550.html">5.5</a></td><td 
colspan="1" rowspan="1" class="confluenceTd"><a 
href="release-notes-560.html">5.6</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><a href="release-notes-570.html">5.7.0</a></td><td 
colspan="1" rowspan="1" class="confluenceTd"><a 
href="release-notes-587.html">5.8.7</a></td></tr></tbody></table></div><p><sup>1<
 /sup> needs to be built manually from archived sources at <a 
class="external-link" 
href="http://archive.apache.org/dist/tapestry/";>http://archive.apache.org/dist/tapestry/</a>.</p><h1
 id="Documentation-UserGuide">User Guide</h1><p><span 
class="confluence-anchor-link" id="Documentation-userguide"></span>The <a 
href="user-guide.html">User Guide</a> consists of over 75 pages of detailed 
information on the concepts behind Tapestry and instructions on how to use this 
powerful tool. Highlights include:</p><ul><li class="confluence-link"><a 
href="client-side-javascript.html">Client-Side JavaScript</a> and <a 
href="ajax-and-zones.html">Ajax and Zones</a> describe Tapestry's built-in 
support for dynamic in-page behavior.</li><li><a 
href="integrating-with-spring-framework.html">Integrating with Spring 
Framework</a> describes how to integrate Spring into your Tapestry 
application.</li><li><a href="hibernate.html">Tapestry/Hibernate Integration 
Library</a> provides out-of-the-box support for us
 ing Hibernate 3.</li><li><a href="bean-validation.html">JSR 303: Bean 
Validation</a> shows how to use standard annotations for validation</li><li><a 
href="integration-testing.html">Integration Testing</a> shows how to test your 
application with Selenium.</li></ul><p><a href="user-guide.html">More 
topics</a>...</p><h1 
id="Documentation-BlogsbyTapestryDevelopersandtheCommunity">Blogs by Tapestry 
Developers and the Community</h1><ul><li><a class="external-link" 
href="http://tapestryjava.blogspot.com/"; rel="nofollow">Tapestry 
Central</a>&#160;was Howard Lewis Ship's blog from 2003-2013. As the creator of 
Tapestry, he provides valuable insights into Tapestry's latest features and 
future directions.</li><li><a class="external-link" 
href="https://web.archive.org/web/20160410090538/http://blog.tapestry5.de/"; 
rel="nofollow">Igor Drobiazko's blog</a> (committer &amp; PMC) contains guides 
on Tapestry 5 development (2009-2013).</li><li><a class="external-link" 
href="http://tawus.wordpress.com/";
  rel="nofollow">Java Magic</a> (by Taha Hafeez, committer) presents a series 
of tutorials illustrating some of the more advanced Tapestry and Plastic 
features and techniques (2011-2012).</li></ul><h1 
id="Documentation-BooksonTapestry">Books on Tapestry</h1><p>There are at least 
9 published <a href="books.html">books on Tapestry</a>, including three on 
Tapestry 5.</p><h1 id="Documentation-TapestryPresentations">Tapestry 
Presentations</h1><ul><li>Mark Shead's <a class="external-link" 
href="http://blog.markshead.com/900/tapestry-5-10-minute-demo/"; 
rel="nofollow">10 Minute Demo</a>&#160; (Video, 2011)</li><li>H. L. Ship's <a 
class="external-link" href="https://www.youtube.com/watch?v=5BGt7eMFC20"; 
rel="nofollow">Tapestry 5.4 - Bootstrap-enhanced Exception 
Reporting</a>&#160;(Video, 2012)</li><li><a class="external-link" 
href="https://web.archive.org/web/20170302154020/http://blog.tapestry5.de/wp-content/uploads/2010/06/JSF-2.0-vs-Tapestry-5.pdf";
 rel="nofollow">JavaServer Faces 2.0 vs. Ta
 pestry 5</a> (PDF, 2010) A Head-to-Head Comparison by Igor Drobiazko at Jazoon 
2010</li></ul><p><a href="presentations.html">More presentations</a> ...</p><h1 
id="Documentation-TapestryWikis">Tapestry Wikis</h1><ul><li><a 
href="https://cwiki.apache.org/confluence/x/VCFkAQ";>Documentation Source 
wiki</a> (Confluence) &#8211; the wiki used as the content editor for the 
official Tapestry documentation</li><li><a 
href="https://cwiki.apache.org/confluence/display/TAPESTRY5";>Tapestry Community 
Wiki (legacy)</a> &#8211; read-only copy of Tapestry's old Moin Moin wiki 
containing a lot of user-generated information on different Tapestry use 
cases.</li></ul><h1 id="Documentation-Gettinghelp">Getting help</h1><p>The 
primary method of support is the <a href="mailing-lists.html">Tapestry Mailing 
Lists</a>.</p><p>In addition, there are occasionally questions and answers 
about Tapestry at <a class="external-link" 
href="http://stackoverflow.com/questions/tagged/tapestry"; rel="nofollow">Stack 
Overflo
 w</a>.</p><h1 id="Documentation-TheDeveloperCorner">The Developer 
Corner</h1><p><a href="developer-information.html">Developer Information</a> 
gives information needed by the Tapestry 
developers</p><p></p><p></p><p></p></div>


Reply via email to