parent
812c3c3bf8
commit
7fb7128756
@ -1,4 +1,4 @@ |
||||
package mightypork.utils.files.config; |
||||
package mightypork.utils.config; |
||||
|
||||
|
||||
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