From a4e4432c6f5812208d72d9f6bea7aff1aa850817 Mon Sep 17 00:00:00 2001 From: Sasha Sherstnev Date: Thu, 23 Jan 2014 14:01:03 +0000 Subject: [PATCH] 1. Fix problem with slow servlets (wrong forming CVS line) 2. Add servlet time execution for admin role --- datadb/compbio/beans/ProteinBean.java | 1 + .../compbio/cassandra/readers/SequenceReader.java | 31 +++++++----- server/compbio/controllers/JobController.java | 44 +++++++++++------ .../compbio/controllers/SSFeaturesController.java | 46 ++++++++++++----- server/compbio/controllers/SequenceController.java | 52 ++++++++++---------- webapp/view/reports/SSFeatures.jsp | 5 +- webapp/view/reports/Sequences.jsp | 40 +++++++-------- webapp/view/reports/SequencesStatistics.jsp | 4 ++ 8 files changed, 138 insertions(+), 85 deletions(-) diff --git a/datadb/compbio/beans/ProteinBean.java b/datadb/compbio/beans/ProteinBean.java index c649320..958eab5 100644 --- a/datadb/compbio/beans/ProteinBean.java +++ b/datadb/compbio/beans/ProteinBean.java @@ -21,6 +21,7 @@ public class ProteinBean implements PredictionIndex { this.predictions = new LinkedHashMap(); this.jobid = new ArrayList(); setPredictions(pred); + setJnetpred(pred); } public void setSequence(String seq) { diff --git a/datadb/compbio/cassandra/readers/SequenceReader.java b/datadb/compbio/cassandra/readers/SequenceReader.java index 0aedbb2..3c0d6e6 100644 --- a/datadb/compbio/cassandra/readers/SequenceReader.java +++ b/datadb/compbio/cassandra/readers/SequenceReader.java @@ -8,6 +8,16 @@ import com.datastax.driver.core.Row; import compbio.beans.ProteinBean; +/** + * Reader class for making requests on protein sequences to cassandra. + * + * @author Alexander Sherstnev + * @author Natasha Sherstneva + * + * @since 0.5 + * @version 1.0 + * @since December 2013 + */ public class SequenceReader extends CassandraReader { public SequenceReader() { @@ -17,7 +27,7 @@ public class SequenceReader extends CassandraReader { /** * query: protein sequence * - * @param protIn + * @param sequence * protein sequence or partial of protein sequence * @param searchtype * "whole" or "partial" of protein sequence @@ -25,35 +35,34 @@ public class SequenceReader extends CassandraReader { * @return List to the controller SequenceController * **/ - public List readProteins(String protIn, String searchtype) { + public List readProteins(String sequence, String searchtype) { List query = new ArrayList(); if (searchtype.equals("whole")) { - ResultSet results = CassandraQuery("SELECT JobID, Predictions FROM ProteinRow WHERE Protein = '" + protIn + "';"); + ResultSet results = CassandraQuery("SELECT JobID, Predictions FROM ProteinRow WHERE Protein = '" + sequence + "';"); if (results.isExhausted()) return null; List rows = results.all(); - ProteinBean structure = new ProteinBean(protIn, rows.get(0).getMap("Predictions", String.class, String.class)); + ProteinBean structure = new ProteinBean(sequence, rows.get(0).getMap("Predictions", String.class, String.class)); for (Row r : rows) { structure.setJobid(r.getString("JobID")); } query.add(structure); } else { - ResultSet results = CassandraQuery("SELECT * FROM ProteinRow;"); + ResultSet results = CassandraQuery("SELECT * FROM ProteinRow;"); if (results.isExhausted()) return null; List rows = results.all(); for (Row r : rows) { - String prot = r.getString("Protein"); - if (prot.matches("(.*)" + protIn + "(.*)")) { - ProteinBean structure = new ProteinBean(prot, r.getMap("Predictions", String.class, String.class)); - structure.setJobid(r.getString("JobID")); - query.add(structure); + String protein = r.getString("Protein"); + if (protein.matches("(.*)" + sequence + "(.*)")) { + ProteinBean foundsequence = new ProteinBean(protein, r.getMap("Predictions", String.class, String.class)); + query.add(foundsequence); } } } if (searchtype.equals("partial")) { for (ProteinBean entry : query) { - entry.setSubProt(CreateSubprotein(entry.getSequence(), protIn)); + entry.setSubProt(CreateSubprotein(entry.getSequence(), sequence)); } } return query; diff --git a/server/compbio/controllers/JobController.java b/server/compbio/controllers/JobController.java index c1c7af8..8033620 100644 --- a/server/compbio/controllers/JobController.java +++ b/server/compbio/controllers/JobController.java @@ -22,9 +22,13 @@ import compbio.cassandra.readers.JobReader; import compbio.engine.archive.ArchivedJob; /** + * Spring controller for supporting job queries. This version works in the + * servlet style. + * * @author Alexander Sherstnev * @author Natasha Sherstneva - * @version 1.0 Dec 2013 + * @version 1.0 + * @since Dec 2013 */ @Controller public class JobController extends BasicController { @@ -73,22 +77,28 @@ public class JobController extends BasicController { /** * form a report page for a job execution time statistics. * + * @param date1 + * initial date for requested statistics + * @param date2 + * final date for requested statistics + * @param alldates + * All available jobs are analyzed if alldates="AllDates,off" * @param model * MVC model * @return link to the JSP query page */ @RequestMapping(value = "/stat/exectime/results", method = RequestMethod.GET) public String findExecTimeData(@RequestParam("date1") String date1, @RequestParam("date2") String date2, - @RequestParam(value = "option", required = false) String option, Map model) { + @RequestParam(value = "option", required = false) String alldates, Map model) { model.put("username", getPrincipalName()); final long startTime = System.currentTimeMillis(); Calendar loccal = Calendar.getInstance(); ExecutionTimeReader reader = new ExecutionTimeReader(); - if (option.equals("AllDates,off")) { + if (alldates.equals("AllDates,off")) { date1 = theEaerlistDate; date2 = theCurrentDate; } - + // dates in string format String trimmeddate1 = date1.replaceAll("\\s", ""); String trimmeddate2 = date2.replaceAll("\\s", ""); @@ -102,7 +112,7 @@ public class JobController extends BasicController { model.put("date2", date2); return "query/JobTimeExecution"; } - + if (longDate1 < CassandraReader.earliestDate()) longDate1 = CassandraReader.earliestDate(); if (longDate2 > loccal.getTimeInMillis()) @@ -112,20 +122,21 @@ public class JobController extends BasicController { date2 = DateFormatter.DateLongToString(longDate2, formaterYYMMDD); model.put("date1", date1); model.put("date2", date2); - model.put("option", option); - ExecutionTimeBean res = reader.query(longDate1, longDate2);; + model.put("option", alldates); + ExecutionTimeBean res = reader.query(longDate1, longDate2); + ; model.put("result", res); Map results = res.getDateTotal(); - String csvline = ""; + StringBuilder csvline = new StringBuilder(""); if (0 < res.getDateTotal().size()) { - csvline = "\'Date\',\'Total\',\'0-30 sec\',\'30-60 sec\',\'1-2 min\',\'2-10 min\',\'more 10 min\'%0A"; + csvline.append("\'Date\',\'Total\',\'0-30 sec\',\'30-60 sec\',\'1-2 min\',\'2-10 min\',\'more 10 min\'%0A"); for (Map.Entry entry : results.entrySet()) { - csvline += "\'" + entry.getKey() + "\',\'" + entry.getValue().getTotal() + "\',\'" + entry.getValue().getTotal0_30s() + "\',\'" - + entry.getValue().getTotal30_60s() + "\',\'" + entry.getValue().getTotal1_2m() + "\',\'" - + entry.getValue().getTotal2_10m() + "\',\'" + entry.getValue().getTotal10m() + "\'%0A"; + csvline.append("\'" + entry.getKey() + "\',\'" + entry.getValue().getTotal() + "\',\'" + entry.getValue().getTotal0_30s() + + "\',\'" + entry.getValue().getTotal30_60s() + "\',\'" + entry.getValue().getTotal1_2m() + "\',\'" + + entry.getValue().getTotal2_10m() + "\',\'" + entry.getValue().getTotal10m() + "\'%0A"); } } - model.put("csvfile", csvline); + model.put("csvfile", csvline.toString()); model.put("ndays", res.getDateTotal().size() - 1); final long endTime = System.currentTimeMillis(); model.put("timeExecution", (endTime - startTime)); @@ -133,11 +144,13 @@ public class JobController extends BasicController { } /** - * form a query page for a job. The servlet should no be visible to users at - * all. + * form result page for one job with a given job ID. * + * @param jobid + * job ID * @param model * MVC model + * * @return link to the JSP query page * @throws IOException */ @@ -151,6 +164,7 @@ public class JobController extends BasicController { model.put("timeExecution", (endTime - startTime)); model.put("IdJob", jobid); + // prepare archive file for the job for downloading ArchivedJob aj = new ArchivedJob(jobid); try { model.put("jobarchive", aj.prepareJobArchiveToWeb()); diff --git a/server/compbio/controllers/SSFeaturesController.java b/server/compbio/controllers/SSFeaturesController.java index 34eed80..3c66361 100644 --- a/server/compbio/controllers/SSFeaturesController.java +++ b/server/compbio/controllers/SSFeaturesController.java @@ -10,8 +10,8 @@ import org.springframework.web.bind.annotation.RequestParam; import compbio.statistic.CassandraRequester; /** - * Spring controller for sequence queries. This version works in the servlet - * style. + * Spring controller for protein secondary structure features. This version + * works in the servlet style. * * @author Alexander Sherstnev * @author Natasha Sherstneva @@ -23,6 +23,15 @@ import compbio.statistic.CassandraRequester; @RequestMapping("/features") public class SSFeaturesController extends BasicController { + /** + * form a query page for protein secondary structure feaatures: Proteins + * with given fraction of H/E (helix/beta sheets) + * + * @param model + * MVC model object + * + * @return link to the report JSP page + */ @RequestMapping(value = "query", method = RequestMethod.GET) public String formCounterQuery(Map model) { model.put("username", getPrincipalName()); @@ -31,6 +40,21 @@ public class SSFeaturesController extends BasicController { return "query/SSFeatures"; } + /** + * form a results page for protein secondary structure features: Proteins + * with given fraction of H/E (helix/beta sheets) All proteins with E/H + * higher than a given percent of the length are returned + * + * @param model + * MVC model object + * @param typeFeature + * type of SS: H/E (helix/beta sheets) + * @param percent + * fraction of the protein length predicted as H/E (helix/beta + * sheets) + * + * @return link to the report JSP page + */ @RequestMapping(value = "results", method = RequestMethod.GET) public String countSequences(@RequestParam("TypeFeatures") String typeFeature, @RequestParam("Percent") String percent, Map model) { @@ -69,19 +93,19 @@ public class SSFeaturesController extends BasicController { Map r = cr.readProteinsPrediction(typeFeature, realpercent); model.put("results", r); model.put("njobs", 0); - String csvline = ""; + StringBuilder csvline = new StringBuilder(""); if (null != r) { model.put("njobs", r.size()); - csvline = "\'Prediction%20number\',\'Protein%20Sequence\', \'Secondary%20Structure%20Prediction\'%0A"; - } + csvline.append("\'Prediction%20number\',\'Protein%20Sequence\', \'Secondary%20Structure%20Prediction\'%0A"); - // form line for CSV file - int counter = 1; - for (Map.Entry entry : r.entrySet()) { - csvline += "\'" + counter + "\',\'" + entry.getKey() + "\',\'" + entry.getValue() + "\'%0A"; - ++counter; + // form line for CSV file + int counter = 1; + for (Map.Entry entry : r.entrySet()) { + csvline.append("\'" + counter + "\',\'" + entry.getKey() + "\',\'" + entry.getValue() + "\'%0A"); + ++counter; + } } - model.put("csvfile", csvline); + model.put("csvfile", csvline.toString()); final long endTime = System.currentTimeMillis(); model.put("timeExecution", (endTime - startTime)); diff --git a/server/compbio/controllers/SequenceController.java b/server/compbio/controllers/SequenceController.java index 9e92273..4eb5844 100644 --- a/server/compbio/controllers/SequenceController.java +++ b/server/compbio/controllers/SequenceController.java @@ -16,8 +16,8 @@ import compbio.cassandra.readers.ReaderByCounter; import compbio.cassandra.readers.SequenceReader; /** - * Spring controller for sequence queries. This version works in the servlet - * style. + * Spring controller for supporting sequence queries. This version works in the + * servlet style. * * @author Alexander Sherstnev * @author Natasha Sherstneva @@ -98,32 +98,33 @@ public class SequenceController extends BasicController { model.put("njobs", 0); model.put("prot", trimmedsequence); model.put("searchtype", searchtype); - String csvline = ""; + StringBuilder csvline = new StringBuilder(""); if (0 < trimmedsequence.length()) { SequenceReader reader = new SequenceReader(); List result = reader.readProteins(trimmedsequence, searchtype); model.put("results", result); if (null != result) { - if (searchtype.equals("whole")) + if (searchtype.equals("whole")) { model.put("njobs", result.get(0).getJobid().size()); - else + } else { model.put("njobs", result.size()); - csvline = "\'Job\',\'Annotation\',\'Sequence\'%0A"; - // form CSV file string + } + csvline.append("\'Job\',\'Annotation\',\'Sequence\'%0A"); for (ProteinBean entry : result) { List jobs = entry.getJobid(); String protein = entry.getSequence(); LinkedHashMap predictions = entry.getPredictions(); + StringBuilder jobline = new StringBuilder(); + for (Map.Entry pr : predictions.entrySet()) { + jobline.append("\'\',\'" + pr.getKey() + "\',\'" + pr.getValue() + "\'%0A"); + } for (String job : jobs) { - csvline += "\'" + job + "\',\'Sequence\',\'" + protein + "\',\'%0A"; - for (Map.Entry pr : predictions.entrySet()) { - csvline += "\'\',\'" + pr.getKey() + "\',\'" + pr.getValue() + "\'%0A"; - } + csvline.append("\'" + job + "\',\'Sequence\',\'" + protein + "\',\'%0A" + jobline.toString()); } } } } - model.put("csvfile", csvline); + model.put("csvfile", csvline.toString()); final long endTime = System.currentTimeMillis(); model.put("timeExecution", (endTime - startTime)); @@ -169,24 +170,23 @@ public class SequenceController extends BasicController { List r = reader.readProteinByCounter(realcounter); model.put("results", r); model.put("njobs", 0); - String csvline = ""; + StringBuilder csvline = new StringBuilder(""); if (null != r) { model.put("njobs", r.size()); - csvline = "\'Job%20 count\', \'Protein%20Sequence\'%0A"; - } - // form line for CSV file - - for (TotalByCounterBean b : r) { - if (b.getName().equals("")) { - csvline += "\'" + b.getTotaljobs() + "\',\'Alignment%20job\'%0A"; - // fix problem with records without protein sequence (alignment - // jobs) - b.setName("Alignment job"); - } else { - csvline += "\'" + b.getTotaljobs() + "\',\'" + b.getName() + "\'%0A"; + // form line for CSV file + csvline.append("\'Job%20 count\', \'Protein%20Sequence\'%0A"); + for (TotalByCounterBean b : r) { + if (b.getName().equals("")) { + // fix problem with records without protein sequence + // (alignment jobs) + csvline.append("\'" + b.getTotaljobs() + "\',\'Alignment%20job\'%0A"); + b.setName("Alignment job"); + } else { + csvline.append("\'" + b.getTotaljobs() + "\',\'" + b.getName() + "\'%0A"); + } } } - model.put("csvfile", csvline); + model.put("csvfile", csvline.toString()); model.put("results", r); final long endTime = System.currentTimeMillis(); diff --git a/webapp/view/reports/SSFeatures.jsp b/webapp/view/reports/SSFeatures.jsp index 4e2e773..445b870 100644 --- a/webapp/view/reports/SSFeatures.jsp +++ b/webapp/view/reports/SSFeatures.jsp @@ -6,7 +6,7 @@ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> -<%@page import="java.util.ArrayList"%> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> @@ -35,6 +35,9 @@
+ +

Servlet execution time: ${timeExecution} milliseconds

+

No proteins with feature ${feature} more then ${percent}% of the protein sequence found

diff --git a/webapp/view/reports/Sequences.jsp b/webapp/view/reports/Sequences.jsp index 0bb4b7a..b0f384a 100644 --- a/webapp/view/reports/Sequences.jsp +++ b/webapp/view/reports/Sequences.jsp @@ -4,7 +4,7 @@ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> -<%@page import="java.util.ArrayList"%> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> @@ -46,6 +46,9 @@
+ +

Servlet execution time: ${timeExecution} milliseconds

+

No jobs found

@@ -66,41 +69,36 @@ - ${id} Sequence - + + ${res.sequence} - + - - ${seq} - ${seq} + + ${seq} + ${seq} - - - - - - + + + Jnetpred + + + ${res.jnetpred} + + diff --git a/webapp/view/reports/SequencesStatistics.jsp b/webapp/view/reports/SequencesStatistics.jsp index 894d113..0e22a99 100644 --- a/webapp/view/reports/SequencesStatistics.jsp +++ b/webapp/view/reports/SequencesStatistics.jsp @@ -5,6 +5,7 @@ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> +<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> @@ -34,6 +35,9 @@
+ +

Servlet execution time: ${timeExecution} milliseconds

+

No proteins with at least ${counter} jobs found

-- 1.7.10.2