Aegis/app/src/main/java/me/impy/aegis/db/Database.java

85 lines
2.4 KiB
Java
Raw Normal View History

package me.impy.aegis.db;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
public class Database {
2017-08-26 21:15:53 +02:00
private static final int VERSION = 1;
2017-12-27 21:01:53 +01:00
2017-08-26 21:15:53 +02:00
private List<DatabaseEntry> _entries = new ArrayList<>();
public JSONObject serialize() throws Exception {
JSONArray array = new JSONArray();
2017-08-26 21:15:53 +02:00
for (DatabaseEntry e : _entries) {
array.put(e.serialize());
}
JSONObject obj = new JSONObject();
2017-08-26 21:15:53 +02:00
obj.put("version", VERSION);
obj.put("entries", array);
return obj;
}
public void deserialize(JSONObject obj) throws Exception {
2017-08-26 21:15:53 +02:00
// TODO: support different VERSION deserialization providers
int ver = obj.getInt("version");
2017-08-26 21:15:53 +02:00
if (ver != VERSION) {
throw new Exception("Unsupported version");
}
JSONArray array = obj.getJSONArray("entries");
for (int i = 0; i < array.length(); i++) {
DatabaseEntry entry = new DatabaseEntry(null);
entry.deserialize(array.getJSONObject(i));
addKey(entry);
}
}
public void addKey(DatabaseEntry entry) {
if (tryGetKeyByUUID(entry.getUUID()) != null) {
throw new AssertionError("entry found with the same uuid");
}
2017-08-26 21:15:53 +02:00
_entries.add(entry);
}
2017-11-27 21:06:23 +01:00
public void removeKey(DatabaseEntry entry) {
entry = getKeyByUUID(entry.getUUID());
2017-08-26 21:15:53 +02:00
_entries.remove(entry);
}
public void replaceKey(DatabaseEntry newEntry) {
DatabaseEntry oldEntry = getKeyByUUID(newEntry.getUUID());
_entries.set(_entries.indexOf(oldEntry), newEntry);
}
public void swapKeys(DatabaseEntry entry1, DatabaseEntry entry2) {
Collections.swap(_entries, _entries.indexOf(entry1), _entries.indexOf(entry2));
}
2017-11-27 21:06:23 +01:00
public List<DatabaseEntry> getKeys() {
return Collections.unmodifiableList(_entries);
}
private DatabaseEntry tryGetKeyByUUID(UUID uuid) {
for (DatabaseEntry entry : _entries) {
if (entry.getUUID().equals(uuid)) {
return entry;
}
}
return null;
}
private DatabaseEntry getKeyByUUID(UUID uuid) {
DatabaseEntry entry = tryGetKeyByUUID(uuid);
if (entry == null) {
throw new AssertionError("no entry found with the same uuid");
}
return entry;
}
}