Modified: websites/production/tapestry/content/key-features-v2.html
==============================================================================
--- websites/production/tapestry/content/key-features-v2.html (original)
+++ websites/production/tapestry/content/key-features-v2.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -142,19 +142,19 @@
             
             <!-- /// Content Start -->
             <div id="content">
-                            <div id="ConfluenceContent"><div class="row" 
id="features"><div class="col-sm-4"><h3 id="KeyFeatures-v2-JavaPower">Java 
Power</h3><div class="feature relief"><p>Tapestry pages and components are 
simple Java POJOs, with easy access to all Java language features and the vast 
Java ecosystem. Thanks to Java's advanced concurrency API, Tapestry handles 
requests <em>fast</em> without sacrificing security or stability.</p></div>
+                            <div id="ConfluenceContent"><div class="row" 
id="features"><div class="col-sm-4"><h3 id="KeyFeaturesv2-JavaPower">Java 
Power</h3><div class="feature relief"><p>Tapestry pages and components are 
simple Java POJOs, with easy access to all Java language features and the vast 
Java ecosystem. Thanks to Java's advanced concurrency API, Tapestry handles 
requests <em>fast</em> without sacrificing security or stability.</p></div>
 
 
 </div>
 
 
-<div class="col-sm-4"><h3 id="KeyFeatures-v2-ScriptingEase">Scripting 
Ease</h3><div class="feature relief"><p>Tapestry features <em>live class 
reloading</em>: change your Java code, refresh the browser and see the 
changes... instantly! Have your cake and eat it too: the speed and depth of 
Java, the agile development style of Ruby or Python.</p></div>
+<div class="col-sm-4"><h3 id="KeyFeaturesv2-ScriptingEase">Scripting 
Ease</h3><div class="feature relief"><p>Tapestry features <em>live class 
reloading</em>: change your Java code, refresh the browser and see the 
changes... instantly! Have your cake and eat it too: the speed and depth of 
Java, the agile development style of Ruby or Python.</p></div>
 
 
 </div>
 
 
-<div class="col-sm-4"><h3 id="KeyFeatures-v2-SuperProductivity">Super 
Productivity</h3><div class="feature relief"><p>&#160;Simple POJO classes, 
streamlined templates, live class reloading, state-of-the-art exception 
reporting, first-class Ajax support, and a big library of built-in components: 
Tapestry is designed from the ground up to give you great 
productivity.</p></div>
+<div class="col-sm-4"><h3 id="KeyFeaturesv2-SuperProductivity">Super 
Productivity</h3><div class="feature relief"><p>&#160;Simple POJO classes, 
streamlined templates, live class reloading, state-of-the-art exception 
reporting, first-class Ajax support, and a big library of built-in components: 
Tapestry is designed from the ground up to give you great 
productivity.</p></div>
 
 
 </div>

Modified: websites/production/tapestry/content/key-features.html
==============================================================================
--- websites/production/tapestry/content/key-features.html (original)
+++ websites/production/tapestry/content/key-features.html Sat Nov 26 13:17:27 
2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/layout-component.html
==============================================================================
--- websites/production/tapestry/content/layout-component.html (original)
+++ websites/production/tapestry/content/layout-component.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -169,7 +169,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>
@@ -178,7 +178,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="templating-and-markup-faq.html">Templating 
and Markup FAQ</a>
+                        <a href="component-classes.html">Component Classes</a>
                 
                         
                     </div>
@@ -187,7 +187,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="templating-and-markup-faq.html">Templating 
and Markup FAQ</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/legacy-javascript.html
==============================================================================
--- websites/production/tapestry/content/legacy-javascript.html (original)
+++ websites/production/tapestry/content/legacy-javascript.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -178,7 +178,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="javascript-modules.html">JavaScript 
Modules</a>
+                        <a href="typescript.html">TypeScript</a>
                 
                         
                     </div>
@@ -187,7 +187,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="typescript.html">TypeScript</a>
+                        <a href="javascript-modules.html">JavaScript 
Modules</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/limitations.html
==============================================================================
--- websites/production/tapestry/content/limitations.html (original)
+++ websites/production/tapestry/content/limitations.html Sat Nov 26 13:17:27 
2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -143,11 +143,11 @@
             <!-- /// Content Start -->
             <div id="content">
                             <div id="ConfluenceContent"><h1 
