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

Last change on this file since 5903 was 5903, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

  • Switch to PNG for some more icons.
  • Changed background and border colors to a brighter gray
  • Re-designed buttons again using a blue-ish border to indicate hovering.
  • Finalized the "Broadcast message" and "Reset filters" popups.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 15.5 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 import="net.sf.basedb.core.PluginDefinition"%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Client"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.Permission"
32  import="net.sf.basedb.clients.web.Base"
33  import="net.sf.basedb.clients.web.util.HTML"
34  import="net.sf.basedb.util.Values"
35  import="net.sf.basedb.core.ItemNotFoundException"
36  import="net.sf.basedb.util.error.ThrowableUtil"
37  import="net.sf.basedb.util.extensions.ExtensionPoint"
38  import="net.sf.basedb.util.extensions.Extension"
39  import="net.sf.basedb.util.extensions.ActionFactory"
40  import="net.sf.basedb.util.extensions.RendererFactory"
41  import="net.sf.basedb.util.extensions.AboutBean"
42  import="net.sf.basedb.util.extensions.manager.ExtensionsFile"
43  import="net.sf.basedb.util.extensions.manager.ExtensionPointKey"
44  import="net.sf.basedb.util.extensions.manager.ExtensionKey"
45  import="net.sf.basedb.util.extensions.manager.PluginInfoKey"
46  import="net.sf.basedb.util.extensions.manager.FactoryParametersKey"
47  import="net.sf.basedb.util.extensions.manager.ProcessResults"
48  import="net.sf.basedb.util.extensions.manager.ProcessResults.FileResults"
49  import="net.sf.basedb.util.extensions.xml.PluginInfo"
50  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
51  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
52  import="net.sf.basedb.util.formatter.Formatter"
53  import="net.sf.basedb.core.plugin.About"
54  import="java.util.List"
55  import="java.util.Date"
56  import="java.util.Iterator"
57%>
58<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
59<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
60<%!
61String displayFactory(ExtensionsFile file, Object factory)
62{
63  if (factory == null)
64  {
65    return "<i>- none -</i>";
66  }
67  String text = factory.getClass().getName();
68  String parameters = file == null ? null : file.getMetadata(new FactoryParametersKey(factory));
69  if (parameters != null)
70  {
71    text += "<pre>" + HTML.encodeTags(parameters) + "</pre>";
72  }
73  return text;
74}
75%>
76<%
77final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
78final String ID = sc.getId();
79final float scale = Base.getScale(sc);
80String extensionId = request.getParameter("extensionId");
81String extensionPointId = request.getParameter("extensionPointId");
82String fileuri = request.getParameter("fileuri");
83
84DbControl dc = sc.newDbControl();
85try
86{
87  final ExtensionsControl ec = ExtensionsControl.get(dc);
88  final boolean writePermission = ec.hasPermission(Permission.WRITE);
89 
90  Extension<?> ext = null;
91  ExtensionPoint<?> ep = null;
92  ExtensionsFile file = null;
93  ExtensionsFile extFile = null;
94  ExtensionsFile epFile = null;
95
96  if (fileuri != null)
97  {
98    file = ec.getFile(fileuri);
99    if (file == null)
100    {
101      throw new ItemNotFoundException("ExtensionsFile[uri=" + fileuri + "]");
102    }
103  }
104 
105  if (extensionId != null)
106  {
107    ext = ec.getExtension(extensionId);
108    if (ext == null)
109    {
110      throw new ItemNotFoundException("Extension[id=" + extensionId + "]");
111    }
112    extensionPointId = ext.getExtends();
113    extFile = ec.getFileByObjectKey(new ExtensionKey(extensionId));
114  }
115 
116  if (extensionPointId != null)
117  {
118    ep = ec.getExtensionPoint(extensionPointId);
119    if (ep == null)
120    {
121      throw new ItemNotFoundException("ExtensionPoint[id=" + extensionPointId + "]");
122    }
123    epFile = ec.getFileByObjectKey(new ExtensionPointKey(extensionPointId));
124  }
125%>
126<base:page title="" type="popup">
127  <base:head scripts="newjoust.js,table.js" styles="newjoust.css,table.css,toolbar.css">
128  <script language="JavaScript">
129
130  function enableExtension(enable)
131  {
132    var iconName = enable ? 'Extension' : 'ExtensionDisabled';
133    window.parent.frames['tree'].setIcon('<%=extensionId%>', iconName);
134    var url = 'index.jsp?ID=<%=ID%>&cmd=EnableExtension';
135    url += '&extensionId=<%=extensionId%>';
136    url += '&enable='+enable;
137    location.href = url;
138  }
139
140  function enableExtensionPoint(enable)
141  {
142    var iconName = enable ? 'ExtensionPoint' : 'ExtensionPointDisabled';
143    window.parent.frames['tree'].setIcon('<%=extensionPointId%>', iconName);
144    var url = 'index.jsp?ID=<%=ID%>&cmd=EnableExtensionPoint';
145    url += '&extensionPointId=<%=extensionPointId%>';
146    url += '&enable='+enable;
147    location.href = url;
148  }
149 
150  function enableFile(enable)
151  {
152    window.parent.frames['tree'].setChildIcons('<%=HTML.javaScriptEncode(file != null ? file.getName() : "")%>', enable);
153    var url = 'index.jsp?ID=<%=ID%>&cmd=EnableFile';
154    url += '&fileuri=<%=HTML.urlEncode(fileuri)%>';
155    url += '&enable='+enable;
156    location.href = url;
157  }
158 
159  function showFile(fileuri)
160  {
161    window.parent.frames['tree'].selectFile(fileuri);
162  }
163
164  function editPlugin(pluginId)
165  {
166    Main.viewOrEditItem('<%=ID%>', 'PLUGINDEFINITION', pluginId, true);
167  }
168 
169  function manualScan()
170  {
171    Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ManualScan', 'ManualScan', 800, 480);
172  }
173 
174  function scanResults()
175  {
176    Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ScanResults', 'ScanResults', 600, 480);
177  }
178
179  function toggleStacktrace(evt, id)
180  {
181    Main.showHide('stacktrace.' + id);
182  }
183 
184  </script>
185  </base:head>
186    <base:body>
187
188    <tbl:toolbar>
189
190    <%
191    if (ext != null)
192    {
193      boolean isEnabled = ec.isEnabled(ext);
194      boolean hasRegistrationError = extFile != null && extFile.hasError();
195      boolean allow = writePermission && !hasRegistrationError;
196      %>
197      <tbl:button 
198        onclick="<%="enableExtension(" + (isEnabled ? "0" : "1") + ")"%>" 
199        title="<%=isEnabled ? "Disable" : "Enable" %>" 
200        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
201        tooltip="Disable this extension"
202        disabled="<%=!allow%>"
203      />
204      <tbl:button
205        image="help.png"
206        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.extension')"%>"
207        title="Help&hellip;"
208        tooltip="Get help about this page"
209      />
210      <%
211    }
212    else if (ep != null)
213    {
214      boolean isEnabled = ec.isEnabled(ep);
215      boolean hasRegistrationError = epFile != null && epFile.hasError();
216      boolean allow = writePermission && !hasRegistrationError;
217      %>
218      <tbl:button 
219        onclick="<%="enableExtensionPoint(" + (isEnabled ? "0" : "1") + ")"%>" 
220        title="<%=isEnabled ? "Disable" : "Enable" %>" 
221        image="<%=allow ? "joust/extensionpoint.png" : "joust/extensionpointdisabled.png" %>"
222        tooltip="Disable this extension point"
223        disabled="<%=!allow%>"
224      />
225      <tbl:button
226        image="help.png"
227        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.extensionspoint')"%>"
228        title="Help&hellip;"
229        tooltip="Get help about this page"
230      />
231      <%
232    }
233    else if (file != null)
234    {
235      boolean hasRegistrationError = file.hasError();
236      boolean allow = writePermission && !hasRegistrationError;
237      %>
238      <tbl:button 
239        onclick="enableFile(1)" 
240        title="Enable all" 
241        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
242        tooltip="Enable all extensions in this file"
243        disabled="<%=!allow%>"
244      />
245      <tbl:button 
246        onclick="enableFile(0)" 
247        title="Disable all" 
248        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
249        tooltip="Disable all extensions in this file"
250        disabled="<%=!allow%>"
251      />
252      <%
253    }
254    else
255    {
256      %>
257      <tbl:button
258        onclick="manualScan()"
259        title="Install/uninstall&hellip;"
260        image="<%=writePermission ? "new_wizard.gif" : "new_wizard_disabled.gif" %>"
261        tooltip="Install and uninstall extensions and plug-ins"
262        disabled="<%=!writePermission%>"
263      />
264      <tbl:button
265        image="help.png"
266        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.main')"%>"
267        title="Help&hellip;"
268        tooltip="Get help about this page"
269      />
270      <%
271    }
272    %>
273    </tbl:toolbar>
274
275    <div class="boxedbottom">
276   
277    <%
278    if (ext != null)
279    {
280      About about = ext.getAbout();
281      if (about == null) about = new AboutBean();
282      Throwable error = ec.getLastExtensionError(ext.getId());
283      if (error != null)
284      {
285        %>
286          <div class="error">
287            <base:icon image="error.png" 
288              onclick="<%="toggleStacktrace(event, '" + ext.getId() + "')"%>" 
289              style="float: left;"
290              tooltip="Error - click to show full stack trace"
291            /><%=error.getMessage() %>
292            <div id="stacktrace.<%=ext.getId()%>"
293              class="stacktrace"
294              style="display: none;"
295              ><%=ThrowableUtil.stackTraceToString(error)%></div>
296          </div>
297          <%
298      }
299      %>
300        <table class="form" cellspacing="0">
301        <tr>
302          <td class="prompt">ID</td>
303          <td><%=ext.getId()%></td>
304        </tr>
305        <tr>
306          <td class="prompt">Name</td>
307          <td><%=HTML.encodeTags(about.getName())%></td>
308        </tr>
309        <tr>
310          <td class="prompt">File</td>
311          <td>
312            <a href="javascript:showFile('<%=HTML.javaScriptEncode(extFile.getName())%>')"
313            ><%=extFile.getName()%></a> 
314            (<%=extFile.checkModified() ? "Modified" : "Up to date" %>;
315            <%=extFile.hasError() ? "Error" : "Ok" %>)
316          </td>
317        </tr>
318        <tr>
319          <td class="prompt">Version</td>
320          <td><%=HTML.encodeTags(about.getVersion())%></td>
321        </tr>
322        <tr>
323          <td class="prompt">Description</td>
324          <td><%=HTML.niceFormat(about.getDescription())%></td>
325        </tr>
326        <tr>
327          <td class="prompt">Copyright</td>
328          <td><%=HTML.encodeTags(about.getCopyright())%></td>
329        </tr>
330        <tr>
331          <td class="prompt">Contact</td>
332          <td><%=HTML.encodeTags(about.getContact())%></td>
333        </tr>
334        <tr>
335          <td class="prompt">Email</td>
336          <td><%=HTML.scanForLinks(about.getEmail(), HTML.LINK_EMAIL, "_new")%></td>
337        </tr>
338        <tr>
339          <td class="prompt">Url</td>
340          <td><%=HTML.scanForLinks(about.getUrl(), HTML.LINK_URL, "_new")%></td>
341        </tr>
342        </tr>
343          <tr>
344          <td class="prompt">Action factory</td>
345          <td><%=displayFactory(extFile, ext.getActionFactory())%></td>
346        </tr>
347        </tr>
348        <tr>
349          <td class="prompt">Renderer factory</td>
350          <td><%=displayFactory(extFile, ext.getRendererFactory())%></td>
351        </tr>
352        </table>
353      <%
354    }
355    %>
356    <%
357    if (ep != null)
358    {
359      if (ext != null)
360      {
361        %>
362        <h4>Extension point</h4>
363        <%
364      }
365      Throwable error = ec.getLastExtensionPointError(ep.getId());
366      if (error != null)
367      {
368        %>
369          <div class="error">
370            <base:icon image="error.png" 
371              onclick="<%="toggleStacktrace(event, '" + ep.getId() + "')"%>" 
372              style="float: left;"
373              tooltip="Error - click to show full stack trace"
374            /><%=error.getMessage() %>
375            <div id="stacktrace.<%=ep.getId()%>"
376              class="stacktrace"
377              style="display: none;"
378              ><%=ThrowableUtil.stackTraceToString(error)%></div>
379          </div>
380          <%
381      }
382      %>
383      <table class="form" cellspacing="0">
384      <tr>
385        <td class="prompt">ID</td>
386        <td><%=ep.getId()%></td>
387      </tr>
388      <tr>
389        <td class="prompt">Name</td>
390        <td><%=HTML.encodeTags(ep.getName())%></td>
391      </tr>
392      <tr>
393        <td class="prompt">File</td>
394        <td>
395          <%
396          if (epFile != null)
397          {
398            %>
399            <a href="javascript:showFile('<%=HTML.javaScriptEncode(epFile.getName())%>')"
400            ><%=epFile.getName()%></a> 
401            (<%=epFile.checkModified() ? "Modified" : "Up to date" %>;
402            <%=epFile.hasError() ? "Error" : "Ok" %>)
403            <%
404          }
405          %>
406        </td>
407      </tr>
408      <tr>
409        <td class="prompt">Description</td>
410        <td><%=HTML.niceFormat(ep.getDescription())%></td>
411      </tr>
412      <tr>
413        <td class="prompt">Action class</td>
414        <td><%=ep.getActionClass().getName()%></td>
415      </tr>
416      <tr>
417        <td class="prompt">Renderer factory</td>
418        <td><%=displayFactory(epFile, ep.getRendererFactory())%></td>
419      </tr>
420      <tr>
421        <td class="prompt">Error handler factory</td>
422        <td><%=displayFactory(epFile, ep.getErrorHandlerFactory() == null ? 
423            ec.getDefaultErrorHandlerFactory() : ep.getErrorHandlerFactory())%></td>
424      </tr>
425      </table>
426      <%
427    }
428    %>
429     
430    <%
431    if (file != null)
432    {
433      About about = file.getAbout();
434      if (about == null) about = new AboutBean();
435      %>
436      <table class="form" cellspacing="0">
437      <tr>
438        <td class="prompt">File</td>
439        <td><%=file.getName()%></td>
440      </tr>
441      <tr>
442        <td class="prompt">Type</td>
443        <td><%=file.isJar() ? "JAR file" : "XML file"%></td>
444      </tr>
445      <tr>
446        <td class="prompt">Up to date</td>
447        <td><%=file.checkModified() ? "No" : "Yes"%></td>
448      </tr>
449      <tr>
450        <td class="prompt">Errors</td>
451        <td>
452          <%
453          if (file.hasError())
454          {
455            ProcessResults results = ec.getLastScanResults();
456            FileResults fileResults = results.getResults(file);
457            List<String> messages = fileResults.getMessages();
458            Throwable validationError = file.getValidationError();
459            %>
460            <ul style="padding-left: 20px; margin: 0px; text-align: left;" class="error">
461            <%
462            if (validationError != null)
463            {
464              %>
465              <li><%=validationError.getClass().getSimpleName()%>: <%=HTML.niceFormat(validationError.getMessage())%>
466              <%
467            }
468            for (String msg : messages)
469            {
470              %>
471              <li><%=HTML.niceFormat(msg)%>
472              <%
473            }
474            %>
475            </ul>
476            <%
477          }
478          else
479          {
480            %>
481            No
482            <%
483          }
484          %>
485        </td>
486      </tr>
487      <tr>
488        <td class="prompt">Name</td>
489        <td><%=HTML.encodeTags(about.getName())%></td>
490      </tr>
491      <tr>
492        <td class="prompt">Version</td>
493        <td><%=HTML.encodeTags(about.getVersion())%></td>
494      </tr>
495      <tr>
496        <td class="prompt">Description</td>
497        <td><%=HTML.niceFormat(about.getDescription())%></td>
498      </tr>
499      <tr>
500        <td class="prompt">Copyright</td>
501        <td><%=HTML.encodeTags(about.getCopyright())%></td>
502      </tr>
503      <tr>
504        <td class="prompt">Contact</td>
505        <td><%=HTML.encodeTags(about.getContact())%></td>
506      </tr>
507      <tr>
508        <td class="prompt">Email</td>
509        <td><%=HTML.scanForLinks(about.getEmail(), HTML.LINK_EMAIL, "_new")%></td>
510      </tr>
511      <tr>
512        <td class="prompt">Url</td>
513        <td><%=HTML.scanForLinks(about.getUrl(), HTML.LINK_URL, "_new")%></td>
514      </tr>
515      </table>
516      <%
517    }
518    %>
519    <%
520    if (ext == null && ep == null && file == null)
521    {
522      ProcessResults results = ec.getLastScanResults();
523      Formatter dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
524      %>
525      <table class="form" cellspacing="0">
526      <tr>
527        <td class="prompt">Last installation</td>
528        <td><%=results.hasError() ? "Failed": "Successful" %></td>
529      </tr>
530      <tr>
531        <td class="prompt" style="text-align: right; font-weight: normal;">- ended</td>
532        <td><%=dateTimeFormatter.format(new Date(results.getEndTime())) %></td>
533      </tr>
534      <tr>
535        <td class="prompt" style="text-align: right; font-weight: normal;">- summary</td>
536        <td>
537        <%=HTML.niceFormat(results.getSummary())%></td>
538      </tr>
539      <tr>
540        <td  class="prompt" style="text-align: right; font-weight: normal;"><base:icon image="bullet.gif" /></td>
541        <td>
542          <a href="javascript:scanResults()" 
543            title="Display detailed information about the last scan"
544            >More details&hellip;</a>
545        </td>
546      </tr>
547      </table>
548      <%
549    }
550    %>
551    </div>
552    </base:body>
553  </base:page>
554  <%
555}
556finally
557{
558  if (dc != null) dc.close();
559}
560%>
Note: See TracBrowser for help on using the repository browser.