2 * Created on Aug 13, 2003
10 import java.io.IOException;
11 import java.io.PrintWriter;
12 import java.util.Vector;
14 import org.apache.log4j.Logger;
17 * This class runs in its own thread, fetches the output from the kernel, and
18 * sends it back to the clients
22 public class Kernel2ClientsServer implements Runnable {
24 //Start and end sequences to mark XML parts in SML output
25 private static final String start_seq_ = "@@@@@begin@@@@@";
27 private static final String end_seq_ = "@@@@@end@@@@@";
29 private ClientList client_list_;
31 private BridgeMain bridge_;
33 private Vector time_out_times_;
35 static Logger logger_ = Logger.getLogger(Kernel2ClientsServer.class
38 //---------------------------------------------------------------
39 public Kernel2ClientsServer(BridgeMain bridge) {
40 logger_.warn("Kernel2ClientsServer: bridge_=" + bridge);
41 //this.smlReader = bridge_.getSmlReader();
42 this.client_list_ = bridge.getClientList();
43 this.time_out_times_ = bridge.getTimeOutTimes();
44 this.bridge_ = bridge;
47 //---------------------------------------------------------------
50 boolean startedXML = false;
54 StringBuffer sb = new StringBuffer();
57 line = bridge_.getSmlReader().readLine();
58 if (bridge_.ignore_output_ == 0) {
59 bridge_.log(1, "[[from sml: " + line);
62 indexEnd = line.indexOf(end_seq_);
64 sb.append(line.substring(0, indexEnd));
65 if (time_out_times_.size() > 0) {
66 time_out_times_.removeElementAt(0);
68 // remove first (oldest) element from time_out_times_
70 if (bridge_.ignore_output_ == 0) {
71 // send XML-string (response of sml-kernel) to
73 String s = new String(sb);
74 //TODO: FIXXME: removes the id in response:
75 s = s.substring(s.indexOf("<"));
76 //TODO: FIXXME: only one client
77 //currID = XMLParser.parseCalcID(s);
78 //TODO fetch id from bridge_
79 //so far: only one bridgeRMI
81 bridge_.log(1, "found CalcID: " + currID);
82 PrintWriter pw = client_list_
83 .getPrintWriterOfClient(currID);
86 bridge_.log(1, ">> Response sent to user "
89 //bridge_.responseSent();
91 bridge_.ignore_output_--;
93 "ignored output (restore kernel state)");
100 indexStart = line.indexOf(start_seq_);
101 if (indexStart != -1) {
102 sb = new StringBuffer();
106 } catch (IOException e) {
107 //bridge_.log(1, "Read from sml-kernel failed, waiting for
108 // kernel to restart");
109 } catch (NullPointerException e) {
110 bridge_.log(1, "Read from sml failed, waiting for restart...");
111 } catch (IndexOutOfBoundsException e) {
112 bridge_.log(1, "Kernel2Clients: Index out of bound");
114 } catch (NumberFormatException e) {
115 bridge_.log(1, "Couldn't parse user ID: NumberformatException");