package net.udrunk.infra.resttemplate;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import android.util.Log;
import com.google.gson.Gson;
public class UdrunkJsonHttpMessageConverter extends GsonHttpMessageConverter {
private Gson gson;
public UdrunkJsonHttpMessageConverter(Gson gson) {
super(gson);
this.gson = gson;
}
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
Field[] fileds = object.getClass().getDeclaredFields();
Map<String, Object> map = new HashMap<String, Object>();
for(Field field:fileds)
{
try {
field.setAccessible(true);
if(field.getType().getName().contains("net.udrunk.domain"))
{
if(field.get(object) != null)
{
Log.d("UdrunkJsonHttpMessageConverter", "Replace json property with api value :" + field.get(object).getClass().getName());
Field idField = field.get(object).getClass().getDeclaredField("id");
idField.setAccessible(true);
map.put(field.getName(), "/api/v1/" + field.getName() + "/" + idField.get(field.get(object)) + "/");
}
}
else
{
map.put(field.getName(), field.get(object));
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
Log.d("UdrunkJsonHttpMessageConverter", gson.toJson(map));
outputMessage.getBody().write(gson.toJson(map).getBytes());
}
}