package com.team254.frc2015.web;
import com.team254.lib.util.SystemManager;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketAdapter;
import org.eclipse.jetty.websocket.api.WebSocketException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.util.HashMap;
public class StateStreamSocket extends WebSocketAdapter {
HashMap<String, Boolean> subscribedKeys = new HashMap<String, Boolean>();
private boolean running = true;
public boolean canBeUpdated() {
return running && !subscribedKeys.isEmpty();
}
public void onWebSocketClose(int statusCode, String reason) {
super.onWebSocketClose(statusCode, reason);
WebServer.unregisterStateStreamSocket(this);
}
public void onWebSocketConnect(Session session) {
super.onWebSocketConnect(session);
WebServer.registerStateStreamSocket(this);
}
public void onWebSocketError(Throwable cause) {
System.err.println("WebSocket Error" + cause);
WebServer.unregisterStateStreamSocket(this);
}
public void onWebSocketText(String message) {
JSONParser parser = new JSONParser();
Object obj;
try {
obj = parser.parse(message);
} catch (ParseException e) {
e.printStackTrace();
return;
}
JSONObject cmd = (JSONObject) obj;
if (cmd != null) {
String action = (String) cmd.get("action");
if ("pause".equals(action)) {
running = false;
} else if ("start".equals(action)) {
running = true;
}
if ("subscribe".equals(action)) {
JSONArray keys = (JSONArray) cmd.get("keys");
for (Object key : keys) {
subscribe((String) key);
}
} else if ("unsubscribe".equals(action)) {
JSONArray keys = (JSONArray) cmd.get("keys");
for (Object key : keys) {
unsubscribe((String) key);
}
}
}
if (isConnected()) {
update();
}
}
@Override
public void onWebSocketBinary(byte[] arg0, int arg1, int arg2) {
}
public boolean update() {
if (!isConnected()) {
return false;
}
if (!running || subscribedKeys.keySet().size() == 0) {
return true;
}
String[] keys = subscribedKeys.keySet().toArray(new String[subscribedKeys.size()]);
JSONObject states = SystemManager.getInstance().get(keys);
String out = states.toJSONString();
try {
getRemote().sendStringByFuture(out);
} catch (WebSocketException e) {
System.err.println("Caught WebSocketException in StateStreamSocket");
return false;
}
return true;
}
private void subscribe(String key) {
subscribedKeys.put(key, true);
}
private void unsubscribe(String key) {
subscribedKeys.remove(key);
}
}