1 |
mojays |
2 |
package appl.parallel.starter.server; |
2 |
|
|
|
3 |
|
|
import java.awt.AWTException; |
4 |
|
|
import java.awt.Image; |
5 |
|
|
import java.awt.MenuItem; |
6 |
|
|
import java.awt.PopupMenu; |
7 |
|
|
import java.awt.SystemTray; |
8 |
|
|
import java.awt.Toolkit; |
9 |
|
|
import java.awt.TrayIcon; |
10 |
|
|
import java.awt.event.ActionEvent; |
11 |
|
|
import java.awt.event.ActionListener; |
12 |
|
|
import java.awt.event.MouseAdapter; |
13 |
|
|
import java.awt.event.MouseEvent; |
14 |
|
|
import java.io.BufferedReader; |
15 |
|
|
import java.io.IOException; |
16 |
|
|
import java.io.InputStream; |
17 |
|
|
import java.io.InputStreamReader; |
18 |
|
|
import java.io.SequenceInputStream; |
19 |
|
|
import java.rmi.AccessException; |
20 |
|
|
import java.rmi.Naming; |
21 |
|
|
import java.rmi.NotBoundException; |
22 |
|
|
import java.rmi.Remote; |
23 |
|
|
import java.rmi.RemoteException; |
24 |
|
|
import java.rmi.registry.LocateRegistry; |
25 |
|
|
import java.rmi.registry.Registry; |
26 |
|
|
import java.rmi.server.UnicastRemoteObject; |
27 |
|
|
|
28 |
|
|
import javax.swing.JOptionPane; |
29 |
|
|
|
30 |
|
|
import appl.ext.XuluConfig; |
31 |
|
|
import appl.parallel.ComputingResource; |
32 |
|
|
import appl.parallel.server.XuluServer; |
33 |
|
|
import appl.parallel.starter.Starter; |
34 |
|
|
import appl.parallel.util.Helper; |
35 |
mojays |
114 |
import de.schmitzm.swing.TextAreaPrintStream; |
36 |
mojays |
2 |
|
37 |
|
|
/** |
38 |
|
|
* A running instance of the XuluServerStarter waits for a signal to start a |
39 |
|
|
* {@link XuluServer}. When {@link #start()} is called the Server is started. |
40 |
|
|
* All output from the new Serverprocess are forwarded to the actual screen (if |
41 |
|
|
* any). The Server can also be {@link #restart() restarted} or |
42 |
|
|
* {@link #stop() stopped}. <br> |
43 |
|
|
* <br> |
44 |
|
|
* For configuration of the XuluServer the {@link XuluConfig} is used. The |
45 |
|
|
* following configuration entries are supported <TABLE border="1" |
46 |
|
|
* <tr> |
47 |
|
|
* <th>Entry</th> |
48 |
|
|
* <th>Default</th> |
49 |
|
|
* <th>Description</th> |
50 |
|
|
* </tr> |
51 |
|
|
* <tr> |
52 |
|
|
* <td>XuluServerStarter.port</td> |
53 |
|
|
* <td>1099</td> |
54 |
|
|
* <td> The port which is used for the registry creation (if none is running)</td> |
55 |
|
|
* </tr> |
56 |
|
|
* <tr> |
57 |
|
|
* <td>XuluServerStarter.javaprogram</td> |
58 |
|
|
* <td>java</td> |
59 |
|
|
* <td> The path to the java program</td> |
60 |
|
|
* </tr> |
61 |
|
|
* <tr> |
62 |
|
|
* <td>XuluServerStarter.codebasedir</td> |
63 |
|
|
* <td></td> |
64 |
|
|
* <td> The absolute path to the codebase directory (should be the path to the |
65 |
|
|
* binaries)</td> |
66 |
|
|
* </tr> |
67 |
|
|
* <tr> |
68 |
|
|
* <td>XuluServerStarter.securitypolicy</td> |
69 |
|
|
* <td></td> |
70 |
|
|
* <td> The path to the security policy</td> |
71 |
|
|
* </tr> |
72 |
|
|
* <tr> |
73 |
|
|
* <td>XuluServerStarter.furtherjavaarguments</td> |
74 |
|
|
* <td></td> |
75 |
|
|
* <td> further JVM arguments</td> |
76 |
|
|
* </tr> |
77 |
|
|
* <tr> |
78 |
|
|
* <td>XuluServerStarter.classpath</td> |
79 |
|
|
* <td></td> |
80 |
|
|
* <td> The libaries needed</td> |
81 |
|
|
* </tr> |
82 |
|
|
* <tr> |
83 |
|
|
* <td>XuluServerStarter.memorymax</td> |
84 |
|
|
* <td>64</td> |
85 |
|
|
* <td> The maximum memory the XuluSever attempts to use (-xmx)</td> |
86 |
|
|
* </tr> |
87 |
|
|
* <tr> |
88 |
|
|
* <td>XuluServerStarter.memorymin</td> |
89 |
|
|
* <td>4</td> |
90 |
|
|
* <td> The inital memory the XuluServer uses (-xms)</td> |
91 |
|
|
* </tr> |
92 |
|
|
* </TABLE> |
93 |
|
|
* |
94 |
|
|
* @author Dominik Appl |
95 |
|
|
*/ |
96 |
|
|
public class XuluServerStarter extends UnicastRemoteObject implements Starter, |
97 |
|
|
ActionListener { |
98 |
|
|
|
99 |
|
|
private enum Status { |
100 |
|
|
/** server is not started */ |
101 |
|
|
serverOff, |
102 |
|
|
/** * Server is started */ |
103 |
|
|
serverStarted, |
104 |
|
|
/** A client is connected */ |
105 |
|
|
serverActive |
106 |
|
|
} |
107 |
|
|
|
108 |
|
|
private String bindingName = "XuluServerStarter"; |
109 |
|
|
|
110 |
|
|
private int port = 1099; |
111 |
|
|
|
112 |
|
|
private String javaprogram = "java"; |
113 |
|
|
|
114 |
|
|
private String codebase = ""; |
115 |
|
|
|
116 |
|
|
private String securitypolicy = ""; |
117 |
|
|
|
118 |
|
|
private String furtherjavaarguments = ""; |
119 |
|
|
|
120 |
|
|
private String xuluserverarguments = ""; |
121 |
|
|
|
122 |
|
|
private String classpath = ""; |
123 |
|
|
|
124 |
|
|
private String XuluServerString = "appl.parallel.server.XuluServer"; |
125 |
|
|
|
126 |
|
|
private Process p; |
127 |
|
|
|
128 |
|
|
// private BufferedReader input; |
129 |
|
|
|
130 |
|
|
private SimpleConsoleOutputThread thread; |
131 |
|
|
|
132 |
|
|
private int xms = 64; |
133 |
|
|
|
134 |
|
|
private int xmx = 128; |
135 |
|
|
|
136 |
|
|
private SequenceInputStream twoStreams; |
137 |
|
|
|
138 |
|
|
private XuluStarterServerGUI starterServerGUI; |
139 |
|
|
|
140 |
|
|
private TextAreaPrintStream textAreaOutput; |
141 |
|
|
|
142 |
|
|
private MenuItem menu_exit; |
143 |
|
|
|
144 |
|
|
private MenuItem menu_start; |
145 |
|
|
|
146 |
|
|
private MenuItem menu_stop; |
147 |
|
|
|
148 |
|
|
private MenuItem menu_showConsole; |
149 |
|
|
|
150 |
|
|
private TrayIcon trayIcon; |
151 |
|
|
|
152 |
|
|
private ComputingResource xuluServer; |
153 |
|
|
|
154 |
|
|
private Image redIcon; |
155 |
|
|
|
156 |
|
|
private Image greenIcon; |
157 |
|
|
|
158 |
|
|
private Image yellowIcon; |
159 |
|
|
|
160 |
|
|
private String cmd; |
161 |
|
|
|
162 |
|
|
/** |
163 |
|
|
* @param cmd |
164 |
|
|
* the command to be executed by the starter. If null, the |
165 |
|
|
* XuluConfig is used to create the commandline |
166 |
|
|
* @param showGUI |
167 |
|
|
* if false, no GUI/Tray is shown |
168 |
|
|
* @throws RemoteException |
169 |
|
|
*/ |
170 |
|
|
private XuluServerStarter(String cmd, boolean showGUI) |
171 |
|
|
throws RemoteException { |
172 |
|
|
super(); |
173 |
|
|
this.cmd = cmd; |
174 |
|
|
this.bind(bindingName, this, port); |
175 |
|
|
if (showGUI) { |
176 |
|
|
redIcon = Toolkit.getDefaultToolkit().getImage( |
177 |
|
|
"resource/xulu_icon_red.gif"); |
178 |
|
|
greenIcon = Toolkit.getDefaultToolkit().getImage( |
179 |
|
|
"resource/xulu_icon_green.gif"); |
180 |
|
|
yellowIcon = Toolkit.getDefaultToolkit().getImage( |
181 |
|
|
"resource/xulu_icon_yellow.gif"); |
182 |
|
|
createGUI(); |
183 |
|
|
createTray(); |
184 |
|
|
setStatus(Status.serverOff); |
185 |
|
|
} |
186 |
|
|
} |
187 |
|
|
|
188 |
|
|
/** |
189 |
|
|
* Should be called if the status has changed (changes tray icon) |
190 |
|
|
* |
191 |
|
|
* @param newStatus |
192 |
|
|
* the new status |
193 |
|
|
*/ |
194 |
|
|
private void setStatus(Status newStatus) { |
195 |
|
|
// if tray disabled: return |
196 |
|
|
if (trayIcon == null) |
197 |
|
|
return; |
198 |
|
|
switch (newStatus) { |
199 |
|
|
case serverOff: |
200 |
|
|
trayIcon.setImage(redIcon); |
201 |
|
|
trayIcon.setToolTip("XuluServer is disabled"); |
202 |
|
|
break; |
203 |
|
|
case serverStarted: |
204 |
|
|
trayIcon.setImage(greenIcon); |
205 |
|
|
trayIcon.setToolTip("Xulu Server is ready and waiting for tasks"); |
206 |
|
|
break; |
207 |
|
|
case serverActive: |
208 |
|
|
trayIcon.setImage(yellowIcon); |
209 |
|
|
trayIcon.setToolTip("A client is connected to the XuluServer"); |
210 |
|
|
break; |
211 |
|
|
} |
212 |
|
|
} |
213 |
|
|
|
214 |
|
|
/** |
215 |
|
|
* creates and inits the tray icon. |
216 |
|
|
*/ |
217 |
|
|
private void createTray() { |
218 |
|
|
|
219 |
|
|
if (SystemTray.isSupported()) { |
220 |
|
|
|
221 |
|
|
SystemTray tray = SystemTray.getSystemTray(); |
222 |
|
|
Image image = Toolkit.getDefaultToolkit().getImage( |
223 |
|
|
"temp/xulu_icon.gif"); |
224 |
|
|
|
225 |
|
|
// create menu entries |
226 |
|
|
PopupMenu popup = new PopupMenu(); |
227 |
|
|
menu_exit = new MenuItem("Exit"); |
228 |
|
|
menu_start = new MenuItem("Start Server"); |
229 |
|
|
menu_stop = new MenuItem("Stop Server"); |
230 |
|
|
menu_showConsole = new MenuItem("Show contol window"); |
231 |
|
|
menu_exit.addActionListener(this); |
232 |
|
|
menu_start.addActionListener(this); |
233 |
|
|
menu_stop.addActionListener(this); |
234 |
|
|
menu_showConsole.addActionListener(this); |
235 |
|
|
|
236 |
|
|
popup.add(menu_start); |
237 |
|
|
popup.add(menu_stop); |
238 |
|
|
popup.add(menu_showConsole); |
239 |
|
|
popup.add(menu_exit); |
240 |
|
|
trayIcon = new TrayIcon(image, "Xulu Server", popup); |
241 |
|
|
trayIcon.setImageAutoSize(true); |
242 |
|
|
trayIcon.addMouseListener(new MouseAdapter() { |
243 |
|
|
// on doubleclick popup the control-window |
244 |
|
|
public void mouseClicked(MouseEvent e) { |
245 |
|
|
if (e.getClickCount() > 1) { |
246 |
|
|
starterServerGUI.setVisible(!starterServerGUI |
247 |
|
|
.isVisible()); |
248 |
|
|
} |
249 |
|
|
} |
250 |
|
|
}); |
251 |
|
|
|
252 |
|
|
try { |
253 |
|
|
tray.add(trayIcon); |
254 |
|
|
} catch (AWTException e) { |
255 |
|
|
System.err.println("TrayIcon could not be added."); |
256 |
|
|
tray = null; |
257 |
|
|
} |
258 |
|
|
|
259 |
|
|
} else { |
260 |
|
|
// System Tray is not supported |
261 |
|
|
System.out.println("System Tray not supported"); |
262 |
|
|
trayIcon = null; |
263 |
|
|
} |
264 |
|
|
|
265 |
|
|
} |
266 |
|
|
|
267 |
|
|
/** |
268 |
|
|
* creates the GUI for the Starter |
269 |
|
|
*/ |
270 |
|
|
private void createGUI() { |
271 |
|
|
// create new GUI |
272 |
|
|
starterServerGUI = new XuluStarterServerGUI(); |
273 |
|
|
// register this instance as button listener |
274 |
|
|
starterServerGUI.button_exit.addActionListener(this); |
275 |
|
|
starterServerGUI.button_start.addActionListener(this); |
276 |
|
|
starterServerGUI.button_stop.addActionListener(this); |
277 |
|
|
|
278 |
|
|
// register TextArea as OutputStream |
279 |
|
|
textAreaOutput = new TextAreaPrintStream(starterServerGUI.consoleArea); |
280 |
|
|
System.setErr(textAreaOutput); |
281 |
|
|
System.setOut(textAreaOutput); |
282 |
|
|
|
283 |
|
|
} |
284 |
|
|
|
285 |
|
|
/** |
286 |
|
|
* reads the configuration out of the {@link XuluConfig} |
287 |
|
|
*/ |
288 |
|
|
private void loadConfig() { |
289 |
|
|
XuluConfig config = XuluConfig.getXuluConfig(); |
290 |
|
|
if (config.getIntProperty("XuluServerStarter.port") != 0) |
291 |
|
|
port = config.getIntProperty("XuluServerStarter.port"); |
292 |
|
|
if (config.getProperty("XuluServerStarter.javaprogram") != null) |
293 |
|
|
javaprogram = config.getProperty("XuluServerStarter.javaprogram"); |
294 |
|
|
if (config.getProperty("XuluServerStarter.codebasedir") != null) |
295 |
|
|
codebase = config.getProperty("XuluServerStarter.codebasedir"); |
296 |
|
|
if (config.getProperty("XuluServerStarter.securitypolicy") != null) |
297 |
|
|
securitypolicy = config |
298 |
|
|
.getProperty("XuluServerStarter.securitypolicy"); |
299 |
|
|
if (config.getProperty("XuluServerStarter.furtherjavaarguments") != null) |
300 |
|
|
furtherjavaarguments = config |
301 |
|
|
.getProperty("XuluServerStarter.furtherjavaarguments"); |
302 |
|
|
if (config.getProperty("XuluServerStarter.classpath") != null) |
303 |
|
|
classpath = config.getProperty("XuluServerStarter.classpath"); |
304 |
|
|
if (config.getProperty("XuluServerStarter.memorymax") != null) |
305 |
|
|
xmx = config.getIntProperty("XuluServerStarter.memorymax"); |
306 |
|
|
if (config.getProperty("XuluServerStarter.memorymin") != null) |
307 |
|
|
xms = config.getIntProperty("XuluServerStarter.memorymin"); |
308 |
|
|
} |
309 |
|
|
|
310 |
|
|
/* |
311 |
|
|
* (non-Javadoc) |
312 |
|
|
* |
313 |
|
|
* @see appl.parallel.starter.Starter#restart() |
314 |
|
|
*/ |
315 |
|
|
public void restart() throws RemoteException { |
316 |
|
|
this.stop(); |
317 |
|
|
this.start(); |
318 |
|
|
} |
319 |
|
|
|
320 |
|
|
/** |
321 |
|
|
* Creates the Java commandline and starts the {@link XuluServer} |
322 |
|
|
* |
323 |
|
|
* @see appl.parallel.starter.Starter#start() |
324 |
|
|
*/ |
325 |
|
|
public void start() throws RemoteException { |
326 |
|
|
loadConfig(); |
327 |
|
|
try { |
328 |
|
|
if (p != null) { |
329 |
|
|
System.out |
330 |
|
|
.println("Process is already running. Stop process first"); |
331 |
|
|
return; |
332 |
|
|
} |
333 |
|
|
String commandline = "\"" + javaprogram + "\"" + " -cp \"" |
334 |
|
|
+ codebase; |
335 |
|
|
if (!(classpath.equals(""))) |
336 |
|
|
commandline += (";" + classpath); |
337 |
|
|
commandline += "\" "; |
338 |
|
|
if (xms != 0) |
339 |
|
|
commandline += (" -Xms" + xms + "M "); |
340 |
|
|
if (xmx != 0) |
341 |
|
|
commandline += (" -Xmx" + xmx + "M "); |
342 |
|
|
|
343 |
|
|
commandline += (" -Djava.rmi.server.codebase=file:///" + codebase |
344 |
|
|
+ " -Djava.security.policy=" + securitypolicy + " " |
345 |
|
|
+ furtherjavaarguments + " " + XuluServerString + " " + xuluserverarguments); |
346 |
|
|
// if there is a user commandline, use this instead |
347 |
|
|
if (cmd != null) |
348 |
|
|
commandline = cmd; |
349 |
|
|
System.out.println("Executing commandline: " + commandline); |
350 |
|
|
p = Runtime.getRuntime().exec(commandline); |
351 |
|
|
xuluServer = null; |
352 |
|
|
// forward the inputstream of the new process to the |
353 |
|
|
// console/textarea |
354 |
|
|
InputStream standardInput = p.getInputStream(); |
355 |
|
|
InputStream errorInput = p.getErrorStream(); |
356 |
|
|
thread = new SimpleConsoleOutputThread(standardInput, errorInput); |
357 |
|
|
thread.startThread(); |
358 |
|
|
// wait until the server is bound to the registry |
359 |
|
|
Thread.sleep(5000); |
360 |
|
|
// lookup the new Server |
361 |
|
|
xuluServer = (ComputingResource) Naming |
362 |
|
|
.lookup("rmi://localhost/XuluServer"); |
363 |
|
|
setStatus(Status.serverStarted); |
364 |
|
|
System.out |
365 |
|
|
.println("The Starter has successfully discovered the XuluServer instance"); |
366 |
|
|
|
367 |
|
|
} catch (IOException e) { |
368 |
|
|
// TODO Auto-generated catch block |
369 |
|
|
e.printStackTrace(); |
370 |
|
|
} catch (NotBoundException e) { |
371 |
|
|
System.out |
372 |
|
|
.println("Could not find the Xulu server instance(NotBoundException).\n Creation of the XuluServer failed..please correct the commandline..."); |
373 |
|
|
|
374 |
|
|
} catch (InterruptedException e) { |
375 |
|
|
// TODO Auto-generated catch block |
376 |
|
|
e.printStackTrace(); |
377 |
|
|
} |
378 |
|
|
} |
379 |
|
|
|
380 |
|
|
/* |
381 |
|
|
* (non-Javadoc) |
382 |
|
|
* |
383 |
|
|
* @see appl.parallel.starter.Starter#stop() |
384 |
|
|
*/ |
385 |
|
|
public void stop() throws RemoteException { |
386 |
|
|
try { |
387 |
|
|
if (twoStreams != null) |
388 |
|
|
twoStreams.close(); |
389 |
|
|
if (thread != null) |
390 |
|
|
thread.stopThread(); |
391 |
|
|
// if (input != null) |
392 |
|
|
// input.close(); |
393 |
|
|
if (p != null) |
394 |
|
|
p.destroy(); |
395 |
|
|
p = null; |
396 |
|
|
System.out.println("Process stopped"); |
397 |
|
|
this.setStatus(Status.serverOff); |
398 |
|
|
} catch (IOException e) { |
399 |
|
|
e.printStackTrace(); |
400 |
|
|
} |
401 |
|
|
} |
402 |
|
|
|
403 |
|
|
/** |
404 |
|
|
* Starts the XuluServerStarter <br/> The parameter -start can be used to |
405 |
|
|
* start the Server at launch of the Starter. <br> |
406 |
|
|
* The parameter -cmd <command> will use the given command to try to start |
407 |
|
|
* the server. Else the XuluConfig will be used. <br> |
408 |
|
|
* The parameter -noGUI forces the starter to not use any GUI functionality. |
409 |
|
|
*/ |
410 |
|
|
public static void main(String[] args) { |
411 |
|
|
try { |
412 |
|
|
System.out |
413 |
|
|
.println("Use the parameter -help to see all available commandline options"); |
414 |
|
|
String cmd = null; |
415 |
|
|
boolean noGUI = false; |
416 |
|
|
boolean start = false; |
417 |
|
|
// search for command parameter |
418 |
|
|
for (int i = 0; i < args.length; i++) { |
419 |
|
|
if (args[i].toLowerCase().equals("-cmd") && i < args.length) |
420 |
|
|
cmd = args[i + 1]; |
421 |
|
|
if (args[i].toLowerCase().equals("-nogui") && i < args.length) |
422 |
|
|
noGUI = true; |
423 |
|
|
if (args[i].toLowerCase().equals("-start")) |
424 |
|
|
start = true; |
425 |
|
|
if (args[i].toLowerCase().equals("-help")) |
426 |
|
|
printHelp(); |
427 |
|
|
} |
428 |
|
|
XuluServerStarter starter = new XuluServerStarter(cmd, !noGUI); |
429 |
|
|
System.out.println("XuluServerStarter initialized .... "); |
430 |
|
|
if (start) { |
431 |
|
|
starter.start(); |
432 |
|
|
} |
433 |
|
|
if (!starter.isRunning()) { |
434 |
|
|
System.out |
435 |
|
|
.println("Hint: use parameter '-start' to start the server directly"); |
436 |
|
|
} |
437 |
|
|
} catch (RemoteException e) { |
438 |
|
|
// TODO Auto-generated catch block |
439 |
|
|
e.printStackTrace(); |
440 |
|
|
} |
441 |
|
|
} |
442 |
|
|
|
443 |
|
|
/** |
444 |
|
|
* |
445 |
|
|
*/ |
446 |
|
|
private static void printHelp() { |
447 |
|
|
System.out |
448 |
|
|
.println("The following commands can be used: \n\n" |
449 |
|
|
+ "-start can be used to start the Server at launch of the Starter.\n" |
450 |
|
|
+ "-cmd <command> will use the given command to try to start the server." |
451 |
|
|
+ " Else the XuluConfig will be used.\n" |
452 |
|
|
+ "-noGUI doesn't use any GUI functionality.\n" |
453 |
|
|
+ "-help displays this help"); |
454 |
|
|
|
455 |
|
|
} |
456 |
|
|
|
457 |
|
|
public boolean isRunning() throws RemoteException { |
458 |
|
|
return (p != null); |
459 |
|
|
|
460 |
|
|
} |
461 |
|
|
|
462 |
|
|
/** |
463 |
|
|
* Copied from {@link Helper} and modified so that it does not depend on |
464 |
|
|
* log4j. Binds the remote object's stub in the registry. Creates a registry |
465 |
|
|
* if no running registry is found. |
466 |
|
|
* |
467 |
|
|
* @param bindingName |
468 |
|
|
* the name to be used for binding |
469 |
|
|
* @param bindingInstance |
470 |
|
|
* an instance of the type to bind to the registry |
471 |
|
|
* @param defaultPort |
472 |
|
|
* the default registry port |
473 |
|
|
* @throws RemoteException |
474 |
|
|
* if something goes wrong |
475 |
|
|
*/ |
476 |
|
|
public void bind(String bindingName, Remote bindingInstance, int defaultPort) |
477 |
|
|
throws RemoteException { |
478 |
|
|
boolean failed = true; |
479 |
|
|
Registry registry; |
480 |
|
|
try { |
481 |
|
|
registry = LocateRegistry.getRegistry(); |
482 |
|
|
registry.rebind(bindingName, bindingInstance); |
483 |
|
|
failed = false; |
484 |
|
|
} catch (AccessException e) { |
485 |
|
|
System.err.println("Not enough permissions to bind" + bindingName |
486 |
|
|
+ "to the registry! Adjust your security permission file!"); |
487 |
|
|
e.printStackTrace(); |
488 |
|
|
} catch (RemoteException e) { |
489 |
|
|
if (e instanceof java.rmi.ConnectException) { |
490 |
|
|
System.out |
491 |
|
|
.println("Could not connect to registry! Trying to create new one..."); |
492 |
|
|
try { |
493 |
|
|
registry = LocateRegistry.createRegistry(defaultPort); |
494 |
|
|
registry.rebind(bindingName, bindingInstance); |
495 |
|
|
System.out.println("Registry successfully created at port " |
496 |
|
|
+ defaultPort); |
497 |
|
|
failed = false; |
498 |
|
|
} catch (RemoteException e1) { |
499 |
|
|
// TODO Auto-generated catch block |
500 |
|
|
e1.printStackTrace(); |
501 |
|
|
} |
502 |
|
|
} else |
503 |
|
|
e.printStackTrace(); |
504 |
|
|
} |
505 |
|
|
if (failed) |
506 |
|
|
throw new RemoteException("Could not find or create registry!"); |
507 |
|
|
} |
508 |
|
|
|
509 |
|
|
/** |
510 |
|
|
* The Thread is used to direct the output of the process to System.out. |
511 |
|
|
* Notice that this stream may be redirected to a |
512 |
|
|
* {@link TextAreaPrintStream} or any other printstream using |
513 |
|
|
* {@link System#setOut(java.io.PrintStream)} |
514 |
|
|
* |
515 |
|
|
* @author appl |
516 |
|
|
*/ |
517 |
|
|
class SimpleConsoleOutputThread implements Runnable { |
518 |
|
|
private volatile Thread outputThread; |
519 |
|
|
|
520 |
|
|
private boolean exit; |
521 |
|
|
|
522 |
|
|
private final InputStream standardInput; |
523 |
|
|
|
524 |
|
|
private final InputStream errorInput; |
525 |
|
|
|
526 |
|
|
private final BufferedReader input; |
527 |
|
|
|
528 |
|
|
private final SequenceInputStream twoStreams; |
529 |
|
|
|
530 |
|
|
private boolean availableLastTime = false; |
531 |
|
|
|
532 |
|
|
/** |
533 |
|
|
* Creates a new thread. The parmeters are the inputstreams which should |
534 |
|
|
* be forwarded to System.out |
535 |
|
|
* |
536 |
|
|
* @param standardInput |
537 |
|
|
* @param errorInput |
538 |
|
|
*/ |
539 |
|
|
public SimpleConsoleOutputThread(InputStream standardInput, |
540 |
|
|
InputStream errorInput) { |
541 |
|
|
this.standardInput = standardInput; |
542 |
|
|
this.errorInput = errorInput; |
543 |
|
|
// combine the streams |
544 |
|
|
twoStreams = new SequenceInputStream(standardInput, errorInput); |
545 |
|
|
input = new BufferedReader(new InputStreamReader(twoStreams)); |
546 |
|
|
} |
547 |
|
|
|
548 |
|
|
public void startThread() { |
549 |
|
|
exit = false; |
550 |
|
|
if (outputThread == null) |
551 |
|
|
outputThread = new Thread(this); |
552 |
|
|
outputThread.start(); |
553 |
|
|
} |
554 |
|
|
|
555 |
|
|
public void stopThread() { |
556 |
|
|
exit = true; |
557 |
|
|
outputThread.interrupt(); |
558 |
|
|
try { |
559 |
|
|
input.close(); |
560 |
|
|
} catch (IOException e) { |
561 |
|
|
System.out.println("Input closed"); |
562 |
|
|
e.printStackTrace(); |
563 |
|
|
} |
564 |
|
|
} |
565 |
|
|
|
566 |
|
|
public void run() { |
567 |
|
|
String line; |
568 |
|
|
while (exit == false) { |
569 |
|
|
try { |
570 |
|
|
while (input.ready()) { |
571 |
|
|
line = input.readLine(); |
572 |
|
|
System.out.println(line); |
573 |
|
|
} |
574 |
|
|
Thread.sleep(1000); |
575 |
|
|
// check if server is active for tray icon change |
576 |
|
|
if (xuluServer != null) |
577 |
|
|
if (availableLastTime != xuluServer.isAvailable()) { |
578 |
|
|
if (availableLastTime) |
579 |
|
|
setStatus(Status.serverActive); |
580 |
|
|
else |
581 |
|
|
setStatus(Status.serverStarted); |
582 |
|
|
availableLastTime = (!availableLastTime); |
583 |
|
|
} |
584 |
|
|
|
585 |
|
|
} catch (IOException e) { |
586 |
|
|
System.out |
587 |
|
|
.println("Connection to server failed. Input closed"); |
588 |
|
|
e.printStackTrace(); |
589 |
|
|
exit = true; |
590 |
|
|
} catch (InterruptedException e) { |
591 |
|
|
if (exit == true) |
592 |
|
|
System.out.println("Stopped output thread..."); |
593 |
|
|
} |
594 |
|
|
} |
595 |
|
|
} |
596 |
|
|
} |
597 |
|
|
|
598 |
|
|
/* |
599 |
|
|
* (non-Javadoc) |
600 |
|
|
* |
601 |
|
|
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) |
602 |
|
|
*/ |
603 |
|
|
public void actionPerformed(ActionEvent e) { |
604 |
|
|
if (e.getSource() == starterServerGUI.button_stop |
605 |
|
|
|| e.getSource() == menu_stop) { |
606 |
|
|
try { |
607 |
|
|
this.stop(); |
608 |
|
|
} catch (Exception e1) { |
609 |
|
|
System.out |
610 |
|
|
.println("Could not stop the Server. Reason follows: "); |
611 |
|
|
e1.printStackTrace(); |
612 |
|
|
} |
613 |
|
|
} else if (e.getSource() == starterServerGUI.button_exit |
614 |
|
|
|| e.getSource() == menu_exit) { |
615 |
|
|
// if user does not confirm: return. |
616 |
|
|
if (JOptionPane |
617 |
|
|
.showConfirmDialog( |
618 |
|
|
starterServerGUI, |
619 |
|
|
"Are you sure that you want to exit the Starter-Application?", |
620 |
|
|
"Confirm exit", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION) |
621 |
|
|
return; |
622 |
|
|
try { |
623 |
|
|
this.stop(); |
624 |
|
|
} catch (RemoteException e1) { |
625 |
|
|
} |
626 |
|
|
System.exit(1); |
627 |
|
|
|
628 |
|
|
} else if (e.getSource() == starterServerGUI.button_start |
629 |
|
|
|| e.getSource() == menu_start) { |
630 |
|
|
try { |
631 |
|
|
this.start(); |
632 |
|
|
} catch (Exception e1) { |
633 |
|
|
System.out |
634 |
|
|
.println("Could not start the Server. Reason follows: "); |
635 |
|
|
e1.printStackTrace(); |
636 |
|
|
} |
637 |
|
|
} else if (e.getSource() == menu_showConsole) { |
638 |
|
|
starterServerGUI.setVisible(true); |
639 |
|
|
} |
640 |
|
|
|
641 |
|
|
} |
642 |
|
|
} |