Julian Ryan created OGNL-260:
--------------------------------

             Summary: ArrayList Iterator Cursor set to Object Aray in OGNL
                 Key: OGNL-260
                 URL: https://issues.apache.org/jira/browse/OGNL-260
             Project: Commons OGNL
          Issue Type: Bug
            Reporter: Julian Ryan


When running the following example in the latest (3.2.11):
{code:java}
import ognl.MemberAccess;
import ognl.Ognl;
import java.lang.reflect.Member;
import java.util.Map;

public class OgnlTest {
   public static void main(String ... args) {
      // Lazy allow everything for this test
      Map ognlContext = Ognl.createDefaultContext(null, new MemberAccess() {
         @Override
         public Object setup(Map context, Object target, Member member, String 
propertyName) {
            return null;
         }

         @Override
         public void restore(Map context, Object target, Member member, String 
propertyName, Object state) {

         }

         @Override
         public boolean isAccessible(Map context, Object target, Member member, 
String propertyName) {
            return true;
         }
      });

      try {
         Object o = Ognl.getValue("#editsIter = 
@java.util.Arrays@asList(\"one,two,three\".split(\",\")), 
#editsIter.iterator()", ognlContext, new Object());
         ognlContext.put("iterator", o);
         Object o2 = Ognl.getValue("#iterator.next()", ognlContext, new 
Object());
         System.err.println(o2);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

{code}
The iterator cursor is set to an Object array with a single value containing 
the array values of the ArrayList instead of the values in the ArrayList.  This 
causes calling iterator.next() to just returns the whole set of ArrayList 
values.

The expected behavior would be similar to the following snippet:
{code:java}
import java.util.Arrays;
import java.util.Iterator;

public class IteratorTesting {
   public static void main(String ... args) {
      Iterator iterator = Arrays.asList("one,two,three".split(",")).iterator();

      while(iterator.hasNext()) {
         Object o = iterator.next();
         System.err.println(o);
      }
   }
}
{code}
In short, for version 3.2.11 the iterator.next() returns an Object[] of length 
1 and in version 2.6.7 calling iterator.next() works the same as the second 
snippet.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to