-package jalview.gui;\r
-\r
-import java.io.BufferedReader;\r
-import java.io.InputStreamReader;\r
-import java.net.URL;\r
-\r
-import javax.swing.JOptionPane;\r
-\r
-public class UserQuestionnaireCheck implements Runnable {\r
- /**\r
- * Implements the client side machinery for detecting a new questionnaire, \r
- * checking if the user has responded to an existing one, \r
- * and prompting the user for responding to a questionnaire.\r
- * This is intended to work with the perl CGI scripts checkresponder.pl and\r
- * questionnaire.pl\r
- */\r
- String url;\r
- UserQuestionnaireCheck(String url) {\r
- this.url = url;\r
- }\r
- public void run() {\r
- boolean prompt=false;\r
- try {\r
- if (url.indexOf("checkresponder.pl")==-1) {\r
- throw new Error("Invalid URL for the checkForQuestionnaire() method. The -questionnaire method is for Jalview user questionnaires only.");\r
- }\r
- // extract qid if there is one - else just get the latest\r
- String rid=null,qid=null;\r
- String args=null;\r
- String baseurl=null,surl=null;\r
- int t;\r
- if ((t=url.indexOf("?"))>-1) {\r
- args=url.substring(t+1);\r
- surl=url.substring(0,t);\r
- }\r
- if ((t=url.lastIndexOf('/'))>-1) {\r
- baseurl=url.substring(0,t+1);\r
- }\r
- if (args!=null && (t=args.indexOf("qid="))>-1) {\r
- int e = args.indexOf("&",t+4);\r
- if (e<0)\r
- qid=args.substring(t+4);\r
- else\r
- qid=args.substring(t+4,e);\r
- if (qid!=null && qid.length()==0)\r
- qid=null;\r
- }\r
- \r
- if (qid==null) {\r
- // get a new questionnaire\r
- URL qurl = new URL(url);\r
- BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));\r
- String qresp=null;\r
- while ((qresp=br.readLine())!=null) {\r
- // check if response is of form we expect.\r
- if (qresp.indexOf(':')>-1) {\r
- rid=null;\r
- qid=qresp.substring(0,qresp.indexOf(':'));\r
- if (qresp.indexOf(':')<(qresp.length()-1)) {\r
- rid = qresp.substring(qresp.indexOf(':')+1);\r
- }\r
- }\r
- } \r
- } else {\r
- // retrieve an id for an existing questionnaire\r
- // get a new questionnaire\r
- URL qurl = new URL(url);\r
- BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));\r
- String qresp=null;\r
- while ((qresp=br.readLine())!=null) {\r
- // check if response is of form we expect.\r
- if (qresp.indexOf(':')>-1) {\r
- rid=null;\r
- qid=qresp.substring(0,qresp.indexOf(':'));\r
- if (qresp.indexOf(':')<(qresp.length()-1)) {\r
- rid = qresp.substring(qresp.indexOf(':')+1);\r
- }\r
- }\r
- }\r
-\r
- }\r
- // compare the questionnaire id against the id of the last questionnaire\r
- // that the user was prompted with.\r
- if (qid!=null) {\r
- String lastq=jalview.bin.Cache.getProperty("QUESTIONNAIRE");\r
- if (lastq==null || !lastq.startsWith(qid+":")) {\r
- prompt = true;\r
- } else { \r
- String qrid = lastq.substring(lastq.indexOf(':')+1); // retrieve old rid\r
- if (qrid!=null && !qrid.equals("null"))\r
- rid = qrid;\r
- // see if we have already responsed to this questionnaire.\r
- URL qurl = new URL(url+"?qid="+qid+"&rid="+rid);\r
- BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));\r
- String qresp;\r
- if (br.ready() && (qresp=br.readLine())!=null && qresp.indexOf("NOTYET")>-1) {\r
- prompt=true; // not yet responded under that ID\r
- }\r
- }\r
- }\r
- // Update our local property cache\r
- jalview.bin.Cache.setProperty("QUESTIONNAIRE",qid+":"+rid);\r
- if (prompt) {\r
- String qurl = null;\r
- if (baseurl!=null)\r
- qurl = baseurl+"questionnaire.pl?qid="+qid+"&rid="+rid;\r
- else\r
- qurl = url;\r
- jalview.bin.Cache.log.info("Prompting user for questionnaire at "+qurl);\r
- int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
- "There is a new Questionnaire available." +\r
- "Would you like to complete it now ?\n",\r
- "Jalview User Survey",\r
- JOptionPane.YES_NO_OPTION,\r
- JOptionPane.QUESTION_MESSAGE);\r
-\r
- if (reply == JOptionPane.YES_OPTION)\r
- {\r
- jalview.bin.Cache.log.debug("Opening "+qurl);\r
- jalview.util.BrowserLauncher.openURL(qurl);\r
- }\r
- }\r
- } catch (Exception e) {\r
- jalview.bin.Cache.log.warn("When trying to access questionnaire URL "+url,e);\r
- }\r
- }\r
-\r
-}\r
+package jalview.gui;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+public class UserQuestionnaireCheck implements Runnable {
+ /**
+ * Implements the client side machinery for detecting a new questionnaire,
+ * checking if the user has responded to an existing one,
+ * and prompting the user for responding to a questionnaire.
+ * This is intended to work with the perl CGI scripts checkresponder.pl and
+ * questionnaire.pl
+ */
+ String url=null;
+ UserQuestionnaireCheck(String url) {
+ if (url.indexOf("questionnaire.pl")==-1) {
+ jalview.bin.Cache.log.error("'"+url+"' is an Invalid URL for the checkForQuestionnaire() method.\n"
+ +"This argument is only for questionnaires derived from jalview's questionnaire.pl cgi interface.");
+ } else {
+ this.url = url;
+ }
+ }
+ String qid=null,rid=null;
+ private boolean checkresponse(URL qurl) throws Exception {
+ boolean prompt=false;
+ // see if we have already responsed to this questionnaire or get a new qid/rid pair
+ BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));
+ String qresp;
+ while ((qresp=br.readLine())!=null) {
+ if (qresp.indexOf("NOTYET:")==0) {
+ prompt=true; // not yet responded under that ID
+ } else {
+ if (qresp.indexOf("RESPONDED:")==-1) {
+ // may be a qid:rid for the latest questionnaire.
+ // check if response is of form we expect.
+ if (qresp.indexOf(':')>-1) {
+ rid=null;
+ qid=qresp.substring(0,qresp.indexOf(':'));
+ if (qresp.indexOf(':')<(qresp.length()-1)) {
+ rid = qresp.substring(qresp.indexOf(':')+1);
+ prompt=true; // this is a new qid/rid pair
+ }
+ }
+ } else {
+ prompt=false;
+ }
+ }
+ }
+ return prompt;
+ }
+ public void run() {
+ if (url==null)
+ return;
+ boolean prompt=false;
+ try {
+ // First - check to see if wee have an old questionnaire/response id pair.
+ String lastq=jalview.bin.Cache.getProperty("QUESTIONNAIRE");
+ if (lastq==null) {
+ prompt = checkresponse(new URL(url+(url.indexOf('?')>-1 ? "&" : "?") +"checkresponse=1"));
+ } else {
+ String qurl=url+(url.indexOf('?')>-1 ? "&" : "?") +"checkresponse=1";
+ // query the server with the old qid/id pair
+ String qqid = lastq.indexOf(':')>-1 ? lastq.substring(0,lastq.indexOf(':')) : null;
+ if (qqid!=null && qqid.length()>0) {
+ qurl+="&qid="+qqid;
+ qid=qqid;
+ }
+ String qrid = lastq.substring(lastq.indexOf(':')+1); // retrieve old rid
+ if (qrid!=null && !qrid.equals("null")) {
+ rid=qrid;
+ qurl+="&rid="+qrid;
+ }
+ // see if we have already responsed to this questionnaire.
+ prompt = checkresponse(new URL(qurl));
+ }
+ // Update our local property cache with latest qid and rid
+ jalview.bin.Cache.setProperty("QUESTIONNAIRE",qid+":"+rid);
+ if (prompt) {
+ String qurl = url+(url.indexOf('?')>-1 ? "&" : "?") + "qid="+qid+"&rid="+rid;
+ jalview.bin.Cache.log.info("Prompting user for questionnaire at "+qurl);
+ int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ "There is a new Questionnaire available." +
+ "Would you like to complete it now ?\n",
+ "Jalview User Survey",
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.QUESTION_MESSAGE);
+
+ if (reply == JOptionPane.YES_OPTION)
+ {
+ jalview.bin.Cache.log.debug("Opening "+qurl);
+ jalview.util.BrowserLauncher.openURL(qurl);
+ }
+ }
+ } catch (Exception e) {
+ jalview.bin.Cache.log.warn("When trying to access questionnaire URL "+url,e);
+ }
+ }
+
+}