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 import info.magnolia.context.MgnlContext;
41 import info.magnolia.module.groovy.support.HierarchyManagerProvider;
42 import info.magnolia.module.groovy.support.classes.MgnlGroovyClassLoader;
43
44 import java.io.InputStream;
45 import java.io.InputStreamReader;
46 import java.io.UnsupportedEncodingException;
47 import java.io.Writer;
48
49 import org.apache.commons.lang.CharEncoding;
50 import org.codehaus.groovy.control.CompilationFailedException;
51 import org.codehaus.groovy.runtime.InvokerHelper;
52
53
54
55
56
57
58
59 public class MgnlGroovyConsole extends GroovyShell {
60
61 private static final MgnlGroovyClassLoader cl = new MgnlGroovyClassLoader(new HierarchyManagerProvider.SystemContextHierarchyManagerProvider());
62
63 public MgnlGroovyConsole(Binding binding) {
64 super(binding);
65 }
66
67 public Object evaluate(InputStream in, String fileName, Writer out) throws CompilationFailedException {
68 Script script = null;
69 try {
70 script = parse(new InputStreamReader(in, CharEncoding.UTF_8), fileName);
71 script.setProperty("out", out);
72 script.setProperty("err", out);
73 script.setProperty("ctx", MgnlContext.getInstance());
74 return script.run();
75 }
76 catch (UnsupportedEncodingException e) {
77 throw new RuntimeException(e);
78 }
79 finally {
80 if (script != null) {
81 InvokerHelper.removeClass(script.getClass());
82 }
83 }
84 }
85
86
87
88
89
90
91
92 @Override
93 public Script parse(final GroovyCodeSource codeSource) throws CompilationFailedException {
94 return InvokerHelper.createScript(parseClass(codeSource), getContext());
95 }
96
97 @Override
98 public String generateScriptName() {
99 return super.generateScriptName();
100 }
101
102
103
104
105 private Class parseClass(final GroovyCodeSource codeSource) throws CompilationFailedException {
106
107 return cl.parseClass(codeSource, false);
108 }
109 }