id="Limitations-Limitations">Limitations</h1><h2 
id="Limitations-Contents">Contents</h2><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1608762025197 {padding: 0px;}
-div.rbtoc1608762025197 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1608762025197 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1669468450079 {padding: 0px;}
+div.rbtoc1669468450079 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1669468450079 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1608762025197">
+/*]]>*/</style></p><div class="toc-macro rbtoc1669468450079">
 <ul class="toc-indentation"><li><a 
href="#Limitations-HowdoIaddnewcomponentstoanexistingpagedynamically?">How do I 
add new components to an existing page dynamically?</a></li><li><a 
href="#Limitations-Whydoesn'tmyserviceimplementationreloadwhenIchangeit?">Why 
doesn't my service implementation reload when I change it?</a></li><li><a 
href="#Limitations-HowdoIrunmultipleTapestryapplicationsinthesamewebapplication?">How
 do I run multiple Tapestry applications in the same web 
application?</a></li></ul>
 </div><h2 
id="Limitations-HowdoIaddnewcomponentstoanexistingpagedynamically?">How do I 
add new components to an existing page dynamically?</h2><p>The short answer 
here is: <strong>you don't</strong>. The long answer here is <strong>you don't 
have to, to get the behavior you desire</strong>.</p><p>One of Tapestry basic 
values is high scalability: this is expressed in a number of ways, reflecting 
scalability concerns within a single server, and within a cluster of 
servers.</p><p>Although you code Tapestry pages and components as if they were 
ordinary POJOs (<span>Plain Old Java Objects -- Tapestry does not require you 
to extend any base classes or implement any special interfaces)</span><span>, 
as deployed by Tapestry they are closer to a traditional servlet: a single 
instance of each page services requests from multiple threads. Behind the 
scenes, Tapestry transforms you code, rewriting it on the 
fly.</span></p><p>What this means is that <em>any</em> incoming request must be 
handled 
 by a <em>single page instance</em>. Therefore, Tapestry enforces the concept 
of <strong>static structure, dynamic behavior</strong>.</p><p>Tapestry provides 
quite a number of ways to vary what content is rendered, well beyond simple 
conditionals and loops. It is possible to "drag in" components from other pages 
when rendering a page (other FAQs will expand on this concept). The point is, 
that although a Tapestry page's structure is very rigid, the order in which the 
components of the page render does not have to be top to bottom.</p><h2 
id="Limitations-Whydoesn'tmyserviceimplementationreloadwhenIchangeit?">Why 
doesn't my service implementation reload when I change it?</h2><p>Main article: 
<a href="service-implementation-reloading.html">Service Implementation 
Reloading</a></p><p>Live service reloading has some limitations:</p><ul><li>The 
service must define a service interface.</li><li>The service implementation 
must be on the file system (not inside a JAR).</li><li>The implementatio
 n must be instantiated by Tapestry, not inside code (even code inside a module 
class).</li><li>The service must use the default <a 
href="limitations.html">scope</a> (reloading of perthread scopes is not 
supported).</li></ul><p>Consider the following example module:</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeContent 
panelContent pdl">
 <pre><code class="language-java">public static void bind(ServiceBinder binder)

Modified: websites/production/tapestry/content/link-components-faq.html
==============================================================================
--- websites/production/tapestry/content/link-components-faq.html (original)
+++ websites/production/tapestry/content/link-components-faq.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -143,11 +143,11 @@
             <!-- /// Content Start -->
             <div id="content">
                             <div id="ConfluenceContent"><h1 
id="LinkComponentsFAQ-LinkComponents">Link Components</h1><p>Main Articles: <a 
href="page-navigation.html">Page Navigation</a>, <a 
href="component-parameters.html">Component Parameters</a></p><h2 
id="LinkComponentsFAQ-Contents">Contents</h2><p><style 
type="text/css">/*<![CDATA[*/
-div.rbtoc1591557958169 {padding: 0px;}
-div.rbtoc1591557958169 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1591557958169 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1669468415834 {padding: 0px;}
+div.rbtoc1669468415834 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1669468415834 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1591557958169">
+/*]]>*/</style></p><div class="toc-macro rbtoc1669468415834">
 <ul class="toc-indentation"><li><a 
href="#LinkComponentsFAQ-HowdoIaddqueryparameterstoaPageLinkorActionLink?">How 
do I add query parameters to a PageLink or ActionLink?</a></li><li><a 
href="#LinkComponentsFAQ-HowdoIcreateaLinkbacktothecurrentpagefromacomponent?">How
 do I create a Link back to the current page from a component?</a></li></ul>
 </div><h2 
