package com.acuitra.stages.answer;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MultivaluedMap;
import com.acuitra.ErrorCodes;
import com.acuitra.pipeline.ContextWithJerseyClient;
import com.acuitra.stages.StageException;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class RunSPARQLQueryStage extends AbstractAnswerStage {
public static final String EXPECTED_INPUT_NAME = "SPARQL-QUERY";
String sparqlEndpointURL;
public RunSPARQLQueryStage(String sparqlEndpointURL) {
super();
this.sparqlEndpointURL = sparqlEndpointURL;
}
@Override
public void execute() {
Map<String,List<String>> input = getContext().getInput();
// note this only runs the first query
String query = input.get(EXPECTED_INPUT_NAME).get(0);
if (query == null || query.length() == 0) {
throw new StageException("Could not find query to run. Looked for key " + EXPECTED_INPUT_NAME, ErrorCodes.INTERNAL_ERROR);
}
Client jerseyClient = ((ContextWithJerseyClient) getContext()).getJerseyClient();
WebResource webResource = jerseyClient.resource(sparqlEndpointURL);
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
params.add("output", "json");
params.add("query", query);
// Run the query and get the response
ClientResponse response = webResource.queryParams(params).get(ClientResponse.class);
String output = response.getEntity(String.class);
this.setOutput(output);
}
}