BatchServer.java

00001 package edu.stanford.hci.r3.pen.batch;
00002 
00003 import java.io.BufferedReader;
00004 import java.io.File;
00005 import java.io.IOException;
00006 import java.io.InputStream;
00007 import java.io.InputStreamReader;
00008 import java.net.InetAddress;
00009 import java.net.ServerSocket;
00010 import java.net.Socket;
00011 import java.util.ArrayList;
00012 import java.util.List;
00013 import java.util.Map;
00014 
00015 import edu.stanford.hci.r3.PaperToolkit;
00016 import edu.stanford.hci.r3.config.Constants;
00017 import edu.stanford.hci.r3.events.EventEngine;
00018 import edu.stanford.hci.r3.pattern.PatternPackage;
00019 import edu.stanford.hci.r3.util.DebugUtils;
00020 
00037 public class BatchServer {
00038 
00042         public static final int DEFAULT_PLAINTEXT_PORT = Constants.Ports.BATCH_SERVER;
00043 
00047         public static final String EXIT_COMMAND = "[[exit]]";
00048 
00052         private List<Socket> clients = new ArrayList<Socket>();
00053 
00057         private EventEngine eventEngine;
00058 
00062         private List<BatchedEventHandler> eventHandlers = new ArrayList<BatchedEventHandler>();
00063 
00067         private boolean exitFlag = false;
00068 
00073         private Map<String, PatternPackage> patternPackages = PatternPackage
00074                         .getAvailablePatternPackages(PaperToolkit.getPatternPath());
00075 
00079         private int serverPort;
00080 
00081         private ServerSocket serverSocket;
00082 
00086         public BatchServer(EventEngine theEventEngine) {
00087                 try {
00088                         eventEngine = theEventEngine;
00089                         serverSocket = new ServerSocket(DEFAULT_PLAINTEXT_PORT);
00090                         serverPort = DEFAULT_PLAINTEXT_PORT;
00091                         // start thread to accept connections
00092                         getDaemonThread().start();
00093                 } catch (IOException e) {
00094                         System.out.println("Error with server socket: " + e.getLocalizedMessage());
00095                 }
00096         }
00097 
00102         private Thread getClientHandlerThread(final Socket clientSocket) {
00103                 return new Thread() {
00104 
00108                         private BufferedReader br;
00109 
00113                         public synchronized void disconnect() {
00114                                 try {
00115                                         if (!clientSocket.isClosed()) {
00116                                                 clientSocket.close();
00117                                         }
00118                                         if (br != null) {
00119                                                 br.close();
00120                                                 br = null;
00121                                         }
00122                                 } catch (IOException e) {
00123                                         e.printStackTrace();
00124                                 }
00125                         }
00126 
00127                         public void run() {
00128                                 try {
00129                                         final InputStream inputStream = clientSocket.getInputStream();
00130                                         br = new BufferedReader(new InputStreamReader(inputStream));
00131                                         String line = null;
00132                                         while ((line = br.readLine()) != null) {
00133                                                 // DebugUtils.println(line);
00134                                                 if (line.toLowerCase().equals(EXIT_COMMAND)) {
00135                                                         break;
00136                                                 }
00137 
00138                                                 // the server's exit flag
00139                                                 // it can kill all clients at the same time
00140                                                 if (exitFlag) {
00141                                                         break;
00142                                                 }
00143 
00144                                                 // the file name is everything after...
00145                                                 if (line.toLowerCase().startsWith("xml: ")) {
00146                                                         // get the file name of the xml file
00147                                                         final String fileName = line.substring(5).trim();
00148                                                         // DebugUtils.println(fileName); // everything afterward
00149                                                         final File xmlFile = new File(fileName);
00150                                                         DebugUtils.println("Retrieving: " + xmlFile.getAbsolutePath());
00151                                                         if (xmlFile.exists()) {
00152                                                                 // System.out.println("The file exists!");
00153                                                                 for (BatchedEventHandler beh : eventHandlers) {
00154                                                                         // send the xml file to the batched event handler...
00155                                                                         beh.batchedDataArrived(xmlFile);
00156                                                                 }
00157                                                         } else {
00158                                                                 DebugUtils.println("The file does not exist. =(");
00159                                                         }
00160                                                 }
00161                                         }
00162                                         DebugUtils.println("Import Thread Finished...");
00163                                 } catch (IOException e) {
00164                                         e.printStackTrace();
00165                                 }
00166                                 disconnect();
00167                         }
00168 
00169                 };
00170         }
00171 
00175         private Thread getDaemonThread() {
00176                 return new Thread() {
00177 
00178                         public void run() {
00179                                 while (true) {
00180                                         Socket client = null;
00181                                         try {
00182                                                 if (exitFlag) {
00183                                                         log("Closing BatchServer.");
00184                                                         break;
00185                                                 }
00186 
00187                                                 log("Waiting for a connection on port [" + serverPort + "]");
00188 
00189                                                 client = serverSocket.accept();
00190 
00191                                                 final InetAddress inetAddress = client.getInetAddress();
00192                                                 final String ipAddr = inetAddress.toString();
00193                                                 final String dnsName = inetAddress.getHostName();
00194 
00195                                                 // we got a connection with the client
00196                                                 log("Got a connection on server port " + serverPort);
00197                                                 log("               from client: " + ipAddr + " :: " + dnsName);
00198 
00199                                                 // keep it around
00200                                                 clients.add(client);
00201                                                 getClientHandlerThread(client).start();
00202                                         } catch (IOException ioe) {
00203                                                 log("Error with server socket: " + ioe.getLocalizedMessage());
00204                                         }
00205                                 }
00206                         }
00207                 };
00208         }
00209 
00215         private void log(String msg) {
00216                 System.out.println("Batch Server: " + msg);
00217         }
00218 
00222         public void registerBatchEventHandlers(List<BatchedEventHandler> batchEventHandlers) {
00223                 for (BatchedEventHandler beh : batchEventHandlers) {
00224                         eventHandlers.add(beh);
00225                 }
00226         }
00227 
00231         public void stopDaemon() {
00232                 try {
00233                         exitFlag = true;
00234                         for (Socket client : clients) {
00235                                 client.close();
00236                         }
00237                         System.out.println("BatchServer on port " + serverSocket.getLocalPort() + " is stopping...");
00238                         serverSocket.close();
00239                 } catch (IOException e) {
00240                         e.printStackTrace();
00241                 }
00242         }
00243 
00247         public void unregisterBatchEventHandlers(List<BatchedEventHandler> batchEventHandlers) {
00248                 for (BatchedEventHandler beh : batchEventHandlers) {
00249                         eventHandlers.remove(beh);
00250                         DebugUtils.println("Unregistering BatchEventHandler [" + beh + "]");
00251                 }
00252         }
00253 
00254 }

Generated on Sat Apr 14 18:21:33 2007 for R3 Paper Toolkit by  doxygen 1.4.7