package net.obnoxint.mcdev.omclib;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import net.obnoxint.mcdev.feature.Feature;
public final class UIDProvider {
public static final String DEFAULT_UID_NAME = "default";
private static final String UID_FILE_NAME = "uid";
private final File uidFile;
private final Map<String, Map<String, UUID>> uids = new HashMap<>();
UIDProvider(final OmcLibPlugin plugin) {
this.uidFile = new File(plugin.getDataFolder(), UID_FILE_NAME);
init();
}
public boolean addUID(final Feature feature, final String name, final UUID uuid) {
boolean r = false;
if (feature != null && name != null && !name.isEmpty() && uuid != null) {
final String f = feature.getFeatureName();
if (!uids.containsKey(f)) { // TODO: remove redundancy (getUUID())
uids.put(f, new HashMap<String, UUID>());
}
final Map<String, UUID> m = uids.get(f);
if (!m.containsKey(name)) {
m.put(name, uuid);
updateStorage();
r = true;
}
}
return r;
}
public boolean addUID(final Feature feature, final UUID uuid) {
return addUID(feature, DEFAULT_UID_NAME, uuid);
}
public UUID getUID(final Feature feature) {
return getUID(feature, DEFAULT_UID_NAME);
}
public UUID getUID(final Feature feature, final boolean create) {
return getUID(feature, DEFAULT_UID_NAME, create);
}
public UUID getUID(final Feature feature, final String name) {
return getUID(feature, DEFAULT_UID_NAME, true);
}
public UUID getUID(final Feature feature, final String name, final boolean create) {
UUID r = null;
if (feature != null && name != null && !name.isEmpty()) {
final String f = feature.getFeatureName();
if (!uids.containsKey(f)) { // TODO: remove redundancy (addUID())
uids.put(f, new HashMap<String, UUID>());
}
r = uids.get(f).get(name);
if (r == null && create) {
r = UUID.randomUUID();
addUID(feature, name, r);
}
}
return r;
}
public UUID removeUID(final Feature feature) {
return removeUID(feature, DEFAULT_UID_NAME);
}
public UUID removeUID(final Feature feature, final String name) {
UUID r = null;
final String f = feature.getFeatureName();
if (uids.containsKey(f)) {
r = uids.get(f).remove(r);
updateStorage();
}
return r;
}
@SuppressWarnings("unchecked")
private void init() {
ObjectInputStream ois = null;
Map<String, Map<String, UUID>> m = new HashMap<>();
try {
if (!uidFile.exists()) {
uidFile.createNewFile();
updateStorage();
return;
}
ois = new ObjectInputStream(new GZIPInputStream(new FileInputStream(uidFile)));
m = (Map<String, Map<String, UUID>>) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
try {
ois.close();
} catch (NullPointerException | IOException e) {}
uids.putAll(m);
}
private void updateStorage() {
try {
final ObjectOutputStream ous = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(uidFile)));
ous.writeObject(uids);
ous.flush();
ous.close();
} catch (final IOException e) {
e.printStackTrace();
}
}
}