diff --git a/src/main/java/com/syncleus/aethermud/bot/command/commands/RandomRoomDescriptionCommand.java b/src/main/java/com/syncleus/aethermud/bot/command/commands/RandomRoomDescriptionCommand.java
index 0cfa359d04a266d30b193bd78068943bd6e21be8..8a8efbaed97fd5e68ba1d4c84776c86685296126 100644
--- a/src/main/java/com/syncleus/aethermud/bot/command/commands/RandomRoomDescriptionCommand.java
+++ b/src/main/java/com/syncleus/aethermud/bot/command/commands/RandomRoomDescriptionCommand.java
@@ -44,7 +44,7 @@ public class RandomRoomDescriptionCommand extends BotCommand {
output.add(randomRoom.getRoomTitle());
output.add(" ");
output.add(randomRoom.getRoomDescription());
- /*String mapString = botCommandManager.getGameManager().getMapsManager().drawMap(randomRoom.getRoomId(), new Coords(5, 5));
+ /*String mapString = botCommandManager.getGameManager().getMapsManager().drawMap(randomRoom.getRoomIds(), new Coords(5, 5));
String[] split = mapString.split("\\r?\\n");
for (String s: split) {
output.add(s);
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/admin/LoadMerchantCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/admin/LoadMerchantCommand.java
index b5bd8e6689f3c8d0d083e371e575ab0ffc3e8c58..609c4b44569dbb49578d7dc319b88b8b3a806f13 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/admin/LoadMerchantCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/admin/LoadMerchantCommand.java
@@ -17,9 +17,14 @@ package com.syncleus.aethermud.command.commands.admin;
import com.syncleus.aethermud.command.commands.Command;
import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.merchant.MerchantMetadata;
+import com.syncleus.aethermud.merchant.Merchant;
+import com.syncleus.aethermud.merchant.MerchantItemForSale;
+import com.syncleus.aethermud.storage.AetherMudStorage;
+import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
+import com.syncleus.aethermud.storage.graphdb.model.MerchantData;
import com.syncleus.aethermud.player.PlayerRole;
import com.google.common.collect.Sets;
+import com.syncleus.aethermud.storage.graphdb.model.MerchantItemForSaleData;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
@@ -79,17 +84,32 @@ public class LoadMerchantCommand extends Command {
String npcJson = EntityUtils.toString(entity);
- MerchantMetadata merchantMetadata = null;
+ Merchant merchant = null;
try {
- merchantMetadata = gameManager.getGson().fromJson(npcJson, MerchantMetadata.class);
+ merchant = gameManager.getGson().fromJson(npcJson, Merchant.class);
} catch (Exception ex) {
write("Retrieved JSON file is malformed. " + ex.getLocalizedMessage() + "\r\n");
return;
}
httpGet.reset();
- gameManager.getMerchantStorage().saveMerchantMetadata(merchantMetadata);
- write("Merchant Saved. - " + merchantMetadata.getInternalName() + "\r\n");
+ try( GraphStorageFactory.AetherMudTx tx = this.gameManager.getGraphStorageFactory().beginTransaction() ) {
+ AetherMudStorage storage = tx.getStorage();
+ MerchantData merchantData = storage.newMerchantData();
+ merchantData.setInternalName(merchant.internalName);
+ merchantData.setName(merchant.name);
+ merchantData.setColorName(merchant.colorName);
+ merchantData.setValidTriggers(merchant.validTriggers);
+ for(MerchantItemForSale item : merchant.merchantItemForSales) {
+ MerchantItemForSaleData itemData = merchantData.createMerchantItemForSaleData();
+ MerchantItemForSaleData.copyMerchantItemForSale(itemData, item);
+ }
+ merchantData.setWelcomeMessage(merchant.welcomeMessage);
+ merchantData.setMerchantType(merchant.merchantType);
+ merchantData.setRoomIds(merchant.roomIds);
+ tx.success();
+ write("Merchant Saved. - " + merchant.name + "\r\n");
+ }
});
}
@@ -109,5 +129,15 @@ public class LoadMerchantCommand extends Command {
return true;
}
+ private static class Merchant {
+ public String internalName;
+ public String name;
+ public String colorName;
+ public Set<String> validTriggers;
+ public List<MerchantItemForSale> merchantItemForSales;
+ public String welcomeMessage;
+ public com.syncleus.aethermud.merchant.Merchant.MerchantType merchantType;
+ public Set<Integer> roomIds;
+ }
}
diff --git a/src/main/java/com/syncleus/aethermud/configuration/ConfigureNpc.java b/src/main/java/com/syncleus/aethermud/configuration/ConfigureNpc.java
index 19ee41dc6a675e7dbf199899daafa7a0bdb7677b..16e249b3deaf87f1a74cd19fb3b18e0b38498cfe 100644
--- a/src/main/java/com/syncleus/aethermud/configuration/ConfigureNpc.java
+++ b/src/main/java/com/syncleus/aethermud/configuration/ConfigureNpc.java
@@ -28,9 +28,11 @@ import com.syncleus.aethermud.spawner.NpcSpawner;
import com.syncleus.aethermud.spawner.SpawnRule;
import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
import com.syncleus.aethermud.storage.graphdb.model.ItemData;
+import com.syncleus.aethermud.storage.graphdb.model.MerchantData;
import java.io.IOException;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
public class ConfigureNpc {
@@ -75,11 +77,14 @@ public class ConfigureNpc {
}
}
- List<Merchant> allMerchantMetadatas = gameManager.getMerchantStorage().getAllMerchants();
+ List<Merchant> allMerchantMetadatas;
+ try( GraphStorageFactory.AetherMudTx tx = gameManager.getGraphStorageFactory().beginTransaction() ) {
+ allMerchantMetadatas = tx.getStorage().getAllMerchants(gameManager);
+ }
+
for (Merchant merchant : allMerchantMetadatas) {
Main.startUpMessage("Adding merchant: " + merchant.getInternalName());
gameManager.getRoomManager().addMerchant(merchant);
}
-
}
}
diff --git a/src/main/java/com/syncleus/aethermud/core/GameManager.java b/src/main/java/com/syncleus/aethermud/core/GameManager.java
index 32eca58eb58435e534a805f589b52428b27ed71b..eb3c2e66c66e911e1b2aa224e0b47773e6556c0a 100644
--- a/src/main/java/com/syncleus/aethermud/core/GameManager.java
+++ b/src/main/java/com/syncleus/aethermud/core/GameManager.java
@@ -104,15 +104,8 @@ public class GameManager {
private final Room detainmentRoom;
private final HttpClient httpclient;
private final Gson gson;
- private final FilebasedJsonStorage filebasedJsonStorage;
private final GraphStorageFactory graphStorageFactory;
- public MerchantStorage getMerchantStorage() {
- return merchantStorage;
- }
-
- private final MerchantStorage merchantStorage;
-
public GameManager(GraphStorageFactory graphStorageFactory, AetherMudConfiguration aetherMudConfiguration, RoomManager roomManager, PlayerManager playerManager, EntityManager entityManager, MapsManager mapsManager, ChannelCommunicationUtils channelUtils, HttpClient httpClient) {
this.graphStorageFactory = graphStorageFactory;
@@ -143,8 +136,6 @@ public class GameManager {
this.eventProcessor.startAsync();
this.detainmentRoom = buildDetainmentRoom();
this.gson = new GsonBuilder().setPrettyPrinting().create();
- this.filebasedJsonStorage = new FilebasedJsonStorage(gson);
- this.merchantStorage = new MerchantStorage(this, filebasedJsonStorage);
this.httpclient = httpClient;
}
diff --git a/src/main/java/com/syncleus/aethermud/merchant/MerchantMetadata.java b/src/main/java/com/syncleus/aethermud/merchant/MerchantMetadata.java
deleted file mode 100644
index f0c0d786a738b704a835300384861d11024067bb..0000000000000000000000000000000000000000
--- a/src/main/java/com/syncleus/aethermud/merchant/MerchantMetadata.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * 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.merchant;
-
-import java.util.List;
-import java.util.Set;
-
-public class MerchantMetadata {
-
- private String internalName;
- private Set<Integer> roomIds;
- private String name;
- private String colorName;
- private Set<String> validTriggers;
- private List<MerchantItemForSale> merchantItemForSales;
- private String welcomeMessage;
- private Merchant.MerchantType merchantType;
-
- public void setMerchantType(Merchant.MerchantType merchantType) {
- this.merchantType = merchantType;
- }
-
- public Set<Integer> getRoomIds() {
-
- return roomIds;
- }
-
- public Merchant.MerchantType getMerchantType() {
- return merchantType;
- }
-
- public String getInternalName() {
- return internalName;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getColorName() {
- return colorName;
- }
-
- public void setColorName(String colorName) {
- this.colorName = colorName;
- }
-
- public Set<String> getValidTriggers() {
- return validTriggers;
- }
-
- public void setValidTriggers(Set<String> validTriggers) {
- this.validTriggers = validTriggers;
- }
-
- public List<MerchantItemForSale> getMerchantItemForSales() {
- return merchantItemForSales;
- }
-
- public void setInternalName(String internalName) {
- this.internalName = internalName;
- }
-
- public Set<Integer> getRoomId() {
- return roomIds;
- }
-
- public void setRoomIds(Set<Integer> roomIds) {
- this.roomIds = roomIds;
- }
-
- public void setMerchantItemForSales(List<MerchantItemForSale> merchantItemForSales) {
- this.merchantItemForSales = merchantItemForSales;
-
- }
-
- public String getWelcomeMessage() {
- return welcomeMessage;
- }
-
- public void setWelcomeMessage(String welcomeMessage) {
- this.welcomeMessage = welcomeMessage;
- }
-}
diff --git a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
index f19d20a08a58b3bc0c559d88ceb3af6f811eee46..4aca914dbbd5e7050a9512db2754e0b2a69c4a75 100644
--- a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
@@ -19,11 +19,9 @@ package com.syncleus.aethermud.storage;
import com.syncleus.aethermud.core.GameManager;
import com.syncleus.aethermud.items.Item;
import com.syncleus.aethermud.items.ItemInstance;
+import com.syncleus.aethermud.merchant.Merchant;
import com.syncleus.aethermud.npc.NpcSpawn;
-import com.syncleus.aethermud.storage.graphdb.model.ItemData;
-import com.syncleus.aethermud.storage.graphdb.model.ItemInstanceData;
-import com.syncleus.aethermud.storage.graphdb.model.NpcData;
-import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
+import com.syncleus.aethermud.storage.graphdb.model.*;
import java.util.List;
import java.util.Map;
@@ -59,4 +57,13 @@ public interface AetherMudStorage {
GraphInfo getGraphInfo();
+ List<? extends MerchantData> getMerchantDatas();
+
+ List<Merchant> getAllMerchants(GameManager gameManager);
+
+ Merchant createMerchant(GameManager gameManager, MerchantData merchantData);
+
+ Optional<MerchantData> getMerchantData(String internalName);
+
+ MerchantData newMerchantData();
}
diff --git a/src/main/java/com/syncleus/aethermud/storage/MerchantStorage.java b/src/main/java/com/syncleus/aethermud/storage/MerchantStorage.java
deleted file mode 100644
index 899d747d838917df6b5da34bb5d92b8d9e2d0960..0000000000000000000000000000000000000000
--- a/src/main/java/com/syncleus/aethermud/storage/MerchantStorage.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * 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;
-
-import com.syncleus.aethermud.common.ColorizedTextTemplate;
-import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.merchant.Merchant;
-import com.syncleus.aethermud.merchant.MerchantMetadata;
-import org.apache.log4j.Logger;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-public class MerchantStorage {
-
- public final static String LOCAL_MERCHANT_DIRECTORY = "world/merchants/";
-
- private static final Logger log = Logger.getLogger(MerchantStorage.class);
- private final FilebasedJsonStorage filebasedJsonStorage;
- private final GameManager gameManager;
- private final List<MerchantMetadata> merchantMetadatas;
-
- public MerchantStorage(GameManager gameManager, FilebasedJsonStorage filebasedJsonStorage) {
- this.gameManager = gameManager;
- this.filebasedJsonStorage = filebasedJsonStorage;
- this.merchantMetadatas = getAllMerchantMetadata();
- }
-
- private List<MerchantMetadata> getAllMerchantMetadata() {
- return filebasedJsonStorage.readAllMetadatas(LOCAL_MERCHANT_DIRECTORY, true, new MerchantMetadata()).stream()
- .map(merchantMetadata -> {
- merchantMetadata.setColorName(ColorizedTextTemplate.renderFromTemplateLanguage(merchantMetadata.getColorName()));
- merchantMetadata.setWelcomeMessage(ColorizedTextTemplate.renderFromTemplateLanguage(merchantMetadata.getWelcomeMessage()));
- return merchantMetadata;
- }).collect(Collectors.toList());
- }
-
- public List<MerchantMetadata> getMerchantMetadatas() {
- return merchantMetadatas;
- }
-
- public List<Merchant> getAllMerchants() {
- return merchantMetadatas.stream()
- .map(this::create)
- .collect(Collectors.toList());
- }
-
- public Merchant create(MerchantMetadata merchantMetadata) {
-
- if (merchantMetadata.getMerchantType() != null) {
- return new Merchant(gameManager,
- merchantMetadata.getInternalName(),
- merchantMetadata.getName(),
- merchantMetadata.getColorName(),
- merchantMetadata.getValidTriggers(),
- merchantMetadata.getMerchantItemForSales(),
- merchantMetadata.getWelcomeMessage(),
- merchantMetadata.getRoomId(),
- merchantMetadata.getMerchantType());
- }
-
- return new Merchant(gameManager,
- merchantMetadata.getInternalName(),
- merchantMetadata.getName(),
- merchantMetadata.getColorName(),
- merchantMetadata.getValidTriggers(),
- merchantMetadata.getMerchantItemForSales(),
- merchantMetadata.getWelcomeMessage(),
- merchantMetadata.getRoomId());
- }
-
- public void saveMerchantMetadata(MerchantMetadata merchantMetadata) throws IOException {
- merchantMetadata.setColorName(ColorizedTextTemplate.renderToTemplateLanguage(merchantMetadata.getColorName()));
- merchantMetadata.setWelcomeMessage(ColorizedTextTemplate.renderToTemplateLanguage(merchantMetadata.getWelcomeMessage()));
- filebasedJsonStorage.saveMetadata(merchantMetadata.getInternalName(), LOCAL_MERCHANT_DIRECTORY, merchantMetadata);
- }
-
- public Optional<MerchantMetadata> get(String internalName) {
- return merchantMetadatas.stream()
- .filter(merchantMetadata -> merchantMetadata.getInternalName().equals(internalName))
- .findFirst();
- }
-
-}
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
index 2ca865aa6fcd541b519d5786baa8d5e592e53c9c..40159416150777fcefadc04fec0dbc9c381dee53 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
@@ -20,14 +20,12 @@ import com.google.common.collect.Interners;
import com.syncleus.aethermud.core.GameManager;
import com.syncleus.aethermud.items.Item;
import com.syncleus.aethermud.items.ItemInstance;
+import com.syncleus.aethermud.merchant.Merchant;
import com.syncleus.aethermud.npc.NpcBuilder;
import com.syncleus.aethermud.npc.NpcSpawn;
import com.syncleus.aethermud.storage.AetherMudStorage;
import com.syncleus.aethermud.storage.GraphInfo;
-import com.syncleus.aethermud.storage.graphdb.model.ItemData;
-import com.syncleus.aethermud.storage.graphdb.model.ItemInstanceData;
-import com.syncleus.aethermud.storage.graphdb.model.NpcData;
-import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
+import com.syncleus.aethermud.storage.graphdb.model.*;
import com.syncleus.ferma.VertexFrame;
import com.syncleus.ferma.WrappedFramedGraph;
import org.apache.log4j.Logger;
@@ -156,4 +154,44 @@ public class GraphDbAetherMudStorage implements AetherMudStorage {
public NpcData newNpcData() {
return framedGraph.addFramedVertex(NpcData.class);
}
+
+ public List<? extends MerchantData> getMerchantDatas() {
+ return framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), MerchantData.class)).toList(MerchantData.class);
+ }
+
+ public List<Merchant> getAllMerchants(GameManager gameManager) {
+ return this.getMerchantDatas().stream().map(m -> this.createMerchant(gameManager, m)).collect(Collectors.toList());
+ }
+
+ public Merchant createMerchant(GameManager gameManager, MerchantData merchantData) {
+ if (merchantData.getMerchantType() != null) {
+ return new Merchant(gameManager,
+ merchantData.getInternalName(),
+ merchantData.getName(),
+ merchantData.getColorName(),
+ merchantData.getValidTriggers(),
+ merchantData.getMerchantItemForSaleDatas().stream().map(m -> MerchantItemForSaleData.copyMerchantItemForSale(m)).collect(Collectors.toList()),
+ merchantData.getWelcomeMessage(),
+ merchantData.getRoomIds(),
+ merchantData.getMerchantType());
+ }
+
+ return new Merchant(gameManager,
+ merchantData.getInternalName(),
+ merchantData.getName(),
+ merchantData.getColorName(),
+ merchantData.getValidTriggers(),
+ merchantData.getMerchantItemForSaleDatas().stream().map(m -> MerchantItemForSaleData.copyMerchantItemForSale(m)).collect(Collectors.toList()),
+ merchantData.getWelcomeMessage(),
+ merchantData.getRoomIds());
+ }
+
+ public Optional<MerchantData> getMerchantData(String internalName) {
+ MerchantData data = framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), MerchantData.class).property("internalName", internalName)).nextOrDefault(MerchantData.class,null);
+ return Optional.ofNullable(data);
+ }
+
+ public MerchantData newMerchantData() {
+ return framedGraph.addFramedVertex(MerchantData.class);
+ }
}
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/MerchantData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/MerchantData.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe721c1b7773c55cb6901b2291ccd5336629a847
--- /dev/null
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/MerchantData.java
@@ -0,0 +1,120 @@
+/**
+ * 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.google.common.collect.Lists;
+import com.syncleus.aethermud.common.AetherMudMessage;
+import com.syncleus.aethermud.common.ColorizedTextTemplate;
+import com.syncleus.aethermud.merchant.Merchant;
+import com.syncleus.aethermud.merchant.MerchantItemForSale;
+import com.syncleus.aethermud.npc.Npc;
+import com.syncleus.aethermud.spawner.SpawnRule;
+import com.syncleus.aethermud.storage.graphdb.DataUtils;
+import com.syncleus.ferma.annotations.Adjacency;
+import com.syncleus.ferma.annotations.GraphElement;
+import com.syncleus.ferma.annotations.Property;
+import com.syncleus.ferma.ext.AbstractInterceptingVertexFrame;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+@GraphElement
+public abstract class MerchantData extends AbstractInterceptingVertexFrame {
+
+ @Property("merchantType")
+ public abstract void setMerchantType(Merchant.MerchantType merchantType);
+
+ @Property("merchantType")
+ public abstract Merchant.MerchantType getMerchantType();
+
+ @Property("internalName")
+ public abstract String getInternalName();
+
+ @Property("internalName")
+ public abstract void setInternalName(String internalName);
+
+ @Property("name")
+ public abstract String getName();
+
+ @Property("name")
+ public abstract void setName(String name);
+
+ public String getColorName() {
+ return ColorizedTextTemplate.renderFromTemplateLanguage(this.getProperty("colorName"));
+ }
+
+ public void setColorName(String colorName) {
+ this.setProperty("colorName", ColorizedTextTemplate.renderToTemplateLanguage(colorName));
+ }
+
+ @Property("validTriggers")
+ public abstract Set<String> getValidTriggers();
+
+ @Property("validTriggers")
+ public abstract void setValidTriggers(Set<String> validTriggers);
+
+ @Property("roomIds")
+ public abstract Set<Integer> getRoomIds();
+
+ @Property("roomIds")
+ public abstract void setRoomIds(Set<Integer> roomIds);
+
+ @Property("welcomeMessage")
+ public abstract String getWelcomeMessage();
+
+ @Property("welcomeMessage")
+ public abstract void setWelcomeMessage(String welcomeMessage);
+
+ @Adjacency(label = "merchantItemForSales", direction = Direction.OUT)
+ public abstract <N extends MerchantItemForSaleData> Iterator<? extends N> getMerchantItemForSaleDataIterator(Class<? extends N> type);
+
+ public List<MerchantItemForSaleData> getMerchantItemForSaleDatas() {
+ return Lists.newArrayList(this.getMerchantItemForSaleDataIterator(MerchantItemForSaleData.class));
+ }
+
+ @Adjacency(label = "merchantItemForSales", direction = Direction.OUT)
+ public abstract void addMerchantItemForSaleData(MerchantItemForSaleData item);
+
+ @Adjacency(label = "merchantItemForSales", direction = Direction.OUT)
+ public abstract void removeMerchantItemForSaleData(MerchantItemForSaleData item);
+
+ public void setMerchantItemForSaleDatas(List<MerchantItemForSaleData> items) {
+ DataUtils.setAllElements(items, () -> this.getMerchantItemForSaleDataIterator(MerchantItemForSaleData.class), item -> this.addMerchantItemForSaleData(item), () -> this.createMerchantItemForSaleData() );
+ }
+
+ public MerchantItemForSaleData createMerchantItemForSaleData() {
+ MerchantItemForSaleData item = this.getGraph().addFramedVertex(MerchantItemForSaleData.class);
+ this.addMerchantItemForSaleData(item);
+ return item;
+ }
+
+ public static void copyMerchant(MerchantData dest, Merchant src) {
+ try {
+ PropertyUtils.copyProperties(dest, src);
+
+ for(MerchantItemForSaleData data : dest.getMerchantItemForSaleDatas())
+ data.remove();
+ for(MerchantItemForSale item : src.getMerchantItemForSales())
+ MerchantItemForSaleData.copyMerchantItemForSale(dest.createMerchantItemForSaleData(), item);
+ } 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/MerchantItemForSaleData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/MerchantItemForSaleData.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb2f5a4c54c86355e5cc0285287c75555605d2e4
--- /dev/null
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/MerchantItemForSaleData.java
@@ -0,0 +1,51 @@
+/**
+ * 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.merchant.MerchantItemForSale;
+import com.syncleus.ferma.annotations.GraphElement;
+import com.syncleus.ferma.annotations.Property;
+import com.syncleus.ferma.ext.AbstractInterceptingVertexFrame;
+import org.apache.commons.beanutils.PropertyUtils;
+
+import java.lang.reflect.InvocationTargetException;
+
+@GraphElement
+public abstract class MerchantItemForSaleData extends AbstractInterceptingVertexFrame {
+ @Property("internalName")
+ public abstract String getInternalItemName();
+
+ @Property("internalName")
+ public abstract void setInternalItemName(String internalName);
+
+ @Property("cost")
+ public abstract int getCost();
+
+ @Property("cost")
+ public abstract void setCost(int cost);
+
+ public static void copyMerchantItemForSale(MerchantItemForSaleData dest, MerchantItemForSale src) {
+ try {
+ PropertyUtils.copyProperties(dest, src);
+ } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+ throw new IllegalStateException("Could not copy properties", e);
+ }
+ }
+
+ public static MerchantItemForSale copyMerchantItemForSale(MerchantItemForSaleData src) {
+ return new MerchantItemForSale(src.getInternalItemName(), src.getCost());
+ }
+}