You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by bo...@apache.org on 2017/09/20 12:29:17 UTC

svn commit: r1018410 [25/41] - /websites/production/tapestry/content/

Modified: websites/production/tapestry/content/logging.html
==============================================================================
--- websites/production/tapestry/content/logging.html (original)
+++ websites/production/tapestry/content/logging.html Wed Sep 20 12:29:16 2017
@@ -27,6 +27,14 @@
       </title>
   <link type="text/css" rel="stylesheet" href="/resources/space.css" />
 
+          <link href='/resources/highlighter/styles/shCoreCXF.css' rel='stylesheet' type='text/css' />
+    <link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet' type='text/css' />
+    <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
+        <script>
+      SyntaxHighlighter.defaults['toolbar'] = false;
+      SyntaxHighlighter.all();
+    </script>
   
   <link href="/styles/style.css" rel="stylesheet" type="text/css"/>
 
@@ -36,26 +44,13 @@
 
   <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">Logging</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">Logging</h1></div></div>
       <div class="clearer"></div>
       </div>
 
@@ -67,8 +62,23 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p><strong>Logging</strong> involves the automatic recording of progress as an application runs. Tapestry makes extensive use of <a  class="external-link" href="http://www.slf4j.org/" rel="nofollow">SLF4J</a> to log details about the creation and operation of your page and component classes.</p><parameter ac:name="style">float:right</parameter><parameter ac:name="title">Related Articles</parameter><parameter ac:name="class">aui-label</parameter><rich-text-body><parameter ac:name="showLabels">false</parameter><parameter ac:name="showSpace">false</parameter><parameter ac:name="title">Related Articles</parameter><parameter ac:name="cql">label = "logging" and space = currentSpace()</parameter></rich-text-body><p>The default configuration for logging uses <a  class="external-link" href="http://logging.apache.org/log4j/">Log4J</a> as the logging toolkit, though <a  href="logging-in-tapestry.html">this can be changed</a>.</p><h1 id="Logging-Class
 toLogger">Class to Logger</h1><p>The logger name for a page or component matches the fully qualified class name. You can configure this in log4j.properties:</p><plain-text-body>log4j.category.org.apache.tapestry5.integration.app1.pages.MerryChristmas=trace
