package server;
import static jooqdb.Tables.USER;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Collection;
import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketImpl;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.jooq.tools.json.JSONObject;
import org.jooq.tools.json.JSONParser;
import org.jooq.util.derby.sys.Sys;
import server.tokens.AuthenticationToken;
import server.tokens.LogoutToken;
import server.tokens.RegistrationToken;
import server.tokens.Token;
import server.tokens.UserUpdateToken;
import server.AuthenticationManager;
import server.DBManager;
import com.google.gson.*;
public class Server extends WebSocketServer
{
TokenHandler tokenhandler;
public Server( int port ) throws UnknownHostException {
super(new InetSocketAddress(port));
}
public Server( InetSocketAddress address ) {
super(address);
}
@Override
public void onOpen( WebSocket conn, ClientHandshake handshake ) {
this.sendToAll( "new connection: " + handshake.getResourceDescriptor() );
System.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!");
}
@Override
public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
this.sendToAll(conn + " has disconnected!");
System.out.println(conn + " has disconnected!");
LogoutToken t = new LogoutToken();
t.id = TokenHandler.openConnections.get(conn);
if(t.id != null)
{
TokenHandler.openConnections.remove(conn);
JSONReader<LogoutToken> reader = new JSONReader<LogoutToken>();
String message = reader.JSONWriter(t);
TokenHandler tokenHandler = new TokenHandler(t, message, conn);
TokenHandler.openConnections.remove(conn);
Thread x = new Thread(tokenHandler);
x.start();
}
}
// Received a string from a client
@Override
public void onMessage( WebSocket conn, String message ) {
//this.sendToAll( message );
System.out.println( conn + ": " + message );
JSONReader reader = new JSONReader<Token>();
Token t = (Token)reader.readJson( message , Token.class );
System.out.println( "Recieved Token tag: " + t.sTag );
TokenHandler tokenhandler = new TokenHandler( t, message, conn );
Thread x = new Thread(tokenhandler);
x.start();
}
public void onFragment( WebSocket conn, Framedata fragment ) {
System.out.println( "received fragment: " + fragment );
}
@Override
public void onError( WebSocket conn, Exception ex ) {
ex.printStackTrace();
if( conn != null ) {
// some errors like port binding failed may not be assignable to a specific websocket
}
}
public void sendToAll( String text ) {
Collection<WebSocket> con = connections();
synchronized ( con ) {
for( WebSocket c : con ) {
c.send( text );
}
}
}
}