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
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
00134 if (line.toLowerCase().equals(EXIT_COMMAND)) {
00135 break;
00136 }
00137
00138
00139
00140 if (exitFlag) {
00141 break;
00142 }
00143
00144
00145 if (line.toLowerCase().startsWith("xml: ")) {
00146
00147 final String fileName = line.substring(5).trim();
00148
00149 final File xmlFile = new File(fileName);
00150 DebugUtils.println("Retrieving: " + xmlFile.getAbsolutePath());
00151 if (xmlFile.exists()) {
00152
00153 for (BatchedEventHandler beh : eventHandlers) {
00154
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
00196 log("Got a connection on server port " + serverPort);
00197 log(" from client: " + ipAddr + " :: " + dnsName);
00198
00199
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 }