src/java/isac/bridge/Kernel2ClientsServer.java
author mlang
Tue, 28 Jun 2005 13:14:03 +0200
changeset 2544 631fe7f467b7
parent 2450 e9695b3ac2ae
child 2701 fbd8357974b7
permissions -rw-r--r--
cosmetics part2
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
}