A polymorph adapter and some text utils.

This commit is contained in:
Olof Larsson 2012-11-18 00:05:28 +01:00
parent ef49abde15
commit 303f91430a
3 changed files with 161 additions and 2 deletions

View File

@ -0,0 +1,76 @@
package com.massivecraft.mcore5.adapter;
import java.lang.reflect.Type;
import com.massivecraft.mcore5.util.ClassResolveUtil;
import com.massivecraft.mcore5.xlib.gson.JsonDeserializationContext;
import com.massivecraft.mcore5.xlib.gson.JsonDeserializer;
import com.massivecraft.mcore5.xlib.gson.JsonElement;
import com.massivecraft.mcore5.xlib.gson.JsonNull;
import com.massivecraft.mcore5.xlib.gson.JsonObject;
import com.massivecraft.mcore5.xlib.gson.JsonParseException;
import com.massivecraft.mcore5.xlib.gson.JsonPrimitive;
import com.massivecraft.mcore5.xlib.gson.JsonSerializationContext;
import com.massivecraft.mcore5.xlib.gson.JsonSerializer;
public class PolymorphicAdapter<T> implements JsonDeserializer<T>, JsonSerializer<T>
{
public static final String TYPE = "type";
public static final String VALUE = "value";
@Override
public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context)
{
if (src == null)
{
return JsonNull.INSTANCE;
}
JsonObject ret = new JsonObject();
String type = src.getClass().getCanonicalName();
ret.addProperty(TYPE, type);
JsonElement value = context.serialize(src);
ret.add(VALUE, value);
return ret;
}
@Override
public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
if (!json.isJsonObject())
{
throw new JsonParseException("A polymorph must be an object.");
}
JsonObject jsonObject = json.getAsJsonObject();
if (!jsonObject.has(TYPE))
{
throw new JsonParseException("A polymorph must be have a \""+TYPE+"\" field.");
}
if (!jsonObject.has(VALUE))
{
throw new JsonParseException("A polymorph must be have a \"+VALUE+\" field.");
}
String type = ((JsonPrimitive)jsonObject.get(TYPE)).getAsString();
Class<?> typeClass = null;
try
{
typeClass = ClassResolveUtil.resolve(type);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
throw new JsonParseException(e.getMessage());
}
return context.deserialize(jsonObject.get(VALUE), typeClass);
}
}

View File

@ -0,0 +1,57 @@
package com.massivecraft.mcore5.util;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.plugin.SimplePluginManager;
import org.bukkit.plugin.java.JavaPluginLoader;
@SuppressWarnings("unchecked")
public class ClassResolveUtil
{
protected static Collection<JavaPluginLoader> javaPluginLoaders;
static
{
try
{
SimplePluginManager pluginManager = (SimplePluginManager)Bukkit.getPluginManager();
Field field = SimplePluginManager.class.getDeclaredField("fileAssociations");
field.setAccessible(true);
Map<Pattern, JavaPluginLoader> fileAssociations = (Map<Pattern, JavaPluginLoader>)field.get(pluginManager);
javaPluginLoaders = fileAssociations.values(); // Does this one autoupdate?
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static Class<?> resolve(String className) throws ClassNotFoundException
{
//System.out.println("resolve..."+this.javaPluginLoaders.toString());
Class<?> ret = null;
for (JavaPluginLoader javaPluginLoader : javaPluginLoaders)
{
ret = javaPluginLoader.getClassByName(className);
if (ret != null)
{
return ret;
}
}
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try
{
return classLoader.loadClass(className);
}
catch (ClassNotFoundException e)
{
return Class.forName(className, false, classLoader);
}
}
}

View File

@ -26,6 +26,11 @@ public class Txt
public static final long millisPerMonth = 31 * millisPerDay; public static final long millisPerMonth = 31 * millisPerDay;
public static final long millisPerYear = 365 * millisPerDay; public static final long millisPerYear = 365 * millisPerDay;
public static final Set<String> vowel = MUtil.set(
"A", "E", "I", "O", "U", "Y", "Å", "Ä", "Ö",
"a", "e", "i", "o", "u", "y", "å", "ä", "ö"
);
public static Map<String, Long> unitMillis; public static Map<String, Long> unitMillis;
static static
@ -328,20 +333,41 @@ public class Txt
return new SimpleEntry<String, String>(first, second); return new SimpleEntry<String, String>(first, second);
} }
public static boolean isVowel(String str)
{
if (str == null || str.length() == 0) return false;
return vowel.contains(str.substring(0, 1));
}
public static String aan(String noun)
{
return isVowel(noun) ? "an" : "a";
}
// -------------------------------------------- // // -------------------------------------------- //
// Material name tools // Material name tools
// -------------------------------------------- // // -------------------------------------------- //
public static String getMaterialName(Material material) public static String getNicedEnumString(String str)
{ {
List<String> parts = new ArrayList<String>(); List<String> parts = new ArrayList<String>();
for (String part : material.toString().toLowerCase().split("_")) for (String part : str.toLowerCase().split("_"))
{ {
parts.add(upperCaseFirst(part)); parts.add(upperCaseFirst(part));
} }
return implode(parts, " "); return implode(parts, " ");
} }
public static String getNicedEnum(Object enumObject)
{
return getNicedEnumString(enumObject.toString());
}
public static String getMaterialName(Material material)
{
return getNicedEnum(material);
}
public static String getMaterialName(int materialId) public static String getMaterialName(int materialId)
{ {
return getMaterialName(Material.getMaterial(materialId)); return getMaterialName(Material.getMaterial(materialId));