View Javadoc

1   /*
2    * $Id: GroovyExpressionEvaluatorTestCase.java 19191 2010-08-25 21:05:23Z tcarlson $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          // try various map-style access in groovy for simpler syntax
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       * See: MULE-4797 GroovyExpressionEvaluator script is unable to load user classes
95       * when used with hot deployment See:
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 }