From 0f00da9dcb373cf108df95e2618148ed30ed3e90 Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Tue, 19 Aug 2014 11:14:36 -0400 Subject: [PATCH] Continuing implementation of XML settings. --- pom.xml | 7 +- .../BukkitTelnetClient/BTC_ConfigLoader.java | 384 +++++++++++++++--- .../BukkitTelnetClient.java | 3 + src/main/resources/settings.xml | 62 +++ 4 files changed, 405 insertions(+), 51 deletions(-) create mode 100644 src/main/resources/settings.xml diff --git a/pom.xml b/pom.xml index f0e5b61..b01ee6f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 me.StevenLawson BukkitTelnetClient - 2.0.3 + 2.0.4-SNAPSHOT jar @@ -48,6 +48,11 @@ json 20140107 + + commons-io + commons-io + 2.4 + UTF-8 diff --git a/src/main/java/me/StevenLawson/BukkitTelnetClient/BTC_ConfigLoader.java b/src/main/java/me/StevenLawson/BukkitTelnetClient/BTC_ConfigLoader.java index 38660c0..565908a 100644 --- a/src/main/java/me/StevenLawson/BukkitTelnetClient/BTC_ConfigLoader.java +++ b/src/main/java/me/StevenLawson/BukkitTelnetClient/BTC_ConfigLoader.java @@ -1,28 +1,209 @@ package me.StevenLawson.BukkitTelnetClient; -import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.io.*; +import java.util.*; import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; +import org.apache.commons.io.FileUtils; +import org.w3c.dom.*; public class BTC_ConfigLoader { - public static class PlayerListCommand + private static final String SETTINGS_FILE = "settings.xml"; + + private final List playerCommands = new ArrayList<>(); + private final List servers = new ArrayList<>(); + + public BTC_ConfigLoader() + { + } + + public boolean load(boolean verbose) + { + File settings = new File("settings.xml"); + + if (!settings.exists()) + { + if (extractFileFromJar("/" + SETTINGS_FILE, SETTINGS_FILE)) + { + if (verbose) + { + System.out.println("Copied default " + SETTINGS_FILE + "."); + } + } + } + + if (settings.exists()) + { + boolean loadError = loadXML(settings); + + final List oldServers = importOldConfig(); + this.servers.addAll(oldServers); + + final HashSet uniqueServers = new HashSet<>(this.servers); + this.servers.clear(); + this.servers.addAll(uniqueServers); + + generateXML(settings); + + if (verbose) + { + if (loadError) + { + System.out.println("Settings loaded with errors."); + } + else + { + System.out.println("Settings loaded."); + } + } + + return true; + } + else + { + if (verbose) + { + System.out.println("Can't load " + SETTINGS_FILE + "."); + } + } + + return false; + } + + public boolean save() + { + return generateXML(new File(SETTINGS_FILE)); + } + + public List getCommands() + { + return this.playerCommands; + } + + public List getServers() + { + return this.servers; + } + + private boolean generateXML(final File file) + { + try + { + final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + + final Element rootElement = doc.createElement("configuration"); + doc.appendChild(rootElement); + + rootElement.appendChild(PlayerCommandEntry.listToXML(this.playerCommands, doc)); + rootElement.appendChild(ServerEntry.listToXML(this.servers, doc)); + + final Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + + transformer.transform(new DOMSource(doc), new StreamResult(file)); + + return true; + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + return false; + } + + private boolean loadXML(final File file) + { + boolean hadErrors = false; + + try + { + final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file); + doc.getDocumentElement().normalize(); + + if (!PlayerCommandEntry.xmlToList(this.playerCommands, doc)) + { + System.out.println("Error loading playerCommands."); + hadErrors = true; + } + + if (!ServerEntry.xmlToList(this.servers, doc)) + { + System.out.println("Error loading servers."); + hadErrors = true; + } + } + catch (Exception ex) + { + ex.printStackTrace(); + hadErrors = true; + } + + return hadErrors; + } + + private static boolean extractFileFromJar(final String resourceName, final String fileName) + { + final InputStream resource = BTC_ConfigLoader.class.getResourceAsStream(resourceName); + if (resource != null) + { + final File destination = new File(fileName); + try + { + FileUtils.copyInputStreamToFile(resource, destination); + return true; + } + catch (IOException ex) + { + ex.printStackTrace(); + } + } + + return false; + } + + private static List importOldConfig() + { + final List oldServers = new ArrayList<>(); + + try + { + final File file = new File("btc_servers.cfg"); + if (file.exists()) + { + try (final BufferedReader in = new BufferedReader(new FileReader(file))) + { + String line; + while ((line = in.readLine()) != null) + { + line = line.trim(); + oldServers.add(new ServerEntry("imported", line)); + } + } + + FileUtils.moveFile(file, new File("btc_servers.cfg.bak")); + } + } + catch (IOException ex) + { + ex.printStackTrace(); + } + + return oldServers; + } + + public static class PlayerCommandEntry { private final String name; private final String format; - public PlayerListCommand(String name, String format) + public PlayerCommandEntry(String name, String format) { this.name = name; this.format = format; @@ -37,43 +218,14 @@ public class BTC_ConfigLoader { return name; } - } - private static final List COMMANDS = new ArrayList<>(); - - static - { - COMMANDS.add(new PlayerListCommand("Ban", "glist ban %s")); - COMMANDS.add(new PlayerListCommand("Toggle Mute", "mute %s")); - COMMANDS.add(new PlayerListCommand("Kick", "tempban %s 10s Kicked")); - COMMANDS.add(new PlayerListCommand("Tempban 5m", "tempban %s 5m")); - COMMANDS.add(new PlayerListCommand("Smite", "smite %s")); - COMMANDS.add(new PlayerListCommand("Op", "op %s")); - COMMANDS.add(new PlayerListCommand("Deop", "deop %s")); - COMMANDS.add(new PlayerListCommand("GTFO", "gtfo %s")); - COMMANDS.add(new PlayerListCommand("Toggle Freeze", "fr %s")); - COMMANDS.add(new PlayerListCommand("Cage", "cage %s")); - COMMANDS.add(new PlayerListCommand("Uncage", "cage %s off")); - COMMANDS.add(new PlayerListCommand("Doom", "doom %s")); - COMMANDS.add(new PlayerListCommand("Creative", "creative %s")); - COMMANDS.add(new PlayerListCommand("Survival", "survival %s")); - } - - public BTC_ConfigLoader() - { - try + public static Element listToXML(final List playerCommands, final Document doc) { - final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + final Element plcElement = doc.createElement("playerCommands"); - final Element rootElement = doc.createElement("configuration"); - doc.appendChild(rootElement); - - final Element plcElement = doc.createElement("playerListCommands"); - rootElement.appendChild(plcElement); - - for (final PlayerListCommand command : COMMANDS) + for (final PlayerCommandEntry command : playerCommands) { - final Element commandElement = doc.createElement("command"); + final Element commandElement = doc.createElement("playerCommand"); plcElement.appendChild(commandElement); final Element commandName = doc.createElement("name"); @@ -85,15 +237,147 @@ public class BTC_ConfigLoader commandElement.appendChild(commandFormat); } - final Transformer transformer = TransformerFactory.newInstance().newTransformer(); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - - transformer.transform(new DOMSource(doc), new StreamResult(new File("test.xml"))); + return plcElement; } - catch (ParserConfigurationException | DOMException | IllegalArgumentException | TransformerException ex) + + public static boolean xmlToList(final List playerCommands, final Document doc) { - ex.printStackTrace(); + NodeList playerCommandNodes = doc.getDocumentElement().getElementsByTagName("playerCommands"); + if (playerCommandNodes.getLength() < 1) + { + return false; + } + playerCommandNodes = playerCommandNodes.item(0).getChildNodes(); + + playerCommands.clear(); + + for (int i = 0; i < playerCommandNodes.getLength(); i++) + { + final Node node = playerCommandNodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) + { + final Element element = (Element) node; + + final PlayerCommandEntry command = new PlayerCommandEntry( + element.getElementsByTagName("name").item(0).getTextContent(), + element.getElementsByTagName("format").item(0).getTextContent() + ); + + playerCommands.add(command); + } + } + + return true; + } + } + + public static class ServerEntry + { + private final String name; + private final String address; + + public ServerEntry(final String name, final String address) + { + this.name = name; + this.address = address; + } + + public String getName() + { + return name; + } + + public String getAddress() + { + return address; + } + + @Override + public int hashCode() + { + int hash = 7; + hash = 67 * hash + Objects.hashCode(this.name); + hash = 67 * hash + Objects.hashCode(this.address); + return hash; + } + + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + + if (getClass() != obj.getClass()) + { + return false; + } + + final ServerEntry other = (ServerEntry) obj; + + if (!Objects.equals(this.name, other.name)) + { + return false; + } + + if (!Objects.equals(this.address, other.address)) + { + return false; + } + + return true; + } + + public static Element listToXML(final List servers, final Document doc) + { + final Element serversElement = doc.createElement("servers"); + + for (final ServerEntry command : servers) + { + final Element commandElement = doc.createElement("server"); + serversElement.appendChild(commandElement); + + final Element serverName = doc.createElement("name"); + serverName.appendChild(doc.createTextNode(command.getName())); + commandElement.appendChild(serverName); + + final Element serverAddress = doc.createElement("address"); + serverAddress.appendChild(doc.createTextNode(command.getAddress())); + commandElement.appendChild(serverAddress); + } + + return serversElement; + } + + public static boolean xmlToList(final List servers, final Document doc) + { + NodeList serverNodes = doc.getDocumentElement().getElementsByTagName("servers"); + if (serverNodes.getLength() < 1) + { + return false; + } + serverNodes = serverNodes.item(0).getChildNodes(); + + servers.clear(); + + for (int i = 0; i < serverNodes.getLength(); i++) + { + final Node node = serverNodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) + { + final Element element = (Element) node; + + final ServerEntry server = new ServerEntry( + element.getElementsByTagName("name").item(0).getTextContent(), + element.getElementsByTagName("address").item(0).getTextContent() + ); + + servers.add(server); + } + } + + return true; } } } diff --git a/src/main/java/me/StevenLawson/BukkitTelnetClient/BukkitTelnetClient.java b/src/main/java/me/StevenLawson/BukkitTelnetClient/BukkitTelnetClient.java index 7883d05..26158dc 100644 --- a/src/main/java/me/StevenLawson/BukkitTelnetClient/BukkitTelnetClient.java +++ b/src/main/java/me/StevenLawson/BukkitTelnetClient/BukkitTelnetClient.java @@ -9,9 +9,12 @@ public class BukkitTelnetClient public static final String VERSION_STRING = "v2.0.3"; public static final Logger LOGGER = Logger.getLogger(BukkitTelnetClient.class.getName()); public static BTC_MainPanel mainPanel = null; + public static BTC_ConfigLoader config = new BTC_ConfigLoader(); public static void main(String args[]) { + config.load(true); + findAndSetLookAndFeel("Windows"); java.awt.EventQueue.invokeLater(new Runnable() diff --git a/src/main/resources/settings.xml b/src/main/resources/settings.xml new file mode 100644 index 0000000..3d61696 --- /dev/null +++ b/src/main/resources/settings.xml @@ -0,0 +1,62 @@ + + + + + Ban + glist ban %s + + + Toggle Mute + mute %s + + + Kick + tempban %s 10s Kicked + + + Tempban 5m + tempban %s 5m + + + Smite + smite %s + + + Op + op %s + + + Deop + deop %s + + + GTFO + gtfo %s + + + Toggle Freeze + fr %s + + + Cage + cage %s + + + Uncage + cage %s off + + + Doom + doom %s + + + Creative + creative %s + + + Survival + survival %s + + + +