| <chapter id="inspector"> |
| <title>The Tapestry Inspector</title> |
| <para> |
| Unlike scripting systems (such as JavaServer Pages and the like), Tapestry applications are gifted |
| with a huge amount of information about how they are implemented. The same component |
| object model that allows Tapestry to perform so many ordinary functions can be leveraged to |
| provide some unusual functionality. |
| </para> |
| <para> |
| Run the Border tutorial from the previous chapter and click on the show inspector button (the |
| gear icon in the lower right corner). A new window will launch, containing the Inspector: |
| </para> |
| <figure> |
| <title>Tapestry Inspector</title> |
| <mediaobject> |
| <imageobject> |
| <imagedata fileref="images/Inspector-Spec.jpg" format="JPEG"/> |
| </imageobject> |
| </mediaobject> |
| </figure> |
| <para> |
| The Inspector displays live information from the running application; in fact, it is simply another |
| part of the application (the drop-down list of pages will include the Inspector page itself). The |
| Inspector is most often used to debug HTML generation by viewing the HTML templates. |
| It is also very useful in debugging problems where the wrong data is displayed, since it |
| allows the developer to navigate to the particular components and see directly what properties |
| are used. |
| </para> |
| <section id="inspector.navigation"> |
| <title>Navigation</title> |
| <para> |
| The inspector allows the user to navigate to any page and any component on a page. |
| The drop down list in the upper left corner lists all pages in the application; changing |
| the selection immediately updates the Inspector. |
| </para> |
| <para>Next to the drop down list is the component path; a list of nested component ids, starting |
| with "page" to represent the page. Clicking on any id in the path changes the information displayed |
| below. |
| </para> |
| <para> |
| Underneath the component navigation tools are a set of tab buttons for the different |
| inspector views. |
| </para> |
| </section> |
| <section id="inspector.specification"> |
| <title>Specification View</title> |
| <figure> |
| <title>Specification View</title> |
| <mediaobject> |
| <imageobject> |
| <imagedata fileref="images/Inspector-Spec.jpg" format="JPEG"/> |
| </imageobject> |
| </mediaobject> |
| </figure> |
| <para> |
| The specification view shows several sets of information about the selected component. |
| </para> |
| <para> |
| First shown are basic properties, such as the specification path and Java class. |
| </para> |
| <para> |
| Each formal parameter is displayed. Unbound parameters will show no value in |
| the Binding column. |
| </para> |
| <para> |
| Beneath formal parameters are informal parameters (the <classname>Border</classname> |
| component has none, so there is nothing to see). Informal parameters are |
| usually mapped directly to HTML attributes. They are most often used with |
| components that generate a single HTML tag, such as the &ActionLink;, |
| &DirectLink; or &TextField; components. |
| </para> |
| <para> |
| If the component contains assets, they are shown next. |
| </para> |
| <para> |
| Any helper beans for the component are displayed last. |
| </para> |
| <para> |
| On the right side is a list of each embedded component and its type. Clicking |
| the component id will navigate to the selected component. |
| </para> |
| </section> |
| <section id="inspector.template"> |
| <title>Template View</title> |
| <figure> |
| <title>Template View</title> |
| <mediaobject> |
| <imageobject> |
| <imagedata fileref="images/Inspector-Template.jpg" format="JPEG"/> |
| </imageobject> |
| </mediaobject> |
| </figure> |
| <para> |
| The template view shows the HTML template for the component. It shows dynamic tags in bold, |
| and makes the component id a clickable link (which navigates to the component, but maintains |
| the Template View). This allows the developer to quickly drill down through the components. |
| </para> |
| </section> |
| <section id="inspector.properties"> |
| <title>Properties View</title> |
| <figure> |
| <title>Properties View</title> |
| <mediaobject> |
| <imageobject> |
| <imagedata fileref="images/Inspector-Properties.jpg" format="JPEG"/> |
| </imageobject> |
| </mediaobject> |
| </figure> |
| <para> |
| The properties view shows persistant properties stored by the page (or any components on |
| the page). Most pages do not store any persistent state (it is more often stored |
| in the application's visit object). |
| </para> |
| </section> |
| <section id="inspector.engine"> |
| <title>Engine View</title> |
| <figure> |
| <title>Engine View</title> |
| <mediaobject> |
| <imageobject> |
| <imagedata fileref="images/Inspector-Engine.jpg" format="JPEG"/> |
| </imageobject> |
| </mediaobject> |
| </figure> |
| <para> |
| The engine view shows information about the running application engine, as well as some details |
| from the application specification. |
| </para> |
| <para> |
| Under Operations are two buttons: the first restarts the application. The |
| second (when enabled |
| <footnote> |
| <para> |
| By default, the reset service (used by the reset button) is disabled. |
| To enable it, set the JVM system property |
| <varname>net.sf.tapestry.enable-reset-service</varname> to true. |
| The service is disabled since it is too tempting a target for a denial |
| of service attack. |
| </para> |
| </footnote>) resets the application, which forces a reload of all component specifications |
| and HTML templates. This is useful during development, since it allows for incremental development |
| without stopping and restarting the servlet container. |
| </para> |
| <para> |
| Below the operations is a binary dump of the application engine. This is useful when |
| developing to see how large the serialized state is, and perhaps gleam how it might be trimmed. |
| </para> |
| <para> |
| Further below (and not visible in the screen shot above), is a dump of the request context. This |
| is that vast amount of data also displayed when an unexpected exception is thrown. |
| </para> |
| </section> |
| <section id="inspector.logging"> |
| <title>Logging View</title> |
| <figure> |
| <title>Logging View (Level Selection)</title> |
| <mediaobject> |
| <imageobject> |
| <imagedata fileref="images/Inspector-Logging.jpg" format="JPEG"/> |
| </imageobject> |
| </mediaobject> |
| </figure> |
| <para> |
| The Logging view allows dynamic integration with the |
| <ulink url="http://jakarta.apache.org/log4j">Log4J</ulink> logging framework. The top half |
| of the page allows the logging level of any category to be |
| dynamically set. This is useful when debugging, since logging output for specific |
| classes |
| <footnote> |
| <para> |
| By convention, logging categories match the complete class name |
| of the corresponding class. All Tapestry logging categories |
| conform to this convention. |
| </para> |
| </footnote> |
| can be individually enabled or disable. |
| </para> |
| <para> |
| The right side is a small second form, allowing new categories to be created. |
| This can be useful to make broad changes in logging levels. For instance, creating |
| a category "net.sf.tapestry" would allow the logging level of all Tapestry classes to be |
| set in a single place. |
| </para> |
| </section> |
| </chapter> |