You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by bu...@apache.org on 2018/02/03 17:21:22 UTC

svn commit: r1024783 [8/8] - in /websites/production/tapestry/content: ./ cache/

Modified: websites/production/tapestry/content/tapestry-ioc-overview.html
==============================================================================
--- websites/production/tapestry/content/tapestry-ioc-overview.html (original)
+++ websites/production/tapestry/content/tapestry-ioc-overview.html Sat Feb  3 17:21:22 2018
@@ -44,13 +44,26 @@
 
   <div class="wrapper bs">
 
-        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  href="index.html">Home</a></li><li><a  href="getting-started.html">Getting Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  href="download.html">Download</a></li><li><a  href="about.html">About</a></li><li><a  class="external-link" href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a  href="community.html">Community</a></li><li><a  class="external-link" href="http://www.apache.org/security/">Security</a></li><li><a  class="external-link" href="http://www.apache.org/">Apache</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div></div>
+        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  href="index.html">Home</a></li><li><a  href="getting-started.html">Getting Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  href="download.html">Download</a></li><li><a  href="about.html">About</a></li><li><a  class="external-link" href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a  href="community.html">Community</a></li><li><a  class="external-link" href="http://www.apache.org/security/">Security</a></li><li><a  class="external-link" href="http://www.apache.org/">Apache</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div>
+
+</div>
 
           <div id="top">
-            <div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span><form enctype="application/x-www-form-urlencoded" method="get" action="http://tapestry.apache.org/search.html"> 
- <input type="text" name="q"> 
- <input type="submit" value="Search"> 
-</form></div><div class="emblem" style="float:left"><p><a  href="index.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://tapestry.apache.org/images/tapestry_small.png" data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></span></a></p></div><div class="title" style="float:left; margin: 0 0 0 3em"><h1 id="SmallBanner-PageTitle">Tapestry IoC Overview</h1></div></div>
+            <div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get" action="http://tapestry.apache.org/search.html">
+  <input type="text" name="q">
+  <input type="submit" value="Search">
+</form>
+
+</div>
+
+
+<div class="emblem" style="float:left"><p><a  href="index.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://tapestry.apache.org/images/tapestry_small.png" data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></span></a></p></div>
+
+
+<div class="title" style="float:left; margin: 0 0 0 3em"><h1 id="SmallBanner-PageTitle">Tapestry IoC Overview</h1></div>
+
+</div>
       <div class="clearer"></div>
       </div>
 
@@ -62,25 +75,49 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p>Even today, with the overwhelming success of <a  class="external-link" href="http://www.springframework.org" rel="nofollow">Spring</a> and the rise of smaller, simpler approaches to building applications (in contrast to the heavyweight EJB 2.0 approach), many people still have trouble wrapping their heads around Inversion of Control.</p><p>Really understanding IoC is a new step for many developers. If you can remember back to when you made the transition from procedural programming (in C, or BASIC) to object oriented programming, you might remember the point where you "got it". The point where it made sense to have methods on objects, and data inside objects.</p><p>Inversion of Control builds upon those ideas. The goal is to make code more robust (that is, with fewer errors), more reusable and much easier to test.</p><p>Prior to IoC approaches, most developers were used to a more <em>monolithic</em> design, with a few core objects and a
  <code>main()</code> method somewhere that starts the ball rolling. <code>main()</code> instantiates the first couple of classes, and those classes end up instantiating and using all the other classes in the system.</p><p>That's an <em>unmanaged</em> system. Most desktop applications are unmanaged, so it's a very familiar pattern, and easy to get your head around.</p><p>By contrast, web applications are a <em>managed</em> environment. You don't write a main(), you don't control startup. You <em>configure</em> the Servlet API to tell it about your servlet classes to be instantiated, and their life cycle is totally controlled by the servlet container.</p><p>Inversion of Control is just a more general application of this approach. The container is ultimately responsible for instantiating and configuring the objects you tell it about, and running their entire life cycle of those objects.</p><p>Web applications are more complicated to write than monolithic applications, largely because o
 f <em>multithreading</em>. Your code will be servicing many different users simultaneously across many different threads. This tends to complicate the code you write, since some fundamental aspects of object oriented development get called into question: in particular, the use of <em>internal state</em> (values stored inside instance variables), since in a multithreaded environment, that's no longer the safe place it is in traditional development. Shared objects plus internal state plus multiple threads equals an broken, unpredictable application.</p><p>Frameworks such as Tapestry &#8211; both the IoC container, and the web framework itself &#8211; exist to help.</p><p>When thinking in terms of IoC, <strong>small is beautiful</strong>. What does that mean? It means small classes and small methods are easier to code than large ones. At one extreme, we have servlets circa 1997 (and Visual Basic before that) with methods a thousand lines long, and no distinction between business logic 
 and view logic. Everything mixed together into an untestable jumble.</p><p>At the other extreme is IoC: small objects, each with a specific purpose, collaborating with other small objects.</p><p>Using unit tests, in collaboration with tools such as <a  class="external-link" href="http://easymock.org/" rel="nofollow">EasyMock</a>, you can have a code base that is easy to maintain, easy to extend, and easy to test. And by factoring out a lot of <em>plumbing</em> code, your code base will not only be easier to work with, it will be smaller.</p><h2 id="TapestryIoCOverview-LivingontheFrontier">Living on the Frontier</h2><p>Coding applications the traditional way is like being a homesteader on the American frontier in the 1800's. You're responsible for every aspect of your house: every board, every nail, every stick of furniture is something you personally created. There <em>is</em> a great comfort in total self reliance. Even if your house is small, the windows are a bit drafty or the fl
 oorboards creak a little, you know exactly <em>why</em> things are not-quite perfect.</p><p>Flash forward to modern cities or modern suburbia and it's a whole different story. Houses are built to specification from design plans, made from common materials, by many specializing tradespeople. Construction codes dictate how plumbing, wiring and framing should be performed. A home-owner may not even know how to drive a nail, but can still take comfort in draft-free windows, solid floors and working plumbing.</p><p>To extend the metaphor, a house in a town is not alone and self-reliant the way a frontier house is. The town house is situated on a street, in a neighborhood, within a town. The town provides services (utilities, police, fire control, streets and sewers) to houses in a uniform way. Each house just needs to connect up to those services.</p><h2 id="TapestryIoCOverview-TheWorldoftheContainer">The World of the Container</h2><p>So the IoC container is the "town" and in the world o
 f the IoC container, everything has a name, a place, and a relationship to everything else in the container. Tapestry calls this world "The Registry".</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tapestry-ioc-overview.data/ioc-overview.png"></span></p><p>Here we're seeing a few services from the built-in Tapestry IoC module, and a few of the services from the Tapestry web framework module. In fact, there are over 100 services, all interrelated, in the Registry ... and that's before you add your own to the mix. The IoC Registry treats all the services uniformly, regardless of whether they are part of Tapestry, or part of your application, or part of an add-on library.</p><p>Tapestry IoC's job is to make all of these services available to each other, and to the outside world. The outside world could be a standalone application, or it could be an application built on top of the Tapestry web framework.</p><h2 id="TapestryIoCOverview-Se
 rviceLifeCycle">Service Life Cycle</h2><p>Tapestry services are <em>lazy</em>, which means they are not fully instantiated until they are absolutely needed. Often, what looks like a service is really a proxy object ... the first time any method of the proxy is invoked, the actual service is instantiated and initialized (Tapestry uses the term <em>realized</em> for this process). Of course, this is all absolutely thread-safe.</p><p>Initially a service is <em>defined</em>, meaning some module has defined the service. Later, the service will be <em>virtual</em>, meaning a proxy has been created. This occurs most often because some other service <em>depends</em> on it, but hasn't gotten around to invoking methods on it. Finally, a service that is ready to use is <em>realized</em>. What's nice is that your code neither knows nor cares about the life cycle of the service, because of the magic of the proxy.</p><p>In fact, when a Tapestry web application starts up, before it services its fi
 rst request, only about 20% of the services have been realized; the remainder are defined or virtual.</p><h2 id="TapestryIoCOverview-Classvs.Service">Class vs. Service</h2><p>A Tapestry service is more than just a class. First of all, it is a combination of an <em>interface</em> that defines the operations of the service, and an <em>implementation class</em> that implements the interface.</p><p>Why this extra division? Having a service interface is what lets Tapestry create proxies and perform other operations. It's also a very good practice to code to an interface, rather than a specific implementation. You'll often be surprised at the kinds of things you can accomplish by substituting one implementation for another.</p><p>Tapestry is also very aware that a service will have dependencies on other services. It may also have other needs ... for example, in Tapestry IoC, the container provides services with access to Loggers.</p><p>Tapestry IoC also has support for other configuration
  that may be provided to services when they are realized.</p><h2 id="TapestryIoCOverview-DependencyInjection">Dependency Injection</h2><p>Main Article: <a  href="injection.html">Injection</a></p><div class="aui-label" style="float:right" title="Related Articles"><h3>Related Articles</h3><ul class="content-by-label"><li> 
-  <div> 
-   <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span> 
-  </div> 
-  <div class="details"> 
-   <a  href="injection-in-detail.html">Injection in Detail</a> 
-  </div> </li><li> 
-  <div> 
-   <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span> 
-  </div> 
-  <div class="details"> 
-   <a  href="injection-faq.html">Injection FAQ</a> 
-  </div> </li><li> 
-  <div> 
-   <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span> 
-  </div> 
-  <div class="details"> 
-   <a  href="injection.html">Injection</a> 
-  </div> </li></ul></div><p>Inversion of Control refers to the fact that the container, here Tapestry IoC's Registry, instantiates your classes. It decides on when the classes get instantiated.</p><p>Dependency Injection is a key part of <em>realization</em>: this is how a service is provided with the other services it needs to operate. For example, a Data Access Object service may be injected with a ConnectionPool service.</p><p>In Tapestry, injection occurs through constructors, through parameters to service builder methods, or through direct injection into fields. Tapestry prefers constructor injection, as this emphasizes that dependencies should be stored in <strong>final</strong> variables. This is the best approach towards ensuring thread safety.</p><p>In any case, injection "just happens". Tapestry finds the constructor of your class and analyzes the parameters to determine what to pass in. In some cases, it uses just the parameter type to find a match, in other cases, annota
 tions on the parameters may also be used. It also scans through the fields of your service implementation class to identify which should have injected values written into them.</p><h2 id="TapestryIoCOverview-Whycan'tIjustusenew?">Why can't I just use <code>new</code>?</h2><p>That's a common question. All these concepts seem alien at first. What's wrong with <code>new</code>?</p><p>The problem with new is that it rigidly connects one implementation to another implementation. Let's follow a progression that reflects how a lot of projects get written. It will show that in the real world, <code>new</code> is not as simple as it first seems.</p><p>This example is built around some real-world work that involves a Java Messaging Service queue, part of an application performance monitoring subsystem for a large application. Code inside each server collects performance data of various types and sends it, via a shared JMS queue, to a central server for collection and reporting.</p><p>This cod
 e is for a metric that periodically counts the number of rows in a key database table. Other implementations of MetricProducer will be responsible for measuring CPU utilization, available disk space, number of requests per second, and so forth.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+                <div id="ConfluenceContent"><p>Even today, with the overwhelming success of <a  class="external-link" href="http://www.springframework.org" rel="nofollow">Spring</a> and the rise of smaller, simpler approaches to building applications (in contrast to the heavyweight EJB 2.0 approach), many people still have trouble wrapping their heads around Inversion of Control.</p><p>Really understanding IoC is a new step for many developers. If you can remember back to when you made the transition from procedural programming (in C, or BASIC) to object oriented programming, you might remember the point where you "got it". The point where it made sense to have methods on objects, and data inside objects.</p><p>Inversion of Control builds upon those ideas. The goal is to make code more robust (that is, with fewer errors), more reusable and much easier to test.</p><p>Prior to IoC approaches, most developers were used to a more <em>monolithic</em> design, with a few core objects and a
  <code>main()</code> method somewhere that starts the ball rolling. <code>main()</code> instantiates the first couple of classes, and those classes end up instantiating and using all the other classes in the system.</p><p>That's an <em>unmanaged</em> system. Most desktop applications are unmanaged, so it's a very familiar pattern, and easy to get your head around.</p><p>By contrast, web applications are a <em>managed</em> environment. You don't write a main(), you don't control startup. You <em>configure</em> the Servlet API to tell it about your servlet classes to be instantiated, and their life cycle is totally controlled by the servlet container.</p><p>Inversion of Control is just a more general application of this approach. The container is ultimately responsible for instantiating and configuring the objects you tell it about, and running their entire life cycle of those objects.</p><p>Web applications are more complicated to write than monolithic applications, largely because o
 f <em>multithreading</em>. Your code will be servicing many different users simultaneously across many different threads. This tends to complicate the code you write, since some fundamental aspects of object oriented development get called into question: in particular, the use of <em>internal state</em> (values stored inside instance variables), since in a multithreaded environment, that's no longer the safe place it is in traditional development. Shared objects plus internal state plus multiple threads equals an broken, unpredictable application.</p><p>Frameworks such as Tapestry &#8211; both the IoC container, and the web framework itself &#8211; exist to help.</p><p>When thinking in terms of IoC, <strong>small is beautiful</strong>. What does that mean? It means small classes and small methods are easier to code than large ones. At one extreme, we have servlets circa 1997 (and Visual Basic before that) with methods a thousand lines long, and no distinction between business logic 
 and view logic. Everything mixed together into an untestable jumble.</p><p>At the other extreme is IoC: small objects, each with a specific purpose, collaborating with other small objects.</p><p>Using unit tests, in collaboration with tools such as <a  class="external-link" href="http://easymock.org/" rel="nofollow">EasyMock</a>, you can have a code base that is easy to maintain, easy to extend, and easy to test. And by factoring out a lot of <em>plumbing</em> code, your code base will not only be easier to work with, it will be smaller.</p><h2 id="TapestryIoCOverview-LivingontheFrontier">Living on the Frontier</h2><p>Coding applications the traditional way is like being a homesteader on the American frontier in the 1800's. You're responsible for every aspect of your house: every board, every nail, every stick of furniture is something you personally created. There <em>is</em> a great comfort in total self reliance. Even if your house is small, the windows are a bit drafty or the fl
 oorboards creak a little, you know exactly <em>why</em> things are not-quite perfect.</p><p>Flash forward to modern cities or modern suburbia and it's a whole different story. Houses are built to specification from design plans, made from common materials, by many specializing tradespeople. Construction codes dictate how plumbing, wiring and framing should be performed. A home-owner may not even know how to drive a nail, but can still take comfort in draft-free windows, solid floors and working plumbing.</p><p>To extend the metaphor, a house in a town is not alone and self-reliant the way a frontier house is. The town house is situated on a street, in a neighborhood, within a town. The town provides services (utilities, police, fire control, streets and sewers) to houses in a uniform way. Each house just needs to connect up to those services.</p><h2 id="TapestryIoCOverview-TheWorldoftheContainer">The World of the Container</h2><p>So the IoC container is the "town" and in the world o
 f the IoC container, everything has a name, a place, and a relationship to everything else in the container. Tapestry calls this world "The Registry".</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="https://cwiki-test.apache.org/confluence/download/attachments/23338486/ioc-overview.png?version=1&amp;modificationDate=1290980234000&amp;api=v2" data-image-src="https://cwiki-test.apache.org/confluence/download/attachments/23338486/ioc-overview.png?version=1&amp;modificationDate=1290980234000&amp;api=v2"></span></p><p>Here we're seeing a few services from the built-in Tapestry IoC module, and a few of the services from the Tapestry web framework module. In fact, there are over 100 services, all interrelated, in the Registry ... and that's before you add your own to the mix. The IoC Registry treats all the services uniformly, regardless of whether they are part of Tapestry, or part of your application, or part o
 f an add-on library.</p><p>Tapestry IoC's job is to make all of these services available to each other, and to the outside world. The outside world could be a standalone application, or it could be an application built on top of the Tapestry web framework.</p><h2 id="TapestryIoCOverview-ServiceLifeCycle">Service Life Cycle</h2><p>Tapestry services are <em>lazy</em>, which means they are not fully instantiated until they are absolutely needed. Often, what looks like a service is really a proxy object ... the first time any method of the proxy is invoked, the actual service is instantiated and initialized (Tapestry uses the term <em>realized</em> for this process). Of course, this is all absolutely thread-safe.</p><p>Initially a service is <em>defined</em>, meaning some module has defined the service. Later, the service will be <em>virtual</em>, meaning a proxy has been created. This occurs most often because some other service <em>depends</em> on it, but hasn't gotten around to invok
 ing methods on it. Finally, a service that is ready to use is <em>realized</em>. What's nice is that your code neither knows nor cares about the life cycle of the service, because of the magic of the proxy.</p><p>In fact, when a Tapestry web application starts up, before it services its first request, only about 20% of the services have been realized; the remainder are defined or virtual.</p><h2 id="TapestryIoCOverview-Classvs.Service">Class vs. Service</h2><p>A Tapestry service is more than just a class. First of all, it is a combination of an <em>interface</em> that defines the operations of the service, and an <em>implementation class</em> that implements the interface.</p><p>Why this extra division? Having a service interface is what lets Tapestry create proxies and perform other operations. It's also a very good practice to code to an interface, rather than a specific implementation. You'll often be surprised at the kinds of things you can accomplish by substituting one impleme
 ntation for another.</p><p>Tapestry is also very aware that a service will have dependencies on other services. It may also have other needs ... for example, in Tapestry IoC, the container provides services with access to Loggers.</p><p>Tapestry IoC also has support for other configuration that may be provided to services when they are realized.</p><h2 id="TapestryIoCOverview-DependencyInjection">Dependency Injection</h2><p>Main Article: <a  href="tapestry-ioc-overview.html">Tapestry IoC Overview</a></p><div class="aui-label" style="float:right" title="Related Articles">
