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.field;
35
36 import groovy.lang.Binding;
37
38 import info.magnolia.context.Context;
39 import info.magnolia.context.MgnlContext;
40 import info.magnolia.i18nsystem.SimpleTranslator;
41 import info.magnolia.module.groovy.console.MgnlGroovyConsole;
42 import info.magnolia.module.groovy.console.MgnlGroovyConsoleContext;
43
44 import java.io.ByteArrayInputStream;
45 import java.io.StringWriter;
46 import java.io.Writer;
47
48 import com.vaadin.data.Item;
49 import com.vaadin.data.Property;
50 import com.vaadin.ui.Alignment;
51 import com.vaadin.ui.Button;
52 import com.vaadin.ui.Button.ClickEvent;
53 import com.vaadin.ui.Component;
54 import com.vaadin.ui.CustomField;
55 import com.vaadin.ui.NativeButton;
56 import com.vaadin.ui.TextArea;
57 import com.vaadin.ui.VerticalLayout;
58
59
60
61
62 public class ConsoleOutputField extends CustomField<String> {
63
64 private final VerticalLayout rootLayout = new VerticalLayout();
65 private final TextArea outputArea = new TextArea();
66 private final Button runButton = new NativeButton();
67
68 private Item item;
69 private SimpleTranslator simpleTranslator;
70
71 public ConsoleOutputField(Item item, SimpleTranslator simpleTranslator) {
72 this.item = item;
73 this.simpleTranslator = simpleTranslator;
74 }
75
76 @Override
77 protected Component initContent() {
78 setImmediate(true);
79 rootLayout.setSizeFull();
80 rootLayout.setSpacing(true);
81
82 runButton.addStyleName("magnoliabutton");
83 runButton.setCaption(simpleTranslator.translate("groovy.script.consoleOutput.run"));
84 runButton.addClickListener(createButtonClickListener());
85
86 rootLayout.addComponent(runButton);
87 rootLayout.setExpandRatio(runButton, 0);
88 rootLayout.setComponentAlignment(runButton, Alignment.MIDDLE_LEFT);
89
90 outputArea.setImmediate(true);
91 outputArea.addStyleName("console-output");
92 outputArea.setWidth(100, Unit.PERCENTAGE);
93 outputArea.setNullRepresentation("");
94 outputArea.setNullSettingAllowed(true);
95
96 rootLayout.addComponent(outputArea);
97
98 return rootLayout;
99 }
100
101 @Override
102 public String getValue() {
103 return outputArea.getValue();
104 }
105
106 @Override
107 public Class<String> getType() {
108 return String.class;
109 }
110
111 @SuppressWarnings("unchecked")
112 private void runScript() {
113
114 Context originalCtx = MgnlContext.getInstance();
115 try {
116 outputArea.setValue(simpleTranslator.translate("groovy.script.consoleOutput.run.wait"));
117 runButton.setEnabled(false);
118
119 MgnlGroovyConsoleContext groovyCtx = new MgnlGroovyConsoleContext(originalCtx);
120 MgnlContext.setInstance(groovyCtx);
121 MgnlGroovyConsole console = new MgnlGroovyConsole(new Binding());
122 Property<String> scriptText = item.getItemProperty("text");
123
124 Writer writer = new StringWriter();
125
126 Object result = console.evaluate(new ByteArrayInputStream(scriptText.getValue().getBytes()), console.generateScriptName(), writer);
127
128 StringBuilder sb = new StringBuilder().append(writer.toString()).append("\n").append(result);
129
130 outputArea.setValue(sb.toString());
131 } catch (Exception e) {
132 outputArea.setValue(e.toString());
133 } finally {
134 MgnlContext.setInstance(originalCtx);
135 runButton.setEnabled(true);
136 }
137 };
138
139 private Button.ClickListener createButtonClickListener() {
140 return new Button.ClickListener() {
141 @Override
142 public void buttonClick(ClickEvent event) {
143 runScript();
144 }
145 };
146 }
147 }