package com.austinv11.collectiveframework.minecraft.config;
import com.austinv11.collectiveframework.utils.ArrayUtils;
import com.austinv11.collectiveframework.utils.ReflectionUtils;
import java.lang.reflect.Array;
import java.util.Arrays;
/**
* A default config proxy for primitive (also includes strings) and array types
*/
public class DefaultProxy implements IConfigProxy {
@Override
public boolean canSerializeObject(Object o) {
return o.getClass().isArray() || ReflectionUtils.isPrimitiveObject(o) || o instanceof String;
}
@Override
public boolean isKeyUsable(String key) {
return key.contains("Array") || ReflectionUtils.isNamePrimitiveOrPrimitiveObject(key) || key.contains("String");
}
@Override
public String getKey(Object o) {
if (o.getClass().isArray()) {
return convertPrimitiveNameToObjectName(o.getClass().getComponentType().getSimpleName())+" Array";
} else {
return convertPrimitiveNameToObjectName(o.getClass().getSimpleName());
}
}
private String convertPrimitiveNameToObjectName(String primitiveName) {
if (primitiveName.equalsIgnoreCase("int"))
return "Integer";
if (primitiveName.equalsIgnoreCase("long"))
return "Long";
if (primitiveName.equalsIgnoreCase("double"))
return "Double";
if (primitiveName.equalsIgnoreCase("float"))
return "Float";
if (primitiveName.equalsIgnoreCase("boolean"))
return "Boolean";
if (primitiveName.equalsIgnoreCase("char"))
return "Character";
if (primitiveName.equalsIgnoreCase("byte"))
return "Byte";
if (primitiveName.equalsIgnoreCase("void"))
return "Void";
if (primitiveName.equalsIgnoreCase("short"))
return "Short";
return primitiveName;
}
@Override
public String serialize(Object o) throws ConfigException {
if (!canSerializeObject(o))
throw new ConfigException("Cannot serialize object "+o.toString());
if (o.getClass().isArray()) {
int length = Array.getLength(o);
String[] serialized = new String[length];
for (int i = 0; i < length; i++)
serialized[i] = ConfigRegistry.serialize(Array.get(o, i));
String string = "[";
for (String s : serialized)
string = string+","+s;
string = string.replaceFirst(",", "")+"]";
return string;
} else {
return o.toString();
}
}
@Override
public Object deserialize(String key, String s) throws ConfigException {
if (!isKeyUsable(key))
throw new ConfigException("String "+s+" is invalid for this proxy");
if (key.contains("Array")) {
s = s.replaceFirst("\\[", "");
s = s.substring(0, s.lastIndexOf("]"));
String[] toSerialize = s.split(",");
String[] trimmedToSerialize = ArrayUtils.trimAll(toSerialize);
Object[] deserialized = new Object[trimmedToSerialize.length];
for (int i = 0; i < trimmedToSerialize.length; i++)
deserialized[i] = ConfigRegistry.deserialize(key.replace(" Array", ""), trimmedToSerialize[i]);
if (key.contains("Integer"))
return ArrayUtils.convertObjectArrayToInt(deserialized);
if (key.contains("Long"))
return ArrayUtils.convertObjectArrayToLong(deserialized);
if (key.contains("Double"))
return ArrayUtils.convertObjectArrayToDouble(deserialized);
if (key.contains("Float"))
return ArrayUtils.convertObjectArrayToFloat(deserialized);
if (key.contains("Boolean"))
return ArrayUtils.convertObjectArrayToBoolean(deserialized);
if (key.contains("Character"))
return ArrayUtils.convertObjectArrayToChar(deserialized);
if (key.contains("Byte"))
return ArrayUtils.convertObjectArrayToByte(deserialized);
if (key.contains("Void"))
return null;
if (key.contains("Short"))
return ArrayUtils.convertObjectArrayToShort(deserialized);
if (key.contains("String"))
return Arrays.copyOf(deserialized, deserialized.length, String[].class);
return deserialized;
} else {
if (key.equalsIgnoreCase("integer"))
return Integer.parseInt(s);
if (key.equalsIgnoreCase("long"))
return Long.parseLong(s);
if (key.equalsIgnoreCase("double"))
return Double.parseDouble(s);
if (key.equalsIgnoreCase("float"))
return Float.parseFloat(s);
if (key.equalsIgnoreCase("boolean"))
return Boolean.parseBoolean(s);
if (key.equalsIgnoreCase("character"))
return s.toCharArray()[0];
if (key.equalsIgnoreCase("byte"))
return Byte.parseByte(s);
if (key.equalsIgnoreCase("void"))
return null;
if (key.equalsIgnoreCase("short"))
return Short.parseShort(s);
else
return s;
}
}
}