+
+
+
+
+
+
+
+
+<h3>Related Articles</h3>
+
+<ul class="content-by-label"><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a  href="injection-in-detail.html">Injection in Detail</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a  href="injection-faq.html">Injection FAQ</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a  href="injection.html">Injection</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div>
+
+
+<p>Inversion of Control refers to the fact that the container, here Tapestry IoC's Registry, instantiates your classes. It decides on when the classes get instantiated.</p><p>Dependency Injection is a key part of <em>realization</em>: this is how a service is provided with the other services it needs to operate. For example, a Data Access Object service may be injected with a ConnectionPool service.</p><p>In Tapestry, injection occurs through constructors, through parameters to service builder methods, or through direct injection into fields. Tapestry prefers constructor injection, as this emphasizes that dependencies should be stored in <strong>final</strong> variables. This is the best approach towards ensuring thread safety.</p><p>In any case, injection "just happens". Tapestry finds the constructor of your class and analyzes the parameters to determine what to pass in. In some cases, it uses just the parameter type to find a match, in other cases, annotations on the parameters m
 ay also be used. It also scans through the fields of your service implementation class to identify which should have injected values written into them.</p><h2 id="TapestryIoCOverview-Whycan'tIjustusenew?">Why can't I just use <code>new</code>?</h2><p>That's a common question. All these concepts seem alien at first. What's wrong with <code>new</code>?</p><p>The problem with new is that it rigidly connects one implementation to another implementation. Let's follow a progression that reflects how a lot of projects get written. It will show that in the real world, <code>new</code> is not as simple as it first seems.</p><p>This example is built around some real-world work that involves a Java Messaging Service queue, part of an application performance monitoring subsystem for a large application. Code inside each server collects performance data of various types and sends it, via a shared JMS queue, to a central server for collection and reporting.</p><p>This code is for a metric that pe
 riodically counts the number of rows in a key database table. Other implementations of MetricProducer will be responsible for measuring CPU utilization, available disk space, number of requests per second, and so forth.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">public class TableMetricProducer implements MetricProducer
 {
   . . . 

Modified: websites/production/tapestry/content/third-party-modules.html
==============================================================================
--- websites/production/tapestry/content/third-party-modules.html (original)
+++ websites/production/tapestry/content/third-party-modules.html Sat Feb  3 17:21:22 2018
@@ -36,13 +36,26 @@
 
   <div class="wrapper bs">
 
-        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  href="index.html">Home</a></li><li><a  href="getting-started.html">Getting Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  href="download.html">Download</a></li><li><a  href="about.html">About</a></li><li><a  class="external-link" href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a  href="community.html">Community</a></li><li><a  class="external-link" href="http://www.apache.org/security/">Security</a></li><li><a  class="external-link" href="http://www.apache.org/">Apache</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div></div>
+        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  href="index.html">Home</a></li><li><a  href="getting-started.html">Getting Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  href="download.html">Download</a></li><li><a  href="about.html">About</a></li><li><a  class="external-link" href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a  href="community.html">Community</a></li><li><a  class="external-link" href="http://www.apache.org/security/">Security</a></li><li><a  class="external-link" href="http://www.apache.org/">Apache</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div>
+
+</div>
 
           <div id="top">
-            <div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span><form enctype="application/x-www-form-urlencoded" method="get" action="http://tapestry.apache.org/search.html"> 
- <input type="text" name="q"> 
- <input type="submit" value="Search"> 
-</form></div><div class="emblem" style="float:left"><p><a  href="index.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://tapestry.apache.org/images/tapestry_small.png" data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></span></a></p></div><div class="title" style="float:left; margin: 0 0 0 3em"><h1 id="SmallBanner-PageTitle">Third Party Modules</h1></div></div>
+            <div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get" action="http://tapestry.apache.org/search.html">
+  <input type="text" name="q">
+  <input type="submit" value="Search">
+</form>
+
+</div>
+
+
+<div class="emblem" style="float:left"><p><a  href="index.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://tapestry.apache.org/images/tapestry_small.png" data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></span></a></p></div>
+
+
+<div class="title" style="float:left; margin: 0 0 0 3em"><h1 id="SmallBanner-PageTitle">Third Party Modules</h1></div>
+
+</div>
       <div class="clearer"></div>
       </div>
 
@@ -54,7 +67,7 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p>Independent developers have build a rich collection of Tapestry modules for your immediate use. These modules greatly expand upon the capabilities already included in Tapestry. <em>These links take you to external sites.</em></p><h2 id="ThirdPartyModules-Tapestry5-Cayenne">Tapestry5-Cayenne</h2><ul><li><a  class="external-link" href="http://code.google.com/p/tapestry5-cayenne/" rel="nofollow">Tapestry5-Cayenne</a> (for Tapestry 5.3) integrates with the Apache Cayenne persistence framework.</li></ul><h2 id="ThirdPartyModules-Argoyle(forTapestry5.3)">Argoyle (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/argoyle/tapestry-breadcrumbs" rel="nofollow">Tapestry-breadcrumbs</a> is a breadcrumb trail implementation, implemented as an annotation to be placed at each page-class that should be part of the trail.</li><li><a  class="external-link" href="https://github.com/argoyle/tapestry-mfautocomplete" rel="nofol
 low">Tapestry-mfautocomplete</a> An autocomplete implementation that can populate multiple fields</li></ul><h2 id="ThirdPartyModules-ChenilleKit(forTapestry5.3)">Chenille Kit (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-ldap/" rel="nofollow">Chenillekit-LDAP</a> helps with LDAP querying</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-lucene/" rel="nofollow">Chenillekit-Lucene</a> provides Apache Lucene indexing &amp; searching</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-image/" rel="nofollow">Chenillekit-Image</a> is an image scaling service</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-mail/" rel="nofollow">Chenillekit-Mail</a> is a mail service based on Apache Commons Email</li><li><a  class="external-link" href="http
 s://github.com/chenillekit/chenillekit/tree/master/chenillekit-quartz/" rel="nofollow">Chenillekit-Quartz</a> provides Quartz-based scheduling capabilities</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-scripting/" rel="nofollow">Chenillekit-Script</a> enables Apache's Bean Scripting Framework</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-template/" rel="nofollow">Chenillekit-Template</a> enables Velocity and FreeMarker templates</li></ul><p><a  class="external-link" href="https://github.com/chenillekit/chenillekit" rel="nofollow">Other Chenille Kit Modules</a>...</p><h2 id="ThirdPartyModules-CiaranW">CiaranW</h2><ul><li><a  class="external-link" href="https://github.com/ciaranw/tapestry-service-cache/wiki" rel="nofollow">Tapestry-Service-Cache</a> provides easy, annotation-based caching for Tapestry 5 services.</li></ul><h2 id="ThirdPartyModules-Exanpe">Exanpe</h
 2><ul><li><a  class="external-link" href="https://github.com/exanpe/tapestry-tldgen" rel="nofollow">Tapestry-Tldgen</a> generates TLD files to let you use the Eclipse JSP editor for code completion on TML files.</li></ul><h2 id="ThirdPartyModules-FlowLogix">FlowLogix</h2><ul><li><a  class="external-link" href="http://code.google.com/p/flowlogix/" rel="nofollow">FlowLogix</a> is a collection of components, services and utilities that integrates Tapestry into JEE environments and provides other commonly needed functionality.</li></ul><h2 id="ThirdPartyModules-GangOfTapestry5">Gang Of Tapestry 5</h2><ul><li><a  class="external-link" href="https://github.com/got5/tapestry5-highcharts" rel="nofollow">Tapestry5-HighCharts</a> integrates the Highcharts library (<a  class="external-link" href="http://www.highcharts.com/" rel="nofollow">http://www.highcharts.com/</a>) into a Tapestry5-jQuery based application</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-jqPlot" r
 el="nofollow">Tapestry5-jqPlot</a> integrates with JQuery jqPlot, a plotting and charting plugin for the jQuery Javascript framework. jqPlot produces beautiful line, bar and pie charts with many features.</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-jquery" rel="nofollow">Tapestry5-Jquery</a> lets you use jQuery to supplement <em>or completely replace</em> Prototype, Scriptaculous and the base tapestry.js script.</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-jquery-mobile" rel="nofollow">Tapestry5-jquery-mobile</a> provides jQuery mobile integration for Tapestry</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-portlet" rel="nofollow">Tapestry5-Portlet</a> provides functionality for Portlet Development in Tapestry</li></ul><h2 id="ThirdPartyModules-Spock">Spock</h2><ul><li><a  class="external-link" href="http://code.google.com/p/spock/wiki/TapestryExtension" rel="nofollow">Spock Tapestry Extension</a> p
 rovides integration with Spock, a testing and specification framework for Java and Groovy applications.</li></ul><h2 id="ThirdPartyModules-SpreadtheSource">Spread the Source</h2><ul><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-db-migrations" rel="nofollow">Tapestry5-db-migrations</a> supports Tapestry 5 Database Migrations: Ruby on Rails-like database migrations powered by Tapestry IOC and Tapestry Hibernate Core</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-googleanalytics" rel="nofollow">Tapestry5-googleanalytics</a> integrates with Google Analytics</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-hornet" rel="nofollow">Tapestry5-hornet</a> integrates the Hornet java connector inside Tapestry 5. Hornet is a realtime publish/suscribe engine that let you enhance your web application by connecting users together, powered by NodeJs and Socket.io</li><li><a  class="external-li
 nk" href="https://github.com/spreadthesource/tapestry5-installer" rel="nofollow">Tapestry5-installer</a> is a Tapestry 5 webapp installer: Live load your Tapestry app right after having set the configuration. This contribution aims to provide an easy way for Tapestry developers to include an installation application in their application so the user can provide its production environment configuration values</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-rome" rel="nofollow">Tapestry5-rome</a> provides RSS &amp; Atom feed support in Tapestry apps</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-spring-tx" rel="nofollow">Tapestry5-spring-tx</a> supports using Spring Transaction Manager inside your Tapestry 5 application. Allows you to access to a Hibernate session factory configured via Spring through your Tapestry business layer in the same transaction</li></ul><h2 id="ThirdPartyModules-T5conduit">T5conduit</h2
 ><ul><li><a  class="external-link" href="https://github.com/cezary-biernacki/t5conduit" rel="nofollow">T5conduit</a> allows seamless integration of LessCSS and CoffeeScript.</li></ul><h2 id="ThirdPartyModules-Tacos">Tacos</h2><ul><li><a  class="external-link" href="http://tacos.sourceforge.net/tacos5/tacos-seam/" rel="nofollow">Tacos-Seam</a> provides an integration between Tapestry and JBoss Seam</li></ul><h2 id="ThirdPartyModules-Tapestry-bootstrap(forTapestry5.3)">Tapestry-bootstrap (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/trsvax/tapestry-bootstrap" rel="nofollow">Tapestry-bootstrap</a> integrates Twitter Bootstrap with Tapestry 5. (Bootstrap is a grid based toolkit of polished HTML, CSS and JavaScript.</li></ul><h2 id="ThirdPartyModules-Tapestry-cometd">Tapestry-cometd</h2><ul><li><a  class="external-link" href="https://github.com/uklance/tapestry-cometd" rel="nofollow">Tapestry-cometd</a> is a push library for Tapestry based on CometD (a
 n HTTP-based event routing bus that uses an Ajax Push technology pattern known as Comet)</li></ul><h2 id="ThirdPartyModules-Tapestry-monitoring">Tapestry-monitoring</h2><ul><li><a  class="external-link" href="https://github.com/joshcanfield/tapestry-monitoring" rel="nofollow">Tapestry-monitoring</a> is a lightweight, unobtrusive way to add JMX performance metrics to any Tapestry application, using the Java Simon monitoring API.</li></ul><h2 id="ThirdPartyModules-Tapestry-profiler">Tapestry-profiler</h2><ul><li><a  class="external-link" href="https://github.com/bdotte/tapestry-profiler" rel="nofollow">Tapestry-profiler</a> is a simple, configurable, sampling profiler designed to be used in production Tapestry 5 applications to track down performance issues.</li></ul><h2 id="ThirdPartyModules-Tapestry-spring-security">Tapestry-spring-security</h2><ul><li><a  class="external-link" href="http://www.localhost.nu/java/tapestry-spring-security/conf.html" rel="nofollow">Tapestry-spring-secu
 rity</a> integrates Spring Security with Tapestry applications</li></ul><h2 id="ThirdPartyModules-Tapestry-Testify">Tapestry-Testify</h2><ul><li><a  class="external-link" href="http://tapestrytestify.sourceforge.net/" rel="nofollow">Tapestry-Testify</a> is an extension that makes it easier to write page and component tests and run them efficiently</li></ul><h2 id="ThirdPartyModules-Tapestry-XPath">Tapestry-XPath</h2><ul><li><a  class="external-link" href="http://tapestryxpath.sourceforge.net/" rel="nofollow">Tapestry-XPath</a> allows you to use XPath expressions to query the Tapestry DOM (useful for page &amp; component tests)</li></ul><h2 id="ThirdPartyModules-Tapestry-zbreadcrumbs">Tapestry-zbreadcrumbs</h2><ul><li><a  class="external-link" href="https://bitbucket.org/zenios/tapestry-zbreadcrumbs" rel="nofollow">Tapestry-zbreadcrumbs</a> is a bread crumb trail implementation, with configuration through contributions and annotations, dynamic breadcrumb titles, and a very flexible b
 readcrumbs trail component</li></ul><h2 id="ThirdPartyModules-Tynamo">Tynamo</h2><ul><li><a  class="external-link" href="http://tynamo.org/tapestry-model+guide" rel="nofollow">Tapestry-Model</a> provides rapid development of CRUD-style applications</li><li><a  class="external-link" href="http://tynamo.org/tapestry-jpa+guide" rel="nofollow">Tapestry-JPA Integration</a> allows you to use JPA with Tapestry</li><li><a  class="external-link" href="http://tynamo.org/tapestry-resteasy+guide" rel="nofollow">Tapestry-ReSTEasy</a> integrates with JBoss' RESTEasy, an implementation of JAX-RS</li><li><a  class="external-link" href="http://tynamo.org/tapestry-security+guide" rel="nofollow">Tapestry-security</a> is a security module for Tapestry apps based on Apache Shiro</li><li><a  class="external-link" href="http://tynamo.org/tapestry-watchdog+guide" rel="nofollow">Tapestry-Watchdog</a> lets your Tapestry app monitor itself</li></ul><p><a  class="external-link" href="http://tynamo.org/" rel="n
 ofollow">Other Tynamo Modules</a>...</p><h2 id="ThirdPartyModules-TapX">TapX</h2><ul><li><a  class="external-link" href="http://tapestry.formos.com/nightly/tapx/tapx-datefield/" rel="nofollow">Tapx-Datefield</a> is an enhanced DateField component</li><li><a  class="external-link" href="https://github.com/hlship/tapx" rel="nofollow">Tapx-plainmessage</a> adds a new binding prefix, "plain:", which works just like "message:", except that any HTML elements are scrubbed, and XML entities are replaced with the corresponding characters</li><li><a  class="external-link" href="http://tapestry.formos.com/nightly/tapx/tapx-templating/" rel="nofollow">Tapx-Templating</a> enables using Tapestry to generate offline content</li><li><a  class="external-link" href="https://github.com/hlship/tapx" rel="nofollow">Tapx-yui</a> bundles YUI (Yahoo User Interface) JavaScript library, including its RichTextEditor</li></ul><p><a  class="external-link" href="http://tapestry.formos.com/projects/tapx/" rel="no
 follow">Other TapX Modules</a>...</p><h2 id="ThirdPartyModules-Tawus">Tawus</h2><ul><li><a  class="external-link" href="http://tawus.wordpress.com/2011/06/25/ajax-upload-for-tapestry/" rel="nofollow">Tawus-ajaxupload</a> is a multiple-file upload module based on the excellent Valums File Uploader (Fine Uploader), with a progress-bar and drag-and-drop features</li><li><a  class="external-link" href="http://tawus.wordpress.com/2011/07/30/tapestry-jfreechart-integration/" rel="nofollow">Tawus-jfreechart</a> makes it easier to use the JFreeChart charting library (<a  class="external-link" href="http://www.jfree.org/jfreechart/" rel="nofollow">http://www.jfree.org/jfreechart/</a>) within Tapestry apps</li></ul><h2 id="ThirdPartyModules-Weaves(forTapestry5.3)">Weaves (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/intercommit/Weaves" rel="nofollow">Weaves</a> is a collection of Tapestry 5 components from InterCommIT</li></ul></div>
+                <div id="ConfluenceContent"><p>Independent developers have build a rich collection of Tapestry modules for your immediate use. These modules greatly expand upon the capabilities already included in Tapestry. <em>These links take you to external sites.</em></p><h2 id="ThirdPartyModules-Tapestry5-Cayenne">Tapestry5-Cayenne</h2><ul><li><a  class="external-link" href="http://code.google.com/p/tapestry5-cayenne/" rel="nofollow">Tapestry5-Cayenne</a> (for Tapestry 5.3) integrates with the Apache Cayenne persistence framework.</li></ul><h2 id="ThirdPartyModules-Argoyle(forTapestry5.3)">Argoyle (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/argoyle/tapestry-breadcrumbs" rel="nofollow">Tapestry-breadcrumbs</a> is a breadcrumb trail implementation, implemented as an annotation to be placed at each page-class that should be part of the trail.</li><li><a  class="external-link" href="https://github.com/argoyle/tapestry-mfautocomplete" rel="nofol
 low">Tapestry-mfautocomplete</a> An autocomplete implementation that can populate multiple fields</li></ul><h2 id="ThirdPartyModules-ChenilleKit(forTapestry5.3)">Chenille Kit (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-ldap/" rel="nofollow">Chenillekit-LDAP</a> helps with LDAP querying</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-lucene/" rel="nofollow">Chenillekit-Lucene</a> provides Apache Lucene indexing &amp; searching</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-image/" rel="nofollow">Chenillekit-Image</a> is an image scaling service</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-mail/" rel="nofollow">Chenillekit-Mail</a> is a mail service based on Apache Commons Email</li><li><a  class="external-link" href="http
 s://github.com/chenillekit/chenillekit/tree/master/chenillekit-quartz/" rel="nofollow">Chenillekit-Quartz</a> provides Quartz-based scheduling capabilities</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-scripting/" rel="nofollow">Chenillekit-Script</a> enables Apache's Bean Scripting Framework</li><li><a  class="external-link" href="https://github.com/chenillekit/chenillekit/tree/master/chenillekit-template/" rel="nofollow">Chenillekit-Template</a> enables Velocity and FreeMarker templates</li></ul><p><a  class="external-link" href="https://github.com/chenillekit/chenillekit" rel="nofollow">Other Chenille Kit Modules</a>...</p><h2 id="ThirdPartyModules-CiaranW">CiaranW</h2><ul><li><a  class="external-link" href="https://github.com/ciaranw/tapestry-service-cache/wiki" rel="nofollow">Tapestry-Service-Cache</a> provides easy, annotation-based caching for Tapestry 5 services.</li></ul><h2 id="ThirdPartyModules-Exanpe">Exanpe</h
 2><ul><li><a  class="external-link" href="https://github.com/exanpe/tapestry-tldgen" rel="nofollow">Tapestry-Tldgen</a> generates TLD files to let you use the Eclipse JSP editor for code completion on TML files.</li></ul><h2 id="ThirdPartyModules-FlowLogix">FlowLogix</h2><ul><li><a  class="external-link" href="http://code.google.com/p/flowlogix/" rel="nofollow">FlowLogix</a> is a collection of components, services and utilities that integrates Tapestry into JEE environments and provides other commonly needed functionality.</li></ul><h2 id="ThirdPartyModules-GangOfTapestry5">Gang Of Tapestry 5</h2><ul><li><a  class="external-link" href="https://github.com/got5/tapestry5-highcharts" rel="nofollow">Tapestry5-HighCharts</a> integrates the Highcharts library (<a  class="external-link" href="http://www.highcharts.com/" rel="nofollow">http://www.highcharts.com/</a>) into a Tapestry5-jQuery based application</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-jqPlot" r
 el="nofollow">Tapestry5-jqPlot</a> integrates with JQuery jqPlot, a plotting and charting plugin for the jQuery Javascript framework. jqPlot produces beautiful line, bar and pie charts with many features.</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-jquery" rel="nofollow">Tapestry5-Jquery</a> lets you use jQuery to supplement <em>or completely replace</em> Prototype, Scriptaculous and the base tapestry.js script.</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-jquery-mobile" rel="nofollow">Tapestry5-jquery-mobile</a> provides jQuery mobile integration for Tapestry</li><li><a  class="external-link" href="https://github.com/got5/tapestry5-portlet" rel="nofollow">Tapestry5-Portlet</a> provides functionality for Portlet Development in Tapestry</li></ul><h2 id="ThirdPartyModules-Spock">Spock</h2><ul><li><a  class="external-link" href="http://code.google.com/p/spock/wiki/TapestryExtension" rel="nofollow">Spock Tapestry Extension</a> p
 rovides integration with Spock, a testing and specification framework for Java and Groovy applications.</li></ul><h2 id="ThirdPartyModules-SpreadtheSource">Spread the Source</h2><ul><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-db-migrations" rel="nofollow">Tapestry5-db-migrations</a> supports Tapestry 5 Database Migrations: Ruby on Rails-like database migrations powered by Tapestry IOC and Tapestry Hibernate Core</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-googleanalytics" rel="nofollow">Tapestry5-googleanalytics</a> integrates with Google Analytics</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-hornet" rel="nofollow">Tapestry5-hornet</a> integrates the Hornet java connector inside Tapestry 5. Hornet is a realtime publish/suscribe engine that let you enhance your web application by connecting users together, powered by NodeJs and <a  class="external-link" href="http://S
 ocket.io" rel="nofollow">Socket.io</a></li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-installer" rel="nofollow">Tapestry5-installer</a> is a Tapestry 5 webapp installer: Live load your Tapestry app right after having set the configuration. This contribution aims to provide an easy way for Tapestry developers to include an installation application in their application so the user can provide its production environment configuration values</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-rome" rel="nofollow">Tapestry5-rome</a> provides RSS &amp; Atom feed support in Tapestry apps</li><li><a  class="external-link" href="https://github.com/spreadthesource/tapestry5-spring-tx" rel="nofollow">Tapestry5-spring-tx</a> supports using Spring Transaction Manager inside your Tapestry 5 application. Allows you to access to a Hibernate session factory configured via Spring through your Tapestry business layer in the same tr
 ansaction</li></ul><h2 id="ThirdPartyModules-T5conduit">T5conduit</h2><ul><li><a  class="external-link" href="https://github.com/cezary-biernacki/t5conduit" rel="nofollow">T5conduit</a> allows seamless integration of LessCSS and CoffeeScript.</li></ul><h2 id="ThirdPartyModules-Tacos">Tacos</h2><ul><li><a  class="external-link" href="http://tacos.sourceforge.net/tacos5/tacos-seam/" rel="nofollow">Tacos-Seam</a> provides an integration between Tapestry and JBoss Seam</li></ul><h2 id="ThirdPartyModules-Tapestry-bootstrap(forTapestry5.3)">Tapestry-bootstrap (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/trsvax/tapestry-bootstrap" rel="nofollow">Tapestry-bootstrap</a> integrates Twitter Bootstrap with Tapestry 5. (Bootstrap is a grid based toolkit of polished HTML, CSS and JavaScript.</li></ul><h2 id="ThirdPartyModules-Tapestry-cometd">Tapestry-cometd</h2><ul><li><a  class="external-link" href="https://github.com/uklance/tapestry-cometd" rel="nofollow">
 Tapestry-cometd</a> is a push library for Tapestry based on CometD (an HTTP-based event routing bus that uses an Ajax Push technology pattern known as Comet)</li></ul><h2 id="ThirdPartyModules-Tapestry-monitoring">Tapestry-monitoring</h2><ul><li><a  class="external-link" href="https://github.com/joshcanfield/tapestry-monitoring" rel="nofollow">Tapestry-monitoring</a> is a lightweight, unobtrusive way to add JMX performance metrics to any Tapestry application, using the Java Simon monitoring API.</li></ul><h2 id="ThirdPartyModules-Tapestry-profiler">Tapestry-profiler</h2><ul><li><a  class="external-link" href="https://github.com/bdotte/tapestry-profiler" rel="nofollow">Tapestry-profiler</a> is a simple, configurable, sampling profiler designed to be used in production Tapestry 5 applications to track down performance issues.</li></ul><h2 id="ThirdPartyModules-Tapestry-spring-security">Tapestry-spring-security</h2><ul><li><a  class="external-link" href="http://www.localhost.nu/java/ta
 pestry-spring-security/conf.html" rel="nofollow">Tapestry-spring-security</a> integrates Spring Security with Tapestry applications</li></ul><h2 id="ThirdPartyModules-Tapestry-Testify">Tapestry-Testify</h2><ul><li><a  class="external-link" href="http://tapestrytestify.sourceforge.net/" rel="nofollow">Tapestry-Testify</a> is an extension that makes it easier to write page and component tests and run them efficiently</li></ul><h2 id="ThirdPartyModules-Tapestry-XPath">Tapestry-XPath</h2><ul><li><a  class="external-link" href="http://tapestryxpath.sourceforge.net/" rel="nofollow">Tapestry-XPath</a> allows you to use XPath expressions to query the Tapestry DOM (useful for page &amp; component tests)</li></ul><h2 id="ThirdPartyModules-Tapestry-zbreadcrumbs">Tapestry-zbreadcrumbs</h2><ul><li><a  class="external-link" href="https://bitbucket.org/zenios/tapestry-zbreadcrumbs" rel="nofollow">Tapestry-zbreadcrumbs</a> is a bread crumb trail implementation, with configuration through contributi
 ons and annotations, dynamic breadcrumb titles, and a very flexible breadcrumbs trail component</li></ul><h2 id="ThirdPartyModules-Tynamo">Tynamo</h2><ul><li><a  class="external-link" href="http://tynamo.org/tapestry-model+guide" rel="nofollow">Tapestry-Model</a> provides rapid development of CRUD-style applications</li><li><a  class="external-link" href="http://tynamo.org/tapestry-jpa+guide" rel="nofollow">Tapestry-JPA Integration</a> allows you to use JPA with Tapestry</li><li><a  class="external-link" href="http://tynamo.org/tapestry-resteasy+guide" rel="nofollow">Tapestry-ReSTEasy</a> integrates with JBoss' RESTEasy, an implementation of JAX-RS</li><li><a  class="external-link" href="http://tynamo.org/tapestry-security+guide" rel="nofollow">Tapestry-security</a> is a security module for Tapestry apps based on Apache Shiro</li><li><a  class="external-link" href="http://tynamo.org/tapestry-watchdog+guide" rel="nofollow">Tapestry-Watchdog</a> lets your Tapestry app monitor itself</
 li></ul><p><a  class="external-link" href="http://tynamo.org/" rel="nofollow">Other Tynamo Modules</a>...</p><h2 id="ThirdPartyModules-TapX">TapX</h2><ul><li><a  class="external-link" href="http://tapestry.formos.com/nightly/tapx/tapx-datefield/" rel="nofollow">Tapx-Datefield</a> is an enhanced DateField component</li><li><a  class="external-link" href="https://github.com/hlship/tapx" rel="nofollow">Tapx-plainmessage</a> adds a new binding prefix, "plain:", which works just like "message:", except that any HTML elements are scrubbed, and XML entities are replaced with the corresponding characters</li><li><a  class="external-link" href="http://tapestry.formos.com/nightly/tapx/tapx-templating/" rel="nofollow">Tapx-Templating</a> enables using Tapestry to generate offline content</li><li><a  class="external-link" href="https://github.com/hlship/tapx" rel="nofollow">Tapx-yui</a> bundles YUI (Yahoo User Interface) JavaScript library, including its RichTextEditor</li></ul><p><a  class="ex
 ternal-link" href="http://tapestry.formos.com/projects/tapx/" rel="nofollow">Other TapX Modules</a>...</p><h2 id="ThirdPartyModules-Tawus">Tawus</h2><ul><li><a  class="external-link" href="http://tawus.wordpress.com/2011/06/25/ajax-upload-for-tapestry/" rel="nofollow">Tawus-ajaxupload</a> is a multiple-file upload module based on the excellent Valums File Uploader (Fine Uploader), with a progress-bar and drag-and-drop features</li><li><a  class="external-link" href="http://tawus.wordpress.com/2011/07/30/tapestry-jfreechart-integration/" rel="nofollow">Tawus-jfreechart</a> makes it easier to use the JFreeChart charting library (<a  class="external-link" href="http://www.jfree.org/jfreechart/" rel="nofollow">http://www.jfree.org/jfreechart/</a>) within Tapestry apps</li></ul><h2 id="ThirdPartyModules-Weaves(forTapestry5.3)">Weaves (for Tapestry 5.3)</h2><ul><li><a  class="external-link" href="https://github.com/intercommit/Weaves" rel="nofollow">Weaves</a> is a collection of Tapestry 
 5 components from InterCommIT</li></ul></div>
       </div>
 
       <div class="clearer"></div>

Modified: websites/production/tapestry/content/type-coercion.html
==============================================================================
--- websites/production/tapestry/content/type-coercion.html (original)
+++ websites/production/tapestry/content/type-coercion.html Sat Feb  3 17:21:22 2018
@@ -44,13 +44,26 @@
 
   <div class="wrapper bs">
 
-        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  href="index.html">Home</a></li><li><a  href="getting-started.html">Getting Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  href="download.html">Download</a></li><li><a  href="about.html">About</a></li><li><a  class="external-link" href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a  href="community.html">Community</a></li><li><a  class="external-link" href="http://www.apache.org/security/">Security</a></li><li><a  class="external-link" href="http://www.apache.org/">Apache</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div></div>
+        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  href="index.html">Home</a></li><li><a  href="getting-started.html">Getting Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  href="download.html">Download</a></li><li><a  href="about.html">About</a></li><li><a  class="external-link" href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a  href="community.html">Community</a></li><li><a  class="external-link" href="http://www.apache.org/security/">Security</a></li><li><a  class="external-link" href="http://www.apache.org/">Apache</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a  class="external-link" href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div>
+
+</div>
 
           <div id="top">
-            <div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span><form enctype="application/x-www-form-urlencoded" method="get" action="http://tapestry.apache.org/search.html"> 
- <input type="text" name="q"> 
- <input type="submit" value="Search"> 
-</form></div><div class="emblem" style="float:left"><p><a  href="index.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://tapestry.apache.org/images/tapestry_small.png" data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></span></a></p></div><div class="title" style="float:left; margin: 0 0 0 3em"><h1 id="SmallBanner-PageTitle">Type Coercion</h1></div></div>
+            <div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get" action="http://tapestry.apache.org/search.html">
+  <input type="text" name="q">
+  <input type="submit" value="Search">
+</form>
+
+</div>
+
+
+<div class="emblem" style="float:left"><p><a  href="index.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://tapestry.apache.org/images/tapestry_small.png" data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></span></a></p></div>
+
+
+<div class="title" style="float:left; margin: 0 0 0 3em"><h1 id="SmallBanner-PageTitle">Type Coercion</h1></div>
+
+</div>
       <div class="clearer"></div>
       </div>
 
@@ -62,19 +75,40 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p><strong>Type Coercion</strong> is the conversion of one type of object to a new object of a different type with similar content. Tapestry frequently must coerce objects from one type to another. A common example is the coercion of string "5" into an integer 5 or a double 5.0.</p><div class="aui-label" style="float:right" title="Related Articles"><h3>Related Articles</h3><ul class="content-by-label"><li> 
-  <div> 
-   <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span> 
-  </div> 
-  <div class="details"> 
-   <a  href="type-coercion.html">Type Coercion</a> 
-  </div> </li><li> 
-  <div> 
-   <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span> 
-  </div> 
-  <div class="details"> 
-   <a  href="parameter-type-coercion.html">Parameter Type Coercion</a> 
-  </div> </li></ul></div><p>Although type coercions happen more inside tapestry-core (including <a  href="parameter-type-coercion.html">coercions of <span class="confluence-link">component parameters</span></a><span class="confluence-link">&#160;</span>), they may also happen inside tapestry-ioc, such as when injecting a value, rather than a service, into a builder method.</p><p>Like everything else in Tapestry, type coercions are extensible. At the root is the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/TypeCoercer.html">TypeCoercer</a> service. Its configuration consists of a number of <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/CoercionTuple.html">CoercionTuples</a>. Each tuple defines how to coerce from one type to another. The initial set of coercions is focused primarily on coercions between different numeric types:</p><p><span class="confluence-emb
 edded-file-wrapper"><img class="confluence-embedded-image" src="type-coercion.data/type-coercer.png"></span></p><h2 id="TypeCoercion-DefaultTypeCoercions">Default Type Coercions</h2><p>There are a few special coercions related to <code>null</code> there; <code>Object</code> --&gt; <code>List</code> wraps a lone object as a singleton list, we then need <code>null</code> --&gt; <code>List</code> to ensure that <code>null</code> stays <code>null</code> (rather than a singleton list whose lone element is a <code>null</code>).</p><p>Tapestry can <em>interpolate</em> necessary coercions. For example, say it is necessary to coerce a <code>StringBuffer</code> to an <code>Integer</code>; the TypeCoercer service will chain together a series of coercions:</p><ul><li><code>Object</code> --&gt; <code>String</code></li><li><code>String</code> --&gt; <code>Long</code></li><li><code>Long</code> --&gt; <code>Integer</code></li></ul><h2 id="TypeCoercion-Coercingfromnull">Coercing from null</h2><p>Coe
 rcing from <code>null</code> is special; it is not a spanning search as with the other types. Either there is a specific coercion from <code>null</code> to the desired type, or no coercion takes places (and the coerced value is <code>null</code>).</p><p>The only built-in <code>null</code> coercion is from <code>null</code> to <code>boolean</code> (which is always false).</p><h2 id="TypeCoercion-ListofCoercions">List of Coercions</h2><p>As of Tapestry versions 5.1 and 5.2, the following coercions are available:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+                <div id="ConfluenceContent"><p><strong>Type Coercion</strong> is the conversion of one type of object to a new object of a different type with similar content. Tapestry frequently must coerce objects from one type to another. A common example is the coercion of string "5" into an integer 5 or a double 5.0.</p><div class="aui-label" style="float:right" title="Related Articles">
+
+
+
+
+
+
+
+
+<h3>Related Articles</h3>
+
+<ul class="content-by-label"><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a  href="type-coercion.html">Type Coercion</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a  href="parameter-type-coercion.html">Parameter Type Coercion</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div>
+
+
+<p>Although type coercions happen more inside tapestry-core (including <a  href="type-coercion.html">coercions of <span class="confluence-link">component parameters</span></a><span class="confluence-link">&#160;</span>), they may also happen inside tapestry-ioc, such as when injecting a value, rather than a service, into a builder method.</p><p>Like everything else in Tapestry, type coercions are extensible. At the root is the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/TypeCoercer.html">TypeCoercer</a> service. Its configuration consists of a number of <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/CoercionTuple.html">CoercionTuples</a>. Each tuple defines how to coerce from one type to another. The initial set of coercions is focused primarily on coercions between different numeric types:</p><p>&#160;</p><p><span class="confluence-embedded-file-wrapper"><i
 mg class="confluence-embedded-image" src="type-coercion.data/type-coercer.png"></span></p><h2 id="TypeCoercion-DefaultTypeCoercions">Default Type Coercions</h2><p>There are a few special coercions related to <code>null</code> there; <code>Object</code> --&gt; <code>List</code> wraps a lone object as a singleton list, we then need <code>null</code> --&gt; <code>List</code> to ensure that <code>null</code> stays <code>null</code> (rather than a singleton list whose lone element is a <code>null</code>).</p><p>Tapestry can <em>interpolate</em> necessary coercions. For example, say it is necessary to coerce a <code>StringBuffer</code> to an <code>Integer</code>; the TypeCoercer service will chain together a series of coercions:</p><ul><li><code>Object</code> --&gt; <code>String</code></li><li><code>String</code> --&gt; <code>Long</code></li><li><code>Long</code> --&gt; <code>Integer</code></li></ul><h2 id="TypeCoercion-Coercingfromnull">Coercing from null</h2><p>Coercing from <code>null<
 /code> is special; it is not a spanning search as with the other types. Either there is a specific coercion from <code>null</code> to the desired type, or no coercion takes places (and the coerced value is <code>null</code>).</p><p>The only built-in <code>null</code> coercion is from <code>null</code> to <code>boolean</code> (which is always false).</p><h2 id="TypeCoercion-ListofCoercions">List of Coercions</h2><p>As of Tapestry versions 5.1 and 5.2, the following coercions are available:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">Double --&gt; Float
 Float --&gt; Double
 Long --&gt; Boolean
@@ -152,7 +186,8 @@ short[] --&gt; java.util.List
         }
     }));
 </pre>
-</div></div><p>&#160;</p><p></p></div>
+</div></div><p>&#160;</p><p></p>
+() { public Boolean coerce(Void input) { return false; } })); ]]&gt;<p>&#160;</p><p>&#160;</p></div>
       </div>
 
       <div class="clearer"></div>

