package com.acuitra.stages.integrated; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.acuitra.pipeline.Context; import com.acuitra.pipeline.ContextWithJerseyClient; import com.acuitra.pipeline.Pipeline; import com.acuitra.pipeline.Stage; import com.acuitra.question.core.Answer; import com.acuitra.question.core.Question; import com.acuitra.stages.StageException; import com.acuitra.stages.answer.ProcessSPARQLResultStage; import com.acuitra.stages.answer.RunSPARQLQueryStage; import com.acuitra.stages.question.QuepyStage; import com.sun.jersey.api.client.Client; public class IntegratedQuepyStage implements Stage<Question, List<Answer>> { private ContextWithJerseyClient<Question, List<Answer>> context; private List<Answer> answers = new ArrayList<>(); private String quepyURL; private String sparqlEndpointURL; private Client jerseyClient; public IntegratedQuepyStage(String quepyURL, String sparqlEndpointURL, Client jerseyClient) { super(); this.quepyURL = quepyURL; this.sparqlEndpointURL = sparqlEndpointURL; this.jerseyClient = jerseyClient; } @Override public void loadContext(Context<Question, List<Answer>> ctx) { this.context = (ContextWithJerseyClient<Question, List<Answer>>) ctx; } @Override public void execute() { Question question = context.getInput(); try { // use Quepy to parse the question Pipeline<Question, List<String>> questionPipeline = new Pipeline<>(); questionPipeline.addStage(new QuepyStage(quepyURL)); ContextWithJerseyClient<Question, List<String>> questionCtx = new ContextWithJerseyClient<Question, List<String>>(jerseyClient); questionCtx.setInput(question); questionPipeline.execute(questionCtx); // try to obtain an answer Pipeline<Map<String,List<String>>, List<String>> generateQuepyAnswerPipeline = new Pipeline<>(); generateQuepyAnswerPipeline.addStage(new RunSPARQLQueryStage(sparqlEndpointURL)); generateQuepyAnswerPipeline.addStage(new ProcessSPARQLResultStage(RunSPARQLQueryStage.class.getName())); ContextWithJerseyClient<Map<String,List<String>>, List<String>> answerContext = new ContextWithJerseyClient<>(jerseyClient); answerContext.setInput(questionCtx.getPreviousOutputs()); generateQuepyAnswerPipeline.execute(answerContext); Map<String, List<String>> answerMap = answerContext.getPreviousOutputs(); List<String> answerValues = answerMap.get(ProcessSPARQLResultStage.class.getName()); for (String answerValue : answerValues) { Answer answer = new Answer(); answer.setQuestion(question); answer.setAnswer(answerValue); answers.add(answer); } } catch (StageException e) { Answer answer = new Answer(); answer.setQuestion(question); answer.setErrorMessage(e.getLocalizedMessage()); answer.setErrorCode(e.getErrorCode()); } } @Override public List<Answer> getOutput() { return answers; } @Override public String getKeyName() { return this.getClass().getName(); } }