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
35
36
37
38
39
40
41
42
43
44
45
46
47 package groovy.ui;
48 import groovy.lang.*;
49 import java.io.*;
50 import java.net.*;
51
52 /***
53 * Simple server that executes supplied script against a socket
54 * @author Jeremy Rayner
55 */
56
57 public class GroovySocketServer implements Runnable {
58 private URL url;
59 private GroovyShell groovy;
60 private boolean isScriptFile;
61 private String scriptFilenameOrText;
62 private boolean autoOutput;
63
64 public GroovySocketServer(GroovyShell groovy, boolean isScriptFile, String scriptFilenameOrText, boolean autoOutput, int port) {
65 this.groovy = groovy;
66 this.isScriptFile = isScriptFile;
67 this.scriptFilenameOrText = scriptFilenameOrText;
68 this.autoOutput = autoOutput;
69 try {
70 url = new URL("http", InetAddress.getLocalHost().getHostAddress(), port, "/");
71 System.out.println("groovy is listening on port " + port);
72 } catch (IOException e) {
73 e.printStackTrace();
74 }
75 new Thread(this).start();
76 }
77
78 public void run() {
79 try {
80 ServerSocket serverSocket = new ServerSocket(url.getPort());
81 while (true) {
82
83
84
85
86 Script script;
87 if (isScriptFile) {
88 GroovyMain gm = new GroovyMain();
89 script = groovy.parse(new FileInputStream(gm.huntForTheScriptFile(scriptFilenameOrText)));
90 } else {
91 script = groovy.parse(scriptFilenameOrText);
92 }
93 new GroovyClientConnection(script, autoOutput, serverSocket.accept());
94 }
95 } catch (Exception e) {
96 e.printStackTrace();
97 }
98 }
99
100 class GroovyClientConnection implements Runnable {
101 private Script script;
102 private Socket socket;
103 private BufferedReader reader;
104 private PrintWriter writer;
105 private boolean autoOutput;
106
107 GroovyClientConnection(Script script, boolean autoOutput,Socket socket) throws IOException {
108 this.script = script;
109 this.autoOutput = autoOutput;
110 this.socket = socket;
111 reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
112 writer = new PrintWriter(socket.getOutputStream());
113 new Thread(this, "Groovy client connection - " + socket.getInetAddress().getHostAddress()).start();
114 }
115 public void run() {
116 try {
117 String line = null;
118 script.setProperty("out", writer);
119 script.setProperty("socket", socket);
120 script.setProperty("init", Boolean.TRUE);
121 while ((line = reader.readLine()) != null) {
122
123 script.setProperty("line", line);
124 Object o = script.run();
125 script.setProperty("init", Boolean.FALSE);
126 if (o != null) {
127 if ("success".equals(o)) {
128 break;
129 } else {
130 if (autoOutput) {
131 writer.println(o);
132 }
133 }
134 }
135 writer.flush();
136 }
137 } catch (IOException e) {
138 e.printStackTrace();
139 } finally {
140 try {
141 writer.flush();
142 writer.close();
143 } finally {
144 try {
145 socket.close();
146 } catch (IOException e3) {
147 e3.printStackTrace();
148 }
149 }
150 }
151 }
152 }
153 }