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