package eu.europeana.service.ir.image.client.impl;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import eu.europeana.service.ir.image.client.IRImageConfiguration;
import eu.europeana.service.ir.image.client.ImageSearchingClient;
import eu.europeana.service.ir.image.client.exception.ApiConnectionException;
import eu.europeana.service.ir.image.client.exception.ImageSearchApiException;
import eu.europeana.service.ir.image.client.impl.abstracts.BaseIrApiConnection;
import eu.europeana.service.ir.image.client.impl.result.ImageSearchResults;
public class ImageSearchingClientImpl extends BaseIrApiConnection implements ImageSearchingClient{
public ImageSearchingClientImpl(String irServiceUri, String apiKey) {
super(irServiceUri, apiKey);
initConfiguration();
}
public ImageSearchingClientImpl() {
this(null, null);
setApiKey(getConfiguration().getApiKey());
setIrServiceUri(getConfiguration().getIrImageSearchUri());
}
protected void initConfiguration() {
configuration = new IRImageConfigurationImpl();
configuration.init();
}
private IRImageConfiguration configuration;
// //private RestClientProperties clientProperties;
// private DefaultHttpClient httpClient;
public void setConfiguration(IRImageConfiguration configuration) {
this.configuration = configuration;
}
public IRImageConfiguration getConfiguration() {
return configuration;
}
@Override
public ImageSearchResults searchById(String resourceId, int startPos, int rows) throws ImageSearchApiException{
logger.info("Search by id: " + resourceId);
String url = buildInvokationUrl("/searchById.json", getApiKey());
url = appendStartAndRows(url, startPos, rows);
url+= "&queryImageId=" + resourceId;
ImageSearchResults results = null;
try {
results = getImageSearchResults(url);
} catch (IOException e) {
throw new ImageSearchApiException("Cannot invoke search by imageId: " + url, e);
}
logger.trace("Number of retrieved results: " + results.getItemsCount());
logger.debug("Total results: " + results.getTotalResults());
return results;
}
@Override
public ImageSearchResults searchByUrl(String imageUrl, int startPos, int rows ) throws ImageSearchApiException, UnsupportedEncodingException{
logger.info("Search by url: " + imageUrl);
String encodedImageUrl = URLEncoder.encode(imageUrl, "UTF-8");
logger.trace("Encoded url: " + encodedImageUrl);
String url = buildInvokationUrl("/searchByUrl.json", getApiKey());
url = appendStartAndRows(url, startPos, rows);
url+= "&queryImageUrl=" + encodedImageUrl;
ImageSearchResults results = null;
try {
results = getImageSearchResults(url);
} catch (IOException e) {
throw new ImageSearchApiException("Cannot invoke search by imageUrl : " + url, e);
}
logger.trace("Number of retrieved results: " + results.getItemsCount());
logger.debug("Total results: " + results.getTotalResults());
return results;
}
protected String appendStartAndRows(String url, int startPos, int rows) {
if(startPos > 0)
url+= "&start=" + startPos;
if(rows > 0)
url+= "&rows=" + rows;
return url;
}
@Override
public String getComponentNameFromRest(){
String url = buildInvokationUrl("/component", null);
logger.trace("Get component name: " + url);
try {
// Map<String, String> acceptHeader = new HashMap<String, String>(1);
// acceptHeader.put("Content-Type", "text/*");
// acceptHeader.put("Accept", "text/*");
// assert (acceptHeader.size() == 2);
return getHttpConnection().getURLContent(url, null);
} catch (IOException e) {
throw new ApiConnectionException("cannot retrieve component name from the API interface!", e);
}
}
/**
* Creates URL based on the URI passed in.
*/
protected String buildInvokationUrl(String action, String apiKey) {
StringBuilder sb = new StringBuilder();
sb.append(getConfiguration().getIrImageSearchUri());
//sb.append("/").append(getConfiguration().getComponentName());
//sb.append(uri);
sb.append(action);
sb.append("?wsKey=").append(apiKey);
return sb.toString();
}
}