diff --git a/addonInter/src/main/java/edu/regis/universeplayer/addon/Main.java b/addonInter/src/main/java/edu/regis/universeplayer/addon/Main.java index f24e8a3..a014d55 100644 --- a/addonInter/src/main/java/edu/regis/universeplayer/addon/Main.java +++ b/addonInter/src/main/java/edu/regis/universeplayer/addon/Main.java @@ -19,12 +19,12 @@ public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); - public static void main(String[] args) throws IOException, InterruptedException + public static void main(String[] args) throws IOException { MessageHandler interfaceLink; BrowserLink browserLink; Thread interfaceThread, browserThread; - Socket socket; + Socket socket = null; try { logger.debug("Connecting to browser"); @@ -34,18 +34,38 @@ public class Main logger.debug("Setting up connection"); socket = new Socket(BrowserConstants.IP,BrowserConstants.PORT); logger.debug("Connection established"); - - interfaceLink = new MessageHandler("InterfaceHandler", socket.getInputStream(), socket.getOutputStream()) { + + Socket finalSocket = socket; + interfaceLink = new MessageHandler("InterfaceHandler", finalSocket.getInputStream(), finalSocket.getOutputStream()) { @Override protected boolean onRun() { - if (!socket.isConnected() || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) + if (!finalSocket.isConnected() || finalSocket.isClosed() || finalSocket.isInputShutdown() || finalSocket.isOutputShutdown()) { - logger.debug("Socket closed, shutting down"); + logger.debug("Interface socket closed, shutting down"); return true; } + /** + * Make sure that it is active. + */ + this.sendUpdate("ping"); return false; } + + @Override + protected void onClose() + { + try + { + logger.debug("Closing interface socket."); + finalSocket.close(); + browserLink.sendObject("quit"); + } + catch (IOException e) + { + logger.error("Could not close socket", e); + } + } }; logger.debug("Connection received"); /* @@ -70,14 +90,28 @@ public class Main browserThread.start(); interfaceThread.start(); logger.debug("Joining threads."); - browserThread.join(); - interfaceThread.join(); + try + { + browserThread.join(); + interfaceThread.join(); + } + catch (InterruptedException e) + { + logger.error("Could not wait for threads", e); + } logger.debug("Threads completed."); } catch (IOException e) { logger.error("Could not initialize socket", e); - browserLink.sendObject("quit"); + try + { + browserLink.sendObject("quit"); + } + catch (IOException ex) + { + logger.error("Could not quit socket", ex); + } throw e; } } @@ -89,6 +123,17 @@ public class Main finally { logger.debug("Shutting down interface link"); + if (socket != null) + { + try + { + socket.close(); + } + catch (IOException e) + { + logger.error("Could not close socket", e); + } + } } } diff --git a/addonInter/src/main/resources/log4j2.xml b/addonInter/src/main/resources/log4j2.xml index 3e4c214..30479a2 100644 --- a/addonInter/src/main/resources/log4j2.xml +++ b/addonInter/src/main/resources/log4j2.xml @@ -17,10 +17,5 @@ - - - - - \ No newline at end of file diff --git a/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageHandler.java b/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageHandler.java index 02ad1ff..5b79439 100644 --- a/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageHandler.java +++ b/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageHandler.java @@ -76,13 +76,14 @@ public class MessageHandler implements Runnable, MessageSerializer Future messageResponse; ByteBuffer numBuffer = ByteBuffer.allocate(4); HashSet toRemove = new HashSet<>(); + boolean running = true; try { browserIn = new BufferedInputStream(this.input); browserOut = new BufferedOutputStream(this.output); - while (!this.onRun()) + while (!this.onRun() && running) { try { @@ -111,6 +112,7 @@ public class MessageHandler implements Runnable, MessageSerializer catch (IOException | ClassNotFoundException e) { logger.error("Could not retrieve message", e); + running = false; } /* @@ -134,6 +136,7 @@ public class MessageHandler implements Runnable, MessageSerializer catch (IOException e) { logger.error("Could not send response message for " + responses.getKey(), e); + running = false; } } toRemove.forEach(this.messageResponses::remove); @@ -158,7 +161,8 @@ public class MessageHandler implements Runnable, MessageSerializer } catch (IOException e) { - logger.error("Could not send response message for " + update, e); + logger.error("Could not send response message for" + update, e); + running = false; } } } @@ -176,11 +180,13 @@ public class MessageHandler implements Runnable, MessageSerializer */ synchronized (this.messageResponses) { + logger.debug("Releasing {} dangling messages", this.messageResponses.size()); this.messageResponses.values().forEach(future -> future.cancel(false)); } /* * Close the streams. */ + logger.debug("Closing streams"); try { if (browserIn != null) @@ -205,10 +211,21 @@ public class MessageHandler implements Runnable, MessageSerializer { logger.error("Could not close browser output", e1); } + finally + { + this.onClose(); + } } } } + /** + * Callback for when closing the application. + */ + protected void onClose() + { + } + /** * Triggers the message listeners. * diff --git a/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageRunner.java b/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageRunner.java index 2f09046..3ec68e8 100644 --- a/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageRunner.java +++ b/browserCommands/src/main/java/edu/regis/universeplayer/browserCommands/MessageRunner.java @@ -187,6 +187,7 @@ public abstract class MessageRunner implements Runnable, MessageSerializer */ synchronized (this.sendQueue) { + logger.debug("Clearing up {} messages", this.sendQueue.size()); while (this.sendQueue.size() > 0) { packet = this.sendQueue.poll(); @@ -200,6 +201,7 @@ public abstract class MessageRunner implements Runnable, MessageSerializer /* * Close the streams. */ + logger.debug("Closing streams."); try { if (browserIn != null) @@ -224,10 +226,21 @@ public abstract class MessageRunner implements Runnable, MessageSerializer { logger.error("Could not close browser output", e1); } + finally + { + this.onClose(); + } } } } + /** + * Callback for when closing the application. + */ + protected void onClose() + { + } + /** * Sends an object to the remote. * diff --git a/interface/src/main/java/edu/regis/universeplayer/browser/Browser.java b/interface/src/main/java/edu/regis/universeplayer/browser/Browser.java index acb2a92..881fa3c 100644 --- a/interface/src/main/java/edu/regis/universeplayer/browser/Browser.java +++ b/interface/src/main/java/edu/regis/universeplayer/browser/Browser.java @@ -32,11 +32,13 @@ public class Browser extends MessageRunner implements Player { private static final Logger logger = LoggerFactory.getLogger(Browser.class); private final Process process; + private final ServerSocket server; private final Socket socket; private final LinkedList listeners = new LinkedList<>(); private InternetSong currentSong; + private boolean running = true; public static Browser createBrowser() throws IOException, InterruptedException { @@ -91,14 +93,15 @@ public class Browser extends MessageRunner implements Player { logger.debug("Connection established."); } - browser = new Browser(socket, browserProcess); + browser = new Browser(socket, server, browserProcess); return browser; } - private Browser(Socket socket, Process process) throws IOException + private Browser(Socket socket, ServerSocket server, Process process) throws IOException { super("BrowserRunner", socket.getInputStream(), socket.getOutputStream()); this.socket = socket; + this.server = server; this.process = process; } @@ -110,7 +113,33 @@ public class Browser extends MessageRunner implements Player logger.debug("Socket closed, shutting down"); return true; } - return false; + return !this.running; + } + + @Override + protected void onClose() + { + logger.debug("Closing socket"); + try + { + this.socket.close(); + } + catch (IOException e) + { + logger.error("Could not close socket", e); + } + finally + { + logger.debug("Closing server"); + try + { + this.server.close(); + } + catch (IOException e) + { + logger.error("Could not close server", e); + } + } } /** @@ -193,6 +222,7 @@ public class Browser extends MessageRunner implements Player @Override public QueryFuture close() { + this.running = false; try { QueryFuture future = new ForwardedFuture(this.sendObject(new CommandQuit())); diff --git a/interface/src/main/resources/log4j2.xml b/interface/src/main/resources/log4j2.xml index f450a75..f67fe99 100644 --- a/interface/src/main/resources/log4j2.xml +++ b/interface/src/main/resources/log4j2.xml @@ -17,16 +17,5 @@ - - - - - - - - - - - \ No newline at end of file