id="LinkComponentsFAQ-HowdoIaddqueryparameterstoaPageLinkorActionLink?">How do 
I add query parameters to a PageLink or ActionLink?</h2><p>These components do 
not have parameters to allow you to specify query parameters for the link; they 
both allow you to specify a <em>context</em> (one or more values to encode into 
the request path).</p><p>However, you can accomplish the same thing with a 
little code and markup. For example, to create a link to another page and pass 
a query parameter, you can replace your PageLink component with a standard 
<code>&lt;a&gt;</code> tag:</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
 <pre><code class="language-xml">&lt;a href="${profilePageLink}"&gt;Display 
Profile (w/ full details)&lt;/a&gt;

Modified: 
websites/production/tapestry/content/loading-the-project-into-eclipse.html
==============================================================================
--- websites/production/tapestry/content/loading-the-project-into-eclipse.html 
(original)
+++ websites/production/tapestry/content/loading-the-project-into-eclipse.html 
Sat Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/localization.html
==============================================================================
--- websites/production/tapestry/content/localization.html (original)
+++ websites/production/tapestry/content/localization.html Sat Nov 26 13:17:27 
2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -160,7 +160,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="localization.html">Localization</a>
                 
                         
                     </div>
@@ -169,7 +169,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="templating-and-markup-faq.html">Templating 
and Markup FAQ</a>
+                        <a href="component-classes.html">Component Classes</a>
                 
                         
                     </div>
@@ -178,7 +178,7 @@
                 <span class="icon aui-icon content-type-page" 
title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a href="localization.html">Localization</a>
+                        <a href="templating-and-markup-faq.html">Templating 
and Markup FAQ</a>
                 
                         
                     </div>

Modified: websites/production/tapestry/content/logging-in-tapestry.html
==============================================================================
--- websites/production/tapestry/content/logging-in-tapestry.html (original)
+++ websites/production/tapestry/content/logging-in-tapestry.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/logging.html
==============================================================================
--- websites/production/tapestry/content/logging.html (original)
+++ websites/production/tapestry/content/logging.html Sat Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/mailing-lists.html
==============================================================================
--- websites/production/tapestry/content/mailing-lists.html (original)
+++ websites/production/tapestry/content/mailing-lists.html Sat Nov 26 13:17:27 
2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/maven-support-faq.html
==============================================================================
--- websites/production/tapestry/content/maven-support-faq.html (original)
+++ websites/production/tapestry/content/maven-support-faq.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -143,11 +143,11 @@
             <!-- /// Content Start -->
             <div id="content">
                             <div id="ConfluenceContent"><h1 
id="MavenSupportFAQ-MavenSupport">Maven Support</h1><h2 
id="MavenSupportFAQ-Contents">Contents</h2><p><style 
type="text/css">/*<![CDATA[*/
-div.rbtoc1591557975387 {padding: 0px;}
-div.rbtoc1591557975387 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1591557975387 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1669468549563 {padding: 0px;}
+div.rbtoc1669468549563 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1669468549563 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1591557975387">
+/*]]>*/</style></p><div class="toc-macro rbtoc1669468549563">
 <ul class="toc-indentation"><li><a 
href="#MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why
 do Maven project names and other details show up in my pages?</a></li></ul>
 </div><h2 
id="MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why 
do Maven project names and other details show up in my pages?</h2><p>Tapestry 
and maven both use the same syntax for dynamic portions of files: the 
<code>${...</code>} syntax. When Maven is copying resources from 
<code>src/main/resources</code>, and when filtering is <em>enabled</em> (which 
is not the default), then any expansions in <em>Tapestry templates</em> that 
match against Maven project properties are substituted. If you look at the 
deployed application you'll see that <code>${name</code>} is gone, replaced 
with your project's name!</p><p>The solution is to update your 
<code>pom.xml</code> and ignore any .tml files when copying and 
filtering:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>pom.xml 
(partial)</b></div><div class="codeContent panelContent pdl">
 <pre><code class="language-xml">  &lt;resource&gt;

Modified: websites/production/tapestry/content/menuleft.html
==============================================================================
--- websites/production/tapestry/content/menuleft.html (original)
+++ websites/production/tapestry/content/menuleft.html Sat Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -59,7 +59,70 @@
 </head>
 <body>
   <!-- /// Navigation Start -->
