9ce8d01ae7bff4d45c4e81791a166190a028f111
[jalview.git] / src / jalview / gui / UserQuestionnaireCheck.java
1 package jalview.gui;\r
2 \r
3 import java.io.BufferedReader;\r
4 import java.io.InputStreamReader;\r
5 import java.net.URL;\r
6 \r
7 import javax.swing.JOptionPane;\r
8 \r
9 public class UserQuestionnaireCheck implements Runnable {\r
10     /**\r
11      * Implements the client side machinery for detecting a new questionnaire, \r
12      * checking if the user has responded to an existing one, \r
13      * and prompting the user for responding to a questionnaire.\r
14      * This is intended to work with the perl CGI scripts checkresponder.pl and\r
15      * questionnaire.pl\r
16      */\r
17     String url;\r
18     UserQuestionnaireCheck(String url) {\r
19         this.url = url;\r
20     }\r
21     public void run() {\r
22         boolean prompt=false;\r
23         try {\r
24             if (url.indexOf("checkresponder.pl")==-1) {\r
25                 throw new Error("Invalid URL for the checkForQuestionnaire() method. The -questionnaire method is for Jalview user questionnaires only.");\r
26             }\r
27             // extract qid if there is one - else just get the latest\r
28             String rid=null,qid=null;\r
29             String args=null;\r
30             String baseurl=null,surl=null;\r
31             int t;\r
32             if ((t=url.indexOf("?"))>-1) {\r
33                 args=url.substring(t+1);\r
34                 surl=url.substring(0,t);\r
35             }\r
36             if ((t=url.lastIndexOf('/'))>-1) {\r
37                 baseurl=url.substring(0,t+1);\r
38             }\r
39             if (args!=null && (t=args.indexOf("qid="))>-1) {\r
40                 int e = args.indexOf("&",t+4);\r
41                 if (e<0)\r
42                     qid=args.substring(t+4);\r
43                 else\r
44                     qid=args.substring(t+4,e);\r
45                 if (qid!=null && qid.length()==0)\r
46                     qid=null;\r
47             }\r
48                     \r
49             if (qid==null) {\r
50                 // get a new questionnaire\r
51                 URL qurl = new URL(url);\r
52                 BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));\r
53                 String qresp=null;\r
54                 while ((qresp=br.readLine())!=null) {\r
55                     // check if response is of form we expect.\r
56                     if (qresp.indexOf(':')>-1) {\r
57                         rid=null;\r
58                         qid=qresp.substring(0,qresp.indexOf(':'));\r
59                         if (qresp.indexOf(':')<(qresp.length()-1)) {\r
60                             rid = qresp.substring(qresp.indexOf(':')+1);\r
61                         }\r
62                     }\r
63                 }                \r
64             } else {\r
65                 // retrieve an id for an existing questionnaire\r
66                 // get a new questionnaire\r
67                 URL qurl = new URL(url);\r
68                 BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));\r
69                 String qresp=null;\r
70                 while ((qresp=br.readLine())!=null) {\r
71                     // check if response is of form we expect.\r
72                     if (qresp.indexOf(':')>-1) {\r
73                         rid=null;\r
74                         qid=qresp.substring(0,qresp.indexOf(':'));\r
75                         if (qresp.indexOf(':')<(qresp.length()-1)) {\r
76                             rid = qresp.substring(qresp.indexOf(':')+1);\r
77                         }\r
78                     }\r
79                 }\r
80 \r
81             }\r
82             // compare the questionnaire id against the id of the last questionnaire\r
83             // that the user was prompted with.\r
84             if (qid!=null) {\r
85                 String lastq=jalview.bin.Cache.getProperty("QUESTIONNAIRE");\r
86                 if (lastq==null || !lastq.startsWith(qid+":")) {\r
87                     prompt = true;\r
88                 } else { \r
89                     String qrid = lastq.substring(lastq.indexOf(':')+1); // retrieve old rid\r
90                     if (qrid!=null && !qrid.equals("null"))\r
91                         rid = qrid;\r
92                     // see if we have already responsed to this questionnaire.\r
93                     URL qurl = new URL(url+"?qid="+qid+"&rid="+rid);\r
94                     BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));\r
95                     String qresp;\r
96                     if (br.ready() && (qresp=br.readLine())!=null && qresp.indexOf("NOTYET")>-1) {\r
97                         prompt=true; // not yet responded under that ID\r
98                     }\r
99                 }\r
100             }\r
101             // Update our local property cache\r
102             jalview.bin.Cache.setProperty("QUESTIONNAIRE",qid+":"+rid);\r
103             if (prompt) {\r
104                 String qurl = null;\r
105                 if (baseurl!=null)\r
106                     qurl = baseurl+"questionnaire.pl?qid="+qid+"&rid="+rid;\r
107                 else\r
108                     qurl = url;\r
109                 jalview.bin.Cache.log.info("Prompting user for questionnaire at "+qurl);\r
110                 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
111                         "There is a new Questionnaire available." +\r
112                         "Would you like to complete it now ?\n",\r
113                         "Jalview User Survey",\r
114                         JOptionPane.YES_NO_OPTION,\r
115                         JOptionPane.QUESTION_MESSAGE);\r
116 \r
117                 if (reply == JOptionPane.YES_OPTION)\r
118                 {\r
119                     jalview.bin.Cache.log.debug("Opening "+qurl);\r
120                     jalview.util.BrowserLauncher.openURL(qurl);\r
121                 }\r
122             }\r
123         } catch (Exception e) {\r
124             jalview.bin.Cache.log.warn("When trying to access questionnaire URL "+url,e);\r
125         }\r
126     }\r
127 \r
128 }\r