diff --git a/core/database.mv.db b/core/database.mv.db index 9dbdffc5c5d72fd1cf5f84151e6d3282d8f5cb4f..6a79fd6fa0459afb5b4d59b08e63d215d31e2170 100644 Binary files a/core/database.mv.db and b/core/database.mv.db differ diff --git a/core/out/production/resources/META-INF/persistence.xml b/core/out/production/resources/META-INF/persistence.xml index 4c58c8089a776ec7cda39e824d734f97cbd5551f..7c239e2dde412c4cbe1a907b6f398321cdd563bb 100644 --- a/core/out/production/resources/META-INF/persistence.xml +++ b/core/out/production/resources/META-INF/persistence.xml @@ -4,8 +4,15 @@ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="database" transaction-type="RESOURCE_LOCAL"> - <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class> <class>com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Ship</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:h2:./database;DB_CLOSE_ON_EXIT=FALSE;" /> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java index b05b700bfa6354463857b213bd26ad77b9749bd1..b015bb86e18e769b4cdfa8c280765fe5a4781f9b 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java @@ -1,12 +1,15 @@ package com.galaxytrucker.galaxytruckerreloaded.Communication; +import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject; import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject; +import lombok.Getter; import lombok.NonNull; import java.io.*; import java.net.Socket; +/** This class handles the client-side networking */ public class Client { /** @@ -34,16 +37,25 @@ public class Client { */ private ObjectInputStream receiveObject; + /** + * The client's ship + */ + @Getter + private Ship myShip; + /** * Send a request to the server + * + * @param requestObject - the request object * @return the server's response + * + * @throws IllegalArgumentException on exception */ public ResponseObject sendAndReceive(RequestObject requestObject) throws IllegalArgumentException { try { sendObject.writeObject(requestObject); return (ResponseObject) receiveObject.readObject(); - } - catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); throw new IllegalArgumentException(e.getMessage()); } @@ -51,19 +63,67 @@ public class Client { /** * Login + * + * @param username - the username of the user to login + * + * @return whether the client is allowed to login or not + * + * @throws IllegalArgumentException on error */ public boolean login(String username) throws IllegalArgumentException { try { + // ==================== LOG-IN ==================== send.println("[LOGIN]:" + username); - return receive.readLine().equals("[ACCEPTED]"); - } catch (Exception e) { + String received = receive.readLine(); + // ==================== EXCEPTION ==================== + if (received.contains("[EXCEPTION]:[LOGIN]")){ + System.out.println("<CLIENT>:[EXCEPTION DURING LOGIN! TERMINATING...]"); + throw new IllegalArgumentException(); + } + // ==================== SUCCESSFUL LOGIN ==================== + else if (received.equals("true")){ + System.out.println("<CLIENT>:[LOGIN SUCCESSFUL]:[USERNAME]:" + username); + received = receive.readLine(); + // ==================== NEW GAME ==================== + if (received.equals("[NEW-GAME]")){ + System.out.println("<CLIENT>:[NEW-GAME]:[USERNAME]:"+username); + // TODO NEW GAME CREATION + + // ======================= + received = receive.readLine(); + } + // ==================== FETCH SHIP ==================== + if (received.equals("[FETCH-SHIP]")){ + System.out.println("<CLIENT>:[FETCH-SHIP]:[USERNAME]:"+username); + try { + this.myShip = (Ship) receiveObject.readObject(); + } + catch (Exception f){ + f.printStackTrace(); + System.out.println("<CLIENT>:[EXCEPTION]:[FETCH-SHIP]:[USERNAME]:"+username); + throw new IllegalArgumentException(); + } + } + return true; + } + // ==================== FAILED LOGIN ==================== + else { + return false; + } + } + catch (Exception e){ e.printStackTrace(); - throw new IllegalArgumentException(e.getMessage()); + throw new IllegalArgumentException(); } } /** * Constructor + * + * @param ipAddress - the ipAddress of the server + * @param port - the server port + * + * @throws IllegalArgumentException on error */ public Client(@NonNull String ipAddress, @NonNull int port) throws IllegalArgumentException { try { @@ -74,7 +134,7 @@ public class Client { receiveObject = new ObjectInputStream(socket.getInputStream()); } catch (Exception e) { e.printStackTrace(); - throw new IllegalArgumentException("Couldn't initialize connection to server"); + throw new IllegalArgumentException("<CLIENT>:[Couldn't initialize connection to server]"); } } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java index 0d38b4595b11733a9c47ea2849454bd2bf65d5c8..e7884b27d98abf87a7cd93fecb8dca78f31bbd8d 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java @@ -3,29 +3,49 @@ package com.galaxytrucker.galaxytruckerreloaded.Communication; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; -import lombok.Getter; -import lombok.Setter; +import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject; +import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject; +import lombok.*; @Setter @Getter +@RequiredArgsConstructor(access = AccessLevel.PUBLIC) public class ClientControllerCommunicator { - /** Client ship */ + /** + * Client ship + */ private Ship clientShip; private Overworld map; private Planet currentPlanet; - /** Issue a new request and receive a response + /** + * Client class + */ + @NonNull + private Client client; + + /** + * Issue a new request and receive a response + * * @param request - the request - * @return the server's response */ - public String sendRequest(String request){ - return null; + * @return the server's response + */ + public ResponseObject sendRequest(RequestObject request) throws IllegalArgumentException { + return client.sendAndReceive(request); } - /** Issue login request + /** + * Issue login request + * * @param username - the username - * @return true if the user already exists else create a enw spaceship */ - public boolean login(String username){ - return false; + * @return true if the user already exists else create a enw spaceship + */ + public boolean login(String username) { + boolean permittedLogin = client.login(username); + if (permittedLogin) { + clientShip = client.getMyShip(); + } + return permittedLogin; } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java index ebde8497d8ba6bc99209fb211cd632bb2e843257..1462415c4b55098d314777cc5fe1c89e49cdebec 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java @@ -1,10 +1,7 @@ package com.galaxytrucker.galaxytruckerreloaded.Model.Map; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; +import lombok.*; import javax.persistence.*; import java.io.Serializable; @@ -17,6 +14,8 @@ import java.util.Map; @NamedQueries({ @NamedQuery(name = "Overworld.getByUsername", query = "select o from Overworld o where o.associatedUser =: name") }) +@Getter +@Setter public class Overworld implements Serializable { /** ID */ @@ -24,21 +23,19 @@ public class Overworld implements Serializable { @Id private int id; + /** Seed */ + @NonNull + private int seed; + /** Username used as ID */ @NonNull private String associatedUser; /** Stores planet and their location on the map */ - @OneToMany + @OneToMany(cascade = CascadeType.ALL) private Map<String,Planet> planetMap; /** The start planet */ - @NonNull - @OneToOne + @OneToOne(cascade = CascadeType.ALL) private Planet startPlanet; - - /** Constructor */ - public Overworld(int seed) { - planetMap = new HashMap<>(); - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java index 4e0a1a2de46f1c82cd03c219eb86e2ee23c1a8e6..9d9ec737506e0da4b069d2a551069e343d3b18c6 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java @@ -5,10 +5,7 @@ import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import lombok.*; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; +import javax.persistence.*; import java.io.Serializable; import java.util.List; @@ -58,4 +55,8 @@ public class Planet implements Serializable { /** Trader */ @OneToOne private Trader trader; + + /** The overWorld this planet belongs to */ + @ManyToOne + private Overworld overworld; } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java index ce267d3b4dde64a83094a4dd026e6c3b150c6649..fce3efc8cc281041e6a3a50cde3d04271ddf2107 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java @@ -5,9 +5,7 @@ import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import lombok.*; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.io.Serializable; @Getter @@ -15,18 +13,20 @@ import java.io.Serializable; @Entity @RequiredArgsConstructor(access = AccessLevel.PUBLIC) @NoArgsConstructor(access = AccessLevel.PUBLIC) -public class Trader extends Planet implements Serializable { +public class Trader implements Serializable { /** ID */ - @Id + @NonNull @Id private int id; - /** Associated user */ + /** Planet the trader is located at */ + @OneToOne (cascade = CascadeType.ALL) + @NonNull private Planet planet; /** Weapons for sale */ @NonNull - @OneToMany + @OneToMany (cascade = CascadeType.ALL) private List<Weapon> weaponStock; /** Rockets for sale */ @@ -38,7 +38,7 @@ public class Trader extends Planet implements Serializable { private int fuelStock; /** Crew for sale */ - @OneToMany + @OneToMany (cascade = CascadeType.ALL) @NonNull private List<Crew> crewStock; diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java index a6c8b61e4c66bd1edc01111dd6d4080a79b4c291..e7d6e5de3184e326885aac874d25a323d9b0bc2c 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java @@ -78,6 +78,7 @@ public class Ship implements Serializable { * The planet the ship is currently at */ @NonNull + @ManyToOne private Planet planet; /** Shields */ @@ -92,12 +93,12 @@ public class Ship implements Serializable { /** This ship's systems */ @NonNull - @ElementCollection + @OneToMany private List<Room> systems; /** Inventory */ @NonNull - @ElementCollection + @OneToMany private List<Weapon> inventory; /** Whether or not the ship is in combat */ diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java index bc0748dcd89b62291c83caafbe22e742e0a56271..8ae8e7812d7d3d2e662be4c1179e80ae6ccc9801 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java @@ -29,6 +29,8 @@ public class User implements Serializable { private Ship userShip; /** Whether or not the user is logged in */ - @NonNull private boolean loggedIn = false; + + /** First game */ + private boolean firstGame = true; } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java index 32c776cb91e787e81d33f34dc5e06c6fe01ff3e5..eb0c7f5ba759ad5f12b8affddb77a87df86630f7 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java @@ -1,5 +1,7 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; +import com.galaxytrucker.galaxytruckerreloaded.Model.User; + import java.io.*; import java.net.Socket; @@ -26,6 +28,15 @@ public class ClientHandler implements Runnable { /** ObjectInputStream for receiving objects */ private ObjectInputStream receiveObject; + /** Username */ + private String username; + + /** Game running */ + private boolean gameActive = true; + + /** User */ + private User user; + /** Constructor * @param clientSocket - the client's socket * @param server - the server */ @@ -37,6 +48,7 @@ public class ClientHandler implements Runnable { receiveObject = new ObjectInputStream(clientSocket.getInputStream()); send = new PrintWriter(clientSocket.getOutputStream(),true); receive = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + serverServiceCommunicator = ServerServiceCommunicator.getInstance(); } catch (Exception e){ e.printStackTrace(); @@ -45,7 +57,55 @@ public class ClientHandler implements Runnable { } /** Run */ + @Override public void run(){ + System.out.println("\n========== HANDLER RUNNING ==========\n"); + // ==================== LOGIN ==================== + try { + this.username = receive.readLine().replace("[LOGIN]:",""); + if (serverServiceCommunicator.isLoggedIn(username)){ + send.println(false); + } + else { + send.println(true); + // ==================== NEW GAME ==================== + try { + this.user = serverServiceCommunicator.getUserService().getUser(username); + if (user.isFirstGame()){ + send.println("[NEW-GAME]"); + // TODO WAIT FOR SHIP TYPE + //========================= + user.setFirstGame(false); + } + // ==================== UPDATE LOGIN ==================== + user.setLoggedIn(true); + serverServiceCommunicator.getUserService().updateUser(user); + // ==================== FETCH SHIP ==================== + try { + send.println("[FETCH-SHIP]"); + sendObject.writeObject(user.getUserShip()); + } + catch (Exception f){ + f.printStackTrace(); + send.println("[EXCEPTION]:[FETCH-SHIP]:[USERNAME]:"+username); + throw new IllegalArgumentException(f.getMessage()); + } + } + catch (Exception e){ + e.printStackTrace(); + send.println("[EXCEPTION]:[NEW-GAME]:[USERNAME]:"+username); + } + + // ==================== RUNNING ==================== + while (gameActive){ + //TODO SEND AND RECEIVE DATA + } + } + } + catch (Exception e){ + e.printStackTrace(); + send.println("[EXCEPTION]:[LOGIN]:[USERNAME]:"+username); + } } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java index 8379a87b60a6b39c27ae7d608cec1cdb3949c3e0..8c340831d8c27216f782a6248f6ae3dc76273df9 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java @@ -1,9 +1,14 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter public class RequestObject { @@ -16,4 +21,18 @@ public class RequestObject { /** Ship */ private Ship ship; + + /** Trader */ + private Trader trader; + + /** Planet */ + private Planet planet; + + /** Crew */ + private Crew crew; + + /** List of crew */ + private List<Crew> moreCrew; + + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java index 8615f415376d09c38d244fd0d47c6b020a5fe848..59033b7bbbf373d463a12d8d1988ca41e5572f11 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java @@ -1,5 +1,5 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; public enum RequestType { - LOGIN + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java index 53554153ed9148388ba6d69b4df3fe53159bd34f..f926efaa66d24242b884f08ff39fd98085eb6deb 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java @@ -39,6 +39,7 @@ public class Server implements Runnable{ System.out.println(f); } Client client = new Client("localhost",5050); + boolean a = client.login("ahmad"); } /** Start server on specified port diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java index 709b20aded5250f06778d8b0a14af1555a1997ec..171b7c28c1489e3a2681c3a08bb1e67fbba5f196 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java @@ -1,12 +1,23 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Model.User; +import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.UserNotFoundException; +import com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService; import lombok.AccessLevel; +import lombok.Getter; import lombok.RequiredArgsConstructor; +/** ServerServiceCommunicator for executing logic using services, singleton */ @RequiredArgsConstructor(access = AccessLevel.PUBLIC) +@Getter public class ServerServiceCommunicator { + /** ServerServiceCommunicator */ + private static ServerServiceCommunicator serverServiceCommunicator = null; + + /** User service */ + private UserService userService = new UserService(); /** Take a request from the client side, pass it through the services * and return a response @@ -25,8 +36,29 @@ public class ServerServiceCommunicator { /** Login * @param username - the user that wants to login * @return if the client is allowed to login */ - public String login(String username){ - return null; + public boolean isLoggedIn(String username) throws IllegalArgumentException { + try { + return userService.getUser(username).isLoggedIn(); + } + catch (Exception e){ + System.out.println("[NEW-USER]:[USERNAME]:"+username); + try { + userService.addUser(username); + return false; + } + catch (Exception f){ + f.printStackTrace(); + throw new IllegalArgumentException(); + } + } + } + + /** Get instance */ + public static ServerServiceCommunicator getInstance(){ + if (serverServiceCommunicator == null){ + serverServiceCommunicator = new ServerServiceCommunicator(); + } + return serverServiceCommunicator; } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java index d925996d21cd9bef296a4d6267f099dfbf27c2db..beb4cad26c2045d98236e900a897955cd745adf7 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java @@ -1,6 +1,5 @@ package com.galaxytrucker.galaxytruckerreloaded.Server.Services; -import com.badlogic.gdx.scenes.scene2d.ui.List; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; @@ -10,6 +9,8 @@ import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.ShipDAO; import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.WeaponDAO; import lombok.*; +import java.util.List; + /** This class handles battle logic on the server side */ @Getter @Setter @@ -47,13 +48,19 @@ public class BattleService { private RewardService rewardService; /** Change the ship which's round it is */ - public void nextRound(){} + public void nextRound(){ + for (Ship s : participants){ + if (!s.getAssociatedUser().equals(currentRound.getAssociatedUser())){ + currentRound = s; + } + } + } /** Validate user input by checking if it's his round to play * @param s - the ship which wants to play * @return true if it is it's round else false */ public boolean validMove(Ship s){ - return false; + return currentRound.getAssociatedUser().equals(s.getAssociatedUser()); } /** Make one ship attack another's section @@ -61,7 +68,10 @@ public class BattleService { * @param opponent - the opponent's ship * @param weapon - the weapon attacking * @param room - the room being attacked */ - public void attack(Ship attacker, Ship opponent, Weapon weapon, Room room){} + public void attack(Ship attacker, Ship opponent, Weapon weapon, Room room){ + if (validMove(attacker)){ + } + } /** Heal a ship * @param ship - the ship to heal diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java index bfa05acd078cc161677fc64736b5a24f38e367aa..85bf355e4ebada1a7f6f8b6fe3ebe18620bd317e 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java @@ -5,12 +5,17 @@ import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.DuplicateUserExc import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.UserNotFoundException; import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.UserDAO; +import javax.persistence.EntityManager; + public class UserService { /** * The userDAO used to store and fetch data */ - private UserDAO userDAO; + private UserDAO userDAO = new UserDAO(); + + /** Entity Manager */ + private EntityManager entityManager = userDAO.entityManager; /** * add a new user to the database @@ -20,6 +25,7 @@ public class UserService { * @throws DuplicateUserException if the user already exists */ public void addUser(String username) throws DuplicateUserException { + userDAO.persist(new User(username)); } /** @@ -30,7 +36,10 @@ public class UserService { * @throws UserNotFoundException if the user couldn't be found */ public User getUser(String username) throws UserNotFoundException { - return null; + entityManager.getTransaction().begin(); + User u = entityManager.find(User.class,username); + entityManager.getTransaction().commit(); + return u; } /** @@ -40,6 +49,7 @@ public class UserService { * @throws UserNotFoundException if the user cannot be found in the database */ public void updateUser(User u) throws UserNotFoundException { + userDAO.update(u); } /** @@ -50,6 +60,9 @@ public class UserService { * @throws UserNotFoundException if the user cannot be found */ public void removeUserByUsername(String username) throws UserNotFoundException { + entityManager.getTransaction().begin(); + entityManager.remove(getUser(username)); + entityManager.getTransaction().commit(); } /** @@ -59,15 +72,4 @@ public class UserService { */ public void saveGame(String username) throws UserNotFoundException { } - - /** - * Login - * - * @param username - the username of the user - * @return true - if the login was successful else return false - * - */ - public boolean login(String username) { - return false; - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java index 4d91f5c23833197c81865562a46bddb020b053b6..943f53ae70714319c137694d68f216dcba233268 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java @@ -12,6 +12,7 @@ import javax.persistence.EntityManager; import javax.xml.crypto.Data; import java.util.UUID; +/** Test the crew database access object */ public class CrewDAOTest { diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/OverworldDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/OverworldDAOTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f0688aa00bc5f830b3ee2a5907a4027af4bf59d6 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/OverworldDAOTest.java @@ -0,0 +1,54 @@ +package com.galaxytrucker.galaxytruckerreloaded.Test.Server.Persistence; + +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; +import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database; +import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.OverworldDAO; +import org.junit.Assert; +import org.junit.Test; + +import javax.persistence.EntityManager; +import java.util.UUID; + +/** Test the overworld database access object */ +public class OverworldDAOTest { + + /** EntityManager */ + private EntityManager entityManager = Database.getEntityManager(); + + /** OverworldDAO */ + private OverworldDAO overworldDAO = new OverworldDAO(); + + /** Test adding a new overworld to the database */ + @Test + public void testPersist() { + try { + Overworld overworld = new Overworld(UUID.randomUUID().hashCode(), UUID.randomUUID().hashCode(), "test"); + overworldDAO.persist(overworld); + entityManager.getTransaction().begin(); + Overworld o2 = entityManager.find(Overworld.class,overworld.getId()); + entityManager.getTransaction().commit(); + Assert.assertEquals(overworld.getSeed(),o2.getSeed()); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); + } + } + + /** Test removing an existing overworld from the database */ + @Test + public void testRemove(){ + try { + Overworld overworld = new Overworld(UUID.randomUUID().hashCode(),UUID.randomUUID().hashCode(),"test"); + overworldDAO.persist(overworld); + overworldDAO.remove(overworld); + entityManager.getTransaction().begin(); + Assert.assertNull(entityManager.find(Overworld.class,overworld.getId())); + entityManager.getTransaction().commit(); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/PlanetDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/PlanetDAOTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bd51e4fbc536e1900de873429a2a8b8f91633209 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/PlanetDAOTest.java @@ -0,0 +1,73 @@ +package com.galaxytrucker.galaxytruckerreloaded.Test.Server.Persistence; + +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent; +import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database; +import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.PlanetDAO; +import org.junit.Assert; +import org.junit.Test; + +import javax.persistence.EntityManager; +import java.util.ArrayList; + +/** Test the planet database access object */ +public class PlanetDAOTest { + + /** Entity manager */ + private EntityManager entityManager = Database.getEntityManager(); + + /** Planet DAO */ + private PlanetDAO planetDAO = new PlanetDAO(); + + /** Test adding a new planet to the database */ + @Test + public void testPersist(){ + Planet planet = new Planet(TraderDAOTest.planetNameGenerator(),0,0, PlanetEvent.VOID,new ArrayList<Ship>()); + try { + planetDAO.persist(planet); + entityManager.getTransaction().begin(); + Assert.assertEquals(planet.getName(),entityManager.find(Planet.class,planet.getName()).getName()); + entityManager.getTransaction().commit(); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); + } + } + + /** Test editing a planet in the database */ + @Test + public void testEdit(){ + Planet planet = new Planet(TraderDAOTest.planetNameGenerator(),0,0, PlanetEvent.VOID,new ArrayList<Ship>()); + try { + planetDAO.persist(planet); + planet.setEvent(PlanetEvent.SHOP); + planetDAO.update(planet); + entityManager.getTransaction().begin(); + Assert.assertEquals(PlanetEvent.SHOP,entityManager.find(Planet.class,planet.getName()).getEvent()); + entityManager.getTransaction().commit(); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); + } + } + + /** Test removing a planet from the database */ + @Test + public void testRemove(){ + Planet planet = new Planet(TraderDAOTest.planetNameGenerator(),0,0, PlanetEvent.VOID,new ArrayList<Ship>()); + try { + planetDAO.persist(planet); + planetDAO.remove(planet); + entityManager.getTransaction().begin(); + Assert.assertNull(entityManager.find(Planet.class,planet.getName())); + entityManager.getTransaction().commit(); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java new file mode 100644 index 0000000000000000000000000000000000000000..72f50bfc18a41933eea6bf8138668b58fa13d03f --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java @@ -0,0 +1,111 @@ +package com.galaxytrucker.galaxytruckerreloaded.Test.Server.Persistence; + +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; +import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; +import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database; +import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.TraderDAO; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import javax.persistence.EntityManager; +import java.util.ArrayList; +import java.util.Random; +import java.util.UUID; + +/** + * Test the trader database access object + */ +public class TraderDAOTest { + + /** + * EntityManager + */ + private EntityManager entityManager = Database.getEntityManager(); + + /** + * Trader DAO + */ + private TraderDAO traderDAO = new TraderDAO(); + + /** + * Test adding a new trader to the database + */ + @Test + public void testPersist() { + Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(planetNameGenerator(), 10, 10, + PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>()); + try { + traderDAO.persist(trader); + entityManager.getTransaction().begin(); + Trader trader1 = entityManager.find(Trader.class, trader.getId()); + entityManager.getTransaction().commit(); + Assert.assertEquals(trader1.getId(), trader.getId()); + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalArgumentException(); + } + } + + /** + * Test editing an existing trader in the database + */ + @Test + public void testEdit() { + Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(planetNameGenerator(), 10, 10, + PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>()); + try { + traderDAO.persist(trader); + entityManager.getTransaction().begin(); + Trader trader1 = entityManager.find(Trader.class, trader.getId()); + trader1.setFuelStock(10); + traderDAO.update(trader1); + entityManager.getTransaction().commit(); + Assert.assertEquals(trader1.getFuelStock(), 10); + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalArgumentException(); + } + } + + /** + * Test removing an existing trader from the database + */ + @Test + public void testRemove() { + Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(planetNameGenerator(), 10, 10, + PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>()); + try { + traderDAO.persist(trader); + traderDAO.remove(trader); + entityManager.getTransaction().begin(); + Trader trader1 = entityManager.find(Trader.class,trader.getId()); + entityManager.getTransaction().commit(); + Assert.assertNull(trader1); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(); + } + } + + + /** Random planet name generator + * @return a random planet name */ + public static String planetNameGenerator(){ + Random random = new Random(); + String alphabet = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; + alphabet = alphabet.replace(',',' '); + StringBuilder builder = new StringBuilder(); + for (int i=0;i<100;i++){ + builder.append(alphabet.toCharArray()[random.nextInt(alphabet.length())]); + } + return builder.toString(); + } + +} diff --git a/core/src/main/resources/META-INF/persistence.xml b/core/src/main/resources/META-INF/persistence.xml index 4c58c8089a776ec7cda39e824d734f97cbd5551f..7c239e2dde412c4cbe1a907b6f398321cdd563bb 100644 --- a/core/src/main/resources/META-INF/persistence.xml +++ b/core/src/main/resources/META-INF/persistence.xml @@ -4,8 +4,15 @@ version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="database" transaction-type="RESOURCE_LOCAL"> - <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class> <class>com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.Ship</class> + <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:h2:./database;DB_CLOSE_ON_EXIT=FALSE;" /> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> diff --git a/database.mv.db b/database.mv.db new file mode 100644 index 0000000000000000000000000000000000000000..503530ed591b0a4d036233340864f4b4e79db998 Binary files /dev/null and b/database.mv.db differ diff --git a/exceptions.md b/exceptions.md new file mode 100644 index 0000000000000000000000000000000000000000..553715e01d34de7acdd31abf3c9829942f30525f --- /dev/null +++ b/exceptions.md @@ -0,0 +1,13 @@ +# Exceptions and Solutions + +## Persistence: + +### Exception: java.lang.ClassCastException +* stack trace: class org.hibernate.mapping.SingleTableSubclass cannot be cast to class org.hibernate.mapping.RootClass +* Possible Solution: Remove @Id Tags from Subclasses. + +### Exception: Unmapped class +* Solution: Add class to persistence mapping in META-INF/persistence.xml + +### Exception: Primary key violation +* Solution: an entity with this key already exists you idiot, change it!