-</plain-text-body><h1 id="Logging-InjectingLoggers">Injecting Loggers</h1><p>You may mark a field of type <a  class="external-link" href="http://www.slf4j.org/api/org/slf4j/Logger.html" rel="nofollow">Logger</a> with the @Inject annotation. The proper Logger for your page or component will be injected.</p><plain-text-body>public class MyPage
+                <div id="ConfluenceContent"><p><strong>Logging</strong> involves the automatic recording of progress as an application runs. Tapestry makes extensive use of <a  class="external-link" href="http://www.slf4j.org/" rel="nofollow">SLF4J</a> to log details about the creation and operation of your page and component classes.</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="logging-in-tapestry.html">Logging in Tapestry</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="logging.html">Logging</a> 
+  </div> </li></ul></div><p>The default configuration for logging uses <a  class="external-link" href="http://logging.apache.org/log4j/">Log4J</a> as the logging toolkit, though <a  href="logging-in-tapestry.html">this can be changed</a>.</p><h1 id="Logging-ClasstoLogger">Class to Logger</h1><p>The logger name for a page or component matches the fully qualified class name. You can configure this in log4j.properties:</p><div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
+<pre>log4j.category.org.apache.tapestry5.integration.app1.pages.MerryChristmas=trace
+</pre>
+</div></div><h1 id="Logging-InjectingLoggers">Injecting Loggers</h1><p>You may mark a field of type <a  class="external-link" href="http://www.slf4j.org/api/org/slf4j/Logger.html" rel="nofollow">Logger</a> with the @Inject annotation. The proper Logger for your page or component will be injected.</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 MyPage
 {
     @Inject
     private Logger logger;
@@ -79,7 +89,9 @@
     {
         logger.info("Changes saved successfully");
     }
-</plain-text-body><h1 id="Logging-@Logannotation">@Log annotation</h1><p>You may mark any component method with the @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Log.html">Log</a> annotation. Method entry, exit (and any thrown exceptions) will be logged at DEBUG level, along with parameter values and the method's return value. This is very convenient for debugging, especially when placed on event handler methods.</p><h1 id="Logging-ComponentTransformationDebugging">Component Transformation Debugging</h1><p>Tapestry performs a transformation on your classes as they are loaded, and sometimes you want to gain insight into what it has done. Tapestry uses a secondary logger, consisting of the class name with the prefix "tapestry.transformer.", to log (at debug level) the results of transforming the class.</p><p>Example:</p><plain-text-body>[DEBUG] Index // class version 49.0 (49)
+</pre>
+</div></div><h1 id="Logging-@Logannotation">@Log annotation</h1><p>You may mark any component method with the @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Log.html">Log</a> annotation. Method entry, exit (and any thrown exceptions) will be logged at DEBUG level, along with parameter values and the method's return value. This is very convenient for debugging, especially when placed on event handler methods.</p><h1 id="Logging-ComponentTransformationDebugging">Component Transformation Debugging</h1><p>Tapestry performs a transformation on your classes as they are loaded, and sometimes you want to gain insight into what it has done. Tapestry uses a secondary logger, consisting of the class name with the prefix "tapestry.transformer.", to log (at debug level) the results of transforming the class.</p><p>Example:</p><div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
+<pre>[DEBUG] Index // class version 49.0 (49)
 // access flags 0x11
 public final class org/apache/tapestry5/integration/app1/pages/Index$Invocation_containingPageDidLoad_123fd9264de3fa20 extends org/apache/tapestry5/internal/plastic/AbstractMethodInvocation  implements org/apache/tapestry5/plastic/MethodInvocation  {
 
@@ -103,12 +115,16 @@ public final class org/apache/tapestry5/
 
 
   . . .
-</plain-text-body><p>Essentially, this output is a dissasembly of the bytecode transformed or created by Tapestry for the component. Is this helpful? Probably only if you are developing your own code that integrates into the component class transformation chain; for example, to support your own field and method annotations, and even then, not as much in Tapestry 5.3 as in earlier versions of Tapestry (because of the introduction of the plastic library).</p><h1 id="Logging-ComponentEventDebugging">Component Event Debugging</h1><p>Tapestry can also debug component event logic. The component's logger, with a "tapestry.events." prefix, is used at debug level. The debugging output identifies the event name and event source, and identifies any methods that are invoked.</p><p>Note that events that are not handled by a component will bubble up to the component's container; further logging for the same event will occur using the logger associated with the container. The page containing the i
 nitial component is the final step when logging.</p><p>Examples:</p><plain-text-body>[DEBUG] ActionLink Dispatch event: ComponentEvent[action from (self)]
+</pre>
+</div></div><p>Essentially, this output is a dissasembly of the bytecode transformed or created by Tapestry for the component. Is this helpful? Probably only if you are developing your own code that integrates into the component class transformation chain; for example, to support your own field and method annotations, and even then, not as much in Tapestry 5.3 as in earlier versions of Tapestry (because of the introduction of the plastic library).</p><h1 id="Logging-ComponentEventDebugging">Component Event Debugging</h1><p>Tapestry can also debug component event logic. The component's logger, with a "tapestry.events." prefix, is used at debug level. The debugging output identifies the event name and event source, and identifies any methods that are invoked.</p><p>Note that events that are not handled by a component will bubble up to the component's container; further logging for the same event will occur using the logger associated with the container. The page containing the initial
  component is the final step when logging.</p><p>Examples:</p><div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
+<pre>[DEBUG] ActionLink Dispatch event: ComponentEvent[action from (self)]
 [DEBUG] ActionDemo Dispatch event: ComponentEvent[action from actionlink]
 [DEBUG] ActionDemo Invoking: org.apache.tapestry5.integration.app1.pages.nested.ActionDemo.onAction(java.lang.Long) (at ActionDemo.java:28)
 [DEBUG] ActionDemo Dispatch event: ComponentEvent[passivate from (self)]
 [DEBUG] ActionDemo Invoking: org.apache.tapestry5.integration.app1.pages.nested.ActionDemo.onPassivate() (at ActionDemo.java:38)
-</plain-text-body><h1 id="Logging-RenderQueueDebugging">Render Queue Debugging</h1><p>Occasionally it is useful to get debugging output of all the steps involved in rendering a page. In Tapestry, rendering involves a series of rendering commands passed through a rendering queue (most commands will operate by queuing up additional commands). A rendering command may represent an element or attribute from a component template, or some template text, or it may represent one render phase when rendering a component.</p><p>The logger is the page's logger prefixed with "tapestry.render.".</p><p>This debugging is most useful when you get a rendering exception about unbalanced open and close tags.</p><p>Most logging is at the trace level, except for a debug-level entry at the end identifying the number of commands and the elapsed time.</p><plain-text-body>  . . .
+</pre>
+</div></div><h1 id="Logging-RenderQueueDebugging">Render Queue Debugging</h1><p>Occasionally it is useful to get debugging output of all the steps involved in rendering a page. In Tapestry, rendering involves a series of rendering commands passed through a rendering queue (most commands will operate by queuing up additional commands). A rendering command may represent an element or attribute from a component template, or some template text, or it may represent one render phase when rendering a component.</p><p>The logger is the page's logger prefixed with "tapestry.render.".</p><p>This debugging is most useful when you get a rendering exception about unbalanced open and close tags.</p><p>Most logging is at the trace level, except for a debug-level entry at the end identifying the number of commands and the elapsed time.</p><div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
+<pre>  . . .
   
 [TRACE] ActionDemo Executing: Text[Apache Software Foundation]
 [TRACE] ActionDemo Executing: End
@@ -137,7 +153,8 @@ public final class org/apache/tapestry5/
 [TRACE] ActionDemo Executing: CleanupRender[nested/ActionDemo]
 [TRACE] ActionDemo Executing: org.apache.tapestry5.internal.structure.ComponentPageElementImpl$1@7efc0795
 [DEBUG] ActionDemo Executed 276 rendering commands (max queue depth: 141) in 0.025 seconds
-</plain-text-body></div>
+</pre>
+</div></div></div>
       </div>
 
       <div class="clearer"></div>

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 Wed Sep 20 12:29:16 2017
@@ -27,6 +27,16 @@
       </title>
   <link type="text/css" rel="stylesheet" href="/resources/space.css" />
 
+          <link href='/resources/highlighter/styles/shCoreCXF.css' rel='stylesheet' type='text/css' />
+    <link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet' type='text/css' />
+    <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
+        <script>
+      SyntaxHighlighter.defaults['toolbar'] = false;
+      SyntaxHighlighter.all();
+    </script>
   
   <link href="/styles/style.css" rel="stylesheet" type="text/css"/>
 
@@ -67,7 +77,8 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><plain-text-body>{scrollbar}</plain-text-body><h2 id="MavenSupportFAQ-MavenSupport">Maven Support</h2><h3 id="MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why do Maven project names and other details show up in my pages?</h3><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><parameter ac:name="language">xml</parameter><parameter ac:name="title">pom.xml (partial)</parameter><plain
 -text-body>  &lt;resource&gt;
+                <div id="ConfluenceContent"><h2 id="MavenSupportFAQ-MavenSupport">Maven Support</h2><h3 id="MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why do Maven project names and other details show up in my pages?</h3><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 class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">  &lt;resource&gt;
     &lt;directory&gt;src/main/resources&lt;/directory&gt;
     &lt;excludes&gt;
       &lt;exclude&gt;**/*.tml&lt;/exclude&gt;
@@ -82,7 +93,8 @@
     &lt;/includes&gt;
     &lt;filtering&gt;false&lt;/filtering&gt;
   &lt;/resource&gt;
-</plain-text-body><plain-text-body>{scrollbar}</plain-text-body></div>
+</pre>
+</div></div></div>
       </div>
 
       <div class="clearer"></div>

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 Wed Sep 20 12:29:16 2017
@@ -27,6 +27,17 @@
       </title>
   <link type="text/css" rel="stylesheet" href="/resources/space.css" />
 
+          <link href='/resources/highlighter/styles/shCoreCXF.css' rel='stylesheet' type='text/css' />
+    <link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet' type='text/css' />
+    <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushJScript.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
+        <script>
+      SyntaxHighlighter.defaults['toolbar'] = false;
+      SyntaxHighlighter.all();
+    </script>
   
   <link href="/styles/style.css" rel="stylesheet" type="text/css"/>
 
@@ -67,7 +78,8 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p><plain-text-body>{scrollbar}</plain-text-body></p><parameter ac:name="hidden">true</parameter><parameter ac:name="atlassian-macro-output-type">BLOCK</parameter><rich-text-body><p>Adding an Annotation and a Filter to customize Tapestry's page rendering</p></rich-text-body><h1 id="Meta-ProgrammingPageContent-Meta-ProgrammingPageContent">Meta-Programming Page Content</h1><p>It is likely that you have some cross-cutting concerns across your pages, specific features you would like to "mix in" to your pages without getting tied into knots by inheritance. This is one of those areas where Tapestry shines.</p><p>This specific example is adapted from a real client requirement: the client was concerned about other sites wrapping his content in a frameset and making the site content appear to be theirs. Not all pages (in some cases, that would be an advantage) but specific pages in the application. For those pages, the following behaviors were requ
 ired:</p><ul><li>Set the X-Frame-Options response header to "DENY"</li><li>Include JavaScript to "pop" the page out of a frame, if in one</li></ul><p>Again, this <em>could</em> be done by having a specific base-class that included a <code>beginRender()</code> method, but the meta-programming approach is nearly as easy and much more flexible.</p><h2 id="Meta-ProgrammingPageContent-ComponentMeta-Data">Component Meta-Data</h2><p>In Tapestry, every component (and remember, pages are components) has <em>meta data</em>: an extra set of key/value pairs stored in the component's <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ComponentResources.html">ComponentResources</a>.</p><p>By hooking into the component class transformation pipeline, we can change an annotation into meta-data that can be accessed by a filter.</p><h2 id="Meta-ProgrammingPageContent-DefiningtheAnnotation">Defining the Annotation</h2><parameter ac:name="language">java</para
 meter><parameter ac:name="title">ForbidFraming.java</parameter><plain-text-body>package com.fnord.annotations;
+                <div id="ConfluenceContent"><h1 id="Meta-ProgrammingPageContent-Meta-ProgrammingPageContent">Meta-Programming Page Content</h1><p>It is likely that you have some cross-cutting concerns across your pages, specific features you would like to "mix in" to your pages without getting tied into knots by inheritance. This is one of those areas where Tapestry shines.</p><p>This specific example is adapted from a real client requirement: the client was concerned about other sites wrapping his content in a frameset and making the site content appear to be theirs. Not all pages (in some cases, that would be an advantage) but specific pages in the application. For those pages, the following behaviors were required:</p><ul><li>Set the X-Frame-Options response header to "DENY"</li><li>Include JavaScript to "pop" the page out of a frame, if in one</li></ul><p>Again, this <em>could</em> be done by having a specific base-class that included a <code>beginRender()</code> method, but the
  meta-programming approach is nearly as easy and much more flexible.</p><h2 id="Meta-ProgrammingPageContent-ComponentMeta-Data">Component Meta-Data</h2><p>In Tapestry, every component (and remember, pages are components) has <em>meta data</em>: an extra set of key/value pairs stored in the component's <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ComponentResources.html">ComponentResources</a>.</p><p>By hooking into the component class transformation pipeline, we can change an annotation into meta-data that can be accessed by a filter.</p><h2 id="Meta-ProgrammingPageContent-DefiningtheAnnotation">Defining the Annotation</h2><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ForbidFraming.java</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.fnord.annotations;
 
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
@@ -86,7 +98,9 @@ import java.lang.annotation.Target;
 public @interface ForbidFraming {
 
 }
-</plain-text-body><p>This annotation presence is all that's needed; there aren't any additional attributes to configure it.</p><h2 id="Meta-ProgrammingPageContent-ConvertingtheAnnotationintoMeta-Data">Converting the Annotation into Meta-Data</h2><p>This is in three parts:</p><ul><li>Define the meta-data key, and define a constant for that key</li><li>Set a default meta-data value for the key</li><li>Set a different value for the key when the annotation is present</li></ul><p>Our key is just "forbid-framing", with values "true" and "false". The default is "false".</p><h3 id="Meta-ProgrammingPageContent-DefiningtheConstant">Defining the Constant</h3><parameter ac:name="language">java</parameter><parameter ac:name="title">FnordSymbols.java</parameter><plain-text-body>package com.fnord;
+</pre>
+</div></div><p>This annotation presence is all that's needed; there aren't any additional attributes to configure it.</p><h2 id="Meta-ProgrammingPageContent-ConvertingtheAnnotationintoMeta-Data">Converting the Annotation into Meta-Data</h2><p>This is in three parts:</p><ul><li>Define the meta-data key, and define a constant for that key</li><li>Set a default meta-data value for the key</li><li>Set a different value for the key when the annotation is present</li></ul><p>Our key is just "forbid-framing", with values "true" and "false". The default is "false".</p><h3 id="Meta-ProgrammingPageContent-DefiningtheConstant">Defining the Constant</h3><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>FnordSymbols.java</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.fnord;
 
 import org.apache.tapestry5.services.BaseURLSource;
 
@@ -104,7 +118,9 @@ public class FnordSymbols {
   public static final String FORBID_FRAMING = "forbid-framing";
 
 }
-</plain-text-body><h3 id="Meta-ProgrammingPageContent-SettingtheMeta-DataDefault">Setting the Meta-Data Default</h3><p>Next, we'll create a module just for the logic directly related to framing. In the module, we'll define the default value for the meta-data.</p><parameter ac:name="language">java</parameter><parameter ac:name="title">ForbidFramingModule.class</parameter><plain-text-body>package com.fnord.services.forbidframing;
+</pre>
+</div></div><h3 id="Meta-ProgrammingPageContent-SettingtheMeta-DataDefault">Setting the Meta-Data Default</h3><p>Next, we'll create a module just for the logic directly related to framing. In the module, we'll define the default value for the meta-data.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ForbidFramingModule.class</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.fnord.services.forbidframing;
 
 import org.apache.tapestry5.ioc.MappedConfiguration;
 import org.apache.tapestry5.ioc.annotations.Contribute;
@@ -122,20 +138,26 @@ public class ForbidFramingModule {
     configuration.add(FnordSymbols.FORBID_FRAMING, "false");
   }
 }
-</plain-text-body><h3 id="Meta-ProgrammingPageContent-MappingtheAnnotation">Mapping the Annotation</h3><p>Most of the work has already been done for us: we just have to make a contribution to the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/MetaWorker.html">MetaWorker</a> service, which is already plugged into the component class transformation pipeline. MetaWorker spots the annotations we define and uses a second object, a <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/MetaDataExtractor.html">MetaDataExtractor</a> we provide, to convert the annotation into a meta-data value.</p><parameter ac:name="language">java</parameter><parameter ac:name="lang">java</parameter><parameter ac:name="title">ForbidFramingModule.java (partial)</parameter><plain-text-body>  @Contribute(MetaWorker.class)
+</pre>
+</div></div><h3 id="Meta-ProgrammingPageContent-MappingtheAnnotation">Mapping the Annotation</h3><p>Most of the work has already been done for us: we just have to make a contribution to the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/MetaWorker.html">MetaWorker</a> service, which is already plugged into the component class transformation pipeline. MetaWorker spots the annotations we define and uses a second object, a <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/MetaDataExtractor.html">MetaDataExtractor</a> we provide, to convert the annotation into a meta-data value.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ForbidFramingModule.java (partial)</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">  @Contribute(MetaWorker.class)
   public static void mapAnnotationsToMetaDataValue(
       MappedConfiguration&lt;Class, MetaDataExtractor&gt; configuration) {
     configuration
         .add(ForbidFraming.class, new FixedExtractor&lt;ForbidFraming&gt;(
             FnordSymbols.FORBID_FRAMING));
   }
-</plain-text-body><p>If the ForbidFraming annotation had attributes, we would have provided an implementation of MetaDataExtractor that examined those attributes to set the meta-data value. Since it has no attributes, the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/FixedExtractor.html">FixedExtractor</a> class can be used. The argument is the meta-data key, and the default value is "true".</p><h2 id="Meta-ProgrammingPageContent-PluggingIntoPageRendering">Plugging Into Page Rendering</h2><p>The work we ultimately want to do occurs when rendering a page. Tapestry defines a <a  href="pipelinebuilder-service.html">pipeline</a> for that overall process. The point of a pipeline is that we can add filters to it. We'll add a filter that checks for the meta-data key and adds the response header and JavaScript.</p><p>The service is <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/s
 ervices/MarkupRenderer.html">MarkupRenderer</a>, which (being a pipeline service), takes a configuration of filters (in this case, <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MarkupRendererFilter.html">MarkupRendererFilter</a>.</p><p>We contribute into the pipeline; the order is important: since the filter will need to write JavaScript, it must be added <em>after</em> the built-in filter that provides the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/JavaScriptSupport.html">JavaScriptSupport</a> environmental object.</p><parameter ac:name="language">java</parameter><parameter ac:name="lang">java</parameter><parameter ac:name="title">ForbidFramingModule.java (partial)</parameter><plain-text-body>  @Contribute(MarkupRenderer.class)
+</pre>
+</div></div><p>If the ForbidFraming annotation had attributes, we would have provided an implementation of MetaDataExtractor that examined those attributes to set the meta-data value. Since it has no attributes, the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/FixedExtractor.html">FixedExtractor</a> class can be used. The argument is the meta-data key, and the default value is "true".</p><h2 id="Meta-ProgrammingPageContent-PluggingIntoPageRendering">Plugging Into Page Rendering</h2><p>The work we ultimately want to do occurs when rendering a page. Tapestry defines a <a  href="pipelinebuilder-service.html">pipeline</a> for that overall process. The point of a pipeline is that we can add filters to it. We'll add a filter that checks for the meta-data key and adds the response header and JavaScript.</p><p>The service is <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/service
 s/MarkupRenderer.html">MarkupRenderer</a>, which (being a pipeline service), takes a configuration of filters (in this case, <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MarkupRendererFilter.html">MarkupRendererFilter</a>.</p><p>We contribute into the pipeline; the order is important: since the filter will need to write JavaScript, it must be added <em>after</em> the built-in filter that provides the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/JavaScriptSupport.html">JavaScriptSupport</a> environmental object.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ForbidFramingModule.java (partial)</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">  @Contribute(MarkupRenderer.class)
   public static void addFilter(
       OrderedConfiguration&lt;MarkupRendererFilter&gt; configuration) {
     configuration.addInstance("ForbidFraming", ForbidFramingFilter.class,
         "after:JavascriptSupport");
   }
-</plain-text-body><p>How do you know what filters are built-in and where to add your own? The right starting point is the JavaDoc for the method of TapestryModule that contributes the base set: <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/modules/TapestryModule.html">contributeMarkupRenderer()</a></p><h2 id="Meta-ProgrammingPageContent-ImplementingtheFilter">Implementing the Filter</h2><p>Everything comes together in the filter:</p><parameter ac:name="language">java</parameter><parameter ac:name="title">ForbidFramingFilter.java</parameter><plain-text-body>package com.fnord.services.forbidframing;
+</pre>
+</div></div><p>How do you know what filters are built-in and where to add your own? The right starting point is the JavaDoc for the method of TapestryModule that contributes the base set: <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/modules/TapestryModule.html">contributeMarkupRenderer()</a></p><h2 id="Meta-ProgrammingPageContent-ImplementingtheFilter">Implementing the Filter</h2><p>Everything comes together in the filter:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ForbidFramingFilter.java</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.fnord.services.forbidframing;
 
 import org.apache.tapestry5.MarkupWriter;
 import org.apache.tapestry5.ioc.annotations.Inject;
@@ -183,13 +205,16 @@ public class ForbidFramingFilter impleme
   }
 
 }
-</plain-text-body><p>There's a bit going on in this short piece of code. The heart of the code is the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MetaDataLocator.html">MetaDataLocator</a> service; given a meta-data key and a page name, it can not only extract the value, but then <a  href="ioc-coerce.html">coerce</a> it to a desired type, all in one go.</p><p>How do we know which page is being rendered? Before Tapestry 5.2 that was a small challenge, but 5.2 adds a method to <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/RequestGlobals.html#getActivePageName()">RequestGlobals</a> for this exact purpose.</p><p>Both Request and JavaScriptSupport are per-thread/per-request services. You don't see that here, because that's part of the service definition, and invisible to the consumer code, as here.</p><p>Of course, it is vitally important that the filter re-invoke <code>
 markup()</code> on the next renderer in the pipeline (you can see that as the last line of the method).</p><p>This code makes one assumption: that the fnord application's Layout component added fnord.js to every page. That's necessary for the JavaScript that's added:</p><parameter ac:name="language">js</parameter><parameter ac:name="lang">javascript</parameter><parameter ac:name="title">fnord.js (partial)</parameter><plain-text-body>Fnord = {
+</pre>
+</div></div><p>There's a bit going on in this short piece of code. The heart of the code is the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MetaDataLocator.html">MetaDataLocator</a> service; given a meta-data key and a page name, it can not only extract the value, but then <a  href="ioc-coerce.html">coerce</a> it to a desired type, all in one go.</p><p>How do we know which page is being rendered? Before Tapestry 5.2 that was a small challenge, but 5.2 adds a method to <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/RequestGlobals.html#getActivePageName()">RequestGlobals</a> for this exact purpose.</p><p>Both Request and JavaScriptSupport are per-thread/per-request services. You don't see that here, because that's part of the service definition, and invisible to the consumer code, as here.</p><p>Of course, it is vitally important that the filter re-invoke <code>markup
 ()</code> on the next renderer in the pipeline (you can see that as the last line of the method).</p><p>This code makes one assumption: that the fnord application's Layout component added fnord.js to every page. That's necessary for the JavaScript that's added:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>fnord.js (partial)</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: js; gutter: false; theme: Default" style="font-size:12px;">Fnord = {
   popOutOfFrame : function() {
     if (top != self)
       top.location.replace(location);
   }
 }
-</plain-text-body><h2 id="Meta-ProgrammingPageContent-Conclusion">Conclusion</h2><p>That's it: with the above code, simply adding the @ForbidFraming annotation to a page will add the response header and associated JavaScript; no inheritance hassles. This basic pattern can be applied to a wide range of cross-cutting concerns, such as security, transaction management, logging, or virtually any other kind of situation that would normally be solved with inheritance or ugly boilerplate code.</p><rich-text-body><p>The code in this example was designed for Tapestry version 5.2 and later.</p></rich-text-body></div>
+</pre>
+</div></div><h2 id="Meta-ProgrammingPageContent-Conclusion">Conclusion</h2><p>That's it: with the above code, simply adding the @ForbidFraming annotation to a page will add the response header and associated JavaScript; no inheritance hassles. This basic pattern can be applied to a wide range of cross-cutting concerns, such as security, transaction management, logging, or virtually any other kind of situation that would normally be solved with inheritance or ugly boilerplate code.</p><div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>The code in this example was designed for Tapestry version 5.2 and later.</p></div></div></div>
       </div>
 
       <div class="clearer"></div>

Modified: websites/production/tapestry/content/object-providers.html
==============================================================================
--- websites/production/tapestry/content/object-providers.html (original)
+++ websites/production/tapestry/content/object-providers.html Wed Sep 20 12:29:16 2017
@@ -27,6 +27,14 @@
       </title>
   <link type="text/css" rel="stylesheet" href="/resources/space.css" />
 
+          <link href='/resources/highlighter/styles/shCoreCXF.css' rel='stylesheet' type='text/css' />
+    <link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet' type='text/css' />
+    <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
+          <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
+        <script>
+      SyntaxHighlighter.defaults['toolbar'] = false;
+      SyntaxHighlighter.all();
+    </script>
   
   <link href="/styles/style.css" rel="stylesheet" type="text/css"/>
 
@@ -36,26 +44,13 @@
 
   <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">Object Providers</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">Object Providers</h1></div></div>
       <div class="clearer"></div>
       </div>
 
@@ -67,16 +62,22 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p>When you don't provide the @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/InjectService.html">InjectService</a> annotation on a parameter (to a service builder method or constructor), Tapestry will resolve the parameter automatically.</p><p>This is called <em>object injection</em>, rather than <em>service injection</em>, because the value that will ultimately be injected is not necessarily a service; it may be some arbitrary object.</p><p>If this sounds vague, its because there is not just one <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ObjectProvider.html">ObjectProvider</a>; there's a whole set of them, forming a <a  href="chainbuilder-service.html">chain of command</a>. The commands in the chain may provide an object based on the parameter type, or based on additional annotations on the parameter.</p><p>There are 
 several built-in object providers:</p><ul><li>Check for @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Value.html">Value</a> annotation</li><li>Check for @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Symbol.html">Symbol</a> annotation</li><li>Check for a <em>unique</em> service in the Registry whose service interface matches the parameter type<br clear="none"> Usually, the @Inject annotation is supplemented by an additional annotation which triggers a specific ObjectProvider to provide the value.</li></ul><h1 id="ObjectProviders-@ValueAnnotationProvider">@Value Annotation Provider</h1><p>The Value annotation allows a literal value to be injected. When combined with <a  href="symbols.html">symbols</a>, they represent a way for parts of the overall service network to be spot-configured. For example:</p><parameter ac:name="">java</parameter><plain-text-bo
 dy>  public MyService build(@Value("${max-seconds}") long maxSeconds)
+                <div id="ConfluenceContent"><p>When you don't provide the @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/InjectService.html">InjectService</a> annotation on a parameter (to a service builder method or constructor), Tapestry will resolve the parameter automatically.</p><p>This is called <em>object injection</em>, rather than <em>service injection</em>, because the value that will ultimately be injected is not necessarily a service; it may be some arbitrary object.</p><p>If this sounds vague, its because there is not just one <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ObjectProvider.html">ObjectProvider</a>; there's a whole set of them, forming a <a  href="chainbuilder-service.html">chain of command</a>. The commands in the chain may provide an object based on the parameter type, or based on additional annotations on the parameter.</p><p>There are 
 several built-in object providers:</p><ul><li>Check for @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Value.html">Value</a> annotation</li><li>Check for @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Symbol.html">Symbol</a> annotation</li><li>Check for a <em>unique</em> service in the Registry whose service interface matches the parameter type<br clear="none"> Usually, the @Inject annotation is supplemented by an additional annotation which triggers a specific ObjectProvider to provide the value.</li></ul><h1 id="ObjectProviders-@ValueAnnotationProvider">@Value Annotation Provider</h1><p>The Value annotation allows a literal value to be injected. When combined with <a  href="symbols.html">symbols</a>, they represent a way for parts of the overall service network to be spot-configured. For example:</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 MyService build(@Value("${max-seconds}") long maxSeconds)
   {
     return new MyServiceImpl(maxSeconds);
-  }</plain-text-body><p>Here, the MyService service requires a configuration of a number of seconds. The value is supplied as a symbol, with a factory default that may be overwritten with an application default.</p><p>Usually, the symbol reference is only part of the string, i.e. <code>@Value("${report.dir}/${report.name}.txt")</code></p><h1 id="ObjectProviders-@SymbolAnnotationProvider">@Symbol Annotation Provider</h1><p>This is closely related to the @Value annotation approach, except that the annotation directly specifies a symbol name.</p><parameter ac:name="">java</parameter><plain-text-body>  public MyService build(@Symbol("max-seconds") long maxSeconds)
+  }</pre>
+</div></div><p>Here, the MyService service requires a configuration of a number of seconds. The value is supplied as a symbol, with a factory default that may be overwritten with an application default.</p><p>Usually, the symbol reference is only part of the string, i.e. <code>@Value("${report.dir}/${report.name}.txt")</code></p><h1 id="ObjectProviders-@SymbolAnnotationProvider">@Symbol Annotation Provider</h1><p>This is closely related to the @Value annotation approach, except that the annotation directly specifies a symbol name.</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 MyService build(@Symbol("max-seconds") long maxSeconds)
   {
     return new MyServiceImpl(maxSeconds);
-  }</plain-text-body><h1 id="ObjectProviders-ServiceProvider">Service Provider</h1><p>This is always that last object provider checked.</p><p>A <em>single</em> service must exist whose service interface matches the parameter type. This is <em>not</em> an exact match: a search is made for any and all services whose service interface is a super class of the parameter type.</p><p>An exception is thrown if there are no matches, or if there are multiple matches.</p><h1 id="ObjectProviders-AliasObjectProvider">Alias Object Provider</h1><p>The tapestry-core module defines the <a  href="aliases.html">Alias object provider</a>, which is used as a way to override services or disambiguate services (when multiple services implement the same interface).</p><h1 id="ObjectProviders-DefiningNewProviders">Defining New Providers</h1><p>New providers can be specified by contributing to the MasterObjectProvider service's configuration. The configuration is mapped, with the keys being the provider prefi
 x, and the values being the object provider implementation.</p><p>Example:</p><parameter ac:name="">java</parameter><plain-text-body>  public void contributeMasterObjectProvider(OrderedConfiguration&lt;ObjectProvider&gt; configuration)
+  }</pre>
+</div></div><h1 id="ObjectProviders-ServiceProvider">Service Provider</h1><p>This is always that last object provider checked.</p><p>A <em>single</em> service must exist whose service interface matches the parameter type. This is <em>not</em> an exact match: a search is made for any and all services whose service interface is a super class of the parameter type.</p><p>An exception is thrown if there are no matches, or if there are multiple matches.</p><h1 id="ObjectProviders-AliasObjectProvider">Alias Object Provider</h1><p>The tapestry-core module defines the <a  href="aliases.html">Alias object provider</a>, which is used as a way to override services or disambiguate services (when multiple services implement the same interface).</p><h1 id="ObjectProviders-DefiningNewProviders">Defining New Providers</h1><p>New providers can be specified by contributing to the MasterObjectProvider service's configuration. The configuration is mapped, with the keys being the provider prefix, and th
 e values being the object provider implementation.</p><p>Example:</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 void contributeMasterObjectProvider(OrderedConfiguration&lt;ObjectProvider&gt; configuration)
   {
     configuration.add("MyObject", new MyObjectProvider());
-  }</plain-text-body><p>This establishes a name for the object provider (useful if the exact order of execution of the provider, relative to other providers, is relevant).</p><p>Of course, this is a simplified example. In a real scenario, the provider is most likely a service with its own dependencies.</p><p>&#160;</p><p></p></div>
+  }</pre>
+</div></div><p>This establishes a name for the object provider (useful if the exact order of execution of the provider, relative to other providers, is relevant).</p><p>Of course, this is a simplified example. In a real scenario, the provider is most likely a service with its own dependencies.</p><p>&#160;</p><p></p></div>
       </div>
 
       <div class="clearer"></div>

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 Wed Sep 20 12:29:16 2017
@@ -36,26 +36,13 @@
 
   <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">Ordering by Constraints</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">Ordering by Constraints</h1></div></div>
       <div class="clearer"></div>
       </div>
 
@@ -67,7 +54,7 @@
       </div>
 
       <div id="content">
-                <div id="ConfluenceContent"><p>Tapestry IoC has two specific areas where it must put some form of contribution into a specific order:</p><ul><li><a  href="tapestry-ioc-configuration.html">Ordered Configurations</a>, where different modules may contribute into a service's configuration</li><li><a  href="tapestry-ioc-decorators.html">Service Decorators</a> which must be applied to services from a number of modules.<br clear="none"> In both these cases, objects (either contributions to a configuration, or decorators) are assigning qualified IDs, simple IDs qualified with the containing/contributing module's ID.</li></ul><p>Because the contributions can come from different modules, and there isn't a specific order in which the service contribution methods are invoked, there is no natural ordering of the contributed objects.</p><p>To resolve this, <em>constraints</em> are applied to each contribution. These constraints control what other objects must come before a contrib
 ution or after it.</p><p>The constraints are specified using the @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Order.html">Order</a> annotation (for service decorator methods), or as variable arguments at the end of the add() method for ordered configurations.</p><p>Often a single contribution will have more than one constraint.</p><h1 id="OrderingbyConstraints-ConstraintTypes">Constraint Types</h1><p>Each constraint string begins with a prefix, <code>before:</code> or <code>after:</code>, used to identify the type of constraint.</p><p>The remainder of the constraint string is a comma-separated list of <em>patterns</em>. The contributed object will be ordered before or after the contributions identified by the patterns.</p><p><parameter ac:name="">Match_Patterns</parameter></p><h1 id="OrderingbyConstraints-ConstraintMatchPatterns">Constraint Match Patterns</h1><p>A constraint match pattern is used to select one or mo
 re objects by their ID.</p><p>Match patterns support a very simple kind of wildcard matching. A <code>*</code> (asterisk character) may appear at the start and/or end of the pattern, and it will match zero or more characters there. Thus you can have patterns such as <code>Data*</code> or <code>*Logic</code> or even <code>*User*</code>.</p><p>Matching is <a  href="case-insensitivity.html">case insensitive</a>.</p><p>&#160;</p><p></p></div>
+                <div id="ConfluenceContent"><p>Tapestry IoC has two specific areas where it must put some form of contribution into a specific order:</p><ul><li><a  href="tapestry-ioc-configuration.html">Ordered Configurations</a>, where different modules may contribute into a service's configuration</li><li><a  href="tapestry-ioc-decorators.html">Service Decorators</a> which must be applied to services from a number of modules.<br clear="none"> In both these cases, objects (either contributions to a configuration, or decorators) are assigning qualified IDs, simple IDs qualified with the containing/contributing module's ID.</li></ul><p>Because the contributions can come from different modules, and there isn't a specific order in which the service contribution methods are invoked, there is no natural ordering of the contributed objects.</p><p>To resolve this, <em>constraints</em> are applied to each contribution. These constraints control what other objects must come before a contrib
 ution or after it.</p><p>The constraints are specified using the @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Order.html">Order</a> annotation (for service decorator methods), or as variable arguments at the end of the add() method for ordered configurations.</p><p>Often a single contribution will have more than one constraint.</p><h1 id="OrderingbyConstraints-ConstraintTypes">Constraint Types</h1><p>Each constraint string begins with a prefix, <code>before:</code> or <code>after:</code>, used to identify the type of constraint.</p><p>The remainder of the constraint string is a comma-separated list of <em>patterns</em>. The contributed object will be ordered before or after the contributions identified by the patterns.</p><p><span class="confluence-anchor-link" id="OrderingbyConstraints-Match_Patterns"></span></p><h1 id="OrderingbyConstraints-ConstraintMatchPatterns">Constraint Match Patterns</h1><p>A constraint mat
 ch pattern is used to select one or more objects by their ID.</p><p>Match patterns support a very simple kind of wildcard matching. A <code>*</code> (asterisk character) may appear at the start and/or end of the pattern, and it will match zero or more characters there. Thus you can have patterns such as <code>Data*</code> or <code>*Logic</code> or even <code>*User*</code>.</p><p>Matching is <a  href="case-insensitivity.html">case insensitive</a>.</p><p>&#160;</p><p></p></div>
       </div>
 
       <div class="clearer"></div>