| <?xml version="1.0"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <xsl:stylesheet version="1.0" |
| xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| xmlns:profile="http://apache.org/cocoon/profiler/1.0"> |
| |
| <xsl:param name="sort"/> |
| <xsl:param name="key"/> |
| <xsl:param name="result"/> |
| <xsl:param name="component"/> |
| |
| <xsl:template match="/"> |
| <html> |
| <head> |
| <title>Cocoon2 profile information [<xsl:value-of select="profile:profilerinfo/@date"/>]</title> |
| </head> |
| <body> |
| <xsl:choose> |
| <xsl:when test="$component!=''"> |
| <xsl:apply-templates |
| select="profile:profilerinfo/profile:pipeline/profile:result/profile:component[@index=$component]" |
| mode="fragment"/> |
| </xsl:when> |
| <xsl:when test="$result!=''"> |
| <xsl:apply-templates select="profile:profilerinfo/profile:pipeline/profile:result" mode="result"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:apply-templates select="profile:profilerinfo" mode="pipelines"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </body> |
| </html> |
| </xsl:template> |
| |
| <xsl:template match="profile:profilerinfo" mode="pipelines"> |
| <xsl:choose> |
| <xsl:when test="not(profile:pipeline)"> |
| <xsl:call-template name="help"/> |
| </xsl:when> |
| <xsl:otherwise> |
| |
| <p> |
| Sort results by <a href="?sort=uri">uri</a>, |
| <a href="?sort=count">count</a>, <a href="?sort=time">time</a>. |
| </p> |
| <p> |
| Start at the section which matches the original request, then follow the |
| processing. The right-hand columns are the times (in milliseconds) for |
| each occasion that a component was processed. The far right column is |
| the initial occasion. |
| </p> |
| |
| |
| <table noshade="noshade" border="0" cellspacing="1" cellpadding="0"> |
| <xsl:choose> |
| <xsl:when test="$sort = 'uri'"> |
| <xsl:apply-templates select="profile:pipeline"> |
| <xsl:sort select="@uri"/> |
| </xsl:apply-templates> |
| </xsl:when> |
| <xsl:when test="$sort = 'time'"> |
| <xsl:apply-templates select="profile:pipeline"> |
| <xsl:sort select="@time" data-type="number"/> |
| </xsl:apply-templates> |
| </xsl:when> |
| <xsl:when test="$sort = 'count'"> |
| <xsl:apply-templates select="profile:pipeline"> |
| <xsl:sort select="@count" data-type="number"/> |
| </xsl:apply-templates> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:apply-templates/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </table> |
| |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| |
| <xsl:template name="help"> |
| <p> |
| The <strong>Cocoon profiler</strong> is a great tool to debug and |
| profile your pipelines.<br /> |
| In order to use it, change the type of the pipeline you want to |
| inspect to "profile-noncaching", like so: |
| </p> |
| <p> |
| <code> |
| <map:pipeline type="profile-noncaching"><br /> |
| ...<br /> |
| </map:pipeline> |
| </code> |
| </p> |
| <p> |
| Once you've done this, and you have sent a couple of requests to |
| the pipeline in question, this page will display useful information |
| about processing and setup time of the individual pipeline components. |
| What's even more interesting, you will be able to view the XML |
| output of all intermediate stages! |
| </p> |
| <p> |
| To make profiling work, the profiler block in Cocoon must be |
| included, and the profiling pipeline type needs to be declared. |
| Lenya provides both by default. |
| </p> |
| <p> |
| For more information, refer to |
| <a href="http://cocoon.apache.org/2.1/userdocs/concepts/profiler.html">the Cocoon documentation</a>. |
| </p> |
| <p> |
| <em><strong>Note:</strong> profiling comes with a substantial |
| performance penalty and should not be left activated on production |
| systems unless you are actively debugging them.</em> |
| </p> |
| </xsl:template> |
| |
| |
| <xsl:template match="profile:pipeline"> |
| <xsl:if test="position() mod 5 = 1"> |
| <tr bgcolor="#FFC0C0"> |
| <th></th> |
| <th>Component</th> |
| <th>Average</th> |
| <th colspan="10">Last Results</th> |
| </tr> |
| </xsl:if> |
| <tr bgcolor="#C0C0FF"> |
| <td colspan="3"> |
| <font face="verdana"><strong><xsl:value-of select="@uri"/></strong></font> |
| (<xsl:value-of select="@count"/> results, |
| total time: <xsl:value-of select="@processingTime"/>, |
| average time: <xsl:value-of select="profile:average/@time"/>) |
| </td> |
| <xsl:for-each select="profile:result"> |
| <td> |
| <a href="?key={../@key}&result={@index}"> |
| <xsl:value-of select="@index"/> |
| </a> |
| </td> |
| </xsl:for-each> |
| </tr> |
| |
| <xsl:for-each select="profile:average/profile:component"> |
| <xsl:variable name="bgcolor"> |
| <xsl:if test="position() mod 2 = 0">#D0D0D0</xsl:if> |
| <xsl:if test="position() mod 2 = 1">#E0E0E0</xsl:if> |
| </xsl:variable> |
| <tr bgcolor="{$bgcolor}"> |
| |
| <xsl:variable name="pos" select="position()"/> |
| <td> |
| <xsl:value-of select="$pos"/> |
| </td> |
| <td> |
| <xsl:value-of select="@role"/> |
| <xsl:text> </xsl:text> |
| <xsl:if test="@source"> |
| <i>src=</i><xsl:value-of select="@source"/> |
| </xsl:if> |
| </td> |
| |
| <xsl:for-each select="../../profile:average/profile:component[position()=$pos]"> |
| <th> |
| <xsl:value-of select="@time"/> |
| </th> |
| </xsl:for-each> |
| |
| <xsl:for-each select="../../profile:result/profile:component[position()=$pos]"> |
| <td> |
| <xsl:value-of select="@time"/> |
| </td> |
| </xsl:for-each> |
| |
| </tr> |
| </xsl:for-each> |
| |
| <xsl:variable name="pos" select="count(profile:average/profile:component)"/> |
| <tr> |
| <td> |
| <xsl:value-of select="$pos+1"/> |
| </td> |
| <td> |
| TOTAL |
| </td> |
| |
| <th> |
| <xsl:value-of select="profile:average/@time"/> |
| </th> |
| |
| <xsl:for-each select="profile:result"> |
| <td> |
| <xsl:value-of select="@time"/> |
| </td> |
| </xsl:for-each> |
| |
| </tr> |
| </xsl:template> |
| |
| <xsl:template match="profile:result" mode="result"> |
| <h1><xsl:value-of select="profile:environmentinfo/profile:uri"/></h1> |
| <table> |
| <tr bgcolor="#FFC0C0"> |
| <th></th> |
| <th>Component</th> |
| <th colspan="3">Elapsed time in ms</th> |
| <th>View source</th> |
| </tr> |
| <tr bgcolor="#C0C0FF"> |
| <td colspan="2"> |
| <font face="verdana"><strong><xsl:value-of select="profile:environmentinfo/profile:uri"/></strong></font> |
| </td> |
| <td>Total</td> |
| <td>Setup</td> |
| <td>Processing</td> |
| <td/> |
| </tr> |
| |
| <xsl:for-each select="profile:component"> |
| <xsl:variable name="bgcolor"> |
| <xsl:if test="position() mod 2 = 0">#D0D0D0</xsl:if> |
| <xsl:if test="position() mod 2 = 1">#E0E0E0</xsl:if> |
| </xsl:variable> |
| <tr bgcolor="{$bgcolor}"> |
| |
| <xsl:variable name="pos" select="position()"/> |
| <td> |
| <xsl:value-of select="$pos"/> |
| </td> |
| <td> |
| <xsl:value-of select="@role"/> |
| <xsl:text> </xsl:text> |
| <xsl:if test="@source"> |
| <i>src=</i><xsl:value-of select="@source"/> |
| </xsl:if> |
| </td> |
| |
| <td> |
| <xsl:value-of select="@time"/> |
| </td> |
| |
| <td> |
| <xsl:value-of select="@setup"/> |
| </td> |
| |
| <td> |
| <xsl:value-of select="@processing"/> |
| </td> |
| |
| <td> |
| <xsl:if test="position() != last()"> |
| <a href="profile.xml?key={$key}&result={$result}&component={@index}&fragmentonly=true">[XML]</a> |
|    |
| <a href="profile.xml?key={$key}&result={$result}&component={@index}&fragmentonly=true&cocoon-view=pretty-content">[XML as HTML]</a> |
| </xsl:if> |
| </td> |
| </tr> |
| </xsl:for-each> |
| </table> |
| <xsl:apply-templates select="profile:environmentinfo"/> |
| </xsl:template> |
| |
| <xsl:template match="profile:environmentinfo"> |
| <xsl:apply-templates select="profile:request-parameters"/> |
| <xsl:apply-templates select="profile:session-attributes"/> |
| </xsl:template> |
| |
| <xsl:template match="profile:request-parameters"> |
| <table> |
| <tr bgcolor="#C0C0FF"> |
| <th colspan="2"> |
| Request parameters |
| </th> |
| </tr> |
| <tr bgcolor="#FFC0C0"> |
| <th>Name</th> |
| <th>Value</th> |
| </tr> |
| <xsl:for-each select="profile:parameter"> |
| <xsl:variable name="bgcolor"> |
| <xsl:if test="position() mod 2 = 0">#D0D0D0</xsl:if> |
| <xsl:if test="position() mod 2 = 1">#E0E0E0</xsl:if> |
| </xsl:variable> |
| |
| <tr bgcolor="{$bgcolor}"> |
| <td><xsl:value-of select="@name"/></td> |
| <td><xsl:value-of select="@value"/></td> |
| </tr> |
| </xsl:for-each> |
| </table> |
| </xsl:template> |
| |
| <xsl:template match="profile:session-attributes"> |
| <table> |
| <tr bgcolor="#C0C0FF"> |
| <th colspan="2"> |
| Session attributes |
| </th> |
| </tr> |
| <tr bgcolor="#FFC0C0"> |
| <th>Name</th> |
| <th>Value</th> |
| </tr> |
| <xsl:for-each select="profile:attribute"> |
| <xsl:variable name="bgcolor"> |
| <xsl:if test="position() mod 2 = 0">#D0D0D0</xsl:if> |
| <xsl:if test="position() mod 2 = 1">#E0E0E0</xsl:if> |
| </xsl:variable> |
| |
| <tr bgcolor="{$bgcolor}"> |
| <td><xsl:value-of select="@name"/></td> |
| <td><xsl:value-of select="@value"/></td> |
| </tr> |
| </xsl:for-each> |
| </table> |
| </xsl:template> |
| |
| </xsl:stylesheet> |