Simon Kitching wrote:
No, it isn't the last <listItem> that's triggering the call. The method
call always happens once for every match of the CallMethodRule. You've
specified a pattern of "dependencies/dependency/initList" for that rule,
so it fires once for each initList element found, *not* for each
listItem.
Yes, your right, I'm not at all sure what I was thinking!
When a CallParamRule fires it just stores its value away for use when
the method call actually happens, which is why you see the last
listItem's value as the parameter to the call.
I think this was the part that was confusing me. Now it makes sense...
each CallParamRule that fired was overwriting the previous one, so when
the CallMethodRule finally fired, obviously only the last value was
still around.
Your later email describes a solution where the initlist object
effectively has a list of listItem objects which are added to the parent
initList as the listItem elements are encountered. The initList object
then has a method which adds all of its child listItem objects to the
root object after they have been processed. You describe this as "not
very elegant" but I think it's fine.
Well then I'm OK with it too :)
What I meant by not elegant was that having to build an intermediary
array seemed like a bit more work than was neccessary... I was thinking
there might be a way to just rewrite the rules and not have to do that.
But, if that's a relatively normal usage pattern, then I have no
reason to complain. I just didn't want to feel like I was doing
something "hackey".
The xml is clearly indicating that
listItem objects are children of an initList object, and this solution
implements exactly that. The only thing that could possibly be called
"not very elegant" is the last step where the listItems are added to
some root object (effectively "denormalising" the data structure) rather
than simply adding the InitList object to its parent, leaving the data
in a structure which echoes the xml layout.
Hmm... I think I get what your saying... I don't think it really fits
what I'm doing though... I suppose in a sense, by design, the XML
doesn't actually match the data structure being constructed. I'm not
actually populating individual items here, I'm populating a collection.
What I have is an initLists List. Each element in this collection is a
Map that contains three values: "name", "value" and "method". So, for
each item I add to that collection, I need not only the values that are
part of a <listItem>, but also part of the <initList> element.
I think my flaw originally was in thinking I needed a way to store the
method attribute of <initList>, so that I could use it for each
occurance of <listItem>, which would fire some rule to add it to the
collection. As soon as I reversed the thinking and tried to store all
the <listItem>'s first and THEN get the method attribute (in essence),
it all fell in to place.
You do mention "resetting" the initList's list of children "for the next
group" but I don't think this is necessary is it? When the next
<initList> tag is encountered, a new InitList object should be created
which will of course have an initially empty list of children.
I suppose that could be made to be true, but as it stands now I don't
have any ObjectCreate rules... well, not for the initList anyway, that
is just a member of another object that in fact was created earlier.
The resetting is done because there can be multiple <initList> elements,
and each time a new one is encountered I effectively need to start
building a new temporary array.
Although, now that your making me think about it, what I could do is put
a CallMethod rule on the closing element that is the parent of
<initList>, and not do the reset. Then, the initList field would only
be set once, and I could just set it to the temporary array.
Eh, it's working now, I'm not going to mess with it :) I do very much
appreciate your comments though Simon, if nothing else this has taught
me a fair amount about Digester (I seem to learn a fair amount every
time I use it actually!)
Cheers,
Simon
Frank
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]