[ 
http://jira.codehaus.org/browse/JIBX-228?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=178955#action_178955
 ] 

genadi genov commented on JIBX-228:
-----------------------------------

Hi,

I get the ArrayIndexOutOfBoundsException because of this bug. I unmarshall a 
given xml message and then try to marshall exactly the same unmarshalled 
content. The marshalling process fails in StreamWriterBase:writePrefix(int 
index) method. The method is called with index -1 and bytes = 
m_prefixBytes[index]; fails (of course). If I change the index value from -1 to 
0 in debug mode every time this method is called with index == -1, then 
everything works fine :-).

Will this bug be fixed in a new release in the near future?



> ArrayIndexOutOfBoundsException caused by org.jibx.extras.DomMapperBase
> ----------------------------------------------------------------------
>
>                 Key: JIBX-228
>                 URL: http://jira.codehaus.org/browse/JIBX-228
>             Project: JiBX
>          Issue Type: Bug
>          Components: core
>    Affects Versions: JiBX 1.1.6
>         Environment: JiBX v1.1.6a
> JDK v1.5.0_06
> Eclipse IDE "Ganymede" v3.4 + JiBX eclipse plugin activated
>            Reporter: Alexandre Delarge
>            Assignee: Dennis Sosnoski
>             Fix For: JiBX 1.1.6
>
>         Attachments: jibx-jira.zip, jira-jibx-228.txt
>
>
> Hello,
> I refactored a web service application that made heavy usage of DOM 
> generation/parsing to use JiBX instead.
> While working on this, I wrote a couple JiBX bindings that rely on the 
> "org.jibx.extras.DomElementMapper" class that comes as a part of JiBX extras.
> Using this mapper to marshall arbitrary portions of DOM trees raised a number 
> of ArrayIndexOutOfBoundsException that prevented my application to success in 
> generating response messages.
> I drilled down these error causes into JiBX source code, and here is what I 
> found (note: all references to source code below are taken from v1.1.6a).
> 1) Lookup of known namespaces & prefixes
> ==================================
> In class "org.jibx.extras.DomMapperBase", in many places inside the method 
> "findNamespaceIndex" you return -1 if you don't find a namespace prefix among 
> the list owned by the m_xmlWriter object.
> Here is an example on line 123:
> ---
>   [...]
>   int index = m_xmlWriter.getPrefixIndex(prefix);
>   if (index >= 0) {
>       return getNamespaceUri(index).equals(uri) ?
>           index : -1;
>   } else {        // line 122
>       return -1;  // line 123
>   }
>   [...]
> ---
> This -1 value greatly increases the chances of getting an 
> ArrayIndexOutOfBoundsException from method "getNamespacePrefix(int index)" in 
> class "org.jibx.runtime.impl.XMLWriterNamespaceBase".
> The -1 value results from a failure in finding the exact given prefix in the 
> list of prefixes the m_xmlWriter object owns. 
> I think that looking for the namespace itself inside the list of namespace 
> URIs owned by the m_xmlWriter object will do the right job, while suppressing 
> many of the exceptions.
> To me it sounds valid, because it happens that the namespace URI is known but 
> just associated to a different prefix.
> During the marshalling of various DOM elements, I got bothered by this 
> missing lookup in several places, so I implemented it into a new private 
> method:
> ---
>   /**
>    * Get index number for declared namespace.
>    *
>    * @param uri namespace URI (empty string if none)
>    * @return namespace index number, or <code>-1</code> if not declared or
>    * masked
>    */
>   private int findNamespaceURIIndex(String uri) {
>       String[] uris = m_xmlWriter.getNamespaces();
>       for (int i = 0; i < uris.length; i++) {
>               if(uris[i].equals(uri)) {
>                       return i;
>               }
>       }
>       return -1;
>   }
> ---
> Then I updated the "findNamespaceIndex" method accordingly, in the 3 
> following locations (lines 108, 115, and 123):
> ---
> [...]
>         } else {
>            return findNamespaceURIIndex(uri);                     // line 108
>         }
>       } else {
>         return -1;
>       }
>     } else {
>     return m_defaultNamespaceURI.equals(uri) ?                    
>             m_defaultNamespaceIndex : findNamespaceURIIndex(uri); // line 115
>   }
> } else {
>     int index = m_xmlWriter.getPrefixIndex(prefix);
>     if (index >= 0) {
>         return getNamespaceUri(index).equals(uri) ?
>             index : -1;
>     } else {                                                       
>       return findNamespaceURIIndex(uri);                           // line 123
>     }
> [...]
> ---
> 2) Discovery of namespaces & prefixes
> ==============================
> I also had troubles with the strategy for handling some namespaces 
> declarations coming from a DOM tree, with the same kind of symptoms showing 
> up: ArrayIndexOutOfBoundsException rising from class 
> "org.jibx.runtime.impl.StreamWriterBase", more exactly from method 
> "writePrefix".
> For that one I had to look closely at method "marshalElement" in class 
> "org.jibx.extras.DomElementMapper", stepping into the algorithm for getting 
> the right namespace index for the current element.
> Actually, I think the following assignment at line 227 (by the way is the 
> "==" operator wanted here, or is it "equals()" ?):
> ---
> [...]
>   if (uri == decluri) {
>     nsi = defind;     // line 227
>   }
> [...]
> ---
> Will occasionally de-activates the lookup for the right index among newly 
> discovered namespaces, which is made at line 251:
> ---
> [...]
>   for (int i = 0; i < length; i++) {
>     prefs[i] = (String)nss.get(i*2);
>     uris[i] = (String)nss.get(i*2+1);
>     nums[i] = base + i;
>     if (nsi < 0 && uri.equals(uris[i])) {                   // line 251
>       if ((prefix == null && prefs[i] == "") ||
>         (prefix != null && prefix.equals(prefs[i]))) {
>         nsi = base + i;
>       }
>     }
>   }
> [...]
> ---
> This may result in an incorrect index being used, because the lookup made at 
> line 251 takes into account the index shift introduced by the addition of new 
> namespaces, while this assignment does not.
> I therefore remove it.
> However the main issue with that method in my humble opinion is the fact we 
> don't check that we have found the element's namespace index just after we 
> checked all the attributes for namespaces declarations.
> I therefore added the following statements just before line 233:
> ---
> [...]
>   /*
>    * if we get there without having found an index for the current
>    * element's namespace, we add it to the list.
>    */
>   if(nsi == -1 && (nss == null || !nss.contains(uri))) {
>       if(nss == null) nss = new ArrayList();
>       nss.add(prefix == null ? "" : prefix);
>       nss.add(uri == null ? "" : uri);
>   }
> [...]
> ---
> I don't alter the value of "nsi", so the aforementioned lookup located at 
> line 251 will assign it with the right value.
> I attach a sample Eclipse project to this report, it contains a sample set of 
> Java classes, XML file, and binding that exhibits the 2nd issue (I cannot 
> easily cause the 1st one to happen).
> The code I bundle features a JUnit test case in class 
> "test.jibx.junit.TestDomMapper".
> I include my version of the "DomMapperBase" class, which enables the code I 
> wrote  to work fine.
> I also include a visual summary of the differences between the original 
> version, of the class and mine, hoping this will help.
> Regards,
> Alex.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
OpenSolaris 2009.06 is a cutting edge operating system for enterprises 
looking to deploy the next generation of Solaris that includes the latest 
innovations from Sun and the OpenSource community. Download a copy and 
enjoy capabilities such as Networking, Storage and Virtualization. 
Go to: http://p.sf.net/sfu/opensolaris-get
_______________________________________________
jibx-devs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-devs

Reply via email to