1
2
3
4
5
6
7
8
9
10 package org.mule.module.scripting.expression;
11
12 import org.mule.DefaultMuleMessage;
13 import org.mule.api.MuleMessage;
14 import org.mule.tck.AbstractMuleTestCase;
15 import org.mule.tck.testmodels.fruit.Apple;
16 import org.mule.tck.testmodels.fruit.Banana;
17 import org.mule.tck.testmodels.fruit.FruitBowl;
18
19 import java.util.Arrays;
20
21 import groovyjarjarasm.asm.ClassWriter;
22 import groovyjarjarasm.asm.Opcodes;
23
24 public class GroovyExpressionEvaluatorTestCase extends AbstractMuleTestCase
25 {
26
27 public void testWithExpressions()
28 {
29 Apple apple = new Apple();
30 apple.wash();
31 Banana banana = new Banana();
32 banana.bite();
33 FruitBowl payload = new FruitBowl(apple, banana);
34 DefaultMuleMessage msg = new DefaultMuleMessage(payload, muleContext);
35 GroovyExpressionEvaluator e = new GroovyExpressionEvaluator();
36 e.setMuleContext(muleContext);
37 Object value = e.evaluate("payload.apple.washed", msg);
38 assertNotNull(value);
39 assertTrue(value instanceof Boolean);
40 assertTrue((Boolean) value);
41
42 value = e.evaluate("message.payload.banana.bitten", msg);
43 assertNotNull(value);
44 assertTrue(value instanceof Boolean);
45 assertTrue((Boolean) value);
46
47 value = e.evaluate("bar", msg);
48 assertNull(value);
49 }
50
51 public void testRegistrySyntax() throws Exception
52 {
53 Apple apple = new Apple();
54 muleContext.getRegistry().registerObject("name.with.dots", apple);
55 Object result = muleContext.getExpressionManager().evaluate(
56 "#[groovy:registry.lookupObject('name.with.dots')]", null);
57
58 assertNotNull(result);
59 assertSame(apple, result);
60
61
62 result = muleContext.getExpressionManager().evaluate(
63 "#[groovy:registry.'name.with.dots']", null);
64 assertNotNull(result);
65 assertSame(apple, result);
66
67 result = muleContext.getExpressionManager().evaluate(
68 "#[groovy:registry['name.with.dots']]", null);
69 assertNotNull(result);
70 assertSame(apple, result);
71
72 result = muleContext.getExpressionManager().evaluate(
73 "#[groovy:registry.'name.with.dots'.washed]", null);
74 assertNotNull(result);
75 assertEquals(false, result);
76 }
77
78 public void testComplexExpressionLowLevelParsing() throws Exception
79 {
80 final GroovyExpressionEvaluator evaluator = new GroovyExpressionEvaluator();
81 evaluator.setMuleContext(muleContext);
82 muleContext.getExpressionManager().registerEvaluator(evaluator);
83
84 MuleMessage msg = new DefaultMuleMessage(Arrays.asList(0, "test"), muleContext);
85 String result = muleContext.getExpressionManager().parse("#[groovy:payload[0]] - #[groovy:payload[1].toUpperCase()]",
86 msg);
87
88 assertNotNull(result);
89 assertEquals("Expressions didn't evaluate correctly",
90 "0 - TEST", result);
91 }
92
93
94
95
96
97 public void testUseContextClassLoaderToResolveClasses() throws ClassNotFoundException
98 {
99 ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
100 try
101 {
102 Thread.currentThread().setContextClassLoader(new MyClassClassLoader());
103 assertFalse((Boolean) muleContext.getExpressionManager().evaluate(
104 "groovy:payload instanceof MyClass", new DefaultMuleMessage("test", muleContext)));
105 }
106 catch (Exception e)
107 {
108 fail(e.getMessage());
109 }
110 finally
111 {
112 Thread.currentThread().setContextClassLoader(originalClassLoader);
113 }
114 }
115
116 class MyClassClassLoader extends ClassLoader
117 {
118 @Override
119 protected Class<?> findClass(String name) throws ClassNotFoundException
120 {
121 if (name.equals("MyClass"))
122 {
123 ClassWriter cw = new ClassWriter(true);
124 cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "MyClass", null, "java/lang/Object", null);
125 return defineClass(name, cw.toByteArray(), 0, cw.toByteArray().length);
126 }
127 else
128 {
129 return super.findClass(name);
130 }
131 }
132 }
133 }