From 23f34f1182628258a0e1bbf7165c46be486271c6 Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris@kearneymail.com>
Date: Sun, 7 May 2017 09:56:36 -0700
Subject: [PATCH] upgrade to mapdb3

---
 pom.xml                                       |  7 +----
 .../java/com/comandante/creeper/Main.java     |  7 +++--
 .../creeper/entity/EntityManager.java         | 28 ++++++++++++-------
 .../creeper/items/EffectSerializer.java       | 10 +++++--
 .../creeper/items/ItemSerializer.java         |  9 ++++--
 .../player/PlayerManagementManager.java       |  7 +++--
 .../creeper/player/PlayerManager.java         | 18 ++++--------
 .../player/PlayerMetadataSerializer.java      | 10 +++++--
 .../creeper/player/PlayerManagerTest.java     |  2 +-
 .../combat_simuation/NpcTestHarness.java      |  3 +-
 10 files changed, 57 insertions(+), 44 deletions(-)

diff --git a/pom.xml b/pom.xml
index 9e057403..2593a7ca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,7 +53,7 @@
         <dependency>
             <groupId>org.mapdb</groupId>
             <artifactId>mapdb</artifactId>
-            <version>1.0.9</version>
+            <version>3.0.4</version>
         </dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
@@ -75,11 +75,6 @@
             <artifactId>metrics-graphite</artifactId>
             <version>3.1.2</version>
         </dependency>
-        <dependency>
-            <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
-            <artifactId>concurrentlinkedhashmap-lru</artifactId>
-            <version>1.4</version>
-        </dependency>
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java
index 62746b7d..fffcae93 100644
--- a/src/main/java/com/comandante/creeper/Main.java
+++ b/src/main/java/com/comandante/creeper/Main.java
@@ -15,6 +15,7 @@ import com.comandante.creeper.player.PlayerManagementManager;
 import com.comandante.creeper.player.PlayerManager;
 import com.comandante.creeper.server.player_communication.ChannelUtils;
 import com.comandante.creeper.server.telnet.CreeperServer;
+import com.comandante.creeper.storage.MapDbAutoCommitService;
 import com.comandante.creeper.storage.WorldStorage;
 import com.comandante.creeper.world.MapsManager;
 import com.comandante.creeper.world.RoomManager;
@@ -81,11 +82,13 @@ public class Main {
 
         Files.isDirectory().apply(new File("world/"));
 
-        DB db = DBMaker.newFileDB(new File("world/" + creeperConfiguration.databaseFileName))
+        DB db = DBMaker.fileDB(new File("world/" + creeperConfiguration.databaseFileName))
+                .transactionEnable()
                 .closeOnJvmShutdown()
                 .make();
 
-        Gson gson = new GsonBuilder().create();
+        MapDbAutoCommitService mapDbAutoCommitService = new MapDbAutoCommitService(db);
+        mapDbAutoCommitService.startAsync();
 
         PlayerManager playerManager = new PlayerManager(db, new SessionManager());
         playerManager.createAllGauges();
diff --git a/src/main/java/com/comandante/creeper/entity/EntityManager.java b/src/main/java/com/comandante/creeper/entity/EntityManager.java
index dece67f9..2778b8a1 100644
--- a/src/main/java/com/comandante/creeper/entity/EntityManager.java
+++ b/src/main/java/com/comandante/creeper/entity/EntityManager.java
@@ -15,6 +15,7 @@ import com.google.gson.Gson;
 import org.apache.log4j.Logger;
 import org.mapdb.DB;
 import org.mapdb.HTreeMap;
+import org.mapdb.Serializer;
 
 import java.util.Iterator;
 import java.util.Map;
@@ -35,18 +36,21 @@ public class EntityManager {
     private final RoomManager roomManager;
     private final PlayerManager playerManager;
 
+    private final static String ITEM_MAP = "itemMap";
+    private final static String EFFECTS_MAP = "effectsMap";
+
     public EntityManager(RoomManager roomManager, PlayerManager playerManager, DB db) {
         this.roomManager = roomManager;
-        if (db.exists("itemMap")) {
-            this.items = db.get("itemMap");
-        } else {
-            this.items = db.createHashMap("itemMap").valueSerializer(new ItemSerializer()).make();
-        }
-        if (db.exists("effectsMap")) {
-            this.effects = db.get("effectsMap");
-        } else {
-            this.effects = db.createHashMap("effectsMap").valueSerializer(new EffectSerializer()).make();
-        }
+        this.items = db.hashMap(ITEM_MAP)
+                .keySerializer(Serializer.STRING)
+                .valueSerializer(new ItemSerializer())
+                .createOrOpen();
+
+        this.effects = db.hashMap(EFFECTS_MAP)
+                .keySerializer(Serializer.STRING)
+                .valueSerializer(new EffectSerializer())
+                .createOrOpen();
+
         this.playerManager = playerManager;
         ExecutorService tickOrchestratorService = Executors.newFixedThreadPool(5);
         tickOrchestratorService.submit(new PlayerTicker());
@@ -123,6 +127,7 @@ public class EntityManager {
 
     class PlayerTicker implements Runnable {
         private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "player_tick_time"));
+
         @Override
         public void run() {
             while (true) {
@@ -145,6 +150,7 @@ public class EntityManager {
 
     class RoomTicker implements Runnable {
         private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "room_tick_time"));
+
         @Override
         public void run() {
             while (true) {
@@ -167,6 +173,7 @@ public class EntityManager {
 
     class NpcTicker implements Runnable {
         private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "npc_tick_time"));
+
         @Override
         public void run() {
             while (true) {
@@ -187,6 +194,7 @@ public class EntityManager {
 
     class EntityTicker implements Runnable {
         private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "entity_tick_time"));
+
         @Override
         public void run() {
             while (true) {
diff --git a/src/main/java/com/comandante/creeper/items/EffectSerializer.java b/src/main/java/com/comandante/creeper/items/EffectSerializer.java
index b4ce934c..538141d2 100644
--- a/src/main/java/com/comandante/creeper/items/EffectSerializer.java
+++ b/src/main/java/com/comandante/creeper/items/EffectSerializer.java
@@ -2,6 +2,9 @@ package com.comandante.creeper.items;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import org.jetbrains.annotations.NotNull;
+import org.mapdb.DataInput2;
+import org.mapdb.DataOutput2;
 import org.mapdb.Serializer;
 
 import java.io.DataInput;
@@ -14,13 +17,14 @@ public class EffectSerializer implements Serializer<Effect>, Serializable {
     private final static Gson GSON = new GsonBuilder().create();
 
     @Override
-    public void serialize(DataOutput out, Effect value) throws IOException {
+    public void serialize(@NotNull DataOutput2 out, @NotNull Effect value) throws IOException {
         out.writeUTF(GSON.toJson(value, Effect.class));
+
     }
 
     @Override
-    public Effect deserialize(DataInput in, int available) throws IOException {
-        return GSON.fromJson(in.readUTF(), Effect.class);
+    public Effect deserialize(@NotNull DataInput2 input, int available) throws IOException {
+        return GSON.fromJson(input.readUTF(), Effect.class);
     }
 
     @Override
diff --git a/src/main/java/com/comandante/creeper/items/ItemSerializer.java b/src/main/java/com/comandante/creeper/items/ItemSerializer.java
index 7b911ff0..2d6a1851 100644
--- a/src/main/java/com/comandante/creeper/items/ItemSerializer.java
+++ b/src/main/java/com/comandante/creeper/items/ItemSerializer.java
@@ -2,6 +2,9 @@ package com.comandante.creeper.items;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import org.jetbrains.annotations.NotNull;
+import org.mapdb.DataInput2;
+import org.mapdb.DataOutput2;
 import org.mapdb.Serializer;
 
 import java.io.DataInput;
@@ -14,13 +17,13 @@ public class ItemSerializer implements Serializer<Item>, Serializable {
     private final static Gson GSON = new GsonBuilder().create();
 
     @Override
-    public void serialize(DataOutput out, Item value) throws IOException {
+    public void serialize(@NotNull DataOutput2 out, @NotNull Item value) throws IOException {
         out.writeUTF(GSON.toJson(value, Item.class));
     }
 
     @Override
-    public Item deserialize(DataInput in, int available) throws IOException {
-        return GSON.fromJson(in.readUTF(), Item.class);
+    public Item deserialize(@NotNull DataInput2 input, int available) throws IOException {
+        return GSON.fromJson(input.readUTF(), Item.class);
     }
 
     @Override
diff --git a/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java b/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java
index 33ea2f8d..724633ab 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java
@@ -6,6 +6,7 @@ import org.apache.log4j.Logger;
 import javax.management.*;
 import java.lang.management.ManagementFactory;
 import java.util.Map;
+import java.util.Set;
 
 public class PlayerManagementManager {
 
@@ -18,13 +19,15 @@ public class PlayerManagementManager {
     }
 
     public void createAndRegisterAllPlayerManagementMBeans() throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException {
-        for (Map.Entry<String, PlayerMetadata> entry : gameManager.getPlayerManager().getPlayerMetadataStore().entrySet()) {
+        Set<Map.Entry<String, PlayerMetadata>> entrySet = gameManager.getPlayerManager().getPlayerMetadataStore().entrySet();
+        for (Map.Entry<String, PlayerMetadata> entry : entrySet) {
             registerPlayer(entry.getValue().getPlayerName(), entry.getValue().getPlayerId(), gameManager);
         }
     }
 
     public void processPlayersMarkedForDeletion(){
-        for (Map.Entry<String, PlayerMetadata> entry : gameManager.getPlayerManager().getPlayerMetadataStore().entrySet()) {
+        Set<Map.Entry<String, PlayerMetadata>> entrySet = gameManager.getPlayerManager().getPlayerMetadataStore().entrySet();
+        for (Map.Entry<String, PlayerMetadata> entry : entrySet) {
             String playerId = entry.getKey();
             PlayerMetadata playerMetadata = entry.getValue();
             if (playerMetadata.isMarkedForDelete()) {
diff --git a/src/main/java/com/comandante/creeper/player/PlayerManager.java b/src/main/java/com/comandante/creeper/player/PlayerManager.java
index c00297e9..e7cc5653 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerManager.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerManager.java
@@ -10,6 +10,7 @@ import com.google.gson.Gson;
 import org.apache.commons.codec.binary.Base64;
 import org.mapdb.DB;
 import org.mapdb.HTreeMap;
+import org.mapdb.Serializer;
 
 import java.util.Iterator;
 import java.util.Map;
@@ -20,24 +21,17 @@ import java.util.concurrent.ConcurrentHashMap;
 import static com.codahale.metrics.MetricRegistry.name;
 
 public class PlayerManager {
-
-    private final DB db;
     private final SessionManager sessionManager;
     private ConcurrentHashMap<String, Player> players = new ConcurrentHashMap<String, Player>();
     private HTreeMap<String, PlayerMetadata> playerMetadataStore;
 
+    private final static String PLAYER_METADATA_MAP = "playerMetadata";
+
     public PlayerManager(DB db, SessionManager sessionManager) {
-        this.db = db;
-        if (db.exists("playerMetadata")) {
-            this.playerMetadataStore = db.get("playerMetadata");
-        } else {
-            this.playerMetadataStore = db
-                    .createHashMap("playerMetadata")
+        this.playerMetadataStore = db.hashMap(PLAYER_METADATA_MAP)
+                    .keySerializer(Serializer.STRING)
                     .valueSerializer(new PlayerMetadataSerializer())
-                    .make();
-        }
-        MapDbAutoCommitService mapDbAutoCommitService = new MapDbAutoCommitService(db);
-        mapDbAutoCommitService.startAsync();
+                    .createOrOpen();
         this.sessionManager = sessionManager;
     }
 
diff --git a/src/main/java/com/comandante/creeper/player/PlayerMetadataSerializer.java b/src/main/java/com/comandante/creeper/player/PlayerMetadataSerializer.java
index fdc2f58f..c236d3cd 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerMetadataSerializer.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerMetadataSerializer.java
@@ -2,6 +2,9 @@ package com.comandante.creeper.player;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import org.jetbrains.annotations.NotNull;
+import org.mapdb.DataInput2;
+import org.mapdb.DataOutput2;
 import org.mapdb.Serializer;
 
 import java.io.DataInput;
@@ -14,13 +17,14 @@ public class PlayerMetadataSerializer implements Serializer<PlayerMetadata>, Ser
     private final static Gson GSON = new GsonBuilder().create();
 
     @Override
-    public void serialize(DataOutput out, PlayerMetadata value) throws IOException {
+    public void serialize(@NotNull DataOutput2 out, @NotNull PlayerMetadata value) throws IOException {
         out.writeUTF(GSON.toJson(value, PlayerMetadata.class));
+
     }
 
     @Override
-    public PlayerMetadata deserialize(DataInput in, int available) throws IOException {
-        return GSON.fromJson(in.readUTF(), PlayerMetadata.class);
+    public PlayerMetadata deserialize(@NotNull DataInput2 input, int available) throws IOException {
+        return GSON.fromJson(input.readUTF(), PlayerMetadata.class);
     }
 
     @Override
diff --git a/src/test/com/comandante/creeper/player/PlayerManagerTest.java b/src/test/com/comandante/creeper/player/PlayerManagerTest.java
index b3daba5e..db379c9c 100644
--- a/src/test/com/comandante/creeper/player/PlayerManagerTest.java
+++ b/src/test/com/comandante/creeper/player/PlayerManagerTest.java
@@ -31,7 +31,7 @@ public class PlayerManagerTest {
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        DB db = DBMaker.newMemoryDB().make();
+        DB db = DBMaker.memoryDB().transactionEnable().make();
         playerManager = new PlayerManager(db, sessionManager);
     }
 
diff --git a/src/test/com/comandante/creeper/player/combat_simuation/NpcTestHarness.java b/src/test/com/comandante/creeper/player/combat_simuation/NpcTestHarness.java
index 31b66a18..be926b52 100644
--- a/src/test/com/comandante/creeper/player/combat_simuation/NpcTestHarness.java
+++ b/src/test/com/comandante/creeper/player/combat_simuation/NpcTestHarness.java
@@ -302,8 +302,7 @@ public class NpcTestHarness {
             }
         };
         CreeperConfiguration creeperConfiguration = new CreeperConfiguration(new MapConfiguration(Maps.newHashMap()));
-        DB db = DBMaker.newMemoryDB().closeOnJvmShutdown().make();
-        Gson gson = new GsonBuilder().create();
+        DB db = DBMaker.memoryDB().transactionEnable().closeOnJvmShutdown().make();
         PlayerManager playerManager = new PlayerManager(db, new SessionManager());
         RoomManager roomManager = new RoomManager(playerManager);
         MapsManager mapsManager = new MapsManager(creeperConfiguration, roomManager);
-- 
GitLab