This class is used to manage the message sent by the server to the client to assign the secret objective cards which
+ should be chosen by the player, the common objective cards and the cards to the player's hand.
CountResource is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards and the gold cards, which count identical resources or objects visible in the play area (field)
+ of the player.
Diagonals is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which count 3 cards of the same kingdom on the diagonal line y=x or y=-x.
Empty is one of the classes that implement the PointStrategy interface used to calculate the
+ card whose placement returns always 1: all cards with a constant value regardless of other conditions.
This class is used to manage the message sent by the server to the client when client's request to access the game,
+ to create a new game or to reconnect to a game is not successful.
This class is used to manage the message sent by the server to the client to notify the player that the game is
+ started, entering the preparation phase.
Used for the point calculation of the only objective card which counts the number of right facing Ls made from 2
+ stacked vertical blue cards and 1 red card to the top right in the player's field.
LConfigurationOne is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the bottom right has a Plant card and in the top left corner has a Fungi card
+ and then above that card has another Fungi card.
LConfigurationThree is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the top left has an Animal card and in the bottom right corner has an Insect card
+ and then under that card has another Insect card.
Used for the point calculation of the only objective card which counts the number of left facing Ls made from 2
+ stacked vertical green cards and 1 purple card to the bottom left in the player's field.
This class is used to manage the message sent to the player who requested the field of another player to notify him that the field could not be fetched (used for testing only).
Use this class to create a Non-Objective card (Resource, Gold or Starting card) using the card data stored in the
+ JSON file, in the side of the client.
Use this class to store the player's public information that is shared with other players, which means that in this
+ class contains all the information that the player can request to know about the other players.
Following strategy pattern to describe different strategies used by cards to calculate points
+ and for each type count how many times it is realized in the indicated field.
The interface RMIClientAcceptorInt exposes the RMI methods that a
+ RMIClientNode instance can invoke on the server when the client hasn't
+ joined yet a game.
Each instance of class RMIServerNode handle une RMI connection with a client.
+ If, at some point, the connection were to go down, this instance while begin automatically a termination process
+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces
+
+
Search
+
You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API. These items can be searched using part or all of the name, optionally using "camelCase" abbreviations, or multiple search terms separated by whitespace. Some examples:
+The following sections describe the different kinds of pages in this collection.
+
+
Module
+
Each module has a page that contains a list of its packages, dependencies on other modules, and services, with a summary for each. These pages may contain the following categories:
+
+
Packages
+
Modules
+
Services
+
+
+
+
Package
+
Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:
+
+
Interfaces
+
Classes
+
Enum Classes
+
Exception Classes
+
Annotation Interfaces
+
+
+
+
Class or Interface
+
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.
+
+
Class Inheritance Diagram
+
Direct Subclasses
+
All Known Subinterfaces
+
All Known Implementing Classes
+
Class or Interface Declaration
+
Class or Interface Description
+
+
+
+
Nested Class Summary
+
Enum Constant Summary
+
Field Summary
+
Property Summary
+
Constructor Summary
+
Method Summary
+
Required Element Summary
+
Optional Element Summary
+
+
+
+
Enum Constant Details
+
Field Details
+
Property Details
+
Constructor Details
+
Method Details
+
Element Details
+
+
Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.
+
The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+
+
+
Other Files
+
Packages and modules may contain pages with additional information related to the declarations nearby.
+
+
+
Tree (Class Hierarchy)
+
There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.
+
+
When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
+
When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.
+
+
+
All Packages
+
The All Packages page contains an alphabetic index of all packages contained in the documentation.
+
+
+
All Classes and Interfaces
+
The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.
+
+
+
Index
+
The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.
+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
diff --git a/deliverables/JavaDoc/index-files/index-1.html b/deliverables/JavaDoc/index-files/index-1.html
new file mode 100644
index 00000000..6b8b45b2
--- /dev/null
+++ b/deliverables/JavaDoc/index-files/index-1.html
@@ -0,0 +1,386 @@
+
+
+
+
+A-Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
alreadyEnteredTerminatingPhase: A flag that indicates whether the terminating phase has already been entered; used to notify players when terminating phase is entered
ANIMAL - Enum constant in enum class it.polimi.ingsw.am32.model.card.CornerType
+
+
Animal corner type indicates that the corner of the card has an animal resource.
+
+
ANIMAL - Enum constant in enum class it.polimi.ingsw.am32.model.card.pointstrategy.ObjectType
+
+
Animal object type indicates that the object is an animal resource.
+
+
ANIMAL - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
Unicode characters used to represent the icon ANIMAL
+
+
ANIMALCARD - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
Unicode integer used to represent the icon of the animal kingdom's color
+
+
ANSI_BLACK - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set BLACK color
+
+
ANSI_BLUE - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set BLUE color
+
+
ANSI_GREEN - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set GREEN color
+
+
ANSI_PURPLE - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set PURPLE color
+
+
ANSI_RED - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set RED color
+
+
ANSI_RESET - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set RESET
+
+
ANSI_YELLOW - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
ANSI escape codes used to set YELLOW color
+
+
app - Variable in class it.polimi.ingsw.am32.client.view.gui.GraphicalUI
+
+
The reference of the GUIApplication class which is used to connect the GUI with the GUIApplication class in able
+ to update the scene based on the changes made in the GUI.
This class is used to manage the message sent by the server to the client to assign the secret objective cards which
+ should be chosen by the player, the common objective cards and the cards to the player's hand.
The constructor of the class: it creates a new AssignedSecretObjectiveCardMessage with the nickname of the
+ recipient who will receive the assignment of the cards.
The constructor of the class: it creates a new AssignedStarterCardMessage with the nickname of the recipient who
+ will receive the assignment of the starter card and the id of the card assigned to the player.
Used for the point calculation of the only objective card which counts the number of right facing Ls made from 2
+ stacked vertical blue cards and 1 red card to the top right in the player's field.
LConfigurationOne is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the bottom right has a Plant card and in the top left corner has a Fungi card
+ and then above that card has another Fungi card.
LConfigurationThree is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the top left has an Animal card and in the bottom right corner has an Insect card
+ and then under that card has another Insect card.
Used for the point calculation of the only objective card which counts the number of left facing Ls made from 2
+ stacked vertical green cards and 1 purple card to the bottom left in the player's field.
This class is used to manage the message sent to the player who requested the field of another player to notify him that the field could not be fetched (used for testing only).
The constructor of the class: it creates a new NewGameConfirmationMessage with the nickname of the recipient who
+ requested to create a new game and the id of the match returned by the server.
Use this class to create a Non-Objective card (Resource, Gold or Starting card) using the card data stored in the
+ JSON file, in the side of the client.
The constructor of the class: it creates a new PlaceCardFailedMessage with the nickname of the recipient who will receive the message
+ and the reason why the card placement has failed.
Constructor: a message containing the nickname of the player who wants to place the card, the id of the card the
+ player wants to place, the x and y coordinates of the position in the field where the player wants to place the
+ card and a flag that indicates if the card is placed face up or face down.
The constructor of the class: it creates a new PlaceCardRollbackMessage with the nickname of the recipient who will receive the message,
+ the nickname of the player who disconnected after placing a card, the card that has been placed by the player and should be removed,
+ the old points of the player before the card placement who disconnected and the old resources of the player before the card placement who disconnected.
The constructor of the class: it creates a new PlayerDisconnectMessage with the nickname of the recipient of the message
+ and the nickname of the player who disconnected.
Constructor: a message containing all the data necessary to update the view when the game enters a playing phase
+ or when the player reconnects to the game.
Use this class to store the player's public information that is shared with other players, which means that in this
+ class contains all the information that the player can request to know about the other players.
The constructor of the class: it creates a new PlayerReconnectedMessage with the nickname of the recipient who
+ requested to reconnect to the game before and the nickname of the player who reconnected to the game.
The constructor of the class: it creates a new PlayerTurnMessage with the nickname of the recipient who
+ requested to access the game before and the nickname of the player whose turn it is
Following strategy pattern to describe different strategies used by cards to calculate points
+ and for each type count how many times it is realized in the indicated field.
This method is used to process the message to the client when the access to the game is confirmed,
+ updating the current event of the game and notifying the player that he joined the game successfully.
This method is used to process the message to the client when is a turn to choose the secret objective card,
+ setting the cards received by the server and updating the current event of the game.
This method is used to process the message to the client when the assigned starter card is received,
+ updating the current event of the game and notifying the player that he received the assigned starter card.
This method is used to process the message to the client when the selected secret objective card is confirmed,
+ updating the view with the selected secret objective card chosen by the player.
This method is used to process the message to the client when the selection of the starter card side is
+ confirmed,
+ updating the view with the selected side of the starter card, the available spaces and resources
+ of the player in the field after the placement of the starter card.
This method is used to process the message to the client when the draw card action is confirmed, updating the
+ view with the cards in the player's hand.
This method is used to process the message to the client when the draw card action fails, updating the view with
+ the reason why the draw card action failed.
This method is used to process the message to the client when the request to access the game,
+ to create a new game or to reconnect to a game is not successful,
+ updating the current event of the game and notifying the player
+ that the request is not successful.
This method is used to process the message to the client when the game is started, updating the view with the
+ setup of players' data and notifying the player that the game entered the preparation phase.
This method is used to process the message to the client when the creation of a new game is confirmed,
+ updating view with data related to the new game created and the current event of the game, notifying the player
+ that the game is created correctly.
This method is used to process the message to the client when a card placement has failed,
+ updating the view of the player who will receive the message.
This method is used to process the message to the client when a player has placed a card and disconnected,
+ updating the view of the player who will receive the message.
This method is used to process the message to the client when a player disconnects from the game,
+ updating the view based on the PLAYER_DISCONNECTED event.
This method is used to process the message to the client when a player reconnects to the game,
+ updating the view based on the PLAYER_RECONNECTED event.
This method is used to process the message to the client when the player turn is notified,
+ updating the current event of the game and notifying the player that it is his turn.
This method is used to process the message to the client when the reconnection to the game is confirmed,
+ modifying the view based on the GAME_RECONNECTED event.
A thread that reads the input from the player when it is not the player's turn will be started when the game
+ enters the playing phase, if the player is the current player, the thread will be waiting until the message
+ PlayerTurnMessage from the server to update the currentPlayer in the game.
The nickname of the recipient who requested to create a new game, to access the game or to reconnect to a game
+ before and received the error message.
The constructor of the class: it creates a new ReconnectGameConfirmMessage with the nickname of the recipient who
+ requested to reconnect to the game before.
Constructor: a message containing the nickname of the player who wants to reconnect to the game and the id of
+ the game the player requests to reconnect to.
Once the player receives the DrawCardMessage from the server, the method is called by processMessage to request
+ the player to draw a card from the deck.
If the RMIClientNode is not alive or this method is called for more than one time before the termination
+ of the reset and reconnection process, the method will return immediately.
Once the player receives the AssignedStarterCardMessage from the server, the method is called by processMessage
+ to request the player to select the side of the starter card they want to use.
Converts the given corners to an array of integers (of size 7) containing the number of occurrences of the 7
+ resources in the card corners. the array is order following the convention used for ObjectType
Given the card and the side, return an array of integer where at each position (according to the attribute
+ value of the enumeration ObjectType) is inserted the number of resources gained if the card is placed
+
+
resourcesSize - Static variable in class it.polimi.ingsw.am32.model.field.Field
The interface RMIClientAcceptorInt exposes the RMI methods that a
+ RMIClientNode instance can invoke on the server when the client hasn't
+ joined yet a game.
Each instance of class RMIServerNode handle une RMI connection with a client.
+ If, at some point, the connection were to go down, this instance while begin automatically a termination process
The root of the selection page, which is the page where the player can make a choice for the connection type,
+ the game mode and insert the data needed to create, join or reconnect to a game.
Once the player receives the AssignedSecretObjectiveCardMessage from the server, the method is called by
+ processMessage to request the player to select the secret objective card they want to use.
Once the player receives the AssignedSecretObjectiveCardMessage from the server, the method is called by
+ processMessage to request the player to select the secret objective card they want to use.
Method that sets the RMI client with the server URL entered by the player and attempts to establish the
+ connection between the client and the server.
Method that sets the socket client with the server IP and the server port entered by the player and attempts to
+ establish the connection between the client and the server.
After receiving the GameStarted message from the server, the method is called to set up the view of the players,
+ to load the images which will be used to set up the game view, to set up the player's data and call the method
+ setGameView to set the view of the game in the preparation phase.
After receiving the GameStarted message from the server, the method is called to set up the view of the player
+ and initialize the data and the boards of the players.
Print at the end of the match the final points of the players, the secret objective card of the players, and the
+ points gained from the objective card.
The start method override as required by the Application class:
+ it sets the primary stage of the application, the title, the minimum height and width, the scene and
+ the close request event when the user closes the application.
+
+
startCard - Variable in class it.polimi.ingsw.am32.client.View
+
+
The integer that represents the starting card ID of the player.
Once the player receives the DrawCardConfirmationMessage from the server, the method is called by processMessage
+ to update the hand of the player and print the message to notify the player that the card is added in the hand
+ successfully.
Once received the PlacedCardConfirmationMessage from the server, the method is called by processMessage to store
+ the card information, update the board of the player.
Method used to update the chat history of the player when a new message is received, add the message to the chat
+ history and print the chat history if the player is in the chat mode.
Once received the SecretObjCardConfirmationMessage from the server, the method is called by processMessage to
+ update the view of the player and print the message to notify the player that the secret objective card is selected
Once received the ConfirmedStarterCardSideSelectionMessage from the server, the method is called by processMessage to
+ update the view of the player and print the message to notify the player that the starter card is selected.
This abstract method is used to place the starter card on the field, update the information of the player's field
+ after placing the starter card, and set the player's colour.
Once the player receives the DeckSizeUpdateMessage from the server, the method is called by processMessage to
+ update the deck size and the current visible resource cards and gold cards in the game.
Once the player receives the MatchStatus message from the server, the method is called by processMessage to
+ update the match status of the player, and update the player of the current match status.
Once the player receives the MatchStatus message from the server, the method is called by processMessage to
+ update the match status of the player, and print the message to notify the player of the current match status.
Once the player receives the NewGameConfirmationMessage from the server, the method is called by processMessage
+ to store the gameID, the nickname of the player who created the game, and add it in the list of players.
Once the player receives the NewGameConfirmationMessage from the server, the method is called by processMessage
+ to store the gameID, the nickname of the player who created the game, and add it in the list of players.
Once the player receives the PlacedCardConfirmationMessage from the server, the method is called by processMessage
+ to store the card information, update the board of the player.
This method is called by processMessage to update the all data of the players in the game when the game enters
+ the playing phase or when the player reconnects to the game.
This method is called by processMessage to update the all data of the players in the game when the game enters
+ the playing phase or when the player reconnects to the game.
Once the player receives the LobbyPlayerList message from the server, the method is called by
+ processMessage, to update the player's list in the Lobby phase and print the player's list updated.
Once the player receives the LobbyPlayerList message from the server, the method is called by
+ processMessage, to update the player's list in the Lobby phase and print the player's list updated.
Once the player receives the PlayerTurnMessage from the server, the method is called by processMessage to update
+ the currentPlayer in the game and print the message to notify the player whose turn is now, also, the method
+ notifies players the order of the turn in the game.
Once the player receives the PlayerTurnMessage from the server, the method is called by processMessage to update
+ the currentPlayer in the game and print the message to notify the player whose turn is now, also, the method
+ notifies players the order of the turn in the game.
Invoking this method will result in the server using the content of the message to either create a new game and
+ add the sender as its first player or make him join an already existing one.
Calculate how many times the given objective card or gold card has been fulfilled based on its type of resources
+ (objects) and number of identical resources (objects).
Calculate how many times the L configuration is fulfilled in the player's field, where in the bottom right is a
+ Plant card, and in the left top found two Fungi cards.
Calculate how many times the L configuration is fulfilled in the player's field, where in the top left is an
+ Animal card, and in the right down found two Insect cards.
Chat() - Constructor for class it.polimi.ingsw.am32.chat.Chat
+
+
Constructs a new Chat with an empty history.
+
+
CHAT_ERROR - Enum constant in enum class it.polimi.ingsw.am32.client.Event
+
+
Indicates there was an error in the chat message.
+
+
chatArea - Variable in class it.polimi.ingsw.am32.client.view.gui.ChatArea
+
+
An object representing the chat area in the GUI
+
+
chatArea - Variable in class it.polimi.ingsw.am32.client.view.gui.GraphicalUI
+
+
The ChatArea object which contains the ComboBox object to select the player to send a private message, the text
+ field to write the message, the button to send the message and the scroll pane to show the messages.
Given the two arrays check if the values of the first array are greater or equal then those of the second array
+ in the same index for every position of the second array
The constructor of the class: it creates a new ConfirmSelectedSecretObjectiveCardMessage with the nickname
+ of the recipient who will receive the confirmation of the selected secret objective card and the id of the
+ secret objective card chosen by the player.
The constructor of the class: it creates a new confirmStarterCardSideSelectionMessage with the nickname of the
+ recipient who will receive the confirmation message for the selection of the starter card side, the id of the
+ starter card, the side of the starter card, the available spaces and the resources of the player in the field
+ after the placement of the starter card and the color identifier of the player in this game.
The root of the connection page, which contains the buttons to choose the connection type between socket and RMI
+ and the text fields to insert the IP address and the port number.
CountResource is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards and the gold cards, which count identical resources or objects visible in the play area (field)
+ of the player.
The constructor of the class: it creates a new DeckSizeUpdateMessage with the nickname of the recipient who will
+ receive the message to update the deck after the draw card action.
Diagonals is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which count 3 cards of the same kingdom on the diagonal line y=x or y=-x.
Method called when a player disconnects before the game has started, in the preparation phase such as
+ when players are choosing the side of their starter card.
The constructor of the class: it creates a new DrawCardConfirmationMessage with the nickname of the recipient who
+ will receive the confirmation and the cards in the player's hand after his draw card action.
The constructor of the class: it creates a new DrawCardFailedMessage with the nickname of the recipient who will
+ receive the message when his draw card action fails and the reason why the draw card action failed.
Empty is one of the classes that implement the PointStrategy interface used to calculate the
+ card whose placement returns always 1: all cards with a constant value regardless of other conditions.
+
+
Empty() - Constructor for class it.polimi.ingsw.am32.model.card.pointstrategy.Empty
+
+
EMPTY - Enum constant in enum class it.polimi.ingsw.am32.model.card.CornerType
+
+
Empty corner type indicates that the corner of the card is empty.
+
+
EMPTY - Static variable in class it.polimi.ingsw.am32.client.view.tui.TextUI
+
+
Empty space used to remain the layout of the printed cards
This class is used to manage the message sent by the server to the client when client's request to access the game,
+ to create a new game or to reconnect to a game is not successful.
This class is used to manage the message sent by the server to the client to notify the player that the game is
+ started, entering the preparation phase.
The constructor of the class: it creates a new GameStartedMessage with the nickname of the recipient who will
+ receive the message when the game enters the preparation phase.
The Method used to convert the integer array of the condition count of the card to a string of icons, using the
+ Unicode characters and added it in one string.
Method used to convert the type of the resource/object that stored in the array of requirements of the card or
+ in the array of the permanent resources of the card to an icon, using the Unicode characters.
The main class on the client side of the application.
+ Prompts the user to choose whether to play the game in GUI or TUI mode.
+ After the user has chosen, call the appropriate view object.
The game server is started through the method main(java.lang.String[]) included in this class.
+
+ This class main objective is managing the start the basic functions of the server
+ which includes the configs, the network protocols and the thread manager.
+
+ General description of the server:
+ The server includes the "model" and the "controller" parts of the MVC pattern.
+ At startup, an object Configuration is initialized containing all working parameters of the server.
+ Afterwards an instance of SKClientAcceptor and RMIClientAcceptor are created.
+ The first interaction of the client with the server is handled by one of the two classes written above and later on
+ the client communications will be handled by SKServerNode or
+ RMIServerNode.
+ The server and the client communicate through messages which are actual classes. Each message implements one of the
+ 3 interfaces: CtoSMessage,
+ CtoSLobbyMessage,
+ StoCMessage.
+ The server includes also a GamesManager (manages the creation
+ of new games and the access to those games by other players), a
+ GameController (manages all actions of the players on the game)
+ and a VirtualView (act as bridge in the communications from the
+ controller to the client).
+ Incoming messages are directly handled by SKServeNode or RMIServerNode, on the contrary every message
+ used to notify the client following a change in the model are given by the GameController to a
+ VirtualView which duty will be to send those messages.
+
+
+
+
+
+
+
+
+
Field Summary
+
Fields
+
+
Modifier and Type
+
Field
+
Description
+
private static final org.apache.logging.log4j.Logger
The Server class attempt to establish RMI and Socket connection acceptors.
+
+ Furthermore, an instance of Configuration is created using the extra parameters given in the constructor
+
+
Parameters:
+
args - are the parameters to be used for the Configuration class
This method is used to expose to the outside a socket to accept incoming connections.
+
+ Create an instance of SKClientAcceptor and submit it to the server ExecutorService
+
+
+
+
+
+
startRMIServer
+
+
privatevoidstartRMIServer()
+
This method is used to expose to the outside an invokable RMI interface.
+
+ Create the RMI Registry and an instance of RMIClientAcceptor, finally bind the latter to the former
This class represents a chat message in the system.
+ It contains the sender's nickname, the recipient's nickname, a flag indicating if the message is multicast,
+ and the content of the message.
public class MalformedMessageException
+extends RuntimeException
+
This class represents a custom exception that is thrown when a chat message is malformed.
+ A chat message could be considered malformed if it doesn't adhere to the expected format or structure.
+ This is a runtime exception, meaning it doesn't need to be declared in a method's or constructor's throws clause.
Constructs a new MalformedMessageException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
public record CardPlacedView(int ID, ArrayList<String> cardImage, int x, int y, boolean side)
+extends Record
+
It's a client-side cardPlaced class.
+ Use this class just to store the information of the card placed on the field, if the player wants to know the details
+ of the card placed on the field, through the information stored in this class, the player can know the ID of the card,
+ the x and y coordinates of the card and the side of the card.
Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. Reference components are compared with Objects::equals(Object,Object); primitive components are compared with '=='.
This class represents a chat message in the system.
+ It contains the sender's nickname, the recipient's nickname, a flag indicating if the message is multicast,
+ and the content of the message.
Identifiers for the preparation phase: the phase in which the players are selecting their starting card side and
+ secret objective card.
+ Associated with the number 1.
Identifiers for the playing phase: the phase in which the players place their cards on the field and draw new
+ cards if it is their turn.
+ Associated with the number 2.
Identifiers for the last turn phase: in which phase each player has one last turn to place a card on the field
+ without drawing a new card.
+ Associated with the number 4.
Indicates that the player has completed the selection of the card he wants to place on the field and the
+ coordinates where he wants to place it.
+ Associated with the number 30.
Indicates that the player is waiting for his turn to place a card on the field or the player is waiting for the
+ start of playing phase.
+ Associated with the number 32.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Use this class to create a Non-Objective card (Resource, Gold or Starting card) using the card data stored in the
+ JSON file, in the side of the client. In this way the client can have a copy of the cards that can be used to display
+ the cards in the UI.
PointStrategy - the strategy of the card to get the points
+
PointStrategyType - indicates which type of resource or object should be counted if the PointStrategy is
+ “CountResource”, for the other PointStrategy it is null
+
PointStrategyCount - indicates for “CountResource” card how many resources or objects should be counted to
+ get the points
+
Kingdom - indicates the kingdom which the card belongs
+
Corner - the array contains the corner's type of the card
+
CornerBack - the array contains the corner's type of the back side of the card
+
PermRes - the array contains the permanent resources of the card
+
ConditionCount - the array contains the requirements of the card that should be satisfied before the
+ placement.
This class is used to create the Non-Objective Cards from the JSON file, in the side of the client. In this way
+ the client can have a copy of the cards that can be used to display the cards in the UI.
publicObjectiveCardFactory(int ID,
+ int Value,
+ String PointStrategy,
+ String PointStrategyType,
+ int PointStrategyCount,
+ boolean PointStrategyLeftToRight)
+
This is the constructor of the class. It is used to create the cards from the JSON file.
+
+
Parameters:
+
ID - defines the ID of the card
+
Value - defines the value of the card
+
PointStrategy - defines the strategy of the card to get the points
+
PointStrategyType - indicates which type of resource or object should be counted if the PointStrategy is
+ “CountResource”, for the other PointStrategy it is null
+
PointStrategyCount - indicates for “CountResource” card how many resources or objects should be counted to
+ get the points
+
PointStrategyLeftToRight - for the “Diagonal” PointStrategy, it indicated the direction of the diagonal:
+ true for left to right y=x, false for right to left y=-x.
Use this class to store the player's public information that is shared with other players, which means that in this
+ class contains all the information that the player can request to know about the other players.
The View class is an abstract class that serves as a template for the views of the client. It contains common
+ properties and methods that all views should have.
+
+ The class provides abstract methods which are implemented by the concrete views. These methods are used to
+ display the game state to the player, and to request input from the player. The class also provides methods for
+ updating the game state and the player's information.
+
+ The class also provides methods for setting socket client and RMI client, and for notifying the ask listener.
This abstract method is used to update the player's hand after drawing a card.
+
+
abstract void
+
updateAfterPlacedCard(String playerNickname,
+ int cardID,
+ int x,
+ int y,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources,
+ int points)
+
+
This abstract method is used to update the player's field after placing a card.
This abstract method is used to place the starter card on the field, update the information of the player's field
+ after placing the starter card, and set the player's colour.
Stores the index of the card placed by the player.
+ When draw confirmation is received, the new card is injected into the hand at the index of the card placed.
This method is used to set up a socket client with the specified server IP and port.
+ Also, it creates a new thread to listen for messages from the client.
This method is used to set up an RMI client with the specified server IP and port.
+ Also, it creates a new thread to listen for messages from the client.
This abstract method is used to ask the player to select the game mode.
+
+
+
+
+
+
askCreateGame
+
+
public abstractvoidaskCreateGame()
+
This abstract method is used to ask the player to insert data to create a new game.
+
+
+
+
+
+
updateNewGameConfirm
+
+
public abstractvoidupdateNewGameConfirm(int gameID,
+ String recipientNickname)
+
This abstract method is used to update the game ID and the recipient's nickname after a new game is confirmed.
+
+
Parameters:
+
gameID - The ID of the game.
+
recipientNickname - The nickname of the recipient.
+
+
+
+
+
+
+
askJoinGame
+
+
public abstractvoidaskJoinGame()
+
This abstract method is used to ask the player to insert data to join a game.
+
+
+
+
+
+
askReconnectGame
+
+
public abstractvoidaskReconnectGame()
+
This abstract method is used to ask the player to insert data to reconnect to a game.
+
+
+
+
+
+
updatePlayerList
+
+
public abstractvoidupdatePlayerList(ArrayList<String> players)
+
This abstract method is used to update the list of players in the lobby.
+
+
Parameters:
+
players - The list of players.
+
+
+
+
+
+
+
setUpPlayersData
+
+
public abstractvoidsetUpPlayersData()
+
This abstract method is used to set up the player's data once the game is started entering the preparation phase.
+
+
+
+
+
+
updateMatchStatus
+
+
public abstractvoidupdateMatchStatus(int matchStatus)
+
This abstract method is used to update the status of the match when the match status is changed.
+
+
Parameters:
+
matchStatus - The current status of the match.
+
+
+
+
+
+
+
requestSelectStarterCardSide
+
+
public abstractvoidrequestSelectStarterCardSide(int ID)
+
This abstract method is used to request the player to select a side for the starter card.
+
+
Parameters:
+
ID - The ID of the starter card to be selected.
+
+
+
+
+
+
+
updateConfirmStarterCard
+
+
public abstractvoidupdateConfirmStarterCard(int colour,
+ int cardID,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources)
+
This abstract method is used to place the starter card on the field, update the information of the player's field
+ after placing the starter card, and set the player's colour.
+
+
Parameters:
+
colour - The colour of the player selected randomly by the server.
+
cardID - The ID of the starter card.
+
isUp - The side of the starter card selected by the player.
+
availablePos - The available positions after placing the starter card.
+
resources - The resources of the player after placing the starter card.
+
+
+
+
+
+
+
requestDrawCard
+
+
public abstractvoidrequestDrawCard()
+
This abstract method is used to request the player to draw a card.
This abstract method is used to update the player's hand after drawing a card.
+
+
Parameters:
+
hand - The player's hand after drawing a card.
+
+
+
+
+
+
+
updateDeck
+
+
public abstractvoidupdateDeck(int resourceDeckSize,
+ int goldDeckSize,
+ int[] currentResourceCards,
+ int[] currentGoldCards,
+ int resourceDeckFace,
+ int goldDeckFace)
+
This abstract method is used to update the deck after drawing a card.
+
+
Parameters:
+
resourceDeckSize - The size of the resource deck.
+
goldDeckSize - The size of the gold deck.
+
currentResourceCards - The current resource cards.
This abstract method is used to convert an integer of colour received from the server to a string of colour.
+
+
Parameters:
+
colour - The colour received from the server.
+
Returns:
+
the string of colour corresponding to the integer of colour.
+
+
+
+
+
+
+
handleFailureCase
+
+
public abstractvoidhandleFailureCase(Event event,
+ String reason)
+
This abstract method is used to handle a failure case when receiving a failure message from the server.
+
+
Parameters:
+
event - The event type that caused the failure.
+
reason - The reason for the failure.
+
+
+
+
+
+
+
startChatting
+
+
public abstractvoidstartChatting()
+
This abstract method is used to start a chat mode.
+
+
+
+
+
+
showDeck
+
+
public abstractvoidshowDeck()
+
This abstract method is used to show the deck.
+
+
+
+
+
+
showHelpInfo
+
+
public abstractvoidshowHelpInfo()
+
This abstract method is used to show the useful information of the game to the player.
+
+
+
+
+
+
requestSelectSecretObjectiveCard
+
+
public abstractvoidrequestSelectSecretObjectiveCard()
+
This abstract method is used to request the player to select a secret objective card.
+
+
+
+
+
+
updateConfirmSelectedSecretCard
+
+
public abstractvoidupdateConfirmSelectedSecretCard(int chosenSecretObjectiveCard)
+
This abstract method is used to save the player's secret objective card after selecting a secret objective card.
+
+
Parameters:
+
chosenSecretObjectiveCard - The ID of the secret objective card selected by the player.
+
+
+
+
+
+
+
requestPlaceCard
+
+
public abstractvoidrequestPlaceCard()
+
This abstract method is used to request the player to place a card.
+
+
+
+
+
+
updateAfterPlacedCard
+
+
public abstractvoidupdateAfterPlacedCard(String playerNickname,
+ int cardID,
+ int x,
+ int y,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources,
+ int points)
+
This abstract method is used to update the player's field after placing a card.
+
+
Parameters:
+
playerNickname - The nickname of the player who placed the card.
+
cardID - The ID of the card placed.
+
x - The x coordinate of the card placed.
+
y - The y coordinate of the card placed.
+
isUp - The side of the card placed.
+
availablePos - The available positions after placing the card.
+
resources - The resources of the player after placing the card.
+
points - The points of the player after placing the card.
public class MalformedMessageException
+extends RuntimeException
+
This class represents a custom exception that is thrown when a chat message is malformed.
+ A chat message could be considered malformed if it doesn't adhere to the expected format or structure.
+ This is a runtime exception, meaning it doesn't need to be declared in a method's or constructor's throws clause.
Constructs a new MalformedMessageException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a required JSON file is missing.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new MissingJSONException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the
+ Throwable.getMessage() method.
Used to manage the messages that are sent to the server.
+ Stays in a loop and waits for messages to be added to the queues (according to their type).
+ When a new message is added, it sends it to the server through the clientNode.
Processes the messages in the queues.
+ The method will keep running until both queues are empty.
+ If the queues are empty, the method will wait until a message is added to one of the queues.
+
+
+
+
+
+
processRegularMessage
+
+
privatevoidprocessRegularMessage()
+
Send the regular messages to the server.
+ The method will keep running until the message queue is empty.
+ If the queue is empty, the method will return.
+
+
+
+
+
+
processLobbyMessages
+
+
privatevoidprocessLobbyMessages()
+
Send the lobby messages to the server.
+ The method will keep running until the lobbyMessage queue is empty.
+ If the queue is empty, the method will return.
Interface for the AskListener class: used to manage the messages that clients want to send to the server.
+ Listens for messages to be added to the queues (according to their type).
+ There are two queues: one for CtoSMessage and one for CtoSLobbyMessage.
Use this class to create a Non-Objective card (Resource, Gold or Starting card) using the card data stored in the
+ JSON file, in the side of the client.
Use this class to store the player's public information that is shared with other players, which means that in this
+ class contains all the information that the player can request to know about the other players.
This class represents the chat area in the GUI.
+ It contains the message display area, the message input area, and the submit button.
+ It also contains a combo box that allows the user to select a recipient for the message.
Adds an incoming message to the chat area send from another player.
+ The message is appended to the end of the message display area.
+ Called by outside classes to add messages to the chat area.
+
+
Parameters:
+
message - The message to be added.
+
senderNickname - The nickname of the player who sent the message.
+
+
+
+
+
+
+
submitChatMessage
+
+
privatevoidsubmitChatMessage()
+
Submits a message to the chat area, and send it to the appropriate player.
+ The message is taken from the input field, and added to the message display area.
+ Called when the user clicks the submit button.
+
+
+
+
+
+
setActive
+
+
publicvoidsetActive(boolean active)
+
Sets the chat area to active or inactive.
+
+
Parameters:
+
active - True if the chat area should be active, false otherwise
The class GraphicalUI is the class that manages the graphical user interface of the game and interacts with the
+ GUIApplication class. The class extends the abstract class View and implements the methods of the View class.
+
+ The class contains the methods to set up the pages which are shown to the player and the methods to update the
+ components of the GUI when the player makes an action or receives a message that requires an update of the GUI.
+ In addition, the class uses CurrentEvent and Status to manage the state of the game in this way to control the
+ flow of the game and the actions that the player can do.
+
+ To interact with the GUIApplication class, the class contains the reference of the GUIApplication class and
+ through this reference using the Platform.runLater method, the class can update the scene of the GUIApplication
+ class and show the changes updated in the GUI.
+
+ For the implementation of the GUI, the class uses the JavaFX library to create the components, images,
+ and animations of the GUI while CSS is used to set the style of the components.
The reference of the GUIApplication class which is used to connect the GUI with the GUIApplication class in able
+ to update the scene based on the changes made in the GUI.
The ChatArea object which contains the ComboBox object to select the player to send a private message, the text
+ field to write the message, the button to send the message and the scroll pane to show the messages.
The root of the connection page, which contains the buttons to choose the connection type between socket and RMI
+ and the text fields to insert the IP address and the port number.
The root of the selection page, which is the page where the player can make a choice for the connection type,
+ the game mode and insert the data needed to create, join or reconnect to a game.
Once the player receives the AssignedSecretObjectiveCardMessage from the server, the method is called by
+ processMessage to request the player to select the secret objective card they want to use.
After receiving the GameStarted message from the server, the method is called to set up the view of the players,
+ to load the images which will be used to set up the game view, to set up the player's data and call the method
+ setGameView to set the view of the game in the preparation phase.
Method called by the processMessage after receiving confirmation from the server that the card was drawn successfully.
+
+
void
+
updateAfterPlacedCard(String playerNickname,
+ int cardID,
+ int x,
+ int y,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources,
+ int points)
+
+
Updates the player's data after a card has been placed.
Once the player receives the MatchStatus message from the server, the method is called by processMessage to
+ update the match status of the player, and update the player of the current match status.
Once the player receives the NewGameConfirmationMessage from the server, the method is called by processMessage
+ to store the gameID, the nickname of the player who created the game, and add it in the list of players.
+
+
void
+
updatePlacedCardConfirm(String playerNickname,
+ int placedCard,
+ int[] placedCardCoordinates,
+ boolean placedSide,
+ int playerPoints,
+ int[] playerResources,
+ ArrayList<int[]> newAvailableFieldSpaces)
+
+
Method called by the processMessage to update the player's field after receiving confirmation from the server that the card placement was successful.
This method is called by processMessage to update the all data of the players in the game when the game enters
+ the playing phase or when the player reconnects to the game.
Once the player receives the LobbyPlayerList message from the server, the method is called by
+ processMessage, to update the player's list in the Lobby phase and print the player's list updated.
Once the player receives the PlayerTurnMessage from the server, the method is called by processMessage to update
+ the currentPlayer in the game and print the message to notify the player whose turn is now, also, the method
+ notifies players the order of the turn in the game.
+
+
void
+
updateRollback(String playerNickname,
+ int removedCard,
+ int playerPoints,
+ int[] playerResources)
+
+
Method used to update the player's board and public info when the player disconnects from the game after the
+ placement of the card.
+
+
+
+
+
+
Methods inherited from class it.polimi.ingsw.am32.client.View
The reference of the GUIApplication class which is used to connect the GUI with the GUIApplication class in able
+ to update the scene based on the changes made in the GUI.
+
+
+
+
+
+
welcomeRoot
+
+
privatejavafx.scene.layout.StackPanewelcomeRoot
+
The root of the welcome page, which is the first page of the GUI shown to the player.
+
+
+
+
+
+
selectionPane
+
+
privatejavafx.scene.layout.StackPaneselectionPane
+
The root of the selection page, which is the page where the player can make a choice for the connection type,
+ the game mode and insert the data needed to create, join or reconnect to a game.
The root of the connection page, which contains the buttons to choose the connection type between socket and RMI
+ and the text fields to insert the IP address and the port number.
+
+
+
+
+
+
waitingRoot
+
+
privatejavafx.scene.layout.StackPanewaitingRoot
+
The root of the waiting page, which is the page shown to the player once the player creates a new game or joins
+ an existing game successfully. The page contains the game ID, the list of players in the lobby and updates the
+ list of players when a new player joins the game or a player leaves the game.
+
+
+
+
+
+
masterPane
+
+
privatejavafx.scene.layout.PanemasterPane
+
The base pane of the GUI which contains the components of the game view from the preparation phase to the end of
+ the game. The master pane contains the player's info panel, the top line panel, the board of the players, the
+ chat area, the notice area, the event label, the deck area. The master pane is updated based on the current event
+ and the status of the game by changing the components of the master pane.
+
+
+
+
+
+
endGamePane
+
+
privatejavafx.scene.layout.PaneendGamePane
+
The pane of the end game page which is shown to the player once the game ends. The end game page contains the
+ final score of the players and the winner of the game.
The TextField object which contains the list of players in the lobby. The list is updated when a new player joins
+ the game or a player leaves the game. The list is shown in the waiting page.
+
+
+
+
+
+
matchStatus
+
+
privatejavafx.scene.control.LabelmatchStatus
+
The Label object that shows the status of the game after the login phase. The status can be PREPARATION, PLAYING,
+ TERMINATING, TERMINATED. The status is updated based on the messages received from the server. The label is shown
+ in the top line panel of the master pane.
+
+
+
+
+
+
playerOrder
+
+
privatejavafx.scene.layout.HBoxplayerOrder
+
The HBox object which contains the order of the players in the game. The order is updated once the game turns
+ to the playing phase. The order is shown in the top line panel of the master pane.
+
+
+
+
+
+
goldSize
+
+
privatejavafx.scene.control.LabelgoldSize
+
The Label object that indicates the current size of the gold deck. The size is updated when a player takes a card
+ from the gold deck. The label is shown in the deck area of the master pane.
+
+
+
+
+
+
resourceSize
+
+
privatejavafx.scene.control.LabelresourceSize
+
The Label object that indicates the current size of the resource deck. The size is updated when a player takes a card
+ from the resource deck. The label is shown in the deck area of the master pane.
An array of ImageView objects containing the images of the cards in the resource deck. In the zero index stores
+ the image of the top card of the deck. In the other indexes contains the image of the front side of the visible
+ cards of the resource type.
+
+
+
+
+
+
goldDeckView
+
+
privatejavafx.scene.image.ImageView[]goldDeckView
+
An array of ImageView objects containing the images of the cards in the gold deck. In the zero index stores
+ the image of the top card of the deck. In the other indexes contains the image of the front side of the visible
+ cards of the gold type.
+
+
+
+
+
+
deckArea
+
+
privatejavafx.scene.layout.VBoxdeckArea
+
The VBox object containing the array of ImageView objects of the resource deck and the gold deck.
An array of ImageView objects containing the common objective card selected for this match. The card is shown in the player's hand area.
+
+
+
+
+
+
handView
+
+
privatejavafx.scene.image.ImageView[]handView
+
An array of ImageView objects containing the images of the cards in the player's hand.
+
+
+
+
+
+
handViewCardSide
+
+
privateboolean[]handViewCardSide
+
An array of booleans indicating whether the card in the player's hand is being viewed front side or back side.
+
+
+
+
+
+
selectedCardId
+
+
privateintselectedCardId
+
ID of card selected for placement on the field by player.
+ Set to 0 when no card is selected.
+
+
+
+
+
+
notice
+
+
privatejavafx.scene.layout.VBoxnotice
+
A VBox object containing the list of the notice messages shown to the player during the game.
+
+
+
+
+
+
noticeEventPanel
+
+
privatejavafx.scene.GroupnoticeEventPanel
+
The Group object used to show the important events of the game. The content of the noticeEventPanel is updated
+ by the eventLabel. The noticeEventPanel is visible in the notice area of the master pane when is the player's
+ turn to place a card or draw a card.
+
+
+
+
+
+
eventLabel
+
+
privatejavafx.scene.control.LabeleventLabel
+
The content of the noticeEventPanel which contains the important events of the game. The content is updated
+ based on the turn of the player and the actions of the players.
HashMap containing the public information of the players and the key is the nickname of the player. The public
+ information contains the label of the player's nickname, the image view of the player's colour, the label of the
+ player's points, the array of labels of the player's resources.
HashMap containing the resources of images which are frequently used in the GUI. The key is the name given to the
+ image and the value is the image object.
HashMap containing the stack pane of the player's field and the key is the nickname of the player. The stack pane
+ contains the cards placed on the field of the player and the field will be updated every time a player places a
+ card on the field. The stack pane is shown in the board area of the master pane.
+
+
+
+
+
+
board
+
+
privatejavafx.scene.control.ScrollPaneboard
+
The ScrollPane object containing the stack pane as the content of the board area. The stack pane presents the
+ player's field and the field is updated every time a player places a card on the field.
+
+
+
+
+
+
returnToMyField
+
+
privatejavafx.scene.control.ButtonreturnToMyField
+
The Button object used to return to the player's field when the player are viewing the field of another player.
The ChatArea object which contains the ComboBox object to select the player to send a private message, the text
+ field to write the message, the button to send the message and the scroll pane to show the messages.
+ In the chat area, the player can select the player to send a private message and send a message to all the
+ players in the game.
+
+
+
+
+
+
glow
+
+
private finaljavafx.scene.effect.Glowglow
+
The style of the glow effect used in the show methods.
Set the connection between the GUI and the GUIApplication. In this way the GUI can update the scene of the
+ GUIApplication using the reference of the GUIApplication and the methods of the GUIApplication.
+
+
Parameters:
+
app - The GUIApplication with which the GUI will be connected.
Set up the rule book of the game. The player can navigate through the pages of the rule book using the buttons
+ “invalid input: '<'” to go to the previous page and “>” to go to the next page.
Set the page where the player can select the game mode. The player can choose between creating a new game, joining
+ an existing game or reconnecting to a game. The player can choose the game mode using the buttons “New Game”, “Join
+ Game” and “Reconnect”.
Handle the click on the confirmation button of the join game and reconnect game page. The method checks if the
+ nickname is valid and the game ID is a number. If the nickname is valid and the game ID is a number, the method
+ generates the AccessGameMessage or the ReconnectGameMessage based on the current event and notifies the listener.
+
+
Parameters:
+
nickname - the text field where the player inserts the nickname.
+
accessID - the text field where the player inserts the game ID.
Once the player receives the NewGameConfirmationMessage from the server, the method is called by processMessage
+ to store the gameID, the nickname of the player who created the game, and add it in the list of players.
+ In addition, the method sets the currentEvent to WAITING_FOR_START and the Status to LOBBY, then it creates the
+ waiting page where the player can see the gameID and the list of players who joined the game.
Once the player receives the LobbyPlayerList message from the server, the method is called by
+ processMessage, to update the player's list in the Lobby phase and print the player's list updated.
players - the list updated of players in the game.
+
+
+
+
+
+
+
setUpPlayersData
+
+
publicvoidsetUpPlayersData()
+
After receiving the GameStarted message from the server, the method is called to set up the view of the players,
+ to load the images which will be used to set up the game view, to set up the player's data and call the method
+ setGameView to set the view of the game in the preparation phase.
Set the view of the game once the game enters the playing phase. The method sets the master pane, the player info
+ panel, the top line panel, the board area, the notification area, the hand area and the chat area.
+ The player info panel contains the player's nickname, the player's score, the player's resources and the player's
+ colour. The top line panel contains the game ID, the status of the match, the player order, the rules button and
+ the help button. The board area is used to show the player's field. The notification area is used to show the
+ notifications of the game. The hand area contains the common objective cards, secret objective cards and the
+ hand cards of the player. The chat area lets the player send messages to the other players and view the messages
+ received.
Method create VBox to store the player's info area. The player's info area contains the player's nickname, the
+ player's score, the player's resources and the player's colour.
Create the top line panel of the master pane. The top line panel contains the label indicating the nickname of
+ thisPlayer, the game ID, the status of the match, the player order, the rules button and the help button.
+
+
Returns:
+
the HBox which contains the components needed.
+
+
+
+
+
+
+
createDeckArea
+
+
privatejavafx.scene.layout.VBoxcreateDeckArea()
+
Method create the deck area of the player. The deck area contains the resource deck and the gold deck. The player
+ can draw a card from the deck by clicking on the card in the deck.
+
+
Returns:
+
the VBox which contains the array of the resource deck and the gold deck.
Method create the bottom line panel of the master pane. The bottom line panel contains the common objective cards,
+ the secret objective cards and the hand cards of the player.
+
+
Returns:
+
the HBox which contains the components needed.
+
+
+
+
+
+
+
createNoticeEventPanel
+
+
privatejavafx.scene.GroupcreateNoticeEventPanel()
+
Method create the notification event panel. The notification event panel is used to notify the player that it's
+ his turn to play.
+
+
Returns:
+
the Group which contains the notification panel and the label of the content of the notification.
Method set the click action of the player's field. The player can zoom in/out the field using the mouse wheel
+ and move the field using the drag action.
Method set the click action of the player's nickname. The player can see the field of the player that he wants
+ to see by clicking on the nickname of the player.
+
+
Parameters:
+
player - the nickname of the player that thisPlayer wants to see the field.
+
+
+
+
+
+
+
handleDeckCardsClicks
+
+
privatevoidhandleDeckCardsClicks(javafx.scene.image.ImageView cardView,
+ int cardID,
+ int cardType)
+
Method set the click action of the cards in the deck. The player can draw a card from the deck by clicking on the
+ card in the deck.
+
+
Parameters:
+
cardView - the view of the card in the deck.
+
cardID - the ID of the card.
+
cardType - the type of the deck where the card is drawn.
+
+
+
+
+
+
+
handleDeckClicks
+
+
privatevoidhandleDeckClicks()
+
Method to set the click action of the cards in the drawing area.
+
+
+
+
+
+
handleHandClicks
+
+
privatevoidhandleHandClicks()
+
Method to set the click action of the cards in the hand.
+
+
+
+
+
+
updateMatchStatus
+
+
publicvoidupdateMatchStatus(int matchStatus)
+
Once the player receives the MatchStatus message from the server, the method is called by processMessage to
+ update the match status of the player, and update the player of the current match status.
+ If the match status is TERMINATING, the method is called to show the points of all players in the game with
+ a pop-up window.
Once the player receives the PlayerTurnMessage from the server, the method is called by processMessage to update
+ the currentPlayer in the game and print the message to notify the player whose turn is now, also, the method
+ notifies players the order of the turn in the game.
playerNickname - the nickname of the player who should be able to place the card and draw card in the field.
+
+
+
+
+
+
+
updatePlayerData
+
+
publicvoidupdatePlayerData(ArrayList<String> playerNicknames,
+ ArrayList<Boolean> playerConnected,
+ ArrayList<Integer> playerColours,
+ ArrayList<Integer> playerHand,
+ int playerSecretObjective,
+ int[] playerPoints,
+ ArrayList<ArrayList<int[]>> playerFields,
+ int[] playerResources,
+ ArrayList<Integer> gameCommonObjectives,
+ ArrayList<Integer> gameCurrentResourceCards,
+ ArrayList<Integer> gameCurrentGoldCards,
+ int gameResourcesDeckSize,
+ int gameGoldDeckSize,
+ int matchStatus,
+ ArrayList<String[]> chatHistory,
+ String currentPlayer,
+ ArrayList<int[]> newAvailableFieldSpaces,
+ int resourceCardDeckFacingKingdom,
+ int goldCardDeckFacingKingdom,
+ ArrayList<int[]> playersResourcesSummary,
+ ArrayList<Integer> playerAssignedSecretObjectiveCards,
+ int playerStartingCard)
+
This method is called by processMessage to update the all data of the players in the game when the game enters
+ the playing phase or when the player reconnects to the game.
Once the player receives the AssignedSecretObjectiveCardMessage from the server, the method is called by
+ processMessage to request the player to select the secret objective card they want to use. In addition, the
+ method is called to update the player's hand cards and the common objective cards of the game.
recipientString - the nickname of the recipient of the message
+
senderNickname - the nickname of the sender of the message
+
content - the content of the message
+
+
+
+
+
+
+
setStarterCard
+
+
publicvoidsetStarterCard(int cardId)
+
Called when the player receives the starting card id from the server.
+ Saves the received starting card, and calls other methods to display card side selection
privatevoidhandleAvailableSpaceClick(javafx.scene.image.ImageView availableSpace,
+ int x,
+ int y)
+
Method set to handle the click action of the available space in the field.
+ When a player clicks on the available space, the method notifies the listener to place the card in the field.
+
+
Parameters:
+
availableSpace - the image view of the available space the player has clicked on
+
x - the x coordinate of the available space (field coordinates)
+
y - the y coordinate of the available space (field coordinates)
+
+
+
+
+
+
+
updateAfterPlacedCard
+
+
publicvoidupdateAfterPlacedCard(String playerNickname,
+ int cardID,
+ int x,
+ int y,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources,
+ int points)
+
Updates the player's data after a card has been placed.
public class GraphicalUIApplication
+extends javafx.application.Application
+
The GraphicalUIApplication class extends the Application class from JavaFX. It interacts with the GraphicalUI
+ class to display the graphical user interface to the user.
+
+
+
+
+
+
+
+
Nested Class Summary
+
+
Nested classes/interfaces inherited from class javafx.application.Application
The start method override as required by the Application class:
+ it sets the primary stage of the application, the title, the minimum height and width, the scene and
+ the close request event when the user closes the application.
+
+
void
+
updateScene(javafx.scene.Parent parent,
+ int x,
+ int y)
+
+
The method that updates the scene of the primary stage by setting a new scene.
+
+
+
+
+
+
Methods inherited from class javafx.application.Application
The start method override as required by the Application class:
+ it sets the primary stage of the application, the title, the minimum height and width, the scene and
+ the close request event when the user closes the application.
+
+
Specified by:
+
start in class javafx.application.Application
+
Parameters:
+
primaryStage - the primary stage of the application
This class is used to store the components of javafx that are used to display the player's information in the
+ game. The class is used by the GraphicalUI class to display and update the player's information.
This class is used to store the components of the board that are used to display the board in the terminal.
+ The class is used by the TextUI class to display and update the board.
The constructor of the class that initializes the board view with the given parameters.
+
+
Parameters:
+
limits - The array of integers that stores the limits of the board
+ which are used to set the dimensions of the board that is printed on the terminal.
+
board - the array of strings that stores the information of the board that is printed on the terminal.
+
+
+
+
+
+
+
+
+
+
+
Method Details
+
+
+
+
getLimits
+
+
publicint[]getLimits()
+
The getter method for the array of integers that stores the limits of the board.
Class TextUI is a one of the two User Interface of the game that allows the player to interact with the game, which
+ is a text-based interface. It extends the abstract View class.
+
+ The class includes the following methods, which could be divided into three categories: connection, flow of the
+ game, and design of printed elements. The connection methods are used to establish the connection between the
+ client and the server. The flow of the game methods is used to manage the game's flow, such as creating a new
+ game, joining a game, and reconnecting to a game etc. The design methods are used to print the game's elements,
+ for example, how to print the cards.
+ To simplify the code, the class includes a method to check the input of the player, a method to clear the command
+ line, and a method to handle the events. Finally, the class includes a method to update the view and a method to
+ notify the listener the new message generated by the player's action.
+
+ For the connection, the class includes a method to choose the connection type, a method to set the socket client
+ and a method to set the RMI client. Also, the class uses the IsValid class to check the validity of the
+ IP address and the port number entered by the player.
+ For the design of the cards, the class includes a method to print the card, a method to convert the corner type
+ of the card to an icon and a method to convert the object type of the card to an icon as well. The class uses
+ Unicode characters to represent the icons of the cards and the objects. In addition, the class
+ includes ASCII escape codes to set the color of the printed cards and the printed text.
+
By the playing phase, players also have the possibility to interact with the chat and use the keyword to interact
+ with the game, for example, type “SH” to show the hand of the player.
The Method used to convert the integer array of the condition count of the card to a string of icons, using the
+ Unicode characters and added it in one string.
Method used to convert the type of the resource/object that stored in the array of requirements of the card or
+ in the array of the permanent resources of the card to an icon, using the Unicode characters.
A thread that reads the input from the player when it is not the player's turn will be started when the game
+ enters the playing phase, if the player is the current player, the thread will be waiting until the message
+ PlayerTurnMessage from the server to update the currentPlayer in the game.
Once the player receives the DrawCardMessage from the server, the method is called by processMessage to request
+ the player to draw a card from the deck.
Once the player receives the AssignedStarterCardMessage from the server, the method is called by processMessage
+ to request the player to select the side of the starter card they want to use.
Once the player receives the AssignedSecretObjectiveCardMessage from the server, the method is called by
+ processMessage to request the player to select the secret objective card they want to use.
Method that sets the RMI client with the server URL entered by the player and attempts to establish the
+ connection between the client and the server.
Method that sets the socket client with the server IP and the server port entered by the player and attempts to
+ establish the connection between the client and the server.
After receiving the GameStarted message from the server, the method is called to set up the view of the player
+ and initialize the data and the boards of the players.
Print at the end of the match the final points of the players, the secret objective card of the players, and the
+ points gained from the objective card.
Once the player receives the DrawCardConfirmationMessage from the server, the method is called by processMessage
+ to update the hand of the player and print the message to notify the player that the card is added in the hand
+ successfully.
+
+
void
+
updateAfterPlacedCard(String playerNickname,
+ int cardID,
+ int x,
+ int y,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources,
+ int points)
+
+
Once received the PlacedCardConfirmationMessage from the server, the method is called by processMessage to store
+ the card information, update the board of the player.
Method used to update the chat history of the player when a new message is received, add the message to the chat
+ history and print the chat history if the player is in the chat mode.
Once received the SecretObjCardConfirmationMessage from the server, the method is called by processMessage to
+ update the view of the player and print the message to notify the player that the secret objective card is selected
Once received the ConfirmedStarterCardSideSelectionMessage from the server, the method is called by processMessage to
+ update the view of the player and print the message to notify the player that the starter card is selected.
+
+
void
+
updateDeck(int resourceDeckSize,
+ int goldDeckSize,
+ int[] currentResourceCards,
+ int[] currentGoldCards,
+ int resourceDeckFace,
+ int goldDeckFace)
+
+
Once the player receives the DeckSizeUpdateMessage from the server, the method is called by processMessage to
+ update the deck size and the current visible resource cards and gold cards in the game.
Once the player receives the MatchStatus message from the server, the method is called by processMessage to
+ update the match status of the player, and print the message to notify the player of the current match status.
Once the player receives the NewGameConfirmationMessage from the server, the method is called by processMessage
+ to store the gameID, the nickname of the player who created the game, and add it in the list of players.
+
+
void
+
updatePlacedCardConfirm(String playerNickname,
+ int placedCard,
+ int[] placedCardCoordinates,
+ boolean placedSide,
+ int playerPoints,
+ int[] playerResources,
+ ArrayList<int[]> newAvailableFieldSpaces)
+
+
Once the player receives the PlacedCardConfirmationMessage from the server, the method is called by processMessage
+ to store the card information, update the board of the player.
This method is called by processMessage to update the all data of the players in the game when the game enters
+ the playing phase or when the player reconnects to the game.
Once the player receives the LobbyPlayerList message from the server, the method is called by
+ processMessage, to update the player's list in the Lobby phase and print the player's list updated.
Once the player receives the PlayerTurnMessage from the server, the method is called by processMessage to update
+ the currentPlayer in the game and print the message to notify the player whose turn is now, also, the method
+ notifies players the order of the turn in the game.
+
+
void
+
updateRollback(String playerNickname,
+ int removedCard,
+ int playerPoints,
+ int[] playerResources)
+
+
The Method used to update the player's board and public info when the player disconnects from the game after the
+ placement of the card.
+
+
+
+
+
+
Methods inherited from class it.polimi.ingsw.am32.client.View
An object used as a lock for the shared getInput() method
+
+
+
+
+
+
isDisconnected
+
+
private volatilebooleanisDisconnected
+
A boolean that represents if the TUI is disconnected from the server.
+
+
+
+
+
+
canAttemptReconnection
+
+
private volatilebooleancanAttemptReconnection
+
A boolean that represents if the TUI can be reconnected to the server.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
TextUI
+
+
publicTextUI()
+
Constructor of the class TextUI
+
+
+
+
+
+
+
+
+
+
Method Details
+
+
+
+
launch
+
+
publicvoidlaunch()
+
Method that launches the TextUI and manages the flow of the game. It shows the welcome message and asks
+ the player to choose the connection type, then asks the player to select the game mode: create a new
+ game, join a game with the game ID, or reconnect to a game. Then use a loop to manage the flow of the game based
+ on the updated status and the current event.
Method that allows the player to choose the connection type, either socket or RMI. The method asks the player to
+ insert the server IP and the server port if the player chooses the socket connection. If the player chooses the
+ RMI connection, the method asks the player to insert the server URL.
+ The method uses the IsValid class to check the validity of the IP address and the port number entered by
+ the player.
Method used to ask the player the correct IP address associated with the current machine.
+ If the list of IPv4 addresses is empty, the method will return "127.0.0.1" aka localhost.
+
+
Returns:
+
The correct IPv4 address associated with the current machine
Method that sets the socket client with the server IP and the server port entered by the player and attempts to
+ establish the connection between the client and the server.
Method that sets the RMI client with the server URL entered by the player and attempts to establish the
+ connection between the client and the server.
The method prints the menu of the game mode and asks the player to select the action to perform. The player can
+ create a new game, join a game with the game ID, or reconnect to a game.
Method that asks the player to insert the nickname they want to use in the game.
+ Nickname limited to 20 characters.
+
+
+
+
+
+
askCreateGame
+
+
publicvoidaskCreateGame()
+
Method that asks the player to insert the number of players and the nickname desired to create a new game.
+ Then notify the listener with the NewGameMessage.
Method that asks the player to insert the nickname they want to use in the game and the Access ID of the game
+ they want to join. Then notify the listener with the AccessGameMessage.
Once the player receives the NewGameConfirmationMessage from the server, the method is called by processMessage
+ to store the gameID, the nickname of the player who created the game, and add it in the list of players.
Once the player receives the LobbyPlayerList message from the server, the method is called by
+ processMessage, to update the player's list in the Lobby phase and print the player's list updated.
playerNickname - the nickname of the player whose board should be updated with the rollback
+
removedCard - the ID of the card that should be removed from the board and the public info of the player
+
playerPoints - the points of the player after the rollback
+
playerResources - the resources of the player after the rollback
+
+
+
+
+
+
+
setUpPlayersData
+
+
publicvoidsetUpPlayersData()
+
After receiving the GameStarted message from the server, the method is called to set up the view of the player
+ and initialize the data and the boards of the players.
Once the player receives the MatchStatus message from the server, the method is called by processMessage to
+ update the match status of the player, and print the message to notify the player of the current match status.
+ And if the match status is TERMINATING, the method is called to show the points of all players in the game.
+ One time the match status is PLAYING, the method is called to start the readInputThread to get the input from
+ the player when it is not the player's turn.
matchStatus - the current match status received from the server
+
+
+
+
+
+
+
requestSelectStarterCardSide
+
+
publicvoidrequestSelectStarterCardSide(int ID)
+
Once the player receives the AssignedStarterCardMessage from the server, the method is called by processMessage
+ to request the player to select the side of the starter card they want to use. The player will be able to see
+ the front and back side of the card and select the side they want to use.
Once received the ConfirmedStarterCardSideSelectionMessage from the server, the method is called by processMessage to
+ update the view of the player and print the message to notify the player that the starter card is selected.
Once the player receives the AssignedSecretObjectiveCardMessage from the server, the method is called by
+ processMessage to request the player to select the secret objective card they want to use. The player will be
+ able to see the front and back side of the card and select the card they want to use. Also, the player will be
+ able to see the common objective cards and three cards received from the server with this message.
cardId - the ID of the starter card received from the server.
+
+
+
+
+
+
+
requestSelectSecretObjectiveCard
+
+
publicvoidrequestSelectSecretObjectiveCard()
+
When the current event is SELECT_SECRET_OBJ_CARD, the method is called to request the player to select the secret
+ objective card they want to use. The player will be able to see the two secret objective cards received from the
+ server and select the card they want to use.
Once received the SecretObjCardConfirmationMessage from the server, the method is called by processMessage to
+ update the view of the player and print the message to notify the player that the secret objective card is selected
chosenSecretObjectiveCard - the ID of the secret objective card selected by the player.
+
+
+
+
+
+
+
updatePlayerData
+
+
publicvoidupdatePlayerData(ArrayList<String> playerNicknames,
+ ArrayList<Boolean> playerConnected,
+ ArrayList<Integer> playerColours,
+ ArrayList<Integer> playerHand,
+ int playerSecretObjective,
+ int[] playerPoints,
+ ArrayList<ArrayList<int[]>> playerFields,
+ int[] playerResources,
+ ArrayList<Integer> gameCommonObjectives,
+ ArrayList<Integer> gameCurrentResourceCards,
+ ArrayList<Integer> gameCurrentGoldCards,
+ int gameResourcesDeckSize,
+ int gameGoldDeckSize,
+ int matchStatus,
+ ArrayList<String[]> chatHistory,
+ String currentPlayer,
+ ArrayList<int[]> newAvailableFieldSpaces,
+ int resourceCardDeckFacingKingdom,
+ int goldCardDeckFacingKingdom,
+ ArrayList<int[]> playersResourcesSummary,
+ ArrayList<Integer> playerAssignedSecretObjectiveCards,
+ int playerStartingCard)
+
This method is called by processMessage to update the all data of the players in the game when the game enters
+ the playing phase or when the player reconnects to the game.
Once the player receives the PlayerTurnMessage from the server, the method is called by processMessage to update
+ the currentPlayer in the game and print the message to notify the player whose turn is now, also, the method
+ notifies players the order of the turn in the game.
playerNickname - the nickname of the player who should be able to place the card and draw card in the field.
+
+
+
+
+
+
+
readInputThread
+
+
publicvoidreadInputThread()
+
A thread that reads the input from the player when it is not the player's turn will be started when the game
+ enters the playing phase, if the player is the current player, the thread will be waiting until the message
+ PlayerTurnMessage from the server to update the currentPlayer in the game.
+
+
+
+
+
+
requestPlaceCard
+
+
publicvoidrequestPlaceCard()
+
Use this method to request the player to place a card in the field. The player will be able to see the board
+ before and after placing the card. Also, the player will be able to see the cards in the hand and select one
+ card to place in the field.
publicvoidupdatePlacedCardConfirm(String playerNickname,
+ int placedCard,
+ int[] placedCardCoordinates,
+ boolean placedSide,
+ int playerPoints,
+ int[] playerResources,
+ ArrayList<int[]> newAvailableFieldSpaces)
+
Once the player receives the PlacedCardConfirmationMessage from the server, the method is called by processMessage
+ to store the card information, update the board of the player. If the player who placed the card is this player,
+ print the message to notify the player that the card is placed successfully. Also, the method requests the player
+ to draw a card from the deck.
playerNickname - the nickname of the player who placed the card in the field.
+
placedCard - the ID of the card placed in the field.
+
placedCardCoordinates - the coordinates of the card selected.
+
placedSide - the side of the card placed in the field.
+
playerPoints - the points of the player after placing the card.
+
playerResources - the resources of the player after placing the card.
+
newAvailableFieldSpaces - the available spaces in the field of the player after placing the card.
+
+
+
+
+
+
+
requestDrawCard
+
+
publicvoidrequestDrawCard()
+
Once the player receives the DrawCardMessage from the server, the method is called by processMessage to request
+ the player to draw a card from the deck. The player will be able to see the current visible resource cards and
+ gold cards in the game and select one card to add to the hand.
publicvoidupdateAfterPlacedCard(String playerNickname,
+ int cardID,
+ int x,
+ int y,
+ boolean isUp,
+ ArrayList<int[]> availablePos,
+ int[] resources,
+ int points)
+
Once received the PlacedCardConfirmationMessage from the server, the method is called by processMessage to store
+ the card information, update the board of the player.
Once the player receives the DrawCardConfirmationMessage from the server, the method is called by processMessage
+ to update the hand of the player and print the message to notify the player that the card is added in the hand
+ successfully. Also, the method prints the hand of the player after drawing the card.
hand - the hand of the player after drawing the card.
+
+
+
+
+
+
+
updateDeck
+
+
publicvoidupdateDeck(int resourceDeckSize,
+ int goldDeckSize,
+ int[] currentResourceCards,
+ int[] currentGoldCards,
+ int resourceDeckFace,
+ int goldDeckFace)
+
Once the player receives the DeckSizeUpdateMessage from the server, the method is called by processMessage to
+ update the deck size and the current visible resource cards and gold cards in the game. Also, the method prints
+ the message to notify the player the situation of the deck after this turn.
resourceDeckSize - the size of the resource deck in the game.
+
goldDeckSize - the size of the gold deck in the game.
+
currentResourceCards - the current visible resource cards in the game that the player can draw.
+
currentGoldCards - the current visible gold cards in the game that the player can draw.
+
resourceDeckFace - the face of the resource deck.
+
goldDeckFace - the face of the gold deck.
+
+
+
+
+
+
+
startChatting
+
+
publicvoidstartChatting()
+
Method called when player opens chat from getInput method.
+ Enables the user to select a player to chat with, or chat with all players.
+ The user can also exit the chat.
Method used to update the chat history of the player when a new message is received, add the message to the chat
+ history and print the chat history if the player is in the chat mode.
Print at the end of the match the final points of the players, the secret objective card of the players, and the
+ points gained from the objective card. Also, the method prints the winners of the match.
Set the image of the card based on the card description, the view of the card in TUI. Store the image of the card
+ in the hashmap with the ID of the card as the key.
+
+
Returns:
+
hashmap with the ID of the card as the key and the image of the card as the value.
The Method used to convert the integer array of the condition count of the card to a string of icons, using the
+ Unicode characters and added it in one string.
+
+
Parameters:
+
conditionCount - the integer array of the requirement counts of the card.
+
Returns:
+
the string of icons which contains the icons of the requirements of the card.
Method used to convert the type of the resource/object that stored in the array of requirements of the card or
+ in the array of the permanent resources of the card to an icon, using the Unicode characters.
public class EndMatchDueToDisconnectionTimerTask
+extends TimerTask
+
This class is a timer task that is used to end a match due to disconnection.
+ The timer task is scheduled when all but one players disconnects from the match.
+ If a player remain lonely in the match for a certain amount of time, the match is ended and the sole player is declared the winner.
alreadyEnteredTerminatingPhase: A flag that indicates whether the terminating phase has already been entered; used to notify players when terminating phase is entered
Method called when a player disconnects before the game has started, in the preparation phase such as
+ when players are choosing the side of their starter card.
endMatchDueToDisconnectionTimerTask: The timer task that is used to end a match due to disconnection when only one player remains connected
+
+
+
+
+
+
alreadyEnteredTerminatingPhase
+
+
privatebooleanalreadyEnteredTerminatingPhase
+
alreadyEnteredTerminatingPhase: A flag that indicates whether the terminating phase has already been entered; used to notify players when terminating phase is entered
+
+
+
+
+
+
stuckTurnFlag
+
+
privatebooleanstuckTurnFlag
+
stuckTurnFlag: A flag that indicates whether the game is stuck due to a player being lonely in the game and having terminated his turn
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
GameController
+
+
publicGameController(int id,
+ int gameSize)
+
Constructor for the GameController class. Initializes the game controller with the given id and game size.
+ The game controller is initialized in the lobby phase. There is one GameController instance for each game.
+
+
Parameters:
+
id - The id of the game
+
gameSize - The number of players in the game at fully capacity
Assigns a new message to be delivered to the VirtualView of a given client.
+ This method is the primary way through which clients are notified of events. In exceptional cases, such as when joining a non-existent game,
+ this method is not used.
Submits a chat message to the chat history.
+ If the message is a broadcast message, it is sent to all players in the game.
+ If the message is a direct message, it is sent only to the recipient.
Method called when a player disconnects during the lobby phase.
+ Removes the player from the game, notifies all players that the player has left the lobby, and shuts down the player's VirtualView.
+
+
Parameters:
+
playerQuadruple - The PlayerQuadruple of the player that has disconnected
Method called when a player disconnects before the game has started, in the preparation phase such as
+ when players are choosing the side of their starter card.
+ Sets the player status to "Disconnected" hoping that it will reconnect eventually.
+
+
Parameters:
+
playerQuadruple - The PlayerQuadruple of the player that has disconnected
Method called when a player disconnects after the game has started but is not the current player.
+ Sets the player status to "Disconnected" hoping that it will reconnect eventually.
+ Notifies all players that a player has left the game.
+ If only one player remain connected, starts a timer for winner declaration.
+
+
Parameters:
+
playerQuadruple - The PlayerQuadruple of the player that has disconnected
Method called when a player disconnects after the game has started and is the current player, and has already placed a card (but not yet drawn).
+ Sets the player status to "Disconnected" hoping that it will reconnect eventually.
+ Rolls back the player's placement and informs all players of the rollback.
+ Notifies all players that a player has left the game and updates the current player.
+ If only one player remain connected, starts a timer for winner declaration.
+
+
Parameters:
+
playerQuadruple - The PlayerQuadruple of the player that has disconnected
Method called when a player disconnects after the game has started and is the current player, but has not yet placed a card.
+ Sets the player status to "Disconnected" hoping that it will reconnect eventually.
+ Notifies all players that a player has left the game, updates the current player, and starts a timer for winner declaration if only one player remains connected.
+
+
Parameters:
+
playerQuadruple - The PlayerQuadruple of the player that has disconnected
+
+
+
+
+
+
+
handleLastConnectedPlayerIfPresent
+
+
privatevoidhandleLastConnectedPlayerIfPresent()
+
Checks if only one player remains connected to the game.
+ If only one player remains connected, starts a timer for winner declaration.
+ If more than one player remains connected, returns.
+
+
+
+
+
+
endMatchDueToDisconnection
+
+
protectedvoidendMatchDueToDisconnection()
+
Method called by EndMatchDueToDisconnectionTimerTask when the timer expires.
+ Ends the match and declares the last remaining player as the winner.
+ Notifies all players of the match status and of the winners (if any).
Method called when a player reconnects to the game.
+ Reconnects the player to the game, and sends all necessary messages to the player to bring him up to speed with the current game state.
+
+
Parameters:
+
nickname - The nickname of the player that has reconnected
+
node - The node of the player that has reconnected
Adds a player to the game. Gets called both when a player joins a game, and when a player creates a new game.
+ Adds the player to the list of players in the model, and creates a new VirtualView for the player
Method called when the lobby is full.
+ Enters the preparation phase of the game, assigns colours and starting cards to players, and notifies all players of the game start.
+
+
+
+
+
+
enterEndPhase
+
+
protectedvoidenterEndPhase()
+
Sets the model to the terminated phase, and notifies all players that the game has ended.
Method called when a message of type start card side selection is received.
+ The method initializes the player's field and checks if all players have chosen their starting card's side.
+
+
Parameters:
+
nickname - The nickname of the player that sent the message
+
isUp - The side of the starting card that the player has chosen
+
+
+
+
+
+
+
chooseSecretObjectiveCard
+
+
publicvoidchooseSecretObjectiveCard(String nickname,
+ int id)
+
Method called when a message of type secret objective card choice is received.
+ The method assigns the player's secret objective and checks if all players have chosen their secret objective.
+
+
Parameters:
+
nickname - The nickname of the player that sent the message
+
id - The id of the secret objective card that the player has chosen
+
+
+
+
+
+
+
placeCard
+
+
publicvoidplaceCard(String nickname,
+ int id,
+ int x,
+ int y,
+ boolean side)
+
Method called when a message of type place card is received.
+ Attempts to place the selected card on the player's field at the specified coordinates.
+ If the card placement is successful, the player is notified of the successful placement, and the game status is updated.
+ If the card placement fails, the player is notified of the failure.
+
+
Parameters:
+
nickname - The nickname of the player that sent the message
+
id - The id of the card to place
+
x - X coordinate of the card
+
y - Y coordinate of the card
+
side - Side of the card to place
+
+
+
+
+
+
+
drawCard
+
+
publicvoiddrawCard(String nickname,
+ int deckType,
+ int id)
+
Method called when a message of type draw card is received.
+ Attempts to draw a card from the specified deck.
+ If the draw is successful, the player is notified of the successful draw, and the game status is updated.
+ If the draw fails, the player is notified of the failure.
+
+
Parameters:
+
nickname - The nickname of the player that sent the message
Sets the current player, skipping over any disconnected players.
+ Updates the current game status.
+ Notifies all players of any changes in the model status, notifies all players of the newly elected current player.
+
+
Parameters:
+
doNotSendMessagesToThisPlayer - (Optional) The nickname of the player that should not be notified from this method (because a BigBoyMessage will be sent later)
+
+
+
+
+
+
+
isCurrentPlayerConnected
+
+
privatebooleanisCurrentPlayerConnected()
+
Checks to see if the current player is connected.
+
+
Returns:
+
True if the current player is connected, false otherwise
Method called when a message of type request game status is received.
+ The method sends a response game status message to the requester, updating them on the current state of the model.
+
+
Parameters:
+
requesterNickname - The nickname of the player that sent the message
Method called when a message of type request player field is received.
+ The method fetches the field of the player whose field is requested, and sends a response player field message to the requester.
+
+
Parameters:
+
requesterNickname - The nickname of the player that sent the request message
+
playerNickname - The nickname of the player whose field is requested
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
This class represents a manager for all the games that are currently being played.
+ Class is a Singleton, meaning that only one instance of it can be created.
This class represents a player in the game. It contains information about the player's
+ connection status, nickname, and the virtual view associated with the player.
Used to manage the messages that are sent to the client.
+ Stays in a loop and waits for messages to be added to the queue.
+ When a new message is added, it sends it to the client through the connection node.
This exception is thrown when a critical failure occurs.
+ A critical failure is an error that should never happen, and that is not recoverable.
+ When this exception is thrown, the program should be terminated.
public abstract class LobbyMessageException
+extends Exception
+
The LobbyMessageException class represents an exception that can be thrown during
+ the elaboration of a generic Lobby-Message.
+ It contains the type of the exception and a message associated with it.
The LobbyMessageExceptionEnumeration enum represents the different exceptions that can be thrown during
+ the elaboration of a generic Lobby-Message.
+ Each exception is associated with a specific integer value.
+
+
+
+
+
+
+
+
Nested Class Summary
+
+
Nested classes/interfaces inherited from class java.lang.Enum
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the AccessGameMessage object. The string includes the message type,
+ the matchId and the senderNickname properties of the object.
This method provides a string representation of a message object, which can be useful for debugging purposes.
+ It will be overridden by the classes that implement the StoCMessage interface.
This method provides a string representation of a message object, which can be useful for debugging purposes.
+ It will be overridden by the classes that implement the StoCMessage interface.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the DrawCardMessage object.
+ The string includes the message type, the senderNickname, the deckType and the cardId properties of the object.
Constructor: a message representing a chat message sent by a player to another player or to all the players in
+ the game.
+
+
Parameters:
+
senderNickname - the nickname of the player who wants to send the message
+
recipientNickname - the nickname of the player who will receive the message
+
multicastFlag - the flag that indicates if the message is for all the players in the game or for a single
+ player: true if the message is for all the players, false if the message is for a single
+ player
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the InboundChatMessage object.
+ The string includes the message type, the senderNickname, the recipientNickname, the multicastFlag and the
+ content properties of the object.
This class represents a message that is sent from the client to the server when a new game is created.
+ The message contains the nickname of the player that created the game and the number of players that the game will have.
+ The message is used to create a new game and add the player to it.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the NewGameMessage object.
+ The string includes the message type, the senderNickname and the playerNum properties of the object.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The nickname of the player who wants to place the card
+
+
+
+
+
+
+
+
Constructor Summary
+
Constructors
+
+
Constructor
+
Description
+
PlaceCardMessage(String senderNickname,
+ int cardId,
+ int row,
+ int column,
+ boolean isUp)
+
+
Constructor: a message containing the nickname of the player who wants to place the card, the id of the card the
+ player wants to place, the x and y coordinates of the position in the field where the player wants to place the
+ card and a flag that indicates if the card is placed face up or face down.
The nickname of the player who wants to place the card
+
+
+
+
+
+
cardId
+
+
private finalintcardId
+
The id of the card the player wants to place
+
+
+
+
+
+
row
+
+
private finalintrow
+
The row where the player wants to place the card
+
+
+
+
+
+
column
+
+
private finalintcolumn
+
The column where the player wants to place the card
+
+
+
+
+
+
isUp
+
+
private finalbooleanisUp
+
True if the card is placed face up, false otherwise
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
PlaceCardMessage
+
+
publicPlaceCardMessage(String senderNickname,
+ int cardId,
+ int row,
+ int column,
+ boolean isUp)
+
Constructor: a message containing the nickname of the player who wants to place the card, the id of the card the
+ player wants to place, the x and y coordinates of the position in the field where the player wants to place the
+ card and a flag that indicates if the card is placed face up or face down.
+
+
Parameters:
+
senderNickname - the nickname of the player who wants to place the card
+
cardId - the id of the card the player wants to place
+
row - the row of the field where the player wants to place the card
+
column - the colum of the field where the player wants to place the card
+
isUp - indicates if the card is placed face up or face down:
+ true if the card is placed face up, false otherwise
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the PlaceCardMessage object.
+ The string includes the message type, the senderNickname, the cardId, the row, the column and the isUp properties
+ of the object.
Constructor: a message containing the nickname of the player who wants to reconnect to the game and the id of
+ the game the player requests to reconnect to.
The nickname of the player who wants to reconnect to the game
+
+
+
+
+
+
matchId
+
+
private finalintmatchId
+
The id of the game the player left before and wants to reconnect to
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
ReconnectGameMessage
+
+
publicReconnectGameMessage(String senderNickname,
+ int matchId)
+
Constructor: a message containing the nickname of the player who wants to reconnect to the game and the id of
+ the game the player requests to reconnect to.
+
+
Parameters:
+
senderNickname - the nickname of the player who wants to reconnect to the game
+
matchId - the id of the game the player wants to reconnect to
This method is called when a player wants to reconnect to a game.
+ Creates a new GameController and adds the player and updates the data of the player and the game.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the ReconnectGameMessage object.
+ The string includes the message type, the matchId and the senderNickname properties of the object.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the RequestGameStatusMessage object.
+ The string includes the message type and the senderNickname properties of the object.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the RequestPlayerFieldMessage object.
+ The string includes the message type, the senderNickname and the playerNickname properties of the object.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the SelectedSecretObjectiveCardMessage object.
+ The string includes the message type, the senderNickname and the cardId properties of the object.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
A string representation of the SelectedStarterCardSideMessage object.
+ The string includes the message type, the senderNickname and the isUp properties of the object.
This method is used to process the message to the client when the access to the game is confirmed,
+ updating the current event of the game and notifying the player that he joined the game successfully.
This method is used to process the message to the client when the access to the game is confirmed,
+ updating the current event of the game and notifying the player that he joined the game successfully.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
public class AssignedSecretObjectiveCardMessage
+extends Object
+implements StoCMessage
+
This class is used to manage the message sent by the server to the client to assign the secret objective cards which
+ should be chosen by the player, the common objective cards and the cards to the player's hand.
The constructor of the class: it creates a new AssignedSecretObjectiveCardMessage with the nickname of the
+ recipient who will receive the assignment of the cards.
This method is used to process the message to the client when is a turn to choose the secret objective card,
+ setting the cards received by the server and updating the current event of the game.
The constructor of the class: it creates a new AssignedSecretObjectiveCardMessage with the nickname of the
+ recipient who will receive the assignment of the cards.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
assignedSecretObjectiveCards - the list of the secret objective cards assigned to the player so that he can
+ choose one of them.
+
chosenCommonObjectiveCards - the list of the common objective cards assigned to the player for this game.
+
playerHand - the list of the cards assigned to the player's hand at the beginning of the game.
This method is used to process the message to the client when is a turn to choose the secret objective card,
+ setting the cards received by the server and updating the current event of the game.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new AssignedStarterCardMessage with the nickname of the recipient who
+ will receive the assignment of the starter card and the id of the card assigned to the player.
This method is used to process the message to the client when the assigned starter card is received,
+ updating the current event of the game and notifying the player that he received the assigned starter card.
The nickname of the recipient who will receive the assigned starter card.
+
+
+
+
+
+
cardId
+
+
private finalintcardId
+
The id of the assigned starter card.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
AssignedStarterCardMessage
+
+
publicAssignedStarterCardMessage(String recipientNickname,
+ int cardId)
+
The constructor of the class: it creates a new AssignedStarterCardMessage with the nickname of the recipient who
+ will receive the assignment of the starter card and the id of the card assigned to the player.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
cardId - the id of the starter card assigned to the player.
This method is used to process the message to the client when the assigned starter card is received,
+ updating the current event of the game and notifying the player that he received the assigned starter card.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
public class ConfirmSelectedSecretObjectiveCardMessage
+extends Object
+implements StoCMessage
+
This class is used to manage the message sent by the server to the client to confirm the selected secret objective
+ card. The player will receive the confirmation of the selected secret objective card.
The constructor of the class: it creates a new ConfirmSelectedSecretObjectiveCardMessage with the nickname
+ of the recipient who will receive the confirmation of the selected secret objective card and the id of the
+ secret objective card chosen by the player.
This method is used to process the message to the client when the selected secret objective card is confirmed,
+ updating the view with the selected secret objective card chosen by the player.
The nickname of the recipient who will receive the confirmation of the selected secret objective card.
+
+
+
+
+
+
chosenSecretObjectiveCard
+
+
private finalintchosenSecretObjectiveCard
+
The id of the secret objective card chosen by the player.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
ConfirmSelectedSecretObjectiveCardMessage
+
+
publicConfirmSelectedSecretObjectiveCardMessage(String recipientNickname,
+ int chosenSecretObjectiveCard)
+
The constructor of the class: it creates a new ConfirmSelectedSecretObjectiveCardMessage with the nickname
+ of the recipient who will receive the confirmation of the selected secret objective card and the id of the
+ secret objective card chosen by the player.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the confirmation message.
+
chosenSecretObjectiveCard - the id of the secret objective card chosen by the player.
This method is used to process the message to the client when the selected secret objective card is confirmed,
+ updating the view with the selected secret objective card chosen by the player.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new confirmStarterCardSideSelectionMessage with the nickname of the
+ recipient who will receive the confirmation message for the selection of the starter card side, the id of the
+ starter card, the side of the starter card, the available spaces and the resources of the player in the field
+ after the placement of the starter card and the color identifier of the player in this game.
This method is used to process the message to the client when the selection of the starter card side is
+ confirmed,
+ updating the view with the selected side of the starter card, the available spaces and resources
+ of the player in the field after the placement of the starter card.
The available spaces after the placement of the starter card.
+
+
+
+
+
+
playerResources
+
+
private finalint[]playerResources
+
The resources of the player in the field after the placement of the starter card.
+
+
+
+
+
+
playerColour
+
+
private finalintplayerColour
+
The color identifier of the player in this game.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
ConfirmStarterCardSideSelectionMessage
+
+
publicConfirmStarterCardSideSelectionMessage(String recipientNickname,
+ int startingCardId,
+ boolean side,
+ ArrayList<int[]> availableSpaces,
+ int[] playerResources,
+ int playerColour)
+
The constructor of the class: it creates a new confirmStarterCardSideSelectionMessage with the nickname of the
+ recipient who will receive the confirmation message for the selection of the starter card side, the id of the
+ starter card, the side of the starter card, the available spaces and the resources of the player in the field
+ after the placement of the starter card and the color identifier of the player in this game.
+
+
Parameters:
+
recipientNickname - who will receive the confirmation message for the selection of the starter card side.
+
startingCardId - the id of the starter card assigned to the player.
+
side - the side of the starter card selected by the player.
+
availableSpaces - the available spaces after the placement of the starter card.
+
playerResources - the resources of the player in the field after the placement of the starter card.
+
playerColour - the color identifier of the player in this game.
This method is used to process the message to the client when the selection of the starter card side is
+ confirmed,
+ updating the view with the selected side of the starter card, the available spaces and resources
+ of the player in the field after the placement of the starter card.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The size of the resource card deck after the draw card action.
+
+
+
+
+
+
+
+
Constructor Summary
+
Constructors
+
+
Constructor
+
Description
+
DeckSizeUpdateMessage(String recipientNickname,
+ int resourceCardDeckSize,
+ int goldCardDeckSize,
+ int[] currentResourceCards,
+ int[] currentGoldCards,
+ int resourceCardDeckFacingKingdom,
+ int goldCardDeckFacingKingdom)
+
+
The constructor of the class: it creates a new DeckSizeUpdateMessage with the nickname of the recipient who will
+ receive the message to update the deck after the draw card action.
The nickname of the recipient who will receive the message to update the deck size after the draw card action.
+
+
+
+
+
+
resourceCardDeckSize
+
+
private finalintresourceCardDeckSize
+
The size of the resource card deck after the draw card action.
+
+
+
+
+
+
resourceCardDeckFacingKingdom
+
+
private finalintresourceCardDeckFacingKingdom
+
The resource card deck facing kingdom after the draw card action.
+
+
+
+
+
+
goldCardDeckSize
+
+
private finalintgoldCardDeckSize
+
The size of the gold card deck after the draw card action.
+
+
+
+
+
+
goldCardDeckFacingKingdom
+
+
private finalintgoldCardDeckFacingKingdom
+
The gold card deck facing kingdom after the draw card action.
+
+
+
+
+
+
currentResourceCards
+
+
private finalint[]currentResourceCards
+
The current resource cards in the deck after the draw card action.
+
+
+
+
+
+
currentGoldCards
+
+
private finalint[]currentGoldCards
+
The current gold cards in the deck after the draw card action.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
DeckSizeUpdateMessage
+
+
publicDeckSizeUpdateMessage(String recipientNickname,
+ int resourceCardDeckSize,
+ int goldCardDeckSize,
+ int[] currentResourceCards,
+ int[] currentGoldCards,
+ int resourceCardDeckFacingKingdom,
+ int goldCardDeckFacingKingdom)
+
The constructor of the class: it creates a new DeckSizeUpdateMessage with the nickname of the recipient who will
+ receive the message to update the deck after the draw card action.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
resourceCardDeckSize - the size of the resource card deck after the draw card action.
+
goldCardDeckSize - the size of the gold card deck after the draw card action.
+
currentResourceCards - the current resource card visible after the draw card action.
+
currentGoldCards - the current gold card visible after the draw card action.
+
resourceCardDeckFacingKingdom - the resource card deck facing kingdom after the draw card action.
+
goldCardDeckFacingKingdom - the gold card deck facing kingdom after the draw card action.
This method is used to process the message to the client when the deck is updated after the draw card action.
+ It updates the view with the new deck size and the current cards in the deck.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new DrawCardConfirmationMessage with the nickname of the recipient who
+ will receive the confirmation and the cards in the player's hand after his draw card action.
This method is used to process the message to the client when the draw card action is confirmed, updating the
+ view with the cards in the player's hand.
The constructor of the class: it creates a new DrawCardConfirmationMessage with the nickname of the recipient who
+ will receive the confirmation and the cards in the player's hand after his draw card action.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the confirmation message.
+
playerHand - the cards in the player's hand after the draw card action.
This method is used to process the message to the client when the draw card action is confirmed, updating the
+ view with the cards in the player's hand.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new DrawCardFailedMessage with the nickname of the recipient who will
+ receive the message when his draw card action fails and the reason why the draw card action failed.
This method is used to process the message to the client when the draw card action fails, updating the view with
+ the reason why the draw card action failed.
The constructor of the class: it creates a new DrawCardFailedMessage with the nickname of the recipient who will
+ receive the message when his draw card action fails and the reason why the draw card action failed.
+
+
Parameters:
+
recipientNickname - the nickname of the player who tried to draw a card but failed.
+
reason - the reason why the draw card action failed.
This method is used to process the message to the client when the draw card action fails, updating the view with
+ the reason why the draw card action failed.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This class is used to manage the message sent by the server to the client when client's request to access the game,
+ to create a new game or to reconnect to a game is not successful.
The nickname of the recipient who requested to create a new game, to access the game or to reconnect to a game
+ before and received the error message.
This method is used to process the message to the client when the request to access the game,
+ to create a new game or to reconnect to a game is not successful,
+ updating the current event of the game and notifying the player
+ that the request is not successful.
The nickname of the recipient who requested to create a new game, to access the game or to reconnect to a game
+ before and received the error message.
+
+
+
+
+
+
errorType
+
+
private finalinterrorType
+
The type of the error message.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
ErrorMessage
+
+
publicErrorMessage(String message,
+ String recipientNickname,
+ int errorType)
+
The constructor of the class.
+
+
Parameters:
+
message - the message that the server sends to the client to notify the failure reason of the request.
+
recipientNickname - the nickname of the player who will receive the error message.
+
errorType - the code associated with the error type.
This method is used to process the message to the client when the request to access the game,
+ to create a new game or to reconnect to a game is not successful,
+ updating the current event of the game and notifying the player
+ that the request is not successful.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
public class GameStartedMessage
+extends Object
+implements StoCMessage
+
This class is used to manage the message sent by the server to the client to notify the player that the game is
+ started, entering the preparation phase.
The constructor of the class: it creates a new GameStartedMessage with the nickname of the recipient who will
+ receive the message when the game enters the preparation phase.
This method is used to process the message to the client when the game is started, updating the view with the
+ setup of players' data and notifying the player that the game entered the preparation phase.
The constructor of the class: it creates a new GameStartedMessage with the nickname of the recipient who will
+ receive the message when the game enters the preparation phase.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
This method is used to process the message to the client when the game is started, updating the view with the
+ setup of players' data and notifying the player that the game entered the preparation phase.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
public class NegativeResponsePlayerFieldMessage
+extends Object
+implements StoCMessage
+
This class is used to manage the message sent to the player who requested the field of another player to notify him that the field could not be fetched (used for testing only).
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new NewGameConfirmationMessage with the nickname of the recipient who
+ requested to create a new game and the id of the match returned by the server.
This method is used to process the message to the client when the creation of a new game is confirmed,
+ updating view with data related to the new game created and the current event of the game, notifying the player
+ that the game is created correctly.
The nickname of the recipient who requested to create a new game and received the confirmation message.
+
+
+
+
+
+
matchId
+
+
private finalintmatchId
+
The id of the match created.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
NewGameConfirmationMessage
+
+
publicNewGameConfirmationMessage(String recipientNickname,
+ int matchId)
+
The constructor of the class: it creates a new NewGameConfirmationMessage with the nickname of the recipient who
+ requested to create a new game and the id of the match returned by the server.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the confirmation message for his request to
+ create a new game.
+
matchId - the id of the match created and returned by the server.
This method is used to process the message to the client when the creation of a new game is confirmed,
+ updating view with data related to the new game created and the current event of the game, notifying the player
+ that the game is created correctly.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new PlaceCardFailedMessage with the nickname of the recipient who will receive the message
+ and the reason why the card placement has failed.
This method is used to process the message to the client when a card placement has failed,
+ updating the view of the player who will receive the message.
The constructor of the class: it creates a new PlaceCardFailedMessage with the nickname of the recipient who will receive the message
+ and the reason why the card placement has failed.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
reason - the reason why the card placement has failed.
This method is used to process the message to the client when a card placement has failed,
+ updating the view of the player who will receive the message.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new PlaceCardRollbackMessage with the nickname of the recipient who will receive the message,
+ the nickname of the player who disconnected after placing a card, the card that has been placed by the player and should be removed,
+ the old points of the player before the card placement who disconnected and the old resources of the player before the card placement who disconnected.
This method is used to process the message to the client when a player has placed a card and disconnected,
+ updating the view of the player who will receive the message.
The nickname of the player who disconnected after placing
+
+
+
+
+
+
removedCard
+
+
private finalintremovedCard
+
The card that has been placed by the player and should be removed.
+
+
+
+
+
+
playerPoints
+
+
private finalintplayerPoints
+
The old points of the player before the card placement who disconnected.
+
+
+
+
+
+
playerResources
+
+
private finalint[]playerResources
+
The old resources of the player before the card placement who disconnected.
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
PlaceCardRollbackMessage
+
+
publicPlaceCardRollbackMessage(String recipientNickname,
+ String playerNickname,
+ int removedCard,
+ int playerPoints,
+ int[] playerResources)
+
The constructor of the class: it creates a new PlaceCardRollbackMessage with the nickname of the recipient who will receive the message,
+ the nickname of the player who disconnected after placing a card, the card that has been placed by the player and should be removed,
+ the old points of the player before the card placement who disconnected and the old resources of the player before the card placement who disconnected.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
playerNickname - the nickname of the player who disconnected after placing a card.
+
removedCard - the card that has been placed by the player and should be removed.
+
playerPoints - the old points of the player before the card placement who disconnected.
+
playerResources - the old resources of the player before the card placement who disconnected.
This method is used to process the message to the client when a player has placed a card and disconnected,
+ updating the view of the player who will receive the message.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new PlayerDisconnectMessage with the nickname of the recipient of the message
+ and the nickname of the player who disconnected.
This method is used to process the message to the client when a player disconnects from the game,
+ updating the view based on the PLAYER_DISCONNECTED event.
The constructor of the class: it creates a new PlayerDisconnectMessage with the nickname of the recipient of the message
+ and the nickname of the player who disconnected.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
disconnectedNickname - the nickname of the player who disconnected from the game.
This method is used to process the message to the client when a player disconnects from the game,
+ updating the view based on the PLAYER_DISCONNECTED event.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
Constructor: a message containing all the data necessary to update the view when the game enters a playing phase
+ or when the player reconnects to the game.
List of arrays of integers that represent the available field spaces for the player to place a card
+
+
+
+
+
+
+
+
+
+
Constructor Details
+
+
+
+
PlayerGameStatusMessage
+
+
publicPlayerGameStatusMessage(String recipientNickname,
+ ArrayList<String> playerNicknames,
+ ArrayList<Boolean> playerConnected,
+ ArrayList<Integer> playerColours,
+ ArrayList<Integer> playerHand,
+ ArrayList<Integer> playerAssignedSecretObjectiveCards,
+ int playerStartingCard,
+ int playerSecretObjective,
+ int[] playerPoints,
+ ArrayList<int[]> playersResourcesSummary,
+ ArrayList<ArrayList<int[]>> playerFields,
+ int[] playerResources,
+ ArrayList<Integer> gameCommonObjectives,
+ ArrayList<Integer> gameCurrentResourceCards,
+ ArrayList<Integer> gameCurrentGoldCards,
+ int gameResourcesDeckSize,
+ int gameGoldDeckSize,
+ int matchStatus,
+ ArrayList<String[]> chatHistory,
+ String currentPlayer,
+ ArrayList<int[]> newAvailableFieldSpaces,
+ int resourceCardDeckFacingKingdom,
+ int goldCardDeckFacingKingdom)
+
Constructor: a message containing all the data necessary to update the view when the game enters a playing phase
+ or when the player reconnects to the game.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message and his view should be updated.
+
playerNicknames - the nicknames of the players in the game.
+
playerConnected - the connection status of the players in the game.
+
playerColours - the colours of the players in the game.
+
playerHand - the cards in the hand of the player.
+
playerAssignedSecretObjectiveCards - the secret objective cards assigned to the player.
+
playerStartingCard - the starting card assigned to the player.
+
playerSecretObjective - the secret objective chosen by the player.
+
playerPoints - the points of the players in the game.
+
playersResourcesSummary - the resources of the players in the game.
+
playerFields - the fields data of the players in the game.
+
playerResources - the resources of the player who will receive the message.
+
gameCommonObjectives - the common objectives of the game.
+
gameCurrentResourceCards - the resource cards visible in the game.
+
gameCurrentGoldCards - the gold cards visible in the game.
+
gameResourcesDeckSize - the size of the resource deck.
+
gameGoldDeckSize - the size of the gold deck.
+
matchStatus - the status of the match.
+
chatHistory - the chat history of players in the game.
+
currentPlayer - the nickname of the current player.
+
newAvailableFieldSpaces - the available field spaces for the player to place a card.
+
resourceCardDeckFacingKingdom - the kingdom type of the card facing up in the resource deck.
+
goldCardDeckFacingKingdom - the kingdom type of the card facing up in the gold deck.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new PlayerReconnectedMessage with the nickname of the recipient who
+ requested to reconnect to the game before and the nickname of the player who reconnected to the game.
This method is used to process the message to the client when a player reconnects to the game,
+ updating the view based on the PLAYER_RECONNECTED event.
The constructor of the class: it creates a new PlayerReconnectedMessage with the nickname of the recipient who
+ requested to reconnect to the game before and the nickname of the player who reconnected to the game.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
disconnectedNickname - the nickname of the player who reconnected to the game.
This method is used to process the message to the client when a player reconnects to the game,
+ updating the view based on the PLAYER_RECONNECTED event.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new PlayerTurnMessage with the nickname of the recipient who
+ requested to access the game before and the nickname of the player whose turn it is
This method is used to process the message to the client when the player turn is notified,
+ updating the current event of the game and notifying the player that it is his turn.
The constructor of the class: it creates a new PlayerTurnMessage with the nickname of the recipient who
+ requested to access the game before and the nickname of the player whose turn it is
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the message.
+
playerNickname - the nickname of the player whose turn it is
This method is used to process the message to the client when the player turn is notified,
+ updating the current event of the game and notifying the player that it is his turn.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
The constructor of the class: it creates a new ReconnectGameConfirmMessage with the nickname of the recipient who
+ requested to reconnect to the game before.
This method is used to process the message to the client when the reconnection to the game is confirmed,
+ modifying the view based on the GAME_RECONNECTED event.
The constructor of the class: it creates a new ReconnectGameConfirmMessage with the nickname of the recipient who
+ requested to reconnect to the game before.
+
+
Parameters:
+
recipientNickname - the nickname of the player who will receive the confirmation message for his request
+ to reconnect to the game.
This method is used to process the message to the client when the reconnection to the game is confirmed,
+ modifying the view based on the GAME_RECONNECTED event.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
This method overrides the default toString method.
+ It provides a string representation of a message object, which can be useful for debugging purposes.
Gets the recipient's nickname of the message.
+ Method needed for submitVirtualViewMessage method in Game controller.
+ GameController needs to know who to send a message to.
This method provides a string representation of a message object, which can be useful for debugging purposes.
+ It will be overridden by the classes that implement the StoCMessage interface.
This class is used to manage the message sent by the server to the client to assign the secret objective cards which
+ should be chosen by the player, the common objective cards and the cards to the player's hand.
This class is used to manage the message sent by the server to the client when client's request to access the game,
+ to create a new game or to reconnect to a game is not successful.
This class is used to manage the message sent by the server to the client to notify the player that the game is
+ started, entering the preparation phase.
This class is used to manage the message sent to the player who requested the field of another player to notify him that the field could not be fetched (used for testing only).
The card class includes objective cards, resource cards, starting cards and gold cards. All types of cards have the
+ following attributes: each card has a unique ID and a value from zero to five points, and also each has a special
+ PointStrategy that describes the conditions that must be satisfied when using this card to score points.
Stores all the possible card corner object types. Each field is associated with an integer.
+ Used to indicate the type of resource present on the corners of Gold, Resource, and Start cards.
+
+
+
+
+
+
+
+
Nested Class Summary
+
+
Nested classes/interfaces inherited from class java.lang.Enum
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Stores the type of resource displayed on the corner of the card.
+
+
+
+
+
+
permRes
+
+
private finalint[]permRes
+
Permanent resources present on the back of the card. Index of each resource dictated by ObjectType enum.
+ Gold and Resource cards always have 1 permanent resource according to their kingdom, while start cards may have more.
+
+
+
+
+
+
conditionCount
+
+
private finalint[]conditionCount
+
Resources that need to be present on the field before the card can be played. Index of each resource dictated by ObjectType enum.
publicintcalculateOccurrences(Field field,
+ int x,
+ int y)
+
Calculates the number of full triplets of special type resources on the field.
+ If there are 1 quills, 3 inkwells, and 2 manuscripts for example, the number of occurrences should be 1.
CountResource is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards and the gold cards, which count identical resources or objects visible in the play area (field)
+ of the player.
Calculate how many times the given objective card or gold card has been fulfilled based on its type of resources
+ (objects) and number of identical resources (objects).
count - Minimum cardinality of a resource group to be reported.
+
+
+
+
+
+
+
+
+
+
+
Method Details
+
+
+
+
calculateOccurrences
+
+
publicintcalculateOccurrences(Field field,
+ int x,
+ int y)
+
Calculate how many times the given objective card or gold card has been fulfilled based on its type of resources
+ (objects) and number of identical resources (objects).
Diagonals is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which count 3 cards of the same kingdom on the diagonal line y=x or y=-x.
Empty is one of the classes that implement the PointStrategy interface used to calculate the
+ card whose placement returns always 1: all cards with a constant value regardless of other conditions.
Used for the point calculation of the only objective card which counts the number of right facing Ls made from 2
+ stacked vertical blue cards and 1 red card to the top right in the player's field.
publicintcalculateOccurrences(Field field,
+ int x,
+ int y)
+
Calculates the number of right facing L configurations present in the field made of 2 blue and 1 red cards.
+ The cards are extracted from the field parameter, then, by using streams, a filtered and ordered arraylist
+ containing only blue (animal) and red (fungi) cards is generated. The ordering is done on the basis of the cards' x and y coordinates.
+ Cards are ordered by decreasing x coordinate (primary ordering), and then by decreasing y coordinates (secondary ordering).
LConfigurationOne is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the bottom right has a Plant card and in the top left corner has a Fungi card
+ and then above that card has another Fungi card.
Calculate how many times the L configuration is fulfilled in the player's field, where in the bottom right is a
+ Plant card, and in the left top found two Fungi cards.
publicintcalculateOccurrences(Field field,
+ int x,
+ int y)
+
Calculate how many times the L configuration is fulfilled in the player's field, where in the bottom right is a
+ Plant card, and in the left top found two Fungi cards.
LConfigurationThree is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the top left has an Animal card and in the bottom right corner has an Insect card
+ and then under that card has another Insect card.
Calculate how many times the L configuration is fulfilled in the player's field, where in the top left is an
+ Animal card, and in the right down found two Insect cards.
publicintcalculateOccurrences(Field field,
+ int x,
+ int y)
+
Calculate how many times the L configuration is fulfilled in the player's field, where in the top left is an
+ Animal card, and in the right down found two Insect cards.
Used for the point calculation of the only objective card which counts the number of left facing Ls made from 2
+ stacked vertical green cards and 1 purple card to the bottom left in the player's field.
publicintcalculateOccurrences(Field field,
+ int x,
+ int y)
+
Calculates the number of left facing L configurations present in the field made of 2 green and 1 purple cards.
+ The cards are extracted from the field parameter, then, by using streams, a filtered and ordered arraylist
+ containing only green (plant) and purple (insect) cards is generated. The ordering is done on the basis of the cards' x and y coordinates.
+ Cards are ordered by increasing x coordinate (primary ordering), and then by increasing y coordinates (secondary ordering).
Stores all the possible resource object types. Includes all resources and objects. Each field is associated with
+ an integer.
+ Used to indicate all the possible resources and special objects.
+ Can be considered a subset of the CornerType enumeration.
+
+
+
+
+
+
+
+
Nested Class Summary
+
+
Nested classes/interfaces inherited from class java.lang.Enum
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Following strategy pattern to describe different strategies used by cards to calculate points
+ and for each type count how many times it is realized in the indicated field.
CountResource is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards and the gold cards, which count identical resources or objects visible in the play area (field)
+ of the player.
Diagonals is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which count 3 cards of the same kingdom on the diagonal line y=x or y=-x.
Empty is one of the classes that implement the PointStrategy interface used to calculate the
+ card whose placement returns always 1: all cards with a constant value regardless of other conditions.
Used for the point calculation of the only objective card which counts the number of right facing Ls made from 2
+ stacked vertical blue cards and 1 red card to the top right in the player's field.
LConfigurationOne is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the bottom right has a Plant card and in the top left corner has a Fungi card
+ and then above that card has another Fungi card.
LConfigurationThree is one of the classes that implement the PointStrategy interface used to calculate the
+ objective cards, which in the top left has an Animal card and in the bottom right corner has an Insect card
+ and then under that card has another Insect card.
Used for the point calculation of the only objective card which counts the number of left facing Ls made from 2
+ stacked vertical green cards and 1 purple card to the bottom left in the player's field.
Following strategy pattern to describe different strategies used by cards to calculate points
+ and for each type count how many times it is realized in the indicated field.
This enum represents the types of decks available in the game.
+ Each enum constant corresponds to a specific type of deck and is associated with the path to the JSON file that
+ contains the card data for that deck.
+
+
+
+
+
+
+
+
Nested Class Summary
+
+
Nested classes/interfaces inherited from class java.lang.Enum
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
public class AlreadyComputedPointsException
+extends Exception
+
This class represents a custom exception that is thrown when points have already been computed.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
Constructs a new AlreadyComputedPointsException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a draw operation fails.
+ It extends the base Exception class and provides a constructor to set a custom error message.
public class DuplicateNicknameException
+extends Exception
+
This class represents a custom exception that is thrown when a duplicate player is encountered.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
Constructs a new DuplicateNicknameException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when an invalid hand size is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new InvalidHandSizeException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
public class InvalidPositionException
+extends Exception
+
This class represents a custom exception that is thrown when an invalid position is encountered.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
Constructs a new InvalidPositionException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
public class InvalidSelectionException
+extends Exception
+
This class represents a custom exception that is thrown when an invalid selection is made.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
Constructs a new InvalidSelectionException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a required JSON file is missing.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new MissingJSONException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the
+ Throwable.getMessage() method.
public class MissingRequirementsException
+extends Exception
+
This class represents a custom exception that is thrown when the required elements for a certain operation are missing.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
Constructs a new MissingRequirementsException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a non-empty hand is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new NonEmptyHandException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a non-null color is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new NonNullColourException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a non-null field is encountered where a null field was expected.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
This class represents a custom exception that is thrown when a player's color is not set.
+ It extends the base RuntimeException class and provides a constructor to set a custom error message.
This class represents a custom exception that is thrown when a null field is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new NullFieldException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when a null hand is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new NullHandException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
public class NullPointStrategyException
+extends RuntimeException
+
This class represents a custom exception that is thrown when a null point strategy is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new NullPointStrategyException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
public class PlayerNotFoundException
+extends Exception
+
This class represents a custom exception that is thrown when a player is not found.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause or caught within the method.
Constructs a new PlayerNotFoundException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception named RollbackException.
+ It extends the Exception class, hence it is a checked exception.
+ This exception is thrown when a rollback operation is required in the application.
public class SecretObjectiveCardException
+extends RuntimeException
+
This class represents a custom exception that is thrown when a secret objective card related error is encountered.
+ It extends the RuntimeException class, meaning it is an unchecked exception.
+ Unchecked exceptions do not need to be declared in a method or constructor's throws clause.
Constructs a new SecretObjectiveCardException with the specified detail message.
+ The detail message is saved for later retrieval by the Throwable.getMessage() method.
+
+
Parameters:
+
message - the detail message. The detail message is saved for later retrieval by the Throwable.getMessage() method.
This class represents a custom exception that is thrown when an incorrect deck type is used.
+ It extends the Exception class, meaning it is a checked exception.
+ Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the
+ execution of the method or constructor and propagate outside the method or constructor boundary.
Used to store information about a currently placed card. Stores the position of the card in the player's field
+ along with its orientation.
+ The coordinates are those of the center of the card.
Given the two arrays check if the values of the first array are greater or equal then those of the second array
+ in the same index for every position of the second array
Converts the given corners to an array of integers (of size 7) containing the number of occurrences of the 7
+ resources in the card corners. the array is order following the convention used for ObjectType
Given the card and the side, return an array of integer where at each position (according to the attribute
+ value of the enumeration ObjectType) is inserted the number of resources gained if the card is placed
Converts the given corners to an array of integers (of size 7) containing the number of occurrences of the 7
+ resources in the card corners. the array is order following the convention used for ObjectType
Given the two arrays check if the values of the first array are greater or equal then those of the second array
+ in the same index for every position of the second array
+
+
Parameters:
+
resources - is the array that contain the current resources
+
requirements - is the array of the requirements for the resources
+
Returns:
+
true if the check result is positive, false if the length of the second array is grater than that of
+ the first array or if the checking process resulted negatively
Given the card and the side, return an array of integer where at each position (according to the attribute
+ value of the enumeration ObjectType) is inserted the number of resources gained if the card is placed
+
+
Parameters:
+
nonObjectiveCard - is the card that has to be placed
+
isUp - is the side, of the card, relevant to the play
This method is used to roll back the last operation performed on the field. It removes the last card placed
+ in the field and restores the resources to their previous state.
+
+
Returns:
+
The NonObjectiveCard that was removed from the field.
+
Throws:
+
RollbackException - if the field is empty or if there is only the starting card in the field.
nickname - Nickname of the player whose secret objective card ids we want
+
Returns:
+
An ArrayList containing the ids of the player's secret objective cards if the nickname was found in the list of players,
+ or an empty ArrayList otherwise
deckType - The type of deck from which the card is drawn. 0 for resourceCardsDeck, 1 for goldCardsDeck, 2 for currentResourceCards, 3 for currentGoldCards.
+
id - If the deckType is 2 or 3, the id parameter is used to identify the card to be drawn.
+
Throws:
+
DrawException - if the deckType selected for draw is not valid or the id of the card is not found. Gets also thrown if the deck is empty
Used to progress the game to the next turn.
+ The current player is set to the next player in the list of players.
+ If the current player is the last player in the list, the first player in the list is selected.
+ The current turn number is incremented by 1.
Calculates the players that have accumulated the most points. If two players have gained the same amount of points,
+ the winner is the one with the highest number of points obtained by completing the objectives (secret or common).
This method retrieves the field of a specific player in the game.
+ The field is represented as an ArrayList of integer arrays, where each array represents a card placed on
+ the field. The elements of the array are the x-coordinate, y-coordinate, id of the card, and a boolean value
+ (1 for true, 0 for false) indicating whether the card is face up.
nickname - The nickname of the player whose field we want to retrieve.
+
Returns:
+
An ArrayList of integer arrays representing the player's field. Each array represents a card placed on
+ the field. The elements of the array are the x-coordinate, y-coordinate, id of the card, and a boolean
+ value (1 for true, 0 for false) indicating whether the card is face up. If no player with the provided
+ nickname is found, an empty ArrayList is returned. Returns null if the player's field has not yet been initialized.
+
Throws:
+
PlayerNotFoundException - if the player with the given nickname was not found in the list of players.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Tries to take a card from the hand of the player and place it in the field. If the card is placed successfully
+ calculate the points gained from its placement and add them to those of the player
+
+
Parameters:
+
id - is the id of the card in the hand of the player that has to be placed
+
x - is the horizontal coordinate of the position
+
y - is the vertical coordinate of the position
+
isUp - is the side of the card that is going to be visible when placed
The class RMIClientAcceptor is the implementation of the RMI methods that the interface
+ RMIClientAcceptorInt expose to the clients.
+ an instance of RMIClientNode invoke those methods on the server
+ when the client hasn't joined yet a game.
Invoking this method will result in the server using the content of the message to either create a new game and
+ add the sender as its first player or make him join an already existing one.
Invoking this method will result in the server using the content of the message to either create a new game and
+ add the sender as its first player or make him join an already existing one.
+ This process is done by making use of the class GamesManager.
+ If the previous part is successful, i.e. nothing went wrong with joining or creating a game, a new instance of
+ RMIServerNode will be created and assigned to the client that is invoking this method.
+
+ If a LobbyMessageException is thrown, an ErrorMessage will be sent to the client by invoking
+ the method RMIClientNodeInt.uploadStoC(StoCMessage) on the RMIClientNodeInt given as parameter.
public interface RMIClientAcceptorInt
+extends Remote
+
The interface RMIClientAcceptorInt exposes the RMI methods that a
+ RMIClientNode instance can invoke on the server when the client hasn't
+ joined yet a game.
+ On the server a RMIClientAcceptor will implement this interface to process the invocation of the methods
+ included.
The server will process the message according to its content. This can lead to the client creating a new game or
+ accessing an existing game
+
+ if a LobbyMessageException is thrown, the server will notify the client through the RMIClientNodeInt
+
+
Parameters:
+
node - an instance of RMIClientNodeInt that exports methods that the server can invoke on the client
public class SKClientAcceptor
+extends Object
+implements Runnable
+
The class SKClientAcceptor manages the new requests of connection to the server by the clients using socket
+ as network protocol.
+ Only one instance of this class is required to be created when the server is run.
+ Because this class is an implementation of the interface Runnable, is preferable to assign its instance to a
+ new thread to maximise parallelization.
+ Alternatively the method run() can be invoked directly. Doing this, however, will result in
+ the caller being stuck, waiting for new incoming connections.
+
+
+
+
+
+
+
+
Field Summary
+
Fields
+
+
Modifier and Type
+
Field
+
Description
+
private static final org.apache.logging.log4j.Logger
Invoking this method will lead to the creation of a ServerSocket that will wait for new incoming
+ connections.
+ When a client attempt to establish a connection with the server, a new instance of SKServerNode will be
+ created and the connection will be handled by this instance.
The interface RMIClientAcceptorInt exposes the RMI methods that a
+ RMIClientNode instance can invoke on the server when the client hasn't
+ joined yet a game.
This ClientNodeInterface interface is used to identify all ClientNodes through which communication with the
+ server can happen.
+ It's objective is to mask behind the interface the complexity of managing the network part of the client, so that the
+ other classes of the client don't have to know how is the communication between server and client working.
+ It contains all the methods that another class in the client can invoke on any ClientNode.
+ It's important to know that it's necessary and also enough to create one instance of ClientNode per client for the
+ entire duration of the game.
Send a CtoSMessage to the server that will process it.
+ A UploadFailureException exception is thrown if the message could not reach the server.
+ If the exception is thrown, the ClientNode might be in a corrupted/unusable state. The node will automatically
+ and independently reset itself and return to a normal state.
+
+
Parameters:
+
message - is the message that the client wants to send
Send a CtoSLobbyMessage to the server that will process it.
+ A UploadFailureException exception is thrown if the message could not reach the server.
+ If the exception is thrown, the ClientNode might be in a corrupted/unusable state. The node will automatically
+ and independently reset itself and return to a normal state.
+
+
Parameters:
+
message - is the message that the client wants to send
Inform the ClientNode that the interval for pongs is over.
+ This invocation can lead to the decrease of a pong counter. If the counter reach the minimum than the termination
+ process is started.
+
+ Invoking this method can lead, depending on the current state of the ClientNode, to verify if the connection to
+ the server is working through the emission of a ping to the server
The ClientPingTask class contains the pointer to a ClientNode, given when the object is instantiated.
+ This class is used by a Timer to invoke the method ClientNodeInterface.pongTimeOverdue()
+ on the given node.
RMIClientNode is the class that manage the connection with the server.
+ It implements the ClientNodeInterface interface and extends UnicastRemoteObject.
+ Is necessary and enough to instantiate one instance of this class to connect to the server.
+ If the connection were to go down, the instance will automatically try to reset and reconnect.
If the RMIClientNode is not alive or this method is called for more than one time before the termination
+ of the reset and reconnection process, the method will return immediately.
Standard constructor of the class.
+ It will try to connect to search for the Registry and the RMIClientAcceptor
+ on the server.
+ If any of the two is not found, it will throw a ConnectionSetupFailedException implying that the connection
+ is not possible.
+ Additionally, it will schedule a ClientPingTask to periodically check the connection with the server.
+
+
Parameters:
+
view - is the instance of View the RMIClientNode will use to process the messages received
+
ip - is the ip of the server
+
port - is the port of the server
+
Throws:
+
RemoteException - thrown if, during the instantiation, there were some problems
Check if the RMIClientNode is not alive or if the RMIClientNode is in pre-game state.
+ In both cases, the method will throw a UploadFailureException.
+ If those conditions are not met, the method will try to send the message to the server.
+ If the server is not reachable or the respective RMIServerNode is
+ closed, the method will request a reset and reconnection process and throw a UploadFailureException.
Check if the RMIClientNode is not alive or if the RMIClientNode is not in a pre-game state.
+ In both cases, the method will throw a UploadFailureException.
+ If those conditions are not met, the method will try to send the message to the
+ RMIClientAcceptor to process the CtoSLobbyMessage.
+ If the processing is successful, the pre-existing ClientPingTask will be cancelled and a new one will be
+ scheduled. At the same time the RMIClientNode will switch from pre-game state to game state.
If the RMIClientNode is not alive, the method will return immediately.
+ If the RMIClientNode is alive, the method will invoke resetTimeCounter()
+ Finally, after checking if the message is valid, the method will process it by calling the
+ StoCMessage.processMessage(View) method.
If the RMIClientNode is not alive or this method is called for more than one time before the termination
+ of the reset and reconnection process, the method will return immediately.
+ If not, all ClientPingTask will be cancelled, the timer will be purged and the RMIClientNode will
+ be set to not alive.
+ Finally, the thread will inform the View that the node has been disconnected and will task another thread
+ to carry out the reset and reconnection process.
+
+
+
+
+
+
resetConnection
+
+
privatevoidresetConnection()
+
tries infinitely to find the Registry and the RMIClientAcceptorInt on the server.
+ If the Registry and the RMIClientAcceptorInt is not found, the method will wait for a certain
+ amount of time before trying again.
+ Once the RMIClientAcceptorInt is found, the ClientNode will be set to alive and to a pre-game state.
+ Then a new ClientPingTask will be scheduled to periodically check the connection with the server and set
+ the pong count to its maximum.
+ Finally, the method will inform the View that the node has been reconnected.
+
+
+
+
+
+
startConnection
+
+
publicvoidstartConnection()
+
Start the connection with the server.
+
+
+
+
+
+
pongTimeOverdue
+
+
publicvoidpongTimeOverdue()
+
If the RMIClientNode is not alive, the method will return immediately.
+ If the RMIClientNode is alive, the method will check whether the ClientNode is in pre-game state or not.
+ If the ClientNode is in pre-game state, the method will assign to another thread the task of calling the
+ RMIClientAcceptorInt.extraPing() method.
+ IF the ClientNode is not in pre-game state, the method will decrement the pong count.
+ If the pong count reaches 0, the RMIClientNode will start the reset and reconnection process.
+ On the other hand, if the pong count is still more than 0 after decrementing, the client will send a
+ PingMessage to the server.
The interface RMIClientNodeInt exposes the RMI methods that a
+ RMIServerNode or RMIClientAcceptor
+ instance can invoke on the client.
+ On the client a RMIClientNode will implement this interface to process the invocation of the method included.
The client will process the message according to its content.
+ if a RemoteException or NodeClosedException is thrown, the ServerNode will start the termination
+ process.
+
+
Parameters:
+
message - a StoCMessage that the client has to process
+
Throws:
+
RemoteException - thrown if the method couldn't be invoked on the client
+
NodeClosedException - thrown if the ClientNode associated with the ServerNode is executing a reset of the
+ connection.
SKClientNode is the class that manage the connection with the server.
+ It implements the ClientNodeInterface interface and the method run() of Runnable interface
+ to handle the messages incoming from the server.
+ Is necessary and enough to instantiate one instance of this class to connect to the server.
+ If the connection were to go down, the instance will automatically try to reset and reconnect.
Standard constructor of the class.
+ Create the Socket connection with the server and the input and output streams.
+ At initialization a ping task is scheduled to run to check and maintain the connection alive.
+ A ConnectionSetupFailedException is thrown if the connection couldn't be established or during the
+ initialization of the input and output streams there were problems.
+
+
Parameters:
+
view - the view that will be used to process incoming messages
Standard run method of the class.
+ The thread that runs this method will be used to listen for incoming messages.
+ This will be done by remaining in a loop that will check if the connection is still alive and then listen for
+ incoming messages.
+ Listening for incoming messages and processing them will be done by invoking the method
+ listenForIncomingMessages().
+ If the method listenForIncomingMessages() throws an exception, the connection will be reset and the
+ reconnection process will start.
Listen for incoming messages using a ObjectInputStream.
+ Upon receiving a message, based on the type of the message, there can be two different outcomes:
+ If the message is a PongMessage, the method will return immediately.
+ If the message is a StoCMessage, the method will process the message by invoking the method
+ StoCMessage.processMessage(View).
+ If the IOException or ClassNotFoundException is thrown, the input stream will be corrupted and
+ the connection has to be reset and re-established.
+
+
Throws:
+
IOException - thrown if there were problems with the input stream
+
ClassNotFoundException - thrown if the class of the object received by the input stream is not recognized
Check if the connection is still alive and if it is, return immediately.
+ Alternatively, the method manageReconnectionRequests() will be invoked. A positive result of this
+ invocation will trigger the reset and reconnection process.
+
+
+
+
+
+
resetConnection
+
+
privatevoidresetConnection()
+
Invoking this method will forcibly set the SKClientNode status to not alive.
+ The method manageReconnectionRequests() is then invoked. A positive result of this invocation will
+ trigger the reset and reconnection process.
+
+
+
+
+
+
manageReconnectionRequests
+
+
privatebooleanmanageReconnectionRequests()
+
Check if the reset and reconnection process has already been requested.
+ If so, the caller will wait until the process is completed.
+ On the other hand, flag the reset and reconnection process as requested.
+ This will result in cancelling the ping tasks of the SKClientNode and purging the timer.
+ Additionally the view will be notified that the node has been disconnected.
+
+
Returns:
+
true if the caller has to start the reset and reconnection process, false otherwise
+
+
+
+
+
+
+
connect
+
+
privatevoidconnect()
+
Reset the current connection by closing the input and output streams and the socket.
+ Try until successful to establish a new connection to server.
+ If the connection is established:
+ - New input and output streams will be created.
+ - The pong count will be reset to the maximum value.
+ - The status of the SKClientNode will be set to alive and the view will be notified that the node has
+ reconnected.
+ - Finally all waiting threads for the reconnection process will be notified and a new ClientPingTask
+ will be scheduled.
+
+
+
+
+
+
startConnection
+
+
publicvoidstartConnection()
+
Start the connection.
+ The method will submit the SKClientNode to the ExecutorService to start the connection.
+
+
+
+
+
+
pongTimeOverdue
+
+
publicvoidpongTimeOverdue()
+
If the SKClientNode is not alive, the method will return immediately.
+ If the SKClientNode is alive, the pong count will be decremented.
+ If the pong count reaches 0, the SKClientNode will start the reset and reconnection process.
+ On the other hand, if the pong count is still more than 0 after decrementing, the client will send a
+ PingMessage to the server.
Each instance of class RMIServerNode handle une RMI connection with a client.
+ If, at some point, the connection were to go down, this instance while begin automatically a termination process
Send a StoCMessage to the client.
+ If the client is not alive or the connection had issues and the message couldn't reach the client, a
+ UploadFailureException will be thrown.
+ If any of the two exceptions is thrown, the RMIServerNode will start the destruction process.
If the RMIServerNode is not alive, the method will return immediately.
+ If the RMIServerNode is alive, the ping count will be decremented.
+ If the ping count reaches 0, the RMIServerNode will start the destruction process.
+ On the other hand, if the ping count is still more than 0 after decrementing, the server will send a
+ PongMessage to the client.
Destroy the RMIServerNode.
+ The method will stop the ServerPingTask and will disconnect the RMIServerNode from the
+ GameController if already assigned.
+ The method will also unexport the RMIServerNode from the RMI registry.
Set the GameController associated with this RMIServerNode. All incoming messages will be
+ processed by this GameController.
+ Invoking this method will also add a new ServerPingTask to the GameController timer for pinging
+ the client
The interface RMIServerNodeInt exposes the RMI methods that a
+ RMIClientNode instance can invoke on the server.
+ On the server a RMIServerNode will implement this interface to process the invocation of the method included.
The server will process the message according to its content.
+ if a RemoteException or NodeClosedException is thrown, the ClientNode will reset automatically the
+ connection
+
+
Parameters:
+
message - a CtoSMessage that the server has to process
+
Throws:
+
RemoteException - thrown if the method couldn't be invoked on the client
+
NodeClosedException - thrown if the ServerNode associated with the ClientNode is terminated server-side
Each instance of class SKServerNode handles a socket connection with a client.
+ If, at some point, the connection were to go down, this instance will begin automatically a termination process.
+ The class implements the Runnable interface to allow the instance to be run in a separate thread.
Standard constructor of the class.
+ It creates a new instance of SKServerNode and initializes the input and output streams.
+ It also sets the socket timeout.
+ A temporary ping task is created to check if the client is still alive while the gameController is not yet assigned
+ Throwing an exception implies that this class is not correctly initialized and should be destroyed. This also
+ implies that the socket and its streams are closed.
Method that starts the reading of the incoming messages from the input stream of the client.
+ This method will process the incoming messages and will call the appropriate method of the GameController
+ to handle the message.
+ If at some point, the instance of SKServerNode is not alive, the thread will terminate.
+ Any problem with the input stream will cause the destruction of the SKServerNode.
Method that listens for incoming messages from the client.
+ The method will wait until a message is received from the client.
+ When a message is received, the method will check the type of the message:
+ - If the message is a PingMessage, the method will return immediately.
+ - If the message is a CtoSMessage and a GameController is already set, the method will call the
+ elaborateMessage method on the message.
+ - If the message is a CtoSLobbyMessage and a GameController is not yet set, the method will call
+ the elaborateMessage method on the message and set the GameController to the one returned by the
+ method.
+ - If the message is not recognized, the method will send an ErrorMessage to the client.
+ If the method encounters any problem while processing the message, it will throw an exception.
+
+
Throws:
+
IOException - exception thrown if there are problems with the input stream
+
ClassNotFoundException - exception thrown if the class of the object received from the input stream is not found
+
NodeClosedException - exception thrown if the instance of SKServerNode is not alive
Method that sends a StoCMessage to the client. ù
+ If the client is not alive or the connection had issues and the message couldn't reach the client, a
+ UploadFailureException will be thrown.
+ If the client wasn't reachable, the method will start the destruction process.
msg - is the message that the server wants to send
+
Throws:
+
UploadFailureException - if the message couldn't be sent to the client or the ServerNode is not alive
+
+
+
+
+
+
+
pingTimeOverdue
+
+
publicvoidpingTimeOverdue()
+
Method that should be called at regular intervals.
+ If the SKServerNode is not alive, the method will return immediately.
+ If the SKServerNode is alive, the ping count will be decremented.
+ If the ping count reaches 0, the SKServerNode will start the destruction process.
+ On the other hand, if the ping count is still more than 0 after decrementing, the server will send a
+ PongMessage to the client.
Method that destroys the instance of SKServerNode.
+ It closes the input and output streams and the socket.
+ If the SKServerNode is linked to a GameController, it will disconnect from it.
+ It also cancels all ping tasks and then purges the timer of the Configuration class and
+ GameController.
+ The method will also set the status of the SKServerNode to not alive.
This ServerNodeInterface interface is used to identify all ServerNodes through which communication, with
+ clients, can happen.
+ It's objective is to mask behind the interface the complexity of managing the network part of the server, so that the
+ other classes of the server don't have to know how is the communication between server and client working.
+ It contains all the methods that another class in the server can invoke on any ServerNode.
+ It's important to know that each instance of ServerNode is assigned to a different client. If, at some point, the
+ communication to a client is impossible, the instance of ServerNode assigned to that client will follow a termination
+ process that will lead to the destruction of the instance itself and every object strictly linked to it. A new
+ instance will have to be created if the client were to reconnect later.
Send a StoCMessage to the client that will process it.
+ A UploadFailureException exception is thrown if the message could not reach the client.
+ If the exception is thrown, the ServerNode will automatically and independently begin the termination process.
+
+
Parameters:
+
message - is the message that the server wants to send
Inform the ServerNode that the interval for pings is over.
+ This invocation can lead to the decrease of a ping counter. If the counter reach the minimum than the termination
+ process is started.
+
+ Invoking this method can lead, depending on the current state of the ServerNode, to verify if the connection to
+ the client is working through the emission of a ping to the client.
+
+
+
+
+
+
resetTimeCounter
+
+
voidresetTimeCounter()
+
The invocation of this method will lead to the reset of the ping counter, i.e. bringing it back to maximum,
+ associated with the ServerNode.Ad
The ServerPingTask class contains the pointer to a ServerNode, given when the object is instantiated.
+ This class is used by a Timer to invoke the method ServerNodeInterface.pingTimeOverdue()
+ on the given node.
Each instance of class RMIServerNode handle une RMI connection with a client.
+ If, at some point, the connection were to go down, this instance while begin automatically a termination process
Returns the enum constant of this class with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this class. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
public class NodeClosedException
+extends Throwable
+
A simple Exception that extends Throwable and add nothing else.
+ Used to notify the caller that the Node (Server or Client) on which the method was invoked, is not usable at the
+ moment.
public class UninitializedException
+extends Throwable
+
A simple Exception that extends Throwable and add nothing else.
+ Used to notify the SKClientAcceptor that the instantiation
+ of a SKClientNode was unsuccessful.
public class UploadFailureException
+extends Throwable
+
A simple Exception that extends Throwable and add nothing else.
+ Used to notify the caller that the message given to the Node (Server or Client) could not be sent.
This class is responsible for managing and storing server configuration parameters.
+
+ This class implements the singleton pattern allowing the server configuration to be unique and
+ retrievable everywhere in the project.
+
+ Configuration options come from 3 sources: hardcoded, config file, startup parameters
This is a private constructor according to singleton pattern characteristics.
+
+ The server configurations are by default hardcoded but can be overwritten by a config file or through the
+ parameters given.
+
+ Overwrite rules are as follows:
+
The overwrite priority is, in order: startup parameters (most important), config file, hardcoded (least important)
+
Socket port number is prioritized over RMI port number
+
+
Parameters:
+
args - is an array of strings used as configuration parameters
+
+
+
+
+
+
+
+
+
+
+
Method Details
+
+
+
+
portValidator
+
+
protectedintportValidator(int newPort,
+ int defaultPort)
+
Verify that the new port number comply with port rules and in that case returns it.
+
+
Parameters:
+
newPort - is the new port number that has to be evaluated to substitute the default one
+
defaultPort - is the default port number. It has to be a valid port number
+
Returns:
+
the new port number if valid, the default one otherwise
Return the singleton instance of this class.
+
+ If the instance was never initialized before it will be created assuming there are no startup parameters.
This method returns a list of all IPv4 addresses of the current machine.
+ It iterates over all network interfaces and their associated addresses.
+ If an address is an instance of Inet4Address, it is added to the list.
+
+
Returns:
+
A list of strings representing the IPv4 addresses.
This class provides methods to check if an IP address and a port number are valid.
+ Used to validate the IP address and port number provided by the user.
This method checks if the provided IP address is valid.
+ An IP address is considered valid if it has 4 parts separated by dots,
+ each part is a number between 0 and 255, and the first part is not 0.
+
+
Parameters:
+
ip - The IP address to be checked.
+
Returns:
+
true if the IP address is valid, false otherwise.
+
+
+
+
+
+
+
isPortValid
+
+
publicbooleanisPortValid(int port)
+
This method checks if the provided port number is valid.
+ A port number is considered valid if it is greater than 0 and less than or equal to 65535.
+
+
Parameters:
+
port - The port number to be checked.
+
Returns:
+
true if the port number is valid, false otherwise.
+
+
+
+
diff --git a/deliverables/JavaDoc/legal/ADDITIONAL_LICENSE_INFO b/deliverables/JavaDoc/legal/ADDITIONAL_LICENSE_INFO
new file mode 100644
index 00000000..ff700cd0
--- /dev/null
+++ b/deliverables/JavaDoc/legal/ADDITIONAL_LICENSE_INFO
@@ -0,0 +1,37 @@
+ ADDITIONAL INFORMATION ABOUT LICENSING
+
+Certain files distributed by Oracle America, Inc. and/or its affiliates are
+subject to the following clarification and special exception to the GPLv2,
+based on the GNU Project exception for its Classpath libraries, known as the
+GNU Classpath Exception.
+
+Note that Oracle includes multiple, independent programs in this software
+package. Some of those programs are provided under licenses deemed
+incompatible with the GPLv2 by the Free Software Foundation and others.
+For example, the package includes programs licensed under the Apache
+License, Version 2.0 and may include FreeType. Such programs are licensed
+to you under their original licenses.
+
+Oracle facilitates your further distribution of this package by adding the
+Classpath Exception to the necessary parts of its GPLv2 code, which permits
+you to use that code in combination with other independent modules not
+licensed under the GPLv2. However, note that this would not permit you to
+commingle code under an incompatible license with Oracle's GPLv2 licensed
+code by, for example, cutting and pasting such code into a file also
+containing Oracle's GPLv2 licensed code and then distributing the result.
+
+Additionally, if you were to remove the Classpath Exception from any of the
+files to which it applies and distribute the result, you would likely be
+required to license some or all of the other code in that distribution under
+the GPLv2 as well, and since the GPLv2 is incompatible with the license terms
+of some items included in the distribution by Oracle, removing the Classpath
+Exception could therefore effectively compromise your ability to further
+distribute the package.
+
+Failing to distribute notices associated with some files may also create
+unexpected legal consequences.
+
+Proceed with caution and we recommend that you obtain the advice of a lawyer
+skilled in open source matters before removing the Classpath Exception or
+making modifications to this package which may subsequently be redistributed
+and/or involve the use of third party software.
diff --git a/deliverables/JavaDoc/legal/ASSEMBLY_EXCEPTION b/deliverables/JavaDoc/legal/ASSEMBLY_EXCEPTION
new file mode 100644
index 00000000..42966666
--- /dev/null
+++ b/deliverables/JavaDoc/legal/ASSEMBLY_EXCEPTION
@@ -0,0 +1,27 @@
+
+OPENJDK ASSEMBLY EXCEPTION
+
+The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
+openjdk.org ("OpenJDK Code") is distributed under the terms of the GNU
+General Public License version 2
+only ("GPL2"), with the following clarification and special exception.
+
+ Linking this OpenJDK Code statically or dynamically with other code
+ is making a combined work based on this library. Thus, the terms
+ and conditions of GPL2 cover the whole combination.
+
+ As a special exception, Oracle gives you permission to link this
+ OpenJDK Code with certain code licensed by Oracle as indicated at
+ https://openjdk.org/legal/exception-modules-2007-05-08.html
+ ("Designated Exception Modules") to produce an executable,
+ regardless of the license terms of the Designated Exception Modules,
+ and to copy and distribute the resulting executable under GPL2,
+ provided that the Designated Exception Modules continue to be
+ governed by the licenses under which they were offered by Oracle.
+
+As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
+to build an executable that includes those portions of necessary code that
+Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
+with the Classpath exception). If you modify or add to the OpenJDK code,
+that new GPL2 code may still be combined with Designated Exception Modules
+if the new code is made subject to this exception by its copyright holder.
diff --git a/deliverables/JavaDoc/legal/LICENSE b/deliverables/JavaDoc/legal/LICENSE
new file mode 100644
index 00000000..8b400c7a
--- /dev/null
+++ b/deliverables/JavaDoc/legal/LICENSE
@@ -0,0 +1,347 @@
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users. This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it. (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have. You must
+make sure that they, too, receive or can get the source code. And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License. The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope. The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+ a) You must cause the modified files to carry prominent notices stating
+ that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in whole or
+ in part contains or is derived from the Program or any part thereof, to be
+ licensed as a whole at no charge to all third parties under the terms of
+ this License.
+
+ c) If the modified program normally reads commands interactively when run,
+ you must cause it, when started running for such interactive use in the
+ most ordinary way, to print or display an announcement including an
+ appropriate copyright notice and a notice that there is no warranty (or
+ else, saying that you provide a warranty) and that users may redistribute
+ the program under these conditions, and telling the user how to view a copy
+ of this License. (Exception: if the Program itself is interactive but does
+ not normally print such an announcement, your work based on the Program is
+ not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works. But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable source
+ code, which must be distributed under the terms of Sections 1 and 2 above
+ on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three years, to
+ give any third party, for a charge no more than your cost of physically
+ performing source distribution, a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of Sections 1
+ and 2 above on a medium customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer to
+ distribute corresponding source code. (This alternative is allowed only
+ for noncommercial distribution and only if you received the program in
+ object code or executable form with such an offer, in accord with
+ Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable. However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works. These actions are prohibited by law if you do not
+accept this License. Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein. You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time. Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+ One line to give the program's name and a brief idea of what it does.
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+ with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free
+ software, and you are welcome to redistribute it under certain conditions;
+ type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary. Here
+is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ 'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ signature of Ty Coon, 1 April 1989
+
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+ Linking this library statically or dynamically with other modules is making
+ a combined work based on this library. Thus, the terms and conditions of
+ the GNU General Public License cover the whole combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,
+ and to copy and distribute the resulting executable under terms of your
+ choice, provided that you also meet, for each linked independent module,
+ the terms and conditions of the license of that module. An independent
+ module is a module which is not derived from or based on this library. If
+ you modify this library, you may extend this exception to your version of
+ the library, but you are not obligated to do so. If you do not wish to do
+ so, delete this exception statement from your version.
diff --git a/deliverables/JavaDoc/legal/jquery.md b/deliverables/JavaDoc/legal/jquery.md
new file mode 100644
index 00000000..d468b318
--- /dev/null
+++ b/deliverables/JavaDoc/legal/jquery.md
@@ -0,0 +1,72 @@
+## jQuery v3.6.1
+
+### jQuery License
+```
+jQuery v 3.6.1
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************
+
+The jQuery JavaScript Library v3.6.1 also includes Sizzle.js
+
+Sizzle.js includes the following license:
+
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/sizzle
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+*********************
+
+```
diff --git a/deliverables/JavaDoc/legal/jqueryUI.md b/deliverables/JavaDoc/legal/jqueryUI.md
new file mode 100644
index 00000000..8bda9d7a
--- /dev/null
+++ b/deliverables/JavaDoc/legal/jqueryUI.md
@@ -0,0 +1,49 @@
+## jQuery UI v1.13.2
+
+### jQuery UI License
+```
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+```
diff --git a/deliverables/JavaDoc/member-search-index.js b/deliverables/JavaDoc/member-search-index.js
new file mode 100644
index 00000000..3464e3a5
--- /dev/null
+++ b/deliverables/JavaDoc/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"accessGame(String, int, ServerNodeInterface)","u":"accessGame(java.lang.String,int,it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AccessGameConfirmMessage","l":"AccessGameConfirmMessage(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"AccessGameMessage","l":"AccessGameMessage(int, String)","u":"%3Cinit%3E(int,java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"activeRes"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"addCard(Card)","u":"addCard(it.polimi.ingsw.am32.model.card.Card)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"addCard(NonObjectiveCard)","u":"addCard(it.polimi.ingsw.am32.model.card.NonObjectiveCard)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"addIncomingMessageToChat(String, String)","u":"addIncomingMessageToChat(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.chat","c":"Chat","l":"addMessage(ChatMessage)","u":"addMessage(it.polimi.ingsw.am32.chat.ChatMessage)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"addMessage(CtoSLobbyMessage)","u":"addMessage(it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListenerInterface","l":"addMessage(CtoSLobbyMessage)","u":"addMessage(it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"addMessage(CtoSMessage)","u":"addMessage(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListenerInterface","l":"addMessage(CtoSMessage)","u":"addMessage(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"addMessage(StoCMessage)","u":"addMessage(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualViewInterface","l":"addMessage(StoCMessage)","u":"addMessage(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"addObjectivePoints()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"addObjectivePoints()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"addPlayer(String)","u":"addPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"addPlayer(String)","u":"addPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"addPlayer(String, ServerNodeInterface)","u":"addPlayer(java.lang.String,it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"addTimerTask(ServerPingTask)","u":"addTimerTask(it.polimi.ingsw.am32.network.ServerNode.ServerPingTask)"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"addToField(CardPlacedView)","u":"addToField(it.polimi.ingsw.am32.client.CardPlacedView)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"aliveLock"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"aliveLock"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"aliveLock"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"aliveLock"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"AllSpecial","l":"AllSpecial()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"AlreadyComputedPointsException","l":"AlreadyComputedPointsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"alreadyEnteredTerminatingPhase"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"AnglesCovered","l":"AnglesCovered()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"ANIMAL"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"ANIMAL"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANIMAL"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANIMALCARD"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_BLACK"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_BLUE"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_GREEN"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_PURPLE"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_RED"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_RESET"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ANSI_YELLOW"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"app"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"areWeTerminating()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"areWeTerminating()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"askCreateGame()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"askCreateGame()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askCreateGame()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askForLocalIPAddress()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askIfWantToReconnect()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"askJoinGame()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"askJoinGame()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askJoinGame()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"askListener"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"AskListener(ClientNodeInterface)","u":"%3Cinit%3E(it.polimi.ingsw.am32.network.ClientNode.ClientNodeInterface)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askNickname()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"askReconnectGame()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"askReconnectGame()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askReconnectGame()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"askSelectGameMode()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"askSelectGameMode()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"askSelectGameMode()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"AssignedSecretObjectiveCardMessage(String, ArrayList, ArrayList, ArrayList)","u":"%3Cinit%3E(java.lang.String,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"assignedSecretObjectiveCards"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedStarterCardMessage","l":"AssignedStarterCardMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"assignRandomColoursToPlayers()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"assignRandomColoursToPlayers()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"assignRandomStartingGoldCardsToPlayers()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"assignRandomStartingGoldCardsToPlayers()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"assignRandomStartingInitialCardsToPlayers()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"assignRandomStartingInitialCardsToPlayers()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"assignRandomStartingResourceCardsToPlayers()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"assignRandomStartingResourceCardsToPlayers()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"assignRandomStartingSecretObjectivesToPlayers()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"assignRandomStartingSecretObjectivesToPlayers()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"assignStartingCard(NonObjectiveCard)","u":"assignStartingCard(it.polimi.ingsw.am32.model.card.NonObjectiveCard)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"attemptingReconnection"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"availableSpace(int, int)","u":"availableSpace(int,int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"availableSpaces"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"availableSpaces"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"availableSpacesPlayer()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"backupMatchStatus"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"BLACK"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"BLANK"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"BLUE"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"board"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"BoardView","l":"board"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"boards"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"BoardView","l":"BoardView(int[], String[][])","u":"%3Cinit%3E(int[],java.lang.String[][])"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"bottomLeft"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"bottomLeftBack"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"bottomRight"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"bottomRightBack"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeckBuilder","l":"buildCardDeck(DeckType)","u":"buildCardDeck(it.polimi.ingsw.am32.model.deck.utils.DeckType)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeckBuilder","l":"buildNonObjectiveCardDeck(DeckType)","u":"buildNonObjectiveCardDeck(it.polimi.ingsw.am32.model.deck.utils.DeckType)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"AllSpecial","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"AnglesCovered","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"CountResource","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Diagonals","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Empty","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationFour","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationOne","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationThree","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationTwo","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"PointStrategy","l":"calculateOccurrences(Field, int, int)","u":"calculateOccurrences(it.polimi.ingsw.am32.model.field.Field,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"canAttemptReconnection"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientPingTask","l":"cancel()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerPingTask","l":"cancel()"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"CARD_DRAWN"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"CARD_PLACED"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"Card(int, int, PointStrategy)","u":"%3Cinit%3E(int,int,it.polimi.ingsw.am32.model.card.pointstrategy.PointStrategy)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"CardDeck(ArrayList, DeckType)","u":"%3Cinit%3E(java.util.ArrayList,it.polimi.ingsw.am32.model.deck.utils.DeckType)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeckBuilder","l":"CardDeckBuilder()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"DrawCardMessage","l":"cardId"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"cardId"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedSecretObjectiveCardMessage","l":"cardId"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedStarterCardMessage","l":"cardId"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"cardImage"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"cardImage()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"cardImg"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"CardPlaced(NonObjectiveCard, int, int, boolean)","u":"%3Cinit%3E(it.polimi.ingsw.am32.model.card.NonObjectiveCard,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"CardPlacedView(int, ArrayList, int, int, boolean)","u":"%3Cinit%3E(int,java.util.ArrayList,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"cards"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"cards"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"CardType"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"changeNode(ServerNodeInterface)","u":"changeNode(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualViewInterface","l":"changeNode(ServerNodeInterface)","u":"changeNode(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"chat"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"CHAT_ERROR"},{"p":"it.polimi.ingsw.am32.chat","c":"Chat","l":"Chat()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"chatArea"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"chatArea"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"ChatArea(int, int, int, int, ArrayList, GraphicalUI)","u":"%3Cinit%3E(int,int,int,int,java.util.ArrayList,it.polimi.ingsw.am32.client.view.gui.GraphicalUI)"},{"p":"it.polimi.ingsw.am32.chat","c":"Chat","l":"chatHistory"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"chatHistory"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"chatHistory"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"ChatMessage(String, String, boolean, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,boolean,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"ChatMessage(String, String, boolean, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,boolean,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"chatMode"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"checkConnection()"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"checkResRequirements(int[], int[])","u":"checkResRequirements(int[],int[])"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"CHOOSE_CONNECTION"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"chooseConnection()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"chooseConnection()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"chooseConnection()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"chooseSecretObjectiveCard(String, int)","u":"chooseSecretObjectiveCard(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"chooseStarterCardSide(String, boolean)","u":"chooseStarterCardSide(java.lang.String,boolean)"},{"p":"it.polimi.ingsw.am32","c":"Client","l":"chooseUI()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"chosenCommonObjectiveCards"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmSelectedSecretObjectiveCardMessage","l":"chosenSecretObjectiveCard"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"clearInstance()"},{"p":"it.polimi.ingsw.am32","c":"Client","l":"Client()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"clientNode"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"clientNode"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"clientNode"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"clientPingTask"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"clientPingTask"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientPingTask","l":"ClientPingTask(ClientNodeInterface)","u":"%3Cinit%3E(it.polimi.ingsw.am32.network.ClientNode.ClientNodeInterface)"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"code"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"colour"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"colour"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"colour"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"Colour(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"ColourCard(String)","u":"ColourCard(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"column"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"commonObjCards"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"commonObjCardView"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"commonObjectives"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationFourComparator","l":"compare(CardPlaced, CardPlaced)","u":"compare(it.polimi.ingsw.am32.model.field.CardPlaced,it.polimi.ingsw.am32.model.field.CardPlaced)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationTwoComparator","l":"compare(CardPlaced, CardPlaced)","u":"compare(it.polimi.ingsw.am32.model.field.CardPlaced,it.polimi.ingsw.am32.model.field.CardPlaced)"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"conditionCount"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"ConditionCount"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"config"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"config"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"Configuration(String[])","u":"%3Cinit%3E(java.lang.String[])"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmSelectedSecretObjectiveCardMessage","l":"ConfirmSelectedSecretObjectiveCardMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"ConfirmStarterCardSideSelectionMessage(String, int, boolean, ArrayList, int[], int)","u":"%3Cinit%3E(java.lang.String,int,boolean,java.util.ArrayList,int[],int)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"connect()"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"connected"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerConnectedMessage","l":"connectedNickname"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"connectionNode"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"connectionNodeLock"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"connectionRoot"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ConnectionSetupFailedException","l":"ConnectionSetupFailedException()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"content"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"content"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"convertToColour(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"convertToColour(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"convertToColour(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"convertToImagePath(int, boolean)","u":"convertToImagePath(int,boolean)"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"Corner"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"CornerBack"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"CornerType(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"CountResource","l":"count"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"CountResource","l":"CountResource(ObjectType, int)","u":"%3Cinit%3E(it.polimi.ingsw.am32.model.card.pointstrategy.ObjectType,int)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"CREATE_GAME"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"CREATE_GAME_FAILURE"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createAlert(String)","u":"createAlert(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createBottomLinePanel()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createButton(String)","u":"createButton(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createButton(String, int, int)","u":"createButton(java.lang.String,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createButton(String, int, String, int, int)","u":"createButton(java.lang.String,int,java.lang.String,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createComboBox(List, String, int, int, int, int)","u":"createComboBox(java.util.List,java.lang.String,int,int,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createDeckArea()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"createFieldPlayer(String, boolean)","u":"createFieldPlayer(java.lang.String,boolean)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"createFieldPlayer(String, boolean)","u":"createFieldPlayer(java.lang.String,boolean)"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"createGame(String, int, ServerNodeInterface)","u":"createGame(java.lang.String,int,it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"createInstance(String[])","u":"createInstance(java.lang.String[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createLabel(String, int)","u":"createLabel(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createLabel(String, int, int)","u":"createLabel(java.lang.String,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createNoticeEventPanel()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createPlayerInfoPanel()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createTextField(String, int, int, int, int)","u":"createTextField(java.lang.String,int,int,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"createTopLinePanel()"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"CriticalFailureException","l":"CriticalFailureException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"ctoSProcessingLock"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"ctoSProcessingLock"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"cToSProcessingLock"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"cToSProcessingLock"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"CTRDuplicateNicknameException","l":"CTRDuplicateNicknameException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"CTRPlayerNotFoundException","l":"CTRPlayerNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"currentEvent"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"currentGoldCards"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"currentGoldCards"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"currentGoldCards"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"currentPlayer"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"currentPlayer"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"currentPlayerNickname"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"currentResourceCards"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"currentResourceCards"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"currentResourceCards"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"currentTurnNumber"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"deckArea"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"DeckSizeUpdateMessage(String, int, int, int[], int[], int, int)","u":"%3Cinit%3E(java.lang.String,int,int,int[],int[],int,int)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"DrawCardMessage","l":"deckType"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"deckType"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"deckType"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"DeckType(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"deletePlayer(String)","u":"deletePlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"deletePlayer(String)","u":"deletePlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"destroy()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"destroy()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"destroyCalled"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"destroyCalled"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Diagonals","l":"Diagonals(ObjectType, boolean)","u":"%3Cinit%3E(it.polimi.ingsw.am32.model.card.pointstrategy.ObjectType,boolean)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"disconnect(ServerNodeInterface)","u":"disconnect(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"disconnectBeforeGameStart(PlayerQuadruple)","u":"disconnectBeforeGameStart(it.polimi.ingsw.am32.controller.PlayerQuadruple)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"disconnectCurrentPlayerAfterPlacing(PlayerQuadruple)","u":"disconnectCurrentPlayerAfterPlacing(it.polimi.ingsw.am32.controller.PlayerQuadruple)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"disconnectCurrentPlayerBeforePlacing(PlayerQuadruple)","u":"disconnectCurrentPlayerBeforePlacing(it.polimi.ingsw.am32.controller.PlayerQuadruple)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"disconnectDuringLobby(PlayerQuadruple)","u":"disconnectDuringLobby(it.polimi.ingsw.am32.controller.PlayerQuadruple)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerDisconnectMessage","l":"disconnectedNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerReconnectedMessage","l":"disconnectedNickname"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"disconnectNotCurrentPlayer(PlayerQuadruple)","u":"disconnectNotCurrentPlayer(it.polimi.ingsw.am32.controller.PlayerQuadruple)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"DRAW_CARD"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"DRAW_CARD_FAILURE"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"draw()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"draw()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"drawCard(int, int)","u":"drawCard(int,int)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"drawCard(int, int)","u":"drawCard(int,int)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"drawCard(String, int, int)","u":"drawCard(java.lang.String,int,int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardConfirmationMessage","l":"DrawCardConfirmationMessage(String, ArrayList)","u":"%3Cinit%3E(java.lang.String,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardFailedMessage","l":"DrawCardFailedMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"DrawCardMessage","l":"DrawCardMessage(String, int, int)","u":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"DrawException","l":"DrawException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"dropShadow"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"DUPLICATE_NICKNAME_EXCEPTION"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"DuplicateNicknameException","l":"DuplicateNicknameException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"CtoSMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"DrawCardMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PingMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestGameStatusMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestPlayerFieldMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedSecretObjectiveCardMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedStarterCardSideMessage","l":"elaborateMessage(GameController)","u":"elaborateMessage(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"AccessGameMessage","l":"elaborateMessage(ServerNodeInterface)","u":"elaborateMessage(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"CtoSLobbyMessage","l":"elaborateMessage(ServerNodeInterface)","u":"elaborateMessage(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"NewGameMessage","l":"elaborateMessage(ServerNodeInterface)","u":"elaborateMessage(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"ReconnectGameMessage","l":"elaborateMessage(ServerNodeInterface)","u":"elaborateMessage(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"EMPTY"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"EMPTY"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Empty","l":"Empty()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"endGameDueToDisconnectionTimeout"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"endGamePane"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"endMatchDueToDisconnection()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"endMatchDueToDisconnectionTimerTask"},{"p":"it.polimi.ingsw.am32.controller","c":"EndMatchDueToDisconnectionTimerTask","l":"EndMatchDueToDisconnectionTimerTask(GameController)","u":"%3Cinit%3E(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"enterEndPhase()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"enterLobbyPhase()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"enterLobbyPhase()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"enterPlayingPhase()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"enterPlayingPhase()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"enterPreparationPhase()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"enterPreparationPhase()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"enterPreparationPhase()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"enterTerminatedPhase()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"enterTerminatedPhase()"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"ErrorMessage(String, String, int)","u":"%3Cinit%3E(java.lang.String,java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"ErrorMessageCode(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"errorType"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"Event(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"eventLabel"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageException","l":"exceptionType"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"executorService"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"executorService"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"executorService"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"RMIClientAcceptor","l":"extraPing()"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"RMIClientAcceptorInt","l":"extraPing()"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"field"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"Field(NonObjectiveCard, boolean)","u":"%3Cinit%3E(it.polimi.ingsw.am32.model.card.NonObjectiveCard,boolean)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"fieldCards"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"flushMessages()"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListenerInterface","l":"flushMessages()"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"flushMessages()"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualViewInterface","l":"flushMessages()"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"FULL_LOBBY_EXCEPTION"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"FullLobbyException","l":"FullLobbyException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"FUNGI"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"FUNGI"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"FUNGI"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"FUNGICARD"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"GAME_ALREADY_ENDED_EXCEPTION"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"GAME_ALREADY_STARTED_EXCEPTION"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"GAME_CREATED"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"GAME_ENDED"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"GAME_JOINED"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"GAME_NOT_FOUND_EXCEPTION"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"GAME_NOT_YET_STARTED_EXCEPTION"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"GAME_RECONNECTED"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"GAME_START"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"GameAlreadyEndedException","l":"GameAlreadyEndedException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"GameAlreadyStartedException","l":"GameAlreadyStartedException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"gameCommonObjectives"},{"p":"it.polimi.ingsw.am32.controller","c":"EndMatchDueToDisconnectionTimerTask","l":"gameController"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"gameController"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"gameController"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"GameController(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"GameControllerStatus(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"gameCurrentGoldCards"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"gameCurrentResourceCards"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"gameField"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"gameGoldDeckSize"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"gameID"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"GameNotFoundException","l":"GameNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"GameNotYetStartedException","l":"GameNotYetStartedException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"gameResourcesDeckSize"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"games"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"gameSize"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"GamesManager()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"GameStartedMessage","l":"GameStartedMessage(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"generateResponseGameStatusMessage(String)","u":"generateResponseGameStatusMessage(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"getActiveRes(ObjectType)","u":"getActiveRes(it.polimi.ingsw.am32.model.card.pointstrategy.ObjectType)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"getAllRes()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getAvailableSpacesPlayer(String)","u":"getAvailableSpacesPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getAvailableSpacesPlayer(String)","u":"getAvailableSpacesPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"BoardView","l":"getBoard()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getBottomLeft()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getBottomLeftBack()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getBottomRight()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getBottomRightBack()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"getBox(ImageView)","u":"getBox(javafx.scene.image.ImageView)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"getCardFromPosition(int, int)","u":"getCardFromPosition(int,int)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"getCards()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"getCards()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getChat()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"getChatArea()"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"getCode()"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"getColour()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"getColour()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getColour()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getCommonObjectives()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getCommonObjectives()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getConditionCount()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getConditionCount()"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"getConnectionNode()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getCorner()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getCornerBack()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"CountResource","l":"getCount()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getCurrentGoldCards()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getCurrentGoldCards()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getCurrentPlayerNickname()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getCurrentPlayerNickname()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getCurrentResourcesCards()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getCurrentResourcesCards()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getCurrentTurnNumber()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getCurrentTurnNumber()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"getDeckType()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"getDeckType()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getEndGameDueToDisconnectionTimeout()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"getEvent()"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"getEvent(int)"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageException","l":"getExceptionType()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getExecutorService()"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"getField()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getField()"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"getFieldCards()"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"getGames()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getGameSize()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getGoldCardDeckSize()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getGoldCardDeckSize()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getGoldCardsDeck()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getHand()"},{"p":"it.polimi.ingsw.am32.chat","c":"Chat","l":"getHistory()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getId()"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"getId()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getID()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"getID()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getInitialCard()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getInitialCardPlayer(String)","u":"getInitialCardPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getInitialCardPlayer(String)","u":"getInitialCardPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"getInput()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"getInputInt()"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"getInstance()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getInstance()"},{"p":"it.polimi.ingsw.am32.utilities","c":"IPAddressFinder","l":"getIPv4Addresses()"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"getIsUp()"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"getJSONPath()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getKingdom()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getKingdom()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"BoardView","l":"getLimits()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getLobbyPlayerCount()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getMatchStatus()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getMatchStatus()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getMaxPingCount()"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"getMessageContent()"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"getMessageContent()"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"getMessageQueue()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getModel()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getNextGoldCardKingdom()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getNextGoldCardKingdom()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getNextResourceCardKingdom()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getNextResourceCardKingdom()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"getNickname()"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"getNickname()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getNickname()"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"getNode()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getNodeList()"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"getNonObjectiveCard()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getPermRes()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getPermRes()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getPingTimeInterval()"},{"p":"it.polimi.ingsw.am32.chat","c":"Chat","l":"getPlayerChatHistory(String)","u":"getPlayerChatHistory(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayerColour(String)","u":"getPlayerColour(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayerColour(String)","u":"getPlayerColour(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayerField(String)","u":"getPlayerField(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayerField(String)","u":"getPlayerField(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayerHand(String)","u":"getPlayerHand(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayerHand(String)","u":"getPlayerHand(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayerPoints(String)","u":"getPlayerPoints(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayerPoints(String)","u":"getPlayerPoints(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayerResources(String)","u":"getPlayerResources(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayerResources(String)","u":"getPlayerResources(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayers()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayerSecretObjective(String)","u":"getPlayerSecretObjective(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayerSecretObjective(String)","u":"getPlayerSecretObjective(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPlayersNicknames()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPlayersNicknames()"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"getPoints()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"getPoints()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getPoints()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getPointsGainedFromObjectives()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getPointsGainedFromObjectives(String)","u":"getPointsGainedFromObjectives(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getPointsGainedFromObjectives(String)","u":"getPointsGainedFromObjectives(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getPointStrategy()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"getPointStrategy()"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"getPointStrategy()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getPointStrategyCount()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"getPointStrategyCount()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"getPointStrategyLeftToRight()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getPointStrategyType()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"getPointStrategyType()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"getPrimaryStage()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"getReason()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"getReason()"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AccessGameConfirmMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedStarterCardMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmSelectedSecretObjectiveCardMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardConfirmationMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardFailedMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"GameStartedMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidInboundChatMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"LobbyPlayerListMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchStatusMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NegativeResponsePlayerFieldMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NewGameConfirmationMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardFailedMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerConnectedMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerDisconnectMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerReconnectedMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerTurnMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PongMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ReconnectGameConfirmMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"StoCMessage","l":"getRecipientNickname()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getResourceCardDeckSize()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getResourceCardDeckSize()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getResourceCardsDeck()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"getResourceLabels()"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"getResources()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getRmiPort()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getSecretObjective()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getSecretObjectiveCardsPlayer(String)","u":"getSecretObjectiveCardsPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getSecretObjectiveCardsPlayer(String)","u":"getSecretObjectiveCardsPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"getSenderNickname()"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"getSenderNickname()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getServerIp()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getSocketPort()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"getSocketReadTimeout()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getStatus()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"getThisPlayerNickname()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"getTimer()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"getTmpSecretObj()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getTopLeft()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getTopLeftBack()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getTopRight()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"getTopRightBack()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getType()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"CountResource","l":"getType()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Diagonals","l":"getType()"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"getValue()"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"getValue()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"getValue()"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"getValue()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"getValue()"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"getValue()"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"getValue()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"getValue()"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"getValue()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"getValue()"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"getVirtualView()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"getWelcomeRoot()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"getWinners()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"getWinners()"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"getX()"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"getY()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"glow"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"GOLD"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"goldCardDeckFacingKingdom"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"goldCardDeckFacingKingdom"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"goldCardDeckFacingKingdom"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"goldCardDeckSize"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"goldCardsDeck"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"goldDeckSize"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"goldDeckView"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"goldSize"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"graphicalUI"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"GraphicalUI()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"GraphicalUIApplication()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"GREEN"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"gui"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"hand"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"hand"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleAvailableSpaceClick(ImageView, int, int)","u":"handleAvailableSpaceClick(javafx.scene.image.ImageView,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleBoardAction(StackPane)","u":"handleBoardAction(javafx.scene.layout.StackPane)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleButtonClick(Button, Button, Button, Effect)","u":"handleButtonClick(javafx.scene.control.Button,javafx.scene.control.Button,javafx.scene.control.Button,javafx.scene.effect.Effect)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleButtonJoinAndReconnectClick(TextField, TextField)","u":"handleButtonJoinAndReconnectClick(javafx.scene.control.TextField,javafx.scene.control.TextField)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleDeckCardsClicks(ImageView, int, int)","u":"handleDeckCardsClicks(javafx.scene.image.ImageView,int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleDeckClicks()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleEvent(Event, String)","u":"handleEvent(it.polimi.ingsw.am32.client.Event,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"handleEvent(Event, String)","u":"handleEvent(it.polimi.ingsw.am32.client.Event,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"handleEvent(Event, String)","u":"handleEvent(it.polimi.ingsw.am32.client.Event,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleFailureCase(Event, String)","u":"handleFailureCase(it.polimi.ingsw.am32.client.Event,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"handleFailureCase(Event, String)","u":"handleFailureCase(it.polimi.ingsw.am32.client.Event,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"handleFailureCase(Event, String)","u":"handleFailureCase(it.polimi.ingsw.am32.client.Event,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleHandClicks()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"handleLastConnectedPlayerIfPresent()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handleNoticeClicks(Group)","u":"handleNoticeClicks(javafx.scene.Group)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handlePlayerNicknameClick(String)","u":"handlePlayerNicknameClick(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handView"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"handViewCardSide"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"hashCode()"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"hashCode()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"icon(String)","u":"icon(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"iconArray(int[])"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"iconArrayElement(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"iconCard(String)","u":"iconCard(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"id"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"id"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"ID"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"ID"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"ID"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"ID()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"imagesMap"},{"p":"it.polimi.ingsw.am32","c":"Client","l":"in"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"in"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"InboundChatMessage(String, String, boolean, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,boolean,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"indexCardPlaced"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"initializeChatArea(int, int, int, int, ArrayList)","u":"initializeChatArea(int,int,int,int,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"initializeGameField(boolean)"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"INKWELL"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"INKWELL"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"INKWELL"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"inputMessageField"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"inputObtStr"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"inputObtStr"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"INSECARD"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"INSECT"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"INSECT"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"INSECT"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"instance"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"instance"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"INVALID_PLAYER_NUMBER_EXCEPTION"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"InvalidHandSizeException","l":"InvalidHandSizeException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidInboundChatMessage","l":"InvalidInboundChatMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"InvalidPlayerNumberException","l":"InvalidPlayerNumberException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"InvalidPositionException","l":"InvalidPositionException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"InvalidSelectedSecretObjectiveCardMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"InvalidSelectionException","l":"InvalidSelectionException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"InvalidStarterCardSideSelectionMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"ip"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"ip"},{"p":"it.polimi.ingsw.am32.utilities","c":"IPAddressFinder","l":"IPAddressFinder()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"isConnected()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"isCurrentPlayerConnected()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"isDisconnected"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"isDisconnected"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"isFirstPlayer()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"isFirstPlayer()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"isInThread"},{"p":"it.polimi.ingsw.am32.utilities","c":"IsValid","l":"isIpValid(String)","u":"isIpValid(java.lang.String)"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"isMulticastFlag()"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"isMulticastFlag()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"isMyTurn"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"isOnline"},{"p":"it.polimi.ingsw.am32.utilities","c":"IsValid","l":"isPortValid(int)"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"isTerminating()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"isUp"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedStarterCardSideMessage","l":"isUp"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"isUp"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"isValid"},{"p":"it.polimi.ingsw.am32.utilities","c":"IsValid","l":"IsValid()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"jejuHallasanFont"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"JOIN_GAME"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"JOIN_GAME_FAILURE"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"JSON_CONFIG_FILE_NAME"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"JSONPath"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"kingdom"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"Kingdom"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"LAST_TURN"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"LAST_TURN"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"lastOnlinePlayer"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"launch()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"launch()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"launch()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationFour","l":"LConfigurationFour()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationFourComparator","l":"LConfigurationFourComparator()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationOne","l":"LConfigurationOne()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationThree","l":"LConfigurationThree()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationTwo","l":"LConfigurationTwo()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationTwoComparator","l":"LConfigurationTwoComparator()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Diagonals","l":"leftToRight"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"BoardView","l":"limits"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"listenForIncomingMessages()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"listenForIncomingMessages()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeckBuilder","l":"loadCardsFromDisk(DeckType)","u":"loadCardsFromDisk(it.polimi.ingsw.am32.model.deck.utils.DeckType)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeckBuilder","l":"loadCardsFromDisk(DeckType)","u":"loadCardsFromDisk(it.polimi.ingsw.am32.model.deck.utils.DeckType)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"LOBBY"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"LOBBY"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"LOBBY"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageException","l":"LobbyMessageException(LobbyMessageExceptionEnumeration, String)","u":"%3Cinit%3E(it.polimi.ingsw.am32.controller.exceptions.abstraction.LobbyMessageExceptionEnumeration,java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"LobbyMessageExceptionEnumeration(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"lobbyMessageQueue"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"LobbyPlayerListMessage","l":"LobbyPlayerListMessage(String, ArrayList)","u":"%3Cinit%3E(java.lang.String,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"lock"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"lockInput"},{"p":"it.polimi.ingsw.am32.utilities","c":"Log4J2ConfiguratorWrapper","l":"Log4J2ConfiguratorWrapper()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"logger"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"logger"},{"p":"it.polimi.ingsw.am32.controller","c":"EndMatchDueToDisconnectionTimerTask","l":"logger"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"logger"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"logger"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"RMIClientAcceptor","l":"logger"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"SKClientAcceptor","l":"logger"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"logger"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"logger"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"logger"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"logger"},{"p":"it.polimi.ingsw.am32","c":"Server","l":"logger"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"logger"},{"p":"it.polimi.ingsw.am32","c":"Client","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"it.polimi.ingsw.am32","c":"Server","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"it.polimi.ingsw.am32.chat.exceptions","c":"MalformedMessageException","l":"MalformedMessageException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.exceptions","c":"MalformedMessageException","l":"MalformedMessageException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"manageReconnectionRequests()"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"MANUSCRIPT"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"MANUSCRIPT"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"MANUSCRIPT"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"masterPane"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"Match()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"AccessGameMessage","l":"matchId"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"ReconnectGameMessage","l":"matchId"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NewGameConfirmationMessage","l":"matchId"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"matchStatus"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchStatusMessage","l":"matchStatus"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"matchStatus"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"matchStatus"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"MatchStatus(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchStatusMessage","l":"MatchStatusMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"MatchWinnersMessage(String, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList)","u":"%3Cinit%3E(java.lang.String,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"maxPingCount"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"message"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"MESSAGE_TYPE_NOT_RECOGNIZED"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"messageContent"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"messageContent"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"messageDisplayArea"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"messageQueue"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"messageQueue"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"messageScrollPane"},{"p":"it.polimi.ingsw.am32.client.exceptions","c":"MissingJSONException","l":"MissingJSONException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"MissingJSONException","l":"MissingJSONException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"MissingRequirementsException","l":"MissingRequirementsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"model"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"multicastFlag"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"multicastFlag"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"multicastFlag"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NegativeResponsePlayerFieldMessage","l":"NegativeResponsePlayerFieldMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"networkIsDown"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"NEW_PLAYER_JOIN"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"newAvailableFieldSpaces"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"newAvailableFieldSpaces"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NewGameConfirmationMessage","l":"NewGameConfirmationMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"NewGameMessage","l":"NewGameMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"nextTurn()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"nextTurn()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"nickname"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"nickname"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"nickname"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"nickname"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"nickname"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"nickname"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"nickname"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"node"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientPingTask","l":"node"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerPingTask","l":"node"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"NodeClosedException","l":"NodeClosedException()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"nodeDisconnected()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"nodeDisconnected()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"nodeDisconnected()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"nodeList"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"nodePreState"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"nodeReconnected()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"nodeReconnected()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"nodeReconnected()"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"NON_COVERABLE"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"NON_COVERABLE"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NonEmptyHandException","l":"NonEmptyHandException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NonNullColourException","l":"NonNullColourException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NonNullFieldException","l":"NonNullFieldException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"NonObjCardFactory(String, int, int, String, String, int, String, String[], String[], int[], int[])","u":"%3Cinit%3E(java.lang.String,int,int,java.lang.String,java.lang.String,int,java.lang.String,java.lang.String[],java.lang.String[],int[],int[])"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"nonObjCards"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"NonObjectiveCard(int, int, PointStrategy, CornerType, CornerType, CornerType, CornerType, CornerType, CornerType, CornerType, CornerType, int[], int[], ObjectType)","u":"%3Cinit%3E(int,int,it.polimi.ingsw.am32.model.card.pointstrategy.PointStrategy,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,int[],int[],it.polimi.ingsw.am32.model.card.pointstrategy.ObjectType)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"NonObjectiveCardDeck(ArrayList, DeckType)","u":"%3Cinit%3E(java.util.ArrayList,it.polimi.ingsw.am32.model.deck.utils.DeckType)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeckBuilder","l":"NonObjectiveCardDeckBuilder()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"notice"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"noticeEventPanel"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"notifyAskListener(CtoSLobbyMessage)","u":"notifyAskListener(it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"notifyAskListener(CtoSMessage)","u":"notifyAskListener(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"notLinkedPingTask"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"notLinkedSocketTimer"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NullColourException","l":"NullColourException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NullFieldException","l":"NullFieldException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NullHandException","l":"NullHandException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.chat.exceptions","c":"NullMessageException","l":"NullMessageException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"NullPointStrategyException","l":"NullPointStrategyException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"OBJECTIVE"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"ObjectiveCardFactory(int, int, String, String, int, boolean)","u":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,int,boolean)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"objectiveCards"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"objectiveCardsDeck"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"objectivePointsState"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeckBuilder","l":"objectsBuilder"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeckBuilder","l":"objectsBuilder"},{"p":"it.polimi.ingsw.am32.model.deck","c":"ObjectsBuilder","l":"ObjectsBuilder()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"ObjectType(int)","u":"%3Cinit%3E(int)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"oldActiveRes"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"oldPoints"},{"p":"it.polimi.ingsw.am32","c":"Client","l":"out"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"out"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"OutboundChatMessage(String, String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"outputObtStr"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"outputObtStr"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"performMove(int, int, int, boolean)","u":"performMove(int,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"permRes"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"PermRes"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"pickRandomCommonObjectives()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"pickRandomCommonObjectives()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"pingCount"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"pingCount"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"PINGINTERVAL"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"PINGINTERVAL"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PingMessage","l":"PingMessage(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"pingTimeInterval"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"pingTimeOverdue()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerNodeInterface","l":"pingTimeOverdue()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"pingTimeOverdue()"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"PLACE_CARD"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"PLACE_CARD_FAILURE"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"placeCard(int, int, int, boolean)","u":"placeCard(int,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"placeCard(int, int, int, boolean)","u":"placeCard(int,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"placeCard(String, int, int, int, boolean)","u":"placeCard(java.lang.String,int,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"PlaceCardConfirmationMessage(String, String, int, int[], boolean, int, int[], ArrayList)","u":"%3Cinit%3E(java.lang.String,java.lang.String,int,int[],boolean,int,int[],java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardFailedMessage","l":"PlaceCardFailedMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"placeCardInField(NonObjectiveCard, int, int, boolean)","u":"placeCardInField(it.polimi.ingsw.am32.model.card.NonObjectiveCard,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"PlaceCardMessage(String, int, int, int, boolean)","u":"%3Cinit%3E(java.lang.String,int,int,int,boolean)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"PlaceCardRollbackMessage(String, String, int, int, int[])","u":"%3Cinit%3E(java.lang.String,java.lang.String,int,int,int[])"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"placedCard"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"placedCard"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"placedCardCoordinates"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"placedSide"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"PLANT"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"PLANT"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"PLANT"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"PLANTCARD"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"PLAYER_ALREADY_CONNECTED_EXCEPTION"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"PLAYER_DISCONNECTED"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"PLAYER_NOT_FOUND_EXCEPTION"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"PLAYER_RECONNECTED"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"Player(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"PlayerAlreadyConnectedException","l":"PlayerAlreadyConnectedException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerAssignedSecretObjectiveCards"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"playerColour"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerColours"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerConnected"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerConnectedMessage","l":"PlayerConnectedMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerDisconnectMessage","l":"PlayerDisconnectMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"playerField"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"playerField"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerFields"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"PlayerGameStatusMessage(String, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, int, int, int[], ArrayList, ArrayList>, int[], ArrayList, ArrayList, ArrayList, int, int, int, ArrayList, String, ArrayList, int, int)","u":"%3Cinit%3E(java.lang.String,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int,int[],java.util.ArrayList,java.util.ArrayList,int[],java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int,int,java.util.ArrayList,java.lang.String,java.util.ArrayList,int,int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"playerHand"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardConfirmationMessage","l":"playerHand"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerHand"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"playerList"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"LobbyPlayerListMessage","l":"playerList"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"playerListView"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestPlayerFieldMessage","l":"playerNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NegativeResponsePlayerFieldMessage","l":"playerNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"playerNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"playerNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerTurnMessage","l":"playerNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"playerNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerNicknames"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"PlayerNotFoundException","l":"PlayerNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"playerNum"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"NewGameMessage","l":"playerNum"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"playerOrder"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"playerPoints"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"playerPoints"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerPoints"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"PlayerPub(String, int, ArrayList, int[], boolean)","u":"%3Cinit%3E(java.lang.String,int,java.util.ArrayList,int[],boolean)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"PlayerPubView(Label, ImageView, Label, Label[])","u":"%3Cinit%3E(javafx.scene.control.Label,javafx.scene.image.ImageView,javafx.scene.control.Label,javafx.scene.control.Label[])"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"PlayerQuadruple(ServerNodeInterface, String, boolean, VirtualView)","u":"%3Cinit%3E(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface,java.lang.String,boolean,it.polimi.ingsw.am32.controller.VirtualView)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerReconnectedMessage","l":"PlayerReconnectedMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"playerResources"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"playerResources"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"playerResources"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerResources"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"playerResources"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"players"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"players"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"players"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerSecretObjective"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playersResourcesSummary"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"playerStartingCard"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerTurnMessage","l":"PlayerTurnMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"playerViews"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"PLAYING"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"PLAYING"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"points"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"points"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"points"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"points"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"pointsGainedFromObjectives"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"pointsGainedFromSecrets"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"pointStrategy"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"PointStrategy"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"PointStrategy"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"PointStrategyCount"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"PointStrategyCount"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"PointStrategyLeftToRight"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"PointStrategyType"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"PointStrategyType"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"pongCount"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"pongCount"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"PONGMAXCOUNT"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"PONGMAXCOUNT"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PongMessage","l":"PongMessage(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"pongPlayer(String)","u":"pongPlayer(java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientNodeInterface","l":"pongTimeOverdue()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"pongTimeOverdue()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"pongTimeOverdue()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"port"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"port"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"portValidator(int, int)","u":"portValidator(int,int)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"PREPARATION"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"PREPARATION"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"prePingTask"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"primaryStage"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"processLobbyMessages()"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"processMessage()"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"processMessage()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AccessGameConfirmMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedStarterCardMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmSelectedSecretObjectiveCardMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardConfirmationMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardFailedMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"GameStartedMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidInboundChatMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"LobbyPlayerListMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchStatusMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NegativeResponsePlayerFieldMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NewGameConfirmationMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardFailedMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerConnectedMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerDisconnectMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerReconnectedMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerTurnMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PongMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ReconnectGameConfirmMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"StoCMessage","l":"processMessage(View)","u":"processMessage(it.polimi.ingsw.am32.client.View)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"processRegularMessage()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"publicInfo"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"purgeTimer()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"putCardInHand(NonObjectiveCard)","u":"putCardInHand(it.polimi.ingsw.am32.model.card.NonObjectiveCard)"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"queuesLock"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"QUILL"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"QUILL"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"QUILL"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"randomizePlayersOrder()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"randomizePlayersOrder()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"readInputThread()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardFailedMessage","l":"reason"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidInboundChatMessage","l":"reason"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"reason"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"reason"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardFailedMessage","l":"reason"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"receiveSecretObjective(Card, Card)","u":"receiveSecretObjective(it.polimi.ingsw.am32.model.card.Card,it.polimi.ingsw.am32.model.card.Card)"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"receiveSecretObjectiveChoiceFromPlayer(String, int)","u":"receiveSecretObjectiveChoiceFromPlayer(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"receiveSecretObjectiveChoiceFromPlayer(String, int)","u":"receiveSecretObjectiveChoiceFromPlayer(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AccessGameConfirmMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedStarterCardMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmSelectedSecretObjectiveCardMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardConfirmationMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardFailedMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"GameStartedMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidInboundChatMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"LobbyPlayerListMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchStatusMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NegativeResponsePlayerFieldMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NewGameConfirmationMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardFailedMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerConnectedMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerDisconnectMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerReconnectedMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerTurnMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PongMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ReconnectGameConfirmMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"recipientNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"recipientString"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"RECONNECT_GAME"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"RECONNECT_GAME_FAILURE"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"reconnect(String, ServerNodeInterface)","u":"reconnect(java.lang.String,it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"reconnectCalled"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"reconnectCalled"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ReconnectGameConfirmMessage","l":"ReconnectGameConfirmMessage(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"ReconnectGameMessage","l":"ReconnectGameMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.controller","c":"GamesManager","l":"reconnectToGame(String, int, ServerNodeInterface)","u":"reconnectToGame(java.lang.String,int,it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationFour","l":"recursiveOccurrences(ArrayList)","u":"recursiveOccurrences(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"LConfigurationTwo","l":"recursiveOccurrences(ArrayList)","u":"recursiveOccurrences(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"RED"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"registry"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"REMOTEOBJECTNAME"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"removedCard"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"requestDrawCard()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"requestDrawCard()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"requestDrawCard()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestGameStatusMessage","l":"RequestGameStatusMessage(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"requestPlaceCard()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"requestPlaceCard()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"requestPlaceCard()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestPlayerFieldMessage","l":"RequestPlayerFieldMessage(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"requestReconnection()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"requestSelectSecretObjectiveCard()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"requestSelectSecretObjectiveCard()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"requestSelectSecretObjectiveCard()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"requestSelectStarterCardSide(int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"requestSelectStarterCardSide(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"requestSelectStarterCardSide(int)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"resetConnection()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"resetConnection()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"resetSelectionPaneContext()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"resetTimeCounter()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"resetTimeCounter()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"resetTimeCounter()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerNodeInterface","l":"resetTimeCounter()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"resetTimeCounter()"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"RESOURCE"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"resourceCardDeckFacingKingdom"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"resourceCardDeckFacingKingdom"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"resourceCardDeckFacingKingdom"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"resourceCardDeckSize"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"resourceCardsDeck"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"resourceCornersConverter(CornerType, CornerType, CornerType, CornerType)","u":"resourceCornersConverter(it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType,it.polimi.ingsw.am32.model.card.CornerType)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"resourceDeckSize"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"resourceDeckView"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"resourceLabels"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"resources"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"resourceSize"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"resourcesObtained(NonObjectiveCard, boolean)","u":"resourcesObtained(it.polimi.ingsw.am32.model.card.NonObjectiveCard,boolean)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"resourcesSize"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"ResponsePlayerFieldMessage(String, String, ArrayList, int[])","u":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.ArrayList,int[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"retrieveResourceURI(String)","u":"retrieveResourceURI(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"returnToMyField"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"rmiClientAcceptor"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"RMIClientAcceptor","l":"RMIClientAcceptor()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"RMIClientNode(View, String, int)","u":"%3Cinit%3E(it.polimi.ingsw.am32.client.View,java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"rmiPort"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"RMIServerNode(RMIClientNodeInt)","u":"%3Cinit%3E(it.polimi.ingsw.am32.network.ClientNode.RMIClientNodeInt)"},{"p":"it.polimi.ingsw.am32.model.field","c":"Field","l":"rollback()"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"RollbackException","l":"RollbackException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"rollbackMove()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"rollbackPlacement()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"rollbackPlacement()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"row"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"ruleBookImages"},{"p":"it.polimi.ingsw.am32.client.listener","c":"AskListener","l":"run()"},{"p":"it.polimi.ingsw.am32.controller","c":"EndMatchDueToDisconnectionTimerTask","l":"run()"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"run()"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"SKClientAcceptor","l":"run()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientPingTask","l":"run()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"run()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerPingTask","l":"run()"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"run()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"searchNonObjCardById(int)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"secObjOptions"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"secretObjCards"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"secretObjCardSelected"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"secretObjCardView"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"secretObjective"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"SecretObjectiveCardException","l":"SecretObjectiveCardException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"secretObjectiveSelection(int)"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"secrets"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECT_GAME_MODE"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECT_SECRET_OBJ_CARD"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECT_SECRET_OBJ_CARD_FAILURE"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECT_STARTER_CARD_SIDE"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECT_STARTER_CARD_SIDE_FAILURE"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECTED_SECRET_OBJ_CARD"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"SELECTED_STARTER_CARD_SIDE"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"selectedCardId"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedSecretObjectiveCardMessage","l":"SelectedSecretObjectiveCardMessage(String, int)","u":"%3Cinit%3E(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedStarterCardSideMessage","l":"SelectedStarterCardSideMessage(String, boolean)","u":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"selectionPane"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"AccessGameMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"DrawCardMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"NewGameMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PingMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"ReconnectGameMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestGameStatusMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestPlayerFieldMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedSecretObjectiveCardMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedStarterCardSideMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"senderNickname"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"sendGameStatus(String)","u":"sendGameStatus(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"sendPlayerField(String, String)","u":"sendPlayerField(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32","c":"Server","l":"Server(String[])","u":"%3Cinit%3E(java.lang.String[])"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"serverIp"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"serverIpValidator(String, String)","u":"serverIpValidator(java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"serverNode"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"serverPingTask"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"serverPingTask"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerPingTask","l":"ServerPingTask(ServerNodeInterface)","u":"%3Cinit%3E(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"service"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"setActive(boolean)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setApp(GraphicalUIApplication)","u":"setApp(it.polimi.ingsw.am32.client.view.gui.GraphicalUIApplication)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setCardsReceived(ArrayList, ArrayList, ArrayList)","u":"setCardsReceived(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"setCardsReceived(ArrayList, ArrayList, ArrayList)","u":"setCardsReceived(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"setCardsReceived(ArrayList, ArrayList, ArrayList)","u":"setCardsReceived(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"setColour(Colour)","u":"setColour(it.polimi.ingsw.am32.model.player.Colour)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"setColour(Image)","u":"setColour(javafx.scene.image.Image)"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"setConnected(boolean)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"setGameController(GameController)","u":"setGameController(it.polimi.ingsw.am32.controller.GameController)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setGameView()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"setImg()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"setLastTurn()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"setLastTurn()"},{"p":"it.polimi.ingsw.am32.utilities","c":"Log4J2ConfiguratorWrapper","l":"setLogLevelAndConfigure(Level)","u":"setLogLevelAndConfigure(org.apache.logging.log4j.Level)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"setNextPlayer(Optional)","u":"setNextPlayer(java.util.Optional)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"setNickname(String)","u":"setNickname(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"setNode(ServerNodeInterface)","u":"setNode(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"setNonObjCardArray()"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"setObjectiveCardArray()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"setPoints(int)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"setPoints(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"PlayerPubView","l":"setResourceLabels(int[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setRMIClient(String, int)","u":"setRMIClient(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"setRMIClient(String, int)","u":"setRMIClient(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"setRMIClient(String, int)","u":"setRMIClient(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setSocketClient(String, int)","u":"setSocketClient(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"setSocketClient(String, int)","u":"setSocketClient(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"setSocketClient(String, int)","u":"setSocketClient(java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setStarterCard(int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"setStarterCard(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"setStarterCard(int)"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"setTerminating()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"setTerminating()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"setTerminating()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setupInitialCardSideSelectionArea(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setUpPlayersData()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"setUpPlayersData()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"setUpPlayersData()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"setupSecretObjectiveCardSelectionArea(int, int)","u":"setupSecretObjectiveCardSelectionArea(int,int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showBoard(String)","u":"showBoard(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showCard(int, boolean)","u":"showCard(int,boolean)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showCard(int, boolean)","u":"showCard(int,boolean)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showCard(int, boolean)","u":"showCard(int,boolean)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showChatHistory(List)","u":"showChatHistory(java.util.List)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showChatHistory(List)","u":"showChatHistory(java.util.List)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showChatHistory(List)","u":"showChatHistory(java.util.List)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showDeck()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showDeck()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showDeck()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showHand()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showHand()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showHand()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showHelpInfo()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showHelpInfo()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showHelpInfo()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showMatchWinners(ArrayList, ArrayList, ArrayList, ArrayList, ArrayList)","u":"showMatchWinners(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showMatchWinners(ArrayList, ArrayList, ArrayList, ArrayList, ArrayList)","u":"showMatchWinners(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showMatchWinners(ArrayList, ArrayList, ArrayList, ArrayList, ArrayList)","u":"showMatchWinners(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showObjectiveCards(ArrayList)","u":"showObjectiveCards(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showPlayerInGame()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showPlayersField(String)","u":"showPlayersField(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showPlayersField(String)","u":"showPlayersField(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showPlayersField(String)","u":"showPlayersField(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showPointsAndResource(String)","u":"showPointsAndResource(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showPointsAndResource(String)","u":"showPointsAndResource(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showPointsAndResource(String)","u":"showPointsAndResource(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showRuleBook()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"showWelcome()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"showWelcome()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"showWelcome()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"CardDeck","l":"shuffle()"},{"p":"it.polimi.ingsw.am32.model.deck","c":"NonObjectiveCardDeck","l":"shuffle()"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"side"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"side"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"side()"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"SKClientAcceptor","l":"SKClientAcceptor()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"SKClientNode(View, String, int)","u":"%3Cinit%3E(it.polimi.ingsw.am32.client.View,java.lang.String,int)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"SKServerNode(Socket)","u":"%3Cinit%3E(java.net.Socket)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"socket"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"socket"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"socketPort"},{"p":"it.polimi.ingsw.am32.utilities","c":"Configuration","l":"socketReadTimeout"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"SOCKETTIMEOUT"},{"p":"it.polimi.ingsw.am32","c":"Server","l":"start()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"start(Stage)","u":"start(javafx.stage.Stage)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"startCard"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"startChatting()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"startChatting()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"startChatting()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"startConnection()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"startConnection()"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"STARTERCARD"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"starterCardsDeck"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"STARTING"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"startingCardId"},{"p":"it.polimi.ingsw.am32","c":"Server","l":"startRMIServer()"},{"p":"it.polimi.ingsw.am32","c":"Server","l":"startSocketServer()"},{"p":"it.polimi.ingsw.am32.model.match","c":"Match","l":"startTurns()"},{"p":"it.polimi.ingsw.am32.model","c":"ModelInterface","l":"startTurns()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"status"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"Status"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"statusIsAlive"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"statusIsAlive"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"statusIsAlive"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"statusIsAlive"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"STOCLOBBYMESSAGE_SENT_BUT_GAMECONTROLLER_ALREADY_PRESENT"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"STOCMESSAGE_SENT_BEFORE_STOCLOBBYMESSAGE"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"stoCProcessingLock"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"stoCProcessingLock"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"sToCProcessingLock"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"sToCProcessingLock"},{"p":"it.polimi.ingsw.am32.model.deck","c":"ObjectsBuilder","l":"stringsToPointStrategy(String, String, int, boolean)","u":"stringsToPointStrategy(java.lang.String,java.lang.String,int,boolean)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"ObjectsBuilder","l":"stringToCornerType(String)","u":"stringToCornerType(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.deck","c":"ObjectsBuilder","l":"stringToObjectType(String)","u":"stringToObjectType(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"stuckTurnFlag"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"submissionArea"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"submitButton"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"ChatArea","l":"submitChatMessage()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"submitChatMessage(ChatMessage)","u":"submitChatMessage(it.polimi.ingsw.am32.chat.ChatMessage)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"submitVirtualViewMessage(StoCMessage)","u":"submitVirtualViewMessage(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"TERMINATED"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"TERMINATED"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"terminating"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"TERMINATING"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"TERMINATING"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"TextUI()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"thisPlayerNickname"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"THREADSLEEPINTERVAL"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"THREADSLEEPINTERVAL"},{"p":"it.polimi.ingsw.am32.controller","c":"GameController","l":"timer"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"timer"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"timer"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"tmpSecretObj"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"toArray()"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"topLeft"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"topLeftBack"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"topRight"},{"p":"it.polimi.ingsw.am32.model.card","c":"NonObjectiveCard","l":"topRightBack"},{"p":"it.polimi.ingsw.am32.chat","c":"ChatMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"toString()"},{"p":"it.polimi.ingsw.am32.client","c":"ChatMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"AccessGameMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"CtoSLobbyMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"CtoSMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"DrawCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"InboundChatMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"NewGameMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PingMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"PlaceCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"ReconnectGameMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestGameStatusMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"RequestPlayerFieldMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedSecretObjectiveCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","c":"SelectedStarterCardSideMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AccessGameConfirmMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedSecretObjectiveCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"AssignedStarterCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmSelectedSecretObjectiveCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ConfirmStarterCardSideSelectionMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DeckSizeUpdateMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardConfirmationMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"DrawCardFailedMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ErrorMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"GameStartedMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidInboundChatMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidSelectedSecretObjectiveCardMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"InvalidStarterCardSideSelectionMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"LobbyPlayerListMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchStatusMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NegativeResponsePlayerFieldMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"NewGameConfirmationMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"OutboundChatMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardConfirmationMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardFailedMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlaceCardRollbackMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerConnectedMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerDisconnectMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerGameStatusMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerReconnectedMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PlayerTurnMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"PongMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ReconnectGameConfirmMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"ResponsePlayerFieldMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"StoCMessage","l":"toString()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"CountResource","l":"type"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"Diagonals","l":"type"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"UninitializedException","l":"UninitializedException()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateAfterDrawCard(ArrayList)","u":"updateAfterDrawCard(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateAfterDrawCard(ArrayList)","u":"updateAfterDrawCard(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateAfterDrawCard(ArrayList)","u":"updateAfterDrawCard(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateAfterPlacedCard(String, int, int, int, boolean, ArrayList, int[], int)","u":"updateAfterPlacedCard(java.lang.String,int,int,int,boolean,java.util.ArrayList,int[],int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateAfterPlacedCard(String, int, int, int, boolean, ArrayList, int[], int)","u":"updateAfterPlacedCard(java.lang.String,int,int,int,boolean,java.util.ArrayList,int[],int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateAfterPlacedCard(String, int, int, int, boolean, ArrayList, int[], int)","u":"updateAfterPlacedCard(java.lang.String,int,int,int,boolean,java.util.ArrayList,int[],int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateBoardViewLimits(int, int, int[])","u":"updateBoardViewLimits(int,int,int[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateChat(String, String, String)","u":"updateChat(java.lang.String,java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateChat(String, String, String)","u":"updateChat(java.lang.String,java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateChat(String, String, String)","u":"updateChat(java.lang.String,java.lang.String,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"updateColour(String)","u":"updateColour(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateConfirmSelectedSecretCard(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateConfirmSelectedSecretCard(int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateConfirmSelectedSecretCard(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateConfirmStarterCard(int, int, boolean, ArrayList, int[])","u":"updateConfirmStarterCard(int,int,boolean,java.util.ArrayList,int[])"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateConfirmStarterCard(int, int, boolean, ArrayList, int[])","u":"updateConfirmStarterCard(int,int,boolean,java.util.ArrayList,int[])"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateConfirmStarterCard(int, int, boolean, ArrayList, int[])","u":"updateConfirmStarterCard(int,int,boolean,java.util.ArrayList,int[])"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateCurrentEvent(Event)","u":"updateCurrentEvent(it.polimi.ingsw.am32.client.Event)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateDeck(int, int, int[], int[], int, int)","u":"updateDeck(int,int,int[],int[],int,int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateDeck(int, int, int[], int[], int, int)","u":"updateDeck(int,int,int[],int[],int,int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateDeck(int, int, int[], int[], int, int)","u":"updateDeck(int,int,int[],int[],int,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateMatchStatus(int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateMatchStatus(int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateMatchStatus(int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateNewGameConfirm(int, String)","u":"updateNewGameConfirm(int,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateNewGameConfirm(int, String)","u":"updateNewGameConfirm(int,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateNewGameConfirm(int, String)","u":"updateNewGameConfirm(int,java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"updateOnline(boolean)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updatePlacedCardConfirm(String, int, int[], boolean, int, int[], ArrayList)","u":"updatePlacedCardConfirm(java.lang.String,int,int[],boolean,int,int[],java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updatePlacedCardConfirm(String, int, int[], boolean, int, int[], ArrayList)","u":"updatePlacedCardConfirm(java.lang.String,int,int[],boolean,int,int[],java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updatePlacedCardConfirm(String, int, int[], boolean, int, int[], ArrayList)","u":"updatePlacedCardConfirm(java.lang.String,int,int[],boolean,int,int[],java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updatePlayerData(ArrayList, ArrayList, ArrayList, ArrayList, int, int[], ArrayList>, int[], ArrayList, ArrayList, ArrayList, int, int, int, ArrayList, String, ArrayList, int, int, ArrayList, ArrayList, int)","u":"updatePlayerData(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int[],java.util.ArrayList,int[],java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int,int,java.util.ArrayList,java.lang.String,java.util.ArrayList,int,int,java.util.ArrayList,java.util.ArrayList,int)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updatePlayerData(ArrayList, ArrayList, ArrayList, ArrayList, int, int[], ArrayList>, int[], ArrayList, ArrayList, ArrayList, int, int, int, ArrayList, String, ArrayList, int, int, ArrayList, ArrayList, int)","u":"updatePlayerData(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int[],java.util.ArrayList,int[],java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int,int,java.util.ArrayList,java.lang.String,java.util.ArrayList,int,int,java.util.ArrayList,java.util.ArrayList,int)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updatePlayerData(ArrayList, ArrayList, ArrayList, ArrayList, int, int[], ArrayList>, int[], ArrayList, ArrayList, ArrayList, int, int, int, ArrayList, String, ArrayList, int, int, ArrayList, ArrayList, int)","u":"updatePlayerData(java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int[],java.util.ArrayList,int[],java.util.ArrayList,java.util.ArrayList,java.util.ArrayList,int,int,int,java.util.ArrayList,java.lang.String,java.util.ArrayList,int,int,java.util.ArrayList,java.util.ArrayList,int)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updatePlayerList(ArrayList)","u":"updatePlayerList(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updatePlayerList(ArrayList)","u":"updatePlayerList(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updatePlayerList(ArrayList)","u":"updatePlayerList(java.util.ArrayList)"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updatePlayerTurn(String)","u":"updatePlayerTurn(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updatePlayerTurn(String)","u":"updatePlayerTurn(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updatePlayerTurn(String)","u":"updatePlayerTurn(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"updatePoints(int)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"updatePointsForObjectives(Card[])","u":"updatePointsForObjectives(it.polimi.ingsw.am32.model.card.Card[])"},{"p":"it.polimi.ingsw.am32.model.player","c":"Player","l":"updatePointsForSecretObjective()"},{"p":"it.polimi.ingsw.am32.client","c":"PlayerPub","l":"updateResources(int[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"updateRollback(String, int, int, int[])","u":"updateRollback(java.lang.String,int,int,int[])"},{"p":"it.polimi.ingsw.am32.client.view.tui","c":"TextUI","l":"updateRollback(String, int, int, int[])","u":"updateRollback(java.lang.String,int,int,int[])"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"updateRollback(String, int, int, int[])","u":"updateRollback(java.lang.String,int,int,int[])"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUIApplication","l":"updateScene(Parent, int, int)","u":"updateScene(javafx.scene.Parent,int,int)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"uploadCtoS(CtoSMessage)","u":"uploadCtoS(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNodeInt","l":"uploadCtoS(CtoSMessage)","u":"uploadCtoS(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"UploadFailureException","l":"UploadFailureException()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"uploadStoC(StoCMessage)","u":"uploadStoC(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNodeInt","l":"uploadStoC(StoCMessage)","u":"uploadStoC(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"RMIServerNode","l":"uploadToClient(StoCMessage)","u":"uploadToClient(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"ServerNodeInterface","l":"uploadToClient(StoCMessage)","u":"uploadToClient(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.network.ServerNode","c":"SKServerNode","l":"uploadToClient(StoCMessage)","u":"uploadToClient(it.polimi.ingsw.am32.message.ServerToClient.StoCMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientNodeInterface","l":"uploadToServer(CtoSLobbyMessage)","u":"uploadToServer(it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"uploadToServer(CtoSLobbyMessage)","u":"uploadToServer(it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"uploadToServer(CtoSLobbyMessage)","u":"uploadToServer(it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"ClientNodeInterface","l":"uploadToServer(CtoSMessage)","u":"uploadToServer(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"uploadToServer(CtoSMessage)","u":"uploadToServer(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"uploadToServer(CtoSMessage)","u":"uploadToServer(it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"RMIClientAcceptor","l":"uploadToServer(RMIClientNodeInt, CtoSLobbyMessage)","u":"uploadToServer(it.polimi.ingsw.am32.network.ClientNode.RMIClientNodeInt,it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","c":"RMIClientAcceptorInt","l":"uploadToServer(RMIClientNodeInt, CtoSLobbyMessage)","u":"uploadToServer(it.polimi.ingsw.am32.network.ClientNode.RMIClientNodeInt,it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"value"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"value"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"value"},{"p":"it.polimi.ingsw.am32.model.card","c":"Card","l":"value"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"value"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"value"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"value"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"value"},{"p":"it.polimi.ingsw.am32.client","c":"NonObjCardFactory","l":"Value"},{"p":"it.polimi.ingsw.am32.client","c":"ObjectiveCardFactory","l":"Value"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"values()"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","c":"LobbyMessageExceptionEnumeration","l":"values()"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"values()"},{"p":"it.polimi.ingsw.am32.model.card","c":"CornerType","l":"values()"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","c":"ObjectType","l":"values()"},{"p":"it.polimi.ingsw.am32.model.deck.utils","c":"DeckType","l":"values()"},{"p":"it.polimi.ingsw.am32.model.match","c":"MatchStatus","l":"values()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"values()"},{"p":"it.polimi.ingsw.am32.network.exceptions","c":"ErrorMessageCode","l":"values()"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"RMIClientNode","l":"view"},{"p":"it.polimi.ingsw.am32.network.ClientNode","c":"SKClientNode","l":"view"},{"p":"it.polimi.ingsw.am32.client","c":"View","l":"View()","u":"%3Cinit%3E()"},{"p":"it.polimi.ingsw.am32.controller","c":"PlayerQuadruple","l":"virtualView"},{"p":"it.polimi.ingsw.am32.controller","c":"VirtualView","l":"VirtualView(ServerNodeInterface)","u":"%3Cinit%3E(it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface)"},{"p":"it.polimi.ingsw.am32.controller.exceptions","c":"VirtualViewNotFoundException","l":"VirtualViewNotFoundException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"WAITING_CARD_DRAW"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"WAITING_CARD_PLACEMENT"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"WAITING_FOR_START"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"WAITING_FOR_TURN"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"WAITING_SECRET_OBJECTIVE_CARD_CHOICE"},{"p":"it.polimi.ingsw.am32.controller","c":"GameControllerStatus","l":"WAITING_STARTER_CARD_CHOICE"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"waitingRoot"},{"p":"it.polimi.ingsw.am32.client","c":"Event","l":"WELCOME"},{"p":"it.polimi.ingsw.am32.client.view.gui","c":"GraphicalUI","l":"welcomeRoot"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","c":"MatchWinnersMessage","l":"winners"},{"p":"it.polimi.ingsw.am32.model.exceptions","c":"WrongDeckTypeException","l":"WrongDeckTypeException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"x"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"x"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"x()"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"y"},{"p":"it.polimi.ingsw.am32.model.field","c":"CardPlaced","l":"y"},{"p":"it.polimi.ingsw.am32.client","c":"CardPlacedView","l":"y()"},{"p":"it.polimi.ingsw.am32.model.player","c":"Colour","l":"YELLOW"}];updateSearchResults();
\ No newline at end of file
diff --git a/deliverables/JavaDoc/module-search-index.js b/deliverables/JavaDoc/module-search-index.js
new file mode 100644
index 00000000..51ed58a9
--- /dev/null
+++ b/deliverables/JavaDoc/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [{"l":"it.polimi.ingsw.am32"}];updateSearchResults();
\ No newline at end of file
diff --git a/deliverables/JavaDoc/overview-tree.html b/deliverables/JavaDoc/overview-tree.html
new file mode 100644
index 00000000..0048543c
--- /dev/null
+++ b/deliverables/JavaDoc/overview-tree.html
@@ -0,0 +1,329 @@
+
+
+
+
+Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The help page provides an introduction to the scope and syntax of JavaDoc search.
+
You can use the <ctrl> or <cmd> keys in combination with the left and right arrow keys to switch between result tabs in this page.
+
The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.
The nickname of the recipient who requested to create a new game, to access the game or to reconnect to a game
+ before and received the error message.
+
+
+
diff --git a/deliverables/JavaDoc/tag-search-index.js b/deliverables/JavaDoc/tag-search-index.js
new file mode 100644
index 00000000..bf10aaf6
--- /dev/null
+++ b/deliverables/JavaDoc/tag-search-index.js
@@ -0,0 +1 @@
+tagSearchIndex = [{"l":"Constant Field Values","h":"","u":"constant-values.html"},{"l":"Serialized Form","h":"","u":"serialized-form.html"}];updateSearchResults();
\ No newline at end of file
diff --git a/deliverables/JavaDoc/type-search-index.js b/deliverables/JavaDoc/type-search-index.js
new file mode 100644
index 00000000..fc23e8bb
--- /dev/null
+++ b/deliverables/JavaDoc/type-search-index.js
@@ -0,0 +1 @@
+typeSearchIndex = [{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"AccessGameConfirmMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"AccessGameMessage"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"AllSpecial"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"AlreadyComputedPointsException"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"AnglesCovered"},{"p":"it.polimi.ingsw.am32.client.listener","l":"AskListener"},{"p":"it.polimi.ingsw.am32.client.listener","l":"AskListenerInterface"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"AssignedSecretObjectiveCardMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"AssignedStarterCardMessage"},{"p":"it.polimi.ingsw.am32.client.view.tui","l":"BoardView"},{"p":"it.polimi.ingsw.am32.model.card","l":"Card"},{"p":"it.polimi.ingsw.am32.model.deck","l":"CardDeck"},{"p":"it.polimi.ingsw.am32.model.deck","l":"CardDeckBuilder"},{"p":"it.polimi.ingsw.am32.model.field","l":"CardPlaced"},{"p":"it.polimi.ingsw.am32.client","l":"CardPlacedView"},{"p":"it.polimi.ingsw.am32.chat","l":"Chat"},{"p":"it.polimi.ingsw.am32.client.view.gui","l":"ChatArea"},{"p":"it.polimi.ingsw.am32.chat","l":"ChatMessage"},{"p":"it.polimi.ingsw.am32.client","l":"ChatMessage"},{"p":"it.polimi.ingsw.am32","l":"Client"},{"p":"it.polimi.ingsw.am32.network.ClientNode","l":"ClientNodeInterface"},{"p":"it.polimi.ingsw.am32.network.ClientNode","l":"ClientPingTask"},{"p":"it.polimi.ingsw.am32.model.player","l":"Colour"},{"p":"it.polimi.ingsw.am32.utilities","l":"Configuration"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"ConfirmSelectedSecretObjectiveCardMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"ConfirmStarterCardSideSelectionMessage"},{"p":"it.polimi.ingsw.am32.network.exceptions","l":"ConnectionSetupFailedException"},{"p":"it.polimi.ingsw.am32.model.card","l":"CornerType"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"CountResource"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"CriticalFailureException"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"CtoSLobbyMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"CtoSMessage"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"CTRDuplicateNicknameException"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"CTRPlayerNotFoundException"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"DeckSizeUpdateMessage"},{"p":"it.polimi.ingsw.am32.model.deck.utils","l":"DeckType"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"Diagonals"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"DrawCardConfirmationMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"DrawCardFailedMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"DrawCardMessage"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"DrawException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"DuplicateNicknameException"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"Empty"},{"p":"it.polimi.ingsw.am32.controller","l":"EndMatchDueToDisconnectionTimerTask"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"ErrorMessage"},{"p":"it.polimi.ingsw.am32.network.exceptions","l":"ErrorMessageCode"},{"p":"it.polimi.ingsw.am32.client","l":"Event"},{"p":"it.polimi.ingsw.am32.model.field","l":"Field"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"FullLobbyException"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"GameAlreadyEndedException"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"GameAlreadyStartedException"},{"p":"it.polimi.ingsw.am32.controller","l":"GameController"},{"p":"it.polimi.ingsw.am32.controller","l":"GameControllerStatus"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"GameNotFoundException"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"GameNotYetStartedException"},{"p":"it.polimi.ingsw.am32.controller","l":"GamesManager"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"GameStartedMessage"},{"p":"it.polimi.ingsw.am32.client.view.gui","l":"GraphicalUI"},{"p":"it.polimi.ingsw.am32.client.view.gui","l":"GraphicalUIApplication"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"InboundChatMessage"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"InvalidHandSizeException"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"InvalidInboundChatMessage"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"InvalidPlayerNumberException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"InvalidPositionException"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"InvalidSelectedSecretObjectiveCardMessage"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"InvalidSelectionException"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"InvalidStarterCardSideSelectionMessage"},{"p":"it.polimi.ingsw.am32.utilities","l":"IPAddressFinder"},{"p":"it.polimi.ingsw.am32.utilities","l":"IsValid"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"LConfigurationFour"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"LConfigurationFourComparator"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"LConfigurationOne"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"LConfigurationThree"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"LConfigurationTwo"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"LConfigurationTwoComparator"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","l":"LobbyMessageException"},{"p":"it.polimi.ingsw.am32.controller.exceptions.abstraction","l":"LobbyMessageExceptionEnumeration"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"LobbyPlayerListMessage"},{"p":"it.polimi.ingsw.am32.utilities","l":"Log4J2ConfiguratorWrapper"},{"p":"it.polimi.ingsw.am32.chat.exceptions","l":"MalformedMessageException"},{"p":"it.polimi.ingsw.am32.client.exceptions","l":"MalformedMessageException"},{"p":"it.polimi.ingsw.am32.model.match","l":"Match"},{"p":"it.polimi.ingsw.am32.model.match","l":"MatchStatus"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"MatchStatusMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"MatchWinnersMessage"},{"p":"it.polimi.ingsw.am32.client.exceptions","l":"MissingJSONException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"MissingJSONException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"MissingRequirementsException"},{"p":"it.polimi.ingsw.am32.model","l":"ModelInterface"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"NegativeResponsePlayerFieldMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"NewGameConfirmationMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"NewGameMessage"},{"p":"it.polimi.ingsw.am32.network.exceptions","l":"NodeClosedException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NonEmptyHandException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NonNullColourException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NonNullFieldException"},{"p":"it.polimi.ingsw.am32.client","l":"NonObjCardFactory"},{"p":"it.polimi.ingsw.am32.model.card","l":"NonObjectiveCard"},{"p":"it.polimi.ingsw.am32.model.deck","l":"NonObjectiveCardDeck"},{"p":"it.polimi.ingsw.am32.model.deck","l":"NonObjectiveCardDeckBuilder"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NullColourException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NullFieldException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NullHandException"},{"p":"it.polimi.ingsw.am32.chat.exceptions","l":"NullMessageException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"NullPointStrategyException"},{"p":"it.polimi.ingsw.am32.client","l":"ObjectiveCardFactory"},{"p":"it.polimi.ingsw.am32.model.deck","l":"ObjectsBuilder"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"ObjectType"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"OutboundChatMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"PingMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlaceCardConfirmationMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlaceCardFailedMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"PlaceCardMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlaceCardRollbackMessage"},{"p":"it.polimi.ingsw.am32.model.player","l":"Player"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"PlayerAlreadyConnectedException"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlayerConnectedMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlayerDisconnectMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlayerGameStatusMessage"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"PlayerNotFoundException"},{"p":"it.polimi.ingsw.am32.client","l":"PlayerPub"},{"p":"it.polimi.ingsw.am32.client.view.gui","l":"PlayerPubView"},{"p":"it.polimi.ingsw.am32.controller","l":"PlayerQuadruple"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlayerReconnectedMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PlayerTurnMessage"},{"p":"it.polimi.ingsw.am32.model.card.pointstrategy","l":"PointStrategy"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"PongMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"ReconnectGameConfirmMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"ReconnectGameMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"RequestGameStatusMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"RequestPlayerFieldMessage"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"ResponsePlayerFieldMessage"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","l":"RMIClientAcceptor"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","l":"RMIClientAcceptorInt"},{"p":"it.polimi.ingsw.am32.network.ClientNode","l":"RMIClientNode"},{"p":"it.polimi.ingsw.am32.network.ClientNode","l":"RMIClientNodeInt"},{"p":"it.polimi.ingsw.am32.network.ServerNode","l":"RMIServerNode"},{"p":"it.polimi.ingsw.am32.network.ServerNode","l":"RMIServerNodeInt"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"RollbackException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"SecretObjectiveCardException"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"SelectedSecretObjectiveCardMessage"},{"p":"it.polimi.ingsw.am32.message.ClientToServer","l":"SelectedStarterCardSideMessage"},{"p":"it.polimi.ingsw.am32","l":"Server"},{"p":"it.polimi.ingsw.am32.network.ServerNode","l":"ServerNodeInterface"},{"p":"it.polimi.ingsw.am32.network.ServerNode","l":"ServerPingTask"},{"p":"it.polimi.ingsw.am32.network.ClientAcceptor","l":"SKClientAcceptor"},{"p":"it.polimi.ingsw.am32.network.ClientNode","l":"SKClientNode"},{"p":"it.polimi.ingsw.am32.network.ServerNode","l":"SKServerNode"},{"p":"it.polimi.ingsw.am32.message.ServerToClient","l":"StoCMessage"},{"p":"it.polimi.ingsw.am32.client.view.tui","l":"TextUI"},{"p":"it.polimi.ingsw.am32.network.exceptions","l":"UninitializedException"},{"p":"it.polimi.ingsw.am32.network.exceptions","l":"UploadFailureException"},{"p":"it.polimi.ingsw.am32.client","l":"View"},{"p":"it.polimi.ingsw.am32.controller","l":"VirtualView"},{"p":"it.polimi.ingsw.am32.controller","l":"VirtualViewInterface"},{"p":"it.polimi.ingsw.am32.controller.exceptions","l":"VirtualViewNotFoundException"},{"p":"it.polimi.ingsw.am32.model.exceptions","l":"WrongDeckTypeException"}];updateSearchResults();
\ No newline at end of file
diff --git a/deliverables/README.md b/deliverables/README.md
new file mode 100644
index 00000000..c71e9870
--- /dev/null
+++ b/deliverables/README.md
@@ -0,0 +1,7 @@
+# Deliverables Folder
+
+- ☑️ InitialUML: This folder contains the high-level UML diagram of the project.
+- ☑️ FinalUML: This folder contains the detailed UML diagrams of the project. Generated using IntelliJ IDEA.
+- ☑️ PeerReview: This folder contains the peer review documents. In the second peer review it is also explained the communication protocol between Client and Server.
+- ☑️ JavaDoc: This folder contains the JavaDoc of the project exported in HTML format.
+- ☑️ JARs: This folder contains the JAR files of the project.
diff --git a/src/main/java/it/polimi/ingsw/am32/Client.java b/src/main/java/it/polimi/ingsw/am32/Client.java
index 344a06e8..aacce9d2 100644
--- a/src/main/java/it/polimi/ingsw/am32/Client.java
+++ b/src/main/java/it/polimi/ingsw/am32/Client.java
@@ -7,6 +7,7 @@
import org.apache.logging.log4j.Level;
import java.io.PrintStream;
+import java.rmi.Remote;
import java.util.InputMismatchException;
import java.util.Scanner;
@@ -32,6 +33,7 @@ public class Client {
* @param args Command line arguments
*/
public static void main(String[] args){
+
// Configure log4j2 logger to log only warnings and above
Log4J2ConfiguratorWrapper.setLogLevelAndConfigure(Level.WARN);
out.println("Welcome to Codex Naturalis");
diff --git a/src/main/java/it/polimi/ingsw/am32/Server.java b/src/main/java/it/polimi/ingsw/am32/Server.java
index 8d80eb51..6ac95820 100644
--- a/src/main/java/it/polimi/ingsw/am32/Server.java
+++ b/src/main/java/it/polimi/ingsw/am32/Server.java
@@ -114,7 +114,6 @@ private void startRMIServer() {
try {
System.setProperty("java.rmi.server.hostname", Configuration.getInstance().getServerIp());
Registry registry = LocateRegistry.createRegistry(Configuration.getInstance().getRmiPort());
- //FIXME problema se registro esiste gia
RMIClientAcceptor rmiClientAcceptor = new RMIClientAcceptor();
registry.bind("Server-CodexNaturalis", rmiClientAcceptor);
logger.debug("RMI Client Acceptor created");
diff --git a/src/main/java/it/polimi/ingsw/am32/client/view/gui/ChatArea.java b/src/main/java/it/polimi/ingsw/am32/client/view/gui/ChatArea.java
index f127333e..168f2f35 100644
--- a/src/main/java/it/polimi/ingsw/am32/client/view/gui/ChatArea.java
+++ b/src/main/java/it/polimi/ingsw/am32/client/view/gui/ChatArea.java
@@ -157,7 +157,6 @@ public void addIncomingMessageToChat(String message, String senderNickname) {
* Called when the user clicks the submit button.
*/
private void submitChatMessage() {
- // FIXME Need to show sent message only after server confirms it
if (inputMessageField.getText().isEmpty()) return; // Do not send empty messages (or messages with only whitespace characters)
String recipient = playerList.getValue().equals(gui.getThisPlayerNickname())?"Yourself": playerList.getValue();
diff --git a/src/main/java/it/polimi/ingsw/am32/client/view/tui/TextUI.java b/src/main/java/it/polimi/ingsw/am32/client/view/tui/TextUI.java
index 336bc275..64a890ae 100644
--- a/src/main/java/it/polimi/ingsw/am32/client/view/tui/TextUI.java
+++ b/src/main/java/it/polimi/ingsw/am32/client/view/tui/TextUI.java
@@ -203,7 +203,7 @@ public void launch() {
askSelectGameMode();
boolean isEnd = false;
- while (!isEnd) { // TODO think about a better way to handle the flow of the game
+ while (!isEnd) {
while(isDisconnected) {
if(canAttemptReconnection) {
@@ -226,7 +226,7 @@ public void launch() {
requestSelectSecretObjectiveCard();
}
}
- case PLAYING, TERMINATING -> { // TODO Double check what to do when terminating
+ case PLAYING, TERMINATING -> {
switch (currentEvent) {
case PLACE_CARD -> requestPlaceCard();
case DRAW_CARD -> requestDrawCard();
@@ -582,7 +582,7 @@ public void updateRollback(String playerNickname, int removedCard, int playerPoi
int posX = -2 * y + 80;
int posY = 2 * x + 80;
// reset the space occupied by the card in the board
- board[posX][posY] = BLANK; //TODO CHECK PRINT WITH THE TEMPORARY
+ board[posX][posY] = BLANK;
board[posX - 1][posY] = BLANK;
board[posX + 1][posY] = BLANK;
board[posX][posY - 1] = BLANK;
@@ -1251,7 +1251,7 @@ public void updateAfterPlacedCard(String playerNickname, int cardID, int x, int
board limits. In this way, the player can see the available positions for the next turn of the placement.*/
if (playerNickname.equals(thisPlayerNickname)) {
if(!currentEvent.equals(Event.RECONNECT_GAME)) {
- availableSpaces.removeIf(pos -> pos[0] == x && pos[1] == y); //TODO check if exists another way to do this
+ availableSpaces.removeIf(pos -> pos[0] == x && pos[1] == y);
for (int[] pos : availableSpaces) { // delete the old available positions in the board.
posX = -2 * pos[1] + 80;
posY = 2 * pos[0] + 80;
@@ -1410,13 +1410,13 @@ else if (messageContent.equals("EXIT")) { // Abort sending message
// Send a message
if (recipient.equals("ALL")) { // Send a message in broadcast
ChatMessage message = new ChatMessage(thisPlayerNickname, "ALL", true, messageContent);
- chatHistory.add(message); // FIXME Is this needed? RESOLVED: Yes, it is needed, because in the chat history, the player should be able to see the messages that he sent.
+ chatHistory.add(message);
if(!isDisconnected) {
notifyAskListener(new InboundChatMessage(thisPlayerNickname, recipient, true, messageContent));
}
} else { // Send a direct message
ChatMessage message = new ChatMessage(thisPlayerNickname, recipient, false, messageContent);
- chatHistory.add(message); // FIXME Is this needed? RESOLVED: Yes, it is needed, because in the chat history, the player should be able to see the messages that he sent.
+ chatHistory.add(message);
if(!isDisconnected) {
notifyAskListener(new InboundChatMessage(thisPlayerNickname, recipient, false, messageContent));
}
diff --git a/src/main/java/it/polimi/ingsw/am32/controller/GameController.java b/src/main/java/it/polimi/ingsw/am32/controller/GameController.java
index b26398ac..332e080f 100644
--- a/src/main/java/it/polimi/ingsw/am32/controller/GameController.java
+++ b/src/main/java/it/polimi/ingsw/am32/controller/GameController.java
@@ -3,6 +3,7 @@
import java.util.*;
import java.util.stream.Collectors;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import it.polimi.ingsw.am32.utilities.Configuration;
import it.polimi.ingsw.am32.chat.Chat;
import it.polimi.ingsw.am32.chat.ChatMessage;
@@ -11,7 +12,6 @@
import it.polimi.ingsw.am32.model.exceptions.*;
import it.polimi.ingsw.am32.model.match.Match;
import it.polimi.ingsw.am32.model.match.MatchStatus;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
import it.polimi.ingsw.am32.model.ModelInterface;
/**
@@ -173,7 +173,7 @@ public synchronized void submitChatMessage(ChatMessage message) {
*
* @param node The node of the player that has disconnected
*/
- public synchronized void disconnect(NodeInterface node) {
+ public synchronized void disconnect(ServerNodeInterface node) {
PlayerQuadruple playerQuadruple = nodeList.stream().filter(pq -> pq.getNode().equals(node)).findFirst().orElse(null); // Get the player quadruple associated with the disconnected player
if (playerQuadruple == null) { // The player quadruple could not be found
@@ -443,7 +443,7 @@ protected synchronized void endMatchDueToDisconnection() {
* @throws PlayerNotFoundException If the player could not be found in the list of players
* @throws PlayerAlreadyConnectedException If the player is already connected when attempting to reconnect
*/
- public synchronized void reconnect(String nickname, NodeInterface node) throws PlayerNotFoundException, PlayerAlreadyConnectedException {
+ public synchronized void reconnect(String nickname, ServerNodeInterface node) throws PlayerNotFoundException, PlayerAlreadyConnectedException {
// Throw exception if nickname is not present in the list of players
if (nodeList.stream().noneMatch(pq -> pq.getNickname().equals(nickname))) {
throw new PlayerNotFoundException("Player " + nickname + " not found when reconnecting");
@@ -507,7 +507,7 @@ public synchronized void reconnect(String nickname, NodeInterface node) throws P
* @param node The node of the player to add
* @throws FullLobbyException If the lobby is already full
*/
- protected synchronized void addPlayer(String nickname, NodeInterface node) throws FullLobbyException, DuplicateNicknameException {
+ protected synchronized void addPlayer(String nickname, ServerNodeInterface node) throws FullLobbyException, DuplicateNicknameException {
if (model.getPlayersNicknames().size() == gameSize) throw new FullLobbyException("Lobby is full"); // Lobby is full
model.addPlayer(nickname); // Add the player to the actual match instance
diff --git a/src/main/java/it/polimi/ingsw/am32/controller/GamesManager.java b/src/main/java/it/polimi/ingsw/am32/controller/GamesManager.java
index 6030fcb5..dc8fcb8c 100644
--- a/src/main/java/it/polimi/ingsw/am32/controller/GamesManager.java
+++ b/src/main/java/it/polimi/ingsw/am32/controller/GamesManager.java
@@ -4,7 +4,7 @@
import it.polimi.ingsw.am32.message.ServerToClient.*;
import it.polimi.ingsw.am32.model.exceptions.DuplicateNicknameException;
import it.polimi.ingsw.am32.model.exceptions.PlayerNotFoundException;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -58,7 +58,7 @@ public static synchronized GamesManager getInstance() {
* @return The GameController of the newly created game
* @throws InvalidPlayerNumberException If the player count is not between 2 and 4
*/
- public synchronized GameController createGame(String creatorName, int playerCount, NodeInterface node) throws InvalidPlayerNumberException {
+ public synchronized GameController createGame(String creatorName, int playerCount, ServerNodeInterface node) throws InvalidPlayerNumberException {
logger.debug("Received request to create a new game. Creator name: {}, player count: {}, node: {}", creatorName, playerCount, node);
if(creatorName == null || creatorName.isBlank()) {
throw new CriticalFailureException("Creator name cannot be null or empty");
@@ -116,7 +116,7 @@ public synchronized GameController createGame(String creatorName, int playerCoun
* @throws GameAlreadyStartedException If the game has already started
* @throws CTRDuplicateNicknameException If the player with the given nickname is already in the game
*/
- public synchronized GameController accessGame(String nickname, int gameCode, NodeInterface node) throws GameNotFoundException, FullLobbyException, GameAlreadyStartedException, CTRDuplicateNicknameException {
+ public synchronized GameController accessGame(String nickname, int gameCode, ServerNodeInterface node) throws GameNotFoundException, FullLobbyException, GameAlreadyStartedException, CTRDuplicateNicknameException {
logger.debug("Received request to access game. Nickname: {}, game code: {}, node: {}", nickname, gameCode, node);
if(nickname == null || nickname.isBlank()) {
throw new CriticalFailureException("Nickname cannot be null or empty");
@@ -176,7 +176,7 @@ public synchronized GameController accessGame(String nickname, int gameCode, Nod
* @throws PlayerAlreadyConnectedException If the player with the given nickname is already connected to the game
* @throws GameNotYetStartedException If the game has not yet started
*/
- public synchronized GameController reconnectToGame(String nickname, int gameCode, NodeInterface node) throws
+ public synchronized GameController reconnectToGame(String nickname, int gameCode, ServerNodeInterface node) throws
GameAlreadyEndedException, CTRPlayerNotFoundException, GameNotFoundException, PlayerAlreadyConnectedException,
GameNotYetStartedException
{
diff --git a/src/main/java/it/polimi/ingsw/am32/controller/PlayerQuadruple.java b/src/main/java/it/polimi/ingsw/am32/controller/PlayerQuadruple.java
index 646a2aeb..a763526b 100644
--- a/src/main/java/it/polimi/ingsw/am32/controller/PlayerQuadruple.java
+++ b/src/main/java/it/polimi/ingsw/am32/controller/PlayerQuadruple.java
@@ -1,14 +1,14 @@
package it.polimi.ingsw.am32.controller;
import it.polimi.ingsw.am32.controller.exceptions.CriticalFailureException;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
/**
* This class represents a player in the game. It contains information about the player's
* connection status, nickname, and the virtual view associated with the player.
*/
public class PlayerQuadruple {
- private NodeInterface node;
+ private ServerNodeInterface node;
private final String nickname;
private boolean connected;
private final VirtualView virtualView;
@@ -22,7 +22,7 @@ public class PlayerQuadruple {
* @param virtualView the virtual view associated with the player
* @throws CriticalFailureException if any of the parameters are null or if the nickname is empty
*/
- public PlayerQuadruple(NodeInterface node, String nickname, boolean connected, VirtualView virtualView) {
+ public PlayerQuadruple(ServerNodeInterface node, String nickname, boolean connected, VirtualView virtualView) {
this.node = node;
this.nickname = nickname;
this.connected = connected;
@@ -38,7 +38,7 @@ public PlayerQuadruple(NodeInterface node, String nickname, boolean connected, V
* @param node the new node
* @throws CriticalFailureException if the node is null
*/
- public void setNode(NodeInterface node) {
+ public void setNode(ServerNodeInterface node) {
if (node == null) {
throw new CriticalFailureException("Node cannot be null");
}
@@ -50,7 +50,7 @@ public void setNode(NodeInterface node) {
*
* @return the node
*/
- public NodeInterface getNode() {
+ public ServerNodeInterface getNode() {
return node;
}
diff --git a/src/main/java/it/polimi/ingsw/am32/controller/VirtualView.java b/src/main/java/it/polimi/ingsw/am32/controller/VirtualView.java
index 4bf694fa..86c8ece3 100644
--- a/src/main/java/it/polimi/ingsw/am32/controller/VirtualView.java
+++ b/src/main/java/it/polimi/ingsw/am32/controller/VirtualView.java
@@ -2,7 +2,7 @@
import it.polimi.ingsw.am32.controller.exceptions.CriticalFailureException;
import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -24,7 +24,7 @@ public class VirtualView implements VirtualViewInterface, Runnable {
/**
* The connection node associated with the VirtualView.
*/
- private NodeInterface connectionNode;
+ private ServerNodeInterface connectionNode;
/**
* The queue of messages that are to be sent to the client.
*/
@@ -44,7 +44,7 @@ public class VirtualView implements VirtualViewInterface, Runnable {
*
* @param connectionNode The connection node associated with the VirtualView.
*/
- public VirtualView(NodeInterface connectionNode) {
+ public VirtualView(ServerNodeInterface connectionNode) {
this.connectionNode = connectionNode;
// Connection node cannot be null
if (connectionNode == null) {
@@ -72,7 +72,7 @@ public void run() {
*
* @param node The new connection node to associate with the VirtualView.
*/
- public void changeNode(NodeInterface node) {
+ public void changeNode(ServerNodeInterface node) {
synchronized (connectionNodeLock) {
connectionNode = node;
}
@@ -201,7 +201,7 @@ protected ArrayList getMessageQueue() {
*
* @return The connection node associated with the VirtualView.
*/
- protected NodeInterface getConnectionNode() {
+ protected ServerNodeInterface getConnectionNode() {
synchronized (connectionNodeLock) {
return connectionNode;
}
diff --git a/src/main/java/it/polimi/ingsw/am32/controller/VirtualViewInterface.java b/src/main/java/it/polimi/ingsw/am32/controller/VirtualViewInterface.java
index 0f3efcb5..f52a1b49 100644
--- a/src/main/java/it/polimi/ingsw/am32/controller/VirtualViewInterface.java
+++ b/src/main/java/it/polimi/ingsw/am32/controller/VirtualViewInterface.java
@@ -1,10 +1,10 @@
package it.polimi.ingsw.am32.controller;
import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
@SuppressWarnings("ALL")
public interface VirtualViewInterface {
void addMessage(StoCMessage msg);
void flushMessages();
- void changeNode(NodeInterface node);
+ void changeNode(ServerNodeInterface node);
}
diff --git a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/AccessGameMessage.java b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/AccessGameMessage.java
index ade09ac5..963c2802 100644
--- a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/AccessGameMessage.java
+++ b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/AccessGameMessage.java
@@ -6,7 +6,7 @@
import it.polimi.ingsw.am32.controller.exceptions.FullLobbyException;
import it.polimi.ingsw.am32.controller.exceptions.GameAlreadyStartedException;
import it.polimi.ingsw.am32.controller.exceptions.GameNotFoundException;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
/**
* This class is used to manage the message sent by the client when he wants to join a game.
@@ -41,7 +41,7 @@ public AccessGameMessage(int matchId, String senderNickname) {
* @throws CTRDuplicateNicknameException if the nickname is already in use
*/
@Override
- public GameController elaborateMessage(NodeInterface nodeInterface) throws GameAlreadyStartedException,
+ public GameController elaborateMessage(ServerNodeInterface nodeInterface) throws GameAlreadyStartedException,
FullLobbyException, GameNotFoundException, CTRDuplicateNicknameException {
return GamesManager.getInstance().accessGame(senderNickname, matchId, nodeInterface);
}
diff --git a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/CtoSLobbyMessage.java b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/CtoSLobbyMessage.java
index 57ddc636..e5be1ad6 100644
--- a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/CtoSLobbyMessage.java
+++ b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/CtoSLobbyMessage.java
@@ -2,7 +2,7 @@
import it.polimi.ingsw.am32.controller.GameController;
import it.polimi.ingsw.am32.controller.exceptions.abstraction.LobbyMessageException;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import java.io.Serializable;
@@ -18,7 +18,7 @@ public interface CtoSLobbyMessage extends Serializable {
* @throws LobbyMessageException represents an exception that can be thrown during the elaboration of a generic
* Lobby-Message.
*/
- GameController elaborateMessage(NodeInterface nodeInterface) throws LobbyMessageException;
+ GameController elaborateMessage(ServerNodeInterface nodeInterface) throws LobbyMessageException;
/**
* This method provides a string representation of a message object, which can be useful for debugging purposes.
* It will be overridden by the classes that implement the StoCMessage interface.
diff --git a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/NewGameMessage.java b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/NewGameMessage.java
index aaeb6543..cc186045 100644
--- a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/NewGameMessage.java
+++ b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/NewGameMessage.java
@@ -3,7 +3,7 @@
import it.polimi.ingsw.am32.controller.GameController;
import it.polimi.ingsw.am32.controller.GamesManager;
import it.polimi.ingsw.am32.controller.exceptions.InvalidPlayerNumberException;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
/**
* This class represents a message that is sent from the client to the server when a new game is created.
@@ -38,7 +38,7 @@ public NewGameMessage(String senderNickname, int playerNum) {
* @throws InvalidPlayerNumberException If the player count is not between 2 and 4
*/
@Override
- public GameController elaborateMessage(NodeInterface nodeInterface) throws InvalidPlayerNumberException {
+ public GameController elaborateMessage(ServerNodeInterface nodeInterface) throws InvalidPlayerNumberException {
return GamesManager.getInstance().createGame(senderNickname, playerNum, nodeInterface);
}
diff --git a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/ReconnectGameMessage.java b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/ReconnectGameMessage.java
index 7896cec3..90de320c 100644
--- a/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/ReconnectGameMessage.java
+++ b/src/main/java/it/polimi/ingsw/am32/message/ClientToServer/ReconnectGameMessage.java
@@ -3,7 +3,7 @@
import it.polimi.ingsw.am32.controller.GameController;
import it.polimi.ingsw.am32.controller.GamesManager;
import it.polimi.ingsw.am32.controller.exceptions.*;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
/**
* This class is used to manage the message sent by the client when he wants to reconnect to a game.
*/
@@ -40,7 +40,7 @@ public ReconnectGameMessage(String senderNickname, int matchId) {
*
*/
@Override
- public GameController elaborateMessage(NodeInterface nodeInterface) throws GameAlreadyEndedException,
+ public GameController elaborateMessage(ServerNodeInterface nodeInterface) throws GameAlreadyEndedException,
GameNotFoundException, PlayerAlreadyConnectedException, GameNotYetStartedException, CTRPlayerNotFoundException {
return GamesManager.getInstance().reconnectToGame(senderNickname, matchId, nodeInterface);
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptor.java b/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptor.java
index 69da7d79..befdc39f 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptor.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptor.java
@@ -4,9 +4,11 @@
import it.polimi.ingsw.am32.controller.exceptions.abstraction.LobbyMessageException;
import it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage;
import it.polimi.ingsw.am32.message.ServerToClient.ErrorMessage;
+import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
+import it.polimi.ingsw.am32.network.ClientNode.ClientNodeInterface;
import it.polimi.ingsw.am32.network.ClientNode.RMIClientNodeInt;
-import it.polimi.ingsw.am32.network.GameTuple;
import it.polimi.ingsw.am32.network.ServerNode.RMIServerNode;
+import it.polimi.ingsw.am32.network.ServerNode.RMIServerNodeInt;
import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
import it.polimi.ingsw.am32.utilities.Configuration;
import org.apache.logging.log4j.LogManager;
@@ -15,15 +17,56 @@
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
+/**
+ * The class {@code RMIClientAcceptor} is the implementation of the RMI methods that the interface
+ * {@link RMIClientAcceptorInt} expose to the clients.
+ * an instance of {@link it.polimi.ingsw.am32.network.ClientNode.RMIClientNode} invoke those methods on the server
+ * when the client hasn't joined yet a game.
+ *
+ * @author Matteo
+ */
public class RMIClientAcceptor extends UnicastRemoteObject implements RMIClientAcceptorInt {
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ /**
+ * Variables used for service purposes
+ */
private static final Logger logger = LogManager.getLogger(RMIClientAcceptor.class);
+
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class.
+ * @throws RemoteException thrown if the object couldn't be exported
+ */
public RMIClientAcceptor() throws RemoteException {}
- // TODO export stuff
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Invoking this method will result in the server using the content of the message to either create a new game and
+ * add the sender as its first player or make him join an already existing one.
+ * This process is done by making use of the class {@link it.polimi.ingsw.am32.controller.GamesManager}.
+ * If the previous part is successful, i.e. nothing went wrong with joining or creating a game, a new instance of
+ * {@link RMIServerNode} will be created and assigned to the client that is invoking this method.
+ *
+ * If a {@code LobbyMessageException} is thrown, an {@link ErrorMessage} will be sent to the client by invoking
+ * the method {@link RMIClientNodeInt#uploadStoC(StoCMessage)} on the {@code RMIClientNodeInt} given as parameter.
+ *
+ * @param node an instance of {@code RMIClientNodeInt} that exports methods that the server can invoke on the client
+ * @param message a {@link CtoSLobbyMessage} that the server has to process
+ * @return an instance of {@link RMIServerNodeInt} on which the client can invoke other methods
+ * @throws RemoteException thrown if the method couldn't be invoked on the server
+ * @throws LobbyMessageException thrown if the client that invoked this method couldn't create or join a game
+ */
@Override
- public GameTuple uploadToServer(RMIClientNodeInt node, CtoSLobbyMessage message)
+ public RMIServerNodeInt uploadToServer(RMIClientNodeInt node, CtoSLobbyMessage message)
throws RemoteException, LobbyMessageException
{
@@ -51,8 +94,6 @@ public GameTuple uploadToServer(RMIClientNodeInt node, CtoSLobbyMessage message)
// The Server will not crash because how the thread is managed, but we need to know what happened to fix it in the future.
// Do not remove this catch block. Remove the throws clause if needed but keep the logger.
- // TODO mandiamo ErrorMessage anche qui?
-
rmiServerNode.destroy();
logger.fatal("GameController access failed due to a critical exception: {}", e.getMessage());
throw e;
@@ -61,10 +102,15 @@ public GameTuple uploadToServer(RMIClientNodeInt node, CtoSLobbyMessage message)
rmiServerNode.setGameController(gameController);
logger.info("RMIServerNode successfully created and added to the GameController ID {}", gameController.getId());
- return new GameTuple(rmiServerNode, gameController.getId());
+ return (RMIServerNodeInt) rmiServerNode;
}
- public void extraPing(){
+ /**
+ * A simple method used only to verify if the server is reachable by the client.
+ *
+ * @throws RemoteException thrown if the method couldn't be invoked on the server
+ */
+ public void extraPing() throws RemoteException {
logger.trace("extraPing");
}
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptorInt.java b/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptorInt.java
index e3878d62..fb95e6f4 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptorInt.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/RMIClientAcceptorInt.java
@@ -3,14 +3,44 @@
import it.polimi.ingsw.am32.controller.exceptions.abstraction.LobbyMessageException;
import it.polimi.ingsw.am32.message.ClientToServer.CtoSLobbyMessage;
import it.polimi.ingsw.am32.network.ClientNode.RMIClientNodeInt;
-import it.polimi.ingsw.am32.network.GameTuple;
+import it.polimi.ingsw.am32.network.ServerNode.RMIServerNodeInt;
import java.rmi.Remote;
import java.rmi.RemoteException;
+/**
+ * The interface {@code RMIClientAcceptorInt} exposes the RMI methods that a
+ * {@link it.polimi.ingsw.am32.network.ClientNode.RMIClientNode} instance can invoke on the server when the client hasn't
+ * joined yet a game.
+ * On the server a {@link RMIClientAcceptor} will implement this interface to process the invocation of the methods
+ * included.
+ *
+ * @author Matteo
+ */
public interface RMIClientAcceptorInt extends Remote {
- GameTuple uploadToServer(RMIClientNodeInt node, CtoSLobbyMessage message)
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * The server will process the message according to its content. This can lead to the client creating a new game or
+ * accessing an existing game
+ *
+ * if a {@link LobbyMessageException} is thrown, the server will notify the client through the {@link RMIClientNodeInt}
+ *
+ * @param node an instance of {@code RMIClientNodeInt} that exports methods that the server can invoke on the client
+ * @param message a {@link CtoSLobbyMessage} that the server has to process
+ * @return an instance of {@link RMIServerNodeInt} on which the client can invoke other methods
+ * @throws RemoteException thrown if the method couldn't be invoked on the server
+ * @throws LobbyMessageException thrown if the client that invoked this method couldn't create or join a game
+ */
+ RMIServerNodeInt uploadToServer(RMIClientNodeInt node, CtoSLobbyMessage message)
throws RemoteException, LobbyMessageException;
+ /**
+ * A simple method used only to verify if the server is reachable by the client.
+ *
+ * @throws RemoteException thrown if the method couldn't be invoked on the server
+ */
void extraPing() throws RemoteException;
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/SKClientAcceptor.java b/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/SKClientAcceptor.java
index 6a0245c7..0bad10c7 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/SKClientAcceptor.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientAcceptor/SKClientAcceptor.java
@@ -11,10 +11,37 @@
import java.net.Socket;
import java.util.concurrent.ExecutorService;
+/**
+ * The class {@code SKClientAcceptor} manages the new requests of connection to the server by the clients using socket
+ * as network protocol.
+ * Only one instance of this class is required to be created when the server is run.
+ * Because this class is an implementation of the interface {@link Runnable}, is preferable to assign its instance to a
+ * new thread to maximise parallelization.
+ * Alternatively the method {@link SKClientAcceptor#run()} can be invoked directly. Doing this, however, will result in
+ * the caller being stuck, waiting for new incoming connections.
+ *
+ * @author Matteo
+ */
public class SKClientAcceptor implements Runnable {
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ /**
+ * Variables used for service purposes
+ */
private static final Logger logger = LogManager.getLogger(SKClientAcceptor.class);
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Invoking this method will lead to the creation of a {@link ServerSocket} that will wait for new incoming
+ * connections.
+ * When a client attempt to establish a connection with the server, a new instance of {@link SKServerNode} will be
+ * created and the connection will be handled by this instance.
+ */
public void run() {
ExecutorService executorService = Configuration.getInstance().getExecutorService();
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientNodeInterface.java b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientNodeInterface.java
index 0f64dc71..5b51256c 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientNodeInterface.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientNodeInterface.java
@@ -4,8 +4,51 @@
import it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage;
import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
+/**
+ * This {@code ClientNodeInterface} interface is used to identify all ClientNodes through which communication with the
+ * server can happen.
+ * It's objective is to mask behind the interface the complexity of managing the network part of the client, so that the
+ * other classes of the client don't have to know how is the communication between server and client working.
+ * It contains all the methods that another class in the client can invoke on any ClientNode.
+ * It's important to know that it's necessary and also enough to create one instance of ClientNode per client for the
+ * entire duration of the game.
+ *
+ * @author Matteo
+ */
public interface ClientNodeInterface {
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Send a {@link CtoSMessage} to the server that will process it.
+ * A {@link UploadFailureException} exception is thrown if the message could not reach the server.
+ * If the exception is thrown, the ClientNode might be in a corrupted/unusable state. The node will automatically
+ * and independently reset itself and return to a normal state.
+ *
+ * @param message is the message that the client wants to send
+ * @throws UploadFailureException if the message couldn't be sent
+ */
void uploadToServer(CtoSMessage message) throws UploadFailureException;
+
+ /**
+ * Send a {@link CtoSLobbyMessage} to the server that will process it.
+ * A {@link UploadFailureException} exception is thrown if the message could not reach the server.
+ * If the exception is thrown, the ClientNode might be in a corrupted/unusable state. The node will automatically
+ * and independently reset itself and return to a normal state.
+ *
+ * @param message is the message that the client wants to send
+ * @throws UploadFailureException if the message couldn't be sent
+ */
void uploadToServer(CtoSLobbyMessage message) throws UploadFailureException;
+
+ /**
+ * Inform the ClientNode that the interval for pongs is over.
+ * This invocation can lead to the decrease of a pong counter. If the counter reach the minimum than the termination
+ * process is started.
+ *
+ * Invoking this method can lead, depending on the current state of the ClientNode, to verify if the connection to
+ * the server is working through the emission of a ping to the server
+ */
void pongTimeOverdue();
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientPingTask.java b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientPingTask.java
index ebd5b3a9..b4e51e55 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientPingTask.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/ClientPingTask.java
@@ -2,10 +2,52 @@
import java.util.TimerTask;
+/**
+ * The {@code ClientPingTask} class contains the pointer to a ClientNode, given when the object is instantiated.
+ * This class is used by a {@link java.util.Timer} to invoke the method {@link ClientNodeInterface#pongTimeOverdue()}
+ * on the given node.
+ *
+ * @author Matteo
+ */
public class ClientPingTask extends TimerTask {
- private final ClientNodeInterface node;
+
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ private ClientNodeInterface node;
+
+
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class.
+ *
+ * @param node the ClientNode on which will be invoked the {@link ClientNodeInterface#pongTimeOverdue()}
+ */
public ClientPingTask(ClientNodeInterface node) {this.node = node;}
+
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Invoke the method {@link ClientNodeInterface#pongTimeOverdue()} on the ClientNode stored in the object.
+ */
public void run() {
node.pongTimeOverdue();
}
+
+ /**
+ * invoke the method {@link TimerTask#cancel()} and delete the reference to the ClientNode to facilitate deletion
+ * of the object by the garbage collector.
+ *
+ * @return the return value of the method {@code cancel()} of the super class
+ */
+ @Override
+ public boolean cancel() {
+ boolean cancelled = super.cancel();
+ node = null;
+ return cancelled;
+ }
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNode.java b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNode.java
index c0a3d1b9..abcb1df8 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNode.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNode.java
@@ -25,32 +25,63 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+/**
+ * RMIClientNode is the class that manage the connection with the server.
+ * It implements the {@link ClientNodeInterface} interface and extends {@link UnicastRemoteObject}.
+ * Is necessary and enough to instantiate one instance of this class to connect to the server.
+ * If the connection were to go down, the instance will automatically try to reset and reconnect.
+ *
+ * @author Matteo
+ */
public class RMIClientNode extends UnicastRemoteObject implements ClientNodeInterface, RMIClientNodeInt {
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+ /**
+ * Constants used in the class
+ */
private static final int PONGMAXCOUNT = 3;
private static final int THREADSLEEPINTERVAL = 1000;
private static final int PINGINTERVAL = 5000;
private static final String REMOTEOBJECTNAME = "Server-CodexNaturalis";
-
+ /**
+ * Variables used for service purposes
+ */
private final ExecutorService executorService;
private final Logger logger;
- private RMIServerNodeInt serverNode;
- private final View view;
+ /**
+ * Variables used to manage the connection with the server
+ */
private final String ip;
private final int port;
private int pongCount;
- private String nickname;
+ private final String nickname;
+ /**
+ * Variables used to communicate with the view
+ */
+ private final View view;
+
+ /**
+ * Variables used to communicate with the server
+ */
private Registry registry;
private RMIClientAcceptorInt rmiClientAcceptor;
+ private RMIServerNodeInt serverNode;
+ /**
+ * Variables used to verify and maintain active the connection with the server
+ */
private final Timer timer;
private ClientPingTask clientPingTask;
private ClientPingTask prePingTask;
+ /**
+ * Variables used to manage the state of the connection and the instance
+ */
private boolean statusIsAlive;
private boolean nodePreState;
private boolean reconnectCalled;
@@ -59,6 +90,23 @@ public class RMIClientNode extends UnicastRemoteObject implements ClientNodeInte
private final Object sToCProcessingLock;
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class.
+ * It will try to connect to search for the {@link Registry} and the {@link it.polimi.ingsw.am32.network.ClientAcceptor.RMIClientAcceptor}
+ * on the server.
+ * If any of the two is not found, it will throw a {@link ConnectionSetupFailedException} implying that the connection
+ * is not possible.
+ * Additionally, it will schedule a {@link ClientPingTask} to periodically check the connection with the server.
+ *
+ * @param view is the instance of {@link View} the {@link RMIClientNode} will use to process the messages received
+ * @param ip is the ip of the server
+ * @param port is the port of the server
+ * @throws RemoteException thrown if, during the instantiation, there were some problems
+ * @throws ConnectionSetupFailedException thrown if the connection is not possible
+ */
public RMIClientNode(View view, String ip, int port) throws RemoteException, ConnectionSetupFailedException {
this.view = view;
this.ip = ip;
@@ -95,9 +143,23 @@ public RMIClientNode(View view, String ip, int port) throws RemoteException, Con
executorService = Executors.newCachedThreadPool();
clientPingTask = new ClientPingTask(this);
prePingTask = new ClientPingTask(this);
- timer.schedule(prePingTask, 0, PINGINTERVAL);
+ timer.scheduleAtFixedRate(prePingTask, PINGINTERVAL, PINGINTERVAL);
}
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Check if the {@code RMIClientNode} is not alive or if the {@code RMIClientNode} is in pre-game state.
+ * In both cases, the method will throw a {@link UploadFailureException}.
+ * If those conditions are not met, the method will try to send the message to the server.
+ * If the server is not reachable or the respective {@link it.polimi.ingsw.am32.network.ServerNode.RMIServerNode} is
+ * closed, the method will request a reset and reconnection process and throw a {@link UploadFailureException}.
+ *
+ * @param message is the message that the client wants to send
+ * @throws UploadFailureException if the message could not be sent
+ */
@Override
public void uploadToServer(CtoSMessage message) throws UploadFailureException {
@@ -108,7 +170,6 @@ public void uploadToServer(CtoSMessage message) throws UploadFailureException {
if(serverNode == null) {
logger.error("Attempt to send CtoSMessage before CtoSLobbyMessage. Upload rejected. Message: {}", message);
- // TODO aggiungere di dire errore alla view
throw new UploadFailureException();
}
@@ -117,7 +178,7 @@ public void uploadToServer(CtoSMessage message) throws UploadFailureException {
}
try {
- serverNode.uploadCtoS(message); // TODO il numero di partita in realtà non server
+ serverNode.uploadCtoS(message);
logger.info("Message sent. Type: CtoSMessage: {}", message);
} catch (NodeClosedException e) {
@@ -139,6 +200,17 @@ public void uploadToServer(CtoSMessage message) throws UploadFailureException {
}
}
+ /**
+ * Check if the {@code RMIClientNode} is not alive or if the {@code RMIClientNode} is not in a pre-game state.
+ * In both cases, the method will throw a {@link UploadFailureException}.
+ * If those conditions are not met, the method will try to send the message to the
+ * {@link it.polimi.ingsw.am32.network.ClientAcceptor.RMIClientAcceptor} to process the {@link CtoSLobbyMessage}.
+ * If the processing is successful, the pre-existing {@link ClientPingTask} will be cancelled and a new one will be
+ * scheduled. At the same time the {@code RMIClientNode} will switch from pre-game state to game state.
+ *
+ * @param message is the message that the client wants to send
+ * @throws UploadFailureException if the message could not be sent
+ */
@Override
public void uploadToServer(CtoSLobbyMessage message) throws UploadFailureException {
@@ -148,7 +220,6 @@ public void uploadToServer(CtoSLobbyMessage message) throws UploadFailureExcepti
if(serverNode != null) {
logger.error("Attempt to send second CtoSLobbyMessage while RMIServerNode still valid. Upload rejected. Message: {}", message);
- // TODO aggiungere di dire errore alla view
throw new UploadFailureException();
}
@@ -157,8 +228,8 @@ public void uploadToServer(CtoSLobbyMessage message) throws UploadFailureExcepti
}
try {
- // TODO ritorniamo solo l'interfaccia RMI e non il num di partita perchè non serve??
- serverNode = rmiClientAcceptor.uploadToServer((RMIClientNodeInt) this, message).getNode();
+
+ serverNode = rmiClientAcceptor.uploadToServer((RMIClientNodeInt) this, message);
synchronized (aliveLock){
nodePreState = false;
@@ -167,7 +238,7 @@ public void uploadToServer(CtoSLobbyMessage message) throws UploadFailureExcepti
logger.info("Message sent. Type: CtoSLobbyMessage. Content: {}", message);
- timer.scheduleAtFixedRate(clientPingTask, 0, PINGINTERVAL);
+ timer.scheduleAtFixedRate(clientPingTask, PINGINTERVAL, PINGINTERVAL);
} catch (RemoteException e) {
@@ -177,13 +248,19 @@ public void uploadToServer(CtoSLobbyMessage message) throws UploadFailureExcepti
throw new UploadFailureException();
- } catch (LobbyMessageException ignore) {
-
- // TODO come faccio la parte in cui il node è ancora connesso
- }
+ } catch (LobbyMessageException ignore) {}
}
}
+ /**
+ * If the {@code RMIClientNode} is not alive, the method will return immediately.
+ * If the {@code RMIClientNode} is alive, the method will invoke {@link #resetTimeCounter()}
+ * Finally, after checking if the message is valid, the method will process it by calling the
+ * {@link StoCMessage#processMessage(View)} method.
+ *
+ * @param message a {@link StoCMessage} that the client has to process
+ * @throws NodeClosedException if the {@code RMIClientNode} is not alive
+ */
@Override
public void uploadStoC(StoCMessage message) throws NodeClosedException {
@@ -217,6 +294,14 @@ public void uploadStoC(StoCMessage message) throws NodeClosedException {
}
}
+ /**
+ * If the {@code RMIClientNode} is not alive or this method is called for more than one time before the termination
+ * of the reset and reconnection process, the method will return immediately.
+ * If not, all {@link ClientPingTask} will be cancelled, the timer will be purged and the {@code RMIClientNode} will
+ * be set to not alive.
+ * Finally, the thread will inform the {@link View} that the node has been disconnected and will task another thread
+ * to carry out the reset and reconnection process.
+ */
private void requestReconnection() {
synchronized (aliveLock) {
@@ -236,10 +321,19 @@ private void requestReconnection() {
prePingTask = new ClientPingTask(this);
view.nodeDisconnected();
- executorService.execute(this::resetConnection);
+ executorService.submit(this::resetConnection);
}
}
+ /**
+ * tries infinitely to find the {@link Registry} and the {@link RMIClientAcceptorInt} on the server.
+ * If the {@code Registry} and the {@code RMIClientAcceptorInt} is not found, the method will wait for a certain
+ * amount of time before trying again.
+ * Once the {@code RMIClientAcceptorInt} is found, the ClientNode will be set to alive and to a pre-game state.
+ * Then a new {@link ClientPingTask} will be scheduled to periodically check the connection with the server and set
+ * the pong count to its maximum.
+ * Finally, the method will inform the {@link View} that the node has been reconnected.
+ */
private void resetConnection () {
while(true){
@@ -274,17 +368,30 @@ private void resetConnection () {
nodePreState = true;
statusIsAlive = true;
pongCount = PONGMAXCOUNT;
- timer.schedule(prePingTask, 0, PINGINTERVAL);
+ timer.scheduleAtFixedRate(prePingTask, PINGINTERVAL, PINGINTERVAL);
logger.info("Connection established");
view.nodeReconnected();
}
}
+ /**
+ * Start the connection with the server.
+ */
public void startConnection() {
logger.debug("RMIClientNode started");
}
+ /**
+ * If the {@code RMIClientNode} is not alive, the method will return immediately.
+ * If the {@code RMIClientNode} is alive, the method will check whether the ClientNode is in pre-game state or not.
+ * If the ClientNode is in pre-game state, the method will assign to another thread the task of calling the
+ * {@link RMIClientAcceptorInt#extraPing()} method.
+ * IF the ClientNode is not in pre-game state, the method will decrement the pong count.
+ * If the pong count reaches 0, the {@code RMIClientNode} will start the reset and reconnection process.
+ * On the other hand, if the pong count is still more than 0 after decrementing, the client will send a
+ * {@link PingMessage} to the server.
+ */
@Override
public void pongTimeOverdue() {
@@ -336,6 +443,9 @@ public void pongTimeOverdue() {
}
}
+ /**
+ * Reset the pong count to the maximum value if the {@code RMIClientNode} is alive.
+ */
public void resetTimeCounter() {
synchronized (aliveLock) {
@@ -343,7 +453,7 @@ public void resetTimeCounter() {
if (!statusIsAlive)
return;
- pongCount = PONGMAXCOUNT; // TODO modificare se si aggiunge config
+ pongCount = PONGMAXCOUNT;
}
logger.debug("Pong count reset");
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNodeInt.java b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNodeInt.java
index c476a7d1..83c6c3e4 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNodeInt.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/RMIClientNodeInt.java
@@ -6,6 +6,28 @@
import java.rmi.Remote;
import java.rmi.RemoteException;
+/**
+ * The interface {@link RMIClientNodeInt} exposes the RMI methods that a
+ * {@link it.polimi.ingsw.am32.network.ServerNode.RMIServerNode} or {@link it.polimi.ingsw.am32.network.ClientAcceptor.RMIClientAcceptor}
+ * instance can invoke on the client.
+ * On the client a {@link RMIClientNode} will implement this interface to process the invocation of the method included.
+ *
+ * @author Matteo
+ */
public interface RMIClientNodeInt extends Remote {
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * The client will process the message according to its content.
+ * if a {@link RemoteException} or {@link NodeClosedException} is thrown, the ServerNode will start the termination
+ * process.
+ *
+ * @param message a {@link StoCMessage} that the client has to process
+ * @throws RemoteException thrown if the method couldn't be invoked on the client
+ * @throws NodeClosedException thrown if the ClientNode associated with the ServerNode is executing a reset of the
+ * connection.
+ */
void uploadStoC(StoCMessage message) throws RemoteException, NodeClosedException;
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/SKClientNode.java b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/SKClientNode.java
index 3df1e4ff..87f4782a 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ClientNode/SKClientNode.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ClientNode/SKClientNode.java
@@ -8,6 +8,7 @@
import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
import it.polimi.ingsw.am32.network.exceptions.ConnectionSetupFailedException;
import it.polimi.ingsw.am32.network.exceptions.NodeClosedException;
+import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -19,40 +20,92 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+/**
+ * SKClientNode is the class that manage the connection with the server.
+ * It implements the {@link ClientNodeInterface} interface and the method {@link #run()} of {@link Runnable} interface
+ * to handle the messages incoming from the server.
+ * Is necessary and enough to instantiate one instance of this class to connect to the server.
+ * If the connection were to go down, the instance will automatically try to reset and reconnect.
+ *
+ * @author Matteo
+ */
public class SKClientNode implements ClientNodeInterface, Runnable {
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ /**
+ * Constants used in the class
+ */
private static final int PONGMAXCOUNT = 3;
private static final int SOCKETTIMEOUT = 100;
+ private static final int THREADSLEEPINTERVAL = 100;
+ private static final int PINGINTERVAL = 5000;
+ /**
+ * Variables used for service purposes
+ */
private final Logger logger;
private final ExecutorService executorService;
+ /**
+ * Variables used to communicate with the view
+ */
private final View view;
+
+ /**
+ * Variables used to manage the connection with the server
+ */
private final String ip;
private final int port;
- private String nickname;
+ private final String nickname;
private int pongCount;
+ /**
+ * Variables used to communicate with the server
+ */
private Socket socket;
private ObjectOutputStream outputObtStr;
private ObjectInputStream inputObtStr;
+ /**
+ * Variables used to verify and maintain active the connection with the server
+ */
private ClientPingTask clientPingTask;
private final Timer timer;
+ /**
+ * Variables used to manage the state of the connection and the instance
+ */
private boolean statusIsAlive;
private boolean reconnectCalled;
private final Object aliveLock;
private final Object cToSProcessingLock;
private final Object sToCProcessingLock;
+
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class.
+ * Create the {@link Socket} connection with the server and the input and output streams.
+ * At initialization a ping task is scheduled to run to check and maintain the connection alive.
+ * A {@link ConnectionSetupFailedException} is thrown if the connection couldn't be established or during the
+ * initialization of the input and output streams there were problems.
+ *
+ * @param view the view that will be used to process incoming messages
+ * @param ip the ip of the server
+ * @param port the port of the server
+ * @throws ConnectionSetupFailedException thrown if the connection couldn't be established
+ */
public SKClientNode(View view, String ip, int port) throws ConnectionSetupFailedException {
this.view = view;
this.ip = ip;
this.port = port;
statusIsAlive = true;
reconnectCalled = false;
- pongCount = PONGMAXCOUNT; // todo fare un config??
+ pongCount = PONGMAXCOUNT;
nickname = "Unknown";
logger = LogManager.getLogger(SKClientNode.class);
@@ -62,6 +115,7 @@ public SKClientNode(View view, String ip, int port) throws ConnectionSetupFailed
logger.info("Attempting to connect to the server at {}:{}", ip, port);
socket = new Socket(ip, port);
+ //socket.setSoTimeout(SOCKETTIMEOUT*100); // Time out sulle read sulla input stream in caso qualcosa vada storto
outputObtStr = new ObjectOutputStream(socket.getOutputStream());
outputObtStr.flush();
inputObtStr = new ObjectInputStream(socket.getInputStream());
@@ -101,12 +155,25 @@ public SKClientNode(View view, String ip, int port) throws ConnectionSetupFailed
aliveLock = new Object();
cToSProcessingLock = new Object();
sToCProcessingLock = new Object();
- timer.scheduleAtFixedRate(clientPingTask, 0, 5000);
+ timer.scheduleAtFixedRate(clientPingTask, PINGINTERVAL, PINGINTERVAL);
}
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Standard run method of the class.
+ * The thread that runs this method will be used to listen for incoming messages.
+ * This will be done by remaining in a loop that will check if the connection is still alive and then listen for
+ * incoming messages.
+ * Listening for incoming messages and processing them will be done by invoking the method
+ * {@link #listenForIncomingMessages()}.
+ * If the method {@link #listenForIncomingMessages()} throws an exception, the connection will be reset and the
+ * reconnection process will start.
+ */
public void run() {
- // Listen for incoming messages
while(true) {
try {
@@ -121,6 +188,20 @@ public void run() {
}
}
+ /**
+ * Listen for incoming messages using a {@link ObjectInputStream}.
+ * Upon receiving a message, based on the type of the message, there can be two different outcomes:
+ * If the message is a {@link PongMessage}, the method will return immediately.
+ * If the message is a {@link StoCMessage}, the method will process the message by invoking the method
+ * {@link StoCMessage#processMessage(View)}.
+ * If the {@link IOException} or {@link ClassNotFoundException} is thrown, the input stream will be corrupted and
+ * the connection has to be reset and re-established.
+ *
+ *
+ * @throws IOException thrown if there were problems with the input stream
+ * @throws ClassNotFoundException thrown if the class of the object received by the input stream is not recognized
+ * @throws NodeClosedException thrown if the SKClientNode is not alive
+ */
public void listenForIncomingMessages() throws IOException, ClassNotFoundException, NodeClosedException {
Object message;
@@ -134,8 +215,6 @@ public void listenForIncomingMessages() throws IOException, ClassNotFoundExcepti
return;
}
- // TODO server sync??
-
resetTimeCounter();
@@ -161,46 +240,75 @@ public void listenForIncomingMessages() throws IOException, ClassNotFoundExcepti
}
}
+ /**
+ * Send a {@link CtoSLobbyMessage} to the server.
+ * If a {@link IOException} or {@link NullPointerException} is thrown, the reset and reconnection process will be
+ * assigned to a new thread while the caller will receive a {@link UploadFailureException}.
+ *
+ * @param message is the message that the client wants to send
+ * @throws UploadFailureException if the message couldn't be sent to the server
+ */
@Override
- public void uploadToServer(CtoSLobbyMessage message) {
+ public void uploadToServer(CtoSLobbyMessage message) throws UploadFailureException {
- while (true) { //TODO cambiare il while
- try {
- synchronized (cToSProcessingLock) {
- outputObtStr.writeObject(message);
+ try {
+ synchronized (cToSProcessingLock) {
+ outputObtStr.writeObject(message);
- try {
- outputObtStr.flush();
- } catch (IOException ignore) {}
- }
- logger.info("Message sent. Type: CtoSLobbyMessage. Content: {}", message);
- break;
- } catch (IOException | NullPointerException e) {
- resetConnection();
+ try {
+ outputObtStr.flush();
+ } catch (IOException ignore) {}
}
+
+ logger.info("Message sent. Type: CtoSLobbyMessage. Content: {}", message);
+
+ } catch (IOException | NullPointerException e) {
+
+ logger.info("Failed to send CtoSLobbyMessage to server. Exception: {}", e.getMessage());
+
+ executorService.submit(this::resetConnection);
+
+ throw new UploadFailureException();
}
}
+ /**
+ * Send a {@link CtoSMessage} to the server.
+ * If a {@link IOException} or {@link NullPointerException} is thrown, the reset and reconnection process will be
+ * assigned to a new thread while the caller will receive a {@link UploadFailureException}.
+ *
+ * @param message is the message that the client wants to send
+ * @throws UploadFailureException if the message couldn't be sent to the server
+ */
@Override
- public void uploadToServer(CtoSMessage message) {
+ public void uploadToServer(CtoSMessage message) throws UploadFailureException {
- while (true) { //TODO cambiare il while
- try {
- synchronized (cToSProcessingLock) {
- outputObtStr.writeObject(message);
+ try {
+ synchronized (cToSProcessingLock) {
+ outputObtStr.writeObject(message);
- try {
- outputObtStr.flush();
- } catch (IOException ignore) {}
- }
- logger.info("Message sent. Type: CtoSMessage: {}", message);
- break;
- } catch (IOException | NullPointerException e) {
- resetConnection();
+ try {
+ outputObtStr.flush();
+ } catch (IOException ignore) {}
}
+
+ logger.info("Message sent. Type: CtoSMessage: {}", message);
+
+ } catch (IOException | NullPointerException e) {
+
+ logger.info("Failed to send CtoSMessage to server. Exception: {}", e.getMessage());
+
+ executorService.submit(this::resetConnection);
+
+ throw new UploadFailureException();
}
}
+ /**
+ * Check if the connection is still alive and if it is, return immediately.
+ * Alternatively, the method {@link #manageReconnectionRequests()} will be invoked. A positive result of this
+ * invocation will trigger the reset and reconnection process.
+ */
private void checkConnection() {
boolean tmpReconnect;
@@ -220,6 +328,11 @@ private void checkConnection() {
}
}
+ /**
+ * Invoking this method will forcibly set the {@code SKClientNode} status to not alive.
+ * The method {@link #manageReconnectionRequests()} is then invoked. A positive result of this invocation will
+ * trigger the reset and reconnection process.
+ */
private void resetConnection() {
boolean tmpReconnect;
@@ -228,7 +341,7 @@ private void resetConnection() {
statusIsAlive = false;
- tmpReconnect = manageReconnectionRequests();
+ tmpReconnect = manageReconnectionRequests();
}
if(tmpReconnect) {
@@ -237,6 +350,15 @@ private void resetConnection() {
}
}
+ /**
+ * Check if the reset and reconnection process has already been requested.
+ * If so, the caller will wait until the process is completed.
+ * On the other hand, flag the reset and reconnection process as requested.
+ * This will result in cancelling the ping tasks of the {@code SKClientNode} and purging the timer.
+ * Additionally the view will be notified that the node has been disconnected.
+ *
+ * @return true if the caller has to start the reset and reconnection process, false otherwise
+ */
private boolean manageReconnectionRequests() {
if(reconnectCalled){
@@ -258,6 +380,17 @@ private boolean manageReconnectionRequests() {
}
}
+ /**
+ * Reset the current connection by closing the input and output streams and the socket.
+ * Try until successful to establish a new connection to server.
+ * If the connection is established:
+ * - New input and output streams will be created.
+ * - The pong count will be reset to the maximum value.
+ * - The status of the {@code SKClientNode} will be set to alive and the view will be notified that the node has
+ * reconnected.
+ * - Finally all waiting threads for the reconnection process will be notified and a new {@link ClientPingTask}
+ * will be scheduled.
+ */
private void connect() {
synchronized (sToCProcessingLock) {
@@ -297,7 +430,7 @@ private void connect() {
logger.debug("Failed to connect to {}:{}", ip, port);
try {
- Thread.sleep(100); // TODO parametrizzazione con config?
+ Thread.sleep(THREADSLEEPINTERVAL);
} catch (InterruptedException ignore2) {}
continue;
@@ -314,17 +447,28 @@ private void connect() {
reconnectCalled = false;
pongCount = PONGMAXCOUNT;
aliveLock.notifyAll();
- timer.scheduleAtFixedRate(clientPingTask, 0, 5000);
+ timer.scheduleAtFixedRate(clientPingTask, PINGINTERVAL, PINGINTERVAL);
view.nodeReconnected();
}
}
+ /**
+ * Start the connection.
+ * The method will submit the {@code SKClientNode} to the {@link ExecutorService} to start the connection.
+ */
public void startConnection(){
executorService.submit(this);
logger.debug("SKClientNode started");
}
+ /**
+ * If the {@code SKClientNode} is not alive, the method will return immediately.
+ * If the {@code SKClientNode} is alive, the pong count will be decremented.
+ * If the pong count reaches 0, the {@code SKClientNode} will start the reset and reconnection process.
+ * On the other hand, if the pong count is still more than 0 after decrementing, the client will send a
+ * {@link PingMessage} to the server.
+ */
@Override
public void pongTimeOverdue() {
@@ -356,6 +500,9 @@ public void pongTimeOverdue() {
}});
}
+ /**
+ * Reset the pong count to the maximum value if the {@code SKClientNode} is alive.
+ */
public void resetTimeCounter() {
synchronized (aliveLock) {
@@ -363,7 +510,7 @@ public void resetTimeCounter() {
if (!statusIsAlive)
return;
- pongCount = PONGMAXCOUNT; // TODO modificare se si aggiunge config
+ pongCount = PONGMAXCOUNT;
}
logger.debug("Pong count reset");
diff --git a/src/main/java/it/polimi/ingsw/am32/network/GameTuple.java b/src/main/java/it/polimi/ingsw/am32/network/GameTuple.java
deleted file mode 100644
index 0da8b7f9..00000000
--- a/src/main/java/it/polimi/ingsw/am32/network/GameTuple.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package it.polimi.ingsw.am32.network;
-
-import it.polimi.ingsw.am32.network.ServerNode.RMIServerNodeInt;
-
-import java.io.Serializable;
-
-public class GameTuple implements Serializable {
-
- private final RMIServerNodeInt node;
- private final int id;
-
- public GameTuple(RMIServerNodeInt node, int id) {
- this.node = node;
- this.id = id;
- }
-
- public RMIServerNodeInt getNode(){
- return node;
- }
-
- public int getId() {
- return id;
- }
-}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/NodeInterface.java b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/NodeInterface.java
deleted file mode 100644
index 8ef6f7e4..00000000
--- a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/NodeInterface.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package it.polimi.ingsw.am32.network.ServerNode;
-
-import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
-import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
-
-public interface NodeInterface {
- void uploadToClient(StoCMessage message) throws UploadFailureException;
- void pingTimeOverdue();
- void resetTimeCounter();
-}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNode.java b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNode.java
index 9d10a84e..6f23343e 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNode.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNode.java
@@ -16,21 +16,64 @@
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
-public class RMIServerNode extends UnicastRemoteObject implements RMIServerNodeInt, NodeInterface {
-
+/**
+ * Each instance of class {@code RMIServerNode} handle une RMI connection with a client.
+ * If, at some point, the connection were to go down, this instance while begin automatically a termination process
+ *
+ * @author Matteo
+ */
+public class RMIServerNode extends UnicastRemoteObject implements RMIServerNodeInt, ServerNodeInterface {
+
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ /**
+ * Variables used for service purposes
+ */
private final static Logger logger = LogManager.getLogger(RMIServerNode.class);
-
private final Configuration config;
+
+ /**
+ * Variables used to communicate with the {@code GameController}
+ */
private GameController gameController;
+
+ /**
+ * Variables used to manage the connection with the server
+ */
private int pingCount;
+ private final String nickname;
+
+ /**
+ * Variables used to communicate with the client
+ */
private final RMIClientNodeInt clientNode;
+
+ /**
+ * Variables used to verify and maintain active the connection with the client
+ */
private ServerPingTask serverPingTask;
+
+ /**
+ * Variables used to manage the state of the connection and the instance
+ */
private boolean statusIsAlive;
private boolean destroyCalled;
private final Object aliveLock;
private final Object ctoSProcessingLock;
private final Object stoCProcessingLock;
+
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class
+ *
+ * @param clientNode is the instance of {@code RMIClientNodeInt} the {@code RMIServerNode} will use to send messages
+ * to che client
+ * @throws RemoteException thrown if, during the instantiation, there were some problems
+ */
public RMIServerNode(RMIClientNodeInt clientNode) throws RemoteException {
this.clientNode = clientNode;
serverPingTask = new ServerPingTask(this);
@@ -39,11 +82,25 @@ public RMIServerNode(RMIClientNodeInt clientNode) throws RemoteException {
aliveLock = new Object();
ctoSProcessingLock = new Object();
stoCProcessingLock = new Object();
+ nickname = "Unknown";
statusIsAlive = true;
destroyCalled = false;
}
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Send a {@link CtoSMessage} to the {@link RMIServerNode}. The server will process it and send back a
+ * {@link StoCMessage} according to the situation.
+ * If the ServerNode is not alive, a {@link NodeClosedException} will be thrown.
+ *
+ * @param message a {@link CtoSMessage} that the server has to process
+ * @throws RemoteException if the method couldn't be invoked on the server
+ * @throws NodeClosedException if the {@code RMIServerNode} is not alive
+ */
public void uploadCtoS(CtoSMessage message) throws RemoteException, NodeClosedException {
synchronized (ctoSProcessingLock) {
@@ -55,17 +112,7 @@ public void uploadCtoS(CtoSMessage message) throws RemoteException, NodeClosedEx
resetTimeCounter();
}
- if(message instanceof PingMessage) {
- config.getExecutorService().submit(() -> {
- try {
- logger.debug("PingMessage received");
- uploadToClient(new PongMessage(null));
- } catch (UploadFailureException e) {
- logger.error("Failed to send PongMessage to client");
- }
- });
- return;
- }
+ if(message instanceof PingMessage) {return;}
// We can't risk to lose the observability of potential RuntimeExceptions thrown by GameController and Model
// The server will not crash if such exceptions are thrown, thanks to how the threads are managed, but
@@ -80,6 +127,15 @@ public void uploadCtoS(CtoSMessage message) throws RemoteException, NodeClosedEx
}
}
+ /**
+ * Send a {@link StoCMessage} to the client.
+ * If the client is not alive or the connection had issues and the message couldn't reach the client, a
+ * {@link UploadFailureException} will be thrown.
+ * If any of the two exceptions is thrown, the {@code RMIServerNode} will start the destruction process.
+ *
+ * @param message is the message that the server wants to send
+ * @throws UploadFailureException if the message couldn't be sent to the client
+ */
public void uploadToClient(StoCMessage message) throws UploadFailureException {
try {
@@ -106,8 +162,17 @@ public void uploadToClient(StoCMessage message) throws UploadFailureException {
}
}
+ /**
+ * If the {@code RMIServerNode} is not alive, the method will return immediately.
+ * If the {@code RMIServerNode} is alive, the ping count will be decremented.
+ * If the ping count reaches 0, the {@code RMIServerNode} will start the destruction process.
+ * On the other hand, if the ping count is still more than 0 after decrementing, the server will send a
+ * {@link PongMessage} to the client.
+ */
public void pingTimeOverdue() {
+ boolean tmpDestroy = false;
+
synchronized (aliveLock) {
if(!statusIsAlive)
@@ -120,15 +185,27 @@ public void pingTimeOverdue() {
if(pingCount <= 0){
statusIsAlive = false;
logger.debug("Ping count reached minimum, starting destruction process");
+ tmpDestroy = true;
}
}
- if(!statusIsAlive)
+ if(tmpDestroy)
destroy();
+ else
+ config.getExecutorService().submit(() -> {
+ try {
+ uploadToClient(new PongMessage(nickname));
+ } catch (UploadFailureException e) {
+ logger.error("Failed to send PongMessage to client");
+ }
+ });
}
+ /**
+ * Reset the ping count to the maximum value if the server is alive.
+ */
@Override
public void resetTimeCounter() {
@@ -138,9 +215,16 @@ public void resetTimeCounter() {
return;
pingCount = config.getMaxPingCount();
+ logger.debug("Ping count reset");
}
}
+ /**
+ * Destroy the {@code RMIServerNode}.
+ * The method will stop the {@link ServerPingTask} and will disconnect the {@code RMIServerNode} from the
+ * {@code GameController} if already assigned.
+ * The method will also unexport the {@code RMIServerNode} from the RMI registry.
+ */
public void destroy() {
synchronized (aliveLock) {
@@ -171,10 +255,19 @@ public void destroy() {
}
+ /**
+ * Set the {@code GameController} associated with this {@code RMIServerNode}. All incoming messages will be
+ * processed by this {@code GameController}.
+ * Invoking this method will also add a new {@link ServerPingTask} to the {@code GameController} timer for pinging
+ * the client
+ *
+ * @param gameController the instance of {@code GameController}
+ */
public void setGameController(GameController gameController) {
this.gameController = gameController;
- gameController.getTimer().scheduleAtFixedRate(serverPingTask, 0, Configuration.getInstance().getPingTimeInterval());
+ gameController.getTimer().scheduleAtFixedRate(serverPingTask,
+ Configuration.getInstance().getPingTimeInterval(), Configuration.getInstance().getPingTimeInterval());
}
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNodeInt.java b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNodeInt.java
index 0d597ccd..5c305f19 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNodeInt.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/RMIServerNodeInt.java
@@ -1,11 +1,34 @@
package it.polimi.ingsw.am32.network.ServerNode;
import it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage;
+import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
+import it.polimi.ingsw.am32.network.ClientNode.RMIClientNode;
+import it.polimi.ingsw.am32.network.ClientNode.RMIClientNodeInt;
import it.polimi.ingsw.am32.network.exceptions.NodeClosedException;
import java.rmi.Remote;
import java.rmi.RemoteException;
+/**
+ * The interface {@link RMIServerNodeInt} exposes the RMI methods that a
+ * {@link it.polimi.ingsw.am32.network.ClientNode.RMIClientNode} instance can invoke on the server.
+ * On the server a {@link RMIServerNode} will implement this interface to process the invocation of the method included.
+ *
+ * @author Matteo
+ */
public interface RMIServerNodeInt extends Remote {
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * The server will process the message according to its content.
+ * if a {@link RemoteException} or {@link NodeClosedException} is thrown, the ClientNode will reset automatically the
+ * connection
+ *
+ * @param message a {@link CtoSMessage} that the server has to process
+ * @throws RemoteException thrown if the method couldn't be invoked on the client
+ * @throws NodeClosedException thrown if the ServerNode associated with the ClientNode is terminated server-side
+ */
void uploadCtoS(CtoSMessage message) throws RemoteException, NodeClosedException;
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/SKServerNode.java b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/SKServerNode.java
index 05083f80..563be8e5 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/SKServerNode.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/SKServerNode.java
@@ -24,23 +24,72 @@
import java.net.SocketTimeoutException;
import java.util.Arrays;
-public class SKServerNode implements Runnable, NodeInterface {
-
+/**
+ * Each instance of class {@code SKServerNode} handles a socket connection with a client.
+ * If, at some point, the connection were to go down, this instance will begin automatically a termination process.
+ * The class implements the {@code Runnable} interface to allow the instance to be run in a separate thread.
+ *
+ * @author Matteo
+ */
+public class SKServerNode implements Runnable, ServerNodeInterface {
+
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ /**
+ * Variables used for service purposes
+ */
private final Logger logger;
private final Configuration config;
+
+ /**
+ * Variables used to communicate with the {@code GameController}
+ */
private GameController gameController;
+
+ /**
+ * Variables used to manage the connection with the server
+ */
+ private int pingCount;
+ private final String nickname;
+
+ /**
+ * Variables used to communicate with the client
+ */
+ private final Socket socket;
private final ObjectInputStream inputObtStr;
private final ObjectOutputStream outputObtStr;
- private final Socket socket;
- private int pingCount;
+
+ /**
+ * Variables used to verify and maintain active the connection with the client
+ */
private ServerPingTask notLinkedPingTask;
private ServerPingTask serverPingTask;
+
+ /**
+ * Variables used to manage the state of the connection and the instance
+ */
private boolean statusIsAlive;
private boolean destroyCalled;
private final Object aliveLock;
private final Object ctoSProcessingLock;
private final Object stoCProcessingLock;
+
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class.
+ * It creates a new instance of {@code SKServerNode} and initializes the input and output streams.
+ * It also sets the socket timeout.
+ * A temporary ping task is created to check if the client is still alive while the gameController is not yet assigned
+ * Throwing an exception implies that this class is not correctly initialized and should be destroyed. This also
+ * implies that the socket and its streams are closed.
+ *
+ * @param socket
+ * @throws UninitializedException thrown if, during the instantiation, there were some problems
+ */
public SKServerNode(Socket socket) throws UninitializedException {
this.gameController = null;
this.socket = socket;
@@ -49,6 +98,7 @@ public SKServerNode(Socket socket) throws UninitializedException {
aliveLock = new Object();
ctoSProcessingLock = new Object();
stoCProcessingLock = new Object();
+ nickname = "Unknown";
this.logger = LogManager.getLogger(SKServerNode.class);
@@ -112,6 +162,17 @@ public SKServerNode(Socket socket) throws UninitializedException {
config.addTimerTask(notLinkedPingTask);
}
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Method that starts the reading of the incoming messages from the input stream of the client.
+ * This method will process the incoming messages and will call the appropriate method of the {@code GameController}
+ * to handle the message.
+ * If at some point, the instance of {@code SKServerNode} is not alive, the thread will terminate.
+ * Any problem with the input stream will cause the destruction of the {@code SKServerNode}.
+ */
public void run() {
logger.debug("SKServerNode thread started");
try {
@@ -132,7 +193,6 @@ public void run() {
"Stack Trace: {}\n",
e.getMessage(), e.getLocalizedMessage(), Arrays.toString(e.getStackTrace()));
- //TODO risolvere meglio gli errori
destroy();
} catch (NodeClosedException e) {
@@ -140,6 +200,23 @@ public void run() {
}
}
+ /**
+ * Method that listens for incoming messages from the client.
+ * The method will wait until a message is received from the client.
+ * When a message is received, the method will check the type of the message:
+ * - If the message is a {@link PingMessage}, the method will return immediately.
+ * - If the message is a {@link CtoSMessage} and a {@link GameController} is already set, the method will call the
+ * {@code elaborateMessage} method on the message.
+ * - If the message is a {@link CtoSLobbyMessage} and a {@link GameController} is not yet set, the method will call
+ * the {@code elaborateMessage} method on the message and set the {@code GameController} to the one returned by the
+ * method.
+ * - If the message is not recognized, the method will send an {@link ErrorMessage} to the client.
+ * If the method encounters any problem while processing the message, it will throw an exception.
+ *
+ * @throws IOException exception thrown if there are problems with the input stream
+ * @throws ClassNotFoundException exception thrown if the class of the object received from the input stream is not found
+ * @throws NodeClosedException exception thrown if the instance of {@code SKServerNode} is not alive
+ */
private void listenForIncomingMessages() throws IOException, ClassNotFoundException, NodeClosedException {
Object message; // Variable containing the message object received from the client
@@ -161,16 +238,7 @@ private void listenForIncomingMessages() throws IOException, ClassNotFoundExcept
// Check type of message received
- if (message instanceof PingMessage) {
- config.getExecutorService().submit(() -> {
- try {
- logger.debug("PingMessage received");
- uploadToClient(new PongMessage(null));
- } catch (UploadFailureException e) {
- logger.error("Failed to send PongMessage to client");
- }
- }); // Create a new thread that sends a PongMessage back to the client
- }
+ if (message instanceof PingMessage) {return;}
else if (message instanceof CtoSMessage) {
if (gameController == null) { // It should never happen that the gameController hasn't yet been assigned when a CtoSMessage is received
try {
@@ -213,11 +281,11 @@ else if (message instanceof CtoSLobbyMessage) {
// As expected, the gameController has not yet been assigned
try {
gameController = ((CtoSLobbyMessage) message).elaborateMessage(this);
- // TODO forse è meglio mettere il messaggio di errore nell'exception
notLinkedPingTask.cancel();
config.purgeTimer();
- gameController.getTimer().scheduleAtFixedRate(serverPingTask, 0, Configuration.getInstance().getPingTimeInterval());
+ gameController.getTimer().scheduleAtFixedRate(serverPingTask,
+ Configuration.getInstance().getPingTimeInterval(), Configuration.getInstance().getPingTimeInterval());
logger.info("Elaborated CtoSLobbyMessage received: {}", message.toString());
} catch (LobbyMessageException e) {
@@ -251,6 +319,15 @@ else if (message instanceof CtoSLobbyMessage) {
}
}
+ /**
+ * Method that sends a {@link StoCMessage} to the client. ù
+ * If the client is not alive or the connection had issues and the message couldn't reach the client, a
+ * {@link UploadFailureException} will be thrown.
+ * If the client wasn't reachable, the method will start the destruction process.
+ *
+ * @param msg is the message that the server wants to send
+ * @throws UploadFailureException if the message couldn't be sent to the client or the ServerNode is not alive
+ */
public void uploadToClient(StoCMessage msg) throws UploadFailureException {
synchronized (stoCProcessingLock) {
@@ -279,6 +356,14 @@ public void uploadToClient(StoCMessage msg) throws UploadFailureException {
}
}
+ /**
+ * Method that should be called at regular intervals.
+ * If the {@code SKServerNode} is not alive, the method will return immediately.
+ * If the {@code SKServerNode} is alive, the ping count will be decremented.
+ * If the ping count reaches 0, the {@code SKServerNode} will start the destruction process.
+ * On the other hand, if the ping count is still more than 0 after decrementing, the server will send a
+ * {@link PongMessage} to the client.
+ */
@Override
public void pingTimeOverdue() {
@@ -302,9 +387,19 @@ public void pingTimeOverdue() {
if(tmpDestroy)
destroy();
-
+ else
+ config.getExecutorService().submit(() -> {
+ try {
+ uploadToClient(new PongMessage(nickname));
+ } catch (UploadFailureException e) {
+ logger.error("Failed to send PongMessage to client");
+ }
+ }); // Create a new thread that sends a PongMessage back to the client
}
+ /**
+ * Method that resets the ping counter to its maximum value if the {@code SKServerNode} is alive.
+ */
@Override
public void resetTimeCounter() {
@@ -318,6 +413,15 @@ public void resetTimeCounter() {
}
}
+ /**
+ * Method that destroys the instance of {@code SKServerNode}.
+ * It closes the input and output streams and the socket.
+ * If the {@code SKServerNode} is linked to a {@code GameController}, it will disconnect from it.
+ * It also cancels all ping tasks and then purges the timer of the {@code Configuration} class and
+ * {@code GameController}.
+ * The method will also set the status of the {@code SKServerNode} to not alive.
+ *
+ */
public void destroy(){
synchronized (aliveLock) {
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerNodeInterface.java b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerNodeInterface.java
new file mode 100644
index 00000000..22dfc595
--- /dev/null
+++ b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerNodeInterface.java
@@ -0,0 +1,50 @@
+package it.polimi.ingsw.am32.network.ServerNode;
+
+import it.polimi.ingsw.am32.message.ClientToServer.CtoSMessage;
+import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
+import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
+
+/**
+ * This {@code ServerNodeInterface} interface is used to identify all ServerNodes through which communication, with
+ * clients, can happen.
+ * It's objective is to mask behind the interface the complexity of managing the network part of the server, so that the
+ * other classes of the server don't have to know how is the communication between server and client working.
+ * It contains all the methods that another class in the server can invoke on any ServerNode.
+ * It's important to know that each instance of ServerNode is assigned to a different client. If, at some point, the
+ * communication to a client is impossible, the instance of ServerNode assigned to that client will follow a termination
+ * process that will lead to the destruction of the instance itself and every object strictly linked to it. A new
+ * instance will have to be created if the client were to reconnect later.
+ *
+ * @author Matteo
+ */
+public interface ServerNodeInterface {
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Send a {@link StoCMessage} to the client that will process it.
+ * A {@link UploadFailureException} exception is thrown if the message could not reach the client.
+ * If the exception is thrown, the ServerNode will automatically and independently begin the termination process.
+ *
+ * @param message is the message that the server wants to send
+ * @throws UploadFailureException if the message couldn't be sent
+ */
+ void uploadToClient(StoCMessage message) throws UploadFailureException;
+
+ /**
+ * Inform the ServerNode that the interval for pings is over.
+ * This invocation can lead to the decrease of a ping counter. If the counter reach the minimum than the termination
+ * process is started.
+ *
+ * Invoking this method can lead, depending on the current state of the ServerNode, to verify if the connection to
+ * the client is working through the emission of a ping to the client.
+ */
+ void pingTimeOverdue();
+
+ /**
+ * The invocation of this method will lead to the reset of the ping counter, i.e. bringing it back to maximum,
+ * associated with the ServerNode.Ad
+ */
+ void resetTimeCounter();
+}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerPingTask.java b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerPingTask.java
index 4a9ed257..d0452f20 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerPingTask.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/ServerNode/ServerPingTask.java
@@ -1,26 +1,61 @@
package it.polimi.ingsw.am32.network.ServerNode;
+import it.polimi.ingsw.am32.network.ClientNode.ClientNodeInterface;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.TimerTask;
+/**
+ * The {@code ServerPingTask} class contains the pointer to a ServerNode, given when the object is instantiated.
+ * This class is used by a {@link java.util.Timer} to invoke the method {@link ServerNodeInterface#pingTimeOverdue()}
+ * on the given node.
+ *
+ * @author Matteo
+ */
public class ServerPingTask extends TimerTask {
- private static final Logger logger = LogManager.getLogger(ServerPingTask.class);
- private NodeInterface node;
- public ServerPingTask(NodeInterface node) {
+
+ //---------------------------------------------------------------------------------------------
+ // Variables and Constants
+
+ // private static final Logger logger = LogManager.getLogger(ServerPingTask.class);
+ private ServerNodeInterface node;
+
+
+ //---------------------------------------------------------------------------------------------
+ // Constructor
+
+ /**
+ * Standard constructor of the class.
+ *
+ * @param node the ServerNode on which will be invoked the {@link ServerNodeInterface#pingTimeOverdue()}
+ */
+ public ServerPingTask(ServerNodeInterface node) {
this.node = node;
}
+
+
+ //---------------------------------------------------------------------------------------------
+ // Methods
+
+ /**
+ * Invoke the method {@link ServerNodeInterface#pingTimeOverdue()} on the ServerNode stored in the object.
+ */
public void run() {
// logger.debug("ServerPingTask started. The node {} will be checked for ping time.", node); // Logging disabled to avoid spamming
node.pingTimeOverdue();
}
+ /**
+ * invoke the method {@link TimerTask#cancel()} and delete the reference to the ServerNode to facilitate deletion
+ * of the object by the garbage collector.
+ *
+ * @return the return value of the method {@code cancel()} of the super class
+ */
@Override
public boolean cancel() {
boolean cancelled = super.cancel();
node = null;
return cancelled;
}
-
}
diff --git a/src/main/java/it/polimi/ingsw/am32/network/exceptions/ConnectionSetupFailedException.java b/src/main/java/it/polimi/ingsw/am32/network/exceptions/ConnectionSetupFailedException.java
index 0d16d0ba..6e1dd98a 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/exceptions/ConnectionSetupFailedException.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/exceptions/ConnectionSetupFailedException.java
@@ -1,3 +1,9 @@
package it.polimi.ingsw.am32.network.exceptions;
+/**
+ * A simple Exception that extends {@code Throwable} and add nothing else.
+ * Used to notify the {@link it.polimi.ingsw.am32.client.View} that the instantiation of a ClientNode was unsuccessful.
+ *
+ * @author Matteo
+ */
public class ConnectionSetupFailedException extends Throwable {}
\ No newline at end of file
diff --git a/src/main/java/it/polimi/ingsw/am32/network/exceptions/ErrorMessageCode.java b/src/main/java/it/polimi/ingsw/am32/network/exceptions/ErrorMessageCode.java
index c8eed5f5..a30f1b9d 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/exceptions/ErrorMessageCode.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/exceptions/ErrorMessageCode.java
@@ -7,8 +7,17 @@
* @see it.polimi.ingsw.am32.message.ServerToClient.ErrorMessage
*/
public enum ErrorMessageCode {
+ /**
+ * StoCMessage sent before StoCLobbyMessage.
+ */
STOCMESSAGE_SENT_BEFORE_STOCLOBBYMESSAGE(128),
+ /**
+ * StoCLobbyMessage sent but GameController already present.
+ */
STOCLOBBYMESSAGE_SENT_BUT_GAMECONTROLLER_ALREADY_PRESENT(127),
+ /**
+ * Message type not recognized.
+ */
MESSAGE_TYPE_NOT_RECOGNIZED(126);
/**
diff --git a/src/main/java/it/polimi/ingsw/am32/network/exceptions/NodeClosedException.java b/src/main/java/it/polimi/ingsw/am32/network/exceptions/NodeClosedException.java
index 99a178bd..f925a998 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/exceptions/NodeClosedException.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/exceptions/NodeClosedException.java
@@ -1,4 +1,10 @@
package it.polimi.ingsw.am32.network.exceptions;
-public class NodeClosedException extends Throwable {
-}
+/**
+ * A simple Exception that extends {@code Throwable} and add nothing else.
+ * Used to notify the caller that the Node (Server or Client) on which the method was invoked, is not usable at the
+ * moment.
+ *
+ * @author Matteo
+ */
+public class NodeClosedException extends Throwable {}
\ No newline at end of file
diff --git a/src/main/java/it/polimi/ingsw/am32/network/exceptions/UninitializedException.java b/src/main/java/it/polimi/ingsw/am32/network/exceptions/UninitializedException.java
index 4170e2e4..69031cbe 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/exceptions/UninitializedException.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/exceptions/UninitializedException.java
@@ -1,3 +1,10 @@
package it.polimi.ingsw.am32.network.exceptions;
-public class UninitializedException extends Throwable {}
+/**
+ * A simple Exception that extends {@code Throwable} and add nothing else.
+ * Used to notify the {@link it.polimi.ingsw.am32.network.ClientAcceptor.SKClientAcceptor} that the instantiation
+ * of a {@link it.polimi.ingsw.am32.network.ClientNode.SKClientNode} was unsuccessful.
+ *
+ * @author Matteo
+ */
+public class UninitializedException extends Throwable {}
\ No newline at end of file
diff --git a/src/main/java/it/polimi/ingsw/am32/network/exceptions/UploadFailureException.java b/src/main/java/it/polimi/ingsw/am32/network/exceptions/UploadFailureException.java
index 850d7914..161c655d 100644
--- a/src/main/java/it/polimi/ingsw/am32/network/exceptions/UploadFailureException.java
+++ b/src/main/java/it/polimi/ingsw/am32/network/exceptions/UploadFailureException.java
@@ -1,4 +1,9 @@
package it.polimi.ingsw.am32.network.exceptions;
-public class UploadFailureException extends Throwable{
-}
+/**
+ * A simple Exception that extends {@code Throwable} and add nothing else.
+ * Used to notify the caller that the message given to the Node (Server or Client) could not be sent.
+ *
+ * @author Matteo
+ */
+public class UploadFailureException extends Throwable{}
\ No newline at end of file
diff --git a/src/main/java/it/polimi/ingsw/am32/utilities/Configuration.java b/src/main/java/it/polimi/ingsw/am32/utilities/Configuration.java
index eaaa9e53..2d18742a 100644
--- a/src/main/java/it/polimi/ingsw/am32/utilities/Configuration.java
+++ b/src/main/java/it/polimi/ingsw/am32/utilities/Configuration.java
@@ -219,8 +219,6 @@ protected int portValidator(int newPort, int defaultPort) {
*/
protected String serverIpValidator(String ipToValidate , String lastValidIp) {
- // TODO rivalutare algoritmo
-
char[] workingIp = ipToValidate.toCharArray();
int prevIndex = 0;
int counter = 0;
@@ -363,7 +361,7 @@ public ExecutorService getExecutorService() {
* @param serverPingTask is the {@code ServerPingTask} to be scheduled
*/
public void addTimerTask(ServerPingTask serverPingTask) {
- notLinkedSocketTimer.scheduleAtFixedRate(serverPingTask, 0, pingTimeInterval);
+ notLinkedSocketTimer.scheduleAtFixedRate(serverPingTask, pingTimeInterval, pingTimeInterval);
}
/**
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index abd8e489..84283623 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -15,7 +15,6 @@
opens it.polimi.ingsw.am32 to javafx.fxml;
exports it.polimi.ingsw.am32;
exports it.polimi.ingsw.am32.network.ClientAcceptor to java.rmi;
- exports it.polimi.ingsw.am32.network to java.rmi;
exports it.polimi.ingsw.am32.model.exceptions to java.rmi;
exports it.polimi.ingsw.am32.controller.exceptions.abstraction to java.rmi;
exports it.polimi.ingsw.am32.controller to java.rmi;
diff --git a/src/test/java/it/polimi/ingsw/am32/controller/GameControllerTest.java b/src/test/java/it/polimi/ingsw/am32/controller/GameControllerTest.java
index afcf9cac..e37438a5 100644
--- a/src/test/java/it/polimi/ingsw/am32/controller/GameControllerTest.java
+++ b/src/test/java/it/polimi/ingsw/am32/controller/GameControllerTest.java
@@ -7,7 +7,7 @@
import it.polimi.ingsw.am32.message.ServerToClient.*;
import it.polimi.ingsw.am32.model.exceptions.DuplicateNicknameException;
import it.polimi.ingsw.am32.model.exceptions.PlayerNotFoundException;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import org.junit.jupiter.api.*;
import java.lang.reflect.Field;
@@ -21,8 +21,8 @@ public class GameControllerTest {
// GameController objects used for testing
private GameController gameController;
- // Stub class for NodeInterface. This class is used to test the GameController class.
- private static class NodeInterfaceStub implements NodeInterface {
+ // Stub class for ServerNodeInterface. This class is used to test the GameController class.
+ private static class NodeInterfaceStub implements ServerNodeInterface {
private final ArrayList internalMessages;
public NodeInterfaceStub() {
internalMessages = new ArrayList<>();
diff --git a/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerMockitoTest.java b/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerMockitoTest.java
index 0ea5c332..9b8e0494 100644
--- a/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerMockitoTest.java
+++ b/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerMockitoTest.java
@@ -1,7 +1,7 @@
package it.polimi.ingsw.am32.controller;
import it.polimi.ingsw.am32.controller.exceptions.*;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -21,7 +21,7 @@ class GamesManagerMockitoTest {
private GameController gameController;
@Mock
- private NodeInterface node;
+ private ServerNodeInterface node;
@Mock
private VirtualView virtualView;
diff --git a/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerTest.java b/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerTest.java
index 47e12954..12c2c23e 100644
--- a/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerTest.java
+++ b/src/test/java/it/polimi/ingsw/am32/controller/GamesManagerTest.java
@@ -2,7 +2,7 @@
import it.polimi.ingsw.am32.controller.exceptions.*;
import it.polimi.ingsw.am32.message.ServerToClient.*;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@@ -16,8 +16,8 @@
import static org.junit.jupiter.api.Assertions.*;
class GamesManagerTest {
- // Stub class for NodeInterface. This class is used to test the GameController class.
- private static class NodeInterfaceStub implements NodeInterface {
+ // Stub class for ServerNodeInterface. This class is used to test the GameController class.
+ private static class NodeInterfaceStub implements ServerNodeInterface {
private final ArrayList internalMessages;
public NodeInterfaceStub() {
internalMessages = new ArrayList<>();
@@ -39,8 +39,8 @@ public synchronized void clearInternalMessages() {
}
}
- // NodeInterface instance
- private NodeInterface node;
+ // ServerNodeInterface instance
+ private ServerNodeInterface node;
// GamesManager instance
private GamesManager gamesManager;
diff --git a/src/test/java/it/polimi/ingsw/am32/controller/PlayerQuadrupleTest.java b/src/test/java/it/polimi/ingsw/am32/controller/PlayerQuadrupleTest.java
index c6fcca36..ec811a8d 100644
--- a/src/test/java/it/polimi/ingsw/am32/controller/PlayerQuadrupleTest.java
+++ b/src/test/java/it/polimi/ingsw/am32/controller/PlayerQuadrupleTest.java
@@ -2,15 +2,15 @@
import it.polimi.ingsw.am32.controller.exceptions.CriticalFailureException;
import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class PlayerQuadrupleTest {
- // NodeInterface and VirtualView stubs. They are not relevant for the test, so they can be mocked.
- private static class NodeInterfaceStub implements NodeInterface {
+ // ServerNodeInterface and VirtualView stubs. They are not relevant for the test, so they can be mocked.
+ private static class NodeInterfaceStub implements ServerNodeInterface {
// Fake Methods
public void uploadToClient(StoCMessage message) {}
public void pingTimeOverdue() {}
@@ -22,7 +22,7 @@ public NodeInterfaceStub() {}
private static class VirtualViewStub extends VirtualView {
// Fake Constructor
- public VirtualViewStub(NodeInterface node) {
+ public VirtualViewStub(ServerNodeInterface node) {
super(node);
}
}
@@ -30,7 +30,7 @@ public VirtualViewStub(NodeInterface node) {
@DisplayName("Should create a player quadruple when parameters are valid")
@Test
void shouldCreatePlayerQuadrupleWhenParametersAreValid() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
PlayerQuadruple playerQuadruple = new PlayerQuadruple(node, "nickname", true, virtualView);
@@ -43,7 +43,7 @@ void shouldCreatePlayerQuadrupleWhenParametersAreValid() {
@DisplayName("Should throw exception when node is null")
@Test
void shouldThrowExceptionWhenNodeIsNull() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
assertThrows(CriticalFailureException.class, () -> new PlayerQuadruple(null, "nickname", true, virtualView));
}
@@ -51,7 +51,7 @@ void shouldThrowExceptionWhenNodeIsNull() {
@DisplayName("Should throw exception when nickname is null")
@Test
void shouldThrowExceptionWhenNicknameIsNull() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
assertThrows(CriticalFailureException.class, () -> new PlayerQuadruple(node, null, true, virtualView));
}
@@ -59,7 +59,7 @@ void shouldThrowExceptionWhenNicknameIsNull() {
@DisplayName("Should throw exception when nickname is empty")
@Test
void shouldThrowExceptionWhenNicknameIsEmpty() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
assertThrows(CriticalFailureException.class, () -> new PlayerQuadruple(node, "", true, virtualView));
}
@@ -67,14 +67,14 @@ void shouldThrowExceptionWhenNicknameIsEmpty() {
@DisplayName("Should throw exception when virtual view is null")
@Test
void shouldThrowExceptionWhenVirtualViewIsNull() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
assertThrows(CriticalFailureException.class, () -> new PlayerQuadruple(node, "nickname", true, null));
}
@DisplayName("Should change connection status when setConnected is called")
@Test
void shouldChangeConnectionStatusWhenSetConnectedIsCalled() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
PlayerQuadruple playerQuadruple = new PlayerQuadruple(node, "nickname", true, virtualView);
@@ -85,11 +85,11 @@ void shouldChangeConnectionStatusWhenSetConnectedIsCalled() {
@DisplayName("Should change node when setNode is called")
@Test
void shouldChangeNodeWhenSetNodeIsCalled() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
PlayerQuadruple playerQuadruple = new PlayerQuadruple(node, "nickname", true, virtualView);
- NodeInterface newNode = new NodeInterfaceStub();
+ ServerNodeInterface newNode = new NodeInterfaceStub();
playerQuadruple.setNode(newNode);
assertEquals(newNode, playerQuadruple.getNode());
}
@@ -97,7 +97,7 @@ void shouldChangeNodeWhenSetNodeIsCalled() {
@DisplayName("Should throw exception when setNode is called with null")
@Test
void shouldThrowExceptionWhenSetNodeIsCalledWithNull() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualViewStub(node);
PlayerQuadruple playerQuadruple = new PlayerQuadruple(node, "nickname", true, virtualView);
diff --git a/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewMockitoTest.java b/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewMockitoTest.java
index 351d4d95..c1dac0f8 100644
--- a/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewMockitoTest.java
+++ b/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewMockitoTest.java
@@ -1,7 +1,7 @@
package it.polimi.ingsw.am32.controller;
import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@@ -15,13 +15,13 @@
class VirtualViewMockitoTest {
- private NodeInterface nodeInterface;
+ private ServerNodeInterface nodeInterface;
private VirtualView virtualView;
private StoCMessage message;
@BeforeEach
void setUp() {
- nodeInterface = mock(NodeInterface.class);
+ nodeInterface = mock(ServerNodeInterface.class);
virtualView = new VirtualView(nodeInterface);
message = mock(StoCMessage.class);
}
diff --git a/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewTest.java b/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewTest.java
index 6f83e193..5be1a36b 100644
--- a/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewTest.java
+++ b/src/test/java/it/polimi/ingsw/am32/controller/VirtualViewTest.java
@@ -3,7 +3,7 @@
import it.polimi.ingsw.am32.client.View;
import it.polimi.ingsw.am32.controller.exceptions.CriticalFailureException;
import it.polimi.ingsw.am32.message.ServerToClient.StoCMessage;
-import it.polimi.ingsw.am32.network.ServerNode.NodeInterface;
+import it.polimi.ingsw.am32.network.ServerNode.ServerNodeInterface;
import it.polimi.ingsw.am32.network.exceptions.UploadFailureException;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -14,8 +14,8 @@
class VirtualViewTest {
- // Stub class for NodeInterface and StoCMessage. Used to test VirtualView.
- private static class NodeInterfaceStub implements NodeInterface {
+ // Stub class for ServerNodeInterface and StoCMessage. Used to test VirtualView.
+ private static class NodeInterfaceStub implements ServerNodeInterface {
private int messageCount;
public void uploadToClient(StoCMessage message) throws UploadFailureException { messageCount++; }
public void pingTimeOverdue() {}
@@ -41,10 +41,10 @@ void shouldThrowExceptionWhenConnectionNodeIsNull() {
@DisplayName("Should change connection node when changeNode is called")
@Test
void shouldChangeConnectionNodeWhenChangeNodeIsCalled() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
- NodeInterface newNode = new NodeInterfaceStub();
+ ServerNodeInterface newNode = new NodeInterfaceStub();
virtualView.changeNode(newNode);
assertEquals(newNode, virtualView.getConnectionNode());
}
@@ -52,7 +52,7 @@ void shouldChangeConnectionNodeWhenChangeNodeIsCalled() {
@DisplayName("Should throw exception when addMessage is called with null")
@Test
void shouldThrowExceptionWhenAddMessageIsCalledWithNull() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
assertThrows(CriticalFailureException.class, () -> virtualView.addMessage(null));
@@ -61,7 +61,7 @@ void shouldThrowExceptionWhenAddMessageIsCalledWithNull() {
@DisplayName("Should add message to queue when addMessage is called")
@Test
void shouldAddMessageToQueueWhenAddMessageIsCalled() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
StoCMessage message = new StoCMessageStub();
@@ -72,7 +72,7 @@ void shouldAddMessageToQueueWhenAddMessageIsCalled() {
@DisplayName("Should remove message from queue when processMessage is called")
@Test
void shouldRemoveMessageFromQueueWhenProcessMessageIsCalled() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
StoCMessage message = new StoCMessageStub();
@@ -84,7 +84,7 @@ void shouldRemoveMessageFromQueueWhenProcessMessageIsCalled() {
@DisplayName("Should clear message queue when flushMessages is called")
@Test
void shouldClearMessageQueueWhenFlushMessagesIsCalled() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
StoCMessage message = new StoCMessageStub();
@@ -96,7 +96,7 @@ void shouldClearMessageQueueWhenFlushMessagesIsCalled() {
@DisplayName("Should handle multiple messages being added concurrently")
@Test
void shouldHandleMultipleMessagesBeingAddedConcurrently() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
StoCMessage message1 = new StoCMessageStub();
StoCMessage message2 = new StoCMessageStub();
@@ -121,7 +121,7 @@ void shouldHandleMultipleMessagesBeingAddedConcurrently() {
@DisplayName("Should handle multiple threads calling flushMessages concurrently")
@Test
void shouldHandleMultipleThreadsCallingFlushMessagesConcurrently() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
StoCMessage message1 = new StoCMessageStub();
StoCMessage message2 = new StoCMessageStub();
@@ -147,10 +147,10 @@ void shouldHandleMultipleThreadsCallingFlushMessagesConcurrently() {
@DisplayName("Should handle multiple threads calling changeNode concurrently")
@Test
void shouldHandleMultipleThreadsCallingChangeNodeConcurrently() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
- NodeInterface newNode1 = new NodeInterfaceStub();
- NodeInterface newNode2 = new NodeInterfaceStub();
+ ServerNodeInterface newNode1 = new NodeInterfaceStub();
+ ServerNodeInterface newNode2 = new NodeInterfaceStub();
// Create two threads that change the connection node
Thread thread1 = new Thread(() -> virtualView.changeNode(newNode1));
Thread thread2 = new Thread(() -> virtualView.changeNode(newNode2));
@@ -164,14 +164,14 @@ void shouldHandleMultipleThreadsCallingChangeNodeConcurrently() {
} catch (InterruptedException e) {
fail();
}
- NodeInterface finalNode = virtualView.getConnectionNode();
+ ServerNodeInterface finalNode = virtualView.getConnectionNode();
assertTrue(finalNode == newNode1 || finalNode == newNode2);
}
@DisplayName("Should process message when submitted to ThreadPoolExecutor")
@Test
void shouldProcessMessageWhenSubmittedToThreadPoolExecutor() {
- NodeInterface node = new NodeInterfaceStub();
+ ServerNodeInterface node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);
StoCMessage message = new StoCMessageStub();
// Create a ThreadPoolExecutor with a single thread: the VirtualView
@@ -201,8 +201,8 @@ void shouldProcessMessageWhenSubmittedToThreadPoolExecutor() {
@DisplayName("Should wait when UploadFailureException is thrown")
@Test
void shouldWaitWhenUploadFailureExceptionIsThrown() {
- // Create a VirtualView with a NodeInterface that throws UploadFailureException
- NodeInterface node = new NodeInterfaceStub() {
+ // Create a VirtualView with a ServerNodeInterface that throws UploadFailureException
+ ServerNodeInterface node = new NodeInterfaceStub() {
@Override
public void uploadToClient(StoCMessage message) throws UploadFailureException {
throw new UploadFailureException();
@@ -232,7 +232,7 @@ public void uploadToClient(StoCMessage message) throws UploadFailureException {
@DisplayName("Should be able to handle multiple messages being added concurrently")
@Test
void shouldBeAbleToHandleMessagesBurst(){
- // Create a VirtualView with a NodeInterface that throws UploadFailureException
+ // Create a VirtualView with a ServerNodeInterface that throws UploadFailureException
NodeInterfaceStub node = new NodeInterfaceStub();
VirtualView virtualView = new VirtualView(node);