From d6aca7c25ce1f422bc937b2e8be9e243d8812749 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Sun, 17 Sep 2017 23:46:54 -0400
Subject: [PATCH] refactor: changed copy methods to handle existing data.

---
 .../storage/graphdb/model/EffectData.java     | 10 ++++++----
 .../storage/graphdb/model/EquipmentData.java  |  2 +-
 .../storage/graphdb/model/NpcData.java        | 20 +++++++++++++++++--
 3 files changed, 25 insertions(+), 7 deletions(-)

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 e7cc275a..4638afb9 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
@@ -96,6 +96,8 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     }
 
     private StatData createApplyStatOnTickData() {
+        if (this.getApplyStatOnTickData() != null)
+            throw new IllegalStateException("Already has stats, can't create another");
         StatData statData = this.createOrphanStats();
         this.addApplyStatOnTickData(statData);
         return statData;
@@ -123,14 +125,14 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     }
 
     private StatData createDurationStatData() {
+        if (this.getDurationStatData() != null)
+            throw new IllegalStateException("Already has stats, can't create another");
         StatData statData = this.createOrphanStats();
         this.addDurationStatData(statData);
         return statData;
     }
 
     private StatData createOrphanStats() {
-        if (this.getDurationStatData() != null)
-            throw new IllegalStateException("Already has stats, can't create another");
         final StatData stats = this.getGraph().addFramedVertex(StatData.class);
         stats.setAgile(0);
         stats.setAim(0);
@@ -156,8 +158,8 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     public static void copyEffect(EffectData dest, Effect src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            StatData.copyStats(dest.createApplyStatOnTickData(), src.getApplyStatsOnTick());
-            StatData.copyStats(dest.createDurationStatData(), src.getDurationStats());
+            StatData.copyStats((dest.getApplyStatOnTickData() != null ? dest.getApplyStatOnTickData() : dest.createApplyStatOnTickData()), src.getApplyStatsOnTick());
+            StatData.copyStats((dest.getDurationStatData() != null ? dest.getDurationStatData() : dest.createDurationStatData()), src.getDurationStats());
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
             throw new IllegalStateException("Could not copy properties", e);
         }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
index 1bff49e2..06924124 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
@@ -87,7 +87,7 @@ public abstract class EquipmentData extends AbstractVertexFrame {
     public static void copyEquipment(EquipmentData dest, Equipment src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            StatData.copyStats(dest.getStatData(), src.getStats());
+            StatData.copyStats((dest.getStatData() != null ? dest.getStatData() : dest.createStatData()), src.getStats());
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
             throw new IllegalStateException("Could not copy properties", e);
         }
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 6750709e..278844e7 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
@@ -282,16 +282,32 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
     public static void copyNpc(NpcData dest, Npc src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            LootData.copyLoot(dest.createLootData(), src.getLoot());
-            StatData.copyStats(dest.createStatsData(), src.getStats());
+            LootData.copyLoot((dest.getLootData() != null ? dest.getLootData() : dest.createLootData()), src.getLoot());
+            StatData.copyStats((dest.getStatsData() != null ? dest.getStatsData() : dest.createStatsData()), src.getStats());
+
+            for(SpawnRuleData data : dest.getSpawnRuleDatas())
+                data.remove();
             for(SpawnRule spawnRule : src.getSpawnRules())
                 SpawnRuleData.copySpawnRule(dest.createSpawnRuleData(), spawnRule);
+
+            for(AetherMudMessageData data : dest.getAttackMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getAttackMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createAttackMessageData(), message);
+
+
+            for(AetherMudMessageData data : dest.getBattleMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getBattleMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createBattleMessageData(), message);
+
+            for(AetherMudMessageData data : dest.getCriticalAttackMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getCriticalAttackMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createCriticalAttackMessageData(), message);
+
+            for(AetherMudMessageData data : dest.getIdleMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getIdleMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createIdleMessageData(), message);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-- 
GitLab