/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.services.restutil;
import java.net.URI;
import javax.ws.rs.core.MediaType;
import org.codehaus.jettison.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.services.util.SecurityUtils;
import com.emc.storageos.svcs.errorhandling.resources.InternalException;
import com.google.gson.Gson;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
public abstract class StandardRestClient implements RestClientItf {
protected Client _client;
protected String _username;
protected String _password;
protected String _authToken;
protected URI _base;
private static Logger log = LoggerFactory.getLogger(StandardRestClient.class);
@Override
public ClientResponse get(URI uri) throws InternalException {
URI requestURI = _base.resolve(uri);
ClientResponse response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON).get(
ClientResponse.class);
if (authenticationFailed(response)) {
closeResponse(response);
authenticate();
response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON).get(ClientResponse.class);
}
checkResponse(uri, response);
return response;
}
@Override
public ClientResponse put(URI uri, String body) throws InternalException {
URI requestURI = _base.resolve(uri);
ClientResponse response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.put(ClientResponse.class, body);
if (authenticationFailed(response)) {
closeResponse(response);
authenticate();
response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.put(ClientResponse.class, body);
}
checkResponse(uri, response);
return response;
}
@Override
public ClientResponse post(URI uri, String body) throws InternalException {
URI requestURI = _base.resolve(uri);
ClientResponse response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.post(ClientResponse.class, body);
if (authenticationFailed(response)) {
closeResponse(response);
authenticate();
response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.post(ClientResponse.class, body);
}
checkResponse(uri, response);
return response;
}
@Override
public ClientResponse delete(URI uri) throws InternalException {
URI requestURI = _base.resolve(uri);
ClientResponse response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.delete(ClientResponse.class);
if (authenticationFailed(response)) {
closeResponse(response);
authenticate();
response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.delete(ClientResponse.class);
}
checkResponse(uri, response);
return response;
}
public ClientResponse delete(URI uri, String body) throws InternalException {
URI requestURI = _base.resolve(uri);
ClientResponse response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.delete(ClientResponse.class, body);
if (authenticationFailed(response)) {
closeResponse(response);
authenticate();
response = setResourceHeaders(_client.resource(requestURI)).type(MediaType.APPLICATION_JSON)
.delete(ClientResponse.class);
}
checkResponse(uri, response);
return response;
}
/**
* Close the entity input stream
*
* @param clientRespopnse ClientResponse to be closed
*/
public void closeResponse(ClientResponse clientResp) {
if (clientResp != null) {
clientResp.close();
}
}
@Override
public void close() throws InternalException {
_client.destroy();
}
private boolean authenticationFailed(ClientResponse response) {
return response.getClientResponseStatus() == com.sun.jersey.api.client.ClientResponse.Status.UNAUTHORIZED;
}
protected <T> T getResponseObject(Class<T> clazz, ClientResponse response) throws Exception {
JSONObject resp = response.getEntity(JSONObject.class);
T respObject = new Gson().fromJson(SecurityUtils.sanitizeJsonString(resp.toString()), clazz);
return respObject;
}
protected <T> String getJsonForEntity(T model) throws Exception {
return new Gson().toJson(model);
}
abstract protected WebResource.Builder setResourceHeaders(WebResource resource);
abstract protected void authenticate();
protected void authenticate1() {
}
abstract protected int checkResponse(URI uri, ClientResponse response);
}