package org.genedb.web.mvc.controller.download;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletRequest;
import org.apache.log4j.Logger;
import org.genedb.db.taxon.TaxonNode;
import org.genedb.db.taxon.TaxonNodeList;
import org.genedb.querying.core.Query;
import org.genedb.querying.tmpquery.GeneSummary;
import org.genedb.querying.tmpquery.TaxonQuery;
//import org.genedb.web.mvc.model.ResultsCacheFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.core.convert.ConversionService;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import com.google.common.collect.Lists;
public class AbstractGeneDBFormController {
private Logger logger = Logger.getLogger(AbstractGeneDBFormController.class);
//@Autowired
//private ResultsCacheFactory resultsCacheFactory;
private ConversionService conversionService;
//private TaxonNodeArrayPropertyEditor taxonNodeArrayPropertyEditor;
//
// public void setResultsCacheFactory(ResultsCacheFactory resultsCacheFactory) {
// this.resultsCacheFactory = resultsCacheFactory;
// }
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setConversionService(conversionService);
//binder.setValidator(new FooValidator());
}
// public void setTaxonNodeArrayPropertyEditor(TaxonNodeArrayPropertyEditor taxonNodeArrayPropertyEditor) {
// this.taxonNodeArrayPropertyEditor = taxonNodeArrayPropertyEditor;
// }
//
// //@Autowired
// private TaxonNodeArrayPropertyEditor taxonNodeArrayPropertyEditor;
public static List<GeneSummary> fromIDs(List<String> results) {
List<GeneSummary> gs = Lists.newArrayListWithExpectedSize(results.size());
for (Object o : results) {
gs.add(new GeneSummary((String) o));
}
return gs;
}
// public static List<String> possiblyConvertListToIds(List results) {
// List<String> ids = Lists.newArrayListWithExpectedSize(results.size());
// Object firstItem = results.get(0);
// if (firstItem instanceof GeneSummary) {
//
// for (Object s : results) {
// GeneSummary summary = (GeneSummary) s;
// ids.add(summary.getSystematicId());
// summary = null;
// }
//
// } else if (firstItem instanceof String ) {
//
// for (Object o : results) {
// GeneSummary summary = new GeneSummary((String) o);
// ids.add(summary.getSystematicId());
// summary = null;
// }
// } else {
// throw new RuntimeException("Do not know how to convert an array of " + firstItem.getClass().toString());
// }
// return ids;
// }
protected static GeneSummary fromID(String result) {
return new GeneSummary(result);
}
// protected String cacheResults(List<GeneSummary> gs, Query q, String queryName, String sessionId) {
// String key = sessionId + ":"+ Integer.toString(System.identityHashCode(gs)); // CHECKME
// StoredMap<String, ResultEntry> map = resultsCacheFactory.getResultsCacheMap();
// ResultEntry re = new ResultEntry();
// re.numOfResults = gs.size();
// re.query = q;
// re.results = gs;
// re.queryName = queryName;
// if (q instanceof LuceneQuery){
// re.expanded = true;
// }
// map.put(key, re);
// return key;
// }
//
// protected String cacheResults(List<GeneSummary> gs, Query q, String queryName, TreeMap<String, Integer> taxonGroup, String sessionId) {
// String key = sessionId + ":"+ Integer.toString(System.identityHashCode(gs)); // CHECKME
// StoredMap<String, ResultEntry> map = resultsCacheFactory.getResultsCacheMap();
// ResultEntry re = new ResultEntry();
// re.numOfResults = gs.size();
// re.query = q;
// re.results = gs;
// re.queryName = queryName;
// if (q instanceof LuceneQuery){
// re.expanded = true;
// }
// if (taxonGroup != null) {
// re.taxonGroup = taxonGroup;
// }
// map.put(key, re);
// return key;
// }
protected String findTaxonName(Query query) {
String taxonName = null;
if (query instanceof TaxonQuery) {
System.err.println("query is a TaxonQuery");
TaxonNodeList nodes = ((TaxonQuery) query).getTaxons();
if (nodes != null && nodes.getNodeCount() > 0) {
TaxonNode tn = nodes.getNodes().get(0);
System.err.println("Got a TaxonNodeList out tn="+tn);
taxonName = tn.getLabel();
} // FIXME
}
System.err.println("Returning a name of '"+taxonName+"'");
return taxonName;
}
protected Errors initialiseQueryForm(Query query, ServletRequest request){
// Attempt to fill in form
ServletRequestDataBinder binder = new ServletRequestDataBinder(query);
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), false, 10));
//binder.registerCustomEditor(TaxonNode[].class, taxonNodeArrayPropertyEditor);
//ConversionService conversionService;
binder.setConversionService(conversionService);
//logger.error("About to start binder");
binder.bind(request);
//logger.error("Should have finished binder");
BindingResult br = binder.getBindingResult();
return br;
}
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
}