-    <div id="navigation"><p><img class="wysiwyg-unknown-macro" 
src="https://cwiki.apache.org/confluence/plugins/servlet/confluence/placeholder/unknown-macro?name=html&amp;locale=en_GB&amp;version=2";></p></div>
+    <div id="navigation"><p><header>
+  <div class="container-fluid">
+    <div class="row">
+      <div class="col-12">
+        <nav class="navbar navbar-expand-xl navbar-light 
justify-content-between">
+          <a class="navbar-brand" href="/index.html">
+            <img src="/images/apache-tapestry-icon-dark.svg" width="60" 
alt="Apache Tapestry" title="Apache Tapestry">
+            <span>apache tapestry</span>
+          </a>
+          <button type="button" class="navbar-toggler" data-toggle="collapse" 
data-target="#navbarCollapse" aria-controls="navbarCollapse" 
aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+          </button>
+          <div class="collapse navbar-collapse" id="navbarCollapse">
+            <ul class="navbar-nav mx-auto"><li class="nav-item">
+                <a class="nav-link active" 
href="/getting-started.html">Getting Started</a>
+              </li><li class="nav-item">
+                <a class="nav-link active" 
href="/documentation.html">Documentation</a>
+              </li><li class="nav-item">
+                <a class="nav-link active" href="/download.html">Download</a>
+              </li><li class="nav-item dropdown">
+                <a class="nav-link dropdown-toggle active" 
id="communityNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
+                  Community
+                </a>
+                <div class="dropdown-menu" 
aria-labelledby="communityNavbarDropdown">
+                  <a class="dropdown-item" href="/community.html">Mailing 
Lists</a>
+                  <a class="dropdown-item" 
href="https://stackoverflow.com/questions/tagged/tapestry";>StackOverflow</a>
+                  <a class="dropdown-item" href="/support.html">Support</a>
+                  <a class="dropdown-item" href="/community.html">Getting 
Involved</a>
+                  <a class="dropdown-item" 
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=24191922";
 title="Edit this page (requires approval, just ask on the mailing list)">Edit 
this page</a>
+                  <div class="dropdown-divider"></div>
+                  <a class="dropdown-item" 
href="https://twitter.com/ApacheTapestry";>@ApacheTapestry</a>
+                  <a class="dropdown-item" 
href="https://twitter.com/hashtag/tapestry5";>#tapestry5</a>
+                </div>
+              </li><li class="nav-item dropdown">
+                <a class="nav-link dropdown-toggle active" 
id="developmentNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
+                  Development
+                </a>
+                <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>
+              </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
+                </a>
+                <div class="dropdown-menu" 
aria-labelledby="apacheNavbarDropdown">
+                  <a class="dropdown-item" 
href="https://www.apache.org/";>About Apache</a>
+                  <a class="dropdown-item" 
href="https://apachecon.com/?ref=royale.apache.org";>Events</a>
+                  <a class="dropdown-item" 
href="https://www.apache.org/foundation/sponsorship.html";>Sponsorship</a>
+                  <a class="dropdown-item" 
href="https://www.apache.org/licenses/LICENSE-2.0";>License</a>
+                  <a class="dropdown-item" 
href="https://www.apache.org/security/";>Security</a>
+                  <a class="dropdown-item" 
href="https://www.apache.org/foundation/thanks.html";>Thanks!</a>
+                </div>
+              </li></ul>
+            <form enctype="application/x-www-form-urlencoded" method="get" 
class="form-inline" action="search.html">
+              <input type="search" class="form-control search-input" name="q" 
placeholder="Search docs, issues, wikis and blogs" aria-label="Search">
+              <button type="submit" class="d-none">Search</button>
+            </form>
+          </div>
+        </nav>
+      </div>
+    </div>
+  </div>
+</header></p></div>
   <!-- /// Navigation End -->
 
   <article>
@@ -74,7 +137,7 @@
               <!-- /// Breadcrumb End -->
 
               <!-- /// Smallbanner Start -->
-                            <div id="smallbanner"><img 
class="wysiwyg-unknown-macro" 
src="https://cwiki.apache.org/confluence/plugins/servlet/confluence/placeholder/unknown-macro?name=html&amp;locale=en_GB&amp;version=2";></div>
+                            <div id="smallbanner"><h1 class="title" 
id="title">menuleft</h1></div>
               <!-- /// Smallbanner Start -->
             
             <!-- /// Content Start -->
@@ -96,7 +159,48 @@
   </article>
 
   <!-- /// Footer Start -->
-    <div id="footer"><p>Apache Tapestry, Tapestry, Apache, the Apache feather 
logo, and the Apache Tapestry project logo are trademarks of The Apache 
Software Foundation.</p><p><br clear="none"><img class="wysiwyg-unknown-macro" 
src="https://cwiki.apache.org/confluence/plugins/servlet/confluence/placeholder/unknown-macro?name=html&amp;locale=en_GB&amp;version=2";><br
 clear="none"></p><p><br clear="none"></p></div>
