camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From davscl...@apache.org
Subject svn commit: r922885 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/language/bean/BeanExpression.java test/java/org/apache/camel/language/SimpleTest.java
Date Sun, 14 Mar 2010 16:14:18 GMT
Author: davsclaus
Date: Sun Mar 14 16:14:18 2010
New Revision: 922885

URL: http://svn.apache.org/viewvc?rev=922885&view=rev
Log:
CAMEL-2546: Camel OGNL added special last keyword to get last from List.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java?rev=922885&r1=922884&r2=922885&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
(original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
Sun Mar 14 16:14:18 2010
@@ -219,19 +219,40 @@ public class BeanExpression implements E
         }
 
         private Object lookupResult(Exchange exchange, String key, Object result, boolean
elvis, String ognlPath, Object bean) {
+            // trim key
+            key = key.trim();
+
             // try map first
             Map map = exchange.getContext().getTypeConverter().convertTo(Map.class, result);
             if (map != null) {
                 return map.get(key);
             }
 
+            // special for list is last keyword
             Integer num = exchange.getContext().getTypeConverter().convertTo(Integer.class,
key);
-            if (num != null) {
+            boolean checkList = key.startsWith("last") || num != null;
+
+            if (checkList) {
                 List list = exchange.getContext().getTypeConverter().convertTo(List.class,
result);
                 if (list != null) {
-                    if (list.size() > num - 1) {
+                    if (key.startsWith("last")) {
+                        num = list.size() - 1;
+
+                        // maybe its an expression to subtract a number after last
+                        String after = ObjectHelper.after(key, "-");
+                        if (after != null) {
+                            Integer redux = exchange.getContext().getTypeConverter().convertTo(Integer.class,
after.trim());
+                            if (redux != null) {
+                                num -= redux;
+                            } else {
+                                throw new ExpressionIllegalSyntaxException(key);
+                            }
+                        }
+                    }
+                    if (num != null && num >= 0 && list.size() > num
- 1) {
                         return list.get(num);
-                    } else if (!elvis) {
+                    }
+                    if (!elvis) {
                         // not elvis then its mandatory so thrown out of bounds exception
                         throw new IndexOutOfBoundsException("Index: " + num + ", Size: "
+ list.size()
                                 + " out of bounds with List from bean: " + bean + "using
OGNL path [" + ognlPath + "]");

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java?rev=922885&r1=922884&r2=922885&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java Sun Mar
14 16:14:18 2010
@@ -329,6 +329,12 @@ public class SimpleTest extends Language
 
         assertExpression("${in.body.getLines[1].getId}", 456);
         assertExpression("${in.body.getLines[1].getName}", "ActiveMQ in Action");
+
+        assertExpression("${in.body.getLines[last].getId}", 456);
+        assertExpression("${in.body.getLines[last].getName}", "ActiveMQ in Action");
+
+        assertExpression("${in.body.getLines[last-1].getId}", 123);
+        assertExpression("${in.body.getLines[last-1].getName}", "Camel in Action");
     }
 
     public void testBodyOGNLOrderListShorthand() throws Exception {
@@ -344,6 +350,12 @@ public class SimpleTest extends Language
 
         assertExpression("${in.body.lines[1].id}", 456);
         assertExpression("${in.body.lines[1].name}", "ActiveMQ in Action");
+
+        assertExpression("${in.body.lines[last].id}", 456);
+        assertExpression("${in.body.lines[last].name}", "ActiveMQ in Action");
+
+        assertExpression("${in.body.lines[last-1].id}", 123);
+        assertExpression("${in.body.lines[last-1].name}", "Camel in Action");
     }
 
     public void testBodyOGNLList() throws Exception {
@@ -415,9 +427,24 @@ public class SimpleTest extends Language
             fail("Should have thrown an exception");
         } catch (RuntimeBeanExpressionException e) {
             IndexOutOfBoundsException cause = assertIsInstanceOf(IndexOutOfBoundsException.class,
e.getCause());
-
             assertTrue(cause.getMessage().startsWith("Index: 3, Size: 2 out of bounds with
List from bean"));
         }
+
+        try {
+            assertExpression("${in.body.getLines[last-2].getId}", 123);
+            fail("Should have thrown an exception");
+        } catch (RuntimeBeanExpressionException e) {
+            IndexOutOfBoundsException cause = assertIsInstanceOf(IndexOutOfBoundsException.class,
e.getCause());
+            assertTrue(cause.getMessage().startsWith("Index: -1, Size: 2 out of bounds with
List from bean"));
+        }
+
+        try {
+            assertExpression("${in.body.getLines[last - XXX].getId}", 123);
+            fail("Should have thrown an exception");
+        } catch (RuntimeBeanExpressionException e) {
+            ExpressionIllegalSyntaxException cause = assertIsInstanceOf(ExpressionIllegalSyntaxException.class,
e.getCause());
+            assertEquals("last - XXX", cause.getExpression());
+        }
     }
 
     public void testBodyOGNLOrderListOutOfBoundsShorthand() throws Exception {
@@ -433,9 +460,24 @@ public class SimpleTest extends Language
             fail("Should have thrown an exception");
         } catch (RuntimeBeanExpressionException e) {
             IndexOutOfBoundsException cause = assertIsInstanceOf(IndexOutOfBoundsException.class,
e.getCause());
-
             assertTrue(cause.getMessage().startsWith("Index: 3, Size: 2 out of bounds with
List from bean"));
         }
+
+        try {
+            assertExpression("${in.body.lines[last - 2].id}", 123);
+            fail("Should have thrown an exception");
+        } catch (RuntimeBeanExpressionException e) {
+            IndexOutOfBoundsException cause = assertIsInstanceOf(IndexOutOfBoundsException.class,
e.getCause());
+            assertTrue(cause.getMessage().startsWith("Index: -1, Size: 2 out of bounds with
List from bean"));
+        }
+
+        try {
+            assertExpression("${in.body.lines[last - XXX].id}", 123);
+            fail("Should have thrown an exception");
+        } catch (RuntimeBeanExpressionException e) {
+            ExpressionIllegalSyntaxException cause = assertIsInstanceOf(ExpressionIllegalSyntaxException.class,
e.getCause());
+            assertEquals("last - XXX", cause.getExpression());
+        }
     }
 
     public void testBodyOGNLOrderListOutOfBoundsWithElvis() throws Exception {



Mime
View raw message