From 2d36c55f5c388dc7bfa86f45400c8e6e7b91e64c Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Mon, 11 Sep 2017 15:18:36 -0400
Subject: [PATCH] refactor: made equipment an adjacency.

---
 .../storage/graphdb/model/EquipmentData.java  | 99 +++++++++++++++++++
 .../storage/graphdb/model/ItemData.java       | 40 ++++++--
 2 files changed, 133 insertions(+), 6 deletions(-)
 create mode 100644 src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java

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
new file mode 100644
index 00000000..67d2cc50
--- /dev/null
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright 2017 Syncleus, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.syncleus.aethermud.storage.graphdb.model;
+
+import com.syncleus.aethermud.items.Equipment;
+import com.syncleus.aethermud.items.EquipmentSlotType;
+import com.syncleus.aethermud.storage.graphdb.DataUtils;
+import com.syncleus.ferma.AbstractVertexFrame;
+import com.syncleus.ferma.annotations.Adjacency;
+import com.syncleus.ferma.annotations.GraphElement;
+import com.syncleus.ferma.annotations.Property;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.Iterator;
+
+@GraphElement
+public abstract class EquipmentData extends AbstractVertexFrame {
+    @Property("EquipmentSlotType")
+    public abstract void setEquipmentSlotType(EquipmentSlotType slotType);
+
+    @Property("EquipmentSlotType")
+    public abstract EquipmentSlotType getEquipmentSlotType();
+
+    @Adjacency(label = "stats", direction = Direction.OUT)
+    public abstract <N extends StatData> Iterator<? extends N> getStatDataIterator(Class<? extends N> type);
+
+    public StatData getStatData() {
+        Iterator<? extends StatData> allStats = this.getStatDataIterator(StatData.class);
+        if( allStats.hasNext() )
+            return allStats.next();
+        else
+            return null;
+    }
+
+    @Adjacency(label = "stats", direction = Direction.OUT)
+    public abstract StatData addStatData(StatData stats);
+
+    @Adjacency(label = "stats", direction = Direction.OUT)
+    public abstract void removeStatData(StatData stats);
+
+    public void setStatsData(StatData stats) {
+        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getStatDataIterator(StatData.class), statsData -> this.addStatData(statsData), () -> createStatData() );
+    }
+
+    public StatData createStatData() {
+        if( this.getStatData() != 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);
+        stats.setArmorRating(0);
+        stats.setCurrentHealth(0);
+        stats.setCurrentMana(0);
+        stats.setExperience(0);
+        stats.setForaging(0);
+        stats.setIntelligence(0);
+        stats.setInventorySize(0);
+        stats.setMaxEffects(0);
+        stats.setMaxHealth(0);
+        stats.setMaxMana(0);
+        stats.setMeleeSkill(0);
+        stats.setNumberOfWeaponRolls(0);
+        stats.setStrength(0);
+        stats.setWeaponRatingMax(0);
+        stats.setWeaponRatingMin(0);
+        stats.setWillpower(0);
+        this.addStatData(stats);
+        return stats;
+    }
+
+    public static void copyEquipment(EquipmentData dest, Equipment src) {
+        try {
+            PropertyUtils.copyProperties(dest, src);
+            StatData.copyStats(dest.getStatData(), src.getStats());
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            throw new IllegalStateException("Could not copy properties", e);
+        }
+    }
+
+    public static Equipment copyEquipment(EquipmentData src) {
+        return new Equipment(src.getEquipmentSlotType(), StatData.copyStats(src.getStatData()));
+    }
+}
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 94777f74..6db2519c 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
@@ -82,12 +82,6 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
     @Property("ItemHalfLifeTicks")
     public abstract int getItemHalfLifeTicks();
 
-    @Property("Equipment")
-    public abstract Equipment getEquipment();
-
-    @Property("Equipment")
-    public abstract void setEquipment(Equipment equipment);
-
     @Property("HasBeenWithPlayer")
     public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
 
@@ -130,6 +124,35 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
     @Property("HasBeenWithPlayer")
     public abstract boolean isHasBeenWithPlayer();
 
+    @Adjacency(label = "Equipment", direction = Direction.OUT)
+    public abstract <N extends EquipmentData> Iterator<? extends N> getEquipmentDataIterator(Class<? extends N> type);
+
+    public EquipmentData getEquipmentData() {
+        Iterator<? extends EquipmentData> allEquipment = this.getEquipmentDataIterator(EquipmentData.class);
+        if( allEquipment.hasNext() )
+            return allEquipment.next();
+        else
+            return null;
+    }
+
+    @Adjacency(label = "Equipment", direction = Direction.OUT)
+    public abstract EquipmentData addEquipmentData(EquipmentData equipment);
+
+    @Adjacency(label = "Equipment", direction = Direction.OUT)
+    public abstract void removeEquipmentData(EquipmentData equipment);
+
+    public void setEquipmentData(EquipmentData equipment) {
+        DataUtils.setAllElements(Collections.singletonList(equipment), () -> this.getEquipmentDataIterator(EquipmentData.class), equipmentData -> this.addEquipmentData(equipmentData), () -> createEquipmentData() );
+    }
+
+    public EquipmentData createEquipmentData() {
+        if( this.getEquipmentData() != null )
+            throw new IllegalStateException("Already has stats, can't create another");
+        final EquipmentData equipment = this.getGraph().addFramedVertex(EquipmentData.class);
+        this.addEquipmentData(equipment);
+        return equipment;
+    }
+
     @Adjacency(label = "Effect", direction = Direction.OUT)
     public abstract EffectData addEffectData(EffectData effects);
 
@@ -236,6 +259,7 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
             PropertyUtils.copyProperties(dest, src);
             StatData.copyStats(dest.createItemApplyStatData(), src.getItemApplyStats());
             LootData.copyLoot(dest.createLoottData(), src.getLoot());
+            EquipmentData.copyEquipment(dest.createEquipmentData(), src.getEquipment());
             for(Effect effect : src.getEffects())
                 EffectData.copyEffect(dest.createEffectData(), effect);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@@ -248,6 +272,10 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(retVal, src);
 
+            EquipmentData equipmentData = src.getEquipmentData();
+            if(equipmentData != null)
+                retVal.setEquipment(EquipmentData.copyEquipment(equipmentData));
+
             LootData lootData = src.getLootData();
             if(lootData != null)
                 retVal.setLoot(LootData.copyLoot(lootData));
-- 
GitLab