package in.twizmwaz.cardinal;

import org.bukkit.OfflinePlayer;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.UUID;

public final class Database {
    
    private final Document document;

    private Database(Document document) {
        this.document = document;
    }
    
    private Database() {
        this.document = new Document(new Element("database"));
    }
    
    public static Database newInstance(File file) {
        Database newDatabase = new Database();
        newDatabase.save(file);
        return newDatabase;
    }
    
    public static Database loadFromFile(File file) throws JDOMException, IOException {
        SAXBuilder saxBuilder = new SAXBuilder();
        return new Database(saxBuilder.build(file));
    }
    
    public boolean save(File file) {
        XMLOutputter outputter = new XMLOutputter();
        outputter.setFormat(Format.getPrettyFormat());
        try {
            outputter.output(document, new FileWriter(file));
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public void put(OfflinePlayer player, String key, String value) {
        getKey(getPlayerElement(player), key).setAttribute("value", value);
    }
    
    public String get(OfflinePlayer player, String key) {
        return getKey(getPlayerElement(player), key).getAttributeValue("value");
    }
    
    private Element getPlayerElement(OfflinePlayer player) {
        for (Element element : document.getRootElement().getChildren()) {
            if (player.getUniqueId().equals(UUID.fromString(element.getAttributeValue("uuid")))) return element;
        }
        Element newPlayer = new Element("player").setAttribute(new Attribute("uuid", player.getUniqueId().toString()));
        document.getRootElement().addContent(newPlayer);
        return newPlayer;
    }
    
    private Element getKey(Element element, String key) {
        for (Element child : element.getChildren("data")) {
            if (key.equals(child.getAttributeValue("key"))) return child;
        }
        Element newElement = new Element(("data")).setAttribute(new Attribute("key", key)).setAttribute("value", "");
        element.addContent(newElement);
        return newElement;
    }
    
}

package in.twizmwaz.cardinal;

import org.bukkit.OfflinePlayer;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.UUID;

public final class Database {
    
    private final Document document;

    private Database(Document document) {
        this.document = document;
    }
    
    private Database() {
        this.document = new Document(new Element("database"));
    }
    
    public static Database newInstance(File file) {
        Database newDatabase = new Database();
        newDatabase.save(file);
        return newDatabase;
    }
    
    public static Database loadFromFile(File file) throws JDOMException, IOException {
        SAXBuilder saxBuilder = new SAXBuilder();
        return new Database(saxBuilder.build(file));
    }
    
    public boolean save(File file) {
        XMLOutputter out = new XMLOutputter();
        out.setFormat(Format.getPrettyFormat());
        try {
            if (file.createNewFile()) {
                out.output(document, new FileWriter(file));
                return true;
            } else return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public void put(OfflinePlayer player, String key, String value) {
        getKey(getPlayerElement(player), key).setAttribute("value", value);
    }
    
    public String get(OfflinePlayer player, String key) {
        return getKey(getPlayerElement(player), key).getAttributeValue("value");
    }
    
    private Element getPlayerElement(OfflinePlayer player) {
        for (Element element : document.getRootElement().getChildren()) {
            if (player.getUniqueId().equals(UUID.fromString(element.getAttributeValue("uuid")))) return element;
        }
        Element newPlayer = new Element("player").setAttribute(new Attribute("uuid", player.getUniqueId().toString()));
        document.getRootElement().addContent(newPlayer);
        return newPlayer;
    }
    
    private Element getKey(Element element, String key) {
        for (Element child : element.getChildren("data")) {
            if (key.equals(child.getAttributeValue("key"))) return child;
        }
        Element newElement = new Element(("data")).setAttribute(new Attribute("key", key)).setAttribute("value", "");
        element.addContent(newElement);
        return newElement;
    }
    
}

Fix database file not being created on first start