You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Niall Pemberton (JIRA)" <ji...@apache.org> on 2007/01/05 17:11:28 UTC

[jira] Updated: (JXPATH-68) StackOverflow error on a call to 'JXPathContext.createPath()'

     [ https://issues.apache.org/jira/browse/JXPATH-68?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Niall Pemberton updated JXPATH-68:
----------------------------------

    Fix Version/s: 1.3

> StackOverflow error on a call to 'JXPathContext.createPath()'
> -------------------------------------------------------------
>
>                 Key: JXPATH-68
>                 URL: https://issues.apache.org/jira/browse/JXPATH-68
>             Project: Commons JXPath
>          Issue Type: Bug
>    Affects Versions: Nightly Builds, 1.2 Final
>         Environment: Windows XP Professional, Sun JDK 1.4.2
> Run with JXPath v1.2 and v20060530
>            Reporter: Joseph Campolongo
>             Fix For: 1.3
>
>
> I'm running into a StackOverflow error on a call to
> 'JXPathContext.createPath()' whenever I have a path that looks like
> 'a/b[1]/c'.  I took a quick look at the code and it appears JXPath, when
> trying to create its parent pointer, simply recreates an equivalent
> pointer(???).
> Here is code to reproduce the problem.
>     Map map = new HashMap();
>     map.put("a", null);
>     
>     JXPathContext pathContext = JXPathContext.newContext(map);
>     pathContext.setFactory(new AbstractFactory() {
>       public boolean createObject(
>           JXPathContext context, Pointer pointer, Object parent, String
> name, int index) {
>         Map parentMap = (Map)parent;
>         System.out.println(parent + ":" + name + ":" + index);
>         if (index > -1) {
>           List list = (List)parentMap.get(name);
>           if (list == null) {
>             list = new ArrayList();
>           }
>           int size = list.size();
>           for (int i = size; i <= index; i++) {
>             list.add(i, null);
>           }
>           parentMap.put(name, list);
>         } else {
>           parentMap.put(name, new HashMap());
>         }
>         return true;
>       }
>       
>     });
>     pathContext.createPath("a/b[1]/c");
> ***************
> I have continued looking into this, and found that the problem is that, if
> the List is created with a 'null' element, JXPath gets stuck in infinite
> recursion.
> To discover this, I changed my Factory to implement the following method:
>       public boolean createObject(
>           JXPathContext context, Pointer pointer, Object parent, 
>           String name, int index) {
>         if (pointer instanceof NodePointer) {
>           index = ((NodePointer)pointer).getIndex();
>         }
>         System.out.println(parent + ":" + name + ":" + index);
>         Map parentMap = (Map)parent;
>         if (index > -1) {
>           List list = (List)parentMap.get(name);
>           if (list == null) {
>             list = new ArrayList();
>           }
>           int size = list.size();
>           for (int i = size; i <= index; i++) {
>             list.add(i, new HashMap());  // !!!!!!  Don't set to 'null'
>           }
>           parentMap.put(name, list);
>         } else {
>           parentMap.put(name, new HashMap());
>         }
>         return true;
>       }
> Then I ran the following code:
>     pathContext.createPath("a/b[1]/c");
>     pathContext.createPath("a/b[2]/c");  // STACK OVERFLOW HERE
> Here is the stack trace at the beginning, where
> 'ValueUtils.expandCollection()' is called.  It puts 'null' into the list,
> thus causing the stack overflow as we cycle between createPath() &
> createChild().
> Thread [main] (Suspended (breakpoint at line 227 in DynamicPropertyPointer))
> 	DynamicPropertyPointer.createPath(JXPathContext) line: 227
> 	DynamicPropertyPointer(PropertyPointer).createChild(JXPathContext,
> QName, int) line: 188
> 	NullElementPointer.createPath(JXPathContext) line: 82
> 	NullPointer.createPath(JXPathContext) line: 86
> 	NullPropertyPointer.createPath(JXPathContext) line: 103
> 	NullPointer.createPath(JXPathContext) line: 86
> 	NullPropertyPointer.createPath(JXPathContext) line: 103
> 	JXPathContextReferenceImpl.createPath(String, Expression) line: 447
> 	JXPathContextReferenceImpl.createPath(String) line: 427
> 	Test.test4() line: 75
> 	Test.main(String[]) line: 38

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

        

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org