package fi.otavanopisto.muikku.plugins.dnm.service;
import java.lang.reflect.Array;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import fi.otavanopisto.muikku.controller.PluginSettingsController;
public class RestClient {
@Inject
private Logger logger;
@Inject
private PluginSettingsController pluginSettingsController;
public Document getDocument(Long id) {
return get("/documents/" + id, Document.class);
}
public Document[] listDocuments() {
return get("/documents", Document[].class);
}
public Document[] listDocuments(Date since) {
return get("/documents?since=" + since.getTime(), Document[].class);
}
public String getDocumentData(Long id) {
String url = pluginSettingsController.getPluginSetting("deus-nex-machina", "service.url");
String secret = pluginSettingsController.getPluginSetting("deus-nex-machina", "service.secret");
String path = "/documents/" + id + "/data";
Client client = getClient();
try {
WebTarget target = client.target(url + path);
Builder request = target.request();
request.header("Authorization", secret);
Response response = request.get();
try {
switch (response.getStatus()) {
case 200:
return response.readEntity(String.class);
default:
logger.log(Level.WARNING, String.format("GET-request into %s failed with status code %d", path, response.getStatus()));
break;
}
return null;
} catch (Throwable t) {
logger.log(Level.SEVERE, "GET-request into " + path + " failed", t);
} finally {
response.close();
}
} finally {
client.close();
}
return null;
}
private <T> T get(String path, Class<T> type) {
String url = pluginSettingsController.getPluginSetting("deus-nex-machina", "service.url");
String secret = pluginSettingsController.getPluginSetting("deus-nex-machina", "service.secret");
Client client = getClient();
try {
WebTarget target = client.target(url + path);
Builder request = target.request();
request.accept(MediaType.APPLICATION_JSON_TYPE);
request.header("Authorization", secret);
Response response = request.get();
try {
return createResponse(response, type);
} catch (Throwable t) {
logger.log(Level.SEVERE, "GET-request into " + path + " failed", t);
throw t;
} finally {
response.close();
}
} finally {
client.close();
}
}
@SuppressWarnings("unchecked")
private <T> T createResponse(Response response, Class<T> type) {
switch (response.getStatus()) {
case 200:
return response.readEntity(type);
case 204:
if (type.isArray()) {
return (T) Array.newInstance(type.getComponentType(), 0);
} else {
return null;
}
case 404:
return null;
default:
logger.log(Level.SEVERE, String.format("Could not process responce (status: %d, entity: %s)", response.getStatus(), response.getEntity()));
return null;
}
}
private Client getClient() {
return ClientBuilder.newClient();
}
}