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