client side machinery for user questionnaire responses
authorjprocter <Jim Procter>
Mon, 5 Feb 2007 14:44:17 +0000 (14:44 +0000)
committerjprocter <Jim Procter>
Mon, 5 Feb 2007 14:44:17 +0000 (14:44 +0000)
src/jalview/gui/UserQuestionnaireCheck.java [new file with mode: 0644]

diff --git a/src/jalview/gui/UserQuestionnaireCheck.java b/src/jalview/gui/UserQuestionnaireCheck.java
new file mode 100644 (file)
index 0000000..9ce8d01
--- /dev/null
@@ -0,0 +1,128 @@
+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