Vitali Yarmolik created OLINGO-504:
--------------------------------------

             Summary: Incorrect reading of child annotation elements
                 Key: OLINGO-504
                 URL: https://issues.apache.org/jira/browse/OLINGO-504
             Project: Olingo
          Issue Type: Bug
          Components: odata2-core
    Affects Versions: V2 2.0.1
            Reporter: Vitali Yarmolik


We have the following scenario: There is an XML file which stores EDM metadata. 
The file is parsed by 
{{org.apache.olingo.odata2.core.ep.consumer.XmlMetadataConsumer}} class in 
order to get an object representation of the metadata. Such an object 
representation is handled after that in an application-specific way.

In our case, the EDM metadata also contains custom annotation elements which 
are specified for the EDM schema and represented in the following way:
{code:xml}
<CustomAnnotations xmlns="http://company.com/odata";>
    <annotation1>value1</annotation1>
    <annotation2>value2</annotation2>
</CustomAnnotations>
{code}

So, basically we have a schema-level CustomAnnotations annotation element which 
has two child annotation elements.

After parsing the XML file with the metadata, we get an instance of 
{{org.apache.olingo.odata2.api.edm.provider.DataServices}} from which we want 
to get the custom annotation element along with its child annotation elements. 
The problem is that the returned instance of 
{{org.apache.olingo.odata2.api.edm.provider.AnnotationElement}}, which 
corresponds to CustomAnnotations element, returns 'null' when its child 
annotation elements are requested via {{getChildElements()}} method.

After debugging I found that the problem is in 
{{readAnnotationElement(XMLStreamReader)}} method of {{XmlMetadataConsumer}}. 
The problem occurs when there is a white space after the open XML tag for the 
parent Annotation Element. In our case, we had white space after 
{{<CustomAnnotations>}} XML tag. In such a case, {{readAnnotationElement()}} 
method reads the characters using the following code:
{code}
String elementText = "";
do {
    elementText = elementText + reader.getText();
    reader.next();
} while (reader.isCharacters());
aElement.setText(elementText);  
{code}
The problem is that {{reader.next()}} method is called twice: during reading 
the characters and in the outer 'while' loop. As a result, open XML tag for the 
child annotation element is skipped.

Removing of additional spaces from the EDM XML fixes the issue, but, in my 
opinion, the implementation of {{XmlMetadataConsumer}} should be improved.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to