package org.netmelody.cieye.server.observation.protocol;
import org.netmelody.cieye.core.logging.LogKeeper;
import org.netmelody.cieye.core.logging.Logbook;
import org.netmelody.cieye.core.observation.Contact;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonParser;
public final class JsonRestRequester implements Contact {
private static final Logbook LOG = LogKeeper.logbookFor(JsonRestRequester.class);
private final Gson json;
private final GrapeVine channel;
private final Function<String, String> contentMunger;
public JsonRestRequester(Gson jsonTranslator) {
this(jsonTranslator, Functions.<String>identity(), new RestRequester("", ""));
}
public JsonRestRequester(Gson jsonTranslator, Function<String, String> contentMunger, GrapeVine channel) {
this.channel = channel;
this.json = jsonTranslator;
this.contentMunger = contentMunger;
}
@Override
public boolean privileged() {
return channel.privileged();
}
@Override
public <T> T makeJsonRestCall(String url, Class<T> type) {
T result = null;
String content = "";
try {
content = contentMunger.apply(channel.doGet(url));
result = json.fromJson(content, type);
}
catch (Exception e) {
LOG.error(String.format("Failed to parse json from (%s) of:\n %s", url, content), e);
}
if (null == result) {
if (null == content || content.isEmpty()) {
LOG.warn("null result for json request: " + url);
}
try {
result = type.newInstance();
}
catch (Exception e) {
LOG.error("Failed to instantiate " + type.getName(), e);
}
}
return result;
}
@Override
public JsonElement makeJsonRestCall(String url) {
String content = null;
JsonElement result = null;
try {
content = contentMunger.apply(channel.doGet(url));
result = new JsonParser().parse(content);
}
catch (Exception e) {
LOG.error(String.format("Failed to parse json from (%s) of:\n %s", url, content), e);
}
return (result == null) ? JsonNull.INSTANCE : result;
}
@Override
public void doPost(String url) {
channel.doPost(url);
}
@Override
public void doPut(String url, String content) {
channel.doPut(url, content);
}
public void shutdown() {
channel.shutdown();
}
}