package com.drtshock.playervaults.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * Fancy JSON serialization mostly by evilmidget38. * @author evilmidget38, gomeow * */ public class Serialization { @SuppressWarnings("unchecked") public static Map toMap(JSONObject object) throws JSONException { Map map = new HashMap(); Iterator keys = object.keys(); while(keys.hasNext()) { String key = (String) keys.next(); map.put(key, fromJson(object.get(key))); } return map; } private static Object fromJson(Object json) throws JSONException { if (json == JSONObject.NULL) { return null; } else if (json instanceof JSONObject) { return toMap((JSONObject) json); } else if (json instanceof JSONArray) { return toList((JSONArray) json); } else { return json; } } public static List toList(JSONArray array) throws JSONException { List list = new ArrayList(); for(int i = 0; i < array.length(); i++) { list.add(fromJson(array.get(i))); } return list; } public static List toString(Inventory inv) { List result = new ArrayList(); List items = new ArrayList(); for(ItemStack is:inv.getContents()) { items.add(is); } for(ConfigurationSerializable cs:items) { if (cs == null) { result.add("null"); } else { result.add(new JSONObject(serialize(cs)).toString()); } } return result; } public static Inventory toInventory(List stringItems, int number, boolean large) { VaultHolder holder = new VaultHolder(number); Inventory inv = Bukkit.createInventory(holder, (large) ? 54 : 27, ChatColor.RED + "Vault #" + number); holder.setInventory(inv); List contents = new ArrayList(); for(String piece:stringItems) { if (piece.equalsIgnoreCase("null")) { contents.add(null); } else { try { ItemStack item = (ItemStack) deserialize(toMap(new JSONObject(piece))); contents.add(item); } catch(JSONException e) { e.printStackTrace(); } } } ItemStack[] items = new ItemStack[contents.size()]; for(int x = 0; x < contents.size(); x++) items[x] = contents.get(x); inv.setContents(items); return inv; } public static Map serialize(ConfigurationSerializable cs) { Map serialized = recreateMap(cs.serialize()); for(Entry entry:serialized.entrySet()) { if (entry.getValue() instanceof ConfigurationSerializable) { entry.setValue(serialize((ConfigurationSerializable) entry.getValue())); } } serialized.put(ConfigurationSerialization.SERIALIZED_TYPE_KEY, ConfigurationSerialization.getAlias(cs.getClass())); return serialized; } public static Map recreateMap(Map original) { Map map = new HashMap(); for(Entry entry:original.entrySet()) { map.put(entry.getKey(), entry.getValue()); } return map; } @SuppressWarnings({"unchecked", "rawtypes"}) public static ConfigurationSerializable deserialize(Map map) { for(Entry entry:map.entrySet()) { if (entry.getValue() instanceof Map && ((Map) entry.getValue()).containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY)) { entry.setValue(deserialize((Map) entry.getValue())); } } return ConfigurationSerialization.deserializeObject(map); } }