/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package net.acesinc.convergentui.content;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.zuul.context.RequestContext;
import java.awt.image.BufferedImage;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
/**
*
* @author andrewserff
*/
public class ContentFetchCommand extends HystrixCommand<ContentResponse> {
private static final Logger log = LoggerFactory.getLogger(ContentFetchCommand.class);
private RestTemplate restTemplate;
private ProxyRequestHelper helper;
private String location;
private RequestContext requestContext;
public ContentFetchCommand(String location, RequestContext requestContext, RestTemplate restTemplate) {
super(HystrixCommandGroupKey.Factory.asKey("content-fetch"));
this.location = location;
this.requestContext = requestContext;
this.restTemplate = restTemplate;
helper = new ProxyRequestHelper();
}
@Override
protected ContentResponse run() throws Exception {
log.debug("Getting live content from [ " + location + " ]");
try {
HttpServletRequest request = requestContext.getRequest();
MultiValueMap<String, String> headers = this.helper
.buildZuulRequestHeaders(request);
if (request.getQueryString() != null && !request.getQueryString().isEmpty()) {
MultiValueMap<String, String> params = this.helper
.buildZuulRequestQueryParams(request);
}
HttpHeaders requestHeaders = new HttpHeaders();
for (String key : headers.keySet()) {
for (String s : headers.get(key)) {
requestHeaders.add(key, s);
}
}
HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
ResponseEntity<Object> exchange = this.restTemplate.exchange(location, HttpMethod.GET, requestEntity, Object.class);
ContentResponse response = new ContentResponse();
response.setContent(exchange.getBody());
response.setContentType(exchange.getHeaders().getContentType());
response.setError(false);
return response;
} catch (Exception e) {
log.debug("Error fetching live content from [ " + location + " ]", e);
throw e;
}
}
@Override
protected ContentResponse getFallback() {
log.debug("ContentFetch failed for [ " + location + " ]. Returing fallback response");
ContentResponse response = new ContentResponse();
response.setContent("");
response.setError(true);
String defaultErrorMsg = getFailedExecutionException().getMessage();
if (defaultErrorMsg == null || defaultErrorMsg.isEmpty()) {
defaultErrorMsg = "Unknown Error";
}
//see if we can get a better error message
Exception errorFromThrowable = getExceptionFromThrowable(getExecutionException());
String errMessage = (errorFromThrowable != null) ? errorFromThrowable.getMessage() : defaultErrorMsg;
response.setMessage(errMessage);
return response;
}
}