<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkIGSX85eip7ImA9WhdaFk0.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040</id><updated>2011-10-25T20:42:08.122-07:00</updated><category term="logging" /><category term="stax" /><category term="jazz" /><category term="capacity" /><category term="rational" /><category term="javadoc" /><category term="xmlbeans" /><category term="serviceability" /><category term="junit" /><category term="trace" /><category term="pretty" /><category term="unit-testing" /><category term="classpath" /><category term="rdbms" /><category term="export" /><category term="xml-format" /><category term="date" /><category term="command" /><category term="db2" /><category term="auto-boxing" /><category term="dojo-1.2" /><category term="birt" /><category term="splash-screen" /><category term="project-management" /><category term="test" /><category term="data-driven-unit-test" /><category term="classloader" /><category term="css" /><category term="ddtunit" /><category term="agile" /><category term="python" /><category term="analysis" /><category term="tips" /><category term="animation" /><category term="aspects" /><category term="burndown" /><category term="jsr47" /><category term="eclipse" /><category term="code" /><category term="abdera" /><category term="timestamp" /><category term="menu" /><category term="backup" /><category term="rtc" /><category term="apache" /><category term="jmockit" /><category term="jmock" /><category term="xml" /><category term="antcall" /><category term="feed" /><category term="ant" /><category term="pr" /><category term="java" /><category term="process" /><category term="override" /><category term="howto" /><category term="static" /><category term="programming" /><category term="aop" /><category term="target" /><category term="xslt" /><category term="format" /><category term="aspectj" /><category term="polygonal" /><category term="type-overflow" /><category term="filter" /><category term="properties" /><category term="log4j" /><category term="ui" /><category term="burnup" /><category term="clone" /><category term="dojo" /><category term="report" /><category term="scrum" /><category term="ajdt" /><category term="ant-xslt" /><category term="dict" /><category term="software" /><category term="html" /><category term="windows-live-writer" /><category term="log" /><category term="atom" /><category term="design" /><category term="quality" /><category term="fun" /><category term="framework" /><category term="project" /><category term="parser" /><category term="automation" /><category term="numbers" /><category term="blogging" /><category term="dojo.anim" /><category term="contextual" /><category term="ibm-communities" /><category term="staf" /><category term="unit-test" /><title>Source Patch</title><subtitle type="html">A collection of programming and tooling techniques for problems I could not solve with Internet searches.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://sourcepatch.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/sourcepatch" /><feedburner:info uri="sourcepatch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>sourcepatch</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CkIGSXw5eCp7ImA9WhdaFk0.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-4252499867368325814</id><published>2011-10-25T20:42:00.001-07:00</published><updated>2011-10-25T20:42:08.220-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-25T20:42:08.220-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="format" /><category scheme="http://www.blogger.com/atom/ns#" term="pretty" /><category scheme="http://www.blogger.com/atom/ns#" term="xml-format" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="html" /><category scheme="http://www.blogger.com/atom/ns#" term="xslt" /><category scheme="http://www.blogger.com/atom/ns#" term="pr" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>Prettifying XML files for web browsers</title><content type="html">&lt;p&gt;I am a big user of public XML formatters, such as &lt;a href="http://www.xmlformatter.net/"&gt;http://www.xmlformatter.net/&lt;/a&gt; as part of my regular work, largely because I need to understand some glob of an XML returned without any formatting by a server presumably tuned for maximum performance.&lt;/p&gt;  &lt;p&gt;More recently, I was faced with the need to produce those nice XML representation within automatically generated documentation, specially now that version 0.9.0 of the excellent Lunatech Jaxdoclets library (&lt;a href="http://www.lunatech-labs.com/open-source/jax-doclets"&gt;http://www.lunatech-labs.com/open-source/jax-doclets&lt;/a&gt;) can also include external HTML contents in the final jaxdoc output of a JAX-RS implementation.&lt;/p&gt;  &lt;p&gt;So what I needed was a formatter that could be embedded into our build structure, or even incorporated into a live server to create a private XML formatter service where we did not have to worry about obfuscating XML contents before sending them out to the extranet (e.g. IP addresses, passwords, someone’s address, etc) .&lt;/p&gt;  &lt;p&gt;Since our build is based on Ant and our live server based on Tomcat, it made sense to settle into using XSLT. This link (&lt;a href="http://www.dpawson.co.uk/xsl/sect2/pretty.html"&gt;http://www.dpawson.co.uk/xsl/sect2/pretty.html&lt;/a&gt;) is a good start, but I really wanted output in HTML with all the niceties of CSS styles, etc.&lt;/p&gt;  &lt;p&gt;For now, the transformation is listed below. I am not terribly happy with the solution for namespaces and the “pad”&amp;#160; template would need a serious performance optimization if used in mainline processing (not my case) , probably by a sub-string function call using a long chunk of whitespaces as parameters since XSLT does not have generic for loops.   &lt;br /&gt;    &lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;&lt;a href="http://www.w3.org/1999/XSL/Transform"&gt;http://www.w3.org/1999/XSL/Transform&lt;/a&gt;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; xmlns:fn=&amp;quot;&lt;a href="http://www.w3.org/2005/xpath-functions"&gt;http://www.w3.org/2005/xpath-functions&lt;/a&gt;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; xmlns:xs=&amp;quot;&lt;a href="http://www.w3.org/2001/XMLSchema"&gt;http://www.w3.org/2001/XMLSchema&lt;/a&gt;&amp;quot; &amp;gt;&lt;/p&gt;  &lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:output method=&amp;quot;html&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:strip-space elements=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - Root match&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;html&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title&amp;gt;HTML version of XML resource&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;frs-jaxdoc.css&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:apply-templates&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:apply-templates&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/html&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:template&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - Processes XML elements &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - param indent&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; indentation count&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - param ancestorsNamespaces concatenation of all namespace URIs from all parents, which is &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; used to determine if a namespace has already been declared in&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a parent XML element.&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:template match=&amp;quot;node()[name()]&amp;quot;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:param name=&amp;quot;indent&amp;quot; select=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:param name=&amp;quot;ancestorsNamespaces&amp;quot; select=&amp;quot;''&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:variable name=&amp;quot;hasChildren&amp;quot; select=&amp;quot;count(child::node()) &amp;gt; 0&amp;quot;/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:variable name=&amp;quot;hasTextNode&amp;quot; select=&amp;quot;count(child::text()) &amp;gt; 0&amp;quot;/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&amp;#160; Format opening of XML element --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;$indent &amp;gt; 0&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:call-template name=&amp;quot;pad&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;$indent * 2&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;span class=&amp;quot;xmlElement&amp;quot;&amp;gt;&amp;amp;lt;&amp;lt;xsl:value-of select=&amp;quot;name()&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Add namespaces to XML element --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:variable name=&amp;quot;selfNamespaces&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:for-each select=&amp;quot;namespace::node()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:variable name=&amp;quot;hasAttributes&amp;quot; select=&amp;quot;count(@*) &amp;gt; 0&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:for-each select=&amp;quot;namespace::node()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;contains($ancestorsNamespaces, .) = false()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;position() = 1&amp;quot;&amp;gt;&amp;amp;#160;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;position() &amp;gt; 1&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;br/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:call-template name=&amp;quot;pad&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;($indent+1) * 2&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;span class=&amp;quot;xmlNamespacePrefix&amp;quot;&amp;gt;xmlns:&amp;lt;xsl:value-of select=&amp;quot;name()&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;=&amp;lt;span class=&amp;quot;xmlNamespaceUri&amp;quot;&amp;gt;&amp;quot;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;position()=last() and $hasAttributes&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;br/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:call-template name=&amp;quot;pad&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;($indent+1) * 2&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Add attributes to XML element --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:apply-templates select=&amp;quot;@*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Close opening XML element tag, with special handling for element without children node --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;span class=&amp;quot;xmlElement&amp;quot;&amp;gt;&amp;lt;xsl:if test=&amp;quot;$hasChildren = false()&amp;quot;&amp;gt;/&amp;lt;/xsl:if&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;#160;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Add children to XML element --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:apply-templates select=&amp;quot;node()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;$indent + 1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;ancestorsNamespaces&amp;quot; select=&amp;quot;concat($ancestorsNamespaces,$selfNamespaces)&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:apply-templates&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&amp;#160; Close XML element, but only if not already closed with XML element abbreviation --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;$hasChildren = true()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;$hasTextNode = false()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;br/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:call-template name=&amp;quot;pad&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;$indent * 2&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;span class=&amp;quot;xmlElement&amp;quot;&amp;gt;&amp;amp;lt;/&amp;lt;xsl:value-of select=&amp;quot;name()&amp;quot; /&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:template&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - XML text &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:template match=&amp;quot;text()&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:variable name=&amp;quot;nodeValue&amp;quot; select=&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;string-length($nodeValue) &amp;gt; 0&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;span class=&amp;quot;xmlText&amp;quot;&amp;gt;&amp;lt;xsl:copy-of select=&amp;quot;$nodeValue&amp;quot; /&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:template&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - XML attributes &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:template match=&amp;quot;@*&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;position() &amp;gt; 0&amp;quot;&amp;gt;&amp;amp;#160;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;span class=&amp;quot;xmlAttr&amp;quot;&amp;gt; &amp;lt;xsl:value-of select=&amp;quot;name()&amp;quot; /&amp;gt; &amp;lt;/span&amp;gt;=&amp;lt;span class=&amp;quot;xmlAttrValue&amp;quot;&amp;gt;&amp;quot;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:template&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - Padding for HTML output, used for indentation purposes&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:template name=&amp;quot;pad&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:param name=&amp;quot;indent&amp;quot; select=&amp;quot;0&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:if test=&amp;quot;$indent &amp;gt; 0&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:call-template name=&amp;quot;pad&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xsl:with-param name=&amp;quot;indent&amp;quot; select=&amp;quot;$indent - 1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/xsl:template&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And this is the companion CSS file:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre&gt;.xmlElement {&lt;br /&gt;	color: #990099;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.xmlAttr {&lt;br /&gt;	color: #660066;&lt;br /&gt;}&lt;br /&gt;.xmlAttrValue {&lt;br /&gt;	color: #0000CC&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.xmlNamespacePrefix {&lt;br /&gt;	color: #666600;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.xmlNamespaceUri {&lt;br /&gt;	color: #000099&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;xmlText {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BODY {&lt;br /&gt;	font-size: 10pt;&lt;br /&gt;	font-family: &amp;quot;Courier New&amp;quot;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The style names for classes are not that verbose, but I thought I would make it more legible for this entry.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-4252499867368325814?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/CirZsr67DlE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/4252499867368325814/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2011/10/prettifying-xml-files-for-web-browsers.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/4252499867368325814?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/4252499867368325814?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/CirZsr67DlE/prettifying-xml-files-for-web-browsers.html" title="Prettifying XML files for web browsers" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2011/10/prettifying-xml-files-for-web-browsers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8NSX0zeSp7ImA9Wx9TEE4.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-887632485080987916</id><published>2010-11-17T14:33:00.001-08:00</published><updated>2010-11-17T14:44:58.381-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-17T14:44:58.381-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="burnup" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="rtc" /><category scheme="http://www.blogger.com/atom/ns#" term="burndown" /><category scheme="http://www.blogger.com/atom/ns#" term="capacity" /><category scheme="http://www.blogger.com/atom/ns#" term="jazz" /><category scheme="http://www.blogger.com/atom/ns#" term="rational" /><category scheme="http://www.blogger.com/atom/ns#" term="project" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="project-management" /><title>Burning up</title><content type="html">&lt;p&gt;I am growing increasingly fond of the Agile development method. It really has a transformational effect on how the teams operate and relate to their work. &lt;/p&gt;  &lt;p&gt;Now working on a team of 26 people in four scrums spread across four geographies and four timezones, we have stepped up our reliance on Rational Team Concert dashboards to keep track of how each team is progressing. Each scrum team still has daily standup meetings and scrum of scrum meetings with the product owner, scrum masters, and stakeholders. Though the emphasis during the scrum of scrums is on the reporting from each scrum master, we have started to appreciate and use “burnup” charts as the backdrop for these meetings.&lt;/p&gt;  &lt;p&gt;Disclaimer: I am an IBM employee with access to an internally hosted instance of Rational Team Concert. For small teams of up to 10 people, and with some functional restrictions, RTC is freely available at &lt;a href="http://jazz.net"&gt;http://jazz.net&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;There is ample literature on why “burnup”&amp;#160; charts are superior to “burndown” charts, but RTC combines project tracking and team information to provide significantly enhanced visibility on project progress. I produced a couple of heavily data-altered versions of our actual “burnup” charts as examples.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;RTC Burnup Data Series&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/TORYPbZdd1I/AAAAAAAAE44/4dz3pZ-mztw/s1600-h/image%5B5%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://lh3.ggpht.com/_g1cgAPRqWkA/TORYQtKkFbI/AAAAAAAAE48/PsFNxnxP2fI/image_thumb%5B3%5D.png?imgmax=800" width="562" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;“Total Capacity”&lt;/em&gt; indicates how much work the team can execute on a given period. It is always a flat, straight, line. RTC uses information provided by each team member on their availability in terms of hours per day, vacation, and holidays.&lt;/li&gt;    &lt;li&gt;&lt;em&gt;“Planned Work”&lt;/em&gt; indicates how much work is actually planned for a given period. For any sane project, it should be under the “ Total Capacity” line at all times, otherwise low-priority work should be moved from that period immediately. In the example chart above, this can be observed on 11/16.&lt;/li&gt;    &lt;li&gt;&lt;em&gt;“Expected Complete”&lt;/em&gt; indicates how much work should be completed&amp;#160; over time so that all planned work is completed at the end of the given period. Always a straight line starting from 0 hours and ending at the total amount of planned work hours.&lt;/li&gt;    &lt;li&gt;&lt;em&gt;“Completed Work”&lt;/em&gt; indicates how much work the team is logging in the system against the tasks assigned to each individual. In very simple terms, &amp;quot;completed work should be at or above the “Expected Complete” line, indicating the team is on schedule or ahead of schedule. In the example chart above, it is possible to see the team recovering from a slow start and exceeding expectations after 11/10.&lt;/li&gt;    &lt;li&gt;&lt;em&gt;“Linear Complete”&lt;/em&gt; is a liner regression of data points in the “Completed Work” series. It projects how much work will be done at the end of the given period. This line should be at or above the “Expected Complete”&amp;#160; line, otherwise remediation is required, such as moving distracting low-priority work from that period of time.&amp;#160; In the example chart above, that line is slightly above the “Expected Complete” line, a good sign, indicating all work being completed one or two days ahead of schedule (where it crosses above the “Planned work”&amp;#160; line) .&lt;/li&gt;    &lt;li&gt;&lt;em&gt;“Capacity Burnup”&lt;/em&gt; indicates how much capacity the team is “burning” during a given period. It goes up whether the team is working or not, because the time available to work in that period is reduced every minute. Ideally you want the “Completed Work”&amp;#160; line to be at or above the “Capacity Burnup” line, indicating that team is burning up its capacity on actually planned work. In the above example chart, notice how the first half of the period has less completed work than the capacity being spent, a clear indication that people are being diverted from the planned work.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;A non-ideal example&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first example was somewhat benign in that execution would have been well planned and completed ahead of time. Now lets look at another hypothetical example, with some planning and execution challenges:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/TORYRpzEKJI/AAAAAAAAE5A/W28xhs-hc6o/s1600-h/image%5B9%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://lh5.ggpht.com/_g1cgAPRqWkA/TORYSxV1CZI/AAAAAAAAE5E/Bur4PtVUEck/image_thumb%5B5%5D.png?imgmax=800" width="570" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The first warning sign is a number of data points *above* the “ Total Capacity” line, specially the “ Planned Work”&amp;#160; line. In a real project, this chart would be telling the project owner to move content outside the given period right at the beginning. Notice how the “Planned Work”&amp;#160; line does go down on 11/3, only to steadily climb up again. RTC does have an “Estimated vs Actual Work” chart that can clarify whether that increase in “Planned Work” is the result of new work being added to the period or the result of planned work taking longer than planned. I like to have both side by side in the same dashboard.&lt;/p&gt;  &lt;p&gt;The second warning sign is the “Completed Work” line being significantly above the “Capacity Burnup”&amp;#160; chart line, an indication that the team worked a fair amount of overtime during the period. Though the “Linear Complete”&amp;#160; projection is slightly above the “Expected Complete”&amp;#160; work, the actual data points for “Completed Work” show the team running out of steam towards the last days of the interval (complete work goes from above expected to below expected around 11/10) .&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In summary&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;A quick glance at a “burnup” chart, assuming somewhat accurate reporting by the team, will immediately point at any action required by the scrum master and product owner. This is the cheat-sheet I share with others reading these charts, which takes a lot of the guess work about how teams are doing.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The “Capacity Burnup” line should always be at the top of all other lines or content must be moved out of the period in question.&lt;/li&gt;    &lt;li&gt;The “Linear Complete”&amp;#160; and “Completed Work” lines must be on top of or above the “Expected Complete” line, otherwise they indicate the team will overrun its time budget.&lt;/li&gt;    &lt;li&gt;The “Linear Complete” line must be somewhat matched to the “Capacity Burnup”&amp;#160; line. If it is significantly below that line, it indicates the team is working on something else other than planned content (e.g. spending 2 days reimaging failed hardware) ; if it is significantly above the capacity burnup, the team is working overtime and may run out of steam at the end of the period.&lt;/li&gt;    &lt;li&gt;Steady, rather than abrupt, increases in the “Planned Work”&amp;#160; line typically indicate the team taking longer on tasks than originally planned.&lt;/li&gt;    &lt;li&gt;Abrupt, rather than steady, changes in the “Planned Work”&amp;#160; line typically indicate work items being moved in and out of the time period. The product owner should always be aware of the causes for those changes.&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-887632485080987916?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/fzA6NI8Xpj8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/887632485080987916/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2010/11/burning-up.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/887632485080987916?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/887632485080987916?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/fzA6NI8Xpj8/burning-up.html" title="Burning up" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_g1cgAPRqWkA/TORYQtKkFbI/AAAAAAAAE48/PsFNxnxP2fI/s72-c/image_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2010/11/burning-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MBR3szfip7ImA9WxFUFEs.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-6358719903524945273</id><published>2010-06-25T05:32:00.001-07:00</published><updated>2010-06-25T05:37:36.586-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-25T05:37:36.586-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stax" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="properties" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="staf" /><category scheme="http://www.blogger.com/atom/ns#" term="dict" /><title>STAX automation: Converting a property file into a Python dict() object</title><content type="html">&lt;p&gt;Coming back to test automation, where I reiterate my fondness of the STAX/STAF framework.&lt;/p&gt;  &lt;p&gt;Trying to read the contents of a properties file containing “key=value” pairs, I found this article on how to write the entire thing in Python (the underlying scripting language for STAX scripts) : &lt;a href="http://code.activestate.com/recipes/496795-a-python-replacement-for-javautilproperties/"&gt;http://code.activestate.com/recipes/496795-a-python-replacement-for-javautilproperties/&lt;/a&gt;. A few minutes trying to visualize how to embed it into a STAX “script” construct, I realized I did not have the same constraints of not being able to use Java and could write the far more simple construct:&lt;/p&gt;  &lt;p&gt;---&lt;/p&gt;  &lt;p&gt;&amp;lt;function name=&amp;quot;read_properties&amp;quot; scope=&amp;quot;local&amp;quot;&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;function-prolog&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Returns a Python dict object representing the keys found inside a properties file.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/function-prolog&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;function-map-args&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;function-required-arg name=&amp;quot;properties_file&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Properties file to be read.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/function-required-arg&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/function-map-args&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sequence&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; from java.util import Properties    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; from java.lang import String    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; from java.io import File    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; from java.io import FileInputStream    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; from java.io import IOException&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; env_exception = None   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; props = Properties()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fis = None    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file = File(properties_file)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fis = FileInputStream(file)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; props.load(fis)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; props_dict = {}    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; prop_names = props.propertyNames();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for i in range(props.size()):    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; prop_name = prop_names.nextElement()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; prop_value = props.getProperty(prop_name)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; props_dict.setdefault(prop_name, prop_value) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; except IOException, e:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; env_exception = e.getMessage()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; finally:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if fis != None:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fis.close()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;if expr=&amp;quot;env_exception != None&amp;quot;&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sequence&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; err_msg = 'Attempt to load properties file %s resulted in exception %s'&amp;#160; % (properties_file, env_exception)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;message log=&amp;quot;STAXLogMessage&amp;quot;&amp;gt;err_msg&amp;lt;/message&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;throw exception=&amp;quot;'STAXException'&amp;quot;&amp;gt;err_msg&amp;lt;/throw&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/sequence&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;else&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;message log=&amp;quot;STAXLogMessage&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 'Environment [%s] is %s' % (properties_file, props_dict)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/message&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/else&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/if&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;return&amp;gt;props_dict&amp;lt;/return&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/sequence&amp;gt;   &lt;br /&gt;&amp;lt;/function&amp;gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-6358719903524945273?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/kenN5iAMAOQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/6358719903524945273/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2010/06/stax-automation-converting-properties.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6358719903524945273?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6358719903524945273?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/kenN5iAMAOQ/stax-automation-converting-properties.html" title="STAX automation: Converting a property file into a Python dict() object" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2010/06/stax-automation-converting-properties.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCRn46cCp7ImA9WxFSEEU.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-5379950956692761268</id><published>2010-04-08T14:03:00.001-07:00</published><updated>2010-04-12T06:54:27.018-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-12T06:54:27.018-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stax" /><category scheme="http://www.blogger.com/atom/ns#" term="process" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="automation" /><category scheme="http://www.blogger.com/atom/ns#" term="command" /><category scheme="http://www.blogger.com/atom/ns#" term="staf" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><title>Handling process launches in STAF / STAX</title><content type="html">&lt;p&gt;I have been a big fan of &lt;a title="Software Testing Automation Framework (STAF)" href="http://staf.sourceforge.net/"&gt;STAF&lt;/a&gt; test automation framework for many years. STAF is open-source and runs on all mainstream platforms (including IBM System z and Mac) . Its key strengths are distributing and coordinating tasks across multiple machines. &lt;/p&gt;  &lt;p&gt;Launching processes in distributed machines is really well-implemented as a STAF service and also receives special treatment in the companion STAX execution engine. Process management is always a thorny discipline, dealing with process output, error codes, deciding whether or not to wait until they are done, and many other concerns.&lt;/p&gt;  &lt;p&gt;I compiled a personal list of STAF/STAX options in launching new processes that always trick newcomers to the tool.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Waiting for a process launched through STAF&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Running a command on any given machine running the STAF process is as simple as executing “staf &amp;lt;machine&amp;gt; PROCESS START &amp;lt;command&amp;gt;”.&lt;/p&gt;  &lt;p&gt;What often derails people are the default launch settings, which instructs STAF to launch the process **asynchronously* and moving on, often breaking follow on commands that depend on the results of the first. If you must wait until the process completes its execution, you need to use the “WAIT” flag.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_g1cgAPRqWkA/S75C3Gr5vHI/AAAAAAAAEuA/bPd2WvRnUHg/s1600-h/image%5B10%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="107" alt="image" src="http://lh3.ggpht.com/_g1cgAPRqWkA/S75C5zIpFCI/AAAAAAAAEuE/eKIE4GtIjPU/image_thumb%5B4%5D.png?imgmax=800" width="474" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The next relevant flag is “SAMECONSOLE”, which prevents STAX from launching a new console (default behavior on Windows) . For most runs of unattended commands, SAMECONSOLE is your option of choice.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_g1cgAPRqWkA/S75C8L7JcpI/AAAAAAAAEuI/GyfN6TYWru0/s1600-h/image%5B14%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="112" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/S75C_2tA2aI/AAAAAAAAEuM/P8odluDRss4/image_thumb%5B6%5D.png?imgmax=800" width="575" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The last important flags are the ones indicating that you want STAF to collect the command results, namely RETURNSTDERR and RETURNSTDOUT, as follows:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/S75EVftjfpI/AAAAAAAAEuQ/nDOt-QRLJ2s/s1600-h/image%5B18%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="332" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/S75Efj6dc0I/AAAAAAAAEuU/WHyl3aCJQ9Q/image_thumb%5B8%5D.png?imgmax=800" width="778" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Results from asynchronous launches&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you really must run a command asynchronously, you need to store the command handle returned by STAF and query its results later on.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_g1cgAPRqWkA/S75EhXKcLDI/AAAAAAAAEuY/sTFT4bNJm7E/s1600-h/image%5B26%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="300" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/S75EjKN7YkI/AAAAAAAAEuc/wJHZhV_xhqQ/image_thumb%5B12%5D.png?imgmax=800" width="786" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Inside STAX&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Launching the same process using the STAX engine requires more effort, which is understandable since STAX is a more sophisticated execution engine with support for programmatic constructs.&lt;/p&gt;  &lt;p&gt;One of the most important observations about the &amp;lt;process&amp;gt; call inside STAX is that it always wait for command invocation and it does not have the concept of consoles. In other words, STAX &amp;lt;process&amp;gt; element always uses the equivalent of “WAIT SAMECONSOLE”&amp;#160; in the STAF PROCESS parameters.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE stax SYSTEM &amp;quot;stax.dtd&amp;quot;&amp;gt; &lt;br /&gt;&lt;br /&gt;  &amp;lt;stax&amp;gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;defaultcall function=&amp;quot;test&amp;quot; /&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;function name=&amp;quot;test&amp;quot; scope=&amp;quot;local&amp;quot;&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sequence&amp;gt; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;process name=&amp;quot;'test.dir'&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;location&amp;gt;'local'&amp;lt;/location&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;command mode=&amp;quot;'shell'&amp;quot;&amp;gt;'dir &lt;a href="file://\\tmp'&amp;lt;/command"&gt;\\tmp'&amp;lt;/command&lt;/a&gt;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;console use=&amp;quot;'same'&amp;quot; /&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;returnstdout /&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;returnstderr /&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/process&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;message&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Result code: %i &amp;quot; % STAXResult[0][0]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/message&amp;gt; &lt;br /&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;message&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Result data: %s &amp;quot; % STAXResult[0][1]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/message&amp;gt; &lt;br /&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/sequence&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/function&amp;gt;     &lt;br /&gt;&amp;lt;/stax&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;While observing the results in the Job monitor, we will see:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_g1cgAPRqWkA/S8MmCuNopoI/AAAAAAAAEuk/0UoNGVJ-U0A/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="378" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/S8MmEC4qyYI/AAAAAAAAEuo/9OLiic6MUZg/image_thumb%5B1%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;In conclusion&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As usual, the excellent user guides shipped with both STAF and STAX are the most comprehensive material for learning about the intricacies of launching remote processes and manipulating their results. I just missed a short guide like the one above showing the STAF / STAX equivalence side-by-side.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-5379950956692761268?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/BsZEzgBOYEI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/5379950956692761268/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2010/04/handling-processes-staf-stax.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5379950956692761268?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5379950956692761268?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/BsZEzgBOYEI/handling-processes-staf-stax.html" title="Handling process launches in STAF / STAX" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_g1cgAPRqWkA/S75C5zIpFCI/AAAAAAAAEuE/eKIE4GtIjPU/s72-c/image_thumb%5B4%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2010/04/handling-processes-staf-stax.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8EQ385cCp7ImA9WxFSF08.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-5639119617559586090</id><published>2010-03-02T12:47:00.001-08:00</published><updated>2010-04-19T18:26:42.128-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-19T18:26:42.128-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="classpath" /><category scheme="http://www.blogger.com/atom/ns#" term="antcall" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><category scheme="http://www.blogger.com/atom/ns#" term="override" /><category scheme="http://www.blogger.com/atom/ns#" term="ant-xslt" /><category scheme="http://www.blogger.com/atom/ns#" term="classloader" /><category scheme="http://www.blogger.com/atom/ns#" term="xslt" /><category scheme="http://www.blogger.com/atom/ns#" term="target" /><title>Ant targets with different classpaths</title><content type="html">&lt;p&gt;I recently ran into a problem where an Ant task could not find a given Java class. There are a number of solutions listed in the &lt;a href="http://ant.apache.org/faq.html"&gt;Ant FAQ&lt;/a&gt; page, all passing through adding the corresponding JAR files to the Ant lib directory or the the classpath before invoking Ant.&lt;/p&gt;  &lt;p&gt;It turns out the particular task from the Ant target I imported was invoking an XSL transformation containing function defined in an external class, like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&lt;br /&gt; xmlns:xalan2="http://xml.apache.org/xalan"&lt;br /&gt; xmlns:fixquote="com.package.&lt;strong&gt;ExternalXsltFunction&lt;/strong&gt;"&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The original &lt;em&gt;ExternalTask&lt;/em&gt; task was defined in A.jar, but &lt;em&gt;com.package.ExternalXsltFunction&lt;/em&gt; was defined in external.jar. Since &lt;em&gt;com.package.&lt;em&gt;ExternalXsltFunction&lt;/em&gt; &lt;/em&gt;is dynamically loaded only when the internal XSL transformation is invoked, Ant simply ignores and discards its containing JAR file while trying to load &lt;em&gt;ExternalTask&lt;/em&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; &lt;pre&gt;&amp;lt;taskdef name="&lt;em&gt;externaltask&lt;/em&gt;" classname="&lt;em&gt;com.package.ExternalTask&lt;/em&gt;"&amp;gt;&lt;br /&gt;    &amp;lt;classpath&amp;gt;&lt;br /&gt;        &amp;lt;pathelement name=”A.jar”/&amp;gt;&lt;br /&gt;        &amp;lt;pathelement name=”external.jar”/&amp;gt;    &lt;span style="color:#ff0000;"&gt;&lt;strong&gt;&amp;lt;—Makes no difference, &lt;em&gt;&lt;em&gt;ExternalXsltFunction&lt;/em&gt; &lt;/em&gt; is not loaded when &lt;em&gt;ExternalTask&lt;/em&gt; is loaded.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &amp;lt;classpath/&amp;gt;&lt;br /&gt;&amp;lt;/taskdef&amp;gt; &lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The solution was to create an extension of the venerable “antcall” task, adding a “classpath” element to it. This new task, let’s call it “antcallwithclassloader”, sets the classpath to the thread of execution, invokes the target, then resets the thread classpath back to its original value, like this (all comments stripped out):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; &lt;pre&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;package com.myproject.ant; &lt;/p&gt;&lt;p&gt;import org.apache.tools.ant.AntClassLoader;&lt;br /&gt;import org.apache.tools.ant.BuildException;&lt;br /&gt;import org.apache.tools.ant.taskdefs.CallTarget;&lt;br /&gt;import org.apache.tools.ant.types.Path;&lt;br /&gt;import org.apache.tools.ant.types.Reference; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;public class CallTargetWithClasspath extends CallTarget { &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;    private Path classpath; &lt;/p&gt;&lt;p&gt;    private Reference classpathRef; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;    @Override&lt;br /&gt;    public void execute() throws BuildException {&lt;br /&gt;        Path resolvedClassPath = null;&lt;br /&gt;        if (classpathRef != null) {&lt;br /&gt;            resolvedClassPath = (Path)classpathRef.getReferencedObject();&lt;br /&gt;        } else {&lt;br /&gt;            resolvedClassPath = classpath;&lt;br /&gt;        }&lt;br /&gt;&lt;strong&gt;       &lt;span style="color:#ff0000;"&gt; AntClassLoader acl = new AntClassLoader(getProject(), resolvedClassPath);&lt;br /&gt;        acl.setThreadContextLoader();&lt;br /&gt;        super.execute();&lt;br /&gt;        acl.resetThreadContextLoader();&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;    } &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;    public Path getClasspath() { return classpath; } &lt;/p&gt;&lt;p&gt;    public void setClasspath(Path targetClasspath) { this.classpath = targetClasspath; } &lt;/p&gt;&lt;p&gt;    public Path createClasspath() {&lt;br /&gt;        classpath = new Path(getProject());&lt;br /&gt;        return classpath;&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    public Reference getClasspathRef() { return classpathRef; } &lt;/p&gt;&lt;p&gt;    public void setClasspathRef(Reference classpathRef) { this.classpathRef = classpathRef; } &lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With this task, now added to a “myanttools.jar”  file, I could successfully refactor my Ant script so that the problematic task was moved to its own target and was invoked with its required classpath, like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; &lt;pre&gt;    &amp;lt;taskdef name="my.antcall" classname="com.myproject.ant.CallTargetWithClasspath" &amp;gt;&lt;br /&gt;           &amp;lt;classpath&amp;gt;&lt;br /&gt;               &amp;lt;pathelement location="myanttools.jar"/&amp;gt;&lt;br /&gt;         &amp;lt;/classpath&amp;gt;&lt;br /&gt;    &amp;lt;/taskdef&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;pre&gt;    &amp;lt;target name="wrapper.target" depends="init"&amp;gt;&lt;br /&gt;        &amp;lt;my.antcall target="refactored.target"&amp;gt;&lt;br /&gt;            &amp;lt;classpath&amp;gt;&lt;br /&gt;                &amp;lt;pathelement path=”external.jar”/&amp;gt;   &lt;span style="color:#ff0000;"&gt;&lt;strong&gt;&amp;lt;—- Adds B.jar to the classpath before invoking target&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;            &amp;lt;/classpath&amp;gt;&lt;br /&gt;        &amp;lt;/my.antcall&amp;gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;pre&gt;    &amp;lt;target name="refactored.target"&amp;gt;&lt;br /&gt;       &lt;span style="color:#ff0000;"&gt;&lt;strong&gt;&amp;lt;!—- The caller set external.jar in the classpath –&amp;gt;&lt;br /&gt;       &amp;lt;!-- and &lt;em&gt;ExternalXsltFunction&lt;/em&gt; is visible to the classloader -–&amp;gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;externaltask …/&amp;gt;&lt;br /&gt;   &amp;lt;/target&amp;gt; &lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-5639119617559586090?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/H3R5_NmS5Hg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/5639119617559586090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2010/03/ant-targets-with-different-classpaths.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5639119617559586090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5639119617559586090?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/H3R5_NmS5Hg/ant-targets-with-different-classpaths.html" title="Ant targets with different classpaths" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2010/03/ant-targets-with-different-classpaths.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAFR3Y8fip7ImA9WxBQFU8.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-978099777836931250</id><published>2010-01-14T18:44:00.001-08:00</published><updated>2010-01-14T18:48:36.876-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-14T18:48:36.876-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="atom" /><category scheme="http://www.blogger.com/atom/ns#" term="parser" /><category scheme="http://www.blogger.com/atom/ns#" term="filter" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="abdera" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="feed" /><title>Optimizing Atom feed parsing with Apache Abdera</title><content type="html">&lt;p&gt;I chose &lt;a href="http://abdera.apache.org/"&gt;Apache Abdera&lt;/a&gt; as my Atom processor of choice for a number of small projects. Skipping the processing of unwanted XML elements inside an Atom feed is the most basic optimization for these applications.&lt;/p&gt;  &lt;p&gt;For one of these applications, a statistics aggregator of sorts, there was no need to look into the summary and raw contents of each entry. Enter the Apache Abdera built-in filter support, through which one can instruct the parser to only accept or ignore certain entry elements.&lt;/p&gt;  &lt;p&gt;The samples in the &lt;a href="http://cwiki.apache.org/ABDERA/feed-object-model.html#FeedObjectModel-ParseFilters"&gt;Abdera wiki&lt;/a&gt; didn’t quite match the public &lt;a href="http://abdera.apache.org/docs/api/index.html"&gt;Javadocs&lt;/a&gt;, so I ended up writing my own version of what the wiki described as a black list filter:&lt;/p&gt;  &lt;pre&gt;&lt;span style="font-size:85%;"&gt;Abdera &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:85%;" &gt;abdera = new Abdera();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:85%;" &gt;&lt;br /&gt;Parser abderaParser = abdera&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.getParser();&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;ParserOptions defaultParserOptions = abderaParser.getDefaultParserOptions();&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;FavoriteParseFilter fpf = &lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; FavoriteParseFilter();&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;defaultParserOptions.setParseFilter(fpf);&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;abderaParser.setDefaultParserOptions(defaultParserOptions);&lt;/span&gt;&lt;/pre&gt;where FavoriteParseFilter is defined like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;p align="left"&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; FavoriteParseFilter &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;implements&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; org.apache.abdera.filter.ParseFilter{&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;    private&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; static &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;final&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; QName &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:85%;" &gt;CONTENT_QNAME &lt;/span&gt;&lt;span style="font-size:85%;"&gt;=&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;        new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(42, 0, 255);font-size:85%;" &gt; QName("http://www.w3.org/2005/Atom"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);font-size:85%;" &gt;"content"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;    private&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; static &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;final&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; QName &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:85%;" &gt;SUMMARY_QNAME &lt;/span&gt;&lt;span style="font-size:85%;"&gt;=&lt;br /&gt;       &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(42, 0, 255);font-size:85%;" &gt; QName("http://www.w3.org/2005/Atom"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);font-size:85%;" &gt;"summary"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:85%;" &gt;    /*&lt;br /&gt;    * (non-Javadoc)&lt;br /&gt;    *&lt;br /&gt;    * @see org.apache.abdera.filter.ParseFilter#acceptable(javax.xml.namespace.QName)&lt;br /&gt;    */&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;  public&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;boolean&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; acceptable(QName n) {&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;&lt;br /&gt;      boolean&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; result = !(n.equals(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:85%;" &gt;CONTENT_QNAME&lt;/span&gt;&lt;span style="font-size:85%;"&gt;) ||&lt;br /&gt;                         n.equals(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);font-size:85%;" &gt;SUMMARY_QNAME&lt;/span&gt;&lt;span style="font-size:85%;"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(127, 0, 85);font-size:85%;" &gt;    return&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:85%;"&gt; result;&lt;br /&gt;   }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/pre&gt;Results may vary, but I observed a gain of at least 25% in overall throughput using a simple application fetching a remote feed with entries about 2Kb in size.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-978099777836931250?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/da6l0x2wfmk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/978099777836931250/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2010/01/optimizing-atom-feed-parsing-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/978099777836931250?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/978099777836931250?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/da6l0x2wfmk/optimizing-atom-feed-parsing-with.html" title="Optimizing Atom feed parsing with Apache Abdera" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2010/01/optimizing-atom-feed-parsing-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04AR3Yzfip7ImA9WxBQEk8.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-4269108097011314686</id><published>2010-01-11T06:58:00.001-08:00</published><updated>2010-01-11T06:59:06.886-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-11T06:59:06.886-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="contextual" /><category scheme="http://www.blogger.com/atom/ns#" term="polygonal" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="ui" /><category scheme="http://www.blogger.com/atom/ns#" term="menu" /><title>Polygonal menus?</title><content type="html">&lt;p&gt;Jury is still out on the efficiency of these kinds of contextual menus instead of regular tabular format. &lt;/p&gt;  &lt;p&gt;For now, they are filed under the uncoveted&amp;#160; “because we could” folder in my brain. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_g1cgAPRqWkA/S0s8pA5tCsI/AAAAAAAAEtA/0RGraVg9Skk/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_g1cgAPRqWkA/S0s8pTlPj_I/AAAAAAAAEtE/pzvhPzMGjf0/image_thumb%5B1%5D.png?imgmax=800" width="268" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-4269108097011314686?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/HsYSdJ3i9yo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/4269108097011314686/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2010/01/polygonal-menus.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/4269108097011314686?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/4269108097011314686?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/HsYSdJ3i9yo/polygonal-menus.html" title="Polygonal menus?" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_g1cgAPRqWkA/S0s8pTlPj_I/AAAAAAAAEtE/pzvhPzMGjf0/s72-c/image_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2010/01/polygonal-menus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMAQ3o5fSp7ImA9WxNXEko.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-7428139487435562961</id><published>2009-09-29T18:34:00.001-07:00</published><updated>2009-09-29T18:34:02.425-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T18:34:02.425-07:00</app:edited><title>Mastering Mock Objects - Advanced Unit Testing for Java</title><content type="html">A collection of notes on the use of JMockit and JMock in Java unit testing.&lt;div style="width:425px;text-align:left" id="__ss_2066615"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/dnastacio/mock-unit-test" title="Mastering Mock Objects - Advanced Unit Testing for Java"&gt;Mastering Mock Objects - Advanced Unit Testing for Java&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mock-unit-test-090925121011-phpapp02&amp;stripped_title=mock-unit-test" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mock-unit-test-090925121011-phpapp02&amp;stripped_title=mock-unit-test" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/dnastacio"&gt;Denilson Nastacio&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-7428139487435562961?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/optqJ0h05vA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/7428139487435562961/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/09/mastering-mock-objects-advanced-unit.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7428139487435562961?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7428139487435562961?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/optqJ0h05vA/mastering-mock-objects-advanced-unit.html" title="Mastering Mock Objects - Advanced Unit Testing for Java" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/09/mastering-mock-objects-advanced-unit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQX0_eCp7ImA9WxNRFU8.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-253828324293738651</id><published>2009-09-09T12:42:00.000-07:00</published><updated>2009-09-09T12:42:00.340-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T12:42:00.340-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="backup" /><category scheme="http://www.blogger.com/atom/ns#" term="export" /><category scheme="http://www.blogger.com/atom/ns#" term="rdbms" /><category scheme="http://www.blogger.com/atom/ns#" term="clone" /><category scheme="http://www.blogger.com/atom/ns#" term="db2" /><title>Tips for dealing with DB2 database samples in your product</title><content type="html">&lt;p&gt;In trying to ship a sample of the ITM (IBM Tivoli Monitor) database utilized by our product, we stumbled upon the &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/c0005960.htm"&gt;cross-platform restrictions&lt;/a&gt; of the backup/restore commands for DB2, which state:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The supported platforms for DB2 backup and restore operations can be grouped into one of three families: &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Big-endian Linux&lt;sup&gt;®&lt;/sup&gt; and UNIX&lt;sup&gt;®&lt;/sup&gt;&lt;/li&gt;      &lt;li&gt;Little-endian Linux and UNIX &lt;/li&gt;      &lt;li&gt;Windows&lt;sup&gt;®&lt;/sup&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;After hours of fiddling with DB2 manuals and succeeding partially in moving the data from an DB2 in AIX 64 bits to a Windows 32 bits, I eventually stumbled upon this great developerWorks article, fittingly titled: &lt;a href="http://www.ibm.com/developerworks/db2/library/techarticle/dm-0403melnyk/index.html"&gt;Using DB2 utilities to clone databases across different platforms&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Essentially it uses a combination of the “db2move” and “db2look” commands, like this&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Exporting the data&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To export the contents of the database, change to the directory where the exported directory where the files should be written and run:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;db2move &lt;i&gt;WAREHOUS&lt;/i&gt; export -sn &lt;i&gt;ITMUSER          &lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;db2look -d &lt;i&gt;WAREHOUS&lt;/i&gt; -e -a -o db2look.sql        &lt;br /&gt;&lt;/b&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;where &lt;i&gt;WAREHOUS&lt;/i&gt; is the name of the database I was exporting and &lt;i&gt;ITMUSER&lt;/i&gt; the schema for it. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Importing the data&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Copy over the files to the target machine and change to the directory where the exported files are. Then run the command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;db2 “create db WAREHOUS”        &lt;br /&gt;db2 –tvf db2look.sql        &lt;br /&gt;&lt;/b&gt;&lt;b&gt;db2move WAREHOUS import&lt;/b&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;where &lt;i&gt;WAREHOUS&lt;/i&gt; is the name of the database you are importing. &lt;/p&gt;  &lt;p&gt;You can use a different database name, but you need to edit the first line of the db2look.sql file to match the name.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-253828324293738651?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/qRpUGxL3HIg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/253828324293738651/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/09/tips-for-dealing-with-db2-database.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/253828324293738651?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/253828324293738651?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/qRpUGxL3HIg/tips-for-dealing-with-db2-database.html" title="Tips for dealing with DB2 database samples in your product" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/09/tips-for-dealing-with-db2-database.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUCRXs9eCp7ImA9WxNXEko.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-8335743092020018337</id><published>2009-09-03T12:25:00.000-07:00</published><updated>2009-09-29T19:37:44.560-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T19:37:44.560-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="jmockit" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-test" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="junit" /><category scheme="http://www.blogger.com/atom/ns#" term="ddtunit" /><category scheme="http://www.blogger.com/atom/ns#" term="jmock" /><title>Unit testing tools, a minimalist toolset.</title><content type="html">&lt;p&gt;After wading through the sea of unit testing tools out there, here is a minimalist (and so far, sufficient) set of open-source tools for testing server-side centric Java code.&lt;/p&gt;  &lt;p&gt;----&lt;/p&gt;  &lt;p&gt;&lt;b&gt;JUnit 4.x&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;That is almost a given, full integration with Eclipse and Ant, standard in the industry, etc, etc. JUnit 4.1 is the last release where I did some thorough investigation of any new function, though the just released &lt;a href="http://github.com/KentBeck/junit/raw/23ffc6baf5768057e366e183e53f4dfa86fbb005/doc/ReleaseNotes4.7.txt"&gt;JUnit 4.7&lt;/a&gt; (Aug/4th)  has some function I would like to explore.&lt;/p&gt;  &lt;p&gt;----&lt;/p&gt;  &lt;p&gt;&lt;b&gt;DDTUnit (&lt;/b&gt;&lt;a href="http://ddtunit.sourceforge.net/%29"&gt;http://ddtunit.sourceforge.net/)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is the best alternative for data-driven testing, where the test code is small but has to use different data inputs. &lt;/p&gt;  &lt;p&gt;&lt;i&gt;Side comment:This presentation cross-compares DDTUnit with other data-driven approaches:&lt;/i&gt;&lt;/p&gt;  &lt;div id="__ss_1933154" style="width: 425px; text-align: left;"&gt;&lt;a title="Data-Driven Unit Testing for Java" style="margin: 12px 0px 3px; display: block; font-family: helvetica,arial,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; text-decoration: underline;" href="http://www.slideshare.net/dnastacio/datadriven-unit-testing-for-java-1933154"&gt;Data-Driven Unit Testing for Java&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ddt-unit-test-090831135110-phpapp01&amp;amp;stripped_title=datadriven-unit-testing-for-java-1933154"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ddt-unit-test-090831135110-phpapp01&amp;amp;stripped_title=datadriven-unit-testing-for-java-1933154" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/dnastacio"&gt;Denilson Nastacio&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Tip: The syntax for the test XML data can be a chore, but this Eclipse snippet (with instructions) can help:  &lt;br /&gt;&lt;a href="http://sourcepatch.blogspot.com/2009/08/ddtunit-and-eclipse-snippets.html"&gt;http://sourcepatch.blogspot.com/2009/08/ddtunit-and-eclipse-snippets.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;----&lt;/p&gt;  &lt;del&gt;&lt;p&gt;&lt;b&gt;JMock (&lt;/b&gt;&lt;a href="http://www.jmock.org/"&gt;http://www.jmock.org/&lt;/a&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This library allows you to pre-program objects in the JUnit testcase with the "right" responses to exercise the target code. &lt;/p&gt;  &lt;p&gt;----&lt;/p&gt;&lt;/del&gt;  &lt;p&gt;&lt;b&gt;JMockit&lt;/b&gt; (&lt;a href="https://jmockit.dev.java.net/"&gt;https://jmockit.dev.java.net/&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;This library is used to replace Java calls ordinarily not under your control with code under your control.&lt;/p&gt;  &lt;p&gt;For instance, you can intercept a call to DriverManager.getConnection and return your own implementation of java.sql.Connection.  &lt;br /&gt;&lt;del&gt;&lt;br /&gt;&lt;b&gt;Tip 1&lt;/b&gt;: This library requires you to add -java.agent=build_dir/libraries/test/jmockit/jmockit.jar to the unit execution path.   &lt;br /&gt;&lt;b&gt;Tip 2&lt;/b&gt;: Avoid it if you can, it makes tests slower and harder to follow. If you have another entry point to pass a JMock object, such as setter method, do it. &lt;/del&gt;&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;p&gt;Links I have bookmarked about unit testing recently: &lt;a href="http://delicious.com/nastacio/unit-testing"&gt;http://delicious.com/nastacio/unit-testing&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-8335743092020018337?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/tepSC9fg4AM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/8335743092020018337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/09/unit-testing-tools-minimalist-toolset.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/8335743092020018337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/8335743092020018337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/tepSC9fg4AM/unit-testing-tools-minimalist-toolset.html" title="Unit testing tools, a minimalist toolset." /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/09/unit-testing-tools-minimalist-toolset.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIHQH06cSp7ImA9WxNSF0k.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-9182046577229518917</id><published>2009-08-31T12:20:00.001-07:00</published><updated>2009-08-31T12:22:11.319-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-31T12:22:11.319-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="junit" /><category scheme="http://www.blogger.com/atom/ns#" term="ddtunit" /><category scheme="http://www.blogger.com/atom/ns#" term="data-driven-unit-test" /><title>DDTUnit and Eclipse Snippets</title><content type="html">&lt;p&gt;One of the tedious aspects of using the excellent &lt;a href="http://ddtunit.sourceforge.net/index.html"&gt;DDTUnit&lt;/a&gt; library is the creation of the Java class for the test case and the XML data sets. There is no nice Eclipse wizard to do that for you, but today I started to create a set of Eclipse snippets for it. My productivity went to the ditch for the first three hours, but it should pay off sometime between today and tomorrow.&lt;/p&gt;  &lt;p&gt;I just select some complicated block of DDTUnit source code or XML on Eclipse, right-click it and choose &amp;quot;Add to snippets&amp;quot;. I then replace some hard-coded values, such as the name of an input object, with a variable and save it. &lt;/p&gt;  &lt;p&gt;Later, when I need a similar snippet, I just position the cursor where I need the new source code or XML, double-click the snippet from the toolbar, fill out any variables associated with the template (usually one or two) and goodbye round-trips to the DDTUnit reference guide.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_g1cgAPRqWkA/SpwigmqKAYI/AAAAAAAAEEM/Wdq9L-gtJcc/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="432" alt="image" src="http://lh4.ggpht.com/_g1cgAPRqWkA/SpwihIKnDnI/AAAAAAAAEEQ/Ps_-5baOBOY/image_thumb%5B1%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The snippets library master: &lt;a href="http://drop.io/dnastacio/asset/ddtunit-eclipse-snippets-xml"&gt;http://drop.io/dnastacio/asset/ddtunit-eclipse-snippets-xml&lt;/a&gt;&lt;a title="http://www.4shared.com/file/129156918/2ae57708/ddtunit-eclipse-snippets.html&amp;#13;&amp;#10;" href="http://www.4shared.com/file/129156918/2ae57708/ddtunit-eclipse-snippets.html"&gt;     &lt;br /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-9182046577229518917?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/LxY1qg2v8RI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/9182046577229518917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/08/ddtunit-and-eclipse-snippets.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/9182046577229518917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/9182046577229518917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/LxY1qg2v8RI/ddtunit-and-eclipse-snippets.html" title="DDTUnit and Eclipse Snippets" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_g1cgAPRqWkA/SpwihIKnDnI/AAAAAAAAEEQ/Ps_-5baOBOY/s72-c/image_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/08/ddtunit-and-eclipse-snippets.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQNRH0zeSp7ImA9WxNSF04.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-1216486345172260415</id><published>2009-08-31T08:26:00.001-07:00</published><updated>2009-08-31T08:26:35.381-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-31T08:26:35.381-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="javadoc" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="jmock" /><title>Code comments are for newbies</title><content type="html">&lt;p&gt;I am sure you have seen or participated in a debate about how much or how little comments one should put in his own code. &lt;/p&gt;  &lt;p&gt;Now look at this pearl I found while writing a presentation about the excellent JMock library.&lt;/p&gt;  &lt;p&gt;Just think of the possibilities in terms of team communication: “Jim, can you unlock ThatClassThatFixesThatBugWeDiscussedLastThursday.java?”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://rtpgsa.ibm.com/%7Enastacio/public/blogimg/Javadocsarefornewbies_148FC/image.png"&gt;&lt;img title="image" height="291" alt="image" src="http://rtpgsa.ibm.com/%7Enastacio/public/blogimg/Javadocsarefornewbies_148FC/image_thumb.png" width="798" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-1216486345172260415?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/PMKr8debn2E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/1216486345172260415/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/08/code-comments-are-for-newbies.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/1216486345172260415?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/1216486345172260415?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/PMKr8debn2E/code-comments-are-for-newbies.html" title="Code comments are for newbies" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/08/code-comments-are-for-newbies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YNRXgycSp7ImA9WxJaEE0.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-7012610098960955186</id><published>2009-07-30T18:53:00.001-07:00</published><updated>2009-07-30T18:53:14.699-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-30T18:53:14.699-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="analysis" /><category scheme="http://www.blogger.com/atom/ns#" term="static" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Distributed Java code inspection</title><content type="html">&lt;p&gt;As a requirement of our current project, we wanted to establish a minimum criteria of code quality ahead of formal code inspections. No point in wasting valuable brain capacity at spotting simple problems such as using “==” instead of “equals” and so on.&lt;/p&gt;  &lt;p&gt;Static code analysis is a good starting point, though it can be a bit intransigent about false-positives, where the developer had good cause to write code in a way that the rule developer could not have anticipated.&lt;/p&gt;  &lt;p&gt;Being that our main development tool is Eclipse, this was the one criteria that made me give up on the excellent &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt;, in that there was no way to mark up the source code to tell FindBugs to ignore the problem in future scans.&lt;/p&gt;  &lt;p&gt;Enter the Eclipse &lt;a href="http://www.eclipse.org/tptp/home/documents/process/development/static_analysis/TPTP_static_analysis_tutorial_part1.html"&gt;built-in code analysis&lt;/a&gt;, which not only allows scanning source code, but also has a simple way of marking false-positives inside the source code using a Java comment, so that further scans will not flag the problem again.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sharing a rule base&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first step in sharing a rule base is to create one, which can be done from the “Run –&amp;gt; Analysis…” menu.&lt;/p&gt;  &lt;p&gt;Set the “Scope” to “Analyze selected projects”, without actually checking any project box. This will allow you to right-click any project and then run the analysis only on the selected project.&lt;/p&gt;  &lt;p&gt;Under “Rules”, pick the ones you consider the most important. It took me a couple of scans on pre-existing code to weed out the faulty ones (there are a few) and the overly conservative ones. Once I was satisfied, I clicked on the “Export…” button to save it to a file I could share with my colleagues.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJOZvc2LlI/AAAAAAAAEDU/3qio7SGKEx0/s1600-h/image%5B7%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJObFMQ6jI/AAAAAAAAEDY/QmrQcCF-kUk/image_thumb%5B3%5D.png?imgmax=800" width="636" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Importing a rule base&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Starting from the “Run –&amp;gt; Analysis…” menu again, click on the “New launch configuration” button, give it a name. Again, set the “Scope” to “Analyze selected projects”, without actually checking any project box. &lt;/p&gt;  &lt;p&gt;In the “Rules” tab, click on the “Import…” button and select the “.dat” file exported in the previous step, which is stored in a location shared with the entire team.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scanning the code&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Right-click a Java project and select “Analysis –&amp;gt; [Name of your launch configuration]”. In a few seconds, the results will be displayed in the “Analysis Results” view.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJOcyxVi5I/AAAAAAAAEDc/-ili5-iU-Bw/s1600-h/image%5B11%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJOe1Dho3I/AAAAAAAAEDg/KU964k1eiDE/image_thumb%5B5%5D.png?imgmax=800" width="425" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Right-clicking any of the individual results shows a menu with options for a “Quick Fix” (available for some rules) or the selection of “Ignore Result”. The latter option will add a Java comment next to the flagged line of code, instructing the analyzer to not flag the problem in future scans.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJOfvMG6dI/AAAAAAAAEDk/6DY2TBaZ1M4/s1600-h/image%5B15%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="345" alt="image" src="http://lh4.ggpht.com/_g1cgAPRqWkA/SnJOheYM7xI/AAAAAAAAEDo/JQjIne9Fego/image_thumb%5B7%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJOh8ABefI/AAAAAAAAEDs/-NqXjpMSZUg/s1600-h/image%5B19%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="36" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/SnJOicGaHaI/AAAAAAAAEDw/4sWCj6vTnLc/image_thumb%5B9%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-7012610098960955186?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/iTqyVDvKX-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/7012610098960955186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/07/distributed-java-code-inspection.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7012610098960955186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7012610098960955186?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/iTqyVDvKX-0/distributed-java-code-inspection.html" title="Distributed Java code inspection" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_g1cgAPRqWkA/SnJObFMQ6jI/AAAAAAAAEDY/QmrQcCF-kUk/s72-c/image_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/07/distributed-java-code-inspection.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EEQXo9cCp7ImA9WxJRFkg.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-6557807811828986909</id><published>2009-05-18T06:00:00.000-07:00</published><updated>2009-05-18T06:00:00.468-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-18T06:00:00.468-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="trace" /><category scheme="http://www.blogger.com/atom/ns#" term="logging" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="serviceability" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspects" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr47" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java logging: suppressing System.out debugging calls - part 7</title><content type="html">&lt;p&gt;We have all been there, adding a few System.out calls here and there to our Java code during development to help debug something that defies (bad) logic.&lt;/p&gt;  &lt;p&gt;It seems all too common to, ahem, leave some of those calls behind, which introduces several problems in a product. Don't we love to see the occasional &amp;quot;WE ARE HERE!!&amp;quot; graffiti in the server console, or a 50MB trace file that cannot be opened by any text editor?&lt;/p&gt;  &lt;p&gt;One way to prevent this problem is to continuously demand that developers pay attention to it, either deleting the offending statements or converting them to a Logger.log call. That approach also has drawbacks in that mistakes are, well, mistakes. A complementary approach to pleading with developers is to intercept the requests to System.out and System.err and route the &amp;quot;println&amp;quot; commands to a trace call.    &lt;br /&gt;    &lt;br /&gt;Here are the changes to the &lt;a href="http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-serviceability_10.html"&gt;Logging serviceability aspect&lt;/a&gt;. I still want to find a way to use the name of method calling System.out.println in the trace calls, but for now, here are the interesting bits:&lt;/p&gt;  &lt;pre&gt;...&lt;br /&gt;&lt;br /&gt;public aspect Logging pertypewithin((my..*) &amp;amp;&amp;amp; !Exception+){&lt;br /&gt;&lt;br /&gt;	/**&lt;br /&gt;	 * Trace handler for each type.&lt;br /&gt;	 */&lt;br /&gt;	private static Logger trace = Logger.getLogger(&amp;quot;my.project&amp;quot; ) ;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;	private static TracePrintStream sysoutTrace = null;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;         ...&lt;br /&gt;&lt;br /&gt;	/**&lt;br /&gt;	 * After the initialization of all classes in this project.&lt;br /&gt;	 */&lt;br /&gt;	after(): dcofpClassInitializer() {&lt;br /&gt;		String classname = thisJoinPointStaticPart.getSourceLocation()&lt;br /&gt;				.getWithinType().getName();&lt;br /&gt;		classname = LoggingUtil.normalizeClassName(classname);&lt;br /&gt;		trace = Logger.getLogger(classname);&lt;br /&gt;&lt;strong&gt;		sysoutTrace = new TracePrintStream(trace, &amp;quot;System.out&amp;quot;, System.out);&lt;br /&gt;&lt;/strong&gt;	}&lt;br /&gt;&lt;br /&gt;         ...&lt;br /&gt;&lt;br /&gt;	/**&lt;br /&gt;	 * Replace calls to SystemOut with trace calls&lt;br /&gt;	 */&lt;br /&gt;	PrintStream around(): dcofpSystemOutPrintln() {&lt;br /&gt;		return sysoutTrace;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;         ...&lt;br /&gt;&lt;br /&gt;	/**&lt;br /&gt;	 * Inner class used to convert System.out.println calls to trace calls.&lt;br /&gt;	 */&lt;br /&gt;	public class TracePrintStream extends PrintStream {&lt;br /&gt;...&lt;br /&gt;&lt;strong&gt;		public void println(String str) {&lt;br /&gt;			trace.logp(Level.FINER, trace.getName(), method, str);&lt;br /&gt;		}&lt;br /&gt;&lt;/strong&gt;...&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-6557807811828986909?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/sIBXSRndZOQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/6557807811828986909/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/05/aspectj-for-java-logging-suppressing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6557807811828986909?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6557807811828986909?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/sIBXSRndZOQ/aspectj-for-java-logging-suppressing.html" title="AspectJ for Java logging: suppressing System.out debugging calls - part 7" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/05/aspectj-for-java-logging-suppressing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEGQXo4fCp7ImA9WxJREUo.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-9160232200808442820</id><published>2009-05-12T18:37:00.001-07:00</published><updated>2009-05-12T18:37:00.434-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-12T18:37:00.434-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="xmlbeans" /><title>Generated Java-XML bindings and external builders in Eclipse</title><content type="html">&lt;p&gt;Our project is using the &lt;a title="Welcome to XMLBeans" href="http://xmlbeans.apache.org/" target="_blank"&gt;Apache XMLBeans&lt;/a&gt; tool to bind XML schemas to Java code. &lt;/p&gt;  &lt;p&gt;One possibility to deal with the bindings is to generate them on a local machine and check in the generated code. The drawback is that people maintaining the code need to deal with all sorts of file operations for things as simple as a namespace change. The Java bindings wiggles at the will of its source XSD file, so that checking it in is not far from checking in a generated JAR or WAR file.&lt;/p&gt;  &lt;p&gt;The other possibility is to generate the code during build time, using the &lt;a href="http://xmlbeans.apache.org/docs/2.0.0/guide/antXmlbean.html" target="_blank"&gt;xmlbean ant task&lt;/a&gt;, which would be sort of annoying for developers using the Eclipse environment. Whenever the project was imported anew from the source control system, they would have to first invoke the generation target and then refresh their workspace.&lt;/p&gt;  &lt;p&gt;It turns out Eclipse has a great solution for this, in the form of a project builder.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blogs.tap.ibm.com/weblogs/rtpforge/resource/ant-builder.png" /&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;I created a new builder, which invoked the correct ant target every time a developer used &amp;quot;clean&amp;quot; or &amp;quot;build&amp;quot;.&lt;/p&gt;  &lt;p&gt;That was it for the easy part. The next trick was to make the Ant target as efficient as possible, since it would be impractical for developers to wait several seconds for the &amp;quot;xmlbean&amp;quot; task completion every time they did something as simple as updating an unrelated Java source file.&lt;/p&gt;  &lt;p&gt;That is when the Ant conditional targets come in handy. It was only a matter of setting a property if the files had never been generated or if the source XSD file was updated after they had been generated.&lt;/p&gt;  &lt;pre&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;&amp;lt;property&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;name=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;xmlbean.javac.optimize&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;value=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;on&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;property&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;name=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;xmlbean.verbose&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;value=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;false&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;property&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;name=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;xmlbean.quiet&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;value=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;true&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;property&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;name=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;design.info.schema&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;value=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;${dir.schema}/DesignInfo.xsd&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;/&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;...&lt;/font&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;&amp;lt;condition&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;b&gt;&lt;font color="#000080" size="2"&gt;property=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;xmlbean.designinfo.updated&amp;quot;&lt;/font&gt;&lt;/b&gt;&lt;font color="#000080" size="2"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;or&amp;gt;&lt;br /&gt;&lt;font color="#000080" size="2"&gt;        &amp;lt;not&amp;gt;&lt;br /&gt;            &amp;lt;available&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;file=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;${dir.build.xml.classes}&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/not&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;        &amp;lt;uptodate&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;targetfile=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;${design.info.schema}&amp;quot;&lt;/font&gt;&lt;font color="#000080" size="2"&gt;&amp;gt;&lt;br /&gt;               &amp;lt;srcfiles&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;dir=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;${dir.build.xml.classes}&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/uptodate&amp;gt;&lt;br /&gt;    &amp;lt;/or&amp;gt;&lt;br /&gt;&amp;lt;/condition&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;#160;&lt;br /&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;&amp;lt;target&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;name=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;genxmlbeans.designinfo&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;b&gt;&lt;font color="#000080" size="2"&gt;if=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;xmlbean.designinfo.updated&amp;quot;&lt;/font&gt;&lt;/b&gt;&lt;font color="#000080" size="2"&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;    &amp;lt;xmlbean&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#000080" size="2"&gt;schema=&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&amp;quot;${design.info.schema}&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; &lt;br /&gt;             &lt;font color="#000080"&gt;classgendir=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;${dir.build.xml.classes}&amp;quot;&lt;/font&gt; &lt;br /&gt;             &lt;font color="#000080"&gt;classpathref=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;class.path&amp;quot;&lt;/font&gt; &lt;br /&gt;             &lt;font color="#000080"&gt;failonerror=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;true&amp;quot;&lt;/font&gt; &lt;br /&gt;             &lt;font color="#000080"&gt;optimize=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;${xmlbean.javac.optimize}&amp;quot;&lt;/font&gt; &lt;br /&gt;             &lt;font color="#000080"&gt;verbose=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;${xmlbean.verbose}&amp;quot;&lt;/font&gt; &lt;br /&gt;             &lt;font color="#000080"&gt;quiet=&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;${xmlbean.quiet}&amp;quot;&lt;/font&gt; &lt;font color="#000080"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;font color="#000080" size="2"&gt;&amp;lt;/target&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-9160232200808442820?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/qy32KhnHWJ4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/9160232200808442820/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/05/generated-java-xml-bindings-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/9160232200808442820?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/9160232200808442820?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/qy32KhnHWJ4/generated-java-xml-bindings-and.html" title="Generated Java-XML bindings and external builders in Eclipse" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/05/generated-java-xml-bindings-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEGQXkzeip7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-6124328337060546123</id><published>2009-05-04T07:17:00.000-07:00</published><updated>2009-05-04T07:17:00.782-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:17:00.782-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-test" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="ddtunit" /><title>DDTUnit snippet to represent a HashMap containing complex objects</title><content type="html">As a big fan of &lt;a href="http://ddtunit.sourceforge.net/"&gt;DDTUnit&lt;/a&gt; for Java unit testing, this gets me every time. I often need a java.util.HashMap object with complex values. Here it is for posterity (and later lookup) :   &lt;br /&gt;  &lt;br /&gt;  &lt;pre&gt;    &amp;lt;obj id=&amp;quot;&lt;b&gt;&lt;font color="#cc0000"&gt;masterResults&lt;/font&gt;&lt;/b&gt;&amp;quot; type=&amp;quot;&lt;font color="#3333ff"&gt;java.util.HashMap&lt;/font&gt;&amp;quot; &lt;br /&gt;         hint=&amp;quot;&lt;font color="#3333ff"&gt;map&lt;/font&gt;&amp;quot; keytype=&amp;quot;&lt;font color="#3333ff"&gt;string&lt;/font&gt;&amp;quot; valuetype=&amp;quot;&lt;font color="#3333ff"&gt;com.company.project.LogFileResult&lt;/font&gt;&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;key type=&amp;quot;&lt;font color="#3333ff"&gt;java.lang.String&lt;/font&gt;&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data/com.&lt;font color="#3333ff"&gt;com.company.project&lt;/font&gt;.custom/config/Lotus/Domino/nl/example.log&lt;br /&gt;            &amp;lt;/key&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;b&gt;&amp;lt;value type=&amp;quot;&lt;font color="#3333ff"&gt;&lt;font color="#3333ff"&gt;com.company.project&lt;/font&gt;.LogFileResult&lt;/font&gt;&amp;quot; hint=&amp;quot;&lt;font color="#3333ff"&gt;call&lt;/font&gt;&amp;quot;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; method=&amp;quot;&lt;font color="#3333ff"&gt;constructor&lt;/font&gt;&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;/value&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/item&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/obj&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Java code to retrieve it inside the DDTUnit fixture: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    HashMap masterResults = (HashMap) getObject(&lt;font color="#cc0000"&gt;&lt;b&gt;&amp;quot;masterResults&lt;/b&gt;&lt;/font&gt;&amp;quot;);&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-6124328337060546123?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/oi9wPhHwoSk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/6124328337060546123/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/05/ddtunit-snippet-to-represent-hashmap.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6124328337060546123?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6124328337060546123?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/oi9wPhHwoSk/ddtunit-snippet-to-represent-hashmap.html" title="DDTUnit snippet to represent a HashMap containing complex objects" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/05/ddtunit-snippet-to-represent-hashmap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkECR3c-eSp7ImA9WxJSEEs.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-6896121334620455850</id><published>2009-04-29T21:11:00.001-07:00</published><updated>2009-04-29T21:11:06.951-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-29T21:11:06.951-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>"Improving interface design" presentation</title><content type="html">By the way of a colleague, a thought inspiring presentation on the creation of user interfaces.   &lt;br /&gt;  &lt;br /&gt;This one quote stuck with me above everything else:   &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;&amp;quot;I've been amazed at how often those outside the discipline of design assume that what designers do is decoration. Good design is problem solving.&amp;quot;    &lt;br /&gt;&lt;/blockquote&gt;  &lt;br /&gt;  &lt;div id="__ss_49815" style="width: 425px; text-align: left"&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://s3.amazonaws.com/slideshare/ssplayer2.swf?doc=improving-interface-design-29757"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://s3.amazonaws.com/slideshare/ssplayer2.swf?doc=improving-interface-design-29757" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-bottom: -5px; border-right-width: 0px" alt="SlideShare" src="http://s3.amazonaws.com/slideshare/logo_embd.png" /&gt;&lt;/a&gt; | &lt;a title="View &amp;#39;Improving Interface Design&amp;#39; on SlideShare" href="http://www.slideshare.net/garrettdimon/improving-interface-design"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload"&gt;Upload your own&lt;/a&gt;&lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-6896121334620455850?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/mPkCPFQljVY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/6896121334620455850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/04/interface-design-presentation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6896121334620455850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6896121334620455850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/mPkCPFQljVY/interface-design-presentation.html" title="&amp;quot;Improving interface design&amp;quot; presentation" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/04/interface-design-presentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYMQXg4fyp7ImA9WxVaE0o.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-5932574473249925929</id><published>2009-04-10T07:03:00.000-07:00</published><updated>2009-04-10T07:03:00.637-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T07:03:00.637-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="logging" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="log4j" /><category scheme="http://www.blogger.com/atom/ns#" term="serviceability" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aspects" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java logging: Serviceability without the clutter - part 6</title><content type="html">Just realized I was missing the join point for constructors in the code. I also noticed the &amp;quot;getArgs&amp;quot; method in the &amp;quot;thisJoinPoint&amp;quot; object, which simplified the &amp;quot;methodError&amp;quot; point cut.   &lt;br /&gt;  &lt;br /&gt;See the changes in red and the whole &amp;quot;Logging.aj&amp;quot; aspect as it stands today:   &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;package my&lt;/span&gt;.project.aspects;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;import &lt;/span&gt;java.util.logging.Level;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;import &lt;/span&gt;java.util.logging.Logger;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;/**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt; * Aspect for Java logging throughout the code base.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt; */&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;public aspect &lt;/span&gt;Logging &lt;span style="font-weight: bold"&gt;pertypewithin&lt;/span&gt;(my..* &amp;amp;&amp;amp; !Exception+) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;private static &lt;/span&gt;Logger trace = &lt;/code&gt;&lt;code&gt;Logger.getLogger(&lt;font color="#3333ff"&gt;&amp;quot;trace.my.project&amp;quot;&lt;/font&gt;)&lt;/code&gt;&lt;code&gt;;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160; &lt;span style="color: rgb(51,204,255)"&gt; /*&lt;/span&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Pointcuts&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;code&gt;&amp;#160; &lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;    /**&lt;br /&gt;     * Initialization of all classes in the project.&lt;br /&gt;     */&lt;br /&gt;&lt;span style="color: rgb(51,0,51)"&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;classInitializer() :&lt;/span&gt;&lt;br style="color: rgb(51,0,51)" /&gt;&lt;span style="color: rgb(51,0,51)"&gt;    	&lt;span style="font-weight: bold"&gt;staticinitialization&lt;/span&gt;(my.project..*) &amp;amp;&amp;amp;&lt;/span&gt;&lt;br style="color: rgb(51,0,51)" /&gt;&lt;span style="color: rgb(51,0,51)"&gt;        !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(Logging);&lt;/span&gt;&lt;br style="color: rgb(51,0,51)" /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Execution body for all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;method():&lt;/code&gt;&lt;br /&gt;&lt;code&gt;        (&lt;span style="font-weight: bold"&gt;&lt;br /&gt;&lt;span style="color: rgb(255,0,0); text-decoration: underline"&gt;          execution&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255,0,0); text-decoration: underline"&gt;(my.project..*.new(..)) ||&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;  execution&lt;/span&gt;(* my&lt;/code&gt;&lt;code&gt;.project&lt;/code&gt;&lt;code&gt;..*.*(..))&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;&amp;#160; &amp;amp;&amp;amp; &lt;/code&gt;&lt;code&gt;!&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(my&lt;/code&gt;&lt;code&gt;.project&lt;/code&gt;&lt;code&gt;.D.*) &lt;br /&gt;        &amp;amp;&amp;amp;&lt;/code&gt;&lt;code&gt; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(Logging);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Exception handling blocks inside all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;methodError():&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;handler&lt;/span&gt;(handler(Throwable+) &amp;amp;&amp;amp;&lt;br /&gt;        !&lt;span style="font-weight: bold"&gt;handler&lt;/span&gt;(InterruptedException+) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(my&lt;/code&gt;&lt;code&gt;.project&lt;/code&gt;&lt;code&gt;..*.*) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(&lt;/code&gt;&lt;code&gt;my.project.D&lt;/code&gt;&lt;code&gt;.*) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(Logging);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(51,204,255)"&gt;/*&lt;/span&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Join points&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * After the initialization for all classes in this project&lt;/code&gt;&lt;code style="color: rgb(51,204,255)"&gt;.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;    &lt;span style="font-weight: bold"&gt;after&lt;/span&gt;(): classInitializer() {&lt;br /&gt;    	String classname = &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSourceLocation().getWithinType().getName();&lt;br /&gt;    	trace = Logger.getLogger(&amp;quot;trace.&amp;quot; + classname);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Entry trace statements for all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;before&lt;/span&gt;(): method() {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.FINER)) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.entering(&lt;br /&gt;                    &lt;span style="font-weight: bold"&gt;&lt;span style="font-family: monospace"&gt;thisJoinPointStaticPart&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace"&gt;.getSourceLocation().getWithinType().getName(),&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSignature().toString(), &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;thisJoinPoint&lt;/span&gt;.getArgs());&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Exit trace statements for all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;after&lt;/span&gt;() &lt;span style="font-weight: bold"&gt;returning &lt;/span&gt;(Object result): method() {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (trace.isLoggable(Level.FINER)) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.exiting&lt;span style="font-weight: bold"&gt;(&lt;br /&gt;&lt;b&gt;                    thisJoinPointStaticPart&lt;/b&gt;&lt;/span&gt;.getSourceLocation().getWithinType().getName(),&lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;b&gt;thisJoinPointStaticPart&lt;/b&gt;.getSignature().toString(),&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160; &lt;span style="color: rgb(51,204,255)"&gt;&amp;#160; /**&lt;/span&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Exception handling blocks inside all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;before&lt;/span&gt;(): methodError() {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.FINER)) {&lt;/code&gt;&lt;br /&gt;&lt;span style="color: rgb(255,0,0); text-decoration: underline"&gt;            Object target = &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255,0,0); text-decoration: underline"&gt;thisJoinPoint&lt;/span&gt;&lt;span style="color: rgb(255,0,0); text-decoration: underline"&gt;.getArgs()[0];&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.logp(Level.SEVERE, &lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;&lt;b&gt;                    &lt;/b&gt;&lt;/span&gt;&lt;/code&gt;&lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSourceLocation().getWithinType().getName()&lt;code&gt;,&lt;/code&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/code&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSignature().toLongString(), &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold; color: rgb(51,102,255)"&gt;&amp;quot;Caught exception: &amp;quot;&lt;/span&gt; + target.getClass().toString(),&lt;/code&gt; &lt;br /&gt;                    (Throwable)target);&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-5932574473249925929?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/PEiQGfMjQcM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/5932574473249925929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-serviceability_10.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5932574473249925929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5932574473249925929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/PEiQGfMjQcM/aspectj-for-java-logging-serviceability_10.html" title="AspectJ for Java logging: Serviceability without the clutter - part 6" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-serviceability_10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMDR38_eCp7ImA9WxVaEUw.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-4104912660361279307</id><published>2009-04-07T07:10:00.001-07:00</published><updated>2009-04-07T07:27:56.140-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-07T07:27:56.140-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="trace" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="log4j" /><category scheme="http://www.blogger.com/atom/ns#" term="serviceability" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr47" /><category scheme="http://www.blogger.com/atom/ns#" term="aspects" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java Logging: Individual tracing control per Java package - Part 5</title><content type="html">&lt;p&gt;In &lt;a href="http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability_13.html"&gt;&amp;quot;AspectJ for Java logging: Serviceability without the clutter - part 2&amp;quot;&lt;/a&gt; I had some difficulty in assigning a different trace handler for each class, which severely limited the application of the &amp;quot;Logging&amp;quot; aspect on larger programs. After all, it does not make sense to enable verbose trace on method entry/exit for all modules when debugging a single module. &lt;/p&gt;  &lt;p&gt;A few minutes ago, some more reading solved the problem: one can use the &amp;quot;&lt;b&gt;pertypewithin&lt;/b&gt;&amp;quot; aspect declaration, like this: &lt;/p&gt;  &lt;blockquote&gt; &lt;pre&gt;&lt;span style="font-weight: bold"&gt;public aspect &lt;/span&gt;Logging &lt;span style="font-weight: bold"&gt;pertypewithin&lt;/span&gt;(my.project..* &amp;amp;&amp;amp; !Exception+){&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(102,0,204)"&gt;/**&lt;/span&gt;&lt;br style="color: rgb(102,0,204)" /&gt;&lt;span style="color: rgb(102,0,204)"&gt;     * Trace handler for each type.&lt;/span&gt;&lt;br style="color: rgb(102,0,204)" /&gt;&lt;span style="color: rgb(102,0,204)"&gt;     */&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;private static &lt;/span&gt;Logger trace = &lt;span style="font-weight: bold"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(102,0,204)"&gt; /**&lt;/span&gt;&lt;br style="color: rgb(102,0,204)" /&gt;&lt;span style="color: rgb(102,0,204)"&gt;     * Initialization of all classes in the project.&lt;/span&gt;&lt;br style="color: rgb(102,0,204)" /&gt;&lt;span style="color: rgb(102,0,204)"&gt;     */&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;projectClassInitializer() :&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;staticinitialization&lt;/span&gt;(my.project..*) &amp;amp;&amp;amp;&lt;br /&gt;        !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(Logging);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(102,0,204)"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102,0,204)"&gt;     * After the initialization of all classes in this project.&lt;/span&gt;&lt;br style="color: rgb(102,0,204)" /&gt;&lt;span style="color: rgb(102,0,204)"&gt;     */&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;after&lt;/span&gt;(): projectClassInitializer() {&lt;br /&gt;    	String classname = &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSourceLocation().getWithinType().getName();&lt;br /&gt;    	trace = Logger.getLogger(&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;trace.&amp;quot;&lt;/span&gt; + classname);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, the pointcut &amp;quot;projectClassInitializer&amp;quot; will pick out the static declaration of all Java classes within the project. Exceptions declared in the project are left out, as I do not see usefulness in instrumenting such basic classes, but that is a matter of preference. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The &amp;quot;after&amp;quot; advice will guarantee that the &amp;quot;trace&amp;quot; handler is initialized at the end of the static initialization for each class, using a handle named &amp;quot;trace.&amp;lt;classname&amp;gt;&amp;quot;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With this arrangement, it is now possible to configure different tracing levels within the logging.properties file for your java application, setting a different level for an entire package or for a single class, like this: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre&gt;handlers = java.util.logging.ConsoleHandler&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,153)"&gt;trace.my.level = INFO&lt;/span&gt;&lt;br style="color: rgb(0,0,153)" /&gt;&lt;span style="color: rgb(0,0,153)"&gt;trace.com.ibm.project.module1.level = INFO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,153)"&gt;trace.com.ibm.&lt;/span&gt;&lt;span style="color: rgb(0,0,153)"&gt;project.&lt;/span&gt;&lt;span style="color: rgb(0,0,153)"&gt;module2.level = FINEST&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,153)"&gt;trace.com.ibm.&lt;/span&gt;&lt;span style="color: rgb(0,0,153)"&gt;project.&lt;/span&gt;&lt;span style="color: rgb(0,0,153)"&gt;module2.ClassA.level = FINER&lt;/span&gt;&lt;br style="color: rgb(0,0,153)" /&gt;...&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;----- &lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-4104912660361279307?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/c9V55-SHcts" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/4104912660361279307/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-individual.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/4104912660361279307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/4104912660361279307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/c9V55-SHcts/aspectj-for-java-logging-individual.html" title="AspectJ for Java Logging: Individual tracing control per Java package - Part 5" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-individual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEEQHw5fSp7ImA9WxVbF0s.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-7399241758501795119</id><published>2009-04-03T06:00:00.000-07:00</published><updated>2009-04-03T06:00:01.225-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-03T06:00:01.225-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="serviceability" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java logging: Serviceability without the clutter - Instrumenting a 3rd party library - part 4</title><content type="html">Another common serviceability problem while assembling libraries from multiple sources is that sometimes a reused library may use a difference serviceability framework, or even worse, not have any serviceability at all.   &lt;br /&gt;  &lt;br /&gt;In the previous entries I covered techniques to instrument your own source code and source code from a different contributor. Now it is time to cover a technique to cover 3rd party libraries.   &lt;br /&gt;  &lt;br /&gt;With AspectJ, this is a simple task accomplished with the AspectJ compiler: &lt;b&gt;ajc&lt;/b&gt;. The compiler parameters are covered in the &lt;a href="http://www.eclipse.org/aspectj/doc/released/devguide/ajc-ref.html"&gt;ajc page&lt;/a&gt; of the AspectJ developer's guide, but I suspect the majority of the people building Java code will resort to an &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; script. AspectJ has an Ant task called &lt;a href="http://www.eclipse.org/aspectj/doc/released/devguide/antTasks-iajc.html"&gt;iajc&lt;/a&gt;, from where you can execute the same commands.   &lt;br /&gt;  &lt;br /&gt;----   &lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Compiling your aspects&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;The first step is, of course, to compile the serviceability aspects covered in the previous entries.   &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;pre&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;iajc destdir&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;${dir.build.classes}&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;classpathref&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;class.path&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;deprecation&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;${javac.deprecation}&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="font-weight: bold"&gt;sourceroots&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="font-weight: bold"&gt;pathelement location&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;${dir.src}&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="font-weight: bold"&gt;pathelement location&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;${aspects.path}&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="font-weight: bold"&gt;sourceroots&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;span style="font-weight: bold"&gt;iajc&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;where &amp;quot;dir.src&amp;quot; is the directory where the project source code is located and &amp;quot;aspects.path&amp;quot; is the source directory where the aspects are located &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---- &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Instrumenting a 3rd party library&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Ant taks has to be slightly modified to reflect a JAR file as the type of input and output, like this: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;iajc outJar&lt;/span&gt;=&lt;span style="font-weight: bold; color: rgb(255,0,0)"&gt;&amp;quot;${dir.build.lib}/3rdparty.jar&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;classpathref&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;class.path&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;deprecation&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;${javac.deprecation}&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;&lt;span style="font-weight: bold"&gt;injars&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="font-weight: bold"&gt;pathelement location&lt;/span&gt;=&lt;span style="font-weight: bold; color: rgb(255,0,0)"&gt;&amp;quot;${3rdparth.installdir}/libs/3rdparty.jar&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="font-weight: bold"&gt;injars&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="font-weight: bold"&gt;sourceroots&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="font-weight: bold"&gt;pathelement location&lt;/span&gt;=&lt;span style="color: rgb(0,0,153)"&gt;&amp;quot;${aspects.path}&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="font-weight: bold"&gt;sourceroots&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;span style="font-weight: bold"&gt;iajc&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;---- &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And you are done! If both the &lt;a href="http://blogs.tap.ibm.com/weblogs/rtpforge/entry/aspectj_for_java_logging_serviceability"&gt;JSR-47&lt;/a&gt; and the &lt;a href="http://blogs.tap.ibm.com/weblogs/rtpforge/entry/aspectj_for_java_logging_serviceability1"&gt;Log4J&lt;/a&gt; aspects are in place, not only your new &amp;quot;3rdparty.jar&amp;quot; file will be instrumented with serviceability trace statements, it will also replace all extraneous Log4J calls with calls to their equivalent in JSR-47. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That is a very good result, considering that the resulting application assembled from multiple sources and libraries will benefit from these desirable serviceability traits: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Consistent tracing, with trace entries for all the method entry and exit points and for all catch blocks &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Consistent trace control, with a single JSR-47 logging.properties file for all components &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Consistent output, with all modules directing their tracing output to the same file. &lt;br /&gt;    &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-7399241758501795119?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/Bz-yBfdyUMA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/7399241758501795119/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-serviceability.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7399241758501795119?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7399241758501795119?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/Bz-yBfdyUMA/aspectj-for-java-logging-serviceability.html" title="AspectJ for Java logging: Serviceability without the clutter - Instrumenting a 3rd party library - part 4" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/04/aspectj-for-java-logging-serviceability.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkICSHc9eip7ImA9WxVbFEk.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-6875718508065700674</id><published>2009-03-30T13:22:00.001-07:00</published><updated>2009-03-30T13:22:49.962-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-30T13:22:49.962-07:00</app:edited><title>AspectJ Development Tools - Inline aspect visualization inside Eclipse</title><content type="html">As I wrote about using AspectJ for serviceability instrumentation, I thought I would also spend some time publishing a couple of screenshots of a great addition to your Eclipse environment.   &lt;br /&gt;  &lt;br /&gt;It is called AspectJ Development Tools, or AJDT, for short. AJDT adds a perspective and a handful of views that make it easy to visualize how the aspects are cross-cutting your code base.   &lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Installation&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;Your first step is to visit the &lt;a href="http://www.eclipse.org/ajdt/"&gt;AJDT web site&lt;/a&gt;, go to the &amp;quot;Downloads&amp;quot; page and determine the right level of AJDT for your Eclipse environment. For those using any of the Rational Software Development v7.0 siblings, such as Rational Software Architect, you are looking into the 3.2 version.   &lt;br /&gt;  &lt;br /&gt;The installation of the plugin follows the standard Eclipse &amp;quot;Help-&amp;gt;Software Updates-&amp;gt;Find and Install...&amp;quot; sequence, where you will be able to register the &lt;a href="http://download.eclipse.org/tools/ajdt/32/update"&gt;Eclipse update side for AJDT&lt;/a&gt;.   &lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Converting a Java project into an AspectJ project&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;You will need to convert Java projects into AspectJ projects before you can use Eclipse to apply aspects to your Java code. The &amp;quot;conversion&amp;quot; is fairly benign and reversible, adding a couple of facets to the &amp;quot;.project&amp;quot; file.   &lt;br /&gt;  &lt;br /&gt;An &amp;quot;AspectJ&amp;quot; sub-menu will be displayed whenever you right-click any Java project, with a single and unmistakable option named &amp;quot;Convert to AspectJ Project&amp;quot;. After the conversion, other options become available, including the action to undo the conversion.   &lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Aspect visualization embedded into Java code    &lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;The AJDT extensions will show markers to the left of Java source code,with the icons indicating the type of join point, such as &amp;quot;around&amp;quot;, &amp;quot;before&amp;quot; and &amp;quot;after&amp;quot;. Note that you can also display the &amp;quot;Cross References&amp;quot; view of the advices being applied to a particular point in the code.   &lt;br /&gt;  &lt;br /&gt;&lt;center&gt;&lt;a href="http://blogs.tap.ibm.com/weblogs/rtpforge/resource/aspectj-source-view.png"&gt;&lt;img src="http://blogs.tap.ibm.com/weblogs/rtpforge/resource/aspectj-source-view-thumb.png" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font size="1"&gt;Click on the thumbnail to see a larger image&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;/center&gt;&lt;b&gt;Simultaneous Aspect visualization for multiple files&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;Using the Aspect Visualization perspective, you can have a broader view into how the aspects are crosscutting your projects.   &lt;br /&gt;Note how the screen is logically divided in three parts, with the package selection on the left, a graphical representation of the advices for each class in the middle section, and a selector for the aspects you want to browse.   &lt;br /&gt;  &lt;br /&gt;What I like the best is that all screen elements are fully navigable, with double-clicks to the classes or advices in the graphical display taking you to their respective location in the Java source code.   &lt;br /&gt;  &lt;br /&gt;&lt;center&gt;&lt;a href="http://blogs.tap.ibm.com/weblogs/rtpforge/resource/aspectj-perspective.png"&gt;&lt;img src="http://blogs.tap.ibm.com/weblogs/rtpforge/resource/aspectj-perspective-thumb.png" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font size="1"&gt;Click on the thumbnail to see a larger image&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-6875718508065700674?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/Uf5-BCANKos" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/6875718508065700674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/03/aspectj-development-tools-inline-aspect.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6875718508065700674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/6875718508065700674?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/Uf5-BCANKos/aspectj-development-tools-inline-aspect.html" title="AspectJ Development Tools - Inline aspect visualization inside Eclipse" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/03/aspectj-development-tools-inline-aspect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcMQX0zcCp7ImA9WxVUEkw.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-8411590774163167178</id><published>2009-03-16T06:28:00.000-07:00</published><updated>2009-03-16T06:28:00.388-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-16T06:28:00.388-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="log4j" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr47" /><category scheme="http://www.blogger.com/atom/ns#" term="aspects" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java logging: Serviceability without the clutter ("around" we go) - part 3</title><content type="html">Whenever I reuse someone else's code at the source level, I often discover that it uses some different logging toolkit than what I am using.   &lt;br /&gt;Log4J seems to take the prize because a lot of developers used it before JSR-47 came out, and some **still** use Log4J in defiance of JSR-47's release.   &lt;br /&gt;JRAS, from older versions of WebSphere, also comes to mind.   &lt;br /&gt;  &lt;br /&gt;At any rate, combining two different log toolkits produces some undesirable results, mostly (1) two different configuration steps and (2) two different file outputs. You can add a new handler to Log4J to redirect its calls to solve problem &amp;quot;2&amp;quot;, but &amp;quot;1&amp;quot; is still there rearing its ugly head.   &lt;br /&gt;  &lt;br /&gt;AspectJ allows one to &lt;u&gt;replace calls to a given method&lt;/u&gt; with different calls. You got it, how about an Aspect that replaces all Log4J calls with JSR-47 calls?   &lt;br /&gt;  &lt;br /&gt;The alternative? Ripping through every single method in the second code-base to replace Log4J calls with JSR-47 calls, but it is very likely that the original code owner will not support your forked code-base. Yes, I don't like it either, and that is why I wrote this other aspect for a recent project.   &lt;br /&gt;  &lt;br /&gt;There are ways of applying this technique to an existing JAR file if you are reusing libraries instead of source code. Theme for the next posting.   &lt;br /&gt;  &lt;br /&gt;----   &lt;br /&gt;  &lt;pre&gt;&lt;span style="font-weight: bold"&gt;package &lt;/span&gt;my.project;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;import &lt;/span&gt;java.util.logging.Level;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;import &lt;/span&gt;java.util.logging.Logger;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;/**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt; * Aspect used to wrap Log4J to ensure consistent logging throughout the entire project.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt; * &lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt; * @author Denilson Nastacio&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;&lt;/span&gt;&lt;span style="color: rgb(0,153,0)"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;public aspect &lt;/span&gt;Log4J {&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;private static final &lt;/span&gt;Logger trace = Logger.getLogger(&lt;span style="color: rgb(51,51,255)"&gt;&amp;quot;trace.my.project&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /*&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcut for all log4j calls within the target module&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jCalls():&lt;br /&gt;        target(org.apache.commons.logging.Log) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(my.someone.else.code*.*);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for isInfoEnabled calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jIsInfoEnabled(): &lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;boolean &lt;/span&gt;isInfoEnabled());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for isTraceEnabled calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jIsTraceEnabled():&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;boolean &lt;/span&gt;isTraceEnabled());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for isDebugEnabled calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jIsDebugEnabled():&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;boolean &lt;/span&gt;isDebugEnabled());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for isWarnEnabled calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jIsWarnEnabled():&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;boolean &lt;/span&gt;isWarnEnabled());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for isErrorEnabled calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jIsErrorEnabled():&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;boolean &lt;/span&gt;isErrorEnabled());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for isFatalEnabled calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jIsFatalEnabled():&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;boolean &lt;/span&gt;isFatalEnabled());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for info calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jInfo(Object o):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;info(Object));&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jInfoEx(Object o, Throwable ex):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o,ex) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;info(Object,Throwable));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for trace calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt; &lt;/span&gt;   &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jTrace(Object o):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;trace(Object));&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jTraceEx(Object o, Throwable ex):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o,ex) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;trace(Object,Throwable));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for debug calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jDebug(Object o):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;debug(Object));&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jDebugEx(Object o, Throwable ex):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o,ex) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;debug(Object,Throwable));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for warn calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt; &lt;/span&gt;   &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jWarn(Object o):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        args(o) &amp;amp;&amp;amp;&lt;br /&gt;        call(void warn(Object));&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jWarnEx(Object o, Throwable ex):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o,ex) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;warn(Object,Throwable));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for error calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jError(Object o):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;error(Object));&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jErrorEx(Object o, Throwable ex):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o,ex) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;error(Object,Throwable));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Pointcuts for fatal calls.&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jFatal(Object o):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;fatal(Object));&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;log4jFatalEx(Object o, Throwable ex):&lt;br /&gt;    	log4jCalls() &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;args&lt;/span&gt;(o,ex) &amp;amp;&amp;amp;&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;call&lt;/span&gt;(&lt;span style="font-weight: bold"&gt;void &lt;/span&gt;fatal(Object,Throwable));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /*&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Join points&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.isInfoEnabled&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;boolean around&lt;/span&gt;(): log4jIsInfoEnabled() {&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.INFO)) {&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;true&lt;/span&gt;;&lt;br /&gt;        } &lt;span style="font-weight: bold"&gt;else &lt;/span&gt;{&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.isTraceEnabled&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;boolean around&lt;/span&gt;(): log4jIsTraceEnabled() {&lt;br /&gt;        if (&lt;span style="font-weight: bold"&gt;trace&lt;/span&gt;.isLoggable(Level.FINER)) {&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;true&lt;/span&gt;;&lt;br /&gt;        } &lt;span style="font-weight: bold"&gt;else &lt;/span&gt;{&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0,153,0)"&gt;   /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.isDebugEnabled&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;boolean around&lt;/span&gt;(): log4jIsDebugEnabled() {&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.FINEST)) {&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;true&lt;/span&gt;;&lt;br /&gt;        } &lt;span style="font-weight: bold"&gt;else &lt;/span&gt;{&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.isWarnEnabled&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;boolean around&lt;/span&gt;(): log4jIsWarnEnabled() {&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.WARNING)) {&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;true&lt;/span&gt;;&lt;br /&gt;        } &lt;span style="font-weight: bold"&gt;else &lt;/span&gt;{&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Replace calls to Log.isErrorEnabled&lt;br /&gt;     */&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;boolean around&lt;/span&gt;(): log4jIsErrorEnabled() || log4jIsFatalEnabled() {&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.SEVERE)) {&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;true&lt;/span&gt;;&lt;br /&gt;        } &lt;span style="font-weight: bold"&gt;else &lt;/span&gt;{&lt;br /&gt;        	return &lt;span style="font-weight: bold"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.info&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o): log4jInfo(o) {&lt;br /&gt;        &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(&amp;quot;&amp;quot;.equals(o) == false) {&lt;br /&gt;        	&lt;span style="font-weight: bold"&gt;trace&lt;/span&gt;.logp(Level.INFO, &lt;br /&gt;        			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;        			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;        			o.toString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o, Throwable ex): log4jInfoEx(o, ex) {&lt;br /&gt;        trace.logp(Level.INFO, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString(), ex);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.trace&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o): log4jTrace(o) {&lt;br /&gt;        trace.logp(Level.FINER, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString());&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o, Throwable ex): log4jTraceEx(o, ex) {&lt;br /&gt;        trace.logp(Level.FINER, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString(), ex);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.debug&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o): log4jDebug(o) {&lt;br /&gt;    	trace.logp(Level.FINEST, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString());&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o, Throwable ex): log4jDebugEx(o, ex) {&lt;br /&gt;    	trace.logp(Level.FINEST, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString(), ex);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.warn&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o): log4jWarn(o) {&lt;br /&gt;    	trace.logp(Level.WARNING, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString());&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o, Throwable ex): log4jWarnEx(o, ex) {&lt;br /&gt;    	trace.logp(Level.WARNING, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString(), ex);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;span style="color: rgb(0,153,0)"&gt;    /**&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     * Replace calls to Log.error and Log.fatal&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;&lt;span style="color: rgb(0,153,0)"&gt;     */&lt;/span&gt;&lt;br style="color: rgb(0,153,0)" /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o): log4jError(o) || &lt;br /&gt;&lt;span style="font-weight: bold"&gt;                            &lt;/span&gt;log4jFatal (o) {&lt;br /&gt;    	trace.logp(Level.SEVERE, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString());&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="font-weight: bold"&gt;void around&lt;/span&gt;(Object o, Throwable ex): log4jErrorEx(o, ex) || &lt;br /&gt;                                          log4jFatalEx(o,ex) {&lt;br /&gt;    	trace.logp(Level.SEVERE, &lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().getWithinType().getName(),&lt;br /&gt;    			thisJoinPointStaticPart.getSourceLocation().toString(),&lt;br /&gt;    			o.toString(), ex);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-8411590774163167178?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/3FSIMXmI4pM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/8411590774163167178/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability_16.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/8411590774163167178?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/8411590774163167178?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/3FSIMXmI4pM/aspectj-for-java-logging-serviceability_16.html" title="AspectJ for Java logging: Serviceability without the clutter (&amp;quot;around&amp;quot; we go) - part 3" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability_16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04AQ30-eip7ImA9WxVVGUk.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-5964920710136161062</id><published>2009-03-13T05:05:00.001-07:00</published><updated>2009-03-13T05:05:42.352-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T05:05:42.352-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="trace" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aspects" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java logging: Serviceability without the clutter - part 2</title><content type="html">&lt;br /&gt;In the &lt;a href="http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability.html"&gt;previous entry&lt;/a&gt; about an Aspect for Java logging, I forgot to add a higher-level picture of the end-results.   &lt;br /&gt;  &lt;br /&gt;Let's say your Java project has 4 major packages:   &lt;br /&gt;  &lt;ol&gt;   &lt;li&gt;my.otherproject.A &lt;/li&gt;    &lt;li&gt;my.project.B &lt;/li&gt;    &lt;li&gt;my.project.B.parsers &lt;/li&gt;    &lt;li&gt;my.project.C &lt;/li&gt; &lt;/ol&gt;  &lt;br /&gt;With the Java logging aspect added to the code base, you can invoke your program with the standard Java logging option:   &lt;br /&gt;  &lt;blockquote&gt;&lt;font color="#000099"&gt;java -Djava.util.logging.config.file=&lt;i&gt;&amp;lt;logging.properties&lt;/i&gt;&amp;gt; application.class       &lt;br /&gt;&lt;/font&gt;&lt;/blockquote&gt;  &lt;br /&gt;where &lt;i&gt;&amp;lt;logging.properties&amp;gt;&lt;/i&gt; is a standard Java logging configuration file.   &lt;br /&gt;  &lt;br /&gt;You can read more about the structure of this file in the &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/logging/overview.html#1.8"&gt;Java Logging Overview&lt;/a&gt;, but here is an example of what I use:   &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: rgb(51,204,0)"&gt;# &amp;quot;handlers&amp;quot; specifies a comma separated list of log Handler &lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# classes.  These handlers will be installed during VM startup.&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# Note that these classes must be on the system classpath.&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# By default we only configure a ConsoleHandler, which will only&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# show messages at the INFO and above levels.&lt;/span&gt;&lt;br /&gt;handlers = java.util.logging.ConsoleHandler&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# To also add the FileHandler, use the following line instead.&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# Default global logging level.&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# This specifies which kinds of events are logged across&lt;/span&gt; &lt;span style="color: rgb(51,204,0)"&gt;all loggers.  &lt;br /&gt;# For any given facility this global level&lt;/span&gt;&lt;span style="color: rgb(51,204,0)"&gt; can be overriden by a facility &lt;br /&gt;# specific level&lt;/span&gt;&lt;span style="color: rgb(51,204,0)"&gt;.&lt;br /&gt;# Note that the ConsoleHandler also has a separate level&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# setting to limit messages printed to the console.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,153)"&gt;trace.my.level = INFO&lt;/span&gt;&lt;br style="color: rgb(0,0,153)" /&gt;&lt;span style="color: rgb(0,0,153)"&gt;trace.my.project.level = FINER&lt;/span&gt;&lt;br style="color: rgb(0,0,153)" /&gt;&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;############################################################&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# Handler specific properties.&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# Describes specific configuration info for Handlers.&lt;/span&gt;&lt;br style="color: rgb(51,204,0)" /&gt;&lt;span style="color: rgb(51,204,0)"&gt;############################################################&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# default file output is in user's home directory.&lt;/span&gt;&lt;br /&gt;java.util.logging.FileHandler.pattern = project%u.%g.log&lt;br /&gt;java.util.logging.FileHandler.limit = 5000000&lt;br /&gt;java.util.logging.FileHandler.count = 5&lt;br /&gt;java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter&lt;br /&gt;java.util.logging.FileHandler.level = FINEST&lt;br /&gt;java.util.logging.FileHandler.append  = false&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51,204,0)"&gt;# Limit the message that are printed on the console to INFO and above.&lt;/span&gt;&lt;br /&gt;java.util.logging.ConsoleHandler.level = INFO&lt;br /&gt;java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;----- &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since the Java logging handles are hierarchical, the declaration of &amp;quot;trace.my.level = INFO&amp;quot; sets the default to all packages, whereas the declaration &amp;quot;trace.my.project.level = FINER&amp;quot; entry sets a different tracing level for your instrumented classes under the &amp;quot;my.project&amp;quot; Java package. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;Dealing with verbose classes&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One can tweak the &amp;quot;method&amp;quot; join point to exclude verbose classes from the tracing aspect, along the lines of: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;code style="color: rgb(153,153,153)"&gt;&amp;#160;&amp;#160;&amp;#160; pointcut method():&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;&lt;br style="color: rgb(153,153,153)" /&gt;&lt;code style="color: rgb(153,153,153)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; execution(* my.project..*.*(..)) &amp;amp;&amp;amp; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br style="color: rgb(153,153,153)" /&gt;&lt;code style="color: rgb(153,153,153)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !within(&lt;/code&gt;&lt;code style="color: rgb(153,153,153)"&gt;my.project&lt;/code&gt;&lt;code style="color: rgb(153,153,153)"&gt;.D.*) &amp;amp;&amp;amp;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;&lt;br style="color: rgb(153,153,153)" /&gt;&lt;code&gt;&lt;span style="color: rgb(153,153,153)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !within(Logging) &amp;amp;&amp;amp;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;  &lt;br style="color: rgb(153,153,153)" /&gt;&lt;span style="font-weight: bold; font-style: italic"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !within(excluded.class.1) &amp;amp;&amp;amp;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;  &lt;br style="font-weight: bold; font-style: italic" /&gt;&lt;span style="font-weight: bold; font-style: italic"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !within(excluded.class.2) &amp;amp;&amp;amp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br style="font-weight: bold; font-style: italic" /&gt;&lt;/code&gt;&lt;code style="font-weight: bold; font-style: italic"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !within(excluded.class.n)&lt;/code&gt;&lt;code style="font-weight: bold; font-style: italic"&gt;;&lt;/code&gt;&lt;code style="font-weight: bold; font-style: italic"&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;&lt;br style="font-weight: bold; font-style: italic" /&gt;&amp;#160; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;&lt;br /&gt;  &lt;br /&gt;Dealing with methods inside loops&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This point is a bit more complicated and I'll get to it in a different post. &lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-5964920710136161062?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/7of73Z1FiYE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/5964920710136161062/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability_13.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5964920710136161062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/5964920710136161062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/7of73Z1FiYE/aspectj-for-java-logging-serviceability_13.html" title="AspectJ for Java logging: Serviceability without the clutter - part 2" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability_13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BRH8ycSp7ImA9WxJQGU4.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-7317905996136817013</id><published>2009-03-10T12:01:00.001-07:00</published><updated>2009-06-02T03:50:55.199-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-02T03:50:55.199-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="timestamp" /><category scheme="http://www.blogger.com/atom/ns#" term="birt" /><category scheme="http://www.blogger.com/atom/ns#" term="date" /><category scheme="http://www.blogger.com/atom/ns#" term="report" /><title>Dealing with timestamps in BIRT reports</title><content type="html">&lt;p&gt;While trying to match date/time fields between a &lt;a href="http://www.eclipse.org/birt/phoenix/" target="_blank"&gt;BIRT&lt;/a&gt; (Business Intelligence and Reporting Tools) report design file and a web service, I did not stumble upon any good tips on the BIRT Eclipse website, but eventually found this entry on the BIRT Exchange website: &lt;a href="http://www.birt-exchange.org/devshare/designing-birt-reports/203-convert-string-date-to-date-object-in-birt/#description" target="_blank"&gt;Convert String Date to Date Object in BIRT&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The example was not a perfect match for what I needed but threw me close enough to the solution.&lt;/p&gt;  &lt;p&gt;The web service returns a long value corresponding to the time using the Java/C convention for milliseconds since Jan/1/1970 0:00:00 GMT”. Inside the BIRT data-set though, I could not find the “Timestamp” field available for other kinds of data-sources, such as the XML data-source. Returning a string representing the date and time is never a good strategy since it discards the time zone information.&lt;/p&gt;  &lt;p&gt;The solution was to create a computed field with “Date Time” type, then use this expression derived from the article to convert the milliseconds value retrieved from the web service (originally named “Date”):&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;df = new Packages.java.util.Date();&lt;br /&gt;df.setTime(row["Date"]);&lt;br /&gt;df&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_g1cgAPRqWkA/Sba5EixQ66I/AAAAAAAAEBc/DlvkTy6V5Bc/s1600-h/image%5B10%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/Sba5FGPr8wI/AAAAAAAAEBg/wC6SQvOG0ks/image_thumb%5B6%5D.png?imgmax=800" border="0" height="239" width="550" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_g1cgAPRqWkA/Sba5FWH8JEI/AAAAAAAAEBk/lBYzgVIeDQM/s1600-h/image%5B4%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/Sba5GJ3zK0I/AAAAAAAAEBo/SNVaBhEMGCM/image_thumb%5B2%5D.png?imgmax=800" border="0" height="286" width="883" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The next step was to indicate the correct type for the new computed parameter “DateTime” in my chart:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_g1cgAPRqWkA/SbbQf5SEnsI/AAAAAAAAEBs/jxRi9g7uvHo/s1600-h/image%5B14%5D.png"&gt;&lt;img title="image" style="border: 0px none ; display: inline;" alt="image" src="http://lh6.ggpht.com/_g1cgAPRqWkA/SbbQgcd2VPI/AAAAAAAAEBw/usJMlWG8Rg0/image_thumb%5B8%5D.png?imgmax=800" border="0" height="656" width="653" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-7317905996136817013?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/yE4k4rL-Rp4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/7317905996136817013/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/03/dealing-with-timestamps-in-birt-reports.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7317905996136817013?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/7317905996136817013?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/yE4k4rL-Rp4/dealing-with-timestamps-in-birt-reports.html" title="Dealing with timestamps in BIRT reports" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_g1cgAPRqWkA/Sba5FGPr8wI/AAAAAAAAEBg/wC6SQvOG0ks/s72-c/image_thumb%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/03/dealing-with-timestamps-in-birt-reports.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEBQXk_fCp7ImA9WxVVEU4.&quot;"><id>tag:blogger.com,1999:blog-3333361346099343040.post-145543836893505461</id><published>2009-03-03T19:17:00.001-08:00</published><updated>2009-03-03T19:17:30.744-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T19:17:30.744-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="trace" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="ajdt" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aspects" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><category scheme="http://www.blogger.com/atom/ns#" term="aspectj" /><title>AspectJ for Java logging: Serviceability without the clutter - part 1</title><content type="html">&lt;p&gt;I have grown fond of AspectJ in the past years, probably at the same rate I have grown tired of writing or referencing the same cross-cutting snippets of code all over the code-base of a project.    &lt;br /&gt;    &lt;br /&gt;In the way of background, &lt;a href="http://www.eclipse.org/aspectj/"&gt;AspectJ&lt;/a&gt; is a Java extension for &amp;quot;&lt;a href="http://www.parc.com/research/projects/aspectj/downloads/ECOOP1997-AOP.pdf"&gt;Aspect Oriented Programming&lt;/a&gt;&amp;quot; (PDF download), or AOP for short.     &lt;br /&gt;    &lt;br /&gt;You can read the entire background in the previous link, but in a nutshell, AOP allows you to abstract common code snippets (advices, in AspectJ lingo) that are executed on common points of the code-base (join points.)     &lt;br /&gt;    &lt;br /&gt;As a concrete example, I'll reference an Aspect that I have been perfecting on my last three projects: adding debugging trace statements to the entry/exit of all methods in a project.     &lt;br /&gt;    &lt;br /&gt;I won't lie to you, it is not a trivial technique and the average Java programmer who eventually inherits your code base will hate your guts.     &lt;br /&gt;    &lt;br /&gt;&lt;u&gt;&lt;b&gt;Setup your environment&lt;/b&gt;&lt;/u&gt;     &lt;br /&gt;    &lt;br /&gt;Using the &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; environment and the &lt;a href="http://www.eclipse.org/ajdt/"&gt;AJDT&lt;/a&gt; (AspectJ Development Tools) is almost mandatory when dealing with aspects in Java. If you already have one of the Rational Software Development Platform siblings installed on your machine, such as Rational Software Architect, you are in good shape too, just pay attention to their underlying Eclipse version in order to select the right level of AJDT.     &lt;br /&gt;    &lt;br /&gt;Since this is not an Eclipse primer, I assume you know how to deal with installation of plugins from update sites.     &lt;br /&gt;    &lt;br /&gt;&lt;u&gt;&lt;b&gt;Trace statements&lt;/b&gt;&lt;/u&gt;     &lt;br /&gt;    &lt;br /&gt;If you want somewhat decent traceability, you should look into three types of statements:     &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;Method entry:    &lt;br /&gt;    &lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;b&gt;if &lt;/b&gt;(trace.isLoggable(Level.&lt;b&gt;FINER&lt;/b&gt;)) {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.entering(&amp;lt;CLASS_NAME&amp;gt;, &amp;lt;METHOD_NAME&amp;gt;, &amp;lt;args&amp;gt; ) ;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;Method exit:     &lt;br /&gt;    &lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;b&gt;if &lt;/b&gt;(trace.isLoggable(Level.&lt;b&gt;FINER&lt;/b&gt;)) {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.exiting(&amp;lt;CLASS_NAME&amp;gt;, &amp;lt;METHOD_NAME&amp;gt;, &amp;lt;args&amp;gt; ) ;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;Exception handling:     &lt;br /&gt;    &lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;b&gt;catch &lt;/b&gt;(&amp;lt;EXCEPTION_CLASS&amp;gt; e) {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.logp(Level.SEVERE, &lt;/code&gt;&lt;code&gt;&amp;lt;CLASS_NAME&amp;gt;, &amp;lt;METHOD_NAME&amp;gt;, &lt;/code&gt;&lt;code&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Caught exception: &amp;quot; + e.getClass().toString(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;/blockquote&gt; &lt;span style="font-weight: bold"&gt;&lt;u&gt;The Logging aspect&lt;/u&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;/span&gt;This is also not a primer on AspectJ, so that I assume you know that aspects go inside an &amp;quot;Aspect&amp;quot; file sitting inside any regular folder corresponding to a Java package. Here is what I have for trace.   &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;package my&lt;/span&gt;.project.aspects;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;import &lt;/span&gt;java.util.logging.Level;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;import &lt;/span&gt;java.util.logging.Logger;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;/**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt; * Aspect for Java logging throughout the code base.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt; */&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;public aspect &lt;/span&gt;Logging {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;private static &lt;/span&gt;Logger trace = &lt;/code&gt;&lt;code&gt;Logger.getLogger(&lt;font color="#3333ff"&gt;&amp;quot;trace.my.project&amp;quot;&lt;/font&gt;)&lt;/code&gt;&lt;code&gt;;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160; &lt;span style="color: rgb(51,204,255)"&gt; /*&lt;/span&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Pointcuts&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;code&gt;&amp;#160; &lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Execution body for all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;method():&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;execution&lt;/span&gt;(* &lt;/code&gt;&lt;code&gt;my.project&lt;/code&gt;&lt;code&gt;..*.*(..)) &amp;amp;&amp;amp; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(&lt;/code&gt;&lt;code&gt;my.project&lt;/code&gt;&lt;code&gt;.D.*) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(Logging);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Exception handling blocks inside all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;pointcut &lt;/span&gt;methodError(Throwable t):&lt;/code&gt;&lt;br /&gt;        &lt;b&gt;args&lt;/b&gt;(t) &amp;amp;&amp;amp;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;handler&lt;/span&gt;(Throwable+) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(&lt;/code&gt;&lt;code&gt;my.project&lt;/code&gt;&lt;code&gt;..*.*) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(&lt;/code&gt;&lt;code&gt;my.project.D&lt;/code&gt;&lt;code&gt;.*) &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !&lt;span style="font-weight: bold"&gt;within&lt;/span&gt;(Logging);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(51,204,255)"&gt;/*&lt;/span&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Join points&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&lt;/code&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Entry trace statements for all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;before&lt;/span&gt;(): method() {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.FINER)) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.entering(&lt;br /&gt;                    &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSignature().getDeclaringTypeName(), &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSignature().toString(), &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;thisJoinPoint&lt;/span&gt;.getArgs());&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160; /**&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Exit trace statements for all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;after&lt;/span&gt;() &lt;span style="font-weight: bold"&gt;returning &lt;/span&gt;(Object result): method() {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (trace.isLoggable(Level.FINER)) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.exiting&lt;span style="font-weight: bold"&gt;(&lt;br /&gt;&lt;b&gt;                    thisJoinPointStaticPart&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;.getSignature().getDeclaringTypeName(),&lt;/code&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/code&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;b&gt;thisJoinPointStaticPart&lt;/b&gt;.getSignature().toString(),&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160; &lt;span style="color: rgb(51,204,255)"&gt;&amp;#160; /**&lt;/span&gt;&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Exception handling blocks inside all methods.&lt;/code&gt;&lt;br style="color: rgb(51,204,255)" /&gt;&lt;code style="color: rgb(51,204,255)"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;before&lt;/span&gt;(Throwable t): methodError(t) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;if &lt;/span&gt;(trace.isLoggable(Level.SEVERE)) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trace.logp(Level.SEVERE, &lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;&lt;b&gt;                    thisJoinPointStaticPart&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;.getSignature().getDeclaringTypeName(),&lt;/code&gt;&lt;code&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/code&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold"&gt;thisJoinPointStaticPart&lt;/span&gt;.getSignature().toLongString(), &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight: bold; color: rgb(51,102,255)"&gt;&amp;quot;Caught exception: &amp;quot;&lt;/span&gt; + t.getClass().toString(),&lt;/code&gt; &lt;br /&gt;                    t);&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;#160; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; text-decoration: underline"&gt;Advanced reading&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the way of advanced reading, one can browse through &lt;a href="http://www.ibm.com/developerworks"&gt;developerWorks&lt;/a&gt; excellent &lt;a href="http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=aop@work:"&gt;AOP@Work series&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I particularly like &amp;quot;&lt;a href="http://www.ibm.com/developerworks/java/library/j-aopwork16/index.html"&gt;Next Steps with Aspects&lt;/a&gt;&amp;quot; and &amp;quot;&lt;a href="http://www.ibm.com/developerworks/java/library/j-aopwork15/index.html"&gt;AOP Myths and Realities&lt;/a&gt;&amp;quot;. &lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3333361346099343040-145543836893505461?l=sourcepatch.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sourcepatch/~4/jYMyjqrOpXQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sourcepatch.blogspot.com/feeds/145543836893505461/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/145543836893505461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3333361346099343040/posts/default/145543836893505461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sourcepatch/~3/jYMyjqrOpXQ/aspectj-for-java-logging-serviceability.html" title="AspectJ for Java logging: Serviceability without the clutter - part 1" /><author><name>Denilson Nastacio</name><uri>http://www.blogger.com/profile/16865589079752609756</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://1.bp.blogspot.com/_g1cgAPRqWkA/SsNhKLH35KI/AAAAAAAAEdw/ATPxwBWrZcM/S220/163627.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sourcepatch.blogspot.com/2009/03/aspectj-for-java-logging-serviceability.html</feedburner:origLink></entry></feed>

