On Thu, Oct 8, 2009 at 10:07, Amila Suriarachchi
<amilasuriarach...@gmail.com> wrote:
> On Thu, Oct 8, 2009 at 2:15 AM, Andreas Veithen
> <andreas.veit...@gmail.com>wrote:
>
>> -1 for this change.
>>
>> Reasons:
>>
>> 1. It breaks the contract of the method in two ways:
>>
>> - It doesn't work if the XMLStreamReader is non coalescing.
>
> I am not clear how you going to explain this.
>
> In earlier code, when it comes to while loop it has executed
> 1. reader.next() which is at the if statement
> 2. reader.getText() which is just above
>
> after this change same thing applies. Now it has the reader.next() at the
> top.
>
>
>> In this
>> case it would only read part of the content. Please refer to the
>> second part of the code in that method, more precisely the part tagged
>> with the comment "Take into account that in non coalescing mode, there
>> may be additional CHARACTERS events".
>> - Even if the parser is coalescing, the change still violates the
>> contract for elements that don't have the expected content, i.e. which
>> have child nodes other than text nodes. In this case, the changed
>> method neither satisfies the postcondition, nor does it throw an
>> exception.
>>
>
> Can you please explain the lines of codes which has broken this?
>
>
>>
>> 2. The description of the change is not accurate: "supporting empty
>> elements for base64Binary elements." The previous version of the code
>> does support empty elements, at least if getElementText conforms to
>> the StAX specs.
>
> I think you refer here.
>
> if (dhr == null) {
>            // since we have advance the reader to next have to use the
>            // reader.getText
>            base64 = reader.getText();
>            reader.next();
>        }
>
> this code get executed only if dhr is null. that is not the case for this.
>
> try to invoke this service[1] RetByteArray method with an empty datahandler.

Better, I have extended the ADB test suite and there is now a test
case that shows the problem. I will add some Axiom unit tests later
today and then we can look at how to fix the problem properly.

Thanks.

Andreas

> i.e. new DataHandler(new ByteArrayDataSource(new byte[0])); with generated
> adb code.
>
> [1]
> http://131.107.72.15/SoapWsdl_BaseDataTypes_XmlFormatter_Service_Indigo/BaseDataTypesDocLitB.svc?wsdl
>
>
> Here is the problem.
>
> ADB parse method invoke this method when the current location is at the
> start element of this element.
>
> <ns3:inByteArray xmlns:ns3="http://tempuri.org/";></ns3:inByteArray>
>
> this method throws an exception here.
> I think this is wrong and it should have return an empty datahandler.
>
> i.e. new DataHandler(new ByteArrayDataSource(new byte[0]))
>
>
>
>> I will provide a unit test that shows this.
>>
> +1. Please provide a unit test case which does work with earlier version and
> does not work with the changed
> version.
>
>
>> If there is a problem around this method, then probably the root cause
>> is located in a completely different area. There are two things that
>> come to my mind:
>>
>> - Could it be that the XMLStreamReader that is passed to the method
>> has an incorrect implementation of getElementText?
>> - Could it be that the method is called in the wrong context, e.g. in
>> a context where the element represented by the current event may have
>> a child element?
>>
>
> please try to invoke the service I have given and have a look at.
>
> thanks,
> Amila.
>
>>
>> Andreas
>>
>>
>> On Wed, Oct 7, 2009 at 16:08,  <ami...@apache.org> wrote:
>> > Author: amilas
>> > Date: Wed Oct  7 14:08:20 2009
>> > New Revision: 822747
>> >
>> > URL: http://svn.apache.org/viewvc?rev=822747&view=rev
>> > Log:
>> > supporting empty elements for base64Binary elements.
>> >
>> > Modified:
>> >
>>  webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
>> >
>> > Modified:
>> webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
>> > URL:
>> http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java?rev=822747&r1=822746&r2=822747&view=diff
>> >
>> ==============================================================================
>> > ---
>> webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
>> (original)
>> > +++
>> webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamReaderUtils.java
>> Wed Oct  7 14:08:20 2009
>> > @@ -64,17 +64,26 @@
>> >      */
>> >     public static DataHandler getDataHandlerFromElement(XMLStreamReader
>> reader)
>> >             throws XMLStreamException {
>> > +
>> > +        // according to the pre and post conditions it is possible to
>> have an
>> > +        // empty element eg. <ns3:inByteArray xmlns:ns3="
>> http://tempuri.org/";></ns3:inByteArray> for empty data handlers
>> > +        // in that case we return a new data handler.
>> > +        // This method is used by adb parser we can not return null
>> since this element is not null.
>> > +        reader.next();
>> > +        if (!reader.hasText()){
>> > +            DataHandler dataHandler = new DataHandler(new
>> ByteArrayDataSource(new byte[0]));
>> > +            // return from here since reader at the end element
>> > +            return dataHandler;
>> > +        }
>> >
>> >         DataHandlerReader dhr = getDataHandlerReader(reader);
>> >         String base64;
>> >         if (dhr == null) {
>> > -            // In this case the best way to get the content of the
>> element is using
>> > -            // the getElementText method
>> > -            base64 = reader.getElementText();
>> > +            // since we have advance the reader to next have to use the
>> > +            // reader.getText
>> > +            base64 = reader.getText();
>> > +            reader.next();
>> >         } else {
>> > -            if (reader.next() != XMLStreamConstants.CHARACTERS) {
>> > -                throw new XMLStreamException("Expected a CHARACTER
>> event");
>> > -            }
>> >             if (dhr.isBinary()) {
>> >                 DataHandler dh = dhr.getDataHandler();
>> >                 reader.next();
>> >
>> >
>> >
>>
>
>
>
> --
> Amila Suriarachchi
> WSO2 Inc.
> blog: http://amilachinthaka.blogspot.com/
>

Reply via email to