package org.transgalactica.fwk.test.clienthttp;
import java.io.IOException;
import java.net.URI;
import java.util.Set;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.util.Assert;
/**
* Implementation bouchon de ClientHttpRequestFactory permettant de fournir des
* flux de données a partir de ressources Spring.
*
* @see ResourceBoundClientHttpRequest
* @see ResourceBoundClientHttpRequestFactory
*
* @author Thierry
*/
public class ResourceBoundClientHttpRequestFactory implements ClientHttpRequestFactory, InitializingBean {
private Logger logger = LoggerFactory.getLogger(ResourceBoundClientHttpRequestFactory.class);
private Set<ResourceBoundHolder> resources;
protected ResourceBoundClientHttpRequestFactory() {
}
@Override
public void afterPropertiesSet() {
for (ResourceBoundHolder resource : resources) {
logger.info("Bind '{}' on '{}' / '{}' / '{}'", resource.getUri(), resource.getContentType(),
ArrayUtils.toString(resource.getMethods()), resource.getResource());
}
}
@Override
public ClientHttpRequest createRequest(final URI uri, final HttpMethod method) throws IOException {
Assert.notNull(uri, "No uri provided");
String uriAsText = uri.toString();
logger.info("Handling uri '{}'", uriAsText);
ResourceBoundHolder resource = findResource(uriAsText, method);
Assert.isTrue(resource != null, "Can't find resource for '" + method + "' / '" + uriAsText + "'");
ResourceBoundClientHttpResponse response = new ResourceBoundClientHttpResponse(resource.getContentType(),
resource.getStatus(), resource.getHeaders(), resource.getResource());
return new ResourceBoundClientHttpRequest(uri, method, response);
}
private ResourceBoundHolder findResource(String uriAsText, HttpMethod method) {
for (ResourceBoundHolder resource : resources) {
if (uriAsText.equals(resource.getUri()) && ArrayUtils.contains(resource.getMethods(), method)) {
return resource;
}
}
return null;
}
/*
* Accesseurs
*/
public Set<ResourceBoundHolder> getResources() {
return resources;
}
public void setResources(Set<ResourceBoundHolder> resources) {
this.resources = resources;
}
}