package it.polimi.ingsw.gc14; import it.polimi.ingsw.gc14.Controller.GameController; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer; import it.polimi.ingsw.gc14.Network.TCP.Server.TCPServer; import java.rmi.RemoteException; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class ServerLauncher { BlockingQueue actionQueue; GameController gameController; RMIServer serverRMI; TCPServer serverTCP; public ServerLauncher(BlockingQueue actionQueue, GameController gameController, RMIServer serverRMI, TCPServer serverTCP) { this.actionQueue = actionQueue; this.serverRMI = serverRMI; this.gameController = gameController; this.serverTCP = serverTCP; } public boolean doFirstEven() throws InterruptedException, RemoteException { if(!actionQueue.isEmpty()) { NetworkEvent event = actionQueue.take(); if(event.apply(gameController)) { serverRMI.notifyAll(event); serverTCP.broadcastUpdate(event); return true; } else { serverRMI.notifyError(event.getUsername(), "Mossa non valida"); // TODO Converrebbe mettere in network event un booleano che dice se รจ stato accettato e fare una notifyAll anche per errori //serverTCP // TODO non esiste un notify error (guarda sopra) return false; } } return false; } public static void main() throws RemoteException { // TODO // Deve avere una coda con gli eventi. // Il server RMI e il server TCP quando ricevono un doEvent devono aggiungere l'evento alla coda condivisa // Questa classe esegue gli eventi nella coda e chiama il notify all e notify error sia RMI che TCP BlockingQueue actionQueue = new LinkedBlockingQueue<>(); GameController gameController = new GameController(); RMIServer serverRMI = new RMIServer(gameController, 1099, actionQueue); TCPServer serverTCP = new TCPServer(gameController, 8080, actionQueue); ServerLauncher launcher = new ServerLauncher(actionQueue, gameController, serverRMI, serverTCP); launcher.run(); } public void run() { while (true) { try { this.doFirstEven(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } catch (RemoteException e) { throw new RuntimeException(e); } } } }