Modified: websites/production/tapestry/content/user-guide.html
==============================================================================
--- websites/production/tapestry/content/user-guide.html (original)
+++ websites/production/tapestry/content/user-guide.html Sat Feb  3 17:21:22 2018
@@ -67,26 +67,7 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p>This <strong>User Guide</strong> serves as the encyclopedia for Tapestry concepts, capabilities and practices.</p><div class="sectionColumnWrapper"><div class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro" style="width:30%;min-width:30%;max-width:30%;"><h2 id="UserGuide-TapestryCore">Tapestry Core</h2><p>Going beyond&#160;<a  href="getting-started.html">Getting Started</a> and the <a  href="user-guide.html">Tutorial</a>, these topics dive deep into the core Tapestry capabilities.</p><ul><li><span class="confluence-link"><a  href="supported-environments-and-versions.html">Supported Environments and Versions</a></span></li><li><span class="confluence-link"><a  href="project-layout.html">Project Layout</a></span></li><li><a  href="configuration.html">Configuration</a></li><li class="confluence-link"><a  href="class-reloading.html">Class Reloading</a></li><li class="confluence-link"><a  href="component-reference.html">
 Component Reference</a></li><li class="confluence-link"><a  href="annotations.html">Annotations</a></li></ul><h3 id="UserGuide-PagesandComponents">Pages and Components</h3><ul><li><a  href="component-classes.html">Component Classes</a></li><li><a  href="component-templates.html">Component Templates</a></li><li><a  href="property-expressions.html">Property Expressions</a></li><li><a  href="component-parameters.html">Component Parameters</a></li><li><a  href="parameter-type-coercion.html">Parameter Type Coercion</a></li><li><a  href="layout-component.html">Layout Component</a></li><li><a  href="component-mixins.html">Component Mixins</a></li><li><a  href="page-navigation.html">Page Navigation</a></li><li><a  href="localization.html">Localization</a></li></ul><h3 id="UserGuide-Request/ResponseProcessing">Request/Response Processing</h3><ul><li><a  href="page-life-cycle.html">Page Life Cycle</a></li><li><a  href="request-processing.html">Request Processing</a></li><li><a  href="componen
 t-rendering.html">Component Rendering</a></li><li><a  href="url-rewriting.html">URL Rewriting</a></li><li><a  href="dom.html">Document Object Model</a> (DOM)</li><li><a  href="response-compression.html">Response Compression</a></li><li><a  href="https.html">Securing your application with HTTPS</a></li><li><a  href="content-type-and-markup.html">Content Type and Markup</a></li></ul><h3 id="UserGuide-Datapersistence">Data persistence</h3><ul><li><a  href="persistent-page-data.html">Persistent Page Data</a></li><li><a  href="session-storage.html">Session Storage</a></li></ul><h3 class="confluence-link" id="UserGuide-Interactingwithcomponents">Interacting with components</h3><ul><li><a  href="injection.html">Injection</a></li><li><a  href="environmental-services.html">Environmental Services</a></li></ul><h3 id="UserGuide-JavaScript,AJAX,CSS&amp;BinaryData">JavaScript, AJAX, CSS &amp; Binary Data</h3><ul><li><span><a  href="client-side-javascript.html">Client-Side JavaScript</a></span></
 li><li><span><a  href="javascript-modules.html">JavaScript Modules</a></span></li><li><span><a  href="coffeescript.html">CoffeeScript</a></span></li><li><span><a  href="ajax-and-zones.html">Ajax and Zones</a></span></li><li><a  href="css.html">Cascading Style Sheets</a> (CSS)</li><li><a  href="assets.html">Assets</a></li><li><a  href="legacy-javascript.html">Legacy JavaScript</a> (prior to Tapestry 5.4)</li></ul><h3 id="UserGuide-Workingwithforms">Working with forms</h3><ul><li><a  href="logging.html">Logging &amp; Debugging</a></li><li><a  href="user-guide.html">User Guide</a></li><li><a  href="user-guide.html">Uploading files</a></li></ul><h3 id="UserGuide-Debugging,Testing&amp;Tooling">Debugging, Testing &amp; Tooling</h3><ul><li><a  href="user-guide.html">Logging &amp; Debugging</a></li><li><a  href="unit-testing-pages-or-components.html">Unit testing pages or components</a></li><li><a  href="integration-testing.html">Integration testing with Selenium</a></li><li><a  href="devel
 opment-dashboard.html">Development Dashboard</a></li></ul></div><div class="columnMacro" style="width:30%;min-width:30%;max-width:30%;"><h2 id="UserGuide-TapestryIOC">Tapestry IOC</h2><p>As with Tapestry 5 in general, the goal of Tapestry Inversion of Control (IoC) is greater simplicity and power--without XML. You'll want to explore Tapestry IoC to make full use of the extensibility of the framework.</p><h3 id="UserGuide-Architecture">Architecture</h3><ul><li><a  href="ioc.html">Introduction</a></li><li><a  href="tapestry-ioc-overview.html">Overview</a></li><li><a  href="tapestry-ioc-modules.html">Modules</a></li></ul><h3 id="UserGuide-Features">Features</h3><ul><li><a  href="defining-tapestry-ioc-services.html">Services</a></li><li><a  href="service-advisors.html">Service Advisors &amp; Advice</a></li><li><a  href="tapestry-ioc-decorators.html">Service Decorators &amp; Decoration</a></li><li><a  href="operation-tracker.html">Operation Tracker</a></li></ul><h3 id="UserGuide-Configur
 ation">Configuration</h3><ul><li><a  href="tapestry-ioc-configuration.html">Configuration</a></li><li><a  href="case-insensitivity.html">Case Insensitivity</a></li><li><a  href="autoloading-modules.html">Module Autoloading</a></li><li><a  href="service-implementation-reloading.html">Service Implementation Reloading</a></li><li><a  href="ordering-by-constraints.html">Ordering by Constraints</a></li><li><a  href="symbols.html">Symbols</a></li></ul><h3 id="UserGuide-ServiceBuilders">Service Builders</h3><p>Tapestry provides a set of ready-to-use service builders for common design patterns:</p><ul><li><a  href="chainbuilder-service.html">Chain of Command</a> (the ChainBuilder service)</li><li><a  href="pipelinebuilder-service.html">Pipeline</a> (the PipelineBuilder service)</li><li><a  href="shadowbuilder-service.html">Shadow Properties</a> (the PropertyShadowBuilder service)</li><li><a  href="strategybuilder-service.html">Strategy</a> (the StrategyBuilder service)</li></ul><h3 id="User
 Guide-Usage">Usage</h3><ul><li><a  href="injection-in-detail.html">Injection in detail</a></li><li><a  href="object-providers.html">Object Providers</a></li><li><a  href="service-serialization.html">Service Serialization</a></li></ul><h3 id="UserGuide-Built-inservices">Built-in services</h3><ul><li><a  href="type-coercion.html">Type Coercer</a></li></ul><h3 id="UserGuide-Registrystartup&amp;shutdown">Registry startup &amp; shutdown</h3><ul><li><a  href="starting-the-ioc-registry.html">Starting and stopping the registry</a></li><li><a  href="registry-startup.html">Listening for registry startup</a></li></ul><h3 id="UserGuide-Tooling">Tooling</h3><ul><li><a  href="parallel-execution.html">Parallel Execution</a></li><li><a  href="logging-in-tapestry.html">Logging</a></li></ul></div><div class="columnMacro" style="width:30%;min-width:30%;max-width:30%;"><h2 id="UserGuide-Built-inmodules">Built-in modules</h2>Tapestry comes with a collection of add-on modules to let you extend the framew
 ork beyond its core.
