source: trunk/www/main.jsp @ 7605

Last change on this file since 7605 was 7605, checked in by Nicklas Nordborg, 4 years ago

References #2151: Pre-compile all JSP pages before releases

Getting rid of a lot of unchecked warnings. Most of them are solved by changed the API in several BASE core clases to use implict casting of return types instead of explicit (this moved the 'unchecked' warning to the API method from the caller). Example:

// Before
ItemContext cc = ...
Hardware hardware = (Hardware)cc.getObject("item");
// After
Hardware hardware = cc.getObject("item");

In most cases both the old and new version of the code will work, but if the returned object is using a "type" parameter it will not compile:

// This will not compile!
Set<AnnotatedItem> items = (Set<AnnotatedItem>)cc.getObject("AnnotatedItems");
// But this will!
Set<AnnotatedItem> items = cc.getObject("AnnotatedItems");

Note that existing compiled code will still work, but that some changes may be needed when compiling agains BASE 3.15. The issues should be easy to solve (eg. remove an explict cast).

Extensions that uses JSP files that works in BASE 3.14 may stop working in BASE 3.15 since the compilation of the JSP files happens on the BASE server as they are accessed.

Another issues is that there are still a lot of unchecked warnings related to the JSON library. This build on regular Map and List API:s but has not specified generic type parameters so there is no way to get rid of those warnings without fixing the JSON library source code. The latest released version is from 2012 so it is not likely that this should happen unless we do it ourselves (the warnings are really annoying so maybe we should!).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.6 KB
Line 
1<%-- $Id: main.jsp 7605 2019-02-26 10:10:15Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
5  Copyright (C) 2007 Nicklas Nordborg
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 3
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with BASE. If not, see <http://www.gnu.org/licenses/>.
22  ------------------------------------------------------------------
23
24  This is the front page of BASE. It displays a login form
25  and some of the relevant news items.
26
27  @param login The value to display in the login input field.
28  @param error An error message that should be displayed
29
30  @author Nicklas
31  @version 2.0
32--%>
33<%@ page pageEncoding="UTF-8" session="false"
34  import="net.sf.basedb.core.Application"
35  import="net.sf.basedb.core.SessionControl"
36  import="net.sf.basedb.core.DbControl"
37  import="net.sf.basedb.core.News"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultIterator"
40  import="net.sf.basedb.core.query.Orders"
41  import="net.sf.basedb.core.query.Hql"
42  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
43  import="net.sf.basedb.util.extensions.ActionIterator"
44  import="net.sf.basedb.clients.web.Base"
45  import="net.sf.basedb.clients.web.util.HTML"
46  import="net.sf.basedb.util.formatter.Formatter"
47  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
48  import="net.sf.basedb.clients.web.extensions.JspContext"
49  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
50  import="net.sf.basedb.clients.web.servlet.RssNewsFeed"
51  import="net.sf.basedb.clients.web.extensions.login.LoginFormAction"
52  import="net.sf.basedb.clients.web.extensions.login.FieldInfo"
53  import="net.sf.basedb.clients.web.extensions.login.PasswordLoginFormFactory"
54  import="net.sf.basedb.util.Values"
55  import="java.util.Date"
56  import="java.util.Map"
57  import="java.util.TreeMap"
58%>
59<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
60<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
61<%! 
62// If value is null, return "", else <prefix>+<value>+<suffix>
63String valueIfNotNull(String prefix, String value, String suffix)
64{
65  return value == null ? "" : prefix+value+suffix;
66}
67%>
68<%
69final String login = Values.getString(request.getParameter("login"), "");
70final String error = Values.getString(request.getParameter("error"), null);
71final boolean again = Values.getBoolean(request.getParameter("again"));
72final String requestedLoginForm = Values.getString(request.getParameter("loginForm"), null);
73final String root = request.getContextPath()+"/";
74
75final SessionControl sc = Base.getSessionControl(pageContext, true);
76final String ID = sc.getId();
77final Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
78final DbControl dc = sc.newDbControl();
79
80try
81{
82  String broadcastTitle = (String)application.getAttribute("broadcast.title");
83  String broadcastMessage = (String)application.getAttribute("broadcast.message");
84  boolean denyLogin = Boolean.TRUE.equals(application.getAttribute("broadcast.deny-login"));
85 
86  ItemResultIterator<News> news = null;
87  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
88  ExtensionsInvoker<LoginFormAction> invoker = ExtensionsControl.useExtensions(jspContext, "net.sf.basedb.clients.web.login-form");
89
90  LoginFormAction loginAction = null;
91  String selectedLoginForm = null;
92  Map<String, String> allForms = new TreeMap<String, String>();
93 
94  ActionIterator<LoginFormAction> it = invoker.iterate();
95  while (it.hasNext())
96  {
97    LoginFormAction action = it.next();
98    if (action != null)
99    {
100      String formId = action.getId();
101      if (formId == null) formId = it.getExtension().getId();
102      String displayName = action.getDisplayName();
103      if (displayName == null) displayName = it.getExtension().getAbout().getName();
104      allForms.put(formId, displayName);
105     
106      if (loginAction == null || formId.equals(requestedLoginForm))
107      {
108        loginAction = action;
109        selectedLoginForm = formId;
110      }
111    }
112  }
113  if (loginAction == null)
114  {
115    loginAction = PasswordLoginFormFactory.INSTANCE;
116    selectedLoginForm = loginAction.getId();
117  }
118
119  FieldInfo loginField = loginAction.getLoginField();
120  FieldInfo passwordField = loginAction.getPasswordField();
121  FieldInfo extraField = loginAction.getExtraField();
122  %>
123  <base:page type="default">
124  <base:head styles="login.css" scripts="~login.js">
125    <ext:scripts context="<%=jspContext%>" />
126    <ext:stylesheets context="<%=jspContext%>" />
127  </base:head>
128  <base:body style="padding-top: 5em;" data-login-form="<%=HTML.encodeTags(selectedLoginForm)%>" data-requested-form="<%=HTML.encodeTags(requestedLoginForm) %>">
129    <form name="login" action="login.jsp" method="post">
130    <input type="hidden" name="ID" value="<%=ID%>">
131    <input type="hidden" name="again" value="<%=again?1:0%>">
132    <input type="hidden" name="useAutoStartPage" value="1">
133    <input type="hidden" name="deviceToken" value="">
134   
135    <table style="margin: auto; max-width: 700px; display: none;" id="the-login-form">
136    <tr>
137    <td>
138      <%
139      if (allForms.size() > 1)
140      {
141        %>
142        <div style="text-align: right; margin-bottom: 0.25em;">
143          <b>Login with</b>
144          <select name="loginForm" id="loginForm" style="min-width: 10em;">
145          <%
146          for (Map.Entry<String, String> entry : allForms.entrySet())
147          {
148            String formId = entry.getKey();
149            %>
150            <option value="<%=formId%>" <%=formId.equals(selectedLoginForm) ? "selected" : ""%>><%=HTML.encodeTags(entry.getValue()) %>
151            <%
152          }
153          %>
154          </select>
155        </div>
156        <%
157      }
158      else if (selectedLoginForm != null)
159      {
160        %>
161        <input type="hidden" name="loginForm" value="<%=selectedLoginForm%>">
162        <%
163      }
164      if (loginAction.getHelp() != null)
165      {
166        %>
167        <div class="messagecontainer help" style="margin-bottom: 1em; font-style: italic;" id="login-help">
168        <%=loginAction.getHelp() %>
169        </div>
170        <%
171      }
172      if (error != null) 
173      {
174        %>
175        <div class="messagecontainer error" style="margin-top: 1em; margin-bottom: 1em;"><%=error%></div>
176        <%
177      }
178      %>
179      <table style="width: 100%; border-collapse: separate;">
180      <tr>
181        <td class="base-logo"><img src="images/baselogo.png" alt="BASE logo"></td>
182        <td style="width: 515px;">
183          <div id="loginform">
184          <table style="width: 100%;">
185            <tr <%=valueIfNotNull("class=\"", loginField.getClazz(), "\"")%> id="login-row">
186              <th class="bg-filled-100"><%=loginField.getPrompt() %></th>
187              <td colspan="2"><input class="text" name="login" id="login"
188                type="<%=loginField.hasHiddenCharacters() ? "password" : "text"%>"
189                value="<%=loginAction.rememberLastLogin() ? HTML.encodeTags(login) : ""%>" 
190                <%=denyLogin ? "disabled" : ""%>
191                <%=valueIfNotNull("style=\"", loginField.getStyle(), "\"") %>
192                <%=valueIfNotNull("title=\"", loginField.getTooltip(), "\"") %>
193                <%=valueIfNotNull("placeholder=\"", loginField.getPlaceHolder(), "\"") %>
194                <%=loginAction.rememberLastLogin() ? "" : "autocomplete=\"off\" data-use-last-login=\"0\""%>
195                maxlength="100" 
196                tabindex="1">
197              </td>
198            </tr>
199            <tr <%=valueIfNotNull("class=\"", passwordField.getClazz(), "\"")%> id="password-row">
200              <th class="bg-filled-100"><%=passwordField.getPrompt() %></th>
201              <td><input class="text" name="password" id="password"
202                type="<%=passwordField.hasHiddenCharacters() ? "password" : "text"%>"
203                <%=denyLogin ? "disabled" : ""%>
204                <%=valueIfNotNull("style=\"", passwordField.getStyle(), "\"") %>
205                <%=valueIfNotNull("title=\"", passwordField.getTooltip(), "\"") %>
206                <%=valueIfNotNull("placeholder=\"", passwordField.getPlaceHolder(), "\"") %>
207                maxlength="80"
208                tabindex="2">
209              </td>
210              <td <%=extraField != null?"rowspan=\"2\"" : "" %> style="vertical-align: bottom;">
211                  <base:buttongroup>
212                    <base:button 
213                      id="btnLogin"
214                      subclass="<%=denyLogin ? "disabled" : ""%>"
215                      image="login.png" title="Login" 
216                      tooltip="<%=HTML.encodeTags(broadcastTitle)%>" tabindex="4" 
217                    />
218                    <base:button 
219                      id="close" title="Cancel" tabindex="5"
220                      visible="<%=again %>"
221                    />
222                  </base:buttongroup>
223              </td>
224            </tr>
225            <%
226            if (extraField != null)
227            {
228              %>
229              <tr <%=valueIfNotNull("class=\"", extraField.getClazz(), "\"")%> id="extra-row">
230                <th class="bg-filled-100"><%=extraField.getPrompt() %></th>
231                <td><input class="text" name="extraField" id="extraField"
232                  type="<%=extraField.hasHiddenCharacters() ? "password" : "text"%>"
233                  <%=denyLogin ? "disabled" : ""%>
234                  <%=valueIfNotNull("style=\"", extraField.getStyle(), "\"") %>
235                  <%=valueIfNotNull("title=\"", extraField.getTooltip(), "\"") %>
236                  <%=valueIfNotNull("placeholder=\"", extraField.getPlaceHolder(), "\"") %>
237                  maxlength="80"
238                  tabindex="3">
239                </td>
240              </tr>
241              <%
242            }
243            %>
244            <tr>
245              <th class="bg-filled-100 subprompt"></th>
246              <td colspan="2">
247              <%
248              String forgotPassword = sc.getClientDefaultSetting("server.forgotten.password");
249              String getAccount = sc.getClientDefaultSetting("server.get.account");
250              if (forgotPassword != null)
251              {
252                %>
253                <base:icon id="forgotPassword" image="bullet.png" 
254                  tooltip="Click here if you have forgotten your password">Forgot your password?</base:icon>
255                <%
256              }
257              if (getAccount != null)
258              {
259                %>
260                <base:icon id="getAccount" image="bullet.png" 
261                  tooltip="Click here if you want to get an account on this server">Get an account!</base:icon>
262                <%
263              }
264              %>
265              </td>
266            </tr>
267            </table>
268          </div>
269        </td>
270      </tr>
271      </table>
272      <%
273      if (denyLogin)
274      {
275        %>
276        <div class="messagecontainer help" id="denyLogin">
277          <b><%=HTML.encodeTags(broadcastTitle) %> (login disabled)</b><br>
278          <%=HTML.niceFormat(broadcastMessage)%>
279          <base:buttongroup style="margin-top: 1em;">
280            <base:button id="btnLoginAnyway" title="Login anyway" image="login.png" tooltip="At your own risk!" />
281          </base:buttongroup>
282        </div>
283        <%
284      }
285      if (!again)
286      {
287        String aboutServer = sc.getClientDefaultSetting("server.about");
288        if (aboutServer != null)
289        {
290          %>
291          <h3 style="margin-top: 1em;">About this server</h3>
292          <p>
293            <%=aboutServer%>
294          </p>
295          <base:icon id="aboutServer" image="bullet.png">More about this server</base:icon>
296          <%
297        }
298        %>
299        <h3 style="margin-top: 1em;">News and announcements
300        <%
301        if (RssNewsFeed.isEnabled()) 
302        {
303          %>
304          <a href="info/news.rss" 
305            title="Subscribe to news from this BASE server"
306            ><base:icon image="rss.png" style="float: right;" /></a>
307          <%
308        }
309        %>
310        </h3>
311        <div id="news" class="news">
312        <%
313        if (broadcastTitle != null)
314        {
315          %>
316          <div class="item note sticky">
317            <div class="headline">
318              <span class="date"><%=dateFormatter.format(new Date())%></span>
319              <%=HTML.encodeTags(broadcastTitle)%><%=denyLogin ? " (login disabled)" : "" %>
320            </div>
321            <div class="text"><%=HTML.niceFormat(broadcastMessage)%></div>
322          </div>
323          <% 
324        }
325       
326        ItemQuery<News> query = News.getQuery();
327        query.order(Orders.desc(Hql.property("sticky")));
328        query.order(Orders.desc(Hql.property("newsDate")));
329        query.order(Orders.desc(Hql.property("id")));
330        query.setCacheResult(true);
331        query.setReturnTotalCount(true);
332        news = query.iterate(dc);
333        int numListed = 0;
334        while (news.hasNext())
335        {
336          News n = news.next();
337          if (numListed >= 10 && !n.isSticky()) break;
338          %>
339          <div class="item <%=n.isSticky() ? "note sticky" : ""%>">
340            <div class="headline">
341              <span class="date"><%=dateFormatter.format(n.getNewsDate())%></span>
342              <%=HTML.encodeTags(n.getName())%>
343            </div>
344            <div class="text"><%=HTML.niceFormat(n.getDescription())%></div>
345          </div>
346          <%
347          numListed++;
348        }
349        if (numListed < news.getTotalCount())
350        {
351          %>
352          <base:icon image="bullet.png" /><a href="info/news.jsp" 
353            title="Show older news..."><%=news.getTotalCount()-numListed%> more</a>
354          <%
355        }
356        %>
357        </div>
358        <%
359      }
360      %>
361    </td>
362    </tr>
363    </table>
364
365    </form>
366  </base:body>
367  </base:page>
368  <%
369}
370finally
371{
372  if (dc != null) dc.close();
373}
374%>
375
Note: See TracBrowser for help on using the repository browser.