Merge branch 'alpha/origin_2022_JAL-3066_Jalview_212_slivka-integration' into spike...
[jalview.git] / src / jalview / gui / UserQuestionnaireCheck.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.gui;
22
23 import java.io.BufferedReader;
24 import java.io.InputStreamReader;
25 import java.net.URL;
26
27 import jalview.util.MessageManager;
28
29 public class UserQuestionnaireCheck implements Runnable
30 {
31   /**
32    * Implements the client side machinery for detecting a new questionnaire,
33    * checking if the user has responded to an existing one, and prompting the
34    * user for responding to a questionnaire. This is intended to work with the
35    * perl CGI scripts checkresponder.pl and questionnaire.pl
36    */
37   String url = null;
38
39   UserQuestionnaireCheck(String url)
40   {
41     if (url.indexOf("questionnaire.pl") == -1)
42     {
43       jalview.bin.Cache.log.error("'" + url
44               + "' is an Invalid URL for the checkForQuestionnaire() method.\n"
45               + "This argument is only for questionnaires derived from jalview's questionnaire.pl cgi interface.");
46     }
47     else
48     {
49       this.url = url;
50     }
51   }
52
53   String qid = null, rid = null;
54
55   private boolean checkresponse(URL qurl) throws Exception
56   {
57     jalview.bin.Cache.log.debug("Checking Response for : " + qurl);
58     boolean prompt = false;
59     // see if we have already responsed to this questionnaire or get a new
60     // qid/rid pair
61     BufferedReader br = new BufferedReader(
62             new InputStreamReader(qurl.openStream()));
63     String qresp;
64     while ((qresp = br.readLine()) != null)
65     {
66       if (qresp.indexOf("NOTYET:") == 0)
67       {
68         prompt = true; // not yet responded under that ID
69       }
70       else
71       {
72         if (qresp.indexOf("QUESTIONNAIRE:") == 0)
73         {
74           // QUESTIONNAIRE:qid:rid for the latest questionnaire.
75           int p = qresp.indexOf(':', 14);
76           if (p > -1)
77           {
78             rid = null;
79             qid = qresp.substring(14, p);
80             if (p < (qresp.length() - 1))
81             {
82               rid = qresp.substring(p + 1);
83               prompt = true; // this is a new qid/rid pair
84             }
85           }
86         }
87       }
88     }
89     return prompt;
90   }
91
92   public void run()
93   {
94     if (url == null)
95     {
96       return;
97     }
98     boolean prompt = false;
99     try
100     {
101       // First - check to see if wee have an old questionnaire/response id pair.
102       String lastq = jalview.bin.Cache.getProperty("QUESTIONNAIRE");
103       if (lastq == null)
104       {
105         prompt = checkresponse(new URL(url
106                 + (url.indexOf('?') > -1 ? "&" : "?") + "checkresponse=1"));
107       }
108       else
109       {
110         String qurl = url + (url.indexOf('?') > -1 ? "&" : "?")
111                 + "checkresponse=1";
112         // query the server with the old qid/id pair
113         String qqid = lastq.indexOf(':') > -1
114                 ? lastq.substring(0, lastq.indexOf(':'))
115                 : null;
116         if (qqid != null && qqid != "null" && qqid.length() > 0)
117         {
118           qurl += "&qid=" + qqid;
119           qid = qqid;
120           String qrid = lastq.substring(lastq.indexOf(':') + 1); // retrieve
121           // old rid
122           if (qrid != null && !qrid.equals("null"))
123           {
124             rid = qrid;
125             qurl += "&rid=" + qrid;
126           }
127         }
128         // see if we have already responsed to this questionnaire.
129         prompt = checkresponse(new URL(qurl));
130       }
131       if (qid != null && rid != null)
132       {
133         // Update our local property cache with latest qid and rid
134         jalview.bin.Cache.setProperty("QUESTIONNAIRE", qid + ":" + rid);
135       }
136       if (prompt)
137       {
138         String qurl = url + (url.indexOf('?') > -1 ? "&" : "?") + "qid="
139                 + qid + "&rid=" + rid;
140         jalview.bin.Cache.log
141                 .info("Prompting user for questionnaire at " + qurl);
142         int reply = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
143                 MessageManager.getString("label.jalview_new_questionnaire"),
144                 MessageManager.getString("label.jalview_user_survey"),
145                 JvOptionPane.YES_NO_OPTION, JvOptionPane.QUESTION_MESSAGE);
146
147         if (reply == JvOptionPane.YES_OPTION)
148         {
149           jalview.bin.Cache.log.debug("Opening " + qurl);
150           jalview.util.BrowserLauncher.openURL(qurl);
151         }
152       }
153     } catch (Exception e)
154     {
155       jalview.bin.Cache.log
156               .warn("When trying to access questionnaire URL " + url, e);
157     }
158   }
159
160 }