-
-<h3 id="UserGuide-HibernateIntegration">Hibernate Integration</h3>
-
-<ul><li><a  href="hibernate-core-conf.html">Hibernate Configuration</a></li><li><a  href="hibernate-user-guide.html">Hibernate User Guide</a></li><li><a  href="hibernate-statistics.html">Hibernate Statistics</a></li></ul>
-
-
-<h3 id="UserGuide-SpringIntegration">Spring Integration</h3>
-
-<ul><li><a  href="integrating-with-spring-framework.html">Spring Core</a></li></ul>
-
-
-<h3 id="UserGuide-JPAIntegration">JPA Integration</h3>
-
-<ul><li><a  href="integrating-with-jpa.html">Integrating with JPA</a></li></ul>
-
-
-<h3 id="UserGuide-OtherModules">Other Modules</h3>
-
-<ul><li><a  href="bean-validation.html">JSR 303 Bean Validation</a></li><li><a  href="functional-flows.html">Functional Flows</a></li><li><a  href="jmx-module.html">JMX Integration</a></li><li><a  href="json.html">JSON</a></li><li><a  href="component-report.html">Component Report</a></li></ul><p><a  href="modules.html">More Modules</a>...</p><h2 id="UserGuide-DeprecatedTopics">Deprecated Topics</h2><ul><li class="confluence-link"><a  href="aliases.html">Aliases</a> (deprecated)</li></ul></div></div></div></div></div>
+                <div id="ConfluenceContent"><p>This <strong>User Guide</strong> serves as the encyclopedia for Tapestry concepts, capabilities and practices.</p><div class="sectionColumnWrapper"><div class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro" style="width:30%;min-width:30%;max-width:30%;"><h2 id="UserGuide-TapestryCore">Tapestry Core</h2><p>Going beyond&#160;<a  href="getting-started.html">Getting Started</a> and the <a  href="user-guide.html">Tutorial</a>, these topics dive deep into the core Tapestry capabilities.</p><ul><li><span class="confluence-link"><a  href="supported-environments-and-versions.html">Supported Environments and Versions</a></span></li><li><span class="confluence-link"><a  href="project-layout.html">Project Layout</a></span></li><li><a  href="configuration.html">Configuration</a></li><li class="confluence-link"><a  href="class-reloading.html">Class Reloading</a></li><li class="confluence-link"><a  href="component-reference.html">
 Component Reference</a></li><li class="confluence-link"><a  href="annotations.html">Annotations</a></li></ul><h3 id="UserGuide-PagesandComponents">Pages and Components</h3><ul><li><a  href="component-classes.html">Component Classes</a></li><li><a  href="component-templates.html">Component Templates</a></li><li><a  href="property-expressions.html">Property Expressions</a></li><li><a  href="component-parameters.html">Component Parameters</a></li><li><a  href="parameter-type-coercion.html">Parameter Type Coercion</a></li><li><a  href="layout-component.html">Layout Component</a></li><li><a  href="component-mixins.html">Component Mixins</a></li><li><a  href="page-navigation.html">Page Navigation</a></li><li><a  href="localization.html">Localization</a></li></ul><h3 id="UserGuide-Request/ResponseProcessing">Request/Response Processing</h3><ul><li><a  href="page-life-cycle.html">Page Life Cycle</a></li><li><a  href="request-processing.html">Request Processing</a></li><li><a  href="componen
 t-rendering.html">Component Rendering</a></li><li><a  href="url-rewriting.html">URL Rewriting</a></li><li><a  href="dom.html">Document Object Model</a> (DOM)</li><li><a  href="response-compression.html">Response Compression</a></li><li><a  href="https.html">Securing your application with HTTPS</a></li><li><a  href="content-type-and-markup.html">Content Type and Markup</a></li></ul><h3 id="UserGuide-Datapersistence">Data persistence</h3><ul><li><a  href="persistent-page-data.html">Persistent Page Data</a></li><li><a  href="session-storage.html">Session Storage</a></li></ul><h3 class="confluence-link" id="UserGuide-Interactingwithcomponents">Interacting with components</h3><ul><li><a  href="injection.html">Injection</a></li><li><a  href="environmental-services.html">Environmental Services</a></li></ul><h3 id="UserGuide-JavaScript,AJAX,CSS&amp;BinaryData">JavaScript, AJAX, CSS &amp; Binary Data</h3><ul><li><span><a  href="client-side-javascript.html">Client-Side JavaScript</a></span></
 li><li><span><a  href="javascript-modules.html">JavaScript Modules</a></span></li><li><span><a  href="coffeescript.html">CoffeeScript</a></span></li><li><span><a  href="ajax-and-zones.html">Ajax and Zones</a></span></li><li><a  href="css.html">Cascading Style Sheets</a> (CSS)</li><li><a  href="assets.html">Assets</a></li><li><a  href="legacy-javascript.html">Legacy JavaScript</a> (prior to Tapestry 5.4)</li></ul><h3 id="UserGuide-Workingwithforms">Working with forms</h3><ul><li><a  href="logging.html">Logging &amp; Debugging</a></li><li><a  href="user-guide.html">User Guide</a></li><li><a  href="user-guide.html">Uploading files</a></li></ul><h3 id="UserGuide-Debugging,Testing&amp;Tooling">Debugging, Testing &amp; Tooling</h3><ul><li><a  href="user-guide.html">Logging &amp; Debugging</a></li><li><a  href="unit-testing-pages-or-components.html">Unit testing pages or components</a></li><li><a  href="integration-testing.html">Integration testing with Selenium</a></li><li><a  href="devel
 opment-dashboard.html">Development Dashboard</a></li></ul></div><div class="columnMacro" style="width:30%;min-width:30%;max-width:30%;"><h2 id="UserGuide-TapestryIOC">Tapestry IOC</h2><p>As with Tapestry 5 in general, the goal of Tapestry Inversion of Control (IoC) is greater simplicity and power--without XML. You'll want to explore Tapestry IoC to make full use of the extensibility of the framework.</p><h3 id="UserGuide-Architecture">Architecture</h3><ul><li><a  href="ioc.html">Introduction</a></li><li><a  href="tapestry-ioc-overview.html">Overview</a></li><li><a  href="tapestry-ioc-modules.html">Modules</a></li></ul><h3 id="UserGuide-Features">Features</h3><ul><li><a  href="defining-tapestry-ioc-services.html">Services</a></li><li><a  href="service-advisors.html">Service Advisors &amp; Advice</a></li><li><a  href="tapestry-ioc-decorators.html">Service Decorators &amp; Decoration</a></li><li><a  href="operation-tracker.html">Operation Tracker</a></li></ul><h3 id="UserGuide-Configur
 ation">Configuration</h3><ul><li><a  href="tapestry-ioc-configuration.html">Configuration</a></li><li><a  href="case-insensitivity.html">Case Insensitivity</a></li><li><a  href="autoloading-modules.html">Module Autoloading</a></li><li><a  href="service-implementation-reloading.html">Service Implementation Reloading</a></li><li><a  href="ordering-by-constraints.html">Ordering by Constraints</a></li><li><a  href="symbols.html">Symbols</a></li></ul><h3 id="UserGuide-ServiceBuilders">Service Builders</h3><p>Tapestry provides a set of ready-to-use service builders for common design patterns:</p><ul><li><a  href="chainbuilder-service.html">Chain of Command</a> (the ChainBuilder service)</li><li><a  href="pipelinebuilder-service.html">Pipeline</a> (the PipelineBuilder service)</li><li><a  href="shadowbuilder-service.html">Shadow Properties</a> (the PropertyShadowBuilder service)</li><li><a  href="strategybuilder-service.html">Strategy</a> (the StrategyBuilder service)</li></ul><h3 id="User
 Guide-Usage">Usage</h3><ul><li><a  href="injection-in-detail.html">Injection in detail</a></li><li><a  href="object-providers.html">Object Providers</a></li><li><a  href="service-serialization.html">Service Serialization</a></li></ul><h3 id="UserGuide-Built-inservices">Built-in services</h3><ul><li><a  href="type-coercion.html">Type Coercer</a></li></ul><h3 id="UserGuide-Registrystartup&amp;shutdown">Registry startup &amp; shutdown</h3><ul><li><a  href="starting-the-ioc-registry.html">Starting and stopping the registry</a></li><li><a  href="registry-startup.html">Listening for registry startup</a></li></ul><h3 id="UserGuide-Tooling">Tooling</h3><ul><li><a  href="parallel-execution.html">Parallel Execution</a></li><li><a  href="logging-in-tapestry.html">Logging</a></li></ul></div><div class="columnMacro" style="width:30%;min-width:30%;max-width:30%;"><h2 id="UserGuide-Built-inmodules">Built-in modules</h2>Tapestry comes with a collection of add-on modules to let you extend the framew
 ork beyond its core.<h3 id="UserGuide-HibernateIntegration">Hibernate Integration</h3><ul><li><a  href="hibernate-core-conf.html">Hibernate Configuration</a></li><li><a  href="hibernate-user-guide.html">Hibernate User Guide</a></li><li><a  href="hibernate-statistics.html">Hibernate Statistics</a></li></ul><h3 id="UserGuide-SpringIntegration">Spring Integration</h3><ul><li><a  href="integrating-with-spring-framework.html">Spring Core</a></li></ul><h3 id="UserGuide-JPAIntegration">JPA Integration</h3><ul><li><a  href="integrating-with-jpa.html">Integrating with JPA</a></li></ul><h3 id="UserGuide-OtherModules">Other Modules</h3><ul><li><a  href="bean-validation.html">JSR 303 Bean Validation</a></li><li><a  href="functional-flows.html">Functional Flows</a></li><li><a  href="jmx-module.html">JMX Integration</a></li><li><a  href="json.html">JSON</a></li><li><a  href="component-report.html">Component Report</a></li></ul><p><a  href="modules.html">More Modules</a>...</p><h2 id="UserGuide-De
 precatedTopics">Deprecated Topics</h2><ul><li class="confluence-link"><a  href="aliases.html">Aliases</a> (deprecated)</li></ul></div></div></div></div></div>
       </div>
 
       <div class="clearer"></div>