parent
812c3c3bf8
commit
7fb7128756
@ -1,4 +1,4 @@ |
|||||||
package mightypork.utils.files.config; |
package mightypork.utils.config; |
||||||
|
|
||||||
|
|
||||||
import java.io.File; |
import java.io.File; |
@ -0,0 +1,121 @@ |
|||||||
|
package mightypork.utils.config.propmgr; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.Convert; |
||||||
|
import mightypork.utils.annotations.Stub; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Property entry for the {@link PropertyManager}.<br> |
||||||
|
* Extending this class can be used to add custom property types that are not |
||||||
|
* supported by default. |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
* @param <T> property type |
||||||
|
*/ |
||||||
|
public abstract class Property<T> { |
||||||
|
|
||||||
|
protected final String comment; |
||||||
|
protected final String key; |
||||||
|
|
||||||
|
protected T value; |
||||||
|
protected final T defaultValue; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create a property without comment |
||||||
|
* |
||||||
|
* @param key key in the config file |
||||||
|
* @param defaultValue defualt property value (used as fallback when |
||||||
|
* parsing) |
||||||
|
*/ |
||||||
|
public Property(String key, T defaultValue) { |
||||||
|
this(key, defaultValue, null); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create a property with a comment |
||||||
|
* |
||||||
|
* @param key key in the config file |
||||||
|
* @param defaultValue defualt property value (used as fallback when |
||||||
|
* parsing) |
||||||
|
* @param comment optional property comment included above the property in |
||||||
|
* the config file. Can be null. |
||||||
|
*/ |
||||||
|
public Property(String key, T defaultValue, String comment) { |
||||||
|
this.comment = comment; |
||||||
|
this.key = key; |
||||||
|
this.value = defaultValue; |
||||||
|
this.defaultValue = defaultValue; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Parse a string representation of the value into this property. If the |
||||||
|
* value cannot be decoded, use the default value instead. |
||||||
|
* |
||||||
|
* @param string property value as string |
||||||
|
*/ |
||||||
|
public abstract void fromString(String string); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get property value as string (compatible with `fromString()) |
||||||
|
* |
||||||
|
* @return property value as string |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
@Stub |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return Convert.toString(value, Convert.toString(defaultValue)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get the current property value |
||||||
|
* |
||||||
|
* @return the value |
||||||
|
*/ |
||||||
|
public final T getValue() |
||||||
|
{ |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set property value.<br> |
||||||
|
* Uses Object to allow setValue(Object) method in {@link PropertyManager} |
||||||
|
* |
||||||
|
* @param value value to set. |
||||||
|
* @throws ClassCastException in case of incompatible type. |
||||||
|
*/ |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public final void setValue(Object value) |
||||||
|
{ |
||||||
|
this.value = (T) value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get property comment. |
||||||
|
* |
||||||
|
* @return the comment text (can be null if no comment is defined) |
||||||
|
*/ |
||||||
|
public final String getComment() |
||||||
|
{ |
||||||
|
return comment; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get property key |
||||||
|
* |
||||||
|
* @return property key |
||||||
|
*/ |
||||||
|
public final String getKey() |
||||||
|
{ |
||||||
|
return key; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
package mightypork.utils.config.propmgr; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Collection; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Interface for a property store (used by {@link PropertyManager}).<br> |
||||||
|
* Due to this abstraction, different kind of property storage can be used, not |
||||||
|
* only a file. |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
*/ |
||||||
|
public interface PropertyStore { |
||||||
|
|
||||||
|
/** |
||||||
|
* Set a header comment |
||||||
|
* |
||||||
|
* @param comment the comment text (can be multi-line) |
||||||
|
*/ |
||||||
|
void setComment(String comment); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Load properties from the file / store. If the file does not exist or is |
||||||
|
* inaccessible, nothing is loaded. |
||||||
|
*/ |
||||||
|
void load(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Save properties to the file / store. |
||||||
|
* |
||||||
|
* @throws IOException if the file cannot be created or written. |
||||||
|
*/ |
||||||
|
void save() throws IOException; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a property value |
||||||
|
* |
||||||
|
* @param key property key |
||||||
|
* @return value retrieved from the file, or null if none found. |
||||||
|
*/ |
||||||
|
String getProperty(String key); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set a property value |
||||||
|
* |
||||||
|
* @param key property key |
||||||
|
* @param value property value to set |
||||||
|
* @param comment property comment. Can be null. |
||||||
|
*/ |
||||||
|
void setProperty(String key, String value, String comment); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Remove a property from the list. |
||||||
|
* |
||||||
|
* @param key property key to remove |
||||||
|
*/ |
||||||
|
void removeProperty(String key); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Clear the property list |
||||||
|
*/ |
||||||
|
void clear(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get keys collection (can be used for iterating) |
||||||
|
* |
||||||
|
* @return keys collection |
||||||
|
*/ |
||||||
|
public Collection<String> keys(); |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package mightypork.utils.config.propmgr.properties; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.Convert; |
||||||
|
import mightypork.utils.config.propmgr.Property; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Boolean property |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
*/ |
||||||
|
public class BooleanProperty extends Property<Boolean> { |
||||||
|
|
||||||
|
public BooleanProperty(String key, Boolean defaultValue) { |
||||||
|
super(key, defaultValue); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public BooleanProperty(String key, Boolean defaultValue, String comment) { |
||||||
|
super(key, defaultValue, comment); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void fromString(String string) |
||||||
|
{ |
||||||
|
setValue(Convert.toBoolean(string, defaultValue)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package mightypork.utils.config.propmgr.properties; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.Convert; |
||||||
|
import mightypork.utils.config.propmgr.Property; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Double property |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
*/ |
||||||
|
public class DoubleProperty extends Property<Double> { |
||||||
|
|
||||||
|
public DoubleProperty(String key, Double defaultValue) { |
||||||
|
super(key, defaultValue); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public DoubleProperty(String key, Double defaultValue, String comment) { |
||||||
|
super(key, defaultValue, comment); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void fromString(String string) |
||||||
|
{ |
||||||
|
setValue(Convert.toDouble(string, defaultValue)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package mightypork.utils.config.propmgr.properties; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.Convert; |
||||||
|
import mightypork.utils.config.propmgr.Property; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Integer property |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
*/ |
||||||
|
public class IntegerProperty extends Property<Integer> { |
||||||
|
|
||||||
|
public IntegerProperty(String key, Integer defaultValue) { |
||||||
|
super(key, defaultValue); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public IntegerProperty(String key, Integer defaultValue, String comment) { |
||||||
|
super(key, defaultValue, comment); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void fromString(String string) |
||||||
|
{ |
||||||
|
setValue(Convert.toInteger(string, defaultValue)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package mightypork.utils.config.propmgr.properties; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.Convert; |
||||||
|
import mightypork.utils.config.propmgr.Property; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* String property |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
*/ |
||||||
|
public class StringProperty extends Property<String> { |
||||||
|
|
||||||
|
public StringProperty(String key, String defaultValue) { |
||||||
|
super(key, defaultValue); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public StringProperty(String key, String defaultValue, String comment) { |
||||||
|
super(key, defaultValue, comment); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void fromString(String string) |
||||||
|
{ |
||||||
|
setValue(Convert.toString(string, defaultValue)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,119 @@ |
|||||||
|
package mightypork.utils.config.propmgr.store; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Collection; |
||||||
|
|
||||||
|
import mightypork.utils.config.propmgr.PropertyStore; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* File based implementation utilizing {@link java.util.Properties}, hacked to |
||||||
|
* support UTF-8. |
||||||
|
* |
||||||
|
* @author Ondřej Hruška (MightyPork) |
||||||
|
*/ |
||||||
|
public class PropertyFile implements PropertyStore { |
||||||
|
|
||||||
|
private String comment; |
||||||
|
private File file; |
||||||
|
private SortedProperties props; |
||||||
|
|
||||||
|
|
||||||
|
public PropertyFile(File file) { |
||||||
|
this.file = file; |
||||||
|
this.comment = null; |
||||||
|
this.props = new SortedProperties(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public PropertyFile(File file, String comment) { |
||||||
|
this.file = file; |
||||||
|
this.comment = comment; |
||||||
|
this.props = new SortedProperties(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void setComment(String comment) |
||||||
|
{ |
||||||
|
this.comment = comment; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void load() |
||||||
|
{ |
||||||
|
if (!file.exists()) return; |
||||||
|
|
||||||
|
try (FileInputStream in = new FileInputStream(file)) { |
||||||
|
props.load(in); |
||||||
|
} catch (IOException e) { |
||||||
|
// ignore
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void save() throws IOException |
||||||
|
{ |
||||||
|
if (!file.getParentFile().mkdirs()) { |
||||||
|
if (!file.getParentFile().exists()) { |
||||||
|
throw new IOException("Cound not create config file."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
try (FileOutputStream out = new FileOutputStream(file)) { |
||||||
|
props.store(out, comment); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String getProperty(String key) |
||||||
|
{ |
||||||
|
return props.getProperty(key); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void setProperty(String key, String value, String comment) |
||||||
|
{ |
||||||
|
props.setProperty(key, value); |
||||||
|
props.setKeyComment(key, comment); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void removeProperty(String key) |
||||||
|
{ |
||||||
|
props.remove(key); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void clear() |
||||||
|
{ |
||||||
|
props.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
@Override |
||||||
|
public Collection<String> keys() |
||||||
|
{ |
||||||
|
|
||||||
|
// Set<String> keys = new HashSet<>();
|
||||||
|
// for (Object o : props.keySet()) {
|
||||||
|
// keys.add((String) o);
|
||||||
|
// }
|
||||||
|
// return keys;
|
||||||
|
|
||||||
|
// we know it is strings.
|
||||||
|
return (Collection<String>) (Collection<?>) props.keySet(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,71 +0,0 @@ |
|||||||
package mightypork.utils.files.config; |
|
||||||
|
|
||||||
|
|
||||||
import mightypork.utils.Convert; |
|
||||||
|
|
||||||
|
|
||||||
public abstract class Property<T extends Object> { |
|
||||||
|
|
||||||
private final String comment; |
|
||||||
private final String key; |
|
||||||
|
|
||||||
private T value; |
|
||||||
private final T defaultValue; |
|
||||||
|
|
||||||
|
|
||||||
public Property(String key, T defaultValue, String comment) |
|
||||||
{ |
|
||||||
super(); |
|
||||||
this.comment = comment; |
|
||||||
this.key = key; |
|
||||||
this.value = defaultValue; |
|
||||||
this.defaultValue = defaultValue; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public final void parse(String string) |
|
||||||
{ |
|
||||||
setValue(decode(string, defaultValue)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public abstract T decode(String string, T defval); |
|
||||||
|
|
||||||
|
|
||||||
public String encode(T value) |
|
||||||
{ |
|
||||||
return Convert.toString(value, Convert.toString(defaultValue)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public final String toString() |
|
||||||
{ |
|
||||||
return encode(value); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public T getValue() |
|
||||||
{ |
|
||||||
return value; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
public void setValue(Object value) |
|
||||||
{ |
|
||||||
this.value = (T) value; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public String getComment() |
|
||||||
{ |
|
||||||
return comment; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public String getKey() |
|
||||||
{ |
|
||||||
return key; |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue