[jdom-interest] API Inertia

Brett McLaughlin brett at newInstance.com
Mon Apr 30 22:01:49 PDT 2001

> Brett McLaughlin wrote:
> >
> > Traversing a tree, which is a 50 line example in DOM (weird
> > structures and all) becomes a tremendous pain in JDOM;
> I believe the addition of a real tree traversal API in JDOM would go
> farther to help with this than adding a Node interface containing two
> methods and not changing anything else.  The Java way to walk a tree is
> probably like this:
> Iterator itr = doc.getContentIterator();
> while (itr.hasNext()) {
>   Object o = itr.next();
>   // deal with o
> }

What if I want to start iteration at an Element? No commonality? So we've
got to write special-case code for the iterator on Document and Element?

> Having a Node interface doesn't really help here because Iterator
> returns Object.  Always will.  You could cast to Node but it'd be

Why? Who says it must? I guess I'm not convinced that assumption is valid.
And if it's simply because of java.util.Iterator, call it TreeWalker or
something and make it return type-safe values. If JDOM is so user-friendly,
so seemingly hell-bent on preventing user error in so many fringe cases, why
wouldn't we return a type-safe value in a very common case?

> useless until you downcast further.  So why not talk about adding the
> above method (which is an idea in the TODO to investigate), rather than
> talk about a Node interface with little value?

Because (1) I think Node has value and (2) the above solution is easier with
a Node interface/base class.

> BTW, you could use a visitor pattern for walking too.
> > writing the chapters on it. Additionally, with SOAP and things like
that, I
> > really am annoyed in having to get an "Object" back over the wire. I
> > count on it being something that I can feed to, say, XMLOutputter. How
> > would it be to pass a Node, or Item, or whatever, to the print() method
> > XMLOutputter? Pretty darn sweet.
> There's some value here.  But XMLOutputter would have to do an
> instanceof search to determine what type of object it truly was and then
> use different logic internally depending on the class, because Node
> wouldn't have any helper methods to handle output.  That means you end

So? XMLOutputter internals should not affect the determination of the
usefullness of a method. That is a totally silly argument, IMO ;-) As an API
user, I couldn't care less how hard the API writer has it; I care about what
the API does for me.

> up with a print() method that accepts a general Node interface type but
> in reality it can only *really* print a limited set of implementing
> classes!  That's terrible style, a totally lying interface.

Not true. It would be able to print every implementing class of Node, which
isn't a lie at all. Unless you go to the rather ridiculous, Jonathan Swift
style satire of saying someone defines there own Node implementation that's
nutty and passes it in. Come on; you think people are idiots for not knowing
how to unsubscribe from a mailing list, and expect better, but when writing
code we have to protect them from themselves ;-) Silly..

> > Gets rid of all that serialized form crap, for one thing.
> It's already gone.  :-)

So how can I print any Node? Well, I have to cast Object to the right thing
and pass it in; that's not as easy as it could be.

> >   Things like detach(). This would have never made it into the
> > original API, because we looked at it and said "Oh, here's how
> > you remove content: removeContent()."
> I actually discussed the idea before adding detach() months ago looking
> for alternate ideas and *no one* said they didn't like detach().  It
> really sucks to talk about ideas, hear nothing, implement them, and then
> have everyone attack everything.

Fair enough. I completely agree that you threw it out there, and it got
missed. But we're here now ;-)

> >   So I simply want to encourage everyone, myself included, to stop
> > that we are so close that big changes (like namespace handling and
> > entities?!?) are bad.
> Umm, I'm confused what point you're making.  We're 110% changing the

Simply that I don't want inertia to be a factor, and I feel that it is, to
some extent. Not to an extreme, but I think there's a "I tried that, and it
didn't work, and there's no way that any light can be shed on it that I
didn't already think of." I'm not sure that's the case. IMO, too many people
are for this idea for it to be a waste of time. It may not be a best
solution, and it's not the only valid solution, but to say it's impossible
to implement is a bit short-sighted, IMO :-)

> Entity model as discussed in the report from the SD West BOF discussion
> and listed in the TODO.  I don't think anyone's against drastic changes
> just because they're drastic, but I am against changes that have serious
> flaws, like Node.  I spent an entire afternoon working on making Node
> work, and I realized every way I tried had dragons.  Now people are

An entire afternoon? <sarcasm>My gosh, you must have exhausted every
possibility. I mean, 4 or 5 hours... that's enough time to write an entire
API</sarcasm>. OK, you had to know that was coming. I think it's possible to
fix this. Very fixable... we're arguing that, and I think it's the truth. As
for if we should do it, there's legitimate disagreement here. But I do think
it's time to acknowledge that it's possible to do this thing, even if not a
30 minute change.

> throwing out many different approaches, and I'm reporting the problems I
> found when I tried the very same thing that afternoon.

I haven't seen implementation problems, for the most part; I've seen
conceptual problems. So we'll keep plugging!


> -jh-

More information about the jdom-interest mailing list