+    <div id="footer"><p>Apache Tapestry, Tapestry, Apache, the Apache feather 
logo, and the Apache Tapestry project logo are trademarks of The Apache 
Software Foundation.</p><p><br clear="none"><footer class="py-3">
+  <div class="container-fluid">
+    <div class="container">
+      <div class="row">
+        <div class="col-4 col-lg-2">
+          <span class="font-weight-bold">Apache Tapestry</span>
+          <ul><li><a href="index.html">Home</a></li><li><a 
href="download.html">Download</a></li><li><a 
href="about.html">Team</a></li><li><a 
href="https://www.apache.org/licenses/LICENSE-2.0";>License</a></li></ul>
+          <span class="font-weight-bold">Documentation</span>
+          <ul><li><a href="introduction.html">Introduction</a></li><li><a 
href="principles.html">Principles</a></li><li><i class="fas fa-play"></i> <a 
href="getting-started.html">Getting Started</a></li><li><i class="fas 
fa-play"></i> <a href="user-guide.html">User Guide</a></li><li><i class="fas 
fa-book"></i> <a href="documentation.html">Docs</a></li><li><i class="fas 
fa-book"></i> <a href="component-reference.html">Component 
Reference</a></li><li><i class="fas fa-book"></i> <a 
href="current/apidocs">Apidocs</a></li><li><a 
href="frequently-asked-questions.html">FAQ</a></li></ul>
+        </div>
+        <div class="col-4 col-lg-2">
+          <span class="font-weight-bold">Community</span>
+          <ul><li><i class="fas fa-envelope-open-text"></i> <a 
href="community.html">Mailing Lists</a></li><li><i class="fab 
fa-stack-overflow"> </i> <a 
href="https://stackoverflow.com/questions/tagged/tapestry";>StackOverflow</a></li><li><a
 href="support.html">Support</a></li><li><a href="community.html">Getting 
Involved</a></li><li><a 
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=24191922";
 title="Edit this page (requires approval, just ask on the mailing list)">Edit 
this page</a></li></ul>
+          <span class="font-weight-bold">Social</span>
+          <ul><li><i class="fab fa-twitter"></i> <a 
href="https://twitter.com/ApacheTapestry";>@ApacheTapestry</a></li><li><i 
class="fas fa-hashtag"></i> <a 
href="https://twitter.com/hashtag/tapestry5";>#tapestry5</a></li></ul>
+          <span class="font-weight-bold">Development</span>
+          <ul><li><i class="fab fa-git"></i> <a 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source 
Code</a></li><li><i class="fab fa-jira"></i> <a 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a></li></ul>
+        </div>
+        <div class="col-4 col-lg-2">
+          <span class="font-weight-bold">Apache</span>
+          <ul><li><a href="https://www.apache.org/";>About 
Apache</a></li><li><a 
href="https://apachecon.com/?ref=royale.apache.org";>Events</a></li><li><a 
href="https://www.apache.org/foundation/sponsorship.html";>Sponsorship</a></li><li><a
 href="https://www.apache.org/licenses/LICENSE-2.0";>License</a></li><li><a 
href="https://www.apache.org/security/";>Security</a></li><li><a 
href="https://www.apache.org/foundation/thanks.html";>Thanks!</a></li></ul>
+        </div>
+        <div class="col-md-12 col-lg-6 clearfix">
+          <span class="font-weight-bold d-block">About us</span>
+          <p class="float-right ml-3 mb-0"><img 
src="images/apache-tapestry-icon-light.svg" width="100" alt="Apache Tapestry" 
title="Apache Tapestry"></p>
+          <p><a href="https://tapestry.apache.org/";>Apache Tapestry&#8482;</a> 
is an open-source component-oriented framework for creating dynamic, robust, 
highly scalable web applications in Java.</p>
+          <p>Tapestry complements and builds upon the standard Java Servlet 
API, and so it works in any servlet container or application server.</p>
+          <p class="float-right ml-3 mb-0"><img 
src="images/apache-powered-by.svg" width="100" alt="Apache PoweredBy" 
title="Apache PoweredBy"></p>
+          <p>
+            <a href="https://tapestry.apache.org/";>Apache Tapestry&#8482;</a>, 
<a href="https://www.apache.org/";>Apache&#8482;</a> and the <a 
href="https://www.apache.org/foundation/press/kit/";>Apache feather 
logo&#8482;</a>
+            are trademarks of The Apache Software Foundation. All other marks 
mentioned may be trademarks or registered trademarks of their respective owners.
+          </p>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col-12">
+          Copyright &#169; 2020 The Apache Software Foundation, Licensed under 
the <a href="https://www.apache.org/licenses/LICENSE-2.0";>Apache License, 
Version 2.0</a>.
+        </div>
+      </div>
+    </div>
+  </div>
+</footer><br clear="none"></p><p><br clear="none"></p></div>
   <!-- /// Footer End -->
 </body>
 </html>

