diff --git a/.gitignore b/.gitignore
index 5fe5b57..e28257b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
+.classpath
+.project
+.settings/**
*.iml
.idea
**/target
@@ -6,3 +9,5 @@
logs
**/*.log
output/move.txt
+/target/
+**/*.class
diff --git a/pom.xml b/pom.xml
index a1b0466..7e72ac9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,12 @@
jackson-databind
2.2.3
+
+
+ com.google.api-client
+ google-api-client-gson
+ 1.18.0-rc
+
@@ -93,4 +99,4 @@
-
\ No newline at end of file
+
diff --git a/run.sh b/run.sh
old mode 100644
new mode 100755
diff --git a/src/main/java/za/co/entelect/challenge/bot/BasicBot.java b/src/main/java/za/co/entelect/challenge/bot/BasicBot.java
index a2e0151..3004356 100644
--- a/src/main/java/za/co/entelect/challenge/bot/BasicBot.java
+++ b/src/main/java/za/co/entelect/challenge/bot/BasicBot.java
@@ -1,23 +1,19 @@
package za.co.entelect.challenge.bot;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.jayway.jsonpath.JsonPath;
-import com.jayway.jsonpath.PathNotFoundException;
-import net.minidev.json.JSONArray;
import za.co.entelect.challenge.dto.GameState;
-import za.co.entelect.challenge.dto.Missile;
import za.co.entelect.challenge.dto.Player;
import za.co.entelect.challenge.dto.Settings;
-import za.co.entelect.challenge.dto.enums.EntityType;
import za.co.entelect.challenge.dto.enums.ShipCommand;
+import za.co.entelect.challenge.dto.reader.BasicGameStateReader;
+import za.co.entelect.challenge.dto.reader.GameStateReader;
+import za.co.entelect.challenge.dto.reader.GsonGameStateReader;
+import za.co.entelect.challenge.dto.reader.JacksonGameStateReader;
import za.co.entelect.challenge.utils.BotHelper;
import za.co.entelect.challenge.utils.FileHelper;
import za.co.entelect.challenge.utils.LogHelper;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;
@@ -34,12 +30,13 @@ public BasicBot(Settings settings) {
public void execute() {
//Choose how you want to access the JSON
- boolean basicAccess = false;
-
- gameState = basicAccess ? loadBasicState() : loadAdvancedState();
-
- loadAdvancedState();
+ GameStateReader reader =
+ new BasicGameStateReader();
+ //new JacksonGameStateReader();
+ //new GsonGameStateReader();
+ gameState = loadGameState(reader);
+
logMatchState();
StringBuilder map = loadMap();
@@ -49,62 +46,15 @@ public void execute() {
saveMove(move);
}
- /**
- * This method accesses the json elements directly
- * Advantage: Fast and no need initialise everything - only use what you need
- * Disadvantage: Match/Game State model only partially initialised
- *
- * @return match
- */
- private GameState loadBasicState() {
- try {
- GameState gameState = new GameState();
-
- File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile());
-
- loadRoundNumber(jsonFile, gameState);
-
- String player1Path = "$.Players[0]";
- String player2Path = "$.Players[1]";
-
- Player player1 = loadPlayer(jsonFile, player1Path);
- Player player2 = loadPlayer(jsonFile, player2Path);
-
- gameState.getPlayers().add(player1);
- gameState.getPlayers().add(player2);
-
- return gameState;
- } catch (IOException ioe) {
- LogHelper.log("Unable to read state file: " + settings.getStateFile());
- ioe.printStackTrace();
- return null;
- } catch (NumberFormatException nfe) {
- LogHelper.log("Unable to convert Round Number to int: " + settings.getStateFile());
- nfe.printStackTrace();
- return null;
- }
- }
-
- /**
- * This method initialises the entire Game State model using Jackson
- * Advantage: All elements are accessible
- * Disadvantage: slower than method loadBasicState()
- *
- * @return match
- */
- private GameState loadAdvancedState() {
+ private GameState loadGameState(GameStateReader reader) {
GameState gameState = null;
File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile());
- // ObjectMapper provides functionality for data binding between
- // Java Bean Objects/POJO and JSON constructs/string
- ObjectMapper mapper = new ObjectMapper();
-
try {
- gameState = mapper.readValue(jsonFile, GameState.class);
- } catch (IOException ioe) {
- LogHelper.log("Unable to read state file: " + settings.getStateFile());
+ gameState = reader.read(jsonFile);
+ } catch (Exception ioe) {
+ LogHelper.log("Error reading state file: " + settings.getStateFile());
ioe.printStackTrace();
return null;
}
@@ -112,65 +62,6 @@ private GameState loadAdvancedState() {
return gameState;
}
- private void loadRoundNumber(File jsonFile, GameState gameState) throws IOException {
- String roundNumber = "$.RoundNumber";
- gameState.setRoundNumber(Integer.valueOf(JsonPath.read(jsonFile, roundNumber).toString()));
- }
-
- private Player loadPlayer(File jsonFile, String playerPath) throws IOException {
- Player player = new Player();
-
- try {
- LinkedHashMap playerMap = JsonPath.read(jsonFile, playerPath);
-
- player.setPlayerName((String)playerMap.get("PlayerName"));
- player.setPlayerNumber((Integer)playerMap.get("PlayerNumber"));
- player.setPlayerNumberReal((Integer)playerMap.get("PlayerNumberReal"));
- player.setKills((Integer)playerMap.get("Kills"));
- player.setLives((Integer)playerMap.get("Lives"));
- player.setMissileLimit((Integer)playerMap.get("MissileLimit"));
-
- JSONArray missiles = (JSONArray)playerMap.get("Missiles");
-
- player.setMissiles(loadMissiles(missiles));
-
- } catch (PathNotFoundException pnfe) {
- LogHelper.log("Index out of bounds when evaluating path " + playerPath);
- pnfe.printStackTrace();
- }
-
- return player;
- }
-
- private List