1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.groovy.console;
35
36 import groovy.lang.Binding;
37 import groovy.lang.GroovyCodeSource;
38 import groovy.lang.GroovyShell;
39 import groovy.lang.Script;
40
41 import info.magnolia.context.MgnlContext;
42 import info.magnolia.module.groovy.support.HierarchyManagerProvider;
43 import info.magnolia.module.groovy.support.classes.MgnlGroovyClassLoader;
44
45 import java.io.InputStream;
46 import java.io.InputStreamReader;
47 import java.io.UnsupportedEncodingException;
48 import java.io.Writer;
49
50 import org.apache.commons.lang.CharEncoding;
51 import org.codehaus.groovy.control.CompilationFailedException;
52 import org.codehaus.groovy.runtime.InvokerHelper;
53
54
55
56
57 public class MgnlGroovyConsole extends GroovyShell {
58
59 private static final MgnlGroovyClassLoader cl = new MgnlGroovyClassLoader(new HierarchyManagerProvider.SystemContextHierarchyManagerProvider());
60
61 public MgnlGroovyConsole(Binding binding) {
62 super(binding);
63 }
64
65 public Object evaluate(InputStream in, String fileName, Writer out) throws CompilationFailedException {
66 Script script = null;
67 try {
68 script = parse(new InputStreamReader(in, CharEncoding.UTF_8), fileName);
69 script.setProperty("out", out);
70 script.setProperty("err", out);
71 script.setProperty("ctx", MgnlContext.getInstance());
72 return script.run();
73 } catch (UnsupportedEncodingException e) {
74 throw new RuntimeException(e);
75 } finally {
76 if (script != null) {
77 InvokerHelper.removeClass(script.getClass());
78 }
79 }
80 }
81
82
83
84
85
86
87
88
89 @Override
90 public Script parse(final GroovyCodeSource codeSource) throws CompilationFailedException {
91 return InvokerHelper.createScript(parseClass(codeSource), getContext());
92 }
93
94 @Override
95 public String generateScriptName() {
96 return super.generateScriptName();
97 }
98
99
100
101
102 private Class parseClass(final GroovyCodeSource codeSource) throws CompilationFailedException {
103
104 return cl.parseClass(codeSource, false);
105 }
106 }