Maintain detailed types of superclass actual type arguments.
This commit is contained in:
parent
81e4aae209
commit
50ccfc73fa
@ -2,6 +2,7 @@ package com.massivecraft.massivecore.adapter;
|
|||||||
|
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -13,6 +14,7 @@ import com.massivecraft.massivecore.xlib.gson.JsonNull;
|
|||||||
import com.massivecraft.massivecore.xlib.gson.JsonParseException;
|
import com.massivecraft.massivecore.xlib.gson.JsonParseException;
|
||||||
import com.massivecraft.massivecore.xlib.gson.JsonSerializationContext;
|
import com.massivecraft.massivecore.xlib.gson.JsonSerializationContext;
|
||||||
import com.massivecraft.massivecore.xlib.gson.JsonSerializer;
|
import com.massivecraft.massivecore.xlib.gson.JsonSerializer;
|
||||||
|
import com.massivecraft.massivecore.xlib.gson.internal.$Gson$Types;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the abstract adapter for all "Massive structures".
|
* This is the abstract adapter for all "Massive structures".
|
||||||
@ -28,8 +30,10 @@ public abstract class MassiveXAdapter<T> implements JsonDeserializer<T>, JsonSer
|
|||||||
@Override
|
@Override
|
||||||
public JsonElement serialize(T src, Type type, JsonSerializationContext context)
|
public JsonElement serialize(T src, Type type, JsonSerializationContext context)
|
||||||
{
|
{
|
||||||
|
ParameterizedType ptype = (ParameterizedType) type;
|
||||||
|
|
||||||
// Calculate def
|
// Calculate def
|
||||||
Class<?> clazz = getClazz(type);
|
Class<?> clazz = getClazz(ptype);
|
||||||
boolean def = Def.class.isAssignableFrom(clazz);
|
boolean def = Def.class.isAssignableFrom(clazz);
|
||||||
|
|
||||||
// If this is a Def ...
|
// If this is a Def ...
|
||||||
@ -46,7 +50,7 @@ public abstract class MassiveXAdapter<T> implements JsonDeserializer<T>, JsonSer
|
|||||||
{
|
{
|
||||||
// ... then serialize it as if it were the regular Java collection!
|
// ... then serialize it as if it were the regular Java collection!
|
||||||
// SUPER TYPE x2 EXAMPLE: MassiveListDef --> MassiveList --> ArrayList
|
// SUPER TYPE x2 EXAMPLE: MassiveListDef --> MassiveList --> ArrayList
|
||||||
return context.serialize(src, getSuperType(getSuperType(type)));
|
return context.serialize(src, getSuperType(getSuperType(ptype)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If this a regular Massive structure and not a Def ...
|
// If this a regular Massive structure and not a Def ...
|
||||||
@ -54,15 +58,25 @@ public abstract class MassiveXAdapter<T> implements JsonDeserializer<T>, JsonSer
|
|||||||
{
|
{
|
||||||
// ... then serialize it as if it were the regular java collection!
|
// ... then serialize it as if it were the regular java collection!
|
||||||
// SUPER TYPE x1 EXAMPLE: MassiveList --> ArrayList
|
// SUPER TYPE x1 EXAMPLE: MassiveList --> ArrayList
|
||||||
return context.serialize(src, getSuperType(type));
|
return context.serialize(src, getSuperType(ptype));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException
|
public T deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException
|
||||||
{
|
{
|
||||||
|
ParameterizedType ptype = (ParameterizedType) type;
|
||||||
|
|
||||||
|
/*// TODO: Temporary Debug
|
||||||
|
if (MUtil.getStackTraceString().contains("com.massivecraft.factions.entity.FactionColl.init"))
|
||||||
|
{
|
||||||
|
typeDebug(ptype);
|
||||||
|
typeDebug(getSuperType(ptype));
|
||||||
|
typeDebug(getSuperType(getSuperType(ptype)));
|
||||||
|
}*/
|
||||||
|
|
||||||
// Calculate def
|
// Calculate def
|
||||||
Class<?> clazz = getClazz(type);
|
Class<?> clazz = getClazz(ptype);
|
||||||
boolean def = Def.class.isAssignableFrom(clazz);
|
boolean def = Def.class.isAssignableFrom(clazz);
|
||||||
|
|
||||||
// If this is a Def ...
|
// If this is a Def ...
|
||||||
@ -70,7 +84,7 @@ public abstract class MassiveXAdapter<T> implements JsonDeserializer<T>, JsonSer
|
|||||||
{
|
{
|
||||||
// ... then deserialize it as if it were the regular Java collection!
|
// ... then deserialize it as if it were the regular Java collection!
|
||||||
// SUPER TYPE x2 EXAMPLE: MassiveListDef --> MassiveList --> ArrayList
|
// SUPER TYPE x2 EXAMPLE: MassiveListDef --> MassiveList --> ArrayList
|
||||||
Object parent = context.deserialize(json, getSuperType(getSuperType(type)));
|
Object parent = context.deserialize(json, getSuperType(getSuperType(ptype)));
|
||||||
return create(parent, def, json, type, context);
|
return create(parent, def, json, type, context);
|
||||||
}
|
}
|
||||||
// If this a regular Massive structure and not a Def ...
|
// If this a regular Massive structure and not a Def ...
|
||||||
@ -87,12 +101,25 @@ public abstract class MassiveXAdapter<T> implements JsonDeserializer<T>, JsonSer
|
|||||||
{
|
{
|
||||||
// ... then deserialize it as if it were the regular java collection!
|
// ... then deserialize it as if it were the regular java collection!
|
||||||
// SUPER TYPE x1 EXAMPLE: MassiveList --> ArrayList
|
// SUPER TYPE x1 EXAMPLE: MassiveList --> ArrayList
|
||||||
Object parent = context.deserialize(json, getSuperType(type));
|
Object parent = context.deserialize(json, getSuperType(ptype));
|
||||||
return create(parent, def, json, type, context);
|
return create(parent, def, json, type, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public static void typeDebug(ParameterizedType ptype)
|
||||||
|
{
|
||||||
|
System.out.println("=== Type Debug Start ===");
|
||||||
|
|
||||||
|
System.out.println(ptype.toString());
|
||||||
|
|
||||||
|
ParameterizedType parameterizedType = (ParameterizedType) ptype;
|
||||||
|
System.out.println("Actual Type Arguments: " + Txt.implode(parameterizedType.getActualTypeArguments(), ", "));
|
||||||
|
|
||||||
|
System.out.println("=== Type Debug End ===");
|
||||||
|
}*/
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// ABSTRACT
|
// ABSTRACT
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -103,18 +130,38 @@ public abstract class MassiveXAdapter<T> implements JsonDeserializer<T>, JsonSer
|
|||||||
// UTIL
|
// UTIL
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
public static Class<?> getClazz(Type type)
|
public static Class<?> getClazz(ParameterizedType ptype)
|
||||||
{
|
{
|
||||||
ParameterizedType parameterizedType = (ParameterizedType) type;
|
return (Class<?>)ptype.getRawType();
|
||||||
Class<?> clazz = (Class<?>)parameterizedType.getRawType();
|
|
||||||
return clazz;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Type getSuperType(Type type)
|
public static ParameterizedType getSuperType(ParameterizedType ptype)
|
||||||
{
|
{
|
||||||
Class<?> clazz = getClazz(type);
|
// ------- SELF -------
|
||||||
Type superclazz = clazz.getGenericSuperclass();
|
|
||||||
return superclazz;
|
// Get args
|
||||||
|
Type[] args = ptype.getActualTypeArguments();
|
||||||
|
|
||||||
|
// Get clazz
|
||||||
|
Class<?> clazz = (Class<?>)ptype.getRawType();
|
||||||
|
|
||||||
|
// ------- SUPER -------
|
||||||
|
|
||||||
|
// Get stype
|
||||||
|
ParameterizedType sptype = (ParameterizedType) clazz.getGenericSuperclass();
|
||||||
|
|
||||||
|
// Get sargs
|
||||||
|
// NOTE: These will be broken! we can however look at the count!
|
||||||
|
Type[] sargs = sptype.getActualTypeArguments();
|
||||||
|
|
||||||
|
// Get sclazz
|
||||||
|
Class<?> sclazz = (Class<?>)sptype.getRawType();
|
||||||
|
|
||||||
|
// ------- CONSTRUCTED -------
|
||||||
|
|
||||||
|
Type[] typeArguments = Arrays.copyOfRange(args, 0, sargs.length);
|
||||||
|
|
||||||
|
return $Gson$Types.newParameterizedTypeWithOwner(null, sclazz, typeArguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Object getNewArgumentInstance(Type type, int index)
|
public static Object getNewArgumentInstance(Type type, int index)
|
||||||
|
Loading…
Reference in New Issue
Block a user