diff --git a/src/com/massivecraft/mcore4/MCore.java b/src/com/massivecraft/mcore4/MCore.java index 642dc144..7dfd9442 100644 --- a/src/com/massivecraft/mcore4/MCore.java +++ b/src/com/massivecraft/mcore4/MCore.java @@ -11,10 +11,11 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; +import com.massivecraft.mcore4.adapter.InventoryAdapter; +import com.massivecraft.mcore4.adapter.ItemStackAdapter; +import com.massivecraft.mcore4.adapter.MongoURIAdapter; import com.massivecraft.mcore4.cmd.Cmd; -import com.massivecraft.mcore4.gson.InventoryTypeAdapter; -import com.massivecraft.mcore4.gson.ItemStackAdapter; -import com.massivecraft.mcore4.gson.MongoURIAdapter; +import com.massivecraft.mcore4.lib.gson.Gson; import com.massivecraft.mcore4.lib.gson.GsonBuilder; import com.massivecraft.mcore4.lib.mongodb.MongoURI; import com.massivecraft.mcore4.persist.One; @@ -30,6 +31,7 @@ public class MCore extends JavaPlugin // -------------------------------------------- // // PERSIST // -------------------------------------------- // + private static Map persistInstances = new HashMap(); public static Map getPersistInstances() { return persistInstances; } public static Persist getPersist(Object owner) { return persistInstances.get(owner); } @@ -84,8 +86,7 @@ public class MCore extends JavaPlugin // -------------------------------------------- // public static Random random = new Random(); - - + public static Gson gson = getGsonBuilder().create(); @Override public void onDisable() @@ -117,7 +118,7 @@ public class MCore extends JavaPlugin .excludeFieldsWithModifiers(Modifier.TRANSIENT) .registerTypeAdapter(MongoURI.class, MongoURIAdapter.get()) .registerTypeAdapter(ItemStack.class, new ItemStackAdapter()) - .registerTypeAdapter(Inventory.class, new InventoryTypeAdapter()); + .registerTypeAdapter(Inventory.class, new InventoryAdapter()); } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore4/gson/InventoryTypeAdapter.java b/src/com/massivecraft/mcore4/adapter/InventoryAdapter.java similarity index 61% rename from src/com/massivecraft/mcore4/gson/InventoryTypeAdapter.java rename to src/com/massivecraft/mcore4/adapter/InventoryAdapter.java index 6cb00e31..5a992952 100644 --- a/src/com/massivecraft/mcore4/gson/InventoryTypeAdapter.java +++ b/src/com/massivecraft/mcore4/adapter/InventoryAdapter.java @@ -1,4 +1,4 @@ -package com.massivecraft.mcore4.gson; +package com.massivecraft.mcore4.adapter; import java.lang.reflect.Type; @@ -14,8 +14,9 @@ import com.massivecraft.mcore4.lib.gson.JsonParseException; import com.massivecraft.mcore4.lib.gson.JsonPrimitive; import com.massivecraft.mcore4.lib.gson.JsonSerializationContext; import com.massivecraft.mcore4.lib.gson.JsonSerializer; +import com.massivecraft.mcore4.lib.mongodb.BasicDBObject; -public class InventoryTypeAdapter implements JsonDeserializer, JsonSerializer +public class InventoryAdapter implements JsonDeserializer, JsonSerializer { // -------------------------------------------- // // FIELD NAME CONSTANTS @@ -30,20 +31,20 @@ public class InventoryTypeAdapter implements JsonDeserializer, JsonSe @Override public JsonElement serialize(Inventory src, Type typeOfSrc, JsonSerializationContext context) { - return serialize(src); + return toJson(src); } @Override public Inventory deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return deserialize(json); + return fromJson(json); } // -------------------------------------------- // - // STATIC LOGIC + // JSON // -------------------------------------------- // - public static JsonElement serialize(Inventory src) + public static JsonElement toJson(Inventory src) { JsonObject jsonInventory = new JsonObject(); ItemStack[] itemStacks = src.getContents(); @@ -52,7 +53,7 @@ public class InventoryTypeAdapter implements JsonDeserializer, JsonSe for (int i = 0; i < itemStacks.length; i++) { ItemStack itemStack = itemStacks[i]; - JsonObject jsonItemStack = ItemStackAdapter.serialize(itemStack); + JsonObject jsonItemStack = ItemStackAdapter.toJson(itemStack); if (jsonItemStack == null) continue; jsonInventory.add(String.valueOf(i), jsonItemStack); } @@ -60,7 +61,7 @@ public class InventoryTypeAdapter implements JsonDeserializer, JsonSe return jsonInventory; } - public static Inventory deserialize(JsonElement json) + public static Inventory fromJson(JsonElement json) { if ( ! json.isJsonObject()) return null; JsonObject jsonInventory = json.getAsJsonObject(); @@ -75,7 +76,49 @@ public class InventoryTypeAdapter implements JsonDeserializer, JsonSe // Fetch the jsonItemStack or mark it as empty and continue String stackIdx = String.valueOf(i); JsonElement jsonItemStack = jsonInventory.get(stackIdx); - ItemStack itemStack = ItemStackAdapter.deserialize(jsonItemStack); + ItemStack itemStack = ItemStackAdapter.fromJson(jsonItemStack); + itemStacks[i] = itemStack; + } + + Inventory ret = new CraftInventoryCustom(null, size, "items"); + ret.setContents(itemStacks); + return ret; + } + + // -------------------------------------------- // + // BSON + // -------------------------------------------- // + + public static BasicDBObject toBson(Inventory src) + { + BasicDBObject bsonInventory = new BasicDBObject(); + ItemStack[] itemStacks = src.getContents(); + bsonInventory.put(SIZE, itemStacks.length); + + for (int i = 0; i < itemStacks.length; i++) + { + ItemStack itemStack = itemStacks[i]; + BasicDBObject bsonItemStack = ItemStackAdapter.toBson(itemStack); + if (bsonItemStack == null) continue; + bsonInventory.put(String.valueOf(i), bsonItemStack); + } + + return bsonInventory; + } + + public static Inventory fromBson(BasicDBObject bsonInventory) + { + if ( ! bsonInventory.containsField(SIZE)) return null; + int size = bsonInventory.getInt(SIZE); + + ItemStack[] itemStacks = new ItemStack[size]; + + for (int i = 0; i < size; i++) + { + // Fetch the jsonItemStack or mark it as empty and continue + String stackIdx = String.valueOf(i); + BasicDBObject bsonItemStack = (BasicDBObject) bsonInventory.get(stackIdx); + ItemStack itemStack = ItemStackAdapter.fromBson(bsonItemStack); itemStacks[i] = itemStack; } diff --git a/src/com/massivecraft/mcore4/gson/ItemStackAdapter.java b/src/com/massivecraft/mcore4/adapter/ItemStackAdapter.java similarity index 58% rename from src/com/massivecraft/mcore4/gson/ItemStackAdapter.java rename to src/com/massivecraft/mcore4/adapter/ItemStackAdapter.java index 6ac27284..50076e07 100644 --- a/src/com/massivecraft/mcore4/gson/ItemStackAdapter.java +++ b/src/com/massivecraft/mcore4/adapter/ItemStackAdapter.java @@ -1,4 +1,4 @@ -package com.massivecraft.mcore4.gson; +package com.massivecraft.mcore4.adapter; import java.lang.reflect.Type; import java.util.Map.Entry; @@ -13,6 +13,7 @@ import com.massivecraft.mcore4.lib.gson.JsonObject; import com.massivecraft.mcore4.lib.gson.JsonParseException; import com.massivecraft.mcore4.lib.gson.JsonSerializationContext; import com.massivecraft.mcore4.lib.gson.JsonSerializer; +import com.massivecraft.mcore4.lib.mongodb.BasicDBObject; public class ItemStackAdapter implements JsonDeserializer, JsonSerializer { @@ -32,20 +33,20 @@ public class ItemStackAdapter implements JsonDeserializer, JsonSerial @Override public JsonElement serialize(ItemStack itemStack, Type typeOfSrc, JsonSerializationContext context) { - return serialize(itemStack); + return toJson(itemStack); } @Override public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return deserialize(json); + return fromJson(json); } // -------------------------------------------- // - // STATIC LOGIC + // JSON // -------------------------------------------- // - public static JsonObject serialize(ItemStack itemStack) + public static JsonObject toJson(ItemStack itemStack) { if (itemStack == null || itemStack.getTypeId() == 0 || itemStack.getAmount() == 0) { @@ -76,7 +77,7 @@ public class ItemStackAdapter implements JsonDeserializer, JsonSerial return jsonItemStack; } - public static ItemStack deserialize(JsonElement json) + public static ItemStack fromJson(JsonElement json) { if (json == null || ! json.isJsonObject()) return null; @@ -119,4 +120,83 @@ public class ItemStackAdapter implements JsonDeserializer, JsonSerial return stack; } + + // -------------------------------------------- // + // BSON + // -------------------------------------------- // + + public static BasicDBObject toBson(ItemStack itemStack) + { + if (itemStack == null || itemStack.getTypeId() == 0 || itemStack.getAmount() == 0) + { + return null; + } + + BasicDBObject bsonItemStack = new BasicDBObject(); + + bsonItemStack.put(TYPE, itemStack.getTypeId()); + + if (itemStack.getAmount() != 1) + { + bsonItemStack.put(AMOUNT, itemStack.getAmount()); + } + if (itemStack.getDurability() != 0) // Durability is a weird name since it is the amount of damage. + { + bsonItemStack.put(DAMAGE, itemStack.getDurability()); + } + if (itemStack.getEnchantments().size() > 0) + { + BasicDBObject bsonEnchantments = new BasicDBObject(); + for (Entry entry : itemStack.getEnchantments().entrySet()) + { + bsonEnchantments.put(String.valueOf(entry.getKey().getId()), entry.getValue()); + } + bsonItemStack.put(ENCHANTMENTS, bsonEnchantments); + } + + return bsonItemStack; + } + + public static ItemStack fromBson(BasicDBObject bsonItemStack) + { + if (bsonItemStack == null) return null; + + // Populate values + int type = 0; + int amount = 1; + short damage = 0; + + if (bsonItemStack.containsField(TYPE)) + { + type = bsonItemStack.getInt(TYPE); + } + + if (bsonItemStack.containsField(AMOUNT)) + { + amount = bsonItemStack.getInt(AMOUNT); + } + + if (bsonItemStack.containsField(DAMAGE)) + { + damage = (short) bsonItemStack.getInt(DAMAGE); + } + + // Create Non enchanted stack + ItemStack stack = new ItemStack(type, amount, damage); + + // Add enchantments if there are any + if (bsonItemStack.containsField(ENCHANTMENTS)) + { + BasicDBObject bsonEnchantments = (BasicDBObject) bsonItemStack.get(ENCHANTMENTS); + + for (Entry enchantmentEntry: bsonEnchantments.entrySet()) + { + int enchantmentId = Integer.valueOf(enchantmentEntry.getKey()); + Integer enchantmentLevel = (Integer) enchantmentEntry.getValue(); + stack.addUnsafeEnchantment(Enchantment.getById(enchantmentId), enchantmentLevel); + } + } + + return stack; + } } diff --git a/src/com/massivecraft/mcore4/gson/MongoURIAdapter.java b/src/com/massivecraft/mcore4/adapter/MongoURIAdapter.java similarity index 94% rename from src/com/massivecraft/mcore4/gson/MongoURIAdapter.java rename to src/com/massivecraft/mcore4/adapter/MongoURIAdapter.java index 2a566799..477516e9 100644 --- a/src/com/massivecraft/mcore4/gson/MongoURIAdapter.java +++ b/src/com/massivecraft/mcore4/adapter/MongoURIAdapter.java @@ -1,4 +1,4 @@ -package com.massivecraft.mcore4.gson; +package com.massivecraft.mcore4.adapter; import java.lang.reflect.Type; diff --git a/src/com/massivecraft/mcore4/mongodb/InventoryTypeAdapter.java b/src/com/massivecraft/mcore4/mongodb/InventoryTypeAdapter.java deleted file mode 100644 index fd13a77d..00000000 --- a/src/com/massivecraft/mcore4/mongodb/InventoryTypeAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.massivecraft.mcore4.mongodb; - -import org.bukkit.craftbukkit.inventory.CraftInventoryCustom; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import com.massivecraft.mcore4.lib.mongodb.BasicDBObject; - -public class InventoryTypeAdapter -{ - // -------------------------------------------- // - // FIELD NAME CONSTANTS - // -------------------------------------------- // - - public static final String SIZE = "size"; - - // -------------------------------------------- // - // STATIC LOGIC - // -------------------------------------------- // - - public static BasicDBObject serialize(Inventory src) - { - BasicDBObject bsonInventory = new BasicDBObject(); - ItemStack[] itemStacks = src.getContents(); - bsonInventory.put(SIZE, itemStacks.length); - - for (int i = 0; i < itemStacks.length; i++) - { - ItemStack itemStack = itemStacks[i]; - BasicDBObject bsonItemStack = ItemStackAdapter.serialize(itemStack); - if (bsonItemStack == null) continue; - bsonInventory.put(String.valueOf(i), bsonItemStack); - } - - return bsonInventory; - } - - public static Inventory deserialize(BasicDBObject bsonInventory) - { - if ( ! bsonInventory.containsField(SIZE)) return null; - int size = bsonInventory.getInt(SIZE); - - ItemStack[] itemStacks = new ItemStack[size]; - - for (int i = 0; i < size; i++) - { - // Fetch the jsonItemStack or mark it as empty and continue - String stackIdx = String.valueOf(i); - BasicDBObject bsonItemStack = (BasicDBObject) bsonInventory.get(stackIdx); - ItemStack itemStack = ItemStackAdapter.deserialize(bsonItemStack); - itemStacks[i] = itemStack; - } - - Inventory ret = new CraftInventoryCustom(null, size, "items"); - ret.setContents(itemStacks); - return ret; - } - - // -------------------------------------------- // - // UTIL - // -------------------------------------------- // - - // This utility is nice to have in many cases :) - public static boolean isInventoryEmpty(Inventory inv) - { - if (inv == null) return true; - for (ItemStack stack : inv.getContents()) - { - if (stack == null) continue; - if (stack.getAmount() == 0) continue; - if (stack.getTypeId() == 0) continue; - return false; - } - return true; - } -} \ No newline at end of file diff --git a/src/com/massivecraft/mcore4/mongodb/ItemStackAdapter.java b/src/com/massivecraft/mcore4/mongodb/ItemStackAdapter.java deleted file mode 100644 index 96353133..00000000 --- a/src/com/massivecraft/mcore4/mongodb/ItemStackAdapter.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.massivecraft.mcore4.mongodb; - -import java.util.Map.Entry; - -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; - -import com.massivecraft.mcore4.lib.mongodb.BasicDBObject; - -public class ItemStackAdapter -{ - // -------------------------------------------- // - // FIELD NAME CONSTANTS - // -------------------------------------------- // - - public static final String TYPE = "type"; - public static final String AMOUNT = "amount"; - public static final String DAMAGE = "damage"; - public static final String ENCHANTMENTS = "enchantments"; - - // -------------------------------------------- // - // STATIC LOGIC - // -------------------------------------------- // - - public static BasicDBObject serialize(ItemStack itemStack) - { - if (itemStack == null || itemStack.getTypeId() == 0 || itemStack.getAmount() == 0) - { - return null; - } - - BasicDBObject bsonItemStack = new BasicDBObject(); - - bsonItemStack.put(TYPE, itemStack.getTypeId()); - - if (itemStack.getAmount() != 1) - { - bsonItemStack.put(AMOUNT, itemStack.getAmount()); - } - if (itemStack.getDurability() != 0) // Durability is a weird name since it is the amount of damage. - { - bsonItemStack.put(DAMAGE, itemStack.getDurability()); - } - if (itemStack.getEnchantments().size() > 0) - { - BasicDBObject bsonEnchantments = new BasicDBObject(); - for (Entry entry : itemStack.getEnchantments().entrySet()) - { - bsonEnchantments.put(String.valueOf(entry.getKey().getId()), entry.getValue()); - } - bsonItemStack.put(ENCHANTMENTS, bsonEnchantments); - } - - return bsonItemStack; - } - - public static ItemStack deserialize(BasicDBObject bsonItemStack) - { - if (bsonItemStack == null) return null; - - // Populate values - int type = 0; - int amount = 1; - short damage = 0; - - if (bsonItemStack.containsField(TYPE)) - { - type = bsonItemStack.getInt(TYPE); - } - - if (bsonItemStack.containsField(AMOUNT)) - { - amount = bsonItemStack.getInt(AMOUNT); - } - - if (bsonItemStack.containsField(DAMAGE)) - { - damage = (short) bsonItemStack.getInt(DAMAGE); - } - - // Create Non enchanted stack - ItemStack stack = new ItemStack(type, amount, damage); - - // Add enchantments if there are any - if (bsonItemStack.containsField(ENCHANTMENTS)) - { - BasicDBObject bsonEnchantments = (BasicDBObject) bsonItemStack.get(ENCHANTMENTS); - - for (Entry enchantmentEntry: bsonEnchantments.entrySet()) - { - int enchantmentId = Integer.valueOf(enchantmentEntry.getKey()); - Integer enchantmentLevel = (Integer) enchantmentEntry.getValue(); - stack.addUnsafeEnchantment(Enchantment.getById(enchantmentId), enchantmentLevel); - } - } - - return stack; - } -} diff --git a/src/com/massivecraft/mcore4/persist/Persist.java b/src/com/massivecraft/mcore4/persist/Persist.java index 59f1f5f0..7d43495a 100644 --- a/src/com/massivecraft/mcore4/persist/Persist.java +++ b/src/com/massivecraft/mcore4/persist/Persist.java @@ -1,13 +1,5 @@ package com.massivecraft.mcore4.persist; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -81,53 +73,6 @@ public class Persist // UTILS // -------------------------------------------- // - public static void write(File file, String content) throws IOException - { - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, false), "UTF8")); - out.write(content); - out.close(); - } - - public static String read(File file) throws IOException - { - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); - String ret = new String(new byte[0], "UTF-8"); - - String line; - while ((line = in.readLine()) != null) - { - ret += line; - } - - in.close(); - return ret; - } - - public static boolean writeCatch(File file, String content) - { - try - { - write(file, content); - return true; - } - catch (Exception e) - { - return false; - } - } - - public static String readCatch(File file) - { - try - { - return read(file); - } - catch (IOException e) - { - return null; - } - } - public static ArrayList uglySQL(Collection items, Predictate where, Comparator orderby, Integer limit, Integer offset) { ArrayList ret = new ArrayList(items.size()); diff --git a/src/com/massivecraft/mcore4/persist/gson/GsonClassManager.java b/src/com/massivecraft/mcore4/persist/gson/GsonClassManager.java index e80fb2a6..d094f239 100644 --- a/src/com/massivecraft/mcore4/persist/gson/GsonClassManager.java +++ b/src/com/massivecraft/mcore4/persist/gson/GsonClassManager.java @@ -15,6 +15,7 @@ import com.massivecraft.mcore4.Predictate; import com.massivecraft.mcore4.lib.gson.Gson; import com.massivecraft.mcore4.persist.IClassManager; import com.massivecraft.mcore4.persist.Persist; +import com.massivecraft.mcore4.util.DiscUtil; public abstract class GsonClassManager implements IClassManager { @@ -259,7 +260,7 @@ public abstract class GsonClassManager implements IClassManager { String json = this.getGson().toJson(entity); File file = this.fileFromId(id); - return Persist.writeCatch(file, json); + return DiscUtil.writeCatch(file, json); } this.removeFile(id); // TODO: Remove if loaded?? @@ -307,7 +308,7 @@ public abstract class GsonClassManager implements IClassManager if (entity != null) return entity; if ( ! this.containsId(id)) return null; File file = this.fileFromId(id); - String json = Persist.readCatch(file); + String json = DiscUtil.readCatch(file); if (json == null) return null; entity = this.getGson().fromJson(json, this.getManagedClass()); this.attach(entity, id, true); diff --git a/src/com/massivecraft/mcore4/util/DiscUtil.java b/src/com/massivecraft/mcore4/util/DiscUtil.java index 35583606..ccc68e08 100644 --- a/src/com/massivecraft/mcore4/util/DiscUtil.java +++ b/src/com/massivecraft/mcore4/util/DiscUtil.java @@ -4,33 +4,48 @@ import java.io.*; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; +import java.nio.file.Files; public class DiscUtil { + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + private final static String UTF8 = "UTF-8"; + + // -------------------------------------------- // + // BYTE + // -------------------------------------------- // + + public static byte[] readBytes(File file) throws IOException + { + return Files.readAllBytes(file.toPath()); + } + + public static void writeBytes(File file, byte[] bytes) throws IOException + { + Files.write(file.toPath(), bytes); + } + + // -------------------------------------------- // + // STRING + // -------------------------------------------- // + public static void write(File file, String content) throws IOException { - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, false), "UTF8")); - out.write(content); - out.close(); + writeBytes(file, utf8(content)); } public static String read(File file) throws IOException { - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); - String ret = new String(new byte[0], "UTF-8"); - - String line; - while ((line = in.readLine()) != null) - { - ret += line+"\n"; - } - - in.close(); - - if (ret.length() == 0) return ret; - return ret.substring(0, ret.length()-1); + return utf8(readBytes(file)); } + // -------------------------------------------- // + // CATCH + // -------------------------------------------- // + public static boolean writeCatch(File file, String content) { try @@ -56,6 +71,10 @@ public class DiscUtil } } + // -------------------------------------------- // + // DOWNLOAD + // -------------------------------------------- // + public static boolean downloadUrl(String urlstring, File file) { try @@ -78,6 +97,10 @@ public class DiscUtil return downloadUrl(urlstring, new File(filename)); } + // -------------------------------------------- // + // FILE DELETION + // -------------------------------------------- // + public static boolean deleteRecursive(File path) throws FileNotFoundException { if ( ! path.exists()) throw new FileNotFoundException(path.getAbsolutePath()); @@ -91,5 +114,35 @@ public class DiscUtil } return ret && path.delete(); } + + // -------------------------------------------- // + // UTF8 ENCODE AND DECODE + // -------------------------------------------- // + + public static byte[] utf8(String string) + { + try + { + return string.getBytes(UTF8); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + return null; + } + } + + public static String utf8(byte[] bytes) + { + try + { + return new String(bytes, UTF8); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + return null; + } + } } diff --git a/src/com/massivecraft/mcore4/util/PlayerUtil.java b/src/com/massivecraft/mcore4/util/PlayerUtil.java index d72125eb..1a637815 100644 --- a/src/com/massivecraft/mcore4/util/PlayerUtil.java +++ b/src/com/massivecraft/mcore4/util/PlayerUtil.java @@ -42,6 +42,7 @@ public class PlayerUtil eplayer.netServerHandler.sendPacket(new Packet8UpdateHealth(eplayer.getHealth(), eplayer.getFoodData().a(), eplayer.getFoodData().e())); } + // TODO: Is there synchronization/parallelism risks here? @SuppressWarnings("unchecked") public static Player getPlayerExact(String exactPlayerName) {