--- /dev/null
+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