JAL-1620 version bump and release notes
[jalview.git] / src / jalview / gui / UserQuestionnaireCheck.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
3  * Copyright (C) 2014 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 jalview.util.MessageManager;
24
25 import java.io.*;
26 import java.net.*;
27
28 import javax.swing.*;
29
30 public class UserQuestionnaireCheck implements Runnable
31 {
32   /**
33    * Implements the client side machinery for detecting a new questionnaire,
34    * checking if the user has responded to an existing one, and prompting the
35    * user for responding to a questionnaire. This is intended to work with the
36    * perl CGI scripts checkresponder.pl and questionnaire.pl
37    */
38   String url = null;
39
40   UserQuestionnaireCheck(String url)
41   {
42     if (url.indexOf("questionnaire.pl") == -1)
43     {
44       jalview.bin.Cache.log
45               .error("'"
46                       + url
47                       + "' is an Invalid URL for the checkForQuestionnaire() method.\n"
48                       + "This argument is only for questionnaires derived from jalview's questionnaire.pl cgi interface.");
49     }
50     else
51     {
52       this.url = url;
53     }
54   }
55
56   String qid = null, rid = null;
57
58   private boolean checkresponse(URL qurl) throws Exception
59   {
60     jalview.bin.Cache.log.debug("Checking Response for : " + qurl);
61     boolean prompt = false;
62     // see if we have already responsed to this questionnaire or get a new
63     // qid/rid pair
64     BufferedReader br = new BufferedReader(new InputStreamReader(
65             qurl.openStream()));
66     String qresp;
67     while ((qresp = br.readLine()) != null)
68     {
69       if (qresp.indexOf("NOTYET:") == 0)
70       {
71         prompt = true; // not yet responded under that ID
72       }
73       else
74       {
75         if (qresp.indexOf("QUESTIONNAIRE:") == 0)
76         {
77           // QUESTIONNAIRE:qid:rid for the latest questionnaire.
78           int p = qresp.indexOf(':', 14);
79           if (p > -1)
80           {
81             rid = null;
82             qid = qresp.substring(14, p);
83             if (p < (qresp.length() - 1))
84             {
85               rid = qresp.substring(p + 1);
86               prompt = true; // this is a new qid/rid pair
87             }
88           }
89         }
90       }
91     }
92     return prompt;
93   }
94
95   public void run()
96   {
97     if (url == null)
98     {
99       return;
100     }
101     boolean prompt = false;
102     try
103     {
104       // First - check to see if wee have an old questionnaire/response id pair.
105       String lastq = jalview.bin.Cache.getProperty("QUESTIONNAIRE");
106       if (lastq == null)
107       {
108         prompt = checkresponse(new URL(url
109                 + (url.indexOf('?') > -1 ? "&" : "?") + "checkresponse=1"));
110       }
111       else
112       {
113         String qurl = url + (url.indexOf('?') > -1 ? "&" : "?")
114                 + "checkresponse=1";
115         // query the server with the old qid/id pair
116         String qqid = lastq.indexOf(':') > -1 ? lastq.substring(0,
117                 lastq.indexOf(':')) : null;
118         if (qqid != null && qqid != "null" && qqid.length() > 0)
119         {
120           qurl += "&qid=" + qqid;
121           qid = qqid;
122           String qrid = lastq.substring(lastq.indexOf(':') + 1); // retrieve
123           // old rid
124           if (qrid != null && !qrid.equals("null"))
125           {
126             rid = qrid;
127             qurl += "&rid=" + qrid;
128           }
129         }
130         // see if we have already responsed to this questionnaire.
131         prompt = checkresponse(new URL(qurl));
132       }
133       if (qid != null && rid != null)
134       {
135         // Update our local property cache with latest qid and rid
136         jalview.bin.Cache.setProperty("QUESTIONNAIRE", qid + ":" + rid);
137       }
138       if (prompt)
139       {
140         String qurl = url + (url.indexOf('?') > -1 ? "&" : "?") + "qid="
141                 + qid + "&rid=" + rid;
142         jalview.bin.Cache.log.info("Prompting user for questionnaire at "
143                 + qurl);
144         int reply = JOptionPane
145                 .showInternalConfirmDialog(Desktop.desktop, MessageManager
146                         .getString("label.jalview_new_questionnaire"),
147                         MessageManager
148                                 .getString("label.jalview_user_survey"),
149                         JOptionPane.YES_NO_OPTION,
150                         JOptionPane.QUESTION_MESSAGE);
151
152         if (reply == JOptionPane.YES_OPTION)
153         {
154           jalview.bin.Cache.log.debug("Opening " + qurl);
155           jalview.util.BrowserLauncher.openURL(qurl);
156         }
157       }
158     } catch (Exception e)
159     {
160       jalview.bin.Cache.log.warn("When trying to access questionnaire URL "
161               + url, e);
162     }
163   }
164
165 }