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