package net.glowstone.util.bans; import net.glowstone.GlowServer; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; /** * Tools for storing lists of entries in JSON files. */ public abstract class JsonListFile { /** * The list as we currently know it. */ protected final List<BaseEntry> entries = new ArrayList<>(); /** * The file the list is associated with. */ private final File file; /** * Initialize the list from the given file. * @param file The file to use for this list. */ public JsonListFile(File file) { this.file = file; } /** * Reloads from the file. */ public void load() { entries.clear(); if (file.exists()) { try (Reader reader = new FileReader(file)) { JSONArray jsonArray = (JSONArray) new JSONParser().parse(reader); for (Object object : jsonArray) { JSONObject jsonObj = (JSONObject) object; Map<String, String> map = new HashMap<>(jsonObj.size()); for (Object jsonEntry : jsonObj.entrySet()) { Map.Entry<?, ?> entry = ((Map.Entry<?, ?>) jsonEntry); map.put(entry.getKey().toString(), entry.getValue().toString()); } entries.add(readEntry(map)); } } catch (Exception ex) { GlowServer.logger.log(Level.SEVERE, "Error reading from: " + file, ex); } } else { //importLegacy(); save(); } } /** * Saves to the file. */ @SuppressWarnings("unchecked") protected void save() { JSONArray array = new JSONArray(); for (BaseEntry entry : entries) { JSONObject obj = new JSONObject(); for (Map.Entry<String, String> mapEntry : entry.write().entrySet()) { obj.put(mapEntry.getKey(), mapEntry.getValue()); } array.add(obj); } try (Writer writer = new FileWriter(file)) { array.writeJSONString(writer); } catch (Exception ex) { GlowServer.logger.log(Level.SEVERE, "Error writing to: " + file, ex); } } /** * Deserialize an entry from JSON format. * @param object The JSON object to read from. * @return The finished Entry. */ protected abstract BaseEntry readEntry(Map<String, String> object); /** * Import data from a legacy format if possible. */ //protected abstract void importLegacy(); /** * Base interface for entries in JSON list files. */ protected interface BaseEntry { /** * Serialize this entry to JSON format. * @return The resulting JSON object. */ Map<String, String> write(); } }