I disagree that its flawed. It will not work well for every particular case and there are definite limitations, but for the following cases it still works:

1. Parsing to DOM, and then using a stream reader on top of stax (WS-Security) 2. Writing to stax, flushing, writing to an outputstream, and then writing to stax (JAXB) 3. Reading to byte buffer, stax on top of byte buffer to route the message, and then writing the byte buffer

Also, I'm not sure I understand your problem with 1) reading via the inputstream (requires placing the saaj interceptor before the staxininterceptor) and 2) putting an xmlstreamreader on top of the SAAJ impl. SAAJ implements the w3c dom interfaces so we should be able to use the W3CDOMStreamReader.

- Dan

Glynn, Eoghan wrote:

Yep, if such a thing were available it would get us over the hump (note
as I pointed out in my response to DanK, we currently just use the RI
SAAJ model, which consumes the underlying input stream as opposed to a
parsed source).

However, I'd repeat my feeling that the multi-format message idea is
flawed, unless we're careful to always replace an old content type with
a new one if the latter may render the former unusable. And often-times
this isn't obvious ... e.g. it's a quality of a particular
XMLStreamReader implementation whether it eagerly consumes the
underlying input stream.

/Eoghan

-----Original Message-----
From: Dan Diephouse [mailto:[EMAIL PROTECTED] Sent: 19 September 2006 17:22
To: [email protected]
Cc: Glynn, Eoghan
Subject: Re: Problem with multi-format messages and JAX-WS handlers

Well, my thought that we should be able to build up the SAAJ tree from the StAX stream reader. Is there a stax->saaj builder around somewhere? We could certainly write one pretty easily I think. Or should we just use stax->sax->saaj for now?
- Dan

Daniel Kulp wrote:

Eoghan,

I THINK the best "short term" solution for this problem
would be to put the
SAAJ handlers BEFORE the StAX interceptor. The SAAJ
handler would use the
input stream to parse to SAAJ. It would then create the
XMLStreamReader
based on the DOM model and set that into the message. (The XMLStreamReader would just iterate over the DOM) Thus, the StAX interceptor wouldn't have anything to do anything as the XMLStreamReader would already be present in the Message.


Dan




On Tuesday September 19 2006 6:34 am, Glynn, Eoghan wrote:


Folks,

I've come across an issue when trying to use JAX-WS Handlers in the WS-Addressing system test (used to assert that the message
addressing
properties are made available to handlers as expected).

A while back I pointed out what I thought was a flaw in the multi-format Message idea, and I think my current problem may be a manifestation of this.

Basically we allow say an incoming message to have an underlying format (e.g. java.io.InputStream) provided by the transport, and various layered formats (e.g. a javax.xml.stream.XMLStreamReader under-pinned by the InputStream) added by interceptors in
the dispatch chain.
The idea being to allow interceptors to switch back and
forth between
various representations, so as to use the most convenient/performant/natural one for the current context. So for instance one interceptor consumes elements via StAX,
whereas the next
reverts to the InputStream to get low-level access to the
underlying
bytes.

However, there's a wrinkle. The layered format could be
implemented to
read-ahead, e.g. a reader eagerly consuming from the
underlying input
stream to fulfill the next() call. So if you switch back to the underlying format, you'll miss out on elements cached in the reader.

Now that's what appears to be happening, i.e. the XMLStreamReader added by the StaxInInterpceptor consumes the stream. Later when the SOAPMessageContext is created by the SOAPHandlerInterceptor, it attempts to revert back to the InputStream representation
in order to
create the SAAJ message - however the stream content has
already been
consumed by the XMLStreamReader, so the call to
javax.xml.soap.MessageFactory.createMessage() fails with an
unexpected
EOF.

It seems to me that this model of switching between representations would only be viable if we could guarantee that the layered
formats do
not read-ahead eagerly. Anyone know if its possible to set
this sort
of behavior for the StAX reader? If not, I guess we'd need
to replace
our use of MessageFactory.createMessage() with our own SAAJ model layered over the XMLStreamReader.

Thoughts?

/Eoghan


--
Dan Diephouse
(616) 971-2053
Envoi Solutions LLC
http://netzooid.com





--
Dan Diephouse
(616) 971-2053
Envoi Solutions LLC
http://netzooid.com

Reply via email to