package uk.ac.ebi.ep.controller;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
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.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.base.search.EnzymeFinder;
import uk.ac.ebi.ep.data.common.CommonSpecies;
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.enzymes.EnzymeEntry;
import uk.ac.ebi.ep.enzymes.EnzymeSubSubclass;
import uk.ac.ebi.ep.enzymes.EnzymeSubclass;
import uk.ac.ebi.ep.enzymes.IntenzEnzyme;
/**
*
* @author joseph
*/
@Controller
public class BrowseEnzymesController extends AbstractController {
private static final Logger logger = Logger.getLogger(BrowseEnzymesController.class);
//concrete jsp's
private static final String BROWSE_ENZYMES = "/browse_enzymes";
private static final String EC = "/ec";
private static final String RESULT = "/searches";
//abtract url
private static final String BROWSE_ENZYME_CLASSIFICATION = "/browse/enzymes";
private static final String BROWSE_EC = "/browse/enzyme";
private static final String FIND_SPECIES_BY_EC = "/species-by-ec";
private static final String SEARCH_ENZYMES = "/search-enzymes";
private static final String EC_NUMBER = "ec";
private static final String NAME = "name";
private static final String DESCRIPTION = "description";
private static final String SUBCLASSES = "subclasses";
private static final String SUBSUBCLASSES = "subsubclasses";
private static final String ENTRIES = "entries";
private static final String INTENZ_URL = "http://www.ebi.ac.uk/intenz/ws/EC";
private static final String ROOT = "ROOT";
private static final String SUBCLASS = "SUBCLASS";
private static final String SUBSUBCLASS = "SUBSUBCLASS";
private static final String selectedEc = "selectedEc";
private static final int SEARCH_PAGESIZE = 10;
@RequestMapping(value = "/species/{ec}", method = RequestMethod.GET)
public String getSpecies(@PathVariable("ec") String ec, Model model, RedirectAttributes attributes) {
long startTime = System.nanoTime();
Pageable pageable = new PageRequest(0, SEARCH_PAGESIZE);
Page<UniprotEntry> page = this.enzymePortalService.findEnzymesByEcNumber(ec, pageable);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long elapsedtime = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
logger.warn("Duration : (" + elapsedtime + " sec)");
List<UniprotEntry> species = page.getContent();//.stream().map(EnzymePortal::new).distinct().map(EnzymePortal::unwrapProtein).filter(Objects::nonNull).collect(Collectors.toList());
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("species", species);
model.addAttribute("ec", ec);
return "species";
}
@RequestMapping(value = "/species/{ec}/page/{pageNumber}/", method = RequestMethod.GET)
public String getSpeciesPaginated(@PathVariable("ec") String ec, @PathVariable("pageNumber") Integer pageNumber, Model model, RedirectAttributes attributes) {
if (pageNumber < 1) {
pageNumber = 1;
}
long startTime = System.nanoTime();
Pageable pageable = new PageRequest(pageNumber - 1, SEARCH_PAGESIZE);
Page<UniprotEntry> page = this.enzymePortalService.findEnzymesByEcNumber(ec, pageable);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long elapsedtime = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
logger.warn("Duration : (" + elapsedtime + " sec)");
List<UniprotEntry> species = page.getContent();//.stream().map(EnzymePortal::new).distinct().map(EnzymePortal::unwrapProtein).filter(Objects::nonNull).collect(Collectors.toList());
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("species", species);
model.addAttribute("ec", ec);
return "species";
}
@ResponseBody
@RequestMapping(value = FIND_SPECIES_BY_EC, method = RequestMethod.GET)
public List<Species> findSpeciesByEc(@RequestParam(value = "ec", required = true) String ec) {
long startTime = System.nanoTime();
List<Species> species = enzymePortalService.findSpeciesByEcNumber(ec);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long elapsedtime = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
logger.warn("Duration : (" + elapsedtime + " sec)");
return species.stream().limit(50).collect(Collectors.toList());
}
private SearchResults findEnzymesByEc(String ec) {
SearchResults results = null;
EnzymeFinder finder = new EnzymeFinder(enzymePortalService,ebeyeRestService);
SearchParams searchParams = new SearchParams();
searchParams.setText(ec);//use the ec number here. note ebeye is indexing ep data for ec to be searchable
searchParams.setType(SearchParams.SearchType.KEYWORD);
searchParams.setStart(0);
searchParams.setPrevioustext(ec);//use ec here
finder.setSearchParams(searchParams);
results = finder.computeEnzymeSummariesByEc(ec);
if (results == null) {
return getEnzymes(finder, searchParams);
}
return results;
}
private SearchResults getEnzymes(EnzymeFinder finder, SearchParams searchParams) {
SearchResults results = finder.getEnzymes(searchParams);
return results;
}
private String computeResult(@ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "entryid", required = false) String entryID, @RequestParam(value = "entryname", required = false) String entryname,
Model model, HttpSession session, HttpServletRequest request) {
String view = "error";
Map<String, SearchResults> prevSearches
= getPreviousSearches(session.getServletContext());
String searchKey = getSearchKey(searchModel.getSearchparams());
SearchResults results = prevSearches.get(searchKey);
if (results == null) {
// New search:
clearHistory(session);
results = findEnzymesByEc(entryID);
}
if (results != null) {
cacheSearch(session.getServletContext(), searchKey, results);
setLastSummaries(session, results.getSummaryentries());
searchModel.setSearchresults(results);
applyFilters(searchModel, request);
model.addAttribute("searchConfig", searchConfig);
model.addAttribute("searchModel", searchModel);
model.addAttribute("pagination", getPagination(searchModel));
clearHistory(session);
addToHistory(session, searchModel.getSearchparams().getType(),
searchKey);
request.setAttribute("searchTerm", searchModel.getSearchparams().getText());
view = RESULT;
}
return view;
}
@ModelAttribute("searchModel")
public SearchModel searchform(String text) {
SearchModel searchModelForm = new SearchModel();
SearchParams searchParams = new SearchParams();
searchParams.setStart(0);
searchParams.setText(text);
searchParams.setType(SearchParams.SearchType.KEYWORD);
searchModelForm.setSearchparams(searchParams);
return searchModelForm;
}
@RequestMapping(value = BROWSE_ENZYME_CLASSIFICATION, method = RequestMethod.GET)
public String browseEc(Model model, HttpSession session) {
clearSelectedEc(session);
SearchModel searchModelForm = searchform();
model.addAttribute("searchModel", searchModelForm);
model.addAttribute(BROWSE_VIDEO, BROWSE_VIDEO);
return BROWSE_ENZYMES;
}
@RequestMapping(value = BROWSE_EC + "/{ec}/{ecname}", method = RequestMethod.GET)
public String showStaticEc(@ModelAttribute("searchModel") SearchModel searchModel,
@PathVariable("ec") String ec, @PathVariable("ecname") String ecname,
Model model, HttpSession session, HttpServletRequest request) throws MalformedURLException, IOException {
clearSelectedEc(session);
browseEc(model, session, ecname, null, null, null, ec);
return EC;
}
@RequestMapping(value = BROWSE_EC, method = RequestMethod.GET)
public String browseEcTree(@ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "ec", required = false) String ec, @RequestParam(value = "ecname", required = false) String ecname,
@RequestParam(value = "subecname", required = false) String subecname,
@RequestParam(value = "subsubecname", required = false) String subsubecname,
@RequestParam(value = "entryecname", required = false) String entryecname, Model model, HttpSession session, HttpServletRequest request, Pageable pageable, RedirectAttributes attributes) throws MalformedURLException, IOException {
model.addAttribute(BROWSE_VIDEO, BROWSE_VIDEO);
if (ec != null && ec.length() >= 7) {
model.addAttribute("entryid", ec);
searchModel = searchform(ec);
//return computeResult(searchModel, ec, entryecname, model, session, request);
return searchByEcNumber(searchModel, ec, ecname, subecname, subsubecname, entryecname, model, request, session, pageable, attributes);
} else {
browseEc(model, session, ecname, subecname, subsubecname, entryecname, ec);
}
return EC;
}
private void browseEc(Model model, HttpSession session, String ecname, String sub_ecname, String subsub_ecname, String entry_ecname, String ec) throws MalformedURLException, IOException {
String intenz_url = String.format("%s/%s.json", INTENZ_URL, ec);
URL url = new URL(intenz_url);
try (InputStream is = url.openStream();
JsonReader rdr = Json.createReader(is)) {
computeJsonData(rdr, model, session, ecname, sub_ecname, subsub_ecname, entry_ecname, ec);
}
}
/**
* This method keeps track of the selected enzymes in their hierarchy for
* the browse enzyme
*
* @param session
* @param s the selected enzyme
* @param type the position in the hierarchy
*/
private void addToSelectedEc(HttpSession session, IntenzEnzyme s, String type) {
@SuppressWarnings("unchecked")
LinkedList<IntenzEnzyme> history = (LinkedList<IntenzEnzyme>) session.getAttribute(selectedEc);
if (history == null) {
history = new LinkedList<>();
session.setAttribute(selectedEc, history);
}
if (!history.isEmpty() && history.contains(s)) {
if (type.equalsIgnoreCase(ROOT) && history.size() == 2) {
history.removeLast();
}
if (type.equalsIgnoreCase(ROOT) && history.size() == 3) {
history.removeLast();
history.removeLast();
//history.remove(history.size()-1);//same as above
}
if (type.equalsIgnoreCase(SUBCLASS) && history.size() == 2) {
history.removeLast();
history.add(s);
}
if (type.equalsIgnoreCase(SUBCLASS) && history.size() == 3) {
history.removeLast();
}
} else if ((history.isEmpty() || !history.contains(s)) && (history.size() < 3)) {
history.add(s);
}
}
private void clearSelectedEc(HttpSession session) {
@SuppressWarnings("unchecked")
LinkedList<IntenzEnzyme> history = (LinkedList<IntenzEnzyme>) session.getAttribute(selectedEc);
if (history == null) {
//history = new ArrayList<String>();
history = new LinkedList<>();
session.setAttribute(selectedEc, history);
} else {
history.clear();
}
}
private void computeJsonData(JsonReader jsonReader, Model model, HttpSession session, String... ecname) {
JsonObject jsonObject = jsonReader.readObject();
IntenzEnzyme root = new IntenzEnzyme();
String ec = jsonObject.getString(EC_NUMBER);
//String name = jsonObject.getString(NAME);
String description = null;
if (jsonObject.containsKey(DESCRIPTION)) {
description = jsonObject.getString(DESCRIPTION);
root.setDescription(description);
}
root.setEc(ec);
root.setName(ecname[0]);
root.setSubclassName(ecname[1]);
root.setSubsubclassName(ecname[2]);
root.setEntryName(ecname[3]);
//compute the childObject
if (jsonObject.containsKey(SUBCLASSES)) {
JsonArray jsonArray = jsonObject.getJsonArray(SUBCLASSES);
for (JsonObject childObject : jsonArray.getValuesAs(JsonObject.class)) {
String _ec = null;
String _name = null;
String _desc = null;
_ec = childObject.getString(EC_NUMBER);
_name = childObject.getString(NAME);
EnzymeSubclass subclass = new EnzymeSubclass();
if (childObject.containsKey(DESCRIPTION)) {
_desc = childObject.getString(DESCRIPTION);
subclass.setDescription(_desc);
}
subclass.setEc(_ec);
subclass.setName(_name);
root.getChildren().add(subclass);
}
addToSelectedEc(session, root, ROOT);
model.addAttribute("json", root);
}
if (jsonObject.containsKey(SUBSUBCLASSES)) {
JsonArray jsonArray = jsonObject.getJsonArray(SUBSUBCLASSES);
for (JsonObject childObject : jsonArray.getValuesAs(JsonObject.class)) {
String _ec = null;
String _name = null;
String _desc = null;
_ec = childObject.getString(EC_NUMBER);
_name = childObject.getString(NAME);
EnzymeSubSubclass subsubclass = new EnzymeSubSubclass();
if (childObject.containsKey(DESCRIPTION)) {
_desc = childObject.getString(DESCRIPTION);
subsubclass.setDescription(_desc);
}
subsubclass.setEc(_ec);
subsubclass.setName(_name);
root.getSubSubclasses().add(subsubclass);
}
model.addAttribute("json", root);
addToSelectedEc(session, root, SUBCLASS);
}
if (jsonObject.containsKey(ENTRIES)) {
JsonArray jsonArray = jsonObject.getJsonArray(ENTRIES);
for (JsonObject childObject : jsonArray.getValuesAs(JsonObject.class)) {
String _ec = null;
String _name = null;
String _desc = null;
_ec = childObject.getString(EC_NUMBER);
_name = childObject.getString(NAME);
EnzymeEntry entries = new EnzymeEntry();
if (childObject.containsKey(DESCRIPTION)) {
_desc = childObject.getString(DESCRIPTION);
entries.setDescription(_desc);
}
entries.setEc(_ec);
entries.setName(_name);
root.setEc(ecname[4]);
root.getEntries().add(entries);
}
model.addAttribute("json", root);
addToSelectedEc(session, root, SUBSUBCLASS);
}
}
@RequestMapping(value = SEARCH_ENZYMES, method = RequestMethod.GET)
public String searchByEcNumber(@ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "ec", required = false) String ec, @RequestParam(value = "ecname", required = false) String ecname,
@RequestParam(value = "subecname", required = false) String subecname,
@RequestParam(value = "subsubecname", required = false) String subsubecname,
@RequestParam(value = "entryecname", required = false) String entryecname,
Model model, HttpServletRequest request, HttpSession session, Pageable pageable, RedirectAttributes attributes) {
pageable = new PageRequest(0, SEARCH_PAGESIZE, Sort.Direction.ASC, "entryType", "function");
long startTime = System.nanoTime();
Page<UniprotEntry> page = this.enzymePortalService.findEnzymesByEcNumber(ec, pageable);
//Page<UniprotEntry> page = this.enzymePortalService.findEnzymeViewByEc(ec, pageable);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long elapsedtime = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);
logger.warn("findEnzymesByEcNumber took : (" + elapsedtime + " sec)");
long startTime1 = System.nanoTime();
List<Species> species = enzymePortalService.findSpeciesByEcNumber(ec);
//List<Species> species = enzymePortalService.findSpeciesByEcNumber(ec,new ArrayList<>());
List<Compound> compouds = enzymePortalService.findCompoundsByEcNumber(ec);
List<Disease> diseases = enzymePortalService.findDiseasesByEcNumber(ec);
List<EcNumber> enzymeFamilies = enzymePortalService.findEnzymeFamiliesByEcNumber(ec);
long endTime1 = System.nanoTime();
long duration1 = endTime1 - startTime1;
long elapsedtime1 = TimeUnit.SECONDS.convert(duration1, TimeUnit.NANOSECONDS);
logger.warn("findEnzymesByEcNumber Filter Facets took : (" + elapsedtime1 + " sec)");
SearchParams searchParams = searchModel.getSearchparams();
searchParams.setStart(0);
searchParams.setType(SearchParams.SearchType.KEYWORD);
searchParams.setText(ec);
searchParams.setPrevioustext("");
searchParams.setSize(SEARCH_PAGESIZE);
searchModel.setSearchparams(searchParams);
List<UniprotEntry> result = page.getContent();//.stream().map(EnzymePortal::new).distinct().map(EnzymePortal::unwrapProtein).filter(Objects::nonNull).collect(Collectors.toList());
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("ecname", entryecname);
model.addAttribute("ec", ec);
// model.addAttribute("summaryEntries", result);
SearchResults searchResults = new SearchResults();
searchResults.setTotalfound(page.getTotalElements());
SearchFilters filters = new SearchFilters();
//Set<Species> speciesFilter = species.stream().collect(Collectors.toSet());
List<Species> speciesFacets = applySpeciesFilter(species);
filters.setSpecies(speciesFacets);
filters.setCompounds(compouds);
filters.setEcNumbers(enzymeFamilies);
filters.setDiseases(diseases);
searchResults.setSearchfilters(filters);
searchResults.setSummaryentries(result);
searchModel.setSearchresults(searchResults);
String searchKey = getSearchKey(searchModel.getSearchparams());
cacheSearch(session.getServletContext(), searchKey, searchResults);
setLastSummaries(session, searchResults.getSummaryentries());
clearHistory(session);
addToHistory(session, searchModel.getSearchparams().getType(),
searchKey);
model.addAttribute("searchModel", searchModel);
model.addAttribute("searchConfig", searchConfig);
model.addAttribute("searchFilter", filters);
model.addAttribute(BROWSE_VIDEO, BROWSE_VIDEO);
request.setAttribute("searchTerm", searchModel.getSearchparams().getText());
return RESULT;
}
@RequestMapping(value = SEARCH_ENZYMES + "/page={pageNumber}", method = RequestMethod.GET)
public String searchByEcNumberPaginated(@PathVariable Integer pageNumber, @ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "ec", required = true) String ec, @RequestParam(value = "ecname", required = false) String ecname,
@RequestParam(value = "subecname", required = false) String subecname,
@RequestParam(value = "subsubecname", required = false) String subsubecname,
@RequestParam(value = "entryecname", required = false) String entryecname,
Model model, HttpServletRequest request, HttpSession session, RedirectAttributes attributes) {
if (pageNumber < 1) {
pageNumber = 1;
}
Pageable pageable = new PageRequest(pageNumber - 1, SEARCH_PAGESIZE, Sort.Direction.ASC, "entryType", "function");
Page<UniprotEntry> page = this.enzymePortalService.findEnzymesByEcNumber(ec, pageable);
//Page<UniprotEntry> page = this.enzymePortalService.findEnzymeViewByEc(ec, pageable);
List<Species> species = enzymePortalService.findSpeciesByEcNumber(ec);
List<Compound> compouds = enzymePortalService.findCompoundsByEcNumber(ec);
List<Disease> diseases = enzymePortalService.findDiseasesByEcNumber(ec);
List<EcNumber> enzymeFamilies = enzymePortalService.findEnzymeFamiliesByEcNumber(ec);
SearchParams searchParams = searchModel.getSearchparams();
searchParams.setStart(0);
searchParams.setType(SearchParams.SearchType.KEYWORD);
searchParams.setText(ec);
searchParams.setSize(SEARCH_PAGESIZE);
searchParams.setPrevioustext("");
searchModel.setSearchparams(searchParams);
List<UniprotEntry> result = page.getContent();//.stream().map(EnzymePortal::new).distinct().map(EnzymePortal::unwrapProtein).filter(Objects::nonNull).collect(Collectors.toList());
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("ecname", entryecname);
model.addAttribute("ec", ec);
// model.addAttribute("summaryEntries", result);
SearchResults searchResults = new SearchResults();
searchResults.setTotalfound(page.getTotalElements());
SearchFilters filters = new SearchFilters();
//Set<Species> speciesFilter = species.stream().collect(Collectors.toSet());
List<Species> speciesFacets = applySpeciesFilter(species);
filters.setSpecies(speciesFacets);
filters.setCompounds(compouds);
filters.setEcNumbers(enzymeFamilies);
filters.setDiseases(diseases);
searchResults.setSearchfilters(filters);
searchResults.setSummaryentries(result);
searchModel.setSearchresults(searchResults);
String searchKey = getSearchKey(searchModel.getSearchparams());
cacheSearch(session.getServletContext(), searchKey, searchResults);
setLastSummaries(session, searchResults.getSummaryentries());
clearHistory(session);
addToHistory(session, searchModel.getSearchparams().getType(),
searchKey);
model.addAttribute("searchModel", searchModel);
model.addAttribute("searchConfig", searchConfig);
model.addAttribute("searchFilter", filters);
model.addAttribute(BROWSE_VIDEO, BROWSE_VIDEO);
request.setAttribute("searchTerm", searchModel.getSearchparams().getText());
return RESULT;
}
@RequestMapping(value = SEARCH_ENZYMES, method = RequestMethod.POST)
public String searchEnzymesByEcPost(@ModelAttribute("searchModel") SearchModel searchModel,
@RequestParam(value = "ec", required = false) String ec, @RequestParam(value = "ecname", required = false) String ecname,
@RequestParam(value = "subecname", required = false) String subecname,
@RequestParam(value = "subsubecname", required = false) String subsubecname,
@RequestParam(value = "entryecname", required = false) String entryecname,
Model model, HttpServletRequest request, HttpSession session, Pageable pageable, RedirectAttributes attributes) {
model.addAttribute("entryid", ec);
model.addAttribute("entryname", entryecname);
return searchByEcNumber(searchModel, ec, ecname, subecname, subsubecname, entryecname, model, request, session, pageable, attributes);
}
private List<Species> applySpeciesFilter(List<Species> uniqueSpecies) {
// String[] commonSpecie = {"HUMAN", "MOUSE", "RAT", "Fruit fly", "WORM", "Yeast", "ECOLI"};
// CommonSpecies [] commonSpecie = {"Homo sapiens","Mus musculus","Rattus norvegicus", "Drosophila melanogaster","Saccharomyces cerevisiae"};
// List<String> commonSpecieList = Arrays.asList(commonSpecie);
List<String> commonSpecieList = new ArrayList<>();
for (CommonSpecies commonSpecies : CommonSpecies.values()) {
commonSpecieList.add(commonSpecies.getScientificName());
}
Map<Integer, Species> priorityMapper = new TreeMap<>();
AtomicInteger key = new AtomicInteger(50);
AtomicInteger customKey = new AtomicInteger(6);
uniqueSpecies.stream().forEach((sp) -> {
if (commonSpecieList.contains(sp.getScientificname().split("\\(")[0].trim())) {
// HUMAN, MOUSE, RAT, Fly, WORM, Yeast, ECOLI
// "Homo sapiens","Mus musculus","Rattus norvegicus", "Drosophila melanogaster","WORM","Saccharomyces cerevisiae","ECOLI"
if (sp.getScientificname().equalsIgnoreCase(CommonSpecies.HUMAN.getScientificName())) {
priorityMapper.put(1, sp);
} else if (sp.getScientificname().equalsIgnoreCase(CommonSpecies.MOUSE.getScientificName())) {
priorityMapper.put(2, sp);
} else if (sp.getScientificname().equalsIgnoreCase(CommonSpecies.RAT.getScientificName())) {
priorityMapper.put(3, sp);
} else if (sp.getScientificname().equalsIgnoreCase(CommonSpecies.FRUIT_FLY.getScientificName())) {
priorityMapper.put(4, sp);
} else if (sp.getScientificname().equalsIgnoreCase(CommonSpecies.WORM.getScientificName())) {
priorityMapper.put(5, sp);
} else if (sp.getScientificname().equalsIgnoreCase(CommonSpecies.ECOLI.getScientificName())) {
priorityMapper.put(6, sp);
} else if (sp.getScientificname().split("\\(")[0].trim().equalsIgnoreCase(CommonSpecies.BAKER_YEAST.getScientificName())) {
priorityMapper.put(customKey.getAndIncrement(), sp);
}
} else {
priorityMapper.put(key.getAndIncrement(), sp);
}
});
List<Species> speciesFilters = new LinkedList<>();
priorityMapper.entrySet().stream().forEach(map -> {
speciesFilters.add(map.getValue());
});
return speciesFilters;
}
}