2 * @author Richard Gradischnegg RG
3 * Created on Aug 13, 2003
8 import java.io.IOException;
9 import java.io.PrintWriter;
10 import java.util.Vector;
12 import org.apache.log4j.Logger;
15 * This class runs in its own thread, fetches the output from the kernel, and
16 * sends it back to the clients
20 public class Kernel2ClientsServer implements Runnable {
22 private static final Logger logger = Logger
23 .getLogger(Kernel2ClientsServer.class.getName());
25 // Start and end sequences to mark XML parts in SML output
26 private static final String start_seq_ = "@@@@@begin@@@@@";
28 private static final String end_seq_ = "@@@@@end@@@@@";
30 private ClientList client_list_;
32 private BridgeMain bridge_;
34 private Vector time_out_times_;
36 // ---------------------------------------------------------------
37 public Kernel2ClientsServer(BridgeMain bridge) {
38 if (logger.isDebugEnabled())
39 logger.debug("Kernel2ClientsServer: bridge_=" + bridge);
40 // this.smlReader = bridge_.getSmlReader();
41 this.client_list_ = bridge.getClientList();
42 this.time_out_times_ = bridge.getTimeOutTimes();
43 this.bridge_ = bridge;
46 // ---------------------------------------------------------------
49 boolean startedXML = false;
53 StringBuffer sb = new StringBuffer();
56 line = bridge_.getSmlReader().readLine();
57 if (bridge_.ignore_output_ == 0) {
58 bridge_.log(1, "[[from sml: " + line);
61 indexEnd = line.indexOf(end_seq_);
63 sb.append(line.substring(0, indexEnd));
64 if (time_out_times_.size() > 0) {
65 time_out_times_.removeElementAt(0);
67 // remove first (oldest) element from time_out_times_
69 if (bridge_.ignore_output_ == 0) {
70 // send XML-string (response of sml-kernel) to
72 String s = new String(sb);
73 // TODO: FIXXME: removes the id in response:
74 s = s.substring(s.indexOf("<"));
75 // TODO: FIXXME: only one client
76 // currID = XMLParser.parseCalcID(s);
77 // TODO fetch id from bridge_
78 // so far: only one bridgeRMI
80 bridge_.log(1, "found CalcID: " + currID);
81 PrintWriter pw = client_list_
82 .getPrintWriterOfClient(currID);
85 bridge_.log(1, ">> Response sent to user "
88 // bridge_.responseSent();
90 bridge_.ignore_output_--;
92 "ignored output (restore kernel state)");
99 indexStart = line.indexOf(start_seq_);
100 if (indexStart != -1) {
101 sb = new StringBuffer();
105 } catch (IOException e) {
107 "Read from sml-kernel failed, waiting for 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");
116 } catch (Exception e) {
117 bridge_.log(1, "Unknown exception" + e.getMessage());