<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2653.12">
<TITLE>RE: [doom-interest] The JDOM Model, Chapter 15 of Processing XML with Java</TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>I haven't read your chapter, but I do have some comments on your commentary.&nbsp; For the most part, I agree completely.&nbsp; The big holes in the JDOM API stem from the &quot;specification by implementation&quot; process in which it was born.&nbsp; Lack of a specification will prohibit answering the one question that a specification always answers: &quot;When are you done?&quot;</FONT></P>

<P><FONT SIZE=2>Some of the original &quot;Java vision&quot; is ultimately at odds with a clear API.&nbsp; In particular, the &quot;no interfaces&quot; idea.&nbsp; While it may sound nice on the surface by keeping things &quot;simple&quot; in that all we have to deal with are concrete classes, not having interfaces *doesn't* in fact keep things simple.&nbsp; For an API representing a hierarchical data structure, it makes things more complex.&nbsp; Lets look at your first three questions in that context.</FONT></P>

<P><FONT SIZE=2>&nbsp;</FONT>
<BR><FONT SIZE=2>&gt; 1. What is a node?</FONT>
</P>

<P><FONT SIZE=2>I don't know.&nbsp; I do know it has one parent, and zero to N children, though.&nbsp; So how about an interface to describe it.&nbsp; Then all the concrete classes we like so much can implement it as best fits their specific tasks.</FONT></P>

<P><FONT SIZE=2>public interface Node{</FONT>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=2>public Node [] children = get Children(); // * more later....</FONT>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=2>public Node parent = get Parent();</FONT>
<BR><FONT SIZE=2>}</FONT>
</P>

<P><FONT SIZE=2>&gt; 2. What is the value of a node?</FONT>
</P>

<P><FONT SIZE=2>Nodes have values?&nbsp; Is that the same as it's children, or perhaps just a String value? Perhaps we need to extend Node to create Value Node and define a &quot;getValue()&quot; method.&nbsp; Perhaps we should discuss, and then specify this behavior.&nbsp; Then we should implement it, according to specification.</FONT></P>

<P><FONT SIZE=2>&gt; 3. Why does JDOM call only elements children when every other XML </FONT>
<BR><FONT SIZE=2>&gt; specification uses the word &quot;children&quot; to refer to all kinds of nodes?</FONT>
</P>

<P><FONT SIZE=2>Because JDOM has no specification.&nbsp; Because it does not prefer interfaces to define type, it can not enjoy the benefits of same, one of which is polymorphic behavior.</FONT></P>

<P><FONT SIZE=2>This is one of the two major complaints I have about JDOM.&nbsp;&nbsp; Lack of common interfaces.&nbsp; I think fixing it requires two things.&nbsp; A clear specification of what those interfaces should be, and a major refactoring of the code base to implement the specification.</FONT></P>

<P><FONT SIZE=2>The second major complaint I have can be related, but is ultimately orthogonal to the interface problem.&nbsp; It's a stylistic issue that I call &quot;Abuse of Collections.&quot;&nbsp; I've always believed (and continue to do so) that no publicly defined method should return a collection as a result if the members of the collection all share a common data type.&nbsp; It follows that if they all share the same data type, then you might as well return an array of them instead, and save your caller a cast.</FONT></P>

<P><FONT SIZE=2>In JDOM, all nodes do not, in fact, share a common data type.&nbsp; This makes the collections returned a necessity.&nbsp; However, it requires that the caller do a type check, and then a cast, which is clumsy.</FONT></P>

<P><FONT SIZE=2>Warts and all, JDOM is still the prettiest girl at the dance.&nbsp; A new dress and a pedicure, and she'd be a knockout.</FONT>
</P>

<P><FONT SIZE=2>--</FONT>
<BR><FONT SIZE=2>Jerome O'Neil</FONT>
<BR><FONT SIZE=2>Sr Software Engineer</FONT>
<BR><FONT SIZE=2>The Cobalt Group</FONT>
<BR><FONT SIZE=2>206.219.8008</FONT>
</P>

</BODY>
</HTML>