package org.genedb.web.tags.db;
import static javax.servlet.jsp.PageContext.APPLICATION_SCOPE;
import static org.genedb.web.mvc.controller.TaxonManagerListener.TAXON_NODE_MANAGER;
import org.genedb.db.taxon.TaxonNameType;
import org.genedb.db.taxon.TaxonNode;
import org.genedb.db.taxon.TaxonNodeManager;
import org.genedb.querying.tmpquery.QuickSearchQuery;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.TreeMap;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class QuickSearchMessageTag extends SimpleTagSupport {
private static final Logger logger = Logger.getLogger(QuickSearchMessageTag.class);
private TreeMap<String, Integer> taxonGroup;
String currentTaxonName;
@SuppressWarnings("unchecked")
@Override
public void doTag() throws JspException, IOException {
//Get the current result size, if any
Integer resultsSize = (Integer)getJspContext().findAttribute("resultsSize");
//Get the taxon group map
//= (TreeMap) getJspContext().findAttribute("taxonGroup");
QuickSearchQuery query = (QuickSearchQuery)getJspContext().findAttribute("query");
//= (String)getJspContext().findAttribute("taxonNodeName");
currentTaxonName = checkForHtmlShortName(currentTaxonName);
logger.error("query = '" + query + "'");
logger.error("resultsSize = '" + resultsSize + "'");
logger.error("taxonGroup = '" + taxonGroup + "'");
logger.error("currentTaxonName = '" + currentTaxonName + "'");
try {
String message = null;
if (noResultsFound(resultsSize, taxonGroup)){
message = printNoResultsFound(query, currentTaxonName);
}else if (noResultsFound(resultsSize) && taxonGroup.size()>0){
message = printTaxonResultsFound(query, currentTaxonName, taxonGroup);
} else if (!noResultsFound(resultsSize) && taxonGroup.size() == 1) {
message = printResultsFound(query, currentTaxonName, resultsSize);
}else if(!noResultsFound(resultsSize) && taxonGroup.size() > 1){
message = printManyTaxonResultsFound(resultsSize, taxonGroup);
}
if (!StringUtils.isEmpty(message)){
getJspContext().getOut().write(message);
}
} catch (Exception e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
/**
* Check for Html Short and return if present, else return the current as it is
* @param currentTaxonName
* @return
*/
private String checkForHtmlShortName(String currentTaxonName){
TaxonNodeManager taxonNodeManager = (TaxonNodeManager) getJspContext().getAttribute(TAXON_NODE_MANAGER, APPLICATION_SCOPE);
TaxonNode node = taxonNodeManager.getTaxonNodeForLabel(currentTaxonName);
if(node!= null){
String htmlShort = node.getName(TaxonNameType.HTML_SHORT);
if (!StringUtils.isEmpty(htmlShort)){
return htmlShort;
}
}
return currentTaxonName;
}
/**
* No results found in arguments
* @param resultsSize
* @param taxonGroup
* @return
*/
private boolean noResultsFound(Integer resultsSize, TreeMap<String, Integer> taxonGroup ){
if ((resultsSize==null || resultsSize.intValue()==0)
&& taxonGroup.size()==0){
return true;
}
return false;
}
/**
* No results found in argument
* @param resultsSize
* @param taxonGroup
* @return
*/
private boolean noResultsFound(Integer resultsSize ){
if ((resultsSize==null || resultsSize.intValue()==0)) {
return true;
}
return false;
}
/**
* Print No Result Found Message for Exact or wildcard search
* @param query
* @param currentTaxonNodeName
* @return
*/
private String printNoResultsFound(QuickSearchQuery query, String currentTaxonNodeName){
StringBuffer sb = new StringBuffer();
sb.append("<font color=\"red\">");
sb.append("No");
if (query.getSearchText().indexOf("*")!= -1){
sb.append(" Wildcard");
}else{
sb.append(" Exact");
}
sb.append(" match found for <i><b>");
sb.append(query.getSearchText());
sb.append("</b></i>");
sb.append(" in <i><b>");
if (StringUtils.isEmpty(currentTaxonNodeName)
|| (!StringUtils.isEmpty(currentTaxonNodeName)
&& currentTaxonNodeName.equalsIgnoreCase("root"))){
currentTaxonNodeName = "all organism";
}
sb.append(currentTaxonNodeName);
sb.append("</b></i></font>");
return sb.toString();
}
private String printTaxonResultsFound(
QuickSearchQuery query, String currentTaxonNodeName, TreeMap<String, Integer> taxonGroup ){
StringBuffer sb = new StringBuffer();
sb.append("<font color=\"red\">");
sb.append("No");
if (query.getSearchText().indexOf("*")!= -1){
sb.append(" Wildcard");
}else{
sb.append(" Exact");
}
sb.append(" match found for <i><b>");
sb.append(query.getSearchText());
sb.append("</b></i>");
sb.append(" in <i><b>");
if (StringUtils.isEmpty(currentTaxonNodeName)
|| (!StringUtils.isEmpty(currentTaxonNodeName)
&& currentTaxonNodeName.equalsIgnoreCase("root"))){
currentTaxonNodeName = "all organism";
}
sb.append(currentTaxonNodeName);
sb.append("</b></i>");
sb.append(", however the following ");
sb.append(taxonGroup.size());
sb.append(" organisms have matches.");
sb.append("</font>");
return sb.toString();
}
/**
* Print number of matches found in a specific number of organisms
* @param query
* @param currentTaxonNodeName
* @param resultsSize
* @return
*/
private String printResultsFound(QuickSearchQuery query, String currentTaxonNodeName, int resultsSize){
StringBuffer sb = new StringBuffer();
if (StringUtils.isEmpty(currentTaxonNodeName)
|| (!StringUtils.isEmpty(currentTaxonNodeName) && currentTaxonNodeName.equalsIgnoreCase("root"))){
sb.append("Found ");
sb.append(resultsSize);
sb.append(" matches for <i><b>");
sb.append(query.getSearchText());
sb.append("</b></i>.");
}else{
sb.append("All ");
sb.append(resultsSize);
sb.append(" matches for <i><b>");
sb.append(query.getSearchText());
sb.append("</b></i>, found in organism <i><b>");
sb.append(currentTaxonNodeName);
sb.append("</b></i>.");
}
return sb.toString();
}
/**
* Print number of matches found in x number of organisms
* @param resultsSize
* @param taxonGroup
* @return
*/
private String printManyTaxonResultsFound(int resultsSize, TreeMap<String, Integer> taxonGroup){
StringBuffer sb = new StringBuffer();
sb.append(resultsSize);
sb.append(" matches found in ");
sb.append(taxonGroup.size());
sb.append(" organisms.");
return sb.toString();
}
public void setTaxonGroup(TreeMap<String, Integer> taxonGroup) {
this.taxonGroup = taxonGroup;
}
public void setCurrentTaxonName(String currentTaxonName) {
this.currentTaxonName = currentTaxonName;
}
}