rgradisc@1158
|
1 |
/*
|
rgradisc@1158
|
2 |
* Created on Aug 13, 2003
|
rgradisc@1158
|
3 |
*/
|
rgradisc@1158
|
4 |
package isac.bridge;
|
rgradisc@1158
|
5 |
|
rgradisc@1158
|
6 |
/**
|
rgradisc@1158
|
7 |
* @author rgradisc
|
rgradisc@1158
|
8 |
*/
|
rgradisc@1158
|
9 |
|
rgradisc@1158
|
10 |
import java.io.IOException;
|
rgradisc@1158
|
11 |
import java.io.PrintWriter;
|
rgradisc@1158
|
12 |
import java.util.Vector;
|
rgradisc@1158
|
13 |
|
wneuper@1862
|
14 |
import org.apache.log4j.Logger;
|
wneuper@1862
|
15 |
|
rgradisc@1625
|
16 |
/**
|
mlang@2450
|
17 |
* This class runs in its own thread, fetches the output from the kernel, and
|
rgradisc@1625
|
18 |
* sends it back to the clients
|
mlang@2450
|
19 |
*
|
rgradisc@1625
|
20 |
* @author richard
|
rgradisc@1625
|
21 |
*/
|
rgradisc@1158
|
22 |
public class Kernel2ClientsServer implements Runnable {
|
rgradisc@1158
|
23 |
|
mlang@2450
|
24 |
//Start and end sequences to mark XML parts in SML output
|
mlang@2450
|
25 |
private static final String start_seq_ = "@@@@@begin@@@@@";
|
rgradisc@1158
|
26 |
|
mlang@2450
|
27 |
private static final String end_seq_ = "@@@@@end@@@@@";
|
mlang@2450
|
28 |
|
mlang@2450
|
29 |
private ClientList client_list_;
|
mlang@2450
|
30 |
|
mlang@2450
|
31 |
private BridgeMain bridge_;
|
mlang@2450
|
32 |
|
mlang@2450
|
33 |
private Vector time_out_times_;
|
mlang@2450
|
34 |
|
mlang@2544
|
35 |
static Logger logger_ = Logger.getLogger(Kernel2ClientsServer.class
|
mlang@2450
|
36 |
.getName());
|
mlang@2450
|
37 |
|
mlang@2450
|
38 |
//---------------------------------------------------------------
|
mlang@2450
|
39 |
public Kernel2ClientsServer(BridgeMain bridge) {
|
mlang@2544
|
40 |
logger_.warn("Kernel2ClientsServer: bridge_=" + bridge);
|
mlang@2450
|
41 |
//this.smlReader = bridge_.getSmlReader();
|
mlang@2450
|
42 |
this.client_list_ = bridge.getClientList();
|
mlang@2450
|
43 |
this.time_out_times_ = bridge.getTimeOutTimes();
|
mlang@2450
|
44 |
this.bridge_ = bridge;
|
mlang@2450
|
45 |
}
|
mlang@2450
|
46 |
|
mlang@2450
|
47 |
//---------------------------------------------------------------
|
mlang@2450
|
48 |
public void run() {
|
mlang@2450
|
49 |
String line;
|
mlang@2450
|
50 |
boolean startedXML = false;
|
mlang@2450
|
51 |
int indexStart;
|
mlang@2450
|
52 |
int indexEnd;
|
mlang@2450
|
53 |
int currID = 0;
|
mlang@2450
|
54 |
StringBuffer sb = new StringBuffer();
|
mlang@2450
|
55 |
while (true) {
|
mlang@2450
|
56 |
try {
|
mlang@2450
|
57 |
line = bridge_.getSmlReader().readLine();
|
mlang@2450
|
58 |
if (bridge_.ignore_output_ == 0) {
|
mlang@2450
|
59 |
bridge_.log(1, "[[from sml: " + line);
|
mlang@2450
|
60 |
}
|
mlang@2450
|
61 |
if (startedXML) {
|
mlang@2450
|
62 |
indexEnd = line.indexOf(end_seq_);
|
mlang@2450
|
63 |
if (indexEnd != -1) {
|
mlang@2450
|
64 |
sb.append(line.substring(0, indexEnd));
|
mlang@2450
|
65 |
if (time_out_times_.size() > 0) {
|
mlang@2450
|
66 |
time_out_times_.removeElementAt(0);
|
mlang@2450
|
67 |
}
|
mlang@2450
|
68 |
// remove first (oldest) element from time_out_times_
|
mlang@2450
|
69 |
|
mlang@2450
|
70 |
if (bridge_.ignore_output_ == 0) {
|
mlang@2450
|
71 |
// send XML-string (response of sml-kernel) to
|
mlang@2450
|
72 |
// client
|
mlang@2450
|
73 |
String s = new String(sb);
|
mlang@2450
|
74 |
//TODO: FIXXME: removes the id in response:
|
mlang@2450
|
75 |
s = s.substring(s.indexOf("<"));
|
mlang@2450
|
76 |
//TODO: FIXXME: only one client
|
mlang@2450
|
77 |
//currID = XMLParser.parseCalcID(s);
|
mlang@2450
|
78 |
//TODO fetch id from bridge_
|
mlang@2450
|
79 |
//so far: only one bridgeRMI
|
mlang@2450
|
80 |
currID = 1;
|
mlang@2450
|
81 |
bridge_.log(1, "found CalcID: " + currID);
|
mlang@2450
|
82 |
PrintWriter pw = client_list_
|
mlang@2450
|
83 |
.getPrintWriterOfClient(currID);
|
mlang@2450
|
84 |
if (pw != null) {
|
mlang@2450
|
85 |
pw.println(s);
|
mlang@2450
|
86 |
bridge_.log(1, ">> Response sent to user "
|
mlang@2450
|
87 |
+ pw.toString());
|
mlang@2450
|
88 |
}
|
mlang@2450
|
89 |
//bridge_.responseSent();
|
mlang@2450
|
90 |
} else {
|
mlang@2450
|
91 |
bridge_.ignore_output_--;
|
mlang@2450
|
92 |
bridge_.log(1,
|
mlang@2450
|
93 |
"ignored output (restore kernel state)");
|
mlang@2450
|
94 |
}
|
mlang@2450
|
95 |
startedXML = false;
|
mlang@2450
|
96 |
} else {
|
mlang@2450
|
97 |
sb.append(line);
|
mlang@2450
|
98 |
}
|
mlang@2450
|
99 |
} else {
|
mlang@2450
|
100 |
indexStart = line.indexOf(start_seq_);
|
mlang@2450
|
101 |
if (indexStart != -1) {
|
mlang@2450
|
102 |
sb = new StringBuffer();
|
mlang@2450
|
103 |
startedXML = true;
|
mlang@2450
|
104 |
}
|
mlang@2450
|
105 |
}
|
mlang@2450
|
106 |
} catch (IOException e) {
|
mlang@2450
|
107 |
//bridge_.log(1, "Read from sml-kernel failed, waiting for
|
mlang@2450
|
108 |
// kernel to restart");
|
mlang@2450
|
109 |
} catch (NullPointerException e) {
|
mlang@2450
|
110 |
bridge_.log(1, "Read from sml failed, waiting for restart...");
|
mlang@2450
|
111 |
} catch (IndexOutOfBoundsException e) {
|
mlang@2450
|
112 |
bridge_.log(1, "Kernel2Clients: Index out of bound");
|
mlang@2450
|
113 |
e.printStackTrace();
|
mlang@2450
|
114 |
} catch (NumberFormatException e) {
|
mlang@2450
|
115 |
bridge_.log(1, "Couldn't parse user ID: NumberformatException");
|
mlang@2450
|
116 |
}
|
rgradisc@1158
|
117 |
}
|
rgradisc@1158
|
118 |
}
|
mlang@2450
|
119 |
} |