|
@@ -0,0 +1,203 @@
|
|
|
+package me.hammerle.config;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.nio.charset.Charset;
|
|
|
+import java.nio.charset.MalformedInputException;
|
|
|
+import java.nio.file.Files;
|
|
|
+import java.nio.file.Paths;
|
|
|
+import java.util.TreeMap;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import me.hammerle.code.Code;
|
|
|
+import me.hammerle.code.ISnuviLogger;
|
|
|
+
|
|
|
+public class SnuviConfig
|
|
|
+{
|
|
|
+ protected final ISnuviLogger logger;
|
|
|
+ protected final TreeMap<String, Object> conf;
|
|
|
+ private final File file;
|
|
|
+
|
|
|
+ public SnuviConfig(ISnuviLogger logger, String path, String name, String ending)
|
|
|
+ {
|
|
|
+ this.logger = logger;
|
|
|
+ StringBuilder sb = new StringBuilder("./");
|
|
|
+ sb.append(path);
|
|
|
+ sb.append("/");
|
|
|
+ sb.append(name);
|
|
|
+ sb.append(".");
|
|
|
+ sb.append(ending);
|
|
|
+ file = new File(sb.toString());
|
|
|
+ conf = new TreeMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ public SnuviConfig(ISnuviLogger logger, String path, String name)
|
|
|
+ {
|
|
|
+ this(logger, path, name, "snuvic");
|
|
|
+ }
|
|
|
+
|
|
|
+ public final void load()
|
|
|
+ {
|
|
|
+ if(!exists())
|
|
|
+ {
|
|
|
+ throw new IllegalStateException("cannot load non existent file '" + file.getPath() + "'");
|
|
|
+ }
|
|
|
+ try
|
|
|
+ {
|
|
|
+ String warning = "wrong syntax in '" + file.getPath() + "'";
|
|
|
+ Files.readAllLines(file.toPath()).stream().forEach(s ->
|
|
|
+ {
|
|
|
+ int b = s.indexOf("=");
|
|
|
+ if(b == -1)
|
|
|
+ {
|
|
|
+ logger.printWarning(warning);
|
|
|
+ logger.printWarning(s);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ conf.put(s.substring(0, b).trim(), Code.convertInput(s.substring(b + 1)));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ catch(MalformedInputException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("'" + file.getPath() + "' contains an illegal character, change file encoding");
|
|
|
+ }
|
|
|
+ catch(OutOfMemoryError ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("'" + file.getPath() + "' is too big");
|
|
|
+ }
|
|
|
+ catch(SecurityException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("'" + file.getPath() + "' is not accessable");
|
|
|
+ logger.printWarning(ex.getMessage());
|
|
|
+ }
|
|
|
+ catch(IOException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("'" + file.getPath() + "' cannot be read");
|
|
|
+ logger.printWarning(ex.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public final boolean exists()
|
|
|
+ {
|
|
|
+ return file.exists();
|
|
|
+ }
|
|
|
+
|
|
|
+ public final boolean delete()
|
|
|
+ {
|
|
|
+ return file.delete();
|
|
|
+ }
|
|
|
+
|
|
|
+ public final boolean save()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if(!file.getParentFile().exists())
|
|
|
+ {
|
|
|
+ file.getParentFile().mkdirs();
|
|
|
+ }
|
|
|
+ if(!file.exists())
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ file.createNewFile();
|
|
|
+ }
|
|
|
+ catch(IOException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("'" + file.getPath() + "' cannot be created");
|
|
|
+ logger.printWarning(ex.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Files.write(Paths.get(file.toURI()), conf.entrySet().stream()
|
|
|
+ .map(e ->
|
|
|
+ {
|
|
|
+ if(e.getValue().getClass() == String.class)
|
|
|
+ {
|
|
|
+ return e.getKey() + "=\"" + e.getValue() + "\"";
|
|
|
+ }
|
|
|
+ return e.getKey() + "=" + String.valueOf(e.getValue());
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList()), Charset.forName("UTF-8"));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ catch(UnsupportedOperationException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("an unsupported operation was used");
|
|
|
+ logger.printWarning(ex.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ catch(SecurityException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("'" + file.getPath() + "' is not accessable");
|
|
|
+ logger.printWarning(ex.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ catch(IOException ex)
|
|
|
+ {
|
|
|
+ logger.printWarning("cannot write to '" + file.getPath() + "'");
|
|
|
+ logger.printWarning(ex.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // -----------------------------------------------------------------------------------
|
|
|
+ // getter
|
|
|
+ // -----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ protected final <T> T get(String key, Class<T> c, T error)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Object o = conf.get(key);
|
|
|
+ if(o == null)
|
|
|
+ {
|
|
|
+ return error;
|
|
|
+ }
|
|
|
+ return c.cast(o);
|
|
|
+ }
|
|
|
+ catch(ClassCastException ex)
|
|
|
+ {
|
|
|
+ return error;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public final String getString(String key, String error)
|
|
|
+ {
|
|
|
+ return get(key, String.class, error);
|
|
|
+ }
|
|
|
+
|
|
|
+ public final String getString(String key)
|
|
|
+ {
|
|
|
+ return getString(key, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public final float getFloat(String key, float error)
|
|
|
+ {
|
|
|
+ return get(key, Double.class, Double.valueOf(error)).floatValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ public final double getDouble(String key, double error)
|
|
|
+ {
|
|
|
+ return get(key, Double.class, error);
|
|
|
+ }
|
|
|
+
|
|
|
+ public final int getInt(String key, int error)
|
|
|
+ {
|
|
|
+ return get(key, Double.class, Double.valueOf(error)).intValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ public final boolean getBoolean(String key, boolean error)
|
|
|
+ {
|
|
|
+ return get(key, Boolean.class, error);
|
|
|
+ }
|
|
|
+
|
|
|
+ // -----------------------------------------------------------------------------------
|
|
|
+ // set
|
|
|
+ // -----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+ public final void set(String key, Object o)
|
|
|
+ {
|
|
|
+ conf.put(key, o);
|
|
|
+ }
|
|
|
+}
|