Modified: 
websites/production/tapestry/content/building-tapestry-from-source.html
==============================================================================
--- websites/production/tapestry/content/building-tapestry-from-source.html 
(original)
+++ websites/production/tapestry/content/building-tapestry-from-source.html Thu 
Apr  4 09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -142,7 +143,7 @@
             
             <!-- /// Content Start -->
             <div id="content">
-                            <div id="ConfluenceContent"><p>This is a guide to 
building Tapestry itself from source code. This is primarily of interest to 
Tapestry <em>contributors</em>, rather than Tapestry 
<em>users</em>.</p><p>Although Tapestry <em>users</em> are free to use any 
build mechanism for their own projects (and first class Maven support is 
provided), to build Tapestry itself from source you will use 
Gradle.</p><p>Note: Both command line and Eclipse Gradle IDE/EGit instructions 
are given here. Generally you'll want to chose approach one or the other, 
rather than mixing them.</p><h2 
id="BuildingTapestryfromSource-Prerequisites">Prerequisites</h2><ul><li>Install 
a <strong>Java JDK</strong> (Sun/Oracle, not OpenJDK), version 1.7 (just to 
prevent VU#225657, see: <a class="external-link" 
href="http://www.kb.cert.org/vuls/id/225657"; 
rel="nofollow">http://www.kb.cert.org/vuls/id/225657</a>), or version 1.8 for 
Tapestry 5.5 and later.</li><li>Install an <strong>IDE</strong> (IDE
 A IntelliJ is recommended (and free to Tapestry committers), but Eclipse will 
also work. NetBeans is reported to work as 
well.</li><li><strong>Firefox</strong>: For Tapestry 5.4.x and earlier, install 
Firefox browser <a class="external-link" 
href="https://ftp.mozilla.org/pub/firefox/releases/42.0/"; 
rel="nofollow">version 42</a> or earlier, needed for the integration tests 
(because newer versions require a newer version of Selenium than Tapestry's 
Java version requirements allow).</li><li><s>Set the Firefox browser's 
"preferred language" to English (en), because some tests will otherwise 
fail.</s> (Fixed; see <a class="external-link" 
href="https://issues.apache.org/jira/browse/TAP5-2413";>TAP5-2413</a>)</li><li>Install
 a <strong>Git</strong> client<ul><li>Command-line users: <a 
class="external-link" href="http://git-scm.com/downloads"; 
rel="nofollow">http://git-scm.com/downloads</a></li><li>Eclipse users: install 
EGit from the Eclipse Marketplace, then in In Window &gt; Preferences &gt
 ; Team &gt; Git, set your "Default repository folder" (e.g. <code>~/git</code> 
or <code>%HOME%\git</code>). Note that for Eclipse 4.4 (Luna) and later Git 
support is built in.</li></ul></li><li>Install <strong>Gradle</strong> 
1.0-milestone-3 or newer (or a Gradle plugin to your IDE),<ul><li>Command-line 
users: nothing to do (Tapestry's Gradle wrapper, gradlew, will download Gradle 
automatically on first use).</li><li>Eclipse users: Install Gradle IDE (aka 
Gradle Integration for Eclipse), from the Eclipse Marketplace. Note that for 
Eclipse 4.6 (Neon) and later, Gradle support is built 
in.</li></ul></li></ul><h2 
id="BuildingTapestryfromSource-GettingStarted">Getting Started</h2><p>Please 
read <a class="external-link" 
href="https://gitbox.apache.org";>https://gitbox.apache.org</a> 
first.</p><p>Windows users (especialy EGit users) should probably set the 
core.autocrlf config setting to <code>false</code> so that local diffs won't 
highlight line ending differences.</p><h3 id="BuildingTape
 stryfromSource-ClonetheRepository">Clone the Repository</h3><p>Clone Tapestry 
from the Git repo:</p><ul><li><p>Command-line git users:&#160;<code>git clone 
https://gitbox.apache.org/repos/asf/tapestry-5.git</code></p></li><li>Eclipse 
EGit users:<ul><li>Switch to Git perspective; then copy the URL above into 
paste buffer</li><li>Right-click &gt; Paste repository path or URI. This will 
bring up the Clone Git Repository dialog.</li><li>Committers: make sure 
Protocol is https, and enter your Apache commiter LDAP user name &amp; 
password</li><li>click Next.</li><li>Select the branches you're interested in 
(e.g 5.3 and master), click Next</li><li>Select Directory to where you want the 
project source code (e.g. <code>~/git/tapestry-5</code> or 
<code>%HOME%\git\tapestry-5</code>)</li><li>Select whichever "Initial Branch" 
you're interested in (e.g. master)</li><li>Set "Remote name" to "origin" (the 
default)</li><li><strong>VERY IMPORTANT</strong>: uncheck the "Import all 
existing projects" c
 heckbox (we'll do this using Gradle, below)</li><li>Click Finish. (Be patient; 
the clone operation might take a few minutes.)</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-GradlePreparation">Gradle 
Preparation</h3><ul><li>Command-line gradle users only:<ul><li>If you're using 
Eclipse but <strong>not</strong> Gradle IDE do <code>./gradlew 
eclipse</code></li><li>The command-line Gradle's eclipse plugin doesn't include 
the provided project dependencies; you need to add them manually (Java Build 
Path &gt; Projects &gt; Add tapestry-test). The plugin also generates a root 
eclipse project, so you'll need to delete the ".project" file in the root 
folder, and then you can import all Tapestry sub-projects at 
once.</li></ul></li><li>Eclipse Gradle IDE users:<ul><li>Switch to Java (or 
JEE) perspective and right-click &gt; Import... &gt; Gradle &gt; Gradle Project 
&gt; Next.</li><li>Set the "Root folder" to where you put your Tapestry source 
in the previous section (e.g. <code>~/git/tap
 estry-5</code> or <code>%Home%\git\tapestry-5</code>)</li><li>Click 
<code>Build Model. When it completes, s</code>elect the top-level (the 
top-level module and all sub-modules).</li><li>Be sure the "Enable dependency 
management" and "Create workingset 'tapestry-5' checkboxes are 
checked.</li><li>Click <code>Finish</code>. (Be patient; the import operation 
might take a few minutes.)</li></ul></li><li>Eclipse EGit users: Do a Git 
"Share" on the project:<ul><li>Still in the Java (or JEE) perspective, select 
all of the Tapestry projects (top-level and sub-modules) and right-click &gt; 
Team &gt; Share Project... &gt; Git &gt; Next &gt; Ensure all are selected, 
click <code>Finish</code>.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-Antlr">Antlr</h3><p>The 
<code>tapestry-core</code> project will initially have errors because of 
missing Java classes that are produced by ANTLR the first time the project is 
built. To fix this:</p><ul><li>Eclipse Gradle IDE users:<ul><li>Right click o
 n the <code>build.gradle</code> file within tapestry-core and click Run As 
&gt; "Gradle build...", check <strong>only</strong> the generateGrammarSource 
task, and change the "Name" field to something like "tapestry-core antlr", then 
click Apply and Run.</li><li>When it's finished, the antlr-generated classes 
(e.g. PropertyExpressionLexer.java) will be in created in 
$buildDir/generated-sources/antlr/, but Eclipse doesn't yet know about that 
path. To fix that, right click on the <code>tapestry-core</code> project &gt; 
Properties &gt; Java Build Path &gt; Source &gt; Add Folder &gt; find 
<code>tapestry-core/build/generated-sources/antlr</code> and check the checkbox 
next to it, then click <code>OK</code>.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-CoffeeScript">CoffeeScript</h3><p>If you want to 
run tests from within Eclipse, Tapestry will complain that it won't find 
certain JavaScript files that normally are generated during compile time from 
their Coffeescript sources. In 
 order to generate the JavaScript files you need to have Coffeescript installed 
and in your path. Simply install <a class="external-link" 
href="http://nodejs.org/download/"; rel="nofollow">Node.js</a> and afterwards 
run <code>npm install -g coffee-script</code>. The installation should take 
care of everything.</p><ul><li>Eclipse Gradle IDE users:<ul><li>Right click on 
the <code>build.gradle</code> file within tapestry-core and click Run As &gt; 
"Gradle build...", check <strong>only</strong> the 
tapestry-core:compileCoffeeScript and tapestry-core:compileTestCoffeeScript 
tasks, and change the "Name" field to something like "tapestry-core 
coffeescript", then click Apply and Run.</li><li>When it's finished, the 
coffeescript-generated JavaScript files (e.g. t5-core-dom-jquery.js) will be in 
created in $buildDir/generated-sources/compiled-coffeescript/ and 
$buildDir/generated-sources/compiled-test-coffeescript/, but Eclipse doesn't 
yet know about that path. To fix that, right click on the <
 code>tapestry-core</code> project &gt; Properties &gt; Java Build Path &gt; 
Source &gt; Add Folder &gt; find 
<code>tapestry-core/build/generated-sources/compiled-coffeescript</code> and 
<code>tapestry-core/build/generated-sources/compiled-test-coffeescript</code> 
and check the checkbox next to it, then click 
<code>OK</code>.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-GenerateCoffeeScriptandAntlrfilesautomaticallywhenchanged">Generate
 CoffeeScript and Antlr files automatically when changed</h3><p>If you want to 
have Eclipse compile the JavaScript files and lexer classes from their 
Coffeescript sources and Antlr files automatically when they change, you can do 
that by configuring an additional builder for the <code>tapestry-core</code> 
project:</p><ul><li>Eclipse Gradle IDE users:<ul><li>Right click on the 
<code>tapestry-core</code> project and select properties.</li><li>Select the 
"Builders" entry from the list on the left and click "New.." in the right 
panel.</li><li>Sele
 ct "Program" and click "Ok".</li><li>Give the program a meaningful name, e.g. 
"compile coffeescript and antlr".</li><li>Switch to the "Main" tab.</li><li>For 
"Location:" click "Browse Workspace..." and select gradlew (for Mac/Linux) or 
<code>gradlew.bat (for Windows)</code> in the Tapestry root project. If the 
root project is called "tapestry-5" the entry should look similar to 
"${workspace_loc:/tapestry-5/gradlew.bat}".</li><li>For "Working Directory:" 
click "Browse Workspace..." and select the Tapestry root project.</li><li>For 
"Arguments:" enter <code>tapestry-core:generateGrammarSource 
tapestry-core:compileCoffeeScript 
tapestry-core:compileTestCoffeeScript</code></li><li>Switch to the "Build 
Options" tab.</li><li>Make sure that only "Allocate Console", "After a 
"Clean"", "During manual builds", "During auto builds" and "Specify working set 
of relevant resources" are checked.</li><li>Click "Specify 
Resources...".</li><li>From the "tapestry-core" project select 
"src/main/antlr", "
 src/main/coffeescript", and "src/test/coffeescript".</li><li>Click 
"Finish".</li><li>Click "OK".</li><li>Click "OK".</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-Building">Building</h3><p>You can build 
individual modules, or (from the root folder) build 
everything.</p><ul><li>Command-line users:*( "gradlew" is the gradle wrapper 
shell script (gradlew) or batch file (gradlew.bat) found in the root folder of 
the Tapestry source.<ul><li><code>./gradlew 
build</code></li></ul></li><li>Eclipse Gradle IDE users:<ul><li>Right click on 
the top-level project (or any sub-project) and select Run As &gt; Gradle 
Build..., which starts an External Tools Configuration dialog box. Enter a 
reasonable name, select the tasks you want to run (for example, 
tapestry-core/install), and click Run.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-SeleniumSetup">Selenium Setup</h3><p>It is 
necessary that you have a compatible version of Firefox installed. &#160;On a 
Mac, you should install it in
  ~/Applications (rather than /Applications).</p><p>You should modify your 
~/.bash_profile (or equivalent), to add 
~/Applications/Firefox.app/Contents/MacOS to the PATH variable.</p><h3 
id="BuildingTapestryfromSource-RunningIndividualTests">Running Individual 
Tests</h3><p>Eclipse users:</p><ul><li>Install the <a class="external-link" 
href="http://testng.org/doc/eclipse.html"; rel="nofollow">TestNG plugin</a> to 
allow running of individual TestNG unit tests from within in 
Eclipse.</li><li>Right-click on any test class and select Run As &gt;TestNG 
Test</li></ul><p>Command-line users:</p><ul><li>./gradlew 
-Dtest.single=myclassname</li><li>./gradlew 
-Dtest.single=myclassname.mymethod</li></ul><p>where myclassname is the test 
class, such as FormTest</p><p>The Tapestry integration tests will repeatedly 
start up a Firefox browser.</p><ul><li>Ensure that your environment will allow 
a connection to <a class="external-link" href="https://localhost:9090"; 
rel="nofollow">https://localhost:9090</a>
 </li></ul><h3 id="BuildingTapestryfromSource-SkippingTests">Skipping 
Tests</h3><p>Running the Tapestry integration tests can take 10 minutes or more 
(mostly because of Selenium tests, which repeatedly start and stop the Firefox 
browser), so you won't want to run them every time you try a 
change.</p><ul><li>Command-line users:<ul><li><code>To build while skipping all 
tests: ./gradlew build -x test</code></li><li>You can skip tests on a specific 
module by adding a colon and the module name. For example: <code>-x 
test:tapestry-ioc</code></li></ul></li><li>Eclipse Gradle IDE users:<ul><li>In 
your External Tools Configuration, add the same -x test option as above at 
Arguments &gt; Program Arguments.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-RunningtheIntegrationTestAppsManually">Running 
the Integration Test Apps Manually</h3><p>The Tapestry source includes several 
small web apps that are used by the automated Selenium integration tests. You 
can also run these apps manually to
  try out nearly every browser-visible aspect of Tapestry. Just invoke the 
corresponding Gradle tasks. This is mainly useful when debugging failing 
selenium tests.</p><ul><li>Command-line users:<ul><li>./gradlew 
runTestApp1</li></ul></li><li>Eclipse users:<ul><li>Use the run-jetty-run 
plugin in Eclipse, with the context directory selected from among the 
<code>test</code> context directories. For example, in the tapestry-core 
module, right click on the /src/test/app1 (or app2, etc) folder, and select Run 
As &gt; Run Jetty, then open your browser to <a class="external-link" 
rel="nofollow" 
href="http://localhost:8080/tapestry-core";>http://localhost:8080/tapestry-core</a></li></ul></li></ul><p>The
 integration test apps are:</p><ul><li>activationctx&#160;&#8211; used 
by&#160;tapestry-core integration tests</li><li>activationctx2&#160;&#8211; 
used by&#160;tapestry-core integration tests</li><li>app0&#160;&#8211; used 
only by the tapestry-hibernate integration tests</li><li><strong>app1 &#8
 211;&#160;used by most of the tapestry-core integration 
tests</strong></li><li>app2&#160;&#8211; used by tapestry-core integration 
tests (HTTPS)</li><li>app3&#160;&#8211; used by&#160;tapestry-core integration 
tests</li><li>app4&#160;&#8211; used by&#160;tapestry-core integration 
tests</li><li>app5&#160;&#8211; used by&#160;tapestry-core integration 
tests</li><li><em>appfolder</em> &#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>cluster&#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>linktrans&#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>symbolparam&#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>(...and a few others not yet documented, and without 
Gradle tasks yet. Search for web.xml files in the Tapestry 
source.)</li></ul><h3 id="BuildingTapestryfromSource-MakingCodeChanges">Making 
Code Changes</h3><p>Once you have cloned or pulled the latest changes to your 
local Git repository, you can start working on i
 t. Whenever you make some changes to the codebase, it's good to have a related 
issue filed in JIRA and to use a similarly named branch in your local Git 
repository. For example, to create a branch for an issue with the key 
TAP5-123:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
+                            <div id="ConfluenceContent"><p>This is a guide to 
building Tapestry itself from source code. This is primarily of interest to 
Tapestry <em>contributors</em>, rather than Tapestry 
<em>users</em>.</p><p>Although Tapestry <em>users</em> are free to use any 
build mechanism for their own projects (and first class Maven support is 
provided), to build Tapestry itself from source you will use 
Gradle.</p><p>Note: Both command line and Eclipse Gradle IDE/EGit instructions 
are given here. Generally you'll want to chose approach one or the other, 
rather than mixing them.</p><h2 
id="BuildingTapestryfromSource-Prerequisites">Prerequisites</h2><ul><li>Install 
a <strong>Java JDK</strong> (Sun/Oracle, not OpenJDK), version 1.7 (just to 
prevent VU#225657, see: <a class="external-link" 
href="http://www.kb.cert.org/vuls/id/225657"; 
rel="nofollow">http://www.kb.cert.org/vuls/id/225657</a>), or version 1.8 for 
Tapestry 5.5 and later.</li><li>Install an <strong>IDE</strong> (IDE
 A IntelliJ is recommended (and free to Tapestry committers), but Eclipse will 
also work. NetBeans is reported to work as 
well.</li><li><strong>Firefox</strong>: For Tapestry 5.4.x and earlier, install 
Firefox browser <a class="external-link" 
href="https://ftp.mozilla.org/pub/firefox/releases/42.0/"; 
rel="nofollow">version 42</a> or earlier, needed for the integration tests 
(because newer versions require a newer version of Selenium than Tapestry's 
Java version requirements allow).</li><li><s>Set the Firefox browser's 
"preferred language" to English (en), because some tests will otherwise 
fail.</s> (Fixed; see <a class="external-link" 
href="https://issues.apache.org/jira/browse/TAP5-2413";>TAP5-2413</a>)</li><li>Install
 a <strong>Git</strong> client<ul><li>Command-line users: <a 
class="external-link" href="http://git-scm.com/downloads"; 
rel="nofollow">http://git-scm.com/downloads</a></li><li>Eclipse users: install 
EGit from the Eclipse Marketplace, then in In Window &gt; Preferences &gt
 ; Team &gt; Git, set your "Default repository folder" (e.g. <code>~/git</code> 
or <code>%HOME%\git</code>). Note that for Eclipse 4.4 (Luna) and later Git 
support is built in.</li></ul></li><li>Install <strong>Gradle</strong> 
1.0-milestone-3 or newer (or a Gradle plugin to your IDE),<ul><li>Command-line 
users: nothing to do (Tapestry's Gradle wrapper, gradlew, will download Gradle 
automatically on first use).</li><li>Eclipse users: Install Gradle IDE (aka 
Gradle Integration for Eclipse), from the Eclipse Marketplace. Note that for 
Eclipse 4.6 (Neon) and later, Gradle support is built 
in.</li></ul></li></ul><h2 
id="BuildingTapestryfromSource-GettingStarted">Getting Started</h2><p>Please 
read <a class="external-link" 
href="https://gitbox.apache.org";>https://gitbox.apache.org</a> 
first.</p><p>Windows users (especialy EGit users) should probably set the 
core.autocrlf config setting to <code>false</code> so that local diffs won't 
highlight line ending differences.</p><h3 id="BuildingTape
 stryfromSource-ClonetheRepository">Clone the Repository</h3><p>Clone Tapestry 
from the Git repo:</p><ul><li><p>Command-line git users:&#160;<code>git clone 
https://gitbox.apache.org/repos/asf/tapestry-5.git</code></p></li><li>Eclipse 
EGit users:<ul><li>Switch to Git perspective; then copy the URL above into 
paste buffer</li><li>Right-click &gt; Paste repository path or URI. This will 
bring up the Clone Git Repository dialog.</li><li>Committers: make sure 
Protocol is https, and enter your Apache commiter LDAP user name &amp; 
password</li><li>click Next.</li><li>Select the branches you're interested in 
(e.g 5.3 and master), click Next</li><li>Select Directory to where you want the 
project source code (e.g. <code>~/git/tapestry-5</code> or 
<code>%HOME%\git\tapestry-5</code>)</li><li>Select whichever "Initial Branch" 
you're interested in (e.g. master)</li><li>Set "Remote name" to "origin" (the 
default)</li><li><strong>VERY IMPORTANT</strong>: uncheck the "Import all 
existing projects" c
 heckbox (we'll do this using Gradle, below)</li><li>Click Finish. (Be patient; 
the clone operation might take a few minutes.)</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-GradlePreparation">Gradle 
Preparation</h3><ul><li>Command-line gradle users only:<ul><li>If you're using 
Eclipse but <strong>not</strong> Gradle IDE do <code>./gradlew 
eclipse</code></li><li>The command-line Gradle's eclipse plugin doesn't include 
the provided project dependencies; you need to add them manually (Java Build 
Path &gt; Projects &gt; Add tapestry-test). The plugin also generates a root 
eclipse project, so you'll need to delete the ".project" file in the root 
folder, and then you can import all Tapestry sub-projects at 
once.</li></ul></li><li>Eclipse Gradle IDE users:<ul><li>Switch to Java (or 
JEE) perspective and right-click &gt; Import... &gt; Gradle &gt; Gradle Project 
&gt; Next.</li><li>Set the "Root folder" to where you put your Tapestry source 
in the previous section (e.g. <code>~/git/tap
 estry-5</code> or <code>%Home%\git\tapestry-5</code>)</li><li>Click 
<code>Build Model. When it completes, s</code>elect the top-level (the 
top-level module and all sub-modules).</li><li>Be sure the "Enable dependency 
management" and "Create workingset 'tapestry-5' checkboxes are 
checked.</li><li>Click <code>Finish</code>. (Be patient; the import operation 
might take a few minutes.)</li></ul></li><li>Eclipse EGit users: Do a Git 
"Share" on the project:<ul><li>Still in the Java (or JEE) perspective, select 
all of the Tapestry projects (top-level and sub-modules) and right-click &gt; 
Team &gt; Share Project... &gt; Git &gt; Next &gt; Ensure all are selected, 
click <code>Finish</code>.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-Antlr">Antlr</h3><p>The 
<code>tapestry-core</code> project will initially have errors because of 
missing Java classes that are produced by ANTLR the first time the project is 
built. To fix this:</p><ul><li>Eclipse Gradle IDE users:<ul><li>Right click o
 n the <code>build.gradle</code> file within tapestry-core and click Run As 
&gt; "Gradle build...", check <strong>only</strong> the generateGrammarSource 
task, and change the "Name" field to something like "tapestry-core antlr", then 
click Apply and Run.</li><li>When it's finished, the antlr-generated classes 
(e.g. PropertyExpressionLexer.java) will be in created in 
$buildDir/generated-sources/antlr/, but Eclipse doesn't yet know about that 
path. To fix that, right click on the <code>tapestry-core</code> project &gt; 
Properties &gt; Java Build Path &gt; Source &gt; Add Folder &gt; find 
<code>tapestry-core/build/generated-sources/antlr</code> and check the checkbox 
next to it, then click <code>OK</code>.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-CoffeeScript">CoffeeScript</h3><p>If you want to 
run tests from within Eclipse, Tapestry will complain that it won't find 
certain JavaScript files that normally are generated during compile time from 
their Coffeescript sources. In 
 order to generate the JavaScript files you need to have Coffeescript installed 
and in your path. Simply install <a class="external-link" 
href="http://nodejs.org/download/"; rel="nofollow">Node.js</a> and afterwards 
run <code>npm install -g coffee-script</code>. The installation should take 
care of everything.</p><ul><li>Eclipse Gradle IDE users:<ul><li>Right click on 
the <code>build.gradle</code> file within tapestry-core and click Run As &gt; 
"Gradle build...", check <strong>only</strong> the 
tapestry-core:compileCoffeeScript and tapestry-core:compileTestCoffeeScript 
tasks, and change the "Name" field to something like "tapestry-core 
coffeescript", then click Apply and Run.</li><li>When it's finished, the 
coffeescript-generated JavaScript files (e.g. t5-core-dom-jquery.js) will be in 
created in $buildDir/generated-sources/compiled-coffeescript/ and 
$buildDir/generated-sources/compiled-test-coffeescript/, but Eclipse doesn't 
yet know about that path. To fix that, right click on the <
 code>tapestry-core</code> project &gt; Properties &gt; Java Build Path &gt; 
Source &gt; Add Folder &gt; find 
<code>tapestry-core/build/generated-sources/compiled-coffeescript</code> and 
<code>tapestry-core/build/generated-sources/compiled-test-coffeescript</code> 
and check the checkbox next to it, then click 
<code>OK</code>.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-GenerateCoffeeScriptandAntlrfilesautomaticallywhenchanged">Generate
 CoffeeScript and Antlr files automatically when changed</h3><p>If you want to 
have Eclipse compile the JavaScript files and lexer classes from their 
Coffeescript sources and Antlr files automatically when they change, you can do 
that by configuring an additional builder for the <code>tapestry-core</code> 
project:</p><ul><li>Eclipse Gradle IDE users:<ul><li>Right click on the 
<code>tapestry-core</code> project and select properties.</li><li>Select the 
"Builders" entry from the list on the left and click "New.." in the right 
panel.</li><li>Sele
 ct "Program" and click "Ok".</li><li>Give the program a meaningful name, e.g. 
"compile coffeescript and antlr".</li><li>Switch to the "Main" tab.</li><li>For 
"Location:" click "Browse Workspace..." and select gradlew (for Mac/Linux) or 
<code>gradlew.bat (for Windows)</code> in the Tapestry root project. If the 
root project is called "tapestry-5" the entry should look similar to 
"${workspace_loc:/tapestry-5/gradlew.bat}".</li><li>For "Working Directory:" 
click "Browse Workspace..." and select the Tapestry root project.</li><li>For 
"Arguments:" enter <code>tapestry-core:generateGrammarSource 
tapestry-core:compileCoffeeScript 
tapestry-core:compileTestCoffeeScript</code></li><li>Switch to the "Build 
Options" tab.</li><li>Make sure that only "Allocate Console", "After a 
"Clean"", "During manual builds", "During auto builds" and "Specify working set 
of relevant resources" are checked.</li><li>Click "Specify 
Resources...".</li><li>From the "tapestry-core" project select 
"src/main/antlr", "
 src/main/coffeescript", and "src/test/coffeescript".</li><li>Click 
"Finish".</li><li>Click "OK".</li><li>Click "OK".</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-Building">Building</h3><p>You can build 
individual modules, or (from the root folder) build 
everything.</p><ul><li>Command-line users:*( "gradlew" is the gradle wrapper 
shell script (gradlew) or batch file (gradlew.bat) found in the root folder of 
the Tapestry source.<ul><li><code>./gradlew 
build</code></li></ul></li><li>Eclipse Gradle IDE users:<ul><li>Right click on 
the top-level project (or any sub-project) and select Run As &gt; Gradle 
Build..., which starts an External Tools Configuration dialog box. Enter a 
reasonable name, select the tasks you want to run (for example, 
tapestry-core/install), and click Run.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-SeleniumSetup">Selenium Setup</h3><p>It is 
necessary that you have a compatible version of Firefox installed. &#160;On a 
Mac, you should install it in
  ~/Applications (rather than /Applications).</p><p>You should modify your 
~/.bash_profile (or equivalent), to add 
~/Applications/Firefox.app/Contents/MacOS to the PATH variable.</p><h3 
id="BuildingTapestryfromSource-RunningIndividualTests">Running Individual 
Tests</h3><p>Eclipse users:</p><ul><li>Install the <a class="external-link" 
href="http://testng.org/doc/eclipse.html"; rel="nofollow">TestNG plugin</a> to 
allow running of individual TestNG unit tests from within in 
Eclipse.</li><li>Right-click on any test class and select Run As &gt;TestNG 
Test</li></ul><p>Command-line users:</p><ul><li>./gradlew 
-Dtest.single=myclassname</li><li>./gradlew 
-Dtest.single=myclassname.mymethod</li></ul><p>where myclassname is the test 
class, such as FormTest</p><p>The Tapestry integration tests will repeatedly 
start up a Firefox browser.</p><ul><li>Ensure that your environment will allow 
a connection to <a class="external-link" href="https://localhost:9090"; 
rel="nofollow">https://localhost:9090</a>
 </li></ul><h3 id="BuildingTapestryfromSource-SkippingTests">Skipping 
Tests</h3><p>Running the Tapestry integration tests can take 10 minutes or more 
(mostly because of Selenium tests, which repeatedly start and stop the Firefox 
browser), so you won't want to run them every time you try a 
change.</p><ul><li>Command-line users:<ul><li><code>To build while skipping all 
tests: ./gradlew build -x test</code></li><li>You can skip tests on a specific 
module by adding a colon and the module name. For example: <code>-x 
test:tapestry-ioc</code></li></ul></li><li>Eclipse Gradle IDE users:<ul><li>In 
your External Tools Configuration, add the same -x test option as above at 
Arguments &gt; Program Arguments.</li></ul></li></ul><h3 
id="BuildingTapestryfromSource-RunningtheIntegrationTestAppsManually">Running 
the Integration Test Apps Manually</h3><p>The Tapestry source includes several 
small web apps that are used by the automated Selenium integration tests. You 
can also run these apps manually to
  try out nearly every browser-visible aspect of Tapestry. Just invoke the 
corresponding Gradle tasks. This is mainly useful when debugging failing 
selenium tests.</p><ul><li>Command-line users:<ul><li>./gradlew 
runTestApp1</li></ul></li><li>Eclipse users:<ul><li>Use the run-jetty-run 
plugin in Eclipse, with the context directory selected from among the 
<code>test</code> context directories. For example, in the tapestry-core 
module, right click on the /src/test/app1 (or app2, etc) folder, and select Run 
As &gt; Run Jetty, then open your browser to <a class="external-link" 
href="http://localhost:8080/tapestry-core"; 
rel="nofollow">http://localhost:8080/tapestry-core</a></li></ul></li></ul><p>The
 integration test apps are:</p><ul><li>activationctx&#160;&#8211; used 
by&#160;tapestry-core integration tests</li><li>activationctx2&#160;&#8211; 
used by&#160;tapestry-core integration tests</li><li>app0&#160;&#8211; used 
only by the tapestry-hibernate integration tests</li><li><strong>app1 &#8
 211;&#160;used by most of the tapestry-core integration 
tests</strong></li><li>app2&#160;&#8211; used by tapestry-core integration 
tests (HTTPS)</li><li>app3&#160;&#8211; used by&#160;tapestry-core integration 
tests</li><li>app4&#160;&#8211; used by&#160;tapestry-core integration 
tests</li><li>app5&#160;&#8211; used by&#160;tapestry-core integration 
tests</li><li><em>appfolder</em> &#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>cluster&#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>linktrans&#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>symbolparam&#160;&#8211; used by&#160;tapestry-core 
integration tests</li><li>(...and a few others not yet documented, and without 
Gradle tasks yet. Search for web.xml files in the Tapestry 
source.)</li></ul><h3 id="BuildingTapestryfromSource-MakingCodeChanges">Making 
Code Changes</h3><p>Once you have cloned or pulled the latest changes to your 
local Git repository, you can start working on i
 t. Whenever you make some changes to the codebase, it's good to have a related 
issue filed in JIRA and to use a similarly named branch in your local Git 
repository. For example, to create a branch for an issue with the key 
TAP5-123:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
 <pre><code class="language-java">git branch TAP5-123 origin/master</code></pre>
 </div></div><p>With per-issue branches you can easily switch back and forth 
between different issues without worrying about unwanted side-effects from 
unfinished changes to other issues. Whenever you want to work on the TAP5-123 
example issue, simply checkout that branch and start making your 
changes:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
 <pre><code class="language-java">git checkout TAP5-123</code></pre>

Modified: websites/production/tapestry/content/built-in-mixins.html
==============================================================================
--- websites/production/tapestry/content/built-in-mixins.html (original)
+++ websites/production/tapestry/content/built-in-mixins.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache

Modified: websites/production/tapestry/content/built-in-modules.html
==============================================================================
--- websites/production/tapestry/content/built-in-modules.html (original)
+++ websites/production/tapestry/content/built-in-modules.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache

Modified: websites/production/tapestry/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.

Modified: websites/production/tapestry/content/case-insensitivity.html
==============================================================================
--- websites/production/tapestry/content/case-insensitivity.html (original)
+++ websites/production/tapestry/content/case-insensitivity.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache

Modified: websites/production/tapestry/content/chainbuilder-service.html
==============================================================================
--- websites/production/tapestry/content/chainbuilder-service.html (original)
+++ websites/production/tapestry/content/chainbuilder-service.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -178,7 +179,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="pipelinebuilder-service.html">PipelineBuilder 
Service</a>
+                        <a href="ioc-cookbook-patterns.html">IoC Cookbook - 
Patterns</a>
                 
                         
                     </div>
@@ -187,7 +188,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="strategybuilder-service.html">StrategyBuilder 
Service</a>
+                        <a href="pipelinebuilder-service.html">PipelineBuilder 
Service</a>
                 
                         
                     </div>
@@ -196,7 +197,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="ioc-cookbook-patterns.html">IoC Cookbook - 
Patterns</a>
+                        <a href="strategybuilder-service.html">StrategyBuilder 
Service</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/cheat-sheets.html
==============================================================================
--- websites/production/tapestry/content/cheat-sheets.html (original)
+++ websites/production/tapestry/content/cheat-sheets.html Thu Apr  4 09:17:08 
2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache

Modified: websites/production/tapestry/content/class-reloading.html
==============================================================================
--- websites/production/tapestry/content/class-reloading.html (original)
+++ websites/production/tapestry/content/class-reloading.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -177,12 +178,12 @@
 </div>
 
 
-<p>One of the best features of Tapestry is automatic reloading of changed 
classes and templates. <em>Page and component</em> classes will automatically 
reload when changed. Likewise, changes to component templates and other related 
resources will also be picked up immediately. In addition, starting in version 
5.2, your service classes will also be reloaded automatically after changes (if 
you're using <a href="ioc.html">Tapestry IoC</a>). Starting in version 5.8.3, 
you enable multiple classloader mode, which allows smarter page class 
invalidation.</p><div class="confluence-information-macro 
confluence-information-macro-information"><p class="title">Not necessarily 
throwing away all cached page instances</p><span class="aui-icon aui-icon-small 
aui-iconfont-info confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Since Tapestry 5.8.3, Tapestry can 
be run in multiple classloaders mode. When it's on, only the affected cached 
page instances are disc
 arded and rebuilt instead of all of them.&#160;</p></div></div><h2 
id="ClassReloading-Contents">Contents</h2><p><style 
type="text/css">/*<![CDATA[*/
-div.rbtoc1687036302863 {padding: 0px;}
-div.rbtoc1687036302863 ul {margin-left: 0px;}
-div.rbtoc1687036302863 li {margin-left: 0px;padding-left: 0px;}
+<p>One of the best features of Tapestry is automatic reloading of changed 
classes and templates. <em>Page and component</em> classes will automatically 
reload when changed. Likewise, changes to component templates and other related 
resources will also be picked up immediately. In addition, starting in version 
5.2, your service classes will also be reloaded automatically after changes (if 
you're using <a href="ioc.html">Tapestry IoC</a>). Starting in version 5.8.3, 
you enable multiple classloader mode, which allows smarter page class 
invalidation.</p><div class="confluence-information-macro 
confluence-information-macro-information"><p class="title 
conf-macro-render">Not necessarily throwing away all cached page 
instances</p><span class="aui-icon aui-icon-small aui-iconfont-info 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Since Tapestry 5.8.3, Tapestry can 
be run in multiple classloaders mode. When it's on, only the affected cached 
page 
 instances are discarded and rebuilt instead of all of 
them.&#160;</p></div></div><h2 
id="ClassReloading-Contents">Contents</h2><p><style 
type="text/css">/*<![CDATA[*/
+div.rbtoc1712222019721 {padding: 0px;}
+div.rbtoc1712222019721 ul {margin-left: 0px;}
+div.rbtoc1712222019721 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1687036302863">
+/*]]>*/</style></p><div class="toc-macro rbtoc1712222019721">
 <ul class="toc-indentation"><li><a 
href="#ClassReloading-TemplateReloading">Template Reloading</a></li><li><a 
href="#ClassReloading-ClassReloading">Class Reloading</a></li><li><a 
href="#ClassReloading-PackagesScanned">Packages Scanned</a></li><li><a 
href="#ClassReloading-FileSystemOnly">File System Only</a></li><li><a 
href="#ClassReloading-ClassLoaderIssues">Class Loader Issues</a></li><li><a 
href="#ClassReloading-ClassCastExceptions">ClassCastExceptions</a></li><li><a 
href="#ClassReloading-HandlingReloadsinyourCode">Handling Reloads in your 
Code</a></li><li><a href="#ClassReloading-CheckingForUpdates">Checking For 
Updates</a></li><li><a 
href="#ClassReloading-TroubleshootingLiveClassReloading">Troubleshooting Live 
Class Reloading</a>
 <ul class="toc-indentation"><li><a href="#ClassReloading-QuickChecklist">Quick 
Checklist</a></li><li><a 
href="#ClassReloading-IfLiveClassReloadingdoesn'twork">If Live Class Reloading 
doesn't work</a>
 <ul class="toc-indentation"><li><a 
href="#ClassReloading-ProductionMode">Production Mode</a></li><li><a 
href="#ClassReloading-BuildPathIssues">Build Path Issues</a></li><li><a 
href="#ClassReloading-BuildingAutomatically">Building 
Automatically</a></li><li><a 
href="#ClassReloading-TurnoffJVMhotcodeswapping&amp;automaticrestarts">Turn off 
JVM hot code swapping &amp; automatic restarts</a></li></ul>

Modified: websites/production/tapestry/content/client-side-javascript.html
==============================================================================
--- websites/production/tapestry/content/client-side-javascript.html (original)
+++ websites/production/tapestry/content/client-side-javascript.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -160,7 +161,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="ajax-and-zones.html">Ajax and Zones</a>
+                        <a href="legacy-javascript.html">Legacy JavaScript</a>
                 
                         
                     </div>
@@ -169,7 +170,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="legacy-javascript.html">Legacy JavaScript</a>
+                        <a href="ajax-and-zones.html">Ajax and Zones</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/clustering-issues.html
==============================================================================
--- websites/production/tapestry/content/clustering-issues.html (original)
+++ websites/production/tapestry/content/clustering-issues.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache

Modified: websites/production/tapestry/content/coffeescript.html
==============================================================================
--- websites/production/tapestry/content/coffeescript.html (original)
+++ websites/production/tapestry/content/coffeescript.html Thu Apr  4 09:17:08 
2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -205,7 +206,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="ajax-and-zones.html">Ajax and Zones</a>
+                        <a href="legacy-javascript.html">Legacy JavaScript</a>
                 
                         
                     </div>
@@ -214,7 +215,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="legacy-javascript.html">Legacy JavaScript</a>
+                        <a href="component-cheat-sheet.html">Component Cheat 
Sheet</a>
                 
                         
                     </div>
@@ -223,7 +224,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-cheat-sheet.html">Component Cheat 
Sheet</a>
+                        <a href="ajax-and-zones.html">Ajax and Zones</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/committers.html
==============================================================================
--- websites/production/tapestry/content/committers.html (original)
+++ websites/production/tapestry/content/committers.html Thu Apr  4 09:17:08 
2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -152,7 +153,7 @@
 <div class="cfm-align-right" style="text-align: 
right;">bobhar...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="https://github.com/bobharner"; 
rel="nofollow">https://github.com/bobharner</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Christophe Cordenier</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>ccordenier</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>committer</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">ccorden...@apache.org</div>
-</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" rel="nofollow" 
href="http://spreadthesource.com";>http://spreadthesource.com</a></td></tr><tr><td
 colspan="1" rowspan="1" class="confluenceTd"><p>Dan Adams</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>dadams</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>committer</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
+</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://spreadthesource.com"; 
rel="nofollow">http://spreadthesource.com</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Dan Adams</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>dadams</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: right;">dad...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Daniel Gredler</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>gredler</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">gred...@apache.org</div>
@@ -166,9 +167,9 @@
 <div class="cfm-align-right" style="text-align: right;">ffa...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" 
href="http://people.apache.org/~ffacon/";>http://people.apache.org/~ffacon/</a></td></tr><tr><td
 colspan="1" rowspan="1" class="confluenceTd"><p>Howard M. Lewis 
Ship</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>hlship</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>PMC member and former chair</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: right;">hls...@apache.org</div>
-</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" rel="nofollow" 
href="http://howardlewisship.com";>http://howardlewisship.com</a></td></tr><tr><td
 colspan="1" rowspan="1" class="confluenceTd"><p>Igor Drobiazko</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>drobiazko</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>PMC member</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><div class="content-wrapper">    
+</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://howardlewisship.com"; 
rel="nofollow">http://howardlewisship.com</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Igor Drobiazko</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>drobiazko</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>PMC member</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">drobia...@apache.org</div>
-</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" rel="nofollow" 
href="http://tapestry5.de";>http://tapestry5.de</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Jesse Kuhnert</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>jkuhnert</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>PMC member</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
+</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://tapestry5.de"; 
rel="nofollow">http://tapestry5.de</a></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Jesse Kuhnert</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>jkuhnert</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>PMC member</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">jkuhn...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Jochen Kemnade</td><td colspan="1" rowspan="1" 
class="confluenceTd">jkemnade</td><td colspan="1" rowspan="1" 
class="confluenceTd">PMC member</td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">jkemn...@apache.org</div>
@@ -176,7 +177,7 @@
 <div class="cfm-align-right" style="text-align: 
right;">joshcanfi...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Kalle Korhonen</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>kaosko</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: right;">kao...@apache.org</div>
-</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" rel="nofollow" 
href="http://tynamo.org";>http://tynamo.org</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Kevin Menard</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>kmenard</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
+</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://tynamo.org"; 
rel="nofollow">http://tynamo.org</a></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Kevin Menard</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>kmenard</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">kmen...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Marcus Schulte</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>mschulte</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>PMC member</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">mschu...@apache.org</div>
@@ -188,13 +189,13 @@
 <div class="cfm-align-right" style="text-align: 
right;">robertdzeig...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Robin Komiwes</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>robinkomiwes</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">robinkomi...@apache.org</div>
-</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" rel="nofollow" 
href="http://spreadthesource.com";>http://spreadthesource.com</a></td></tr><tr><td
 colspan="1" rowspan="1" class="confluenceTd"><p>Taha Hafeez</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>tawus</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>committer</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
+</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://spreadthesource.com"; 
rel="nofollow">http://spreadthesource.com</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Taha Hafeez</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>tawus</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: right;">ta...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://tawus.wordpress.com"; 
rel="nofollow">http://tawus.wordpress.com</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Ted Steen</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>tedst</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>committer</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: right;">te...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Thiago H. de Paula Figueiredo</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>thiagohp</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>PMC chair</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: 
right;">thiag...@apache.org</div>
-</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" rel="nofollow" 
href="http://machina.com.br";>http://machina.com.br</a></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Ulrich St&#228;rk</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>uli</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Former PMC member</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><div class="content-wrapper">    
+</div></td><td colspan="1" rowspan="1" class="confluenceTd"><a 
class="external-link" href="http://machina.com.br"; 
rel="nofollow">http://machina.com.br</a></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>Ulrich St&#228;rk</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>uli</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Former PMC member</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><div class="content-wrapper">    
 <div class="cfm-align-right" style="text-align: right;">u...@apache.org</div>
 </div></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p></p></td></tr></tbody></table></div></div>
             </div>

Modified: websites/production/tapestry/content/community.html
==============================================================================
--- websites/production/tapestry/content/community.html (original)
+++ websites/production/tapestry/content/community.html Thu Apr  4 09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -143,11 +144,11 @@
             <!-- /// Content Start -->
             <div id="content">
                             <div id="ConfluenceContent"><p>Tapestry has an 
active community of users and developers. This is an overview of how to 
participate, along with a list of some of the great contributions of the 
community members.</p><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1669470804088 {padding: 0px;}
-div.rbtoc1669470804088 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1669470804088 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1712222044653 {padding: 0px;}
+div.rbtoc1712222044653 ul {margin-left: 0px;}
+div.rbtoc1712222044653 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1669470804088">
+/*]]>*/</style></p><div class="toc-macro rbtoc1712222044653">
 <ul class="toc-indentation"><li><a href="#Community-GettingInvolved">Getting 
Involved</a>
 <ul class="toc-indentation"><li><a 
href="#Community-ReportingProblems/GettingSupport">Reporting Problems / Getting 
Support</a></li><li><a 
href="#Community-ContributingtranslationsforTapestrybuilt-inmessages">Contributing
 translations for Tapestry built-in messages</a></li><li><a 
href="#Community-SourceCodeAccess">Source Code Access</a></li><li><a 
href="#Community-BecomingaContributor">Becoming a Contributor</a></li><li><a 
href="#Community-BecomingaCommitter">Becoming a Committer</a></li></ul>
 </li><li><a href="#Community-CommunityContributions">Community 
Contributions</a>

Modified: websites/production/tapestry/content/component-cheat-sheet.html
==============================================================================
--- websites/production/tapestry/content/component-cheat-sheet.html (original)
+++ websites/production/tapestry/content/component-cheat-sheet.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -169,7 +170,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="page-and-component-classes-faq.html">Page And 
Component Classes FAQ</a>
+                        <a href="component-libraries.html">Component 
Libraries</a>
                 
                         
                     </div>
@@ -178,7 +179,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-libraries.html">Component 
Libraries</a>
+                        <a href="component-reference.html">Component 
Reference</a>
                 
                         
                     </div>
@@ -187,7 +188,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-classes.html">Component Classes</a>
+                        <a href="page-and-component-classes-faq.html">Page And 
Component Classes FAQ</a>
                 
                         
                     </div>
@@ -196,7 +197,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-reference.html">Component 
Reference</a>
+                        <a href="component-classes.html">Component Classes</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/component-classes.html
==============================================================================
--- websites/production/tapestry/content/component-classes.html (original)
+++ websites/production/tapestry/content/component-classes.html Thu Apr  4 
09:17:08 2024
@@ -99,7 +99,8 @@
                 <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
                   <a class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
                   <a class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
-                </div>
+                  <a class="dropdown-item" href="/development-roadmap.html" 
title="Development Roadmap">Roadmap</a>
+  &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;</div>
               </li><li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
                   Apache
@@ -160,7 +161,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="page-and-component-classes-faq.html">Page And 
Component Classes FAQ</a>
+                        <a href="component-libraries.html">Component 
Libraries</a>
                 
                         
                     </div>
@@ -169,7 +170,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-libraries.html">Component 
Libraries</a>
+                        <a href="component-reference.html">Component 
Reference</a>
                 
                         
                     </div>
@@ -178,7 +179,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-reference.html">Component 
Reference</a>
+                        <a href="page-and-component-classes-faq.html">Page And 
Component Classes FAQ</a>
                 
                         
                     </div>
@@ -196,7 +197,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-parameters.html">Component 
Parameters</a>
+                        <a href="component-cheat-sheet.html">Component Cheat 
Sheet</a>
                 
                         
                     </div>
@@ -205,7 +206,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="component-cheat-sheet.html">Component Cheat 
Sheet</a>
+                        <a href="component-parameters.html">Component 
Parameters</a>
                 
                         
                     </div>
@@ -239,7 +240,7 @@ public class HelloWorld
     }
 }
 </code></pre>
-</div></div><p>In this example, just like the first one, the component's only 
job is to write out a fixed message. The @<a class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeginRender.html";>BeginRender</a>
 annotation is a type of <em><a href="component-rendering.html">render phase 
annotation</a></em></p><p>, a method annotation that instructs Tapestry when 
and under what circumstances to invoke methods of your class.</p><p>These 
methods are not necessarily public; they can have any access level you like 
(unlike in Tapestry 4). By convention they usually have package-private access 
level (the default).</p><h2 id="ComponentClasses-ComponentPackages">Component 
Packages</h2><p>Component classes must exist within an appropriate package 
(this is necessary for runtime code transformation and class reloading to 
operate).</p><p>These packages exist under the application's root package, as 
follows:</p><ul><li>For pages, place classes in <
 em>root</em>.<strong>pages</strong>. Page names are mapped to classes within 
this package.</li><li>For mixins, place classes in 
<em>root</em>.<strong>mixins</strong>. Mixin types are mapped to classes within 
this package.</li><li>For other components, place classes in 
<em>root</em>.<strong>components</strong>. Component types are mapped to 
classes within this package.</li></ul><p>In addition, it is common for an 
application to have base classes, often <em>abstract</em> base classes, that 
should not be directly referenced. These should <em>not</em> go in the 
<strong>pages</strong>, <strong>components</strong> or <strong>mixins</strong> 
packages, because they then look like valid pages, components or mixins. 
Instead, use the <em>root</em>.<strong>base</strong> package to store such base 
classes.</p><div class="confluence-information-macro 
confluence-information-macro-warning"><span class="aui-icon aui-icon-small 
aui-iconfont-error confluence-information-macro-icon"></span><div class="
 confluence-information-macro-body"><p>Only component classes should go in any 
of these controlled packages; classes representing data, or interfaces, or 
anything that isn't precisely a component class, must go elsewhere. Any 
top-level class in any of the controlled packages will be transformed at 
runtime. The only exception is inner classes (anonymous or not), which are 
loaded by the same class loader as the component class loader, but not 
transformed as components.</p></div></div><h2 
id="ComponentClasses-Sub-Folders/Sub-Packages">Sub-Folders / 
Sub-Packages</h2><p>Classes do not have to go directly inside the package 
(pages, components, mixins, etc.). It is valid to create a sub-package to store 
some of the classes. The sub-package name becomes part of the page name or 
component type. Thus you might define a page component 
<code>com.example.myapp.pages.admin.CreateUser</code> and the logical page name 
(which often shows up inside URLs) will be 
<strong>admin/CreateUser</strong>.</p><
 p>Tapestry performs some simple optimizations of the logical page name (or 
component type, or mixin type). It checks to see if the package name is either 
a prefix or a suffix of the unqualified class name (case insensitively, of 
course) and removes the prefix or suffix if so. The net result is that a class 
name such as <code>com.example.myapp.pages.user.EditUser</code> will have a 
page name of <code>user/Edit</code> (instead of user<code>/EditUser</code>). 
The goal here is to provide shorter, more natural URLs.</p><h2 
id="ComponentClasses-IndexPages">Index Pages</h2><p>One special simplification 
exists for Index pages: if the logical page name is Index after removing the 
package name from the unqualified class name, it will map to the root of that 
folder. A class such as <code>com.example.myapp.pages.user.IndexUser</code> or 
<code>com.example.myapp.pages.user.UserIndex</code> will have a page name of 
<code>user/</code>.</p><p>In previous versions of Tapestry there was also the 
conce
 pt of a start page configured with the <code><a 
href="configuration.html">tapestry.start-page-name</a></code> configuration 
symbol (defaults to "start"). If a page with a name as configured with that 
symbol exists at the root level, this page is used as the root URL. This has 
precedence over an existing Index page. If for example you have a page class 
<code>com.example.myapp.pages.Start</code> it will map to 
<code>/</code>.</p><div class="confluence-information-macro 
confluence-information-macro-warning"><span class="aui-icon aui-icon-small 
aui-iconfont-error confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Use of start-pages is discouraged 
and support for it will eventually be removed. Use an Index page 
instead.</p></div></div><h2 id="ComponentClasses-Pagesvs.Components">Pages vs. 
Components</h2><p>The distinction between pages and component is very, very 
small. The primary difference is the package name: 
<em>root</em>.<strong>pages</stron
 g>.<em>PageName</em> for pages, and 
<em>root</em>.<strong>components</strong>.<em>ComponentType</em> for 
components. Conceptually, page components are simply the <em>root 
component</em> of a page's component tree.</p><p><em>For Tapestry 4 users: 
there was a much greater distinction in Tapestry 4 between pages and 
components, which showed up as separate interfaces and a hierarchy of abstract 
implementations to extend your classes from.</em></p><h2 
id="ComponentClasses-ClassTransformation">Class Transformation</h2><p>Tapestry 
uses your class as a starting point. It <em>transforms</em> your class at 
runtime. This is necessary for a number of reasons, including to address how 
Tapestry shares pages between requests.</p><p>For the most part, these 
transformations are both sensible and invisible. In a few limited cases, they 
comprise a marginally&#160;<a class="external-link" 
href="http://www.joelonsoftware.com/printerFriendly/articles/LeakyAbstractions.html";
 rel="nofollow">leaky abstracti
 on</a>&#160;&#8211; for instance, the scope restrictions on instance variables 
described below &#8211; but the programming model in general supports a very 
high level of developer productivity.</p><p>Because transformation doesn't 
occur until <em>runtime</em>, the build stage of your application is not 
affected by the fact that you are creating a Tapestry application. Further, 
your classes are absolutely simple POJOs during unit testing.</p><h2 
id="ComponentClasses-LiveClassReloading">Live Class Reloading</h2><p>Main 
Article: <a href="class-reloading.html">Class Reloading</a></p><p>Component 
classes are monitored for changes by the framework. <a 
href="class-reloading.html">Classes are reloaded when changed</a>. This allows 
you to build your application with a speed approaching that of a scripting 
environment, without sacrificing any of the power of the Java 
platform.</p><p>And it's fast! You won't even notice that this magic class 
reloading has occurred.</p><p>The net result: super 
 productivity &#8212; change your class, see the change instantly. This is 
designed to be a blend of the best of scripting environments (such as Python or 
Ruby) with all the speed and power of Java backing it up.</p><p>However, class 
reloading <em>only</em> applies to component classes (pages, components and 
mixins) and, starting in 5.2, Tapestry IOC-based service implementations (with 
some restrictions). Other classes, such as service interfaces, entity/model 
classes, and other data objects, are loaded by the normal class loader and not 
subject to live class reloading.</p><h2 
id="ComponentClasses-InstanceVariables">Instance Variables</h2><p>Tapestry 
components may have instance variables (unlike Tapestry 4, where you had to use 
<em>abstract properties</em>).</p><p>Since release 5.3.2, instance variables 
may be protected, or package private (that is, no access modifier). Under 
specific circumstances they may even be public (public fields must either be 
final, or have the @<a class="e
 xternal-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Retain.html";>Retain</a>&#160;annotation).</p><p><span>Be
 aware that you will need to either provide getter and setter methods to access 
your classes' instance variables, or else annotate the fields 
with</span><span>&#160;@</span><a class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Property.html";>Property</a>.</p><h2
 id="ComponentClasses-TransientInstanceVariables">Transient Instance 
Variables</h2><p>Unless an instance variable is decorated with an annotation, 
it will be a <em>transient</em> instance variable. This means that its value 
resets to its default value at the end of reach request (when the <a 
href="page-life-cycle.html">page is detached from the request</a>).</p><div 
class="confluence-information-macro confluence-information-macro-note"><p 
class="title">About initialization</p><span class="aui-icon aui-icon-small 
aui-iconfont
 -warning confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Never initialize an instance field 
to a <em>mutable</em> object at the point of declaration. If this is done, the 
instance created from that initializer becomes the default value for that field 
and is reused inside the component on every request. This could cause state to 
inadvertently be shared between different sessions in an 
application.</p></div></div>
+</div></div><p>In this example, just like the first one, the component's only 
job is to write out a fixed message. The @<a class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeginRender.html";>BeginRender</a>
 annotation is a type of <em><a href="component-rendering.html">render phase 
annotation</a></em></p><p>, a method annotation that instructs Tapestry when 
and under what circumstances to invoke methods of your class.</p><p>These 
methods are not necessarily public; they can have any access level you like 
(unlike in Tapestry 4). By convention they usually have package-private access 
level (the default).</p><h2 id="ComponentClasses-ComponentPackages">Component 
Packages</h2><p>Component classes must exist within an appropriate package 
(this is necessary for runtime code transformation and class reloading to 
operate).</p><p>These packages exist under the application's root package, as 
follows:</p><ul><li>For pages, place classes in <
 em>root</em>.<strong>pages</strong>. Page names are mapped to classes within 
this package.</li><li>For mixins, place classes in 
<em>root</em>.<strong>mixins</strong>. Mixin types are mapped to classes within 
this package.</li><li>For other components, place classes in 
<em>root</em>.<strong>components</strong>. Component types are mapped to 
classes within this package.</li></ul><p>In addition, it is common for an 
application to have base classes, often <em>abstract</em> base classes, that 
should not be directly referenced. These should <em>not</em> go in the 
<strong>pages</strong>, <strong>components</strong> or <strong>mixins</strong> 
packages, because they then look like valid pages, components or mixins. 
Instead, use the <em>root</em>.<strong>base</strong> package to store such base 
classes.</p><div class="confluence-information-macro 
confluence-information-macro-warning"><span class="aui-icon aui-icon-small 
aui-iconfont-error confluence-information-macro-icon"></span><div class="
 confluence-information-macro-body"><p>Only component classes should go in any 
of these controlled packages; classes representing data, or interfaces, or 
anything that isn't precisely a component class, must go elsewhere. Any 
top-level class in any of the controlled packages will be transformed at 
runtime. The only exception is inner classes (anonymous or not), which are 
loaded by the same class loader as the component class loader, but not 
transformed as components.</p></div></div><h2 
id="ComponentClasses-Sub-Folders/Sub-Packages">Sub-Folders / 
Sub-Packages</h2><p>Classes do not have to go directly inside the package 
(pages, components, mixins, etc.). It is valid to create a sub-package to store 
some of the classes. The sub-package name becomes part of the page name or 
component type. Thus you might define a page component 
<code>com.example.myapp.pages.admin.CreateUser</code> and the logical page name 
(which often shows up inside URLs) will be 
<strong>admin/CreateUser</strong>.</p><
 p>Tapestry performs some simple optimizations of the logical page name (or 
component type, or mixin type). It checks to see if the package name is either 
a prefix or a suffix of the unqualified class name (case insensitively, of 
course) and removes the prefix or suffix if so. The net result is that a class 
name such as <code>com.example.myapp.pages.user.EditUser</code> will have a 
page name of <code>user/Edit</code> (instead of user<code>/EditUser</code>). 
The goal here is to provide shorter, more natural URLs.</p><h2 
id="ComponentClasses-IndexPages">Index Pages</h2><p>One special simplification 
exists for Index pages: if the logical page name is Index after removing the 
package name from the unqualified class name, it will map to the root of that 
folder. A class such as <code>com.example.myapp.pages.user.IndexUser</code> or 
<code>com.example.myapp.pages.user.UserIndex</code> will have a page name of 
<code>user/</code>.</p><p>In previous versions of Tapestry there was also the 
conce
 pt of a start page configured with the <code><a 
href="configuration.html">tapestry.start-page-name</a></code> configuration 
symbol (defaults to "start"). If a page with a name as configured with that 
symbol exists at the root level, this page is used as the root URL. This has 
precedence over an existing Index page. If for example you have a page class 
<code>com.example.myapp.pages.Start</code> it will map to 
<code>/</code>.</p><div class="confluence-information-macro 
confluence-information-macro-warning"><span class="aui-icon aui-icon-small 
aui-iconfont-error confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Use of start-pages is discouraged 
and support for it will eventually be removed. Use an Index page 
instead.</p></div></div><h2 id="ComponentClasses-Pagesvs.Components">Pages vs. 
Components</h2><p>The distinction between pages and component is very, very 
small. The primary difference is the package name: 
<em>root</em>.<strong>pages</stron
 g>.<em>PageName</em> for pages, and 
<em>root</em>.<strong>components</strong>.<em>ComponentType</em> for 
components. Conceptually, page components are simply the <em>root 
component</em> of a page's component tree.</p><p><em>For Tapestry 4 users: 
there was a much greater distinction in Tapestry 4 between pages and 
components, which showed up as separate interfaces and a hierarchy of abstract 
implementations to extend your classes from.</em></p><h2 
id="ComponentClasses-ClassTransformation">Class Transformation</h2><p>Tapestry 
uses your class as a starting point. It <em>transforms</em> your class at 
runtime. This is necessary for a number of reasons, including to address how 
Tapestry shares pages between requests.</p><p>For the most part, these 
transformations are both sensible and invisible. In a few limited cases, they 
comprise a marginally&#160;<a class="external-link" 
href="http://www.joelonsoftware.com/printerFriendly/articles/LeakyAbstractions.html";
 rel="nofollow">leaky abstracti
 on</a>&#160;&#8211; for instance, the scope restrictions on instance variables 
described below &#8211; but the programming model in general supports a very 
high level of developer productivity.</p><p>Because transformation doesn't 
occur until <em>runtime</em>, the build stage of your application is not 
affected by the fact that you are creating a Tapestry application. Further, 
your classes are absolutely simple POJOs during unit testing.</p><h2 
id="ComponentClasses-LiveClassReloading">Live Class Reloading</h2><p>Main 
Article: <a href="class-reloading.html">Class Reloading</a></p><p>Component 
classes are monitored for changes by the framework. <a 
href="class-reloading.html">Classes are reloaded when changed</a>. This allows 
you to build your application with a speed approaching that of a scripting 
environment, without sacrificing any of the power of the Java 
platform.</p><p>And it's fast! You won't even notice that this magic class 
reloading has occurred.</p><p>The net result: super 
 productivity &#8212; change your class, see the change instantly. This is 
designed to be a blend of the best of scripting environments (such as Python or 
Ruby) with all the speed and power of Java backing it up.</p><p>However, class 
reloading <em>only</em> applies to component classes (pages, components and 
mixins) and, starting in 5.2, Tapestry IOC-based service implementations (with 
some restrictions). Other classes, such as service interfaces, entity/model 
classes, and other data objects, are loaded by the normal class loader and not 
subject to live class reloading.</p><h2 
id="ComponentClasses-InstanceVariables">Instance Variables</h2><p>Tapestry 
components may have instance variables (unlike Tapestry 4, where you had to use 
<em>abstract properties</em>).</p><p>Since release 5.3.2, instance variables 
may be protected, or package private (that is, no access modifier). Under 
specific circumstances they may even be public (public fields must either be 
final, or have the @<a class="e
 xternal-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Retain.html";>Retain</a>&#160;annotation).</p><p><span>Be
 aware that you will need to either provide getter and setter methods to access 
your classes' instance variables, or else annotate the fields 
with</span><span>&#160;@</span><a class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Property.html";>Property</a>.</p><h2
 id="ComponentClasses-TransientInstanceVariables">Transient Instance 
Variables</h2><p>Unless an instance variable is decorated with an annotation, 
it will be a <em>transient</em> instance variable. This means that its value 
resets to its default value at the end of reach request (when the <a 
href="page-life-cycle.html">page is detached from the request</a>).</p><div 
class="confluence-information-macro confluence-information-macro-note"><p 
class="title conf-macro-render">About initialization</p><span class="aui-icon 
aui-icon-
 small aui-iconfont-warning confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Never initialize an instance field 
to a <em>mutable</em> object at the point of declaration. If this is done, the 
instance created from that initializer becomes the default value for that field 
and is reused inside the component on every request. This could cause state to 
inadvertently be shared between different sessions in an 
application.</p></div></div>
 
 <div class="aui-message aui-message-warning macro-deprecated"><b 
class="param-deprecated">Deprecated since 5.2</b>
 



Reply via email to