Modified: 
websites/production/tapestry/content/meta-programming-page-content.html
==============================================================================
--- websites/production/tapestry/content/meta-programming-page-content.html 
(original)
+++ websites/production/tapestry/content/meta-programming-page-content.html Sat 
Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/modules.html
==============================================================================
--- websites/production/tapestry/content/modules.html (original)
+++ websites/production/tapestry/content/modules.html Sat Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/navigation.html
==============================================================================
--- websites/production/tapestry/content/navigation.html (original)
+++ websites/production/tapestry/content/navigation.html Sat Nov 26 13:17:27 
2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/navigationv2.html
==============================================================================
--- websites/production/tapestry/content/navigationv2.html (original)
+++ websites/production/tapestry/content/navigationv2.html Sat Nov 26 13:17:27 
2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/news.html
==============================================================================
--- websites/production/tapestry/content/news.html (original)
+++ websites/production/tapestry/content/news.html Sat Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/object-providers.html
==============================================================================
--- websites/production/tapestry/content/object-providers.html (original)
+++ websites/production/tapestry/content/object-providers.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/operation-tracker.html
==============================================================================
--- websites/production/tapestry/content/operation-tracker.html (original)
+++ websites/production/tapestry/content/operation-tracker.html Sat Nov 26 
13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: websites/production/tapestry/content/ordering-by-constraints.html
==============================================================================
--- websites/production/tapestry/content/ordering-by-constraints.html (original)
+++ websites/production/tapestry/content/ordering-by-constraints.html Sat Nov 
26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 

Modified: 
websites/production/tapestry/content/overriding-exception-reporting.html
==============================================================================
--- websites/production/tapestry/content/overriding-exception-reporting.html 
(original)
+++ websites/production/tapestry/content/overriding-exception-reporting.html 
Sat Nov 26 13:17:27 2022
@@ -32,10 +32,10 @@
   <link rel="apple-touch-icon-precomposed" 
href="/images/apache-tapestry-icon-57.png">
   <link rel="shortcut icon" href="/images/apache-tapestry-icon-32.png">
 
-  <link rel="stylesheet" 
href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,400;0,700;1,400;1,700&display=swap";>
 
-  <link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"; 
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
 crossorigin="anonymous">
+  <link rel="stylesheet" href="/resources/bootstrap/bootstrap.min.css">
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css";>
   <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism.min.css";>
+  <link rel="stylesheet" href="/resources/fonts/fonts.css">
   <link rel="stylesheet" href="/styles/main.css">
 
   <script type="text/javascript">
@@ -46,7 +46,7 @@
 
   <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"; 
integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
 crossorigin="anonymous" defer></script>
   <script 
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"; 
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
 crossorigin="anonymous" defer></script>
-  <script 
src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"; 
integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
 crossorigin="anonymous" defer></script>
+  <script src="stylesheet" href="/resources/bootstrap/bootstrap.min.js">
   <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/prism.min.js"; 
defer></script>
        <script 
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js";
 defer></script>
 
@@ -210,7 +210,7 @@ public class ActionFail {
     }
 }
 </code></pre>
-</div></div><p>With production mode disabled, clicking the link displays the 
default exception report page:</p><p><span 
class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" width="500" 
src="overriding-exception-reporting.data/actionfail_-_top.png"></span></p><p><span
 class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" width="500" 
src="overriding-exception-reporting.data/Application_Exception.png"></span></p><p>The
 easy way to override the exception report is to provide an ExceptionReport 
page that overrides the one provided with the framework.</p><p>This is as easy 
as providing a page named "ExceptionReport". It must implement the <a 
class="external-link" 
href="http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/services/E
 xceptionReporter.html">ExceptionReporter</a> interface.</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>ExceptionReport.tml</b></div><div 
