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();
}
}