source: trunk/www/admin/extensions/details.jsp @ 5487

Last change on this file since 5487 was 5487, checked in by Nicklas Nordborg, 12 years ago

Fixes #1549: Allow some exceptions from extensions to pass through to the gui

Documented in docbook. Show the configured error handler in the gui. Set a default error handler for the registry.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 15.9 KB
Line 
1<%-- $Id:details.jsp 4187 2008-03-20 11:15:25Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Nicklas Nordborg
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Nicklas
23  @version 2.0
24--%>
25<%@ page pageEncoding="UTF-8" session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Client"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.Permission"
31  import="net.sf.basedb.clients.web.Base"
32  import="net.sf.basedb.clients.web.util.HTML"
33  import="net.sf.basedb.util.Values"
34  import="net.sf.basedb.core.ItemNotFoundException"
35  import="net.sf.basedb.util.error.ThrowableUtil"
36  import="net.sf.basedb.util.extensions.ExtensionPoint"
37  import="net.sf.basedb.util.extensions.Extension"
38  import="net.sf.basedb.util.extensions.ActionFactory"
39  import="net.sf.basedb.util.extensions.RendererFactory"
40  import="net.sf.basedb.util.extensions.AboutBean"
41  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
42  import="net.sf.basedb.clients.web.extensions.ExtensionsFile"
43  import="net.sf.basedb.clients.web.extensions.ScanResults"
44  import="net.sf.basedb.clients.web.extensions.ScanResults.FileResults"
45  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
46  import="net.sf.basedb.util.formatter.Formatter"
47  import="net.sf.basedb.core.plugin.About"
48  import="java.util.List"
49  import="java.util.Date"
50  import="java.util.Iterator"
51%>
52<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
53<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
54<%!
55String displayFactory(ExtensionsFile file, Object factory)
56{
57  if (factory == null)
58  {
59    return "<i>- none -</i>";
60  }
61  String text = factory.getClass().getName();
62  String parameters = file == null ? null : file.getFactoryParameters(factory);
63  if (parameters != null)
64  {
65    text += "<pre>" + HTML.encodeTags(parameters) + "</pre>";
66  }
67  return text;
68}
69%>
70<%
71final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
72final String ID = sc.getId();
73final float scale = Base.getScale(sc);
74String extensionId = request.getParameter("extensionId");
75String extensionPointId = request.getParameter("extensionPointId");
76String filename = request.getParameter("filename");
77
78DbControl dc = sc.newDbControl();
79try
80{
81  final ExtensionsControl ec = ExtensionsControl.get(dc);
82  final boolean writePermission = ec.hasPermission(Permission.WRITE);
83 
84  Extension<?> ext = null;
85  ExtensionPoint<?> ep = null;
86  ExtensionsFile file = null;
87  ExtensionsFile extFile = null;
88  ExtensionsFile epFile = null;
89
90  if (filename != null)
91  {
92    file = ec.getFile(filename);
93    if (file == null)
94    {
95      throw new ItemNotFoundException("ExtensionsFile[name=" + filename + "]");
96    }
97  }
98 
99  if (extensionId != null)
100  {
101    ext = ec.getExtension(extensionId);
102    if (ext == null)
103    {
104      throw new ItemNotFoundException("Extension[id=" + extensionId + "]");
105    }
106    extensionPointId = ext.getExtends();
107    extFile = ec.getFileByExtensionId(extensionId);
108  }
109 
110  if (extensionPointId != null)
111  {
112    ep = ec.getExtensionPoint(extensionPointId);
113    if (ep == null)
114    {
115      throw new ItemNotFoundException("ExtensionPoint[id=" + extensionPointId + "]");
116    }
117    epFile = ec.getFileByExtensionId(extensionPointId);
118  }
119%>
120<base:page title="" type="popup">
121  <base:head scripts="newjoust.js,table.js" styles="newjoust.css,table.css,toolbar.css">
122  <script language="JavaScript">
123
124  function enableExtension(enable)
125  {
126    var iconName = enable ? 'Extension' : 'ExtensionDisabled';
127    window.parent.frames['tree'].setIcon('<%=extensionId%>', iconName);
128    var url = 'index.jsp?ID=<%=ID%>&cmd=EnableExtension';
129    url += '&extensionId=<%=extensionId%>';
130    url += '&enable='+enable;
131    location.href = url;
132  }
133
134  function enableExtensionPoint(enable)
135  {
136    var iconName = enable ? 'ExtensionPoint' : 'ExtensionPointDisabled';
137    window.parent.frames['tree'].setIcon('<%=extensionPointId%>', iconName);
138    var url = 'index.jsp?ID=<%=ID%>&cmd=EnableExtensionPoint';
139    url += '&extensionPointId=<%=extensionPointId%>';
140    url += '&enable='+enable;
141    location.href = url;
142  }
143 
144  function enableFile(enable)
145  {
146    window.parent.frames['tree'].setChildIcons('<%=HTML.javaScriptEncode(filename)%>', enable);
147    var url = 'index.jsp?ID=<%=ID%>&cmd=EnableFile';
148    url += '&filename=<%=HTML.urlEncode(filename)%>';
149    url += '&enable='+enable;
150    location.href = url;
151  }
152 
153  function showFile(filename)
154  {
155    window.parent.frames['tree'].selectFile(filename);
156  }
157
158  function editSettings()
159  {
160    Main.openPopup('settings.jsp?ID=<%=ID%>', 'EditExtensionSettings', 500, 400);
161  }
162 
163  function manualScan()
164  {
165    Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ManualScan', 'ManualScan', 600, 480);
166  }
167 
168  function scanResults()
169  {
170    Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ScanResults', 'ScanResults', 600, 480);
171  }
172
173  function toggleStacktrace(evt, id)
174  {
175    Main.showHide('stacktrace.' + id);
176  }
177 
178  </script>
179  </base:head>
180    <base:body>
181
182    <tbl:toolbar>
183
184    <%
185    if (ext != null)
186    {
187      boolean isEnabled = ec.isEnabled(ext);
188      boolean hasRegistrationError = extFile != null && extFile.hasError();
189      boolean allow = writePermission && !hasRegistrationError;
190      %>
191      <tbl:button 
192        onclick="<%="enableExtension(" + (isEnabled ? "0" : "1") + ")"%>" 
193        title="<%=isEnabled ? "Disable" : "Enable" %>" 
194        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
195        tooltip="Disable this extension"
196        disabled="<%=!allow%>"
197      />
198      <tbl:button
199        image="help.gif"
200        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.extension')"%>"
201        title="Help&hellip;"
202        tooltip="Get help about this page"
203      />
204      <%
205    }
206    else if (ep != null)
207    {
208      boolean isEnabled = ec.isEnabled(ep);
209      boolean hasRegistrationError = epFile != null && epFile.hasError();
210      boolean allow = writePermission && !hasRegistrationError;
211      %>
212      <tbl:button 
213        onclick="<%="enableExtensionPoint(" + (isEnabled ? "0" : "1") + ")"%>" 
214        title="<%=isEnabled ? "Disable" : "Enable" %>" 
215        image="<%=allow ? "joust/extensionpoint.png" : "joust/extensionpointdisabled.png" %>"
216        tooltip="Disable this extension point"
217        disabled="<%=!allow%>"
218      />
219      <tbl:button
220        image="help.gif"
221        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.extensionspoint')"%>"
222        title="Help&hellip;"
223        tooltip="Get help about this page"
224      />
225      <%
226    }
227    else if (file != null)
228    {
229      boolean hasRegistrationError = file.hasError();
230      boolean allow = writePermission && !hasRegistrationError;
231      %>
232      <tbl:button 
233        onclick="enableFile(1)" 
234        title="Enable all" 
235        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
236        tooltip="Enable all extensions in this file"
237        disabled="<%=!allow%>"
238      />
239      <tbl:button 
240        onclick="enableFile(0)" 
241        title="Disable all" 
242        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
243        tooltip="Disable all extensions in this file"
244        disabled="<%=!allow%>"
245      />
246      <%
247    }
248    else
249    {
250      %>
251      <tbl:button 
252        onclick="editSettings()" 
253        title="Settings&hellip;" 
254        image="<%=writePermission ? "configure.png" : "configure_disabled.png" %>"
255        tooltip="Change settings for the extension system"
256        disabled="<%=!writePermission%>"
257      />
258      <tbl:button
259        onclick="manualScan()"
260        title="Manual scan&hellip;"
261        image="<%=writePermission ? "refresh.gif" : "refresh_disabled.gif" %>"
262        tooltip="Start a manual scan for new/updated/deleted extensions"
263        disabled="<%=!writePermission%>"
264      />
265      <tbl:button
266        image="help.gif"
267        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.main')"%>"
268        title="Help&hellip;"
269        tooltip="Get help about this page"
270      />
271      <%
272    }
273    %>
274    </tbl:toolbar>
275
276    <div class="boxedbottom">
277   
278    <%
279    if (ext != null)
280    {
281      About about = ext.getAbout();
282      if (about == null) about = new AboutBean();
283      Throwable error = ec.getLastExtensionError(ext.getId());
284      if (error != null)
285      {
286        %>
287          <div class="error">
288            <base:icon image="error.gif" 
289              onclick="<%="toggleStacktrace(event, '" + ext.getId() + "')"%>" 
290              tooltip="Toggle display of detailed stacktrace"
291              style="float: left;"
292              tooltip="Error - click to show full stack trace"
293            /><%=error.getMessage() %>
294            <div id="stacktrace.<%=ext.getId()%>"
295              class="stacktrace"
296              style="display: none;"
297              ><%=ThrowableUtil.stackTraceToString(error)%></div>
298          </div>
299          <%
300      }
301      %>
302        <table class="form" cellspacing="0">
303        <tr>
304          <td class="prompt">ID</td>
305          <td><%=ext.getId()%></td>
306        </tr>
307        <tr>
308          <td class="prompt">Name</td>
309          <td><%=HTML.encodeTags(about.getName())%></td>
310        </tr>
311        <tr>
312          <td class="prompt">File</td>
313          <td>
314            <a href="javascript:showFile('<%=HTML.javaScriptEncode(extFile.getName())%>')"
315            ><%=extFile.getName()%></a> 
316            (<%=extFile.isModified() ? "Modified" : "Up to date" %>;
317            <%=extFile.hasError() ? "Error" : "Ok" %>)
318          </td>
319        </tr>
320        <tr>
321          <td class="prompt">Version</td>
322          <td><%=HTML.encodeTags(about.getVersion())%></td>
323        </tr>
324        <tr>
325          <td class="prompt">Description</td>
326          <td><%=HTML.niceFormat(about.getDescription())%></td>
327        </tr>
328        <tr>
329          <td class="prompt">Copyright</td>
330          <td><%=HTML.encodeTags(about.getCopyright())%></td>
331        </tr>
332        <tr>
333          <td class="prompt">Contact</td>
334          <td><%=HTML.encodeTags(about.getContact())%></td>
335        </tr>
336        <tr>
337          <td class="prompt">Email</td>
338          <td><%=HTML.scanForLinks(about.getEmail(), HTML.LINK_EMAIL, "_new")%></td>
339        </tr>
340        <tr>
341          <td class="prompt">Url</td>
342          <td><%=HTML.scanForLinks(about.getUrl(), HTML.LINK_URL, "_new")%></td>
343        </tr>
344        </tr>
345          <tr>
346          <td class="prompt">Action factory</td>
347          <td><%=displayFactory(extFile, ext.getActionFactory())%></td>
348        </tr>
349        </tr>
350          <tr>
351          <td class="prompt">Renderer factory</td>
352          <td><%=displayFactory(extFile, ext.getRendererFactory())%></td>
353        </tr>
354        </table>
355      <%
356    }
357    %>
358    <%
359    if (ep != null)
360    {
361      if (ext != null)
362      {
363        %>
364        <h4>Extension point</h4>
365        <%
366      }
367      Throwable error = ec.getLastExtensionPointError(ep.getId());
368      if (error != null)
369      {
370        %>
371          <div class="error">
372            <base:icon image="error.gif" 
373              onclick="<%="toggleStacktrace(event, '" + ep.getId() + "')"%>" 
374              tooltip="Toggle display of detailed stacktrace"
375              style="float: left;"
376              tooltip="Error - click to show full stack trace"
377            /><%=error.getMessage() %>
378            <div id="stacktrace.<%=ep.getId()%>"
379              class="stacktrace"
380              style="display: none;"
381              ><%=ThrowableUtil.stackTraceToString(error)%></div>
382          </div>
383          <%
384      }
385      %>
386        <table class="form" cellspacing="0">
387        <tr>
388          <td class="prompt">ID</td>
389          <td><%=ep.getId()%></td>
390        </tr>
391        <tr>
392          <td class="prompt">Name</td>
393          <td><%=HTML.encodeTags(ep.getName())%></td>
394        </tr>
395        <tr>
396          <td class="prompt">File</td>
397          <td>
398            <%
399            if (epFile != null)
400            {
401              %>
402              <a href="javascript:showFile('<%=HTML.javaScriptEncode(epFile.getName())%>')"
403              ><%=epFile.getName()%></a> 
404              (<%=epFile.isModified() ? "Modified" : "Up to date" %>;
405              <%=epFile.hasError() ? "Error" : "Ok" %>)
406              <%
407            }
408            %>
409          </td>
410        </tr>
411        <tr>
412          <td class="prompt">Description</td>
413          <td><%=HTML.niceFormat(ep.getDescription())%></td>
414        </tr>
415        <tr>
416          <td class="prompt">Action class</td>
417          <td><%=ep.getActionClass().getName()%></td>
418        </tr>
419        <tr>
420          <td class="prompt">Renderer factory</td>
421          <td><%=displayFactory(epFile, ep.getRendererFactory())%></td>
422        </tr>
423        <tr>
424          <td class="prompt">Error handler factory</td>
425          <td><%=displayFactory(epFile, ep.getErrorHandlerFactory() == null ? 
426              ec.getDefaultErrorHandlerFactory() : ep.getErrorHandlerFactory())%></td>
427        </tr>
428        </table>
429        <%
430      }
431      %>
432     
433      <%
434      if (file != null)
435      {
436        About about = file.getAbout();
437        if (about == null) about = new AboutBean();
438        %>
439        <table class="form" cellspacing="0">
440        <tr>
441          <td class="prompt">File</td>
442          <td><%=file.getName()%></td>
443        </tr>
444        <tr>
445          <td class="prompt">Type</td>
446          <td><%=file.isJar() ? "JAR file" : "XML file"%></td>
447        </tr>
448        <tr>
449          <td class="prompt">Up to date</td>
450          <td><%=file.isModified() ? "No" : "Yes"%></td>
451        </tr>
452        <tr>
453          <td class="prompt">Errors</td>
454          <td>
455            <%
456            if (file.hasError())
457            {
458              ScanResults results = ec.getLastScanResults();
459              FileResults fileResults = results.getResults(file);
460              List<String> messages = fileResults.getMessages();
461              Throwable validationError = file.getValidationError();
462              for (String msg : messages)
463              {
464                %>
465                <li><%=HTML.niceFormat(msg)%>
466                <%
467              }
468              if (validationError != null)
469              {
470                %>
471                <li><%=HTML.niceFormat(validationError.getMessage())%>
472                <%
473              }
474            }
475            else
476            {
477              %>
478              No
479              <%
480            }
481            %>
482          </td>
483        </tr>
484        <tr>
485          <td class="prompt">Name</td>
486          <td><%=HTML.encodeTags(about.getName())%></td>
487        </tr>
488        <tr>
489          <td class="prompt">Version</td>
490          <td><%=HTML.encodeTags(about.getVersion())%></td>
491        </tr>
492        <tr>
493          <td class="prompt">Description</td>
494          <td><%=HTML.niceFormat(about.getDescription())%></td>
495        </tr>
496        <tr>
497          <td class="prompt">Copyright</td>
498          <td><%=HTML.encodeTags(about.getCopyright())%></td>
499        </tr>
500        <tr>
501          <td class="prompt">Contact</td>
502          <td><%=HTML.encodeTags(about.getContact())%></td>
503        </tr>
504        <tr>
505          <td class="prompt">Email</td>
506          <td><%=HTML.scanForLinks(about.getEmail(), HTML.LINK_EMAIL, "_new")%></td>
507        </tr>
508        <tr>
509          <td class="prompt">Url</td>
510          <td><%=HTML.scanForLinks(about.getUrl(), HTML.LINK_URL, "_new")%></td>
511        </tr>
512        </table>
513        <%
514      }
515      %>
516      <%
517      if (ext == null && ep == null && file == null)
518      {
519        int autoInstall = ec.getAutoInstall();
520        ScanResults results = ec.getLastScanResults();
521        Formatter dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
522        %>
523        <table class="form" cellspacing="0">
524        <%
525        if (autoInstall > 0)
526        {
527          %>
528          <tr>
529            <td class="prompt">Automatic scan</td>
530            <td>
531              Every <%=autoInstall%> seconds
532            </td>
533          </tr>
534          <tr>
535            <td class="prompt" style="text-align: right; font-weight: normal;">- next scan</td>
536            <td><%=dateTimeFormatter.format(new Date(ec.getNextAutoScanTime())) %></td>
537          </tr>
538          <%
539        }
540        else
541        {
542          %>
543          <tr>
544            <td class="prompt">Automatic scan</td>
545            <td>Disabled</td>
546          </tr>
547          <%
548        }
549        %>
550        <tr>
551          <td class="prompt">Last scan</td>
552          <td><%=results.hasError() ? "Failed": "Successful" %></td>
553        </tr>
554        <tr>
555          <td class="prompt" style="text-align: right; font-weight: normal;">- ended</td>
556          <td><%=dateTimeFormatter.format(new Date(results.getEndTime())) %></td>
557        </tr>
558        <tr>
559          <td class="prompt" style="text-align: right; font-weight: normal;">- summary</td>
560          <td>
561          <%=HTML.niceFormat(results.getSummary())%></td>
562        </tr>
563        <tr>
564          <td  class="prompt" style="text-align: right; font-weight: normal;"><base:icon image="bullet.gif" /></td>
565          <td>
566            <a href="javascript:scanResults()" 
567              title="Display detailed information about the last scan"
568              >More details&hellip;</a>
569          </td>
570        </tr>
571        </table>
572        <%
573      }
574      %>
575      </div>
576    </base:body>
577  </base:page>
578  <%
579}
580finally
581{
582  if (dc != null) dc.close();
583}
584%>
Note: See TracBrowser for help on using the repository browser.