More documentation improvements

This commit is contained in:
Markil3
2022-01-22 08:01:50 -07:00
parent ad568b2ec2
commit 858236d181
2 changed files with 88 additions and 6 deletions

View File

@@ -6,13 +6,21 @@ package edu.regis.universeplayer.addon;
import com.google.gson.*; import com.google.gson.*;
import com.google.gson.typeadapters.RuntimeTypeAdapterFactory;
import edu.regis.universeplayer.PlaybackInfo;
import edu.regis.universeplayer.PlaybackStatus;
import edu.regis.universeplayer.browserCommands.*; import edu.regis.universeplayer.browserCommands.*;
import edu.regis.universeplayer.data.Album;
import edu.regis.universeplayer.data.InternetSong;
import edu.regis.universeplayer.data.Song;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.Serializable;
import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -21,7 +29,10 @@ import java.util.HashMap;
/** /**
* The browser link serves as a communication between this process and the * The browser link serves as a communication between this process and the
* browser. It automatically converts information as needed as it passes it to * browser. It automatically converts information as needed as it passes it to
* and from the browser process. * and from the browser process. It receives browser JSON data from the
* system input and converts it to Java objects that the interface can read.
* Likewise, it will convert Java objects into JSON objects that will be sent
* to the browser through the system output.
* *
* @author William Hubbard * @author William Hubbard
* @version 0.1 * @version 0.1
@@ -49,6 +60,13 @@ public class BrowserLink extends MessageRunner
super(name, System.in, System.out); super(name, System.in, System.out);
} }
/**
* Converts a Java object into a data stream for sending to the browser.
*
* @param message - The Java object to send.
* @return The byte stream representation of the JSON object that will be
* sent via {@link #writeMessage(OutputStream, int, byte[])}
*/
@Override @Override
public byte[] serializeObject(Object message) public byte[] serializeObject(Object message)
{ {
@@ -60,6 +78,14 @@ public class BrowserLink extends MessageRunner
return val.toString().getBytes(StandardCharsets.UTF_8); return val.toString().getBytes(StandardCharsets.UTF_8);
} }
/**
* Converts data string received from the browser into a Java object.
*
* @param message - The message data stream received, as received by
* {@link #readMessage(InputStream)}.
* @return The Java that maps to the JSON data the browser sent.
* @throws IOException
*/
@Override @Override
public Object deserializeObject(byte[] message) throws IOException public Object deserializeObject(byte[] message) throws IOException
{ {
@@ -67,6 +93,21 @@ public class BrowserLink extends MessageRunner
return getMessage(val); return getMessage(val);
} }
/**
* Writes a message to the output stream. It takes a byte array of JSON
* data and then wraps it in another object containing the "messageNum"
* and "message" properties before writing that stream (preceded by the
* message length) to the browser.
* <p>
* This implementation
*
* @param out - The output stream to write to.
* @param messageNum - The ID of the message being sent. This will help keep
* track of responses.
* @param message - The actual message contents to write. This will be
* a byte stream of encoded JSON data.
* @throws IOException
*/
@Override @Override
public void writeMessage(OutputStream out, int messageNum, byte[] message) throws IOException public void writeMessage(OutputStream out, int messageNum, byte[] message) throws IOException
{ {
@@ -93,6 +134,18 @@ public class BrowserLink extends MessageRunner
out.flush(); out.flush();
} }
/**
* Reads a message from the input stream. It expects a message length
* followed by an encoded JSON message. This JSON message takes the form
* of two objects containing a "messageNum" property and "message"
* (containing the actual message).
*
* @param in - The input stream to read from.
* @return Two byte arrays, the first one containing the identifier of the
* message, and the second containing the byte stream of the actual JSON
* message sent.
* @throws IOException
*/
@Override @Override
public byte[][] readMessage(InputStream in) throws IOException public byte[][] readMessage(InputStream in) throws IOException
{ {

View File

@@ -17,6 +17,16 @@ import java.util.LinkedList;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
/**
* This class is responsible for setting up the intermediary program. The
* program is launched by the browser addon when the browser (not a tab, the
* browser) has launched and the addon has loaded. It launches two forwarding
* streams: one between this application and the browser that translates
* between the JSON format the browser uses and the serialized Java objects
* that this program uses (working over console I/O), and a second link to
* communicate between the interface and the browser link over the localhost
* (as defined by the socket server the interface sets up).
*/
public class Main public class Main
{ {
private static final Logger logger = LoggerFactory.getLogger(Main.class); private static final Logger logger = LoggerFactory.getLogger(Main.class);
@@ -29,6 +39,11 @@ public class Main
Socket socket = null; Socket socket = null;
try try
{ {
/*
* Sets up a two-way data stream to the browser through the
* process I/O streams. This converts between JSON data used by
* the browser to serializable Java objects used by the interface.
*/
logger.debug("Connecting to browser"); logger.debug("Connecting to browser");
browserLink = new BrowserLink("BrowserLink"); browserLink = new BrowserLink("BrowserLink");
try try
@@ -37,6 +52,10 @@ public class Main
socket = new Socket(BrowserConstants.IP, BrowserConstants.PORT); socket = new Socket(BrowserConstants.IP, BrowserConstants.PORT);
logger.debug("Connection established"); logger.debug("Connection established");
/*
* Sets up the data stream between this application and the
* interface.
*/
Socket finalSocket = socket; Socket finalSocket = socket;
interfaceLink = new MessageHandler("InterfaceHandler", finalSocket.getInputStream(), finalSocket.getOutputStream()) interfaceLink = new MessageHandler("InterfaceHandler", finalSocket.getInputStream(), finalSocket.getOutputStream())
{ {
@@ -47,7 +66,7 @@ public class Main
{ {
/* /*
* How many milliseconds must pass between browser * How many milliseconds must pass between browser
* pings. * pings before this stream shuts down.
*/ */
final long PING_RATE = 5000; final long PING_RATE = 5000;
if (!finalSocket.isConnected() || finalSocket.isClosed() || finalSocket.isInputShutdown() || finalSocket.isOutputShutdown()) if (!finalSocket.isConnected() || finalSocket.isClosed() || finalSocket.isInputShutdown() || finalSocket.isOutputShutdown())
@@ -56,7 +75,9 @@ public class Main
return true; return true;
} }
/* /*
* Make sure that it is active. * Make sure that it is active, either with logs from
* the browser or just with ping messages sent from
* here.
*/ */
if (QueueAppender.hasLogs()) if (QueueAppender.hasLogs())
{ {
@@ -92,7 +113,9 @@ public class Main
logger.debug("Connection received"); logger.debug("Connection received");
/* /*
* Pretty much just forwards any messages to the browser and * Pretty much just forwards any messages to the browser and
* returns their value. * returns their value. This is primarily a one-way
* relationship, where the interface sends commands, and the
* browser returns updates and responses.
*/ */
browserLink.addUpdateListener((update, link) -> browserLink.addUpdateListener((update, link) ->
{ {
@@ -107,6 +130,9 @@ public class Main
return returnValue; return returnValue;
}); });
/*
* Sets up both streams on their own threads.
*/
browserThread = new Thread(browserLink); browserThread = new Thread(browserLink);
interfaceThread = new Thread(interfaceLink); interfaceThread = new Thread(interfaceLink);
@@ -114,6 +140,9 @@ public class Main
browserThread.start(); browserThread.start();
interfaceThread.start(); interfaceThread.start();
logger.debug("Joining threads."); logger.debug("Joining threads.");
/*
* Waits for both threads to shut down.
*/
try try
{ {
browserThread.join(); browserThread.join();