Skip to content

Commit 10a12bf

Browse files
committed
Merge pull request #4 from bhaeussermann/master
Added Gson as Json-parser option.
2 parents 17814f9 + 55c4b37 commit 10a12bf

15 files changed

+254
-130
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
.classpath
2+
.project
3+
.settings/**
14
*.iml
25
.idea
36
**/target
@@ -6,3 +9,5 @@
69
logs
710
**/*.log
811
output/move.txt
12+
/target/
13+
**/*.class

pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@
5252
<artifactId>jackson-databind</artifactId>
5353
<version>2.2.3</version>
5454
</dependency>
55+
56+
<dependency>
57+
<groupId>com.google.api-client</groupId>
58+
<artifactId>google-api-client-gson</artifactId>
59+
<version>1.18.0-rc</version>
60+
</dependency>
5561
</dependencies>
5662

5763
<build>
@@ -93,4 +99,4 @@
9399
</resource>
94100
</resources>
95101
</build>
96-
</project>
102+
</project>

run.sh

100644100755
File mode changed.
Lines changed: 14 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
package za.co.entelect.challenge.bot;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
4-
import com.jayway.jsonpath.JsonPath;
5-
import com.jayway.jsonpath.PathNotFoundException;
6-
import net.minidev.json.JSONArray;
73
import za.co.entelect.challenge.dto.GameState;
8-
import za.co.entelect.challenge.dto.Missile;
94
import za.co.entelect.challenge.dto.Player;
105
import za.co.entelect.challenge.dto.Settings;
11-
import za.co.entelect.challenge.dto.enums.EntityType;
126
import za.co.entelect.challenge.dto.enums.ShipCommand;
7+
import za.co.entelect.challenge.dto.reader.BasicGameStateReader;
8+
import za.co.entelect.challenge.dto.reader.GameStateReader;
9+
import za.co.entelect.challenge.dto.reader.GsonGameStateReader;
10+
import za.co.entelect.challenge.dto.reader.JacksonGameStateReader;
1311
import za.co.entelect.challenge.utils.BotHelper;
1412
import za.co.entelect.challenge.utils.FileHelper;
1513
import za.co.entelect.challenge.utils.LogHelper;
1614

1715
import java.io.File;
1816
import java.io.IOException;
19-
import java.util.ArrayList;
20-
import java.util.LinkedHashMap;
2117
import java.util.List;
2218
import java.util.Random;
2319

@@ -34,12 +30,13 @@ public BasicBot(Settings settings) {
3430
public void execute() {
3531

3632
//Choose how you want to access the JSON
37-
boolean basicAccess = false;
38-
39-
gameState = basicAccess ? loadBasicState() : loadAdvancedState();
40-
41-
loadAdvancedState();
33+
GameStateReader reader =
34+
new BasicGameStateReader();
35+
//new JacksonGameStateReader();
36+
//new GsonGameStateReader();
4237

38+
gameState = loadGameState(reader);
39+
4340
logMatchState();
4441

4542
StringBuilder map = loadMap();
@@ -49,128 +46,22 @@ public void execute() {
4946
saveMove(move);
5047
}
5148

52-
/**
53-
* This method accesses the json elements directly
54-
* Advantage: Fast and no need initialise everything - only use what you need
55-
* Disadvantage: Match/Game State model only partially initialised
56-
*
57-
* @return match
58-
*/
59-
private GameState loadBasicState() {
60-
try {
61-
GameState gameState = new GameState();
62-
63-
File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile());
64-
65-
loadRoundNumber(jsonFile, gameState);
66-
67-
String player1Path = "$.Players[0]";
68-
String player2Path = "$.Players[1]";
69-
70-
Player player1 = loadPlayer(jsonFile, player1Path);
71-
Player player2 = loadPlayer(jsonFile, player2Path);
72-
73-
gameState.getPlayers().add(player1);
74-
gameState.getPlayers().add(player2);
75-
76-
return gameState;
77-
} catch (IOException ioe) {
78-
LogHelper.log("Unable to read state file: " + settings.getStateFile());
79-
ioe.printStackTrace();
80-
return null;
81-
} catch (NumberFormatException nfe) {
82-
LogHelper.log("Unable to convert Round Number to int: " + settings.getStateFile());
83-
nfe.printStackTrace();
84-
return null;
85-
}
86-
}
87-
88-
/**
89-
* This method initialises the entire Game State model using Jackson
90-
* Advantage: All elements are accessible
91-
* Disadvantage: slower than method loadBasicState()
92-
*
93-
* @return match
94-
*/
95-
private GameState loadAdvancedState() {
49+
private GameState loadGameState(GameStateReader reader) {
9650
GameState gameState = null;
9751

9852
File jsonFile = FileHelper.getFile(settings.getDefaultOutputFolder(), settings.getStateFile());
9953

100-
// ObjectMapper provides functionality for data binding between
101-
// Java Bean Objects/POJO and JSON constructs/string
102-
ObjectMapper mapper = new ObjectMapper();
103-
10454
try {
105-
gameState = mapper.readValue(jsonFile, GameState.class);
106-
} catch (IOException ioe) {
107-
LogHelper.log("Unable to read state file: " + settings.getStateFile());
55+
gameState = reader.read(jsonFile);
56+
} catch (Exception ioe) {
57+
LogHelper.log("Error reading state file: " + settings.getStateFile());
10858
ioe.printStackTrace();
10959
return null;
11060
}
11161

11262
return gameState;
11363
}
11464

115-
private void loadRoundNumber(File jsonFile, GameState gameState) throws IOException {
116-
String roundNumber = "$.RoundNumber";
117-
gameState.setRoundNumber(Integer.valueOf(JsonPath.read(jsonFile, roundNumber).toString()));
118-
}
119-
120-
private Player loadPlayer(File jsonFile, String playerPath) throws IOException {
121-
Player player = new Player();
122-
123-
try {
124-
LinkedHashMap<String, Object> playerMap = JsonPath.read(jsonFile, playerPath);
125-
126-
player.setPlayerName((String)playerMap.get("PlayerName"));
127-
player.setPlayerNumber((Integer)playerMap.get("PlayerNumber"));
128-
player.setPlayerNumberReal((Integer)playerMap.get("PlayerNumberReal"));
129-
player.setKills((Integer)playerMap.get("Kills"));
130-
player.setLives((Integer)playerMap.get("Lives"));
131-
player.setMissileLimit((Integer)playerMap.get("MissileLimit"));
132-
133-
JSONArray missiles = (JSONArray)playerMap.get("Missiles");
134-
135-
player.setMissiles(loadMissiles(missiles));
136-
137-
} catch (PathNotFoundException pnfe) {
138-
LogHelper.log("Index out of bounds when evaluating path " + playerPath);
139-
pnfe.printStackTrace();
140-
}
141-
142-
return player;
143-
}
144-
145-
private List<Object> loadMissiles(JSONArray missiles) {
146-
List<Object> playerMissiles = new ArrayList<>();
147-
Missile playerMissile;
148-
149-
for (Object missile : missiles) {
150-
playerMissile = new Missile();
151-
152-
LinkedHashMap<String, Object> playerMissilesMap = (LinkedHashMap<String, Object>) missile;
153-
154-
playerMissile.setAlive((Boolean)playerMissilesMap.get("Alive"));
155-
playerMissile.setX((Integer)playerMissilesMap.get("x"));
156-
playerMissile.setY((Integer)playerMissilesMap.get("y"));
157-
playerMissile.setWidth((Integer)playerMissilesMap.get("Width"));
158-
playerMissile.setHeight((Integer)playerMissilesMap.get("Height"));
159-
for (EntityType type : EntityType.values()) {
160-
if (((String)playerMissilesMap.get("Type")).equalsIgnoreCase(type.toString())) {
161-
playerMissile.setType(type);
162-
break;
163-
}
164-
}
165-
playerMissile.setPlayerNumber((Integer)playerMissilesMap.get("PlayerNumber"));
166-
playerMissile.setActionRate((Integer)playerMissilesMap.get("ActionRate"));
167-
168-
playerMissiles.add(playerMissile);
169-
}
170-
171-
return playerMissiles;
172-
}
173-
17465
private void logMatchState() {
17566
LogHelper.log(LogHelper.PREFIX + "Game state:");
17667
LogHelper.log("\tRound: " + gameState.getRoundNumber());
@@ -221,6 +112,4 @@ private void saveMove(String move) {
221112
ioe.printStackTrace();
222113
}
223114
}
224-
225-
226115
}

src/main/java/za/co/entelect/challenge/dto/AlienManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package za.co.entelect.challenge.dto;
22

33
import com.fasterxml.jackson.annotation.*;
4+
import com.google.gson.annotations.SerializedName;
5+
46
import javax.annotation.Generated;
7+
58
import java.util.ArrayList;
69
import java.util.HashMap;
710
import java.util.List;
@@ -20,16 +23,22 @@
2023
public class AlienManager {
2124

2225
@JsonProperty("PlayerNumber")
26+
@SerializedName("PlayerNumber")
2327
private Integer playerNumber;
2428
@JsonProperty("Disabled")
29+
@SerializedName("Disabled")
2530
private Boolean disabled;
2631
@JsonProperty("Waves")
32+
@SerializedName("Waves")
2733
private List<List<Wave>> waves = new ArrayList<List<Wave>>();
2834
@JsonProperty("ShotEnergyCost")
35+
@SerializedName("ShotEnergyCost")
2936
private Integer shotEnergyCost;
3037
@JsonProperty("ShotEnergy")
38+
@SerializedName("ShotEnergy")
3139
private Integer shotEnergy;
3240
@JsonProperty("DeltaX")
41+
@SerializedName("DeltaX")
3342
private Integer deltaX;
3443
@JsonIgnore
3544
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

src/main/java/za/co/entelect/challenge/dto/BuildingsAvailable.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package za.co.entelect.challenge.dto;
22

33
import com.fasterxml.jackson.annotation.*;
4+
import com.google.gson.annotations.SerializedName;
45

56
import javax.annotation.Generated;
7+
68
import java.util.HashMap;
79

810
@JsonInclude(JsonInclude.Include.NON_NULL)
@@ -15,10 +17,13 @@
1517
public class BuildingsAvailable {
1618

1719
@JsonProperty("Command")
20+
@SerializedName("Command")
1821
private String command;
1922
@JsonProperty("Type")
23+
@SerializedName("Type")
2024
private String type;
2125
@JsonProperty("Cost")
26+
@SerializedName("Cost")
2227
private Integer cost;
2328
@JsonIgnore
2429
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();

src/main/java/za/co/entelect/challenge/dto/GameState.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package za.co.entelect.challenge.dto;
22

33
import com.fasterxml.jackson.annotation.*;
4+
import com.google.gson.annotations.SerializedName;
5+
46
import javax.annotation.Generated;
7+
58
import java.util.ArrayList;
69
import java.util.HashMap;
710
import java.util.List;
@@ -18,14 +21,19 @@
1821
public class GameState {
1922

2023
@JsonProperty("BuildingsAvailable")
24+
@SerializedName("BuildingsAvailable")
2125
private List<BuildingsAvailable> buildingsAvailable = new ArrayList<BuildingsAvailable>();
2226
@JsonProperty("Map")
27+
@SerializedName("Map")
2328
private Map map;
2429
@JsonProperty("Players")
30+
@SerializedName("Players")
2531
private List<Player> players = new ArrayList<Player>();
2632
@JsonProperty("RoundNumber")
33+
@SerializedName("RoundNumber")
2734
private Integer roundNumber;
2835
@JsonProperty("RoundLimit")
36+
@SerializedName("RoundLimit")
2937
private Integer roundLimit;
3038
@JsonIgnore
3139
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();

src/main/java/za/co/entelect/challenge/dto/Map.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package za.co.entelect.challenge.dto;
22

33
import com.fasterxml.jackson.annotation.*;
4+
import com.google.gson.annotations.SerializedName;
45

56
import javax.annotation.Generated;
7+
68
import java.util.ArrayList;
79
import java.util.HashMap;
810
import java.util.List;
@@ -17,10 +19,13 @@
1719
public class Map {
1820

1921
@JsonProperty("Width")
22+
@SerializedName("Width")
2023
private Integer width;
2124
@JsonProperty("Height")
25+
@SerializedName("Height")
2226
private Integer height;
2327
@JsonProperty("Rows")
28+
@SerializedName("Rows")
2429
private List<List<Row>> rows = new ArrayList<List<Row>>();
2530
@JsonIgnore
2631
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();

src/main/java/za/co/entelect/challenge/dto/Player.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package za.co.entelect.challenge.dto;
22

33
import com.fasterxml.jackson.annotation.*;
4+
import com.google.gson.annotations.SerializedName;
45

56
import javax.annotation.Generated;
7+
68
import java.util.ArrayList;
79
import java.util.HashMap;
810
import java.util.List;
@@ -27,30 +29,43 @@
2729
public class Player {
2830

2931
@JsonProperty("PlayerNumberReal")
32+
@SerializedName("PlayerNumberReal")
3033
private Integer playerNumberReal;
3134
@JsonProperty("PlayerNumber")
35+
@SerializedName("PlayerNumber")
3236
private Integer playerNumber;
3337
@JsonProperty("PlayerName")
38+
@SerializedName("PlayerName")
3439
private String playerName;
3540
@JsonProperty("Ship")
41+
@SerializedName("Ship")
3642
private Object ship;
3743
@JsonProperty("Kills")
44+
@SerializedName("Kills")
3845
private Integer kills;
3946
@JsonProperty("Lives")
47+
@SerializedName("Lives")
4048
private Integer lives;
4149
@JsonProperty("RespawnTimer")
50+
@SerializedName("RespawnTimer")
4251
private Integer respawnTimer;
4352
@JsonProperty("Missiles")
53+
@SerializedName("Missiles")
4454
private List<Object> missiles = new ArrayList<Object>();
4555
@JsonProperty("MissileLimit")
56+
@SerializedName("MissileLimit")
4657
private Integer missileLimit;
4758
@JsonProperty("AlienWaveSize")
59+
@SerializedName("AlienWaveSize")
4860
private Integer alienWaveSize;
4961
@JsonProperty("AlienFactory")
62+
@SerializedName("AlienFactory")
5063
private Object alienFactory;
5164
@JsonProperty("MissileController")
65+
@SerializedName("MissileController")
5266
private Object missileController;
5367
@JsonProperty("AlienManager")
68+
@SerializedName("AlienManager")
5469
private za.co.entelect.challenge.dto.AlienManager alienManager;
5570
@JsonIgnore
5671
private java.util.Map<String, Object> additionalProperties = new HashMap<String, Object>();

0 commit comments

Comments
 (0)