JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / gui / UserQuestionnaireCheck.java
index 9ce8d01..eb38ee6 100644 (file)
-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
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.gui;
+
+import jalview.util.MessageManager;
+
+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
+  {
+    jalview.bin.Cache.log.debug("Checking Response for : " + qurl);
+    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("QUESTIONNAIRE:") == 0)
+        {
+          // QUESTIONNAIRE:qid:rid for the latest questionnaire.
+          int p = qresp.indexOf(':', 14);
+          if (p > -1)
+          {
+            rid = null;
+            qid = qresp.substring(14, p);
+            if (p < (qresp.length() - 1))
+            {
+              rid = qresp.substring(p + 1);
+              prompt = true; // this is a new qid/rid pair
+            }
+          }
+        }
+      }
+    }
+    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 != "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));
+      }
+      if (qid != null && rid != null)
+      {
+        // 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, MessageManager
+                        .getString("label.jalview_new_questionnaire"),
+                        MessageManager
+                                .getString("label.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);
+    }
+  }
+
+}