package doser.server.actions.disambiguation;
import java.util.LinkedList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import doser.entitydisambiguation.backend.DisambiguationMainService;
import doser.entitydisambiguation.backend.AbstractDisambiguationTask;
import doser.entitydisambiguation.backend.DisambiguationTaskCollective;
import doser.entitydisambiguation.backend.DisambiguationTaskSingle;
import doser.entitydisambiguation.dpo.DisambiguatedEntity;
import doser.entitydisambiguation.dpo.DisambiguationRequest;
import doser.entitydisambiguation.dpo.DisambiguationResponse;
import doser.entitydisambiguation.dpo.EntityDisambiguationDPO;
import doser.entitydisambiguation.dpo.Response;
import doser.entitydisambiguation.properties.Properties;
import doser.language.Languages;
import doser.webclassify.annotation.AnnotateCategories;
@Controller
@RequestMapping("/disambiguation")
public class DisambiguationService {
private AnnotateCategories categoryAnnotation;
public DisambiguationService() {
super();
this.categoryAnnotation = new AnnotateCategories();
}
@RequestMapping(value = "/disambiguateWithoutCategories-single", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody DisambiguationResponse annotateSingle(@RequestBody final DisambiguationRequest request) {
DisambiguationResponse annotationResponse = disambiguateSingle(request);
return annotationResponse;
}
@RequestMapping(value = "/disambiguateWithCategories-single", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody DisambiguationResponse annotateSingleWithCategories(
@RequestBody final DisambiguationRequest request) {
DisambiguationResponse annotationResponse = disambiguateSingle(request);
List<Response> response = annotationResponse.getTasks();
for (Response res : response) {
List<DisambiguatedEntity> entities = res.getDisEntities();
for (DisambiguatedEntity entity : entities) {
this.categoryAnnotation.annotateCategories(entity, Languages.english);
}
}
return annotationResponse;
}
@RequestMapping(value = "/disambiguationWithoutCategories-collective", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody DisambiguationResponse annotateCollectiveWithoutCategories(
@RequestBody final DisambiguationRequest request) {
final DisambiguationResponse response = new DisambiguationResponse();
final DisambiguationMainService mainService = DisambiguationMainService.getInstance();
final List<EntityDisambiguationDPO> listToDis = request.getSurfaceFormsToDisambiguate();
if (mainService != null) {
final List<AbstractDisambiguationTask> tasks = new LinkedList<AbstractDisambiguationTask>();
DisambiguationTaskCollective collectiveTask = new DisambiguationTaskCollective(listToDis,
request.getMainTopic());
collectiveTask.setKbIdentifier("default", "EntityCentric");
collectiveTask.setReturnNr(1000);
tasks.add(collectiveTask);
mainService.disambiguate(tasks);
List<Response> responses = collectiveTask.getResponse();
System.out.println("CALLUP" + responses);
response.setTasks(responses);
response.setDocumentUri(request.getDocumentUri());
}
return response;
}
@RequestMapping(value = "/disambiguationWithoutCategoriesBiomed-collective", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody DisambiguationResponse annotateCollectiveWithoutCategoriesBiomed(
@RequestBody final DisambiguationRequest request) {
final DisambiguationResponse response = new DisambiguationResponse();
final DisambiguationMainService mainService = DisambiguationMainService.getInstance();
final List<EntityDisambiguationDPO> listToDis = request.getSurfaceFormsToDisambiguate();
if (mainService != null) {
final List<AbstractDisambiguationTask> tasks = new LinkedList<AbstractDisambiguationTask>();
DisambiguationTaskCollective collectiveTask = new DisambiguationTaskCollective(listToDis,
request.getMainTopic());
collectiveTask.setKbIdentifier("biomed", "EntityCentric");
collectiveTask.setReturnNr(1000);
tasks.add(collectiveTask);
mainService.disambiguate(tasks);
List<Response> responses = collectiveTask.getResponse();
response.setTasks(responses);
response.setDocumentUri(request.getDocumentUri());
}
return response;
}
private DisambiguationResponse disambiguateSingle(DisambiguationRequest request) {
final DisambiguationResponse response = new DisambiguationResponse();
final List<EntityDisambiguationDPO> listToDis = request.getSurfaceFormsToDisambiguate();
List<Response> responseList = new LinkedList<Response>();
response.setDocumentUri(request.getDocumentUri());
final List<AbstractDisambiguationTask> tasks = new LinkedList<AbstractDisambiguationTask>();
final DisambiguationMainService mainService = DisambiguationMainService.getInstance();
if (mainService != null) {
int docsToReturn = 0;
if (request.getDocsToReturn() == null) {
docsToReturn = Properties.getInstance().getDisambiguationResultSize();
} else {
docsToReturn = request.getDocsToReturn();
}
for (int i = 0; i < listToDis.size(); i++) {
EntityDisambiguationDPO dpo = listToDis.get(i);
DisambiguationTaskSingle task = new DisambiguationTaskSingle(dpo);
task.setReturnNr(docsToReturn);
task.setKbIdentifier(listToDis.get(i).getKbversion(), listToDis.get(i).getSetting());
// Bugfix! Selected text may not be null. Should be ""
// String instead;
if (dpo.getSelectedText() != null) {
tasks.add(task);
}
}
mainService.disambiguate(tasks);
}
for (AbstractDisambiguationTask task : tasks) {
responseList.add(task.getResponse().get(0));
}
response.setTasks(responseList);
return response;
}
}