diff --git a/ConnHandler.java b/ConnHandler.java index 912ab2f..92db3b4 100644 --- a/ConnHandler.java +++ b/ConnHandler.java @@ -72,8 +72,7 @@ class ConnHandler implements Runnable { //InetAddress addr = new InetSocketAddress("127.0.0.1"); if (!client.isConnected()) res.error("failed to connect!!!!!!!"); - //"127.0.0.1", 2600); //dest, res.PORT); - //client.connect(addr, 2600); + out = new PrintWriter(client.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(client.getInputStream())); } catch (Exception e) { @@ -92,13 +91,14 @@ class ConnHandler implements Runnable { "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" + - "Referer: http://localhost:2600/client.html\r\n" + + "Referer: " + getIPAddress() + ":" + Integer.toString(res.PORT) + "/client.html\r\n" + "Content-Length: " + (all.length()+2) + "\r\n" + "Pragma: no-cache\r\n" + "Cache-Control: no-cache\r\n" + "\r\n"); out.print(all + "\n\n"); out.flush(); + //res.alert("SENT: " + all); //res.log("sent message"); //out.close(); @@ -110,10 +110,12 @@ class ConnHandler implements Runnable { // read http header //res.log("Reading resp header"); try { - String header = in.readLine(); - while (header.length() >= 3) { - //res.log("header: " + header); - header = in.readLine(); + if (in.ready()) { + String header = in.readLine(); + if (header.length() >= 3) { + //res.log("header: " + header); + header = in.readLine(); + } } } catch (Exception e) { res.error("Exception in ajaxCall (reading HTTP response header): " + e.toString()); @@ -223,7 +225,14 @@ class ConnHandler implements Runnable { } else if (cmd.equals("greet")) { response = getIPAddress() + ":" + res.PORT + " " + res.getNodeData("originURL") ; } else if (cmd.equals("getLog")) { + res.debug("getLog"); ArrayList l = res.getLog(); + if (l.size() == 0) { + res.debug("logWait"); + res.logWait(); + l = res.getLog(); + } + res.debug("process Log"); response = ""; for (int i = l.size()-1; i >= 0; i--) { response += l.get(i) + "\n"; @@ -237,7 +246,14 @@ class ConnHandler implements Runnable { res.queueMsg(req.get("req")); response = "received on " + res.PORT; } else if (cmd.equals("getMsgs")) { + res.debug("getMsgs"); ArrayList mq = res.getMsgs(); + if (mq.size() == 0) { + res.debug("mqWait"); + res.mqWait(); + mq = res.getMsgs(); + } + res.debug("mq process"); for(int i =0; i < mq.size(); i++) { response += mq.get(i) + "\n\n"; } diff --git a/Cortex.java b/Cortex.java index 11c43df..42366b6 100644 --- a/Cortex.java +++ b/Cortex.java @@ -1,5 +1,5 @@ import java.applet.*; -//import java.awt.*; +import java.awt.*; import java.awt.event.*; import javax.swing.Timer; import java.awt.image.*; @@ -18,71 +18,58 @@ import javax.swing.JOptionPane.*; public class Cortex extends Applet { - //private final int PORT = 2600; // in ResManager now - private ServerSocket server; + + private Server server; + private ResManager res = new ResManager(this); - private ResManager res = new ResManager(); + public void update(Graphics g) + { + paint(g); + } + + + public void paint(Graphics g) { + Dimension size = getSize(); + g.setColor(Color.black); + g.fillRect(0, 0, (int) size.getWidth(), (int) size.getHeight()); + + g.setColor(new Color(223, 200, 255)); + g.drawString("Cortex Server",8,12); + + if(!res.killSwitch) { + g.setColor(new Color(40, 255, 80)); + g.drawString("Online on port",2, 28); + g.drawString(Integer.toString(res.PORT), 35, 42); + /*if (res.mqSize() > 0) { + g.setColor(Color.green); + g.drawString(".", 80, 42); + } else { + g.setColor(Color.red); + g.drawString(".", 80, 42); + }*/ + } else { + g.setColor(Color.red); + g.drawString("Offline", 25,28); + } + } + - /*URL getCodeBase() throws Exception { - return new URL("file:///home/dan/src/school/cpsc416/cortex/"); - }*/ - /* main * Main HTTP server. Accepts connections on PORT and passes them to threads * in the form of ConnHandlers to deal with */ public void init() { - //javax.swing.JOptionPane.showMessageDialog(null, "APPLET STARTING!!!!"); - //res.alert("Starting..."); - res.putNodeData("originURL", getCodeBase().toString()); - res.reloadSite(); + //server = + new Thread(new Server(res, getCodeBase().toString(), this)).start(); - //res.alert("Loaded site"); - - boolean bound = false; - while(!bound) - { - try { - server = new ServerSocket(res.PORT); - bound = true; - } catch (IOException e) { - res.PORT++; - } - } - - - /* + // be reasonably sure we've secured a valid port try { - server = new ServerSocket(res.PORT); - } catch (IOException e) { - res.error( "It appears another Cortex Node is already running on this computer, making this one superfulous.\nShutting down..."); - }*/ + Thread.sleep(100); + } catch (Exception e) { /* meh */ } + repaint(); - /*try { - JSObject win = JSObject.getWindow(this); - win.eval("load();"); - } catch(Exception e) { - res.error(e.toString()); - }*/ - - try { - //res.alert("running server"); - while (!res.killSwitch) { - Socket sock = server.accept(); - //res.alert("ACCEPTED!"); - - new Thread(new ConnHandler(sock, res)).start(); - - //handler.run(); - //res.alert("RESTARTING LOOP"); - } - server.close(); - } catch (IOException e) { - System.out.println("IOException in init(): " + e.toString()); - res.error( "IOException in init(): " + e.toString()); - } + // HANDLE QUIT? - //res.error("QUITING!"); } } diff --git a/Makefile b/Makefile index 822a4f2..3652e15 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ Cortex.jar: Cortex.class ConnHandler.class ResManager.class - jar cvf Cortex.jar Cortex.class ConnHandler.class ResManager.class + jar cvf Cortex.jar Cortex.class Server.class ConnHandler.class ResManager.class jarsigner Cortex.jar cortex_cert ResManager.class: ResManager.java @@ -8,6 +8,9 @@ ResManager.class: ResManager.java ConnHandler.class: ConnHandler.java javac ConnHandler.java +Server.class: Server.java + javac Server.java + Cortex.class: Cortex.java javac Cortex.java diff --git a/ResManager.java b/ResManager.java index 7ee476c..924b963 100644 --- a/ResManager.java +++ b/ResManager.java @@ -1,3 +1,4 @@ +import java.applet.*; import java.util.HashMap; import javax.swing.JOptionPane.*; import java.util.ArrayList; @@ -11,20 +12,27 @@ import java.net.*; class ResManager { public /*final*/ int PORT = 2600; + private Applet applet; + + FileWriter debugFW = null; + BufferedWriter debugOut = null; private HashMap site = new HashMap(); private HashMap nodeData = new HashMap(); + // Internal Activity Log private ArrayList log = new ArrayList(); - private boolean logLock = false; + //private boolean logLock = false; private DateFormat logDateFormat = new SimpleDateFormat("HH:mm:ss"); - private boolean mqLock = false; + // Message Queue + //private boolean mqLock = false; private ArrayList msgQueue = new ArrayList(); public boolean killSwitch = false; - public ResManager() { + public ResManager(Applet a) { + applet = a; } public void putSite(String key, byte[] val) { @@ -43,62 +51,74 @@ class ResManager { return nodeData.get(key); } - private synchronized void logLock() { - while (logLock == true) { + public void log(String l) { + synchronized (log) { + Date d = new Date(); + log.add(logDateFormat.format(d) + ": " + l); + log.notifyAll(); + if (debugOut != null) { try { - wait(); - } catch (Exception e) { - error("logLock: " + e.toString()); + debugOut.write(logDateFormat.format(d) + ": " + l + "\n"); + debugOut.flush(); + } catch (IOException e) { + // Fail + } } } - logLock = true; - //javax.swing.JOptionPane.showMessageDialog(null, " Locked"); } - private synchronized void logUnlock() { - logLock = false; - //javax.swing.JOptionPane.showMessageDialog(null, " UnLocked"); - } - - public synchronized void log(String l) { - logLock(); - Date d = new Date(); - log.add(logDateFormat.format(d) + ": " + l); - logUnlock(); - } - - private synchronized void mqLock() { - while(mqLock == true) { - try { - wait(); - } catch (Exception e) { - error("mqLock: " + e.toString()); + public void debug(String l) { + synchronized (log) { + Date d = new Date(); + try { + debugOut.write(logDateFormat.format(d) + ": " + l + "\n"); + debugOut.flush(); + } catch (IOException e) { + // Fail } } - mqLock = true; } - private synchronized void mqUnlock() { - mqLock = false; + public void logWait() { + synchronized(log) { + try { + log.wait(); + } catch (Exception e) { } + } } - public synchronized void queueMsg(String m) { - mqLock(); - msgQueue.add(m); - mqUnlock(); + public void queueMsg(String m) { + synchronized (msgQueue) { + msgQueue.add(m); + msgQueue.notifyAll(); + } + //applet.repaint(); } - public synchronized ArrayList getMsgs() { - mqLock(); - ArrayList mq = msgQueue; - msgQueue = new ArrayList(); - mqUnlock(); + public void mqWait() { + synchronized(msgQueue) { + try { + msgQueue.wait(); + } catch (Exception e) { } + } + } + + public ArrayList getMsgs() { + ArrayList mq; + synchronized(msgQueue) { + mq = msgQueue; + msgQueue = new ArrayList(); + } + //applet.repaint(); return mq; } + public int mqSize() { + return msgQueue.size(); + } public void alert(String a) { - javax.swing.JOptionPane.showMessageDialog(null, a); + javax.swing.JOptionPane.showMessageDialog(null, Integer.toString(PORT) + ": " + a); log("ALERT> " + a); } @@ -108,13 +128,13 @@ class ResManager { } // returns the current log and RESETS it - public synchronized ArrayList getLog() + public ArrayList getLog() { - logLock(); - ArrayList tmp = log; - log = new ArrayList(); - logUnlock(); - return tmp; + synchronized(log) { + ArrayList tmp = log; + log = new ArrayList(); + return tmp; + } } public void reloadSite() { @@ -158,22 +178,18 @@ class ResManager { } } - - - /* - public synchronized void put(String key, String val) { - //javax.swing.JOptionPane.showMessageDialog(null, "putting: '" + key + "'"); - //javax.swing.JOptionPane.showMessageDialog(null, val); - //data.put(key, val); - } - - public synchronized String get(String key) { - //javax.swing.JOptionPane.showMessageDialog(null, "getting: '" + key + "'"); - //javax.swing.JOptionPane.showMessageDialog(null, "from: " + data.keySet().toString()); - - //return data.get(key); - }*/ - + public void openDebugLog(String ip) { + String fname = "cortex." + ip + ":" + Integer.toString(PORT) + ".log"; + //FileWriter debugFileW = new FileWriter("/tmp/" + fname); + try { + debugFW = new FileWriter("/tmp/" + fname); + debugOut = new BufferedWriter(debugFW); + } catch (IOException e) { + debugFW = null; + debugOut = null; + error("Failed to open debug log"); + } + } } diff --git a/client.html b/client.html index ab03a89..5599ba1 100644 --- a/client.html +++ b/client.html @@ -131,6 +131,9 @@ function getLog() { var log = document.getElementById('log'); //alert("getLog() resp: " + resp); log.value = resp + log.value; + // Since getLog returns (a call back is called later) + // this is tail recursive friendly + getLog(); }); ajaxSend(http, "cmd=getLog\n\n", retfn); } @@ -170,7 +173,11 @@ function getMsgs() { var retfn = returnfn(http, function(resp) { //log("getMsgs: len > 0"); + log("getMsgs: " + resp); queueMsgs(resp); + // Since getMsgs returns (a call back is called later) + // this is tail recursive friendly + getMsgs(); }); ajaxSend(http, "cmd=getMsgs\n\n", retfn); } @@ -801,14 +808,14 @@ function cron() { } - if (runCount % 5 == 0) { + /*if (runCount % 5 == 0) { getMsgs(); - } + }*/ // once a second if (runCount % 10 == 0) { ping(); - getLog(); + //getLog(); setStatus(); checkLocks(); updateTestsStatus(); @@ -1845,6 +1852,9 @@ function updateFinalResults() { var cronID = setInterval("cron()", 100); +getMsgs(); +getLog(); + function page(p) { // turn off all pages diff --git a/shell.html b/shell.html index eeedd5e..c52da54 100644 --- a/shell.html +++ b/shell.html @@ -29,7 +29,7 @@ - + Coretex Client