From d86d926306fef44e7222bee1967dbfa5a37be8d8 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Sun, 19 Apr 2026 17:02:34 +0200 Subject: [PATCH] Add: RMI --- .../ingsw/gc14/Model/Cards/BuildingCard.java | 5 +- .../ingsw/gc14/Model/Cards/TribeCard.java | 4 +- .../java/it/polimi/ingsw/gc14/Model/Game.java | 3 +- .../ingsw/gc14/Model/GamePackage/Board.java | 3 +- .../gc14/Model/GamePackage/CurrentState.java | 4 +- .../ingsw/gc14/Model/OrderLogicCard.java | 3 +- .../polimi/ingsw/gc14/Model/PlayableCard.java | 4 +- .../it/polimi/ingsw/gc14/Model/Player.java | 3 +- .../java/it/polimi/ingsw/gc14/Model/Slot.java | 4 +- .../Network/RMI/Client/IClientCallback.java | 13 +++++ .../gc14/Network/RMI/Client/RMIClient.java | 9 ++++ .../gc14/Network/RMI/Server/IGameServer.java | 20 ++++++++ .../gc14/Network/RMI/Server/IRMIServer.java | 9 ++++ .../Network/RMI/Server/RMIGameController.java | 51 +++++++++++++++++++ .../gc14/Network/RMI/Server/RMIServer.java | 33 ++++++++++++ .../java/it/polimi/ingsw/gc14/View/IView.java | 17 +++++++ 16 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/IClientCallback.java create mode 100644 src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java create mode 100644 src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IGameServer.java create mode 100644 src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IRMIServer.java create mode 100644 src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIGameController.java create mode 100644 src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java index 9b632f7..4a53828 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java @@ -5,9 +5,10 @@ import it.polimi.ingsw.gc14.Model.Cards.Building.EffectType; import it.polimi.ingsw.gc14.Model.PlayableCard; import it.polimi.ingsw.gc14.Model.Player; +import java.io.Serializable; import java.util.ArrayList; -public class BuildingCard extends PlayableCard implements Cloneable , BuildingEffect { +public class BuildingCard extends PlayableCard implements Cloneable , BuildingEffect, Serializable { private int price; public int getPrice() { return price; @@ -26,7 +27,7 @@ public class BuildingCard extends PlayableCard implements Cloneable , BuildingEf return effectType; } - public BuildingCard(int era,int price,int prestigeValue) throws IllegalArgumentException{ + protected BuildingCard(int era,int price,int prestigeValue) throws IllegalArgumentException{ super(era); if (price > 0) { this.price = price; diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Cards/TribeCard.java b/src/main/java/it/polimi/ingsw/gc14/Model/Cards/TribeCard.java index 00260f9..5d8daa1 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Cards/TribeCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Cards/TribeCard.java @@ -3,7 +3,9 @@ package it.polimi.ingsw.gc14.Model.Cards; import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Character; import it.polimi.ingsw.gc14.Model.PlayableCard; -public abstract class TribeCard extends PlayableCard { +import java.io.Serializable; + +public abstract class TribeCard extends PlayableCard implements Serializable { private boolean isEventCard; public boolean IsEventCard() { return isEventCard; diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index 4091090..98507e0 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -14,10 +14,11 @@ import it.polimi.ingsw.gc14.Model.Orders.Order4; import it.polimi.ingsw.gc14.Model.Orders.Order5; import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; +import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; -public class Game { +public class Game implements Serializable { private ArrayList playersList; private CurrentState currentState; diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/Board.java b/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/Board.java index 7f989b5..c495c12 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/Board.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/Board.java @@ -8,13 +8,14 @@ import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events.Sustenance; import it.polimi.ingsw.gc14.Model.DecksCreator; import it.polimi.ingsw.gc14.Model.Slot; +import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; /** * Board manages all the elements during the game such as decks, upper and lower rows, totems, tiles... */ -public class Board { +public class Board implements Serializable { /** * slotList contains the ordered list of slots (tiles). The slots changes based on the number of players. * Each slot (tile) has special action as drawing from the upper/lower row or taking food. diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java b/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java index c1039b7..f56c5bb 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java @@ -4,7 +4,9 @@ import it.polimi.ingsw.gc14.Model.Player; import it.polimi.ingsw.gc14.Model.Slot; import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; -public class CurrentState { +import java.io.Serializable; + +public class CurrentState implements Serializable { // region Getters private Player player; public Player getCurrentPlayer(){ diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java b/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java index cfb298d..2f55aab 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/OrderLogicCard.java @@ -2,9 +2,10 @@ package it.polimi.ingsw.gc14.Model; import it.polimi.ingsw.gc14.Model.Cards.BuildingCard; +import java.io.Serializable; import java.util.*; -public abstract class OrderLogicCard { +public abstract class OrderLogicCard implements Serializable { private Queue players; public OrderLogicCard(ArrayList players) { Collections.shuffle(players); diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/PlayableCard.java b/src/main/java/it/polimi/ingsw/gc14/Model/PlayableCard.java index 7d3b418..bf2d41e 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/PlayableCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/PlayableCard.java @@ -1,6 +1,8 @@ package it.polimi.ingsw.gc14.Model; -public abstract class PlayableCard { +import java.io.Serializable; + +public abstract class PlayableCard implements Serializable { private int Era; public int getEra(){ return Era; diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Player.java b/src/main/java/it/polimi/ingsw/gc14/Model/Player.java index 345bc04..bef8cbd 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Player.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Player.java @@ -4,13 +4,14 @@ import it.polimi.ingsw.gc14.Model.Cards.BuildingCard; import it.polimi.ingsw.gc14.Model.Cards.TribeCards.CharacterType; import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters.*; +import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; /** * Default Player class; contains all identifiers and methods needed. */ -public class Player { +public class Player implements Serializable { /** * The maximum length allowed for the username string. */ diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Slot.java b/src/main/java/it/polimi/ingsw/gc14/Model/Slot.java index 083e9f9..46e7f94 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Slot.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Slot.java @@ -1,6 +1,8 @@ package it.polimi.ingsw.gc14.Model; -public class Slot { +import java.io.Serializable; + +public class Slot implements Serializable { // Getters private char slotId; public char getSlotId() { diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/IClientCallback.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/IClientCallback.java new file mode 100644 index 0000000..6b840e7 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/IClientCallback.java @@ -0,0 +1,13 @@ +package it.polimi.ingsw.gc14.Network.RMI.Client; + +import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.Network.TCP.NetworkEvent; + +import java.rmi.*; + +public interface IClientCallback extends Remote { + void onGameInit(Game model) throws RemoteException; + void onAction(NetworkEvent action) throws RemoteException; + void onError(String message) throws RemoteException; + void onGameOver(String winner) throws RemoteException; +} \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java new file mode 100644 index 0000000..e31222e --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java @@ -0,0 +1,9 @@ +package it.polimi.ingsw.gc14.Network.RMI.Client; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +public class RMIClient { + +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IGameServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IGameServer.java new file mode 100644 index 0000000..a8beffd --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IGameServer.java @@ -0,0 +1,20 @@ +package it.polimi.ingsw.gc14.Network.RMI.Server; + +import it.polimi.ingsw.gc14.Network.RMI.Client.IClientCallback; +import it.polimi.ingsw.gc14.Network.TCP.NetworkEvent; + +import java.rmi.*; + +public interface IGameServer extends Remote { + // Connessione + String joinGame(String username, IClientCallback callback) throws RemoteException; + + // Azioni di gioco — specchio dei tuoi metodi GameController + boolean drawUpperTribeCard(String playerUsername, int pos) throws RemoteException; + boolean drawLowerTribeCard(String playerUsername, int pos) throws RemoteException; + boolean drawUpperBuildingCard(String playerUsername, int pos) throws RemoteException; + boolean drawLowerBuildingCard(String playerUsername, int pos) throws RemoteException; + boolean pickOptionalTribeCard(String playerUsername, int pos) throws RemoteException; + boolean pickOptionalBuildingCard(String playerUsername, int pos) throws RemoteException; + boolean slotChoice(String playerUsername, int pos) throws RemoteException; +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IRMIServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IRMIServer.java new file mode 100644 index 0000000..2fddf40 --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/IRMIServer.java @@ -0,0 +1,9 @@ +package it.polimi.ingsw.gc14.Network.RMI.Server; + +import java.rmi.RemoteException; + +public interface IRMIServer { + void connect(VirtualView client) throws RemoteException; + void add(Integer number) throws RemoteException; + void reset() throws RemoteException; +} diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIGameController.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIGameController.java new file mode 100644 index 0000000..3ad851e --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIGameController.java @@ -0,0 +1,51 @@ +package it.polimi.ingsw.gc14.Network.RMI.Server; + +import it.polimi.ingsw.gc14.Controller.GameController; +import it.polimi.ingsw.gc14.Network.RMI.Client.IClientCallback; +import it.polimi.ingsw.gc14.Network.TCP.NetworkEvent; + +import java.rmi.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.*; + +public class RMIGameController implements IGameServer { + + private final GameController controller; // delega tutto qui + private final Map clients = new ConcurrentHashMap<>(); + + public RMIGameController(GameController controller) { + this.controller = controller; + } + + @Override + public String joinGame(String username, IClientCallback callback) throws RemoteException { + controller.addPlayer(username); + clients.put(username, callback); + callback.onGameInit(controller.getModel()); + return username; + } + + + @Override + public boolean drawUpperTribeCard(String username, int pos) throws RemoteException { + boolean result = controller.drawUpperTribeCard(username, pos); + if (!result) { + notifyError(username, "Mossa non valida"); + } else { + notifyAll(new NetworkEvent(Action.ActionType.DRAW_UPPER_TRIBE, username, pos)); + } + return result; + } + + + + private void notifyAll(Action action) throws RemoteException { + for (IClientCallback cb : clients.values()) { + cb.onAction(action); + } + } + + private void notifyError(String username, String message) throws RemoteException { + IClientCallback cb = clients.get(username); + if (cb != null) cb.onError(message); + } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java new file mode 100644 index 0000000..ecc802a --- /dev/null +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java @@ -0,0 +1,33 @@ +package it.polimi.ingsw.gc14.Network.RMI.Server; + +import it.polimi.ingsw.gc14.Controller.GameController; + +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +public class RMIServer { + + private final RMIGameController controller; + private Registry registry; + + public RMIServer(RMIGameController controller) { + this.controller = controller; + } + + @Override + public void start() throws Exception { + IGameServer stub = (IGameServer) UnicastRemoteObject.exportObject(controller, 0); + registry = LocateRegistry.createRegistry(1099); + registry.rebind("GameServer", stub); + System.out.println("RMI Server avviato sulla porta 1099"); + } + + @Override + public void stop() throws Exception { + registry.unbind("GameServer"); + UnicastRemoteObject.unexportObject(controller, true); + System.out.println("RMI Server fermato"); + } +} diff --git a/src/main/java/it/polimi/ingsw/gc14/View/IView.java b/src/main/java/it/polimi/ingsw/gc14/View/IView.java index a30be8b..042191d 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/IView.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/IView.java @@ -1,4 +1,21 @@ package it.polimi.ingsw.gc14.View; +import it.polimi.ingsw.gc14.Network.TCP.NetworkEvent; + public interface IView { + // --- Setup --- + void showWelcome(); + String askPlayerName(); + + // --- Rendering --- + void render(GameState state); + void showMessage(String message); + void showError(String message); + void showWinner(String winner); + + // --- Input giocatore --- + NetworkEvent askMove(GameState state); + + // --- Lifecycle --- + void close(); }