JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / gui / UserQuestionnaireCheck.java
index b2b19b9..eb38ee6 100644 (file)
+/*
+ * 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;
-    UserQuestionnaireCheck(String url) {
-        this.url = url;
+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.");
     }
-    public void run() {
-        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);
-                        }
-                    }
-                }                
-            } 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) {
-                    // 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);
-                        }
-                    }
-                }
+    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
             }
-            // 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
-                    }
-                }
-            }
-            // Update our local property cache
-            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;
-                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",
+          }
+        }
+      }
+    }
+    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);
+        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);
     }
+  }
 
 }