more bugfixes.
[jalview.git] / src / jalview / gui / UserQuestionnaireCheck.java
1 package jalview.gui;
2
3 import java.io.BufferedReader;
4 import java.io.InputStreamReader;
5 import java.net.URL;
6
7 import javax.swing.JOptionPane;
8
9 public class UserQuestionnaireCheck implements Runnable {
10     /**
11      * Implements the client side machinery for detecting a new questionnaire, 
12      * checking if the user has responded to an existing one, 
13      * and prompting the user for responding to a questionnaire.
14      * This is intended to work with the perl CGI scripts checkresponder.pl and
15      * questionnaire.pl
16      */
17     String url=null;
18     UserQuestionnaireCheck(String url) {
19         if (url.indexOf("questionnaire.pl")==-1) {
20             jalview.bin.Cache.log.error("'"+url+"' is an Invalid URL for the checkForQuestionnaire() method.\n"
21                     +"This argument is only for questionnaires derived from jalview's questionnaire.pl cgi interface.");
22         } else {
23             this.url = url;
24         }
25     }
26     String qid=null,rid=null;
27     private boolean checkresponse(URL qurl) throws Exception {
28         jalview.bin.Cache.log.debug("Checking Response for : "+qurl);
29         boolean prompt=false;
30         // see if we have already responsed to this questionnaire or get a new qid/rid pair
31         BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));
32         String qresp;
33         while ((qresp=br.readLine())!=null) {
34             if (qresp.indexOf("NOTYET:")==0) {
35                 prompt=true; // not yet responded under that ID
36             } else {
37                 if (qresp.indexOf("QUESTIONNAIRE:")==0) {
38                     // QUESTIONNAIRE:qid:rid for the latest questionnaire.
39                     int p=qresp.indexOf(':',14);
40                     if (p>-1) {
41                         rid=null;
42                         qid=qresp.substring(14,p);
43                         if (p<(qresp.length()-1)) {
44                             rid = qresp.substring(p+1);
45                             prompt=true; // this is a new qid/rid pair
46                         }
47                     }
48                 } else {
49                     prompt=false;
50                 }
51             }
52         }
53         return prompt;
54     }
55     public void run() {
56         if (url==null)
57             return;
58         boolean prompt=false;
59         try {
60             // First - check to see if wee have an old questionnaire/response id pair.
61             String lastq=jalview.bin.Cache.getProperty("QUESTIONNAIRE");
62             if (lastq==null) {
63                 prompt = checkresponse(new URL(url+(url.indexOf('?')>-1 ? "&" : "?") +"checkresponse=1"));
64             } else {
65                 String qurl=url+(url.indexOf('?')>-1 ? "&" : "?") +"checkresponse=1";
66                 // query the server with the old qid/id pair
67                 String qqid = lastq.indexOf(':')>-1 ? lastq.substring(0,lastq.indexOf(':')) : null;
68                 if (qqid!=null && qqid!="null" && qqid.length()>0) {
69                     qurl+="&qid="+qqid;
70                     qid=qqid;
71                     String qrid = lastq.substring(lastq.indexOf(':')+1); // retrieve old rid
72                     if (qrid!=null && !qrid.equals("null")) {
73                         rid=qrid;
74                         qurl+="&rid="+qrid;
75                     }
76                 }
77                 // see if we have already responsed to this questionnaire.
78                 prompt = checkresponse(new URL(qurl));
79             }
80             if (qid!=null && rid!=null) {
81                 // Update our local property cache with latest qid and rid
82                 jalview.bin.Cache.setProperty("QUESTIONNAIRE",qid+":"+rid);
83             }
84             if (prompt) {
85                 String qurl = url+(url.indexOf('?')>-1 ? "&" : "?") + "qid="+qid+"&rid="+rid;
86                 jalview.bin.Cache.log.info("Prompting user for questionnaire at "+qurl);
87                 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
88                         "There is a new Questionnaire available." +
89                         "Would you like to complete it now ?\n",
90                         "Jalview User Survey",
91                         JOptionPane.YES_NO_OPTION,
92                         JOptionPane.QUESTION_MESSAGE);
93
94                 if (reply == JOptionPane.YES_OPTION)
95                 {
96                     jalview.bin.Cache.log.debug("Opening "+qurl);
97                     jalview.util.BrowserLauncher.openURL(qurl);
98                 }
99             }
100         } catch (Exception e) {
101             jalview.bin.Cache.log.warn("When trying to access questionnaire URL "+url,e);
102         }
103     }
104
105 }