3 import java.io.BufferedReader;
\r
4 import java.io.InputStreamReader;
\r
7 import javax.swing.JOptionPane;
\r
9 public class UserQuestionnaireCheck implements Runnable {
\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
18 UserQuestionnaireCheck(String url) {
\r
22 boolean prompt=false;
\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
27 // extract qid if there is one - else just get the latest
\r
28 String rid=null,qid=null;
\r
30 String baseurl=null,surl=null;
\r
32 if ((t=url.indexOf("?"))>-1) {
\r
33 args=url.substring(t+1);
\r
34 surl=url.substring(0,t);
\r
36 if ((t=url.lastIndexOf('/'))>-1) {
\r
37 baseurl=url.substring(0,t+1);
\r
39 if (args!=null && (t=args.indexOf("qid="))>-1) {
\r
40 int e = args.indexOf("&",t+4);
\r
42 qid=args.substring(t+4);
\r
44 qid=args.substring(t+4,e);
\r
45 if (qid!=null && qid.length()==0)
\r
50 // get a new questionnaire
\r
51 URL qurl = new URL(url);
\r
52 BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));
\r
54 while ((qresp=br.readLine())!=null) {
\r
55 // check if response is of form we expect.
\r
56 if (qresp.indexOf(':')>-1) {
\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
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
70 while ((qresp=br.readLine())!=null) {
\r
71 // check if response is of form we expect.
\r
72 if (qresp.indexOf(':')>-1) {
\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
82 // compare the questionnaire id against the id of the last questionnaire
\r
83 // that the user was prompted with.
\r
85 String lastq=jalview.bin.Cache.getProperty("QUESTIONNAIRE");
\r
86 if (lastq==null || !lastq.startsWith(qid+":")) {
\r
89 String qrid = lastq.substring(lastq.indexOf(':')+1); // retrieve old rid
\r
90 if (qrid!=null && !qrid.equals("null"))
\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
96 if (br.ready() && (qresp=br.readLine())!=null && qresp.indexOf("NOTYET")>-1) {
\r
97 prompt=true; // not yet responded under that ID
\r
101 // Update our local property cache
\r
102 jalview.bin.Cache.setProperty("QUESTIONNAIRE",qid+":"+rid);
\r
104 String qurl = null;
\r
106 qurl = baseurl+"questionnaire.pl?qid="+qid+"&rid="+rid;
\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
117 if (reply == JOptionPane.YES_OPTION)
\r
119 jalview.bin.Cache.log.debug("Opening "+qurl);
\r
120 jalview.util.BrowserLauncher.openURL(qurl);
\r
123 } catch (Exception e) {
\r
124 jalview.bin.Cache.log.warn("When trying to access questionnaire URL "+url,e);
\r