class="codeContent panelContent pdl">
+</div></div><p>With production mode disabled, clicking the link displays the 
default exception report page:</p><p><span 
class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" draggable="false" width="500" 
src="overriding-exception-reporting.data/actionfail_-_top.png"></span></p><p><span
 class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" draggable="false" width="500" 
src="overriding-exception-reporting.data/Application_Exception.png"></span></p><p>The
 easy way to override the exception report is to provide an ExceptionReport 
page that overrides the one provided with the framework.</p><p>This is as easy 
as providing a page named "ExceptionReport". It must implement the <a 
class="external-link" href="http://tapestry.apache.org/tapestry5/api
 
docs/org/apache/tapestry5/services/ExceptionReporter.html">ExceptionReporter</a>
 interface.</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 
1px;"><b>ExceptionReport.tml</b></div><div class="codeContent panelContent pdl">
 <pre><code class="language-xml">&lt;html t:type="layout" title="Exception"
       xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"&gt;
 
@@ -249,7 +249,7 @@ public class ExceptionReport implements
     }
 }
 </code></pre>
-</div></div><p>The end result is a customized exception report 
page.</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" width="500" 
src="overriding-exception-reporting.data/customer_exception_report_-_open_1.png"></span></p><h2
 
id="OverridingExceptionReporting-Version2:OverridingtheRequestExceptionHandler">Version
 2: Overriding the RequestExceptionHandler</h2><p>The previous example will 
display a link back to the Index page of the application. Another alternative 
is to display the error &lt;on&gt; the Index page. This requires a different 
approach: overriding the service responsible for reporting request 
exceptions.</p><p>The service <a class="external-link" 
href="http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/services/RequestExceptionHandler.html";>RequestExceptionHandler</a>
 is responsible for this.</p><p>By replacing the def
 ault implementation of this service with our own implementation, we can take 
control over exactly what happens when a request exception occurs.</p><p>We'll 
do this in two steps. First, we'll extend the Index page to serve as an 
ExceptionReporter. Second, we'll override the default RequestExceptionHandler 
to use the Index page instead of the ExceptionReport page. Of course, this is 
just one approach.</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 
1px;"><b>Index.tml (partial)</b></div><div class="codeContent panelContent pdl">
+</div></div><p>The end result is a customized exception report 
page.</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" draggable="false" width="500" 
src="overriding-exception-reporting.data/customer_exception_report_-_open_1.png"></span></p><h2
 
id="OverridingExceptionReporting-Version2:OverridingtheRequestExceptionHandler">Version
 2: Overriding the RequestExceptionHandler</h2><p>The previous example will 
display a link back to the Index page of the application. Another alternative 
is to display the error &lt;on&gt; the Index page. This requires a different 
approach: overriding the service responsible for reporting request 
exceptions.</p><p>The service <a class="external-link" 
href="http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/services/RequestExceptionHandler.html";>RequestExceptionHandler</a>
 is responsible for this.</p><p>By
  replacing the default implementation of this service with our own 
implementation, we can take control over exactly what happens when a request 
exception occurs.</p><p>We'll do this in two steps. First, we'll extend the 
Index page to serve as an ExceptionReporter. Second, we'll override the default 
RequestExceptionHandler to use the Index page instead of the ExceptionReport 
page. Of course, this is just one approach.</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Index.tml (partial)</b></div><div 
class="codeContent panelContent pdl">
 <pre><code class="language-xml"> &lt;t:if test="message"&gt;
     &lt;div class="panel panel-danger"&gt;
         &lt;div class="panel-heading"&gt;An exception has occurred.&lt;/div&gt;
@@ -305,7 +305,7 @@ public class ExceptionReport implements
         configuration.add(RequestExceptionHandler.class, handler);
     }
 </code></pre>
-</div></div><p>First we define the new service using a service builder method. 
This is an alternative to the <code>bind()</code> method; we define the 
service, its interface type (the return type of the method) and the service id 
(the part that follows "build" is the method name) and provide the 
implementation inline. A service builder method must return the service 
implementation, here implemented as an inner class.</p><p>The Logger resource 
that is passed into the builder method is the Logger appropriate for the 
service. ResponseRenderer and ComponentSource are two services defined by 
Tapestry.</p><p>With this in place, there are now two different services that 
implement the RequestExceptionHandler interface: the default one built into 
Tapestry (whose service id is "RequestExceptionHandler") and the new one 
defined in this module, "AppRequestExceptionHandler"). Without a little more 
work, Tapestry will be unable to determine which one to use when an exception 
does occur.</p><p>Tap
 estry has a pipeline for resolving injected dependencies; the ServiceOverride 
