package com.jadarstudios.developercapes.cape; import com.google.common.collect.HashBiMap; import com.google.common.primitives.UnsignedBytes; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.jadarstudios.developercapes.DevCapes; import com.jadarstudios.developercapes.user.Group; import com.jadarstudios.developercapes.user.GroupManager; import com.jadarstudios.developercapes.user.User; import com.jadarstudios.developercapes.user.UserManager; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.BitSet; import java.util.Map; /** * @author jadar */ public enum CapeConfigManager { INSTANCE; protected static BitSet availableIds = new BitSet(256); protected HashBiMap<Integer, CapeConfig> configs; static { availableIds.clear(availableIds.size()); } private CapeConfigManager() { configs = HashBiMap.create(); } public void addConfig(int id, CapeConfig config) { int realId = claimId(id); this.configs.put(id, config); try { for (User u : config.users.values()) { UserManager.INSTANCE.addUser(u); } for (Group g : config.groups.values()) { GroupManager.INSTANCE.addGroup(g); } } catch (Exception e) { e.printStackTrace(); } } public CapeConfig getConfig(int id) { return this.configs.get(id); } public int getIdForConfig(CapeConfig config) { return this.configs.inverse().get(config).intValue(); } public static int getUniqueId() { return availableIds.nextClearBit(0); } public static int claimId(int id) { try { UnsignedBytes.checkedCast(id); } catch (IllegalArgumentException e) { e.printStackTrace(); } boolean isRegistered = availableIds.get(id); if (isRegistered) { DevCapes.logger.error(String.format("The config ID %d was attempted to be claimed but is already claimed.", id)); } availableIds.set(id); return id; } // public CapeConfig newInstance() { // CapeConfig instance = new CapeConfig(); // this.addConfig(this.getUniqueId(), ); // return instance; // } public CapeConfig parse(String config) { CapeConfig instance = new CapeConfig(); try { Map<String, Object> entries = new Gson().fromJson(config, Map.class); for (Map.Entry<String, Object> entry : entries.entrySet()) { final String nodeName = entry.getKey(); final Object obj = entry.getValue(); if (obj instanceof Map) { Map group = (Map) obj; Group g = GroupManager.INSTANCE.parse(nodeName, group); if (g != null) { instance.groups.put(g.name, g); } } else if (obj instanceof String) { User u = UserManager.INSTANCE.parse(nodeName, obj); if (u != null) { instance.users.put(nodeName, u); } } } } catch (JsonSyntaxException e) { e.printStackTrace(); } return instance; } public CapeConfig parseFromStream(InputStream is) { if (is == null) { DevCapes.logger.error("Can't parse a null input stream!"); return null; } CapeConfig instance = null; try { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String json = ""; while (reader.ready()) { json += reader.readLine(); } instance = CapeConfigManager.INSTANCE.parse(json); } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { } } return instance; } }