package uk.ac.ebi.ep.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import uk.ac.ebi.ep.data.domain.UniprotEntry;
import uk.ac.ebi.ep.data.search.model.Compound;
import uk.ac.ebi.ep.data.search.model.Disease;
import uk.ac.ebi.ep.data.search.model.EcNumber;
import uk.ac.ebi.ep.data.search.model.SearchFilters;
import uk.ac.ebi.ep.data.search.model.SearchModel;
import uk.ac.ebi.ep.data.search.model.SearchParams;
import uk.ac.ebi.ep.data.search.model.SearchResults;
import uk.ac.ebi.ep.data.search.model.Species;
import uk.ac.ebi.ep.data.search.model.Taxonomy;
/**
*
* @author joseph
*/
@Controller
public class BrowseTaxonomyController extends AbstractController {
private static final Logger logger = Logger.getLogger(BrowseTaxonomyController.class);
private static final String ORGANISMS = "/organisms";
private static final String BROWSE_TAXONOMY = "/browse/taxonomy";
private static final String SEARCH_TAXONOMY = "/search/organisms";
private static final String RESULT = "/searches";
private static final String SEARCH_BY_TAX_ID = "/taxonomy";
private static final String GET_COUNT_FOR_ORGANISMS = "/service/organism-count";
private static final int SEARCH_PAGESIZE = 10;
@RequestMapping(value = BROWSE_TAXONOMY, method = RequestMethod.GET)
public String showOrganisms(Model model) {
SearchModel searchModelForm = searchform();
model.addAttribute("searchModel", searchModelForm);
model.addAttribute(BROWSE_VIDEO, BROWSE_VIDEO);
return ORGANISMS;
}
@RequestMapping(value = SEARCH_BY_TAX_ID, method = RequestMethod.GET)
public String searchByTaxId(@ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "entryid", required = true) Long entryID, @RequestParam(value = "entryname", required = false) String entryName,
Model model, HttpServletRequest request, HttpSession session, Pageable pageable, RedirectAttributes attributes) {
pageable = new PageRequest(0, SEARCH_PAGESIZE, Sort.Direction.ASC, "function", "entryType");
Page<UniprotEntry> page = this.enzymePortalService.findEnzymesByTaxonomy(entryID, pageable);
List<Species> species = enzymePortalService.findSpeciesByTaxId(entryID);
List<Compound> compouds = enzymePortalService.findCompoundsByTaxId(entryID);
List<Disease> diseases = enzymePortalService.findDiseasesByTaxId(entryID);
List<EcNumber> enzymeFamilies = enzymePortalService.findEnzymeFamiliesByTaxId(entryID);
SearchParams searchParams = searchModel.getSearchparams();
searchParams.setStart(0);
searchParams.setType(SearchParams.SearchType.KEYWORD);
searchParams.setText(entryName);
searchParams.setSize(SEARCH_PAGESIZE);
searchModel.setSearchparams(searchParams);
List<UniprotEntry> result = page.getContent();
int current = page.getNumber() + 1;
int begin = Math.max(1, current - 5);
int end = Math.min(begin + 10, page.getTotalPages());
model.addAttribute("page", page);
model.addAttribute("beginIndex", begin);
model.addAttribute("endIndex", end);
model.addAttribute("currentIndex", current);
model.addAttribute("organismName", entryName);
model.addAttribute("taxId", entryID);
// model.addAttribute("summaryEntries", result);
SearchResults searchResults = new SearchResults();
searchResults.setTotalfound(page.getTotalElements());
SearchFilters filters = new SearchFilters();
filters.setSpecies(species);
filters.setCompounds(compouds);
filters.setEcNumbers(enzymeFamilies);
filters.setDiseases(diseases);
searchResults.setSearchfilters(filters);
searchResults.setSummaryentries(result);
searchModel.setSearchresults(searchResults);
model.addAttribute("searchModel", searchModel);
model.addAttribute("searchConfig", searchConfig);
model.addAttribute("searchFilter", filters);
String searchKey = getSearchKey(searchModel.getSearchparams());
cacheSearch(session.getServletContext(), searchKey, searchResults);
setLastSummaries(session, searchResults.getSummaryentries());
clearHistory(session);
addToHistory(session, searchModel.getSearchparams().getType(),
searchKey);
request.setAttribute("searchTerm", searchModel.getSearchparams().getText());
return RESULT;
}
@RequestMapping(value = SEARCH_BY_TAX_ID + "/page={pageNumber}", method = RequestMethod.GET)
public String searchByTaxIdPaginated(@PathVariable Integer pageNumber, @ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "entryid", required = true) Long entryID, @RequestParam(value = "entryname", required = false) String entryName,
Model model, HttpSession session, RedirectAttributes attributes) {
if (pageNumber < 1) {
pageNumber = 1;
}
Pageable pageable = new PageRequest(pageNumber - 1, SEARCH_PAGESIZE, Sort.Direction.ASC, "function", "entryType");
Page<UniprotEntry> page = this.enzymePortalService.findEnzymesByTaxonomy(entryID, pageable);
List<Species> species = enzymePortalService.findSpeciesByTaxId(entryID);
List<Compound> compouds = enzymePortalService.findCompoundsByTaxId(entryID);
List<Disease> diseases = enzymePortalService.findDiseasesByTaxId(entryID);
List<EcNumber> enzymeFamilies = enzymePortalService.findEnzymeFamiliesByTaxId(entryID);
SearchParams searchParams = searchModel.getSearchparams();
searchParams.setStart(0);
searchParams.setType(SearchParams.SearchType.KEYWORD);
searchParams.setText(entryName);
searchParams.setSize(SEARCH_PAGESIZE);
searchModel.setSearchparams(searchParams);
List<UniprotEntry> result = page.getContent();
int current = page.getNumber() + 1;
int begin = Math.max(1, current - 5);
int end = Math.min(begin + 10, page.getTotalPages());
model.addAttribute("page", page);
model.addAttribute("beginIndex", begin);
model.addAttribute("endIndex", end);
model.addAttribute("currentIndex", current);
model.addAttribute("organismName", entryName);
model.addAttribute("taxId", entryID);
// model.addAttribute("summaryEntries", result);
SearchResults searchResults = new SearchResults();
searchResults.setTotalfound(page.getTotalElements());
SearchFilters filters = new SearchFilters();
filters.setSpecies(species);
filters.setCompounds(compouds);
filters.setEcNumbers(enzymeFamilies);
filters.setDiseases(diseases);
searchResults.setSearchfilters(filters);
searchResults.setSummaryentries(result);
searchModel.setSearchresults(searchResults);
model.addAttribute("searchModel", searchModel);
model.addAttribute("searchConfig", searchConfig);
model.addAttribute("searchFilter", filters);
String searchKey = getSearchKey(searchModel.getSearchparams());
cacheSearch(session.getServletContext(), searchKey, searchResults);
setLastSummaries(session, searchResults.getSummaryentries());
clearHistory(session);
addToHistory(session, searchModel.getSearchparams().getType(),
searchKey);
model.addAttribute("searchTerm", searchModel.getSearchparams().getText());
return RESULT;
}
@RequestMapping(value = SEARCH_TAXONOMY, method = RequestMethod.POST)
public String SearchByTaxId(@ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "entryid", required = false) Long entryID, @RequestParam(value = "entryname", required = false) String entryName,
Model model, HttpServletRequest request, HttpSession session, Pageable pageable, RedirectAttributes attributes) {
return searchByTaxId(searchModel, entryID, entryName, model, request, session, pageable, attributes);
}
/**
* Applies filters taken from the search parameters to the search results.
*
* @param searchModel
* @param request
*/
private void applyFiltersAdapted(SearchModel searchModel, HttpServletRequest request) {
if (searchModel != null) {
SearchParams searchParameters = searchModel.getSearchparams();
SearchResults resultSet = searchModel.getSearchresults();
String compound_autocompleteFilter = request.getParameter("searchparams.compounds");
String specie_autocompleteFilter = request.getParameter("_ctempList_selected");
String diseases_autocompleteFilter = request.getParameter("_DtempList_selected");
// Filter:
List<String> speciesFilter = searchParameters.getSpecies();
List<String> compoundsFilter = searchParameters.getCompounds();
List<String> diseasesFilter = searchParameters.getDiseases();
//remove empty string in the filter to avoid unsual behavior of the filter facets
if (speciesFilter.contains("")) {
speciesFilter.remove("");
}
if (compoundsFilter.contains("")) {
compoundsFilter.remove("");
}
if (diseasesFilter.contains("")) {
diseasesFilter.remove("");
}
//to ensure that the seleted item is used in species filter, add the selected to the list. this is a workaround. different JS were used for auto complete and normal filter
if ((specie_autocompleteFilter != null && StringUtils.hasLength(specie_autocompleteFilter) == true) && StringUtils.isEmpty(compound_autocompleteFilter) && StringUtils.isEmpty(diseases_autocompleteFilter)) {
speciesFilter.add(specie_autocompleteFilter);
}
if ((diseases_autocompleteFilter != null && StringUtils.hasLength(diseases_autocompleteFilter) == true) && StringUtils.isEmpty(compound_autocompleteFilter) && StringUtils.isEmpty(specie_autocompleteFilter)) {
diseasesFilter.add(diseases_autocompleteFilter);
}
//both from auto complete and normal selection. selected items are displayed on top the list and returns back to the orignial list when not selected.
SearchResults searchResults = resultSet;
List<Species> defaultSpeciesList = searchResults.getSearchfilters().getSpecies();
resetSelectedSpecies(defaultSpeciesList);
searchParameters.getSpecies().stream().forEach((selectedItems) -> {
defaultSpeciesList.stream().filter((theSpecies) -> (selectedItems.equals(theSpecies.getScientificname()))).forEach((theSpecies) -> {
theSpecies.setSelected(true);
});
});
List<Compound> defaultCompoundList = searchResults.getSearchfilters().getCompounds();
resetSelectedCompounds(defaultCompoundList);
searchParameters.getCompounds().stream().forEach((SelectedCompounds) -> {
defaultCompoundList.stream().filter((theCompound) -> (SelectedCompounds.equals(theCompound.getName()))).forEach((theCompound) -> {
theCompound.setSelected(true);
});
});
List<Disease> defaultDiseaseList = searchResults.getSearchfilters().getDiseases();
resetSelectedDisease(defaultDiseaseList);
searchParameters.getDiseases().stream().forEach((selectedDisease) -> {
defaultDiseaseList.stream().filter((disease) -> (selectedDisease.equals(disease.getName()))).forEach((disease) -> {
disease.setSelected(true);
});
});
}
}
@ResponseBody
@RequestMapping(value = GET_COUNT_FOR_ORGANISMS, method = RequestMethod.GET)
public List<Taxonomy> getCountForOrganisms(@RequestParam(value = "taxids", required = true) List<Long> taxids) {
long startTime = System.nanoTime();
List<Taxonomy> organisms = enzymePortalService.getCountForOrganisms(taxids);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long elapsedtime = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
logger.warn("Duration : (" + elapsedtime + " sec)");
return organisms;
}
@RequestMapping(value = "/taxonomy-test", method = RequestMethod.GET)
public String testTaxonomy(@RequestParam(value = "taxids", required = false) List<Long> taxids,Model model) {
taxids = new ArrayList<>();
taxids.add(224308L);
taxids.add(83333L);
taxids.add(83332L);
taxids.add(44689L);
taxids.add(559292L);
taxids.add(284812L);
taxids.add(39947L);
taxids.add(3702L);
taxids.add(7227L);
taxids.add(6239L);
taxids.add(7955L);
taxids.add(9913L);
taxids.add(9606L);
taxids.add(10090L);
taxids.add(10116L);
long startTime = System.nanoTime();
List<Taxonomy> organisms = enzymePortalService.getCountForOrganisms(taxids);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long elapsedtime = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
logger.warn("Duration : (" + elapsedtime + " sec)");
model.addAttribute("taxonomy", organisms);
return "taxonomy-test";
}
}