service is one part of that pipeline. Contributions to it are used to override 
an existing service, when the injection is exclusively by type.</p><p>Here we 
inject the AppRequestExceptionHandler service and contribute it as the override 
for type RequestExceptionHandler. The @Local annotation is used to select the 
RequestHandler service defined by this module, AppModule. Once contributed into 
ServiceOverride, it becomes the default service injected throughout the 
Registry.</p><p>This finally brings us to the point where we can see the 
result:</p><p><span class="confluence-embedded-file-wrapper 
image-center-wrapper confluence-embedded-manual-size"><img 
class="confluence-embedded-image confluence-content-image-border image-center" 
height="375" width="500" 
src="overriding-exception-reporting.data/index_as_excepton_report.png"></span></p><h2
 id="OverridingExceptionReporting-Version3:DecoratingtheRequestExceptio
 nHandler">Version 3: Decorating the RequestExceptionHandler</h2><p>A third 
option is available: we don't define a <em>new</em> service, but instead 
<em>decorate</em> the existing RequestExceptionHandler service. This approach 
means we don't have to make a contribution to the ServiceOverride 
service.</p><p>Service decoration is a powerful facility of Tapestry that is 
generally used to "wrap" an existing service with an interceptor that provides 
new functionality such as logging, security, transaction management or other 
cross-cutting concerns. The interceptor is an object that implements the same 
interface as the service being decorated, and usually delegates method 
invocations to it.</p><p>However, there's no requirement that an interceptor 
for a service actually invoke methods on the service; here we contribute a new 
implementation that <em>replaces</em> the original:</p><div class="code panel 
pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bot
 tom-width: 1px;"><b>AppModule.java (partial)</b></div><div class="codeContent 
panelContent pdl">
+</div></div><p>First we define the new service using a service builder method. 
This is an alternative to the <code>bind()</code> method; we define the 
service, its interface type (the return type of the method) and the service id 
(the part that follows "build" is the method name) and provide the 
implementation inline. A service builder method must return the service 
implementation, here implemented as an inner class.</p><p>The Logger resource 
that is passed into the builder method is the Logger appropriate for the 
service. ResponseRenderer and ComponentSource are two services defined by 
Tapestry.</p><p>With this in place, there are now two different services that 
implement the RequestExceptionHandler interface: the default one built into 
Tapestry (whose service id is "RequestExceptionHandler") and the new one 
defined in this module, "AppRequestExceptionHandler"). Without a little more 
work, Tapestry will be unable to determine which one to use when an exception 
does occur.</p><p>Tap
 estry has a pipeline for resolving injected dependencies; the ServiceOverride 
service is one part of that pipeline. Contributions to it are used to override 
an existing service, when the injection is exclusively by type.</p><p>Here we 
inject the AppRequestExceptionHandler service and contribute it as the override 
for type RequestExceptionHandler. The @Local annotation is used to select the 
RequestHandler service defined by this module, AppModule. Once contributed into 
ServiceOverride, it becomes the default service injected throughout the 
Registry.</p><p>This finally brings us to the point where we can see the 
result:</p><p><span class="confluence-embedded-file-wrapper 
image-center-wrapper confluence-embedded-manual-size"><img 
class="confluence-embedded-image confluence-content-image-border image-center" 
draggable="false" height="375" width="500" 
src="overriding-exception-reporting.data/index_as_excepton_report.png"></span></p><h2
 id="OverridingExceptionReporting-Version3:Decorating
 theRequestExceptionHandler">Version 3: Decorating the 
RequestExceptionHandler</h2><p>A third option is available: we don't define a 
<em>new</em> service, but instead <em>decorate</em> the existing 
RequestExceptionHandler service. This approach means we don't have to make a 
contribution to the ServiceOverride service.</p><p>Service decoration is a 
powerful facility of Tapestry that is generally used to "wrap" an existing 
service with an interceptor that provides new functionality such as logging, 
security, transaction management or other cross-cutting concerns. The 
interceptor is an object that implements the same interface as the service 
being decorated, and usually delegates method invocations to it.</p><p>However, 
there's no requirement that an interceptor for a service actually invoke 
methods on the service; here we contribute a new implementation that 
<em>replaces</em> the original:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
  style="border-bottom-width: 1px;"><b>AppModule.java (partial)</b></div><div 
class="codeContent panelContent pdl">
 <pre><code class="language-java">    public RequestExceptionHandler 
decorateRequestExceptionHandler(
             final Logger logger,
             final ResponseRenderer renderer,


Reply via email to