package javaforce.webui;
/** WebUI Server.
*
* WebUI uses a WebSocket to communicate between the server and client side to create
* rich interfaces that are programmed like standard desktop applications.
* No ugly javascript, css or html knowledge needed.
* WebUI is not dependant on AWT or any related APIs and should work with the Java base module.
*
* Browser support (WebSocket, css:flex):
*
* Internet Explorer is NOT supported
* Edge 12+
* FireFox 28+
* Chrome 21+
*
* @author pquiring
*/
import java.io.*;
import java.util.*;
import javaforce.*;
import javaforce.service.*;
public class WebUIServer implements WebHandler, WebSocketHandler {
private Web web;
private WebUIHandler handler;
public void start(WebUIHandler handler, int port, boolean secure) {
this.handler = handler;
if (web != null) stop();
web = new Web();
web.setWebSocketHandler(this);
web.start(this, port, secure);
System.out.println("WebUI Server listing on port " + port);
}
public void stop() {
if (web != null) {
web.stop();
web = null;
}
}
public byte[] getResource(String name) {
InputStream is = getClass().getClassLoader().getResourceAsStream(name);
if (is == null) {
return null;
}
return JF.readAll(is);
}
public void doPost(WebRequest req, WebResponse res) {
doGet(req, res);
}
public void doGet(WebRequest req, WebResponse res) {
String url = req.getURL();
byte data[] = null;
/*
if (url.endsWith(".html")) {
res.setContentType("text/html"); //default
}
*/
if (url.endsWith(".css")) {
res.setContentType("text/css");
}
if (url.endsWith(".png")) {
res.setContentType("image/png");
}
if (url.endsWith(".js")) {
res.setContentType("text/javascript");
}
if (url.equals("/")) {
url = "/webui.html";
String browser = req.getHeader("User-Agent");
if (browser != null) {
if (browser.indexOf("Trident") != -1) {
//Internet Explorer - not supported
url = "/webui-ie.html";
}
}
}
if (url.startsWith("/static/")) {
// url = /static/r#
Resource r = Resource.getResource(url.substring(8));
if (r != null) {
data = r.data;
res.setContentType(r.mime);
}
} else if (url.startsWith("/user/")) {
data = handler.getResource(url);
} else {
data = getResource("javaforce/webui" + url);
}
if (data == null) {
res.setStatus(404, "Resource not found");
return;
}
try {
res.write(data);
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<WebUIClient> clients = new ArrayList<WebUIClient>();
public WebUIClient getClient(WebSocket sock) {
int cnt = clients.size();
for(int a=0;a<cnt;a++) {
WebUIClient client = clients.get(a);
if (client.socket == sock) {
return client;
}
}
return null;
}
public WebUIClient getClient(String hash) {
int cnt = clients.size();
for(int a=0;a<cnt;a++) {
WebUIClient client = clients.get(a);
if (client.hash.equals(hash)) {
return client;
}
}
return null;
}
public boolean doWebSocketConnect(WebSocket sock) {
try {
WebUIClient client = new WebUIClient();
client.setPanel(handler.getRootPanel(client));
client.setSocket(sock);
client.initPanel();
clients.add(client);
return true;
} catch (Exception e) {
JFLog.log(e);
return false;
}
}
public void doWebSocketClosed(WebSocket sock) {
clients.remove(getClient(sock));
}
public void doWebSocketMessage(WebSocket sock, byte[] data, int type) {
WebUIClient client = getClient(sock);
if (client == null) {
JFLog.log("Unknown Socket:" + sock);
return;
}
String msg = new String(data);
JFLog.log("RECV=" + msg);
//decode JSON
JSON.Element json;
try {
json = JSON.parse(msg);
} catch (Exception e) {
e.printStackTrace();
return;
}
String id = "";
String event = "";
ArrayList<String> args = new ArrayList<String>();
int cnt = json.children.size();
for(int a=0;a<cnt;a++) {
JSON.Element e = json.children.get(a);
if (e.key.equals("id")) {
id = e.value;
}
else if (e.key.equals("event")) {
event = e.value;
}
else {
args.add(e.key + "=" + e.value);
}
}
try {
client.dispatchEvent(id, event, args.toArray(new String[args.size()]));
} catch (Exception e) {
e.printStackTrace();
}
}
}