Add additional checks of input parameters
[proteocache.git] / server / compbio / controllers / SequenceController.java
1 package compbio.controllers;
2
3 import java.util.List;
4 import java.util.Map;
5 import java.util.regex.Pattern;
6
7 import org.springframework.stereotype.Controller;
8 import org.springframework.web.bind.annotation.RequestMapping;
9 import org.springframework.web.bind.annotation.RequestMethod;
10 import org.springframework.web.bind.annotation.RequestParam;
11
12 import compbio.cassandra.ProteinBean;
13 import compbio.cassandra.DataBase;
14 import compbio.data.sequence.SequenceUtil;
15 import compbio.statistic.CassandraRequester;
16
17 /**
18  * Spring controller for sequence search. This version works in the servlet style.
19  * 
20  * @author Alexander Sherstnev
21  * @author Natasha Sherstneva
22  * 
23  * @since 0.5
24  * @version 1.0 December 2013
25  */
26 @Controller
27 public class SequenceController {
28         
29         /**
30          * pattern for NON-protein alphabet  symbols
31          */
32         private final Pattern NONPROTEIN = Pattern.compile("[^ARNDCQEGHILKMFPSTWYV]+", Pattern.CASE_INSENSITIVE);
33
34         @RequestMapping(value = "/sequence/query1", method = RequestMethod.GET)
35         public String formSequenceQuery(Map<String, Object> model) {
36                 model.put("value", "AAAAA");
37                 return "queryProteinSequence";
38         }
39
40         @RequestMapping(value = "/sequence/query2", method = RequestMethod.GET)
41         public String formCounterQuery(Map<String, Object> model) {
42                 model.put("value", 5);
43                 return "queryProteinSequenceCounter";
44         }
45         
46         @RequestMapping(value = "/sequence/querysequence", method = RequestMethod.GET)
47         public String findSequence(@RequestParam("sequence") String sequence, @RequestParam("protein") String flag, Map<String, Object> model) {
48                 final long startTime = System.currentTimeMillis();
49
50                 // input checks
51                 String trimmedsequence = sequence.replaceAll("\\s", "");
52                 if (trimmedsequence.equalsIgnoreCase("")) {
53                         model.put("error", "The sequence cann't be empty");
54                         model.put("value", sequence);
55                         return "queryProteinSequence";
56                 }
57                 if (NONPROTEIN.matcher(trimmedsequence).find()) {
58                         model.put("error", "The sequence contains symbols not from the standard protein alphabet");
59                         model.put("value", sequence);
60                         return "queryProteinSequence";
61                 }
62
63                 model.put("njobs", 0);
64                 model.put("prot", trimmedsequence);
65                 model.put("flag", flag);
66
67                 if (0 < trimmedsequence.length()) {
68                         CassandraRequester cr = new CassandraRequester();
69                         List<ProteinBean> r = cr.readProteins(trimmedsequence, flag);
70                         model.put("results", r);
71                         if (null != r) {
72                                 if (flag.equals("whole"))
73                                         model.put("njobs",r.get(0).getJobid().size());
74                                 else
75                                         model.put("njobs", r.size());
76                         }
77                 }
78                 final long endTime = System.currentTimeMillis();
79                 model.put("timeExecution", (endTime - startTime));
80                 return "reportProteinSequences";
81         }
82
83         @RequestMapping(value = "/sequence/querycounter", method = RequestMethod.GET)
84         public String countSequences(@RequestParam("counterJob") String counter, Map<String, Object> model) {
85                 final long startTime = System.currentTimeMillis();
86
87                 if (counter.equals("")) {
88                         model.put("error", "The value must not be empty");
89                         model.put("value", counter);
90                         return "queryIPStatistics";
91                 }
92
93                 int realcounter;
94                 try {
95                         realcounter = Integer.parseInt(counter.trim());
96                 } catch (NumberFormatException e) {
97                         model.put("error", "The value must be an integer number");
98                         model.put("value", counter);
99                         return "queryIPStatistics";
100                 }
101
102                 if (realcounter < 1) {
103                         model.put("error", "The value must be greater than 0");
104                         model.put("value", counter);
105                         return "queryIPStatistics";
106                 }
107
108                 CassandraRequester cr = new CassandraRequester();
109                 List<DataBase> r = cr.readProteinByCounter(realcounter);
110                 model.put("results", r);
111                 model.put("njobs", 0);
112                 if (null != r) {
113                         model.put("njobs", r.size());
114                 }
115                 final long endTime = System.currentTimeMillis();
116                 model.put("timeExecution", (endTime - startTime));
117                 model.put("counter", realcounter);
118                 return "reportProteinSequencesCounter";
119         }
120
121 }