package eu.lod2.rsine.remotenotification;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.impl.URIImpl;
import javax.naming.ServiceUnavailableException;
import java.io.IOException;
import java.net.URISyntaxException;
public class HttpHeaderRemoteServiceDetector implements IRemoteServiceDetector {
private final String RSINE_URI_HEADERNAME = "rsineUrl";
@Override
public URI getRemoteService(Resource resource) throws ServiceUnavailableException {
try {
Header[] responseHeaders = getResponseHeaders(resource.stringValue());
if (responseHeaders.length == 1) {
return new URIImpl(responseHeaders[0].getValue());
}
else {
throw new ServiceUnavailableException("No rsine uri for resource " +resource.toString()+ " found");
}
}
catch (URISyntaxException e) {
throw new ServiceUnavailableException("Resource " +resource.toString()+ " ist not a valid URI");
}
catch (IOException e) {
throw new ServiceUnavailableException("Error connecting to remote concept hosting service: " +resource.toString());
}
catch (IllegalArgumentException e) {
throw new ServiceUnavailableException("Received rsine uri not valid");
}
}
private Header[] getResponseHeaders(String uri) throws URISyntaxException, IOException {
HttpGet httpGet = new HttpGet(new java.net.URI(uri));
HttpResponse response = new DefaultHttpClient().execute(httpGet);
return response.getHeaders(RSINE_URI_HEADERNAME);
}
}