simplified and refactored along with cgi-script.
authorjprocter <Jim Procter>
Mon, 5 Feb 2007 17:36:21 +0000 (17:36 +0000)
committerjprocter <Jim Procter>
Mon, 5 Feb 2007 17:36:21 +0000 (17:36 +0000)
src/jalview/gui/UserQuestionnaireCheck.java

index b2b19b9..b9e741a 100644 (file)
@@ -14,98 +14,72 @@ public class UserQuestionnaireCheck implements Runnable {
      * This is intended to work with the perl CGI scripts checkresponder.pl and
      * questionnaire.pl
      */
-    String url;
+    String url=null;
     UserQuestionnaireCheck(String url) {
-        this.url = 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;
+        }
     }
-    public void run() {
+    String qid=null,rid=null;
+    private boolean checkresponse(URL qurl) throws Exception {
         boolean prompt=false;
-        try {
-            if (url.indexOf("checkresponder.pl")==-1) {
-                throw new Error("Invalid URL for the checkForQuestionnaire() method. The -questionnaire method is for Jalview user questionnaires only.");
-            }
-            // extract qid if there is one - else just get the latest
-            String rid=null,qid=null;
-            String args=null;
-            String baseurl=null,surl=null;
-            int t;
-            if ((t=url.indexOf("?"))>-1) {
-                args=url.substring(t+1);
-                surl=url.substring(0,t);
-            }
-            if ((t=url.lastIndexOf('/'))>-1) {
-                baseurl=url.substring(0,t+1);
-            }
-            if (args!=null && (t=args.indexOf("qid="))>-1) {
-                int e = args.indexOf("&",t+4);
-                if (e<0)
-                    qid=args.substring(t+4);
-                else
-                    qid=args.substring(t+4,e);
-                if (qid!=null && qid.length()==0)
-                    qid=null;
-            }
-                    
-            if (qid==null) {
-                // get a new questionnaire
-                URL qurl = new URL(url);
-                BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));
-                String qresp=null;
-                while ((qresp=br.readLine())!=null) {
-                    // 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);
-                        }
-                    }
-                }                
+        // 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 {
-                // retrieve an id for an existing questionnaire
-                // get a new questionnaire
-                URL qurl = new URL(url);
-                BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));
-                String qresp=null;
-                while ((qresp=br.readLine())!=null) {
+                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;
                 }
-
             }
-            // compare the questionnaire id against the id of the last questionnaire
-            // that the user was prompted with.
-            if (qid!=null) {
-                String lastq=jalview.bin.Cache.getProperty("QUESTIONNAIRE");
-                if (lastq==null || !lastq.startsWith(qid+":")) {
-                    prompt = true;
-                } else { 
-                    String qrid = lastq.substring(lastq.indexOf(':')+1); // retrieve old rid
-                    if (qrid!=null && !qrid.equals("null"))
-                        rid = qrid;
-                    // see if we have already responsed to this questionnaire.
-                    URL qurl = new URL(url+"?qid="+qid+"&rid="+rid);
-                    BufferedReader br = new BufferedReader(new InputStreamReader(qurl.openStream()));
-                    String qresp;
-                    if (br.ready() && (qresp=br.readLine())!=null && qresp.indexOf("NOTYET")>-1) {
-                        prompt=true; // not yet responded under that ID
-                    }
+        }
+        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
+            // Update our local property cache with latest qid and rid
             jalview.bin.Cache.setProperty("QUESTIONNAIRE",qid+":"+rid);
             if (prompt) {
-                String qurl = null;
-                if (baseurl!=null)
-                    qurl = baseurl+"questionnaire.pl?qid="+qid+"&rid="+rid;
-                else
-                    qurl = url;
+                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." +