<?xml version="1.0"?><!-- RSS generated by Radio UserLand v8.0.8 on Mon, 20 Oct 2003 18:18:22 GMT --><rss version="2.0">	<channel>		<title>Paul Brown: Java</title>		<link>http://radio.weblogs.com/0119894/categories/java/</link>		<description>Items related to the Java programming language.</description>		<copyright>Copyright 2003 Paul Brown</copyright>		<lastBuildDate>Mon, 20 Oct 2003 18:18:22 GMT</lastBuildDate>		<docs>http://backend.userland.com/rss</docs>		<generator>Radio UserLand v8.0.8</generator>		<managingEditor>prb@fivesight.com</managingEditor>		<webMaster>prb@fivesight.com</webMaster>		<category domain="http://www.weblogs.com/rssUpdates/changes.xml">rssUpdates</category> 		<skipHours>			<hour>0</hour>			<hour>1</hour>			<hour>17</hour>			<hour>13</hour>			<hour>10</hour>			<hour>9</hour>			<hour>15</hour>			<hour>3</hour>			</skipHours>		<cloud domain="radio.xmlstoragesystem.com" port="80" path="/RPC2" registerProcedure="xmlStorageSystem.rssPleaseNotify" protocol="xml-rpc"/>		<ttl>60</ttl>		<item>			<title>Mini-Review of Bitter EJB</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/08/16.html#a42</link>			<description>&lt;P&gt;This post (and this weblog) has a &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-08-16#Speaking_at_No_Fluff_Just_Stuff_in_Chicago&quot;&gt;new home&lt;/a&gt;.&lt;/P&gt;&lt;hr&gt;&lt;P&gt;Thanks to &lt;A href=&quot;http://crazybob.org/&quot;&gt;CrazyBob&lt;/A&gt;, I received my copy of &lt;A href=&quot;http://www.manning.com/tate2/index.html&quot;&gt;&lt;EM&gt;Bitter EJB&lt;/EM&gt;&lt;/A&gt; before it hit the bookstore shelves.  (As far as I can tell, I&apos;m the Paul Brown who got a thank-you in the introduction, since I assume that it&apos;s neither the &lt;A href=&quot;http://www.evabeauty.com/products/paulbrown/&quot;&gt;hair care products&lt;/A&gt; nor the &lt;A href=&quot;http://ohiobio.org/pbrown.htm&quot;&gt;football coach&lt;/A&gt;; now I just have to figure out why...)  Thanks to my schedule, I just got around to finishing it, so I can write a review.  (I acquired a fondness for How-Not-To exposition from my &lt;A href=&quot;http://math.berkeley.edu/~stall/&quot;&gt;PhD advisor&lt;/A&gt;, e.g., a classic &lt;A href=&quot;http://math.berkeley.edu/~stall/notPC.pdf&quot;&gt;paper&lt;/A&gt; on the &lt;A href=&quot;http://www.wikipedia.org/wiki/Poincare_conjecture&quot;&gt;Poincar&amp;Egrave; Conjecture&lt;/A&gt;.)&lt;/P&gt;&lt;P&gt;How-Not-To books serve as an analog to the communal knowledgebase that early cultures must have maintained of the local berries that were poisonous or emetic, bad-tempered animals, and medicinal herbs.  (Nonetheless, it&apos;s usually a nasty case of indigestion that is the best teacher.)  Living off the land also requires knowing what to eat, since starvation is equally deadly, and this is the pitfall that presents itself to authors of anti-pattern or &lt;EM&gt;Bitter X&lt;/EM&gt; books.&lt;/P&gt;&lt;P&gt;Fortunately for all involved, &lt;EM&gt;Bitter EJB&lt;/EM&gt; does a good job of balancing warnings with advice.  The perception that J2EE and EJB are synonymous is damaging to both, as is the related belief that using EJB is a required piece of using an application server.  The biggest service that &lt;EM&gt;Bitter EJB&lt;/EM&gt; performs is providing concrete criteria for would-be EJB users as to when the technology is appropriate &lt;EM&gt;and&lt;/EM&gt; when it is inappropriate, how to use it &lt;EM&gt;and&lt;/EM&gt; how not to use it.&lt;/P&gt;&lt;P&gt;&lt;EM&gt;Bitter EJB&lt;/EM&gt; is definitely a worthwhile read for current and potential EJB users.&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/08/16.html#a42</guid>			<pubDate>Sat, 16 Aug 2003 20:01:19 GMT</pubDate>			</item>		<item>			<title>Ruminations on String Matching and Switch Statements</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/06/18.html#a36</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-06-18#Ruminations_on_String_Matching_and_Switch_Statements&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;hr&gt;&lt;p&gt;I&apos;m not really a grumpy old fart, but sometimes I feel like it...&amp;nbsp; I can&amp;#39;t let &lt;a href=&quot;http://sixlegs.com/blog/java/cglib-stringswitch.html&quot;&gt;discussions&lt;/a&gt; (and some comments from&lt;a href=&quot;http://crazybob.org/roller/page/crazybob/20030617#string_switch_comments&quot;&gt;Bob Lee&lt;/a&gt;) on string comparison go by without at least chiming in with a history lesson.&lt;/p&gt;&lt;h5&gt;Perfect Hash Functions&lt;/h5&gt;&lt;p&gt;My first comment is on&lt;a href=&quot;http://burtleburtle.net/bob/hash/perfect.html&quot;&gt;perfect hash functions&lt;/a&gt; and probably lies off the beaten path for people who didn&apos;t have a hard-core CS education.&amp;nbsp; A perfect hash function is pre-constructed based on a known (at compile time) set of keys and has the property that the function returns a distinct values for distinct keys.&amp;nbsp; (If you plug in a string that is not part of the initial set, you could (and probably will) have a collision.)&amp;nbsp; Java usage in a switch statement can be done in a non-awkward way:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;&lt;font size=&quot;1&quot;&gt;public class&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt; PerfectHash {  &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static final&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;/b&gt; FRANK = f(&quot;&lt;font color=&quot;#000080&quot;&gt;FRANK&lt;/font&gt;&quot;);  &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static final&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;/b&gt; BEANS = f(&quot;&lt;font color=&quot;#000080&quot;&gt;BEANS&lt;/font&gt;&quot;);    &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;/b&gt; f(String s) {    ...  }}&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;And then to use it:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;font size=&quot;1&quot;&gt;...  &lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; foo() {    &lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/font&gt;(PerfectHash.f(s)) {      &lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt; PerfectHash.FRANK:        ...        &lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;      &lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt; PerfectHash.BEANS:        ...        &lt;font color=&quot;#800080&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;    }    ...  }}&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;The somewhat awkward part comes in generating the hash function in a convenient way (from the perspective of the IDE or build system) and this almost certainly counts as premature optimization.&lt;/p&gt;&lt;p&gt;The following is (probably) the easiest way to get an &lt;tt&gt;int&lt;/tt&gt; to switch on:&lt;/p&gt;&lt;pre&gt;&lt;font size=&quot;1&quot;&gt;   &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static final&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;/b&gt; FRANK = 0;  &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static final&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;/b&gt; BEANS = 1;  ...    &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static final&lt;/font&gt; HashMap _map = &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;new&lt;/font&gt;&lt;/b&gt; HashMap();    &lt;font color=&quot;#800080&quot;&gt;static&lt;/font&gt; {    _map.put(&quot;FRANK&quot;, &lt;font color=&quot;#800080&quot;&gt;new&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;[] {FRANK});    _map.put(&quot;BEANS&quot;, &lt;font color=&quot;#800080&quot;&gt;new&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;[] {BEANS});    ...    }    &lt;b&gt;&lt;font color=&quot;#800080&quot;&gt;public static&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;/b&gt; f(String s) {    &lt;font color=&quot;#0000FF&quot;&gt;Object&lt;/font&gt; o = _map.get(s);    &lt;font color=&quot;#800080&quot;&gt;return&lt;/font&gt; (o == &lt;font color=&quot;#800080&quot;&gt;null&lt;/font&gt;) ? -1 : ((&lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;[])o)[0];  }&lt;/b&gt;&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;The use of &lt;tt&gt;&lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;[]&lt;/tt&gt; is simply a personal preference over &lt;tt&gt;java.lang.Integer&lt;/tt&gt;.&lt;/p&gt;&lt;p&gt;The fact is that &lt;a href=&quot;http://crazybob.org/roller/page/crazybob/20030617#string_switch_comments&quot;&gt;Bob&lt;/a&gt; is probably right most of the time &amp;mdash; the &lt;tt&gt;hashcode()&lt;/tt&gt; is a perfect hash function under many circumstances, but it will require pre-checking to ensure that there are no collisions.&lt;/p&gt;&lt;h5&gt;String Comparison Algorithms&lt;/h5&gt;&lt;/b&gt;&lt;p&gt;My second comment is about string comparison algorithms.&amp;nbsp; Equality checking is straightfoward: every character mustbe checked at some point, and while there are various heuristics (Java hashcode, length, etc.) that can be applied to determine non-matches early, there is no way to do better than &lt;i&gt;O(s.length())&lt;/i&gt;.&amp;nbsp; For Java purposes, using the &lt;tt&gt;intern()&lt;/tt&gt; function is a good idea in the context of a reasonable (i.e., known and finite) number of strings.&amp;nbsp; (In fact, most modern XML parsers automatically &lt;tt&gt;intern()&lt;/tt&gt; all &lt;a href=&quot;http://www.w3.org/TR/REC-xml#NT-Name&quot;&gt;Name&lt;/a&gt;s (elementnames, attribute names, etc.).&amp;nbsp; See the relevant &lt;a href=&quot;http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description&quot;&gt;SAX feature&lt;/a&gt;.)The only issues occur because there is no way to mark a function to indicate that it returns an &lt;tt&gt;intern&lt;/tt&gt;&apos;d string as opposed toa generic string.&lt;/p&gt;&lt;p&gt;The problem of containment is more interesting.&amp;nbsp; It&apos;s a relatively old topic and is well-studied,e.g., in the classic &lt;a href=&quot;http://liinwww.ira.uka.de/cgi-bin/bibshow?e=Uifpsz0QspcBmht/vojrvf%7d263274&amp;r=bibtex&amp;mode=intra&quot;&gt;Knuth-Morris-Pratt&lt;/a&gt; and&lt;a href=&quot;http://liinwww.ira.uka.de/cgi-bin/bibshow?e=Njtd0bmmjtpo/vojrvf}75677&amp;r=bibtex&quot;&gt;Boyer-Moore&lt;/a&gt;from 1977 (making it older than several &lt;a href=&quot;http://www.fivesight.com&quot;&gt;FiveSight&lt;/a&gt; employees...), which give linear &lt;i&gt;O(s.length()&amp;nbsp;+&amp;nbsp;t.length())&lt;/i&gt; (KMP) and sublinear &lt;i&gt;O(s.length()/t.length())&lt;/i&gt; (B-M) algorithms for searching for &lt;tt&gt;s&lt;/tt&gt; as a substring of &lt;tt&gt;t&lt;/tt&gt;.&amp;nbsp; (Here is a&lt;a href=&quot;http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/index.html&quot;&gt;comparison&lt;/a&gt; from the horse&apos;s mouth, as it were.)&amp;nbsp; Lasttime I looked (JDK 1.4), the Java &lt;tt&gt;String.indexOf(String)&lt;/tt&gt; function used the naive method for matching a substring whichtakes &lt;i&gt;O(s.length()&amp;nbsp;*&amp;nbsp;t.length())&lt;/i&gt; but requires no pre-computation.&amp;nbsp; I&apos;ll have to &lt;a href=&quot;http://www.google.com&quot;&gt;Google&lt;/a&gt; for an implementation that computes and caches workers that search for specific strings.&lt;/p&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/06/18.html#a36</guid>			<pubDate>Wed, 18 Jun 2003 22:26:22 GMT</pubDate>			</item>		<item>			<title>Syscon Radio Inteview / JavaOne Impressions</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/06/11.html#a35</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-06-11#Syscon_Radio_Inteview_/_JavaOne_Impressions&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;hr&gt;&lt;P&gt;My &lt;A href=&quot;http://www.fivesight.com/media/pb_javaone_03.mp3&quot;&gt;interview&lt;/A&gt; on &lt;A href=&quot;http://www.sys-con.com/java/javaone2003/radioview.cfm&quot;&gt;Syscon Radio&lt;/A&gt;&amp;nbsp;is up.&amp;nbsp; Have a listen for some of my perspectives on BPM, Java development, and XP/agile methodologies.&lt;/P&gt;&lt;P&gt;The &lt;A href=&quot;http://servlet.java.sun.com/javaone/&quot;&gt;JavaOne&lt;/A&gt; show as a whole was pleasant but, as &lt;A href=&quot;http://freeroller.net/page/cbeust&quot;&gt;others&lt;/A&gt; have already &lt;A href=&quot;http://freeroller.net/page/cbeust/20030610&quot;&gt;noted&lt;/A&gt;, felt a lot smaller than&amp;nbsp;previous years and had a huge presence for mobile devices.&amp;nbsp; The marketing-oriented split in the on-line presence for Java, i.e., the &lt;A href=&quot;http://www.java.com&quot;&gt;java.com&lt;/A&gt;/&lt;A href=&quot;http://www.java.net&quot;&gt;java.net&lt;/A&gt; split, has me a bit confused.&amp;nbsp; On the &lt;A href=&quot;http://www.java.com&quot;&gt;java.com&lt;/A&gt; side, I understand the &lt;A href=&quot;http://www.cnn.com/2003/TECH/space/06/10/mars.rover/index.html&quot;&gt;Mars rover&lt;/A&gt;&amp;nbsp;&lt;A href=&quot;http://www.java.com/en/explore/spotlight/mars_rover.jsp&quot;&gt;tie-in&lt;/A&gt;, but someone will have to explain to me what &lt;A href=&quot;http://www.java.com/en/explore/mobile/christina.jsp&quot;&gt;Christina&amp;nbsp;Aguilera&lt;/A&gt; and &lt;A href=&quot;http://www.java.com/en/explore/spotlight/nelly.jsp&quot;&gt;Nelly&lt;/A&gt; have to do with Java...&amp;nbsp;&amp;nbsp;On the &lt;A href=&quot;http://www.java.net&quot;&gt;java.net&lt;/A&gt; side, it is refreshing to see a&amp;nbsp;change in Sun&apos;s licensing and reference implementation posture, as evidenced by the&amp;nbsp;commitment to release the reference&amp;nbsp;implementations of &lt;A href=&quot;http://jaxb.dev.java.net/&quot;&gt;JAXB&lt;/A&gt;, &lt;A href=&quot;http://saaj.dev.java.net/&quot;&gt;SAAJ&lt;/A&gt;, and &lt;A href=&quot;http://jax-rpc.dev.java.net/&quot;&gt;JAXRPC&lt;/A&gt; as royalty-free&amp;nbsp;open source.&amp;nbsp; (Nonetheless, the licensing terms have not yet&amp;nbsp;been determined.)&lt;/P&gt;&lt;P&gt;I did have a chance to connect with &lt;A href=&quot;http://www.oreillynet.com/cs/catalog/view/au/29?x-t=book.view&quot;&gt;Mike&amp;nbsp;Loukides&lt;/A&gt; and some other friends and to pick up some scuttlebutt from the some of the vendors.&amp;nbsp; The two most&amp;nbsp;interesting items were some information from the &lt;A href=&quot;http://web1.jcp.org/en/jsr/detail?id=112&quot;&gt;JSR-112/JCA 1.5&lt;/A&gt; committee&amp;nbsp;(they&apos;ve fixed some of the items I regarded as problems in the last public draft; the changes are not yet public...) and a great chat with Kevin&amp;nbsp;Liu from &lt;A href=&quot;http://www.sap.com&quot;&gt;SAP&lt;/A&gt;&amp;nbsp;about pragmatic perspectives&amp;nbsp;on&amp;nbsp;&lt;A href=&quot;http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsbpel&quot;&gt;WSBPEL&lt;/A&gt; and other web services choreography initiatives.&amp;nbsp; (Kevin is&amp;nbsp;on the &lt;A href=&quot;http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsbpel&quot;&gt;WSBPEL&lt;/A&gt; TC and on the &lt;A href=&quot;http://www.w3c.org&quot;&gt;W3C&lt;/A&gt; &lt;A href=&quot;http://www.w3.org/2002/ws/chor/&quot;&gt;Web Services Choreography&lt;/A&gt; and &lt;A href=&quot;http://www.w3c.org/2002/ws/desc/&quot;&gt;Web Services Description&lt;/A&gt; working groups as well.)&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/06/11.html#a35</guid>			<pubDate>Wed, 11 Jun 2003 18:26:11 GMT</pubDate>			</item>		<item>			<title>FiveSight SysCon Radio Broadcast from JavaOne</title>			<link></link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-06-05#FiveSight_SysCon_Radio_Broadcast_from_JavaOne&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;hr&gt;&lt;p&gt;I&apos;ll be out in the Bay Area for a couple of days next week, a mixture of knocking around &lt;A href=&quot;http://servlet.java.sun.com/javaone/&quot;&gt;JavaOne&lt;/A&gt;, doing a quick spot (11:45) on &lt;A href=&quot;http://www.syscon.com/&quot;&gt;SysCon&lt;/A&gt; &lt;A href=&quot;http://www.sys-con.com/java/javaone2002c.cfm&quot;&gt;Radio&lt;/A&gt; on Tuesday, seeing some customers, and visiting the &lt;A href=&quot;http://www.ibfconferences.com/&quot;&gt;IBF&lt;/A&gt; &lt;A href=&quot;http://www.ibfconferences.com/VC_2003.htm&quot;&gt;VC 2003 conference&lt;/A&gt;.&lt;/p&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/06/05.html#a34</guid>			<pubDate>Thu, 05 Jun 2003 20:50:04 GMT</pubDate>			</item>		<item>			<title>Better Living and Poor-Man&apos;s Delegates through Byte Code Engineering</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/06/03.html#a32</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-06-03#Better_Living_and_Poor-Mans_Delegates_through_Byte_Code_Engineering&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;HR&gt;&lt;P&gt;A recent &lt;A href=&quot;http://www.onjava.com/&quot;&gt;ONJava&lt;/A&gt; &lt;A href=&quot;http://www.onjava.com/pub/a/onjava/2003/05/21/delegates.html&quot;&gt;article&lt;/A&gt; by &lt;A href=&quot;http://www.oreillynet.com/pub/au/1211&quot;&gt;Steven Lewis&lt;/A&gt; and &lt;A href=&quot;http://www.oreillynet.com/pub/au/1212&quot;&gt;Wilhelm Fitzpatrick&lt;/A&gt; on delegates caught my interest.&amp;nbsp; &lt;EM&gt;Delegation&lt;/EM&gt; is the ability to treat methods as objects, and the usual application is casting an object to a delegate for one of its methods to get a uniform invocation across an enumeration or collection.&amp;nbsp; Delegation should also be regarded as a potential cross-cutting concern.&lt;/P&gt;&lt;H5&gt;Motivation&lt;/H5&gt;&lt;P&gt;One of our developers came across a delegation-like problem working with &lt;A href=&quot;http://castor.exolab.org/&quot;&gt;Castor&lt;/A&gt; for XML binding.&amp;nbsp; The classes that Castor generates all have &lt;FONT face=&quot;Courier, Monospace&quot;&gt;marshal(...)&lt;/FONT&gt; and &lt;FONT face=&quot;Courier, Monospace&quot;&gt;unmarshal(...)&lt;/FONT&gt; methods, but the classes don&apos;t implement any common interface that would&amp;nbsp;allow the classes to be dealt with in a uniform fashion (that doesn&apos;t rely on reflection).&amp;nbsp; (I don&apos;t know if this is a sin of omission or comission on their part; omission is my guess.)&amp;nbsp; The desired operation would be:&lt;/P&gt;&lt;P align=center&gt;&lt;FONT face=&quot;Courier, Monospace&quot;&gt;((Marshallable) foo).marshal(...)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;If we had delegates to work with, this wouldn&apos;t be an issue, but we don&apos;t.&lt;/P&gt;&lt;H5&gt;Background&lt;/H5&gt;&lt;P&gt;The overall application is a content management system for technical documentation that includes some Struts-based wizards for generating simple documents.&amp;nbsp;&amp;nbsp;(&lt;A href=&quot;http://www.fivesight.com/products&quot;&gt;FiveSight Business Process Integrator&lt;/A&gt; and &lt;A href=&quot;http://www.xhive.com/&quot;&gt;X-Hive/DB&lt;/A&gt; do the heavy lifting for the CMS as a whole.)&amp;nbsp; The object model for the wizards is generated by a combination of &lt;A href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/A&gt; tasks that use James Clark&apos;s excellent&amp;nbsp;&lt;A href=&quot;http://www.thaiopensource.com/relaxng/trang.html&quot;&gt;Trang&lt;/A&gt;&amp;nbsp;and some XSLT to feed XML Schemas to Castor, which then produces Java source code.&lt;/P&gt;&lt;P&gt;The challenge then is:&lt;/P&gt;&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;P&gt;&lt;EM&gt;Given the Java source generated by Castor and an interface, mark the classes with the interface where appropriate.&amp;nbsp; The solution should be an Ant task and integrate with the overall build.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;H5 dir=ltr&gt;Solution&lt;/H5&gt;&lt;P dir=ltr&gt;The&amp;nbsp;solution was to use &lt;A href=&quot;http://jakarta.apache.org/bcel/&quot;&gt;BCEL&lt;/A&gt; to post-process the Castor-generated classes after they are compiled to byte code, as follows.&amp;nbsp; I&apos;ll omit the packaging for the Ant task.&amp;nbsp; (It is left as an exercise for the reader...)&lt;/P&gt;&lt;P dir=ltr&gt;The first step is to read the methods off the marker interface named &lt;FONT face=Courier&gt;iface&lt;/FONT&gt;:&lt;/P&gt;&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;PRE dir=ltr&gt;&lt;FONT size=2&gt;&lt;P&gt;String iface = _iface.replace(&lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt;&apos;.&apos;&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt;&apos;/&apos;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;&lt;P&gt;JavaClass marker = &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;null&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;try&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; {&lt;/P&gt;&lt;P&gt; InputSgftream is =&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt; new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ClassPath(_classes.getAbsolutePath())&lt;/P&gt;&lt;P&gt; .getClassFile(iface)&lt;/P&gt;&lt;P&gt; .getInputStream();&lt;/P&gt;&lt;P&gt; ClassParser cp = &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ClassParser(is, iface);&lt;/P&gt;&lt;P&gt; marker = cp.parse();&lt;/P&gt;&lt;P&gt;} &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;catch&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (IOException ioe) {&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt; throw&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; BuildException(&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt; &quot;Error searching for marker &quot; &lt;/FONT&gt;&lt;FONT size=2&gt;+ iface&lt;/P&gt;&lt;P&gt; + &lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt;&quot; in &quot;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt; + _classes.getAbsolutePath()&lt;/P&gt;&lt;P&gt; + &lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt;&quot;: &quot;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt; + ioe.getMessage(),&lt;/P&gt;&lt;P&gt; ioe);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;if&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (!marker.isInterface()) {&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt; throw&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; BuildException(&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt; &quot;The marker &quot;&lt;/FONT&gt;&lt;FONT size=2&gt; + _iface + &lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt;&quot; is not an interface.&quot;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;HashSet methods = &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; HashSet();&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;for&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;int&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; marker.getMethods().length; ++i) {&lt;/P&gt;&lt;P&gt; methods.add(marker.getMethods()[i].getSignature());&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;P dir=ltr&gt;(The variable &lt;FONT face=&quot;Courier, Monospace&quot;&gt;_classes&lt;/FONT&gt; is the directory containing the compiled classes for the marker interface(s).)&lt;/P&gt;&lt;P dir=ltr&gt;The next step is to scan the classes to be marked and determine if they can implement the interface.&amp;nbsp; This is the fragment of code that processes the class named &lt;FONT face=&quot;Courier, Monospace&quot;&gt;name&lt;/FONT&gt; from the directory &lt;FONT face=&quot;Courier, Monospace&quot;&gt;base&lt;/FONT&gt;.&amp;nbsp; (The directory walking code is left as an exercise for the reader...)&lt;/P&gt;&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;PRE dir=ltr&gt;&lt;FONT size=2&gt;&lt;P&gt;JavaClass jc = &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;null&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;try&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; {&lt;/P&gt;&lt;P&gt; ClassParser cp =&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt; new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ClassParser(base.getAbsolutePath() + &lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; File.separatorChar + name);&lt;/P&gt;&lt;P&gt; jc = cp.parse();&lt;/P&gt;&lt;P&gt;} &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;catch&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (IOException ioe) {&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt; throw&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#7f0055 size=2&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; BuildException(&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt; &quot;Unable to read in &quot;&lt;/FONT&gt;&lt;FONT size=2&gt; + name + &lt;/FONT&gt;&lt;FONT color=#2a00ff size=2&gt;&quot; from &quot;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#2a00ff&gt; &lt;/FONT&gt; + base.getAbsolutePath() + &lt;FONT color=#2a00ff&gt;&quot;.&quot;&lt;/FONT&gt;,&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; ioe);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;HashSet mtds = &lt;B&gt;&lt;FONT color=#7f0055&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; HashSet();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;Method[] arr = jc.getMethods();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;FONT color=#7f0055&gt;&lt;FONT size=2&gt;for&lt;/FONT&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;B&gt;&lt;FONT color=#7f0055&gt;int&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; arr.length; ++i) {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; mtds.add(arr[i].getSignature());&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;File target =&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;FONT color=#7f0055&gt;&lt;FONT size=2&gt; new&lt;/FONT&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; File(_outputDirectory.getAbsolutePath()&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; + File.separatorChar + name);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;FONT color=#7f0055&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;FONT color=#7f0055&gt;&lt;FONT size=2&gt;if&lt;/FONT&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (mtds.containsAll(methods)) {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; ClassGen cg = &lt;B&gt;&lt;FONT color=#7f0055&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ClassGen(jc);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; cg.addInterface(_iface);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;FONT color=#7f0055&gt;&lt;FONT size=2&gt; try&lt;/FONT&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; cg.getJavaClass().dump(target);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT size=2&gt;} &lt;B&gt;&lt;FONT color=#7f0055&gt;catch&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (IOException ioe) {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;FONT color=#7f0055&gt;&lt;FONT size=2&gt; throw&lt;/FONT&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;B&gt;&lt;FONT color=#7f0055&gt;new&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; BuildException(&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#2a00ff&gt;&lt;FONT size=2&gt; &quot;Unable to dump marked class &quot;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt; + name&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; + &lt;FONT color=#2a00ff&gt;&quot; from &quot;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt; + base.getAbsolutePath()&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; + &lt;FONT color=#2a00ff&gt;&quot;into &quot;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt; + target.getAbsolutePath()&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; + &lt;FONT color=#2a00ff&gt;&quot;: &quot;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt; + ioe,&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; ioe);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt; }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;} &lt;B&gt;&lt;FONT color=#7f0055&gt;else&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#3f7f5f&gt;&lt;FONT size=2&gt; &lt;a href=&quot;//&quot;&gt;//&lt;/a&gt; copy the class to the destination unaltered&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;P dir=ltr&gt;That&apos;s it, up to packaging.&lt;/P&gt;&lt;H5 dir=ltr&gt;Application to Delegates&lt;/H5&gt;&lt;P dir=ltr&gt;The application of this technique to delegates is straightforward:&amp;nbsp; Create a one-method interface for the desired delegate, and then let the build take care of applying it to the compiled classes.&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/06/03.html#a32</guid>			<pubDate>Tue, 03 Jun 2003 16:34:22 GMT</pubDate>			</item>		<item>			<title>Visual Tools vs. Coding</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/04/22.html#a27</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-04-22#Visual_Tools_vs._Coding&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;HR&gt;&lt;P&gt;With WS-BPEL going mainstream and a corresponding&amp;nbsp;upswell of interest in executable business processes, the choices between coding, modeling, scripting, and visual design are going to be presented to many potential technology adopters.&amp;nbsp; There are valid arguments for any of the above with the complexity of the deliverable, the skills of the target users, and the degree of obscurity of requirements all bearing on what the &quot;right&quot; choice would be.&lt;/P&gt;&lt;P&gt;My experience has been that a mixture is best.&amp;nbsp;&amp;nbsp;(The maxim &quot;One size fits none.&quot; is apt.)&amp;nbsp; High-level modeling at the outset of a project to facilitate communications and extract requirements.&amp;nbsp; Identification of available technology assets and some initial work in low-level Java or other languages to wrap those assets as deployable resources (e.g., JCA adapters or components for a visual design environment).&amp;nbsp; Visual assembly of components and objects into processes with scripting and some light custom code to fill the gaps.&amp;nbsp; In an ideal world, the executable visual artifacts are identifiable as&amp;nbsp;more detailed renditions of the original high-level models and provide value as a mechanism for inspection and incremental modification.&lt;/P&gt;&lt;P&gt;For visual design of executable processes, the oft cited and touted benefits are strongly dependent on the objects on the canvas, the mechanisms of combination and composition, and the means of deployment.&amp;nbsp; This is true as well in service-oriented architecture, where the selection and sizing of services as well as&amp;nbsp;communications and wire protocols determines the level of benefit provided to the adopting organization.&amp;nbsp; For web services orchestration and web services, the issues of sizing in the design environment and sizing in the execution environment coincide.&lt;/P&gt;&lt;P&gt;With over three years invested in building visual programming tools in and for Java, &lt;A href=&quot;http://www.fivesight.com/&quot;&gt;FiveSight&lt;/A&gt; is not new to the visual programming space as far as process execution, web services, etc. goes, but in the grand scheme of things, we are absolute newbies.&amp;nbsp; The reason being that the concept of visual programming is not at all new. The first dataflow tool dates from 1965(!), and reasonably useful languages, e.g., &lt;A href=&quot;http://www.pictorius.com/prograph.html&quot;&gt;ProGraph&lt;/A&gt; have roots back in the early 1980s.)&amp;nbsp; From the time that we launched the first version of our product in early 2000 to present, we&apos;ve worked our way through a variety of different paradigms (data flow - like an electric&amp;nbsp;circuit, control flow - like a flowchart),&amp;nbsp;levels of representation (more coarse, more fine), fanciness of wizards, and different contracts for types and objects that can be used in the design environment.&amp;nbsp; Throughout, our experience has been that there is an &lt;STRONG&gt;economical object size&lt;/STRONG&gt; for visual widgets that varies by the customer and project.&amp;nbsp; In some cases, it&apos;s individual operations against an SAP implementation, in others it&apos;s high-level operations against a content management system (check-in/check-out of a document, approval/sign-off), in others it&apos;s wrappers around scripting constructs such as XSLT or XQuery.&amp;nbsp;&amp;nbsp;Ensuring that a product provides a good variety of starting points and hooks for extension at different levels is the responsibility of the vendor in designing the software.&amp;nbsp; Ensuring that a project selects and works with econonmically-sized objects for its goals is the responsibility of training and implementation support.&lt;/P&gt;&lt;P&gt;For the low-level developer, visual tools are also useful as a point of aggregation for information derived from an existing or evolving codebase.&amp;nbsp; One of the coolest visual tools for Java that I&apos;ve seen recently&amp;nbsp;is &lt;A href=&quot;http://www.logicexplorers.com/products/codelogic&quot;&gt;Code Logic&lt;/A&gt; from &lt;A href=&quot;http://www.logicexplorers.com/&quot;&gt;LogicExplorers&lt;/A&gt; (although an evaluation&amp;nbsp;version that&apos;s usable for 5 minutes at a time isn&apos;t much of an evaluation version). &amp;nbsp;&lt;A href=&quot;http://www.thesmallworlds.com/products/javaworld.html&quot;&gt;Small Worlds&lt;/A&gt; is another personal favorite.&amp;nbsp; I don&apos;t expect to be programming a la Tom Cruise in &lt;A href=&quot;http://us.imdb.com/Title?0181689&quot;&gt;Minority Report&lt;/A&gt; anytime soon, but I wouldn&apos;t mind.&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/04/22.html#a27</guid>			<pubDate>Tue, 22 Apr 2003 12:10:43 GMT</pubDate>			</item>		<item>			<title>A Thought on Software for Software Development</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/04/18.html#a24</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-04-19#A_Thought_on_Software_for_Software_Development&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;HR&gt;&lt;P&gt;The maturation and growing&amp;nbsp;ascendency of &lt;A href=&quot;http://maven.apache.org&quot;&gt;Maven&lt;/A&gt; in the Java open source community and recent &lt;A href=&quot;http://www.sys-con.com/java&quot;&gt;JDJ&lt;/A&gt;&amp;nbsp;&lt;A href=&quot;http://www.sys-con.com/java/articlea.cfm?id=1945&quot;&gt;article&lt;/A&gt; by Franz Garsombke have me thinking about build systems and more generally about software development process and quality.&amp;nbsp; (Never mind my recent displeasure with JDJ for dropping the integration category of the &quot;Reader&apos;s Choice&quot; Awards at the last minute and moving our business process integration product into the application server category without so much as a whisper to let us know; we asked to be removed from consideration instead of competing in an inappropriate category.)&amp;nbsp; Franz&apos;s article is a nice overview of the build/continuous integration system that he put in place at &lt;A href=&quot;http://www.ghx.com&quot;&gt;Global Healthcare Exchange&lt;/A&gt;, and it sounds like the build system that we&apos;ve built-up over the past few years.&lt;/P&gt;&lt;P&gt;There is an opportunity to create a build system product, and I know that there is a long line of people willing to pay for the perfect build system.&amp;nbsp; Perhaps something like Maven will fit the bill, since the necessary level and frequency of customization would demand an open source (but not necessarily free) product.&amp;nbsp; (I&apos;m waiting for good documentation on&amp;nbsp;the &lt;A href=&quot;http://maven.apache.org/reference/user-guide.html#Multi%20Project%20Builds%20and%20the%20Reactor&quot;&gt;Reactor&lt;/A&gt; plug-in, since we work in a multi-project environment, and it looks like it&apos;s finally&amp;nbsp;there.)&amp;nbsp; We&apos;ve passed our internally developed build system on to some of our larger customers for use on their own projects.&lt;/P&gt;&lt;P&gt;I can boil the abstract idea of the ideal build system down to three principles:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;DIV align=left&gt;&lt;STRONG&gt;A software application should be the output of an autonomous program.&lt;/STRONG&gt;&lt;/DIV&gt;&lt;LI&gt;&lt;DIV align=left&gt;&lt;STRONG&gt;The program&amp;nbsp;and its inputs should themselves be&amp;nbsp;the output of&amp;nbsp;an autonomous program.&amp;nbsp; &lt;/STRONG&gt;&lt;/DIV&gt;&lt;LI&gt;&lt;DIV align=left&gt;&lt;STRONG&gt;A&amp;nbsp;version-controlled object and the&amp;nbsp;&quot;get version&quot;&amp;nbsp;program are the only initial inputs.&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P align=left&gt;&quot;Autonomous&quot; is used in the sense that the program should return exactly the same output when provided with the same input.&amp;nbsp; The &quot;get version&quot; program might be a check-out or it might be something like downloading a specific Java version.&lt;/P&gt;&lt;P align=left&gt;These principles would be satisfied by something like a CVS checkout that retrieves a version of Ant, a version of Java, and an Ant script that then performs additional check-outs, compilation, etc.&amp;nbsp; The&amp;nbsp;third principle is subtle but extremely important.&amp;nbsp; For example,&amp;nbsp;a newer version of Ant shouldn&apos;t be used to compile an older version of the software application.&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/04/18.html#a24</guid>			<pubDate>Sat, 19 Apr 2003 03:55:53 GMT</pubDate>			</item>		<item>			<title>Personal Reverie on the Perfect IDE</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/04/18.html#a23</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-04-18#Personal_Reverie_on_the_Perfect_IDE&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;HR&gt;&lt;P&gt;As a user of both &lt;A href=&quot;http://www.intellij.com/idea/&quot;&gt;IntelliJ IDEA&lt;/A&gt; and &lt;A href=&quot;http://www.eclipse.org&quot;&gt;Eclipse&lt;/A&gt;, I could easily take either&amp;nbsp;side in the debate as to which is the better IDE for Java development.&amp;nbsp; &lt;A href=&quot;http://ant.apache.org&quot;&gt;Ant&lt;/A&gt;, &lt;A href=&quot;http://www.junit.org&quot;&gt;JUnit&lt;/A&gt;, &lt;A href=&quot;http://www.cvshome.org/&quot;&gt;CVS&lt;/A&gt; integration in the IDE are all Good Things, what I really want is &lt;EM&gt;IDE integration in Ant&lt;/EM&gt; and not the other way around.&lt;/P&gt;&lt;P&gt;More concretely, instead of being able to run Ant against a set of Java source files with defined classpaths and other environment settings, I would like to work with either a set of Java source files appropriate to a specific Ant task or Ant target with classpath and other parameters drawn from the build file.&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/04/18.html#a23</guid>			<pubDate>Fri, 18 Apr 2003 13:25:47 GMT</pubDate>			</item>		<item>			<title>Microsoft&apos;s Not All Bad</title>			<link>http://radio.weblogs.com/0119894/categories/java/2003/04/17.html#a22</link>			<description>&lt;P&gt;This post (and this weblog) has a new &lt;a href=&quot;http://blog.fivesight.com/prb/space/2003-04-18#Microsoft&apos;s_Not_All_Bad&quot;&gt;home&lt;/a&gt;.&lt;/P&gt;&lt;HR&gt;&lt;P&gt;As a strong Java advocate, I take a few (deserved) pot shots at Microsoft&apos;s forays into enterprise software&amp;nbsp;when the opportunity presents itself, but I have to say that when it comes to &quot;office&quot; suites and rich user applications, no one does it better.&amp;nbsp; I&apos;ve been using the &lt;A href=&quot;http://www.microsoft.com/office/preview/default.asp&quot;&gt;Office 2003 beta&lt;/A&gt; for a while, and it is very, very nice.&amp;nbsp; (I wouldn&apos;t be the first to compliment &lt;A href=&quot;http://www.microsoft.com/office/preview/infopath/default.asp&quot;&gt;InfoPath&lt;/A&gt; or &lt;A href=&quot;http://www.microsoft.com/office/preview/onenote/default.asp&quot;&gt;OneNote&lt;/A&gt;&amp;nbsp;- which can only be truly appreciated on a &lt;A href=&quot;http://www.microsoft.com/windowsxp/tabletpc/&quot;&gt;TabletPC&lt;/A&gt;&amp;nbsp;- but the improvements in Outlook are the most important feature to me, personally, so far.)&lt;/P&gt;&lt;P&gt;To a point, with reasonable &lt;A href=&quot;http://www.microsoft.com/office/preview/developer/XML.asp&quot;&gt;XML support&lt;/A&gt; and &lt;A href=&quot;http://www.microsoft.com/office/Preview/developer/default.asp&quot;&gt;accessibility through web services&lt;/A&gt;&amp;nbsp;added to the product, it doesn&apos;t bother me (much) to have Microsoft own the desktop applications because it is now possible to build solid integration with the Office products from a generic environment.&amp;nbsp; (In fact, we&apos;ve&amp;nbsp;got a neat demo&amp;nbsp;using web services support to&amp;nbsp;plug Excel-based&amp;nbsp;financial models into processes implemented in our Java-based &lt;A href=&quot;http://www.fivesight.com/products/bpi.asp&quot;&gt;BPI platform&lt;/A&gt;.)&amp;nbsp; The former state-of-the art for integration with Office was either at the file-format level (e.g.,&amp;nbsp;through&amp;nbsp;&lt;A href=&quot;http://jakarta.apache.org/poi/index.html&quot;&gt;POI&lt;/A&gt;) or through a Java/COM bridge (e.g., for&amp;nbsp;free through something like&amp;nbsp;&lt;A href=&quot;http://danadler.com/jacob/&quot;&gt;JACOB&lt;/A&gt; or for pay through something like&amp;nbsp;&lt;A href=&quot;http://www.intrinsyc.com/products/j-integra/&quot;&gt;J-Integra&lt;/A&gt; (the JCA support is a nice touch)).&lt;/P&gt;&lt;P&gt;That isn&apos;t to say that I wouldn&apos;t jump at the chance to have similar high-functionality applications on a Linux platform (although &lt;A href=&quot;http://sources.redhat.com/cygwin/&quot;&gt;Cygwin&lt;/A&gt; fully satisfies my occasional craving for &lt;A href=&quot;http://www.gnu.org/software/sed/sed.html&quot;&gt;sed&lt;/A&gt;, &lt;A href=&quot;http://www.gnu.org/software/gawk/gawk.html&quot;&gt;awk&lt;/A&gt;, &lt;A href=&quot;http://www.gnu.org/software/findutils/findutils.html&quot;&gt;find&lt;/A&gt;, and their ilk).&amp;nbsp; Even though IBM&apos;s going to &lt;A href=&quot;http://www.techweb.com/wire/story/TWB20030414S0001&quot;&gt;make a run&lt;/A&gt;, it appears that &lt;A href=&quot;http://www.openoffice.org/&quot;&gt;OpenOffice&lt;/A&gt; and &lt;A href=&quot;http://www.corel.com/&quot;&gt;Corel&lt;/A&gt; are the only options for SMB and SOHO&amp;nbsp;users, and that means that Microsoft will still get my money.&lt;/P&gt;</description>			<guid>http://radio.weblogs.com/0119894/categories/java/2003/04/17.html#a22</guid>			<pubDate>Fri, 18 Apr 2003 03:40:40 GMT</pubDate>			</item>		</channel>	</rss>
