package io.gsonfire.postprocessors.methodinvoker;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import io.gsonfire.PostProcessor;
import io.gsonfire.annotations.ExposeMethodResult;
import io.gsonfire.gson.FireExclusionStrategy;
import io.gsonfire.gson.FireExclusionStrategyComposite;
import java.lang.reflect.InvocationTargetException;
/**
* @autor: julio
*/
public final class MethodInvokerPostProcessor<T> implements PostProcessor<T> {
private static MappedMethodInspector methodInspector = new MappedMethodInspector();
private final FireExclusionStrategy serializationExclusionStrategy;
public MethodInvokerPostProcessor() {
this(new FireExclusionStrategyComposite());
}
public MethodInvokerPostProcessor(FireExclusionStrategy serializationExclusionStrategy) {
this.serializationExclusionStrategy = serializationExclusionStrategy;
}
@Override
public void postDeserialize(T result, JsonElement src, Gson gson) {
//nothing here
}
@Override
public void postSerialize(JsonElement result, T src, Gson gson) {
if(result.isJsonObject()){
JsonObject jsonObject = result.getAsJsonObject();
for(MappedMethod m: methodInspector.getAnnotatedMembers(src.getClass(), ExposeMethodResult.class)){
if(!serializationExclusionStrategy.shouldSkipMethod(m)) {
try {
if (m.getConflictResolutionStrategy() == ExposeMethodResult.ConflictResolutionStrategy.OVERWRITE || (m.getConflictResolutionStrategy() == ExposeMethodResult.ConflictResolutionStrategy.SKIP && !jsonObject.has(m.getSerializedName()))) {
Object value = m.getMethod().invoke(src);
jsonObject.add(m.getSerializedName(), gson.toJsonTree(value));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
}