From 19f800246dde22c94586a677768e3e81c69b6a61 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Mon, 11 Sep 2017 14:42:21 -0400
Subject: [PATCH] refactor: renamed the getStatws method and simplified it.

---
 .../command/commands/WhoCommand.java          |  4 +-
 .../aethermud/command/commands/XpCommand.java |  4 +-
 .../core/NewUserRegistrationManager.java      |  2 +-
 .../syncleus/aethermud/npc/NpcBuilder.java    |  3 --
 .../com/syncleus/aethermud/player/Player.java | 46 ++++++++---------
 .../aethermud/player/PlayerManagement.java    | 12 ++---
 .../aethermud/player/PlayerManager.java       |  8 ++-
 .../storage/graphdb/model/EffectData.java     | 36 +++++++-------
 .../storage/graphdb/model/ItemData.java       | 27 +++++-----
 .../storage/graphdb/model/NpcData.java        | 22 ++++-----
 .../storage/graphdb/model/PlayerData.java     | 49 +++++--------------
 .../model/{StatsData.java => StatData.java}   |  6 +--
 .../aethermud/AetherMudUtilsTest.java         |  9 ++--
 .../combatsimuation/NpcTestHarness.java       |  2 +-
 14 files changed, 99 insertions(+), 131 deletions(-)
 rename src/main/java/com/syncleus/aethermud/storage/graphdb/model/{StatsData.java => StatData.java} (96%)

diff --git a/src/main/java/com/syncleus/aethermud/command/commands/WhoCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/WhoCommand.java
index 984d8c5b..9972df48 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/WhoCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/WhoCommand.java
@@ -62,8 +62,8 @@ public class WhoCommand extends Command {
                         continue;
                     }
                     PlayerData playerData = playerMetadataOptional.get();
-                    t.addCell(Long.toString(Levels.getLevel(playerData.getStats().getExperience())));
-                    t.addCell(NumberFormat.getNumberInstance(Locale.US).format((playerData.getStats().getExperience())));
+                    t.addCell(Long.toString(Levels.getLevel(playerData.getStatData().getExperience())));
+                    t.addCell(NumberFormat.getNumberInstance(Locale.US).format((playerData.getStatData().getExperience())));
                     t.addCell(roomManager.getPlayerCurrentRoom(allPlayer).get().getRoomTitle());
                 }
             }
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/XpCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/XpCommand.java
index c99554ad..87030cbb 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/XpCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/XpCommand.java
@@ -50,8 +50,8 @@ public class XpCommand extends Command {
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         execCommand(ctx, e, () -> {
             PlayerUtil.consume(gameManager, playerId, playerData -> {
-                int nextLevel = Levels.getLevel(playerData.getStats().getExperience()) + 1;
-                int expToNextLevel = Levels.getXp(nextLevel) - playerData.getStats().getExperience();
+                int nextLevel = Levels.getLevel(playerData.getStatData().getExperience()) + 1;
+                int expToNextLevel = Levels.getXp(nextLevel) - playerData.getStatData().getExperience();
                 Meter meter = Main.metrics.meter("experience-" + player.getPlayerName());
 
                 Table table = new Table(2, BorderStyle.CLASSIC_COMPATIBLE, ShownBorders.NONE);
diff --git a/src/main/java/com/syncleus/aethermud/core/NewUserRegistrationManager.java b/src/main/java/com/syncleus/aethermud/core/NewUserRegistrationManager.java
index ab63162c..bd7c04f6 100644
--- a/src/main/java/com/syncleus/aethermud/core/NewUserRegistrationManager.java
+++ b/src/main/java/com/syncleus/aethermud/core/NewUserRegistrationManager.java
@@ -123,7 +123,7 @@ public class NewUserRegistrationManager {
             playerData.setPlayerRoles(Sets.newHashSet(PlayerRole.MORTAL, PlayerRole.ADMIN, PlayerRole.GOD, PlayerRole.TELEPORTER));
             playerData.setPlayerSettings(new HashMap<>());
             try {
-                PropertyUtils.copyProperties(playerData.createStats(), DefaultStats.DEFAULT_PLAYER.createStats());
+                PropertyUtils.copyProperties(playerData.createStatData(), DefaultStats.DEFAULT_PLAYER.createStats());
             } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
                 throw new IllegalStateException("Could not copy properties for stats", e);
             }
diff --git a/src/main/java/com/syncleus/aethermud/npc/NpcBuilder.java b/src/main/java/com/syncleus/aethermud/npc/NpcBuilder.java
index e9c1513e..972d3f1c 100644
--- a/src/main/java/com/syncleus/aethermud/npc/NpcBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/npc/NpcBuilder.java
@@ -21,15 +21,12 @@ import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.items.Loot;
 import com.syncleus.aethermud.spawner.SpawnRule;
 import com.syncleus.aethermud.stats.Stats;
-import com.syncleus.aethermud.storage.graphdb.model.StatsData;
-import com.syncleus.aethermud.storage.graphdb.model.NpcData;
 import com.syncleus.aethermud.world.model.Area;
 import org.apache.commons.beanutils.PropertyUtils;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
diff --git a/src/main/java/com/syncleus/aethermud/player/Player.java b/src/main/java/com/syncleus/aethermud/player/Player.java
index 94102165..83c741db 100644
--- a/src/main/java/com/syncleus/aethermud/player/Player.java
+++ b/src/main/java/com/syncleus/aethermud/player/Player.java
@@ -30,7 +30,7 @@ import com.syncleus.aethermud.server.communication.Color;
 import com.syncleus.aethermud.stats.*;
 import com.syncleus.aethermud.storage.graphdb.model.CoolDownData;
 import com.syncleus.aethermud.storage.graphdb.model.EffectData;
-import com.syncleus.aethermud.storage.graphdb.model.StatsData;
+import com.syncleus.aethermud.storage.graphdb.model.StatData;
 import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
 import com.syncleus.aethermud.world.model.Room;
 import com.google.common.collect.*;
@@ -149,10 +149,10 @@ public class Player extends AetherMudEntity {
             }
             int maxHealth = stats.getMaxHealth();
             this.consumeRead((p) -> {
-                if (p.getStats().getCurrentHealth() < maxHealth) {
+                if (p.getStatData().getCurrentHealth() < maxHealth) {
                     updatePlayerHealth((int) (maxHealth * .05), null);
                 }
-                if (p.getStats().getCurrentMana() < maxHealth) {
+                if (p.getStatData().getCurrentMana() < maxHealth) {
                     addMana((int) (maxHealth * .03));
                 }
             });
@@ -204,7 +204,8 @@ public class Player extends AetherMudEntity {
     public boolean updatePlayerHealth(int amount, NpcSpawn npcSpawn) {
         synchronized (interner.intern(playerId)) {
             if (amount > 0) {
-                int currentHealth = this.transactRead(playerData -> playerData.getStats().getCurrentHealth());
+                // TODO : make this one large transaction
+                int currentHealth = this.transactRead(playerData -> playerData.getStatData().getCurrentHealth());
                 Stats statsModifier = getPlayerStatsWithEquipmentAndLevel();
                 int maxHealth = statsModifier.getMaxHealth();
                 int proposedNewAmt = currentHealth + amount;
@@ -218,15 +219,15 @@ public class Player extends AetherMudEntity {
                 }
                 else
                     finalNewAmount = proposedNewAmt;
-                this.consume(playerData -> playerData.getStats().setCurrentHealth(finalNewAmount));
+                this.consume(playerData -> playerData.getStatData().setCurrentHealth(finalNewAmount));
                 return false;
             } else {
-                if ((this.transactRead(playerData -> playerData.getStats().getCurrentHealth()) + amount) < 0) {
-                    this.consume(playerData -> playerData.getStats().setCurrentHealth(0));
+                if ((this.transactRead(playerData -> playerData.getStatData().getCurrentHealth()) + amount) < 0) {
+                    this.consume(playerData -> playerData.getStatData().setCurrentHealth(0));
                 } else {
-                    this.consume(playerData -> playerData.getStats().setCurrentHealth(playerData.getStats().getCurrentHealth() + amount));
+                    this.consume(playerData -> playerData.getStatData().setCurrentHealth(playerData.getStatData().getCurrentHealth() + amount));
                 }
-                if (this.transactRead(playerData -> playerData.getStats().getCurrentHealth()) == 0) {
+                if (this.transactRead(playerData -> playerData.getStatData().getCurrentHealth()) == 0) {
                     killPlayer(npcSpawn);
                     return true;
                 }
@@ -257,7 +258,8 @@ public class Player extends AetherMudEntity {
 
     public void addMana(int addAmt) {
         synchronized (interner.intern(playerId)) {
-            int currentMana = this.transactRead(playerData -> playerData.getStats().getCurrentMana());
+            //TODO : Make this one large transaction
+            int currentMana = this.transactRead(playerData -> playerData.getStatData().getCurrentMana());
             Stats statsModifier = getPlayerStatsWithEquipmentAndLevel();
             int maxMana = statsModifier.getMaxMana();
             int proposedNewAmt = currentMana + addAmt;
@@ -271,7 +273,7 @@ public class Player extends AetherMudEntity {
             }
             else
                 finalNewAmount = proposedNewAmt;
-            this.consume(playerData -> playerData.getStats().setCurrentMana(finalNewAmount));
+            this.consume(playerData -> playerData.getStatData().setCurrentMana(finalNewAmount));
         }
     }
 
@@ -279,11 +281,11 @@ public class Player extends AetherMudEntity {
         synchronized (interner.intern(playerId)) {
             final Meter requests = Main.metrics.meter("experience-" + playerName);
             this.consume(playerData -> {
-                int currentExperience = playerData.getStats().getExperience();
+                int currentExperience = playerData.getStatData().getExperience();
                 int currentLevel = Levels.getLevel(currentExperience);
-                playerData.getStats().setExperience(currentExperience + exp);
+                playerData.getStatData().setExperience(currentExperience + exp);
                 requests.mark(exp);
-                int newLevel = Levels.getLevel(playerData.getStats().getExperience());
+                int newLevel = Levels.getLevel(playerData.getStatData().getExperience());
                 if (newLevel > currentLevel) {
                     gameManager.announceLevelUp(playerName, currentLevel, newLevel);
                 }
@@ -292,18 +294,18 @@ public class Player extends AetherMudEntity {
     }
 
     public int getLevel() {
-        return this.transactRead(playerData -> Levels.getLevel(playerData.getStats().getExperience()));
+        return this.transactRead(playerData -> Levels.getLevel(playerData.getStatData().getExperience()));
     }
 
     public int getCurrentHealth() {
         synchronized (interner.intern(playerId)) {
-            return this.transactRead(playerData -> playerData.getStats().getCurrentHealth());
+            return this.transactRead(playerData -> playerData.getStatData().getCurrentHealth());
         }
     }
 
     public void setCurrentHealth(int health) {
         synchronized (interner.intern(playerId)) {
-            this.consume(playerData -> playerData.getStats().setCurrentHealth(health));
+            this.consume(playerData -> playerData.getStatData().setCurrentHealth(health));
         }
     }
 
@@ -328,7 +330,7 @@ public class Player extends AetherMudEntity {
     public boolean addEffect(Effect effect) {
         synchronized (interner.intern(playerId)) {
             return this.transact(playerData -> {
-                if (playerData.getEffects() != null && (playerData.getEffects().size() >= playerData.getStats().getMaxEffects())) {
+                if (playerData.getEffects() != null && (playerData.getEffects().size() >= playerData.getStatData().getMaxEffects())) {
                     return false;
                 }
 
@@ -462,13 +464,13 @@ public class Player extends AetherMudEntity {
 
     public void updatePlayerMana(int amount) {
         synchronized (interner.intern(playerId)) {
-            this.consume(playerData -> playerData.getStats().setCurrentMana(playerData.getStats().getCurrentMana() + amount));
+            this.consume(playerData -> playerData.getStatData().setCurrentMana(playerData.getStatData().getCurrentMana() + amount));
         }
     }
 
     public void updatePlayerForageExperience(int amount) {
         synchronized (interner.intern(playerId)) {
-            this.consume(playerData -> playerData.getStats().setForaging(playerData.getStats().getForaging() + amount));
+            this.consume(playerData -> playerData.getStatData().setForaging(playerData.getStatData().getForaging() + amount));
         }
     }
 
@@ -975,7 +977,7 @@ public class Player extends AetherMudEntity {
                 }
                 if (playerData.getEffects() != null) {
                     for (EffectData effect : playerData.getEffects()) {
-                        StatsHelper.combineStats(newStats, StatsData.copyStats(effect.getDurationStats()));
+                        StatsHelper.combineStats(newStats, StatData.copyStats(effect.getDurationStats()));
                     }
                 }
                 return newStats;
@@ -1260,7 +1262,7 @@ public class Player extends AetherMudEntity {
     }
 
     public Stats getStats() {
-        return this.transactRead(playerData -> StatsData.copyStats(playerData.getStats()));
+        return this.transactRead(playerData -> StatData.copyStats(playerData.getStatData()));
     }
 
     private <T> T transact(Function<PlayerData, T> func) {
diff --git a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
index 0d58d3e3..beec826e 100644
--- a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
+++ b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
@@ -83,7 +83,7 @@ public class PlayerManagement implements PlayerManagementMBean {
     @Override
     public void setHealth(int amt) {
         synchronized (findInterner().intern(playerId)) {
-            this.consume(playerData -> playerData.getStats().setCurrentHealth(amt));
+            this.consume(playerData -> playerData.getStatData().setCurrentHealth(amt));
         }
     }
 
@@ -109,13 +109,13 @@ public class PlayerManagement implements PlayerManagementMBean {
     @Override
     public void setMana(int amt) {
         synchronized (findInterner().intern(playerId)) {
-            this.consume(playerData -> playerData.getStats().setCurrentMana(amt));
+            this.consume(playerData -> playerData.getStatData().setCurrentMana(amt));
         }
     }
 
     @Override
     public int getHealth() {
-        return this.transactRead(playerData -> playerData.getStats().getCurrentHealth());
+        return this.transactRead(playerData -> playerData.getStatData().getCurrentHealth());
     }
 
     @Override
@@ -125,19 +125,19 @@ public class PlayerManagement implements PlayerManagementMBean {
 
     @Override
     public int getMana() {
-        return this.transactRead(playerData -> playerData.getStats().getCurrentMana());
+        return this.transactRead(playerData -> playerData.getStatData().getCurrentMana());
     }
 
     @Override
     public void setExperience(int amt) {
         synchronized (findInterner().intern(playerId)) {
-            this.consume(playerData -> playerData.getStats().setExperience(amt));
+            this.consume(playerData -> playerData.getStatData().setExperience(amt));
         }
     }
 
     @Override
     public int getExperience() {
-        return this.transactRead(playerData -> playerData.getStats().getExperience());
+        return this.transactRead(playerData -> playerData.getStatData().getExperience());
     }
 
     @Override
diff --git a/src/main/java/com/syncleus/aethermud/player/PlayerManager.java b/src/main/java/com/syncleus/aethermud/player/PlayerManager.java
index 10f623ee..ce463d77 100644
--- a/src/main/java/com/syncleus/aethermud/player/PlayerManager.java
+++ b/src/main/java/com/syncleus/aethermud/player/PlayerManager.java
@@ -17,12 +17,10 @@ package com.syncleus.aethermud.player;
 
 
 import com.codahale.metrics.Gauge;
-import com.google.common.collect.Sets;
 import com.syncleus.aethermud.Main;
 import com.syncleus.aethermud.core.SessionManager;
 import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
-import com.syncleus.aethermud.storage.graphdb.model.StatsData;
-import com.syncleus.aethermud.storage.AetherMudStorage;
+import com.syncleus.aethermud.storage.graphdb.model.StatData;
 import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
 import com.syncleus.aethermud.world.model.Room;
 import org.apache.commons.codec.binary.Base64;
@@ -122,7 +120,7 @@ public class PlayerManager {
                 Main.metrics.register(name(PlayerManager.class, playerData.getPlayerName(), "current-health"),
                     (Gauge<Integer>) () -> {
                         Optional<PlayerData> playerMetadataOpt = tx.getStorage().getPlayerMetadata(playerId);
-                        return playerMetadataOpt.map(PlayerData::getStats).map(StatsData::getCurrentHealth).orElse(0);
+                        return playerMetadataOpt.map(PlayerData::getStatData).map(StatData::getCurrentHealth).orElse(0);
                     });
             }
 
@@ -131,7 +129,7 @@ public class PlayerManager {
                 Main.metrics.register(name(PlayerManager.class, playerData.getPlayerName(), "xp"),
                     (Gauge<Integer>) () -> {
                         Optional<PlayerData> playerMetadataOpt = tx.getStorage().getPlayerMetadata(playerId);
-                        return playerMetadataOpt.map(PlayerData::getStats).map(StatsData::getExperience).orElse(0);
+                        return playerMetadataOpt.map(PlayerData::getStatData).map(StatData::getExperience).orElse(0);
                     });
             }
         }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
index 2fc2dd55..c5ad8669 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
@@ -73,27 +73,27 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     public abstract void setFrozenMovement(boolean frozenMovement);
 
     @Adjacency(label = "ApplyStatsOnTick", direction = Direction.OUT)
-    public abstract <N extends StatsData> Iterator<? extends N> getAllApplyStatsOnTick(Class<? extends N> type);
+    public abstract <N extends StatData> Iterator<? extends N> getAllApplyStatsOnTick(Class<? extends N> type);
 
     public Stats getApplyStatsOnTick() {
-        Iterator<? extends StatsData> allStats = this.getAllApplyStatsOnTick(StatsData.class);
+        Iterator<? extends StatData> allStats = this.getAllApplyStatsOnTick(StatData.class);
         if (allStats.hasNext())
-            return StatsData.copyStats(allStats.next());
+            return StatData.copyStats(allStats.next());
         else
             return null;
     }
 
     @Adjacency(label = "ApplyStatsOnTick", direction = Direction.OUT)
-    public abstract StatsData addApplyStatsOnTick(StatsData stats);
+    public abstract StatData addApplyStatsOnTick(StatData stats);
 
     @Adjacency(label = "ApplyStatsOnTick", direction = Direction.OUT)
-    public abstract void removeApplyStatsOnTick(StatsData stats);
+    public abstract void removeApplyStatsOnTick(StatData stats);
 
     public void setApplyStatsOnTick(Stats stats) {
-        Iterator<? extends StatsData> existingAll = this.getAllApplyStatsOnTick(StatsData.class);
+        Iterator<? extends StatData> existingAll = this.getAllApplyStatsOnTick(StatData.class);
         if (existingAll != null) {
             while (existingAll.hasNext()) {
-                StatsData existing = existingAll.next();
+                StatData existing = existingAll.next();
                 this.removeApplyStatsOnTick(existing);
                 existing.remove();
             }
@@ -103,7 +103,7 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
             return;
         }
 
-        StatsData createdData = this.createOrphanStats();
+        StatData createdData = this.createOrphanStats();
         try {
             PropertyUtils.copyProperties(createdData, stats);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@@ -113,10 +113,10 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "DurationStats", direction = Direction.OUT)
-    public abstract <N extends StatsData> Iterator<? extends N> getAllDurationStats(Class<? extends N> type);
+    public abstract <N extends StatData> Iterator<? extends N> getAllDurationStats(Class<? extends N> type);
 
-    public StatsData getDurationStats() {
-        Iterator<? extends StatsData> allStats = this.getAllDurationStats(StatsData.class);
+    public StatData getDurationStats() {
+        Iterator<? extends StatData> allStats = this.getAllDurationStats(StatData.class);
         if (allStats.hasNext())
             return allStats.next();
         else
@@ -124,16 +124,16 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "DurationStats", direction = Direction.OUT)
-    public abstract StatsData addDurationStats(StatsData stats);
+    public abstract StatData addDurationStats(StatData stats);
 
     @Adjacency(label = "DurationStats", direction = Direction.OUT)
-    public abstract void removeDurationStats(StatsData stats);
+    public abstract void removeDurationStats(StatData stats);
 
     public void setDurationStats(Stats stats) {
-        Iterator<? extends StatsData> existingAll = this.getAllDurationStats(StatsData.class);
+        Iterator<? extends StatData> existingAll = this.getAllDurationStats(StatData.class);
         if (existingAll != null) {
             while (existingAll.hasNext()) {
-                StatsData existing = existingAll.next();
+                StatData existing = existingAll.next();
                 this.removeDurationStats(existing);
                 existing.remove();
             }
@@ -143,7 +143,7 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
             return;
         }
 
-        StatsData createdData = this.createOrphanStats();
+        StatData createdData = this.createOrphanStats();
         try {
             PropertyUtils.copyProperties(createdData, stats);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@@ -152,10 +152,10 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
         this.addDurationStats(createdData);
     }
 
-    private StatsData createOrphanStats() {
+    private StatData createOrphanStats() {
         if (this.getDurationStats() != null)
             throw new IllegalStateException("Already has stats, can't create another");
-        final StatsData stats = this.getGraph().addFramedVertex(StatsData.class);
+        final StatData stats = this.getGraph().addFramedVertex(StatData.class);
         stats.setAgile(0);
         stats.setAim(0);
         stats.setArmorRating(0);
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java
index f2df1188..94777f74 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java
@@ -16,11 +16,8 @@
 package com.syncleus.aethermud.storage.graphdb.model;
 
 import com.google.common.collect.Sets;
-import com.syncleus.aethermud.common.AetherMudMessage;
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.items.*;
-import com.syncleus.aethermud.spawner.SpawnRule;
-import com.syncleus.aethermud.stats.Stats;
 import com.syncleus.aethermud.storage.graphdb.DataUtils;
 import com.syncleus.ferma.annotations.Adjacency;
 import com.syncleus.ferma.annotations.GraphElement;
@@ -157,10 +154,10 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
-    public abstract <N extends StatsData> Iterator<? extends N> getItemApplyStatDatasIterator(Class<? extends N> type);
+    public abstract <N extends StatData> Iterator<? extends N> getItemApplyStatDatasIterator(Class<? extends N> type);
 
-    public StatsData getItemApplyStatData() {
-        Iterator<? extends StatsData> allStats = this.getItemApplyStatDatasIterator(StatsData.class);
+    public StatData getItemApplyStatData() {
+        Iterator<? extends StatData> allStats = this.getItemApplyStatDatasIterator(StatData.class);
         if( allStats.hasNext() )
             return allStats.next();
         else
@@ -168,19 +165,19 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
-    public abstract StatsData addStatData(StatsData stats);
+    public abstract StatData addStatData(StatData stats);
 
     @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
-    public abstract void removeStatData(StatsData stats);
+    public abstract void removeStatData(StatData stats);
 
-    public void setItemApplyStatData(StatsData stats) {
-        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getItemApplyStatDatasIterator(StatsData.class), statsData -> this.addStatData(statsData), () -> createItemApplyStatData() );
+    public void setItemApplyStatData(StatData stats) {
+        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getItemApplyStatDatasIterator(StatData.class), statsData -> this.addStatData(statsData), () -> createItemApplyStatData() );
     }
 
-    public StatsData createItemApplyStatData() {
+    public StatData createItemApplyStatData() {
         if( this.getItemApplyStatData() != null )
             throw new IllegalStateException("Already has stats, can't create another");
-        final StatsData stats = this.getGraph().addFramedVertex(StatsData.class);
+        final StatData stats = this.getGraph().addFramedVertex(StatData.class);
         stats.setAgile(0);
         stats.setAim(0);
         stats.setArmorRating(0);
@@ -237,7 +234,7 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
     public static void copyItem(ItemData dest, Item src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            StatsData.copyStats(dest.createItemApplyStatData(), src.getItemApplyStats());
+            StatData.copyStats(dest.createItemApplyStatData(), src.getItemApplyStats());
             LootData.copyLoot(dest.createLoottData(), src.getLoot());
             for(Effect effect : src.getEffects())
                 EffectData.copyEffect(dest.createEffectData(), effect);
@@ -255,9 +252,9 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
             if(lootData != null)
                 retVal.setLoot(LootData.copyLoot(lootData));
 
-            StatsData applyStats = src.getItemApplyStatData();
+            StatData applyStats = src.getItemApplyStatData();
             if( applyStats != null )
-                retVal.setItemApplyStats(StatsData.copyStats(applyStats));
+                retVal.setItemApplyStats(StatData.copyStats(applyStats));
 
             Set<Effect> effects = new HashSet<>();
             for(EffectData effect : src.getEffectDatas())
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
index 8b41374a..ba0b58c3 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
@@ -134,10 +134,10 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "stats", direction = Direction.OUT)
-    public abstract <N extends StatsData> Iterator<? extends N> getAllStatsData(Class<? extends N> type);
+    public abstract <N extends StatData> Iterator<? extends N> getAllStatsData(Class<? extends N> type);
 
-    public StatsData getStatsData() {
-        Iterator<? extends StatsData> allStats = this.getAllStatsData(StatsData.class);
+    public StatData getStatsData() {
+        Iterator<? extends StatData> allStats = this.getAllStatsData(StatData.class);
         if( allStats.hasNext() )
             return allStats.next();
         else
@@ -145,19 +145,19 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "stats", direction = Direction.OUT)
-    public abstract StatsData addStatsData(StatsData stats);
+    public abstract StatData addStatsData(StatData stats);
 
     @Adjacency(label = "stats", direction = Direction.OUT)
-    public abstract void removeStatsData(StatsData stats);
+    public abstract void removeStatsData(StatData stats);
 
-    public void setStatsData(StatsData stats) {
-        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getAllStatsData(StatsData.class), statsData -> this.addStatsData(statsData), () -> this.createStatsData() );
+    public void setStatsData(StatData stats) {
+        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getAllStatsData(StatData.class), statsData -> this.addStatsData(statsData), () -> this.createStatsData() );
     }
 
-    public StatsData createStatsData() {
+    public StatData createStatsData() {
         if( this.getStatsData() != null )
             throw new IllegalStateException("Already has stats, can't create another");
-        final StatsData stats = this.getGraph().addFramedVertex(StatsData.class);
+        final StatData stats = this.getGraph().addFramedVertex(StatData.class);
         stats.setAgile(0);
         stats.setAim(0);
         stats.setArmorRating(0);
@@ -283,7 +283,7 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(dest, src);
             LootData.copyLoot(dest.createLootData(), src.getLoot());
-            StatsData.copyStats(dest.createStatsData(), src.getStats());
+            StatData.copyStats(dest.createStatsData(), src.getStats());
             for(SpawnRule spawnRule : src.getSpawnRules())
                 SpawnRuleData.copySpawnRule(dest.createSpawnRuleData(), spawnRule);
             for(AetherMudMessage message : src.getAttackMessages())
@@ -304,7 +304,7 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(retVal, src);
             retVal.setLoot(LootData.copyLoot(src.getLootData()));
-            retVal.setStats(StatsData.copyStats(src.getStatsData()));
+            retVal.setStats(StatData.copyStats(src.getStatsData()));
 
             List<SpawnRule> rules = new ArrayList<>();
             for(SpawnRuleData spawnRuleData : src.getSpawnRuleDatas())
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/PlayerData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/PlayerData.java
index 01d21c70..17c6f485 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/PlayerData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/PlayerData.java
@@ -16,9 +16,9 @@
 package com.syncleus.aethermud.storage.graphdb.model;
 
 
-import com.syncleus.aethermud.items.Effect;
 import com.syncleus.aethermud.player.*;
 import com.google.common.collect.Sets;
+import com.syncleus.aethermud.storage.graphdb.DataUtils;
 import com.syncleus.ferma.ClassInitializer;
 import com.syncleus.ferma.DefaultClassInitializer;
 import com.syncleus.ferma.annotations.Adjacency;
@@ -256,10 +256,10 @@ public abstract class PlayerData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "stats", direction = Direction.OUT)
-    public abstract <N extends StatsData> Iterator<? extends N> getAllStats(Class<? extends N> type);
+    public abstract <N extends StatData> Iterator<? extends N> getStatDataIterator(Class<? extends N> type);
 
-    public StatsData getStats() {
-        Iterator<? extends StatsData> allStats = this.getAllStats(StatsData.class);
+    public StatData getStatData() {
+        Iterator<? extends StatData> allStats = this.getStatDataIterator(StatData.class);
         if( allStats.hasNext() )
             return allStats.next();
         else
@@ -267,44 +267,19 @@ public abstract class PlayerData extends AbstractInterceptingVertexFrame {
     }
 
     @Adjacency(label = "stats", direction = Direction.OUT)
-    public abstract StatsData addStats(StatsData stats);
+    public abstract StatData addStatData(StatData stats);
 
     @Adjacency(label = "stats", direction = Direction.OUT)
-    public abstract void removeStats(StatsData stats);
+    public abstract void removeStatData(StatData stats);
 
-    public void setStats(StatsData stats) {
-        Iterator<? extends StatsData> existingAll = this.getAllStats(StatsData.class);
-        if( existingAll != null ) {
-            while( existingAll.hasNext() ) {
-                StatsData existing = existingAll.next();
-                this.removeStats(existing);
-                existing.remove();
-            }
-
-        }
-
-        if( stats == null ) {
-            this.createStats();
-            return;
-        }
-
-        StatsData statsData;
-        if( stats instanceof StatsData ) {
-            this.addStats((StatsData) stats);
-        }
-        else {
-            try {
-                PropertyUtils.copyProperties(this.createStats(), stats);
-            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-                throw new IllegalStateException("Could not copy properties");
-            }
-        }
+    public void setStats(StatData stats) {
+        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getStatDataIterator(StatData.class), statsData -> this.addStatData(statsData), () -> createStatData() );
     }
 
-    public StatsData createStats() {
-        if( this.getStats() != null )
+    public StatData createStatData() {
+        if( this.getStatData() != null )
             throw new IllegalStateException("Already has stats, can't create another");
-        final StatsData stats = this.getGraph().addFramedVertex(StatsData.class);
+        final StatData stats = this.getGraph().addFramedVertex(StatData.class);
         stats.setAgile(0);
         stats.setAim(0);
         stats.setArmorRating(0);
@@ -323,7 +298,7 @@ public abstract class PlayerData extends AbstractInterceptingVertexFrame {
         stats.setWeaponRatingMax(0);
         stats.setWeaponRatingMin(0);
         stats.setWillpower(0);
-        this.addStats(stats);
+        this.addStatData(stats);
         return stats;
     }
 
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatData.java
similarity index 96%
rename from src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java
rename to src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatData.java
index e1cc61ac..4970f5fb 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatData.java
@@ -26,7 +26,7 @@ import java.lang.reflect.InvocationTargetException;
 import static java.lang.StrictMath.sqrt;
 
 @GraphElement
-public abstract class StatsData extends AbstractInterceptingVertexFrame {
+public abstract class StatData extends AbstractInterceptingVertexFrame {
     @Property("intelligence")
     public abstract Integer getIntelligence();
 
@@ -135,7 +135,7 @@ public abstract class StatsData extends AbstractInterceptingVertexFrame {
     @Property("inventorySize")
     public abstract void setInventorySize(Integer inventorySize);
 
-    public static void copyStats(StatsData dest, Stats src) {
+    public static void copyStats(StatData dest, Stats src) {
         try {
             PropertyUtils.copyProperties(dest, src);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@@ -143,7 +143,7 @@ public abstract class StatsData extends AbstractInterceptingVertexFrame {
         }
     }
 
-    public static Stats copyStats(StatsData src) {
+    public static Stats copyStats(StatData src) {
         Stats retVal = new Stats();
         try {
             PropertyUtils.copyProperties(retVal, src);
diff --git a/src/test/java/com/syncleus/aethermud/AetherMudUtilsTest.java b/src/test/java/com/syncleus/aethermud/AetherMudUtilsTest.java
index 510c5712..1fe2f64b 100644
--- a/src/test/java/com/syncleus/aethermud/AetherMudUtilsTest.java
+++ b/src/test/java/com/syncleus/aethermud/AetherMudUtilsTest.java
@@ -26,11 +26,10 @@ import com.syncleus.aethermud.stats.DefaultStats;
 import com.syncleus.aethermud.stats.modifier.StatsModifierFactory;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import com.syncleus.aethermud.storage.AetherMudStorage;
 import com.syncleus.aethermud.storage.graphdb.GraphDbAetherMudStorage;
 import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
 import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
-import com.syncleus.aethermud.storage.graphdb.model.StatsData;
+import com.syncleus.aethermud.storage.graphdb.model.StatData;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.junit.Assert;
 import org.junit.Test;
@@ -71,13 +70,13 @@ public class AetherMudUtilsTest {
         playerData.setPlayerId(Main.createPlayerId("usertest"));
         playerData.setPlayerRoles(Sets.newHashSet(PlayerRole.MORTAL));
         playerData.setPlayerSettings(new HashMap<>());
-        StatsData statsData = mock(StatsData.class);
+        StatData statData = mock(StatData.class);
         try {
-            PropertyUtils.copyProperties(statsData, DefaultStats.DEFAULT_PLAYER.createStats());
+            PropertyUtils.copyProperties(statData, DefaultStats.DEFAULT_PLAYER.createStats());
         } catch (IllegalAccessException | InvocationTargetException e) {
             throw new IllegalStateException("Could not create a stats object", e);
         }
-        when(playerData.getStats()).thenReturn(statsData);
+        when(playerData.getStatData()).thenReturn(statData);
 
         GameManager gameManager = mock(GameManager.class);
         StatsModifierFactory statsModifierFactory = mock(StatsModifierFactory.class);
diff --git a/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java b/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java
index fd4c6fb5..df6d0d85 100644
--- a/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java
+++ b/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java
@@ -318,7 +318,7 @@ public class NpcTestHarness {
             playerData.setPlayerRoles(Sets.newHashSet(PlayerRole.MORTAL));
             playerData.setPlayerSettings(new HashMap<>());
             try {
-                PropertyUtils.copyProperties(playerData.createStats(), DefaultStats.DEFAULT_PLAYER.createStats());
+                PropertyUtils.copyProperties(playerData.createStatData(), DefaultStats.DEFAULT_PLAYER.createStats());
             } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                 throw new IllegalStateException("Could not create a stats object", e);
             }
-- 
GitLab