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

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

References #1655: GUI improvements

Started with the redesign of list and view pages. I am using the biosource and sample pages for testing.
Changes affect more of the non-fixed pages since a lot of the contents is generated by taglibs. This means that the non-fixed pages doesn't look very good at the moment.

Table listings has only been fixed so that they display and can be used. Much more work is needed as part of #160.

I have also fixed the following pages:

  • The main menu
  • Login page + Home page
  • Item overview frameset
  • Plugins and extensions overview
  • 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', 750, 500);
172  }
173 
174  function scanResults()
175  {
176    Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ScanResults', 'ScanResults', 600, 400);
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    <div class="absolutefull" onmousemove="parent.DragDrop.drag(event)" onmouseup="parent.DragDrop.endDrag(event)">
189
190    <tbl:toolbar subclass="bottomborder">
191    <%
192    if (ext != null)
193    {
194      boolean isEnabled = ec.isEnabled(ext);
195      boolean hasRegistrationError = extFile != null && extFile.hasError();
196      boolean allow = writePermission && !hasRegistrationError;
197      %>
198      <tbl:button 
199        onclick="<%="enableExtension(" + (isEnabled ? "0" : "1") + ")"%>" 
200        title="<%=isEnabled ? "Disable" : "Enable" %>" 
201        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
202        tooltip="Disable this extension"
203        disabled="<%=!allow%>"
204      />
205      <tbl:button
206        image="help.png"
207        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.extension')"%>"
208        title="Help&hellip;"
209        tooltip="Get help about this page"
210      />
211      <%
212    }
213    else if (ep != null)
214    {
215      boolean isEnabled = ec.isEnabled(ep);
216      boolean hasRegistrationError = epFile != null && epFile.hasError();
217      boolean allow = writePermission && !hasRegistrationError;
218      %>
219      <tbl:button 
220        onclick="<%="enableExtensionPoint(" + (isEnabled ? "0" : "1") + ")"%>" 
221        title="<%=isEnabled ? "Disable" : "Enable" %>" 
222        image="<%=allow ? "joust/extensionpoint.png" : "joust/extensionpointdisabled.png" %>"
223        tooltip="Disable this extension point"
224        disabled="<%=!allow%>"
225      />
226      <tbl:button
227        image="help.png"
228        onclick="<%="Main.openHelp('" + ID +"', 'extensions.details.extensionspoint')"%>"
229        title="Help&hellip;"
230        tooltip="Get help about this page"
231      />
232      <%
233    }
234    else if (file != null)
235    {
236      boolean hasRegistrationError = file.hasError();
237      boolean allow = writePermission && !hasRegistrationError;
238      %>
239      <tbl:button 
240        onclick="enableFile(1)" 
241        title="Enable all" 
242        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
243        tooltip="Enable all extensions in this file"
244        disabled="<%=!allow%>"
245      />
246      <tbl:button 
247        onclick="enableFile(0)" 
248        title="Disable all" 
249        image="<%=allow ? "joust/extension.png" : "joust/extensiondisabled.png" %>"
250        tooltip="Disable all extensions in this file"
251        disabled="<%=!allow%>"
252      />
253      <%
254    }
255    else
256    {
257      %>
258      <tbl:button
259        onclick="manualScan()"
260        title="Install/uninstall&hellip;"
261        image="<%=writePermission ? "new_wizard.gif" : "new_wizard_disabled.gif" %>"
262        tooltip="Install and uninstall extensions and plug-ins"
263        disabled="<%=!writePermission%>"
264      />
265      <tbl:button
266        image="help.png"
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="bottomborder">
277      <table class="fullform outlined">
278      <tbody>
279      <%
280      if (ext != null)
281      {
282        About about = ext.getAbout();
283        if (about == null) about = new AboutBean();
284        Throwable error = ec.getLastExtensionError(ext.getId());
285        if (error != null)
286        {
287          %>
288          <tr>
289            <th></th>
290            <td>
291            <div class="messagecontainer error">
292              <base:icon image="error.png" 
293                onclick="<%="toggleStacktrace(event, '" + ext.getId() + "')"%>" 
294                style="float: left;"
295                tooltip="Error - click to show full stack trace"
296              /><%=error.getMessage() %>
297              <div id="stacktrace.<%=ext.getId()%>"
298                class="stacktrace"
299                style="display: none;"
300                ><%=ThrowableUtil.stackTraceToString(error)%></div>
301            </div>
302            </td>
303          </tr>
304          <%
305        }
306        %>
307        <tr>
308          <th>ID</th>
309          <td><%=ext.getId()%></td>
310        </tr>
311        <tr>
312          <th>Name</th>
313          <td><%=HTML.encodeTags(about.getName())%></td>
314        </tr>
315        <tr>
316          <th>File</th>
317          <td>
318            <a href="javascript:showFile('<%=HTML.javaScriptEncode(extFile.getName())%>')"
319            ><%=extFile.getName()%></a> 
320            (<%=extFile.checkModified() ? "Modified" : "Up to date" %>;
321            <%=extFile.hasError() ? "Error" : "Ok" %>)
322          </td>
323        </tr>
324        <tr>
325          <th>Version</th>
326          <td><%=HTML.encodeTags(about.getVersion())%></td>
327        </tr>
328        <tr class="big">
329          <th>Description</th>
330          <td><%=HTML.niceFormat(about.getDescription())%></td>
331        </tr>
332        <tr>
333          <th>Copyright</th>
334          <td><%=HTML.encodeTags(about.getCopyright())%></td>
335        </tr>
336        <tr>
337          <th>Contact</th>
338          <td><%=HTML.encodeTags(about.getContact())%></td>
339        </tr>
340        <tr>
341          <th>Email</th>
342          <td><%=HTML.scanForLinks(about.getEmail(), HTML.LINK_EMAIL, "_new")%></td>
343        </tr>
344        <tr>
345          <th>Url</th>
346          <td><%=HTML.scanForLinks(about.getUrl(), HTML.LINK_URL, "_new")%></td>
347        </tr>
348        <tr class="big">
349          <th>Action factory</th>
350          <td><%=displayFactory(extFile, ext.getActionFactory())%></td>
351        </tr>
352        <tr class="big">
353          <th>Renderer factory</th>
354          <td><%=displayFactory(extFile, ext.getRendererFactory())%></td>
355        </tr>
356        </tbody>
357        <%
358      }
359      if (ep != null)
360      {
361        if (ext != null)
362        {
363          %>
364          <tbody class="section">
365            <tr>
366              <th colspan="2">Extension point</th>
367            </tr>
368          </tbody>
369          <%
370        }
371        %>
372        <tbody>
373        <%
374        Throwable error = ec.getLastExtensionPointError(ep.getId());
375        if (error != null)
376        {
377          %>
378          <tr>
379            <th></th>
380            <td>
381            <div class="messagecontainer error">
382              <base:icon image="error.png" 
383                onclick="<%="toggleStacktrace(event, '" + ep.getId() + "')"%>" 
384                style="float: left;"
385                tooltip="Error - click to show full stack trace"
386              /><%=error.getMessage() %>
387              <div id="stacktrace.<%=ep.getId()%>"
388                class="stacktrace"
389                style="display: none;"
390                ><%=ThrowableUtil.stackTraceToString(error)%></div>
391            </div>
392            </td>
393          </tr>
394          <%
395        }
396        %>
397        <tr>
398          <th>ID</th>
399          <td><%=ep.getId()%></td>
400        </tr>
401        <tr>
402          <th>Name</th>
403          <td><%=HTML.encodeTags(ep.getName())%></td>
404        </tr>
405        <tr>
406          <th>File</th>
407          <td>
408            <%
409            if (epFile != null)
410            {
411              %>
412              <a href="javascript:showFile('<%=HTML.javaScriptEncode(epFile.getName())%>')"
413              ><%=epFile.getName()%></a> 
414              (<%=epFile.checkModified() ? "Modified" : "Up to date" %>;
415              <%=epFile.hasError() ? "Error" : "Ok" %>)
416              <%
417            }
418            %>
419          </td>
420        </tr>
421        <tr class="big">
422          <th>Description</th>
423          <td><%=HTML.niceFormat(ep.getDescription())%></td>
424        </tr>
425        <tr>
426          <th>Action class</th>
427          <td><%=ep.getActionClass().getName()%></td>
428        </tr>
429        <tr class="big">
430          <th>Renderer factory</th>
431          <td><%=displayFactory(epFile, ep.getRendererFactory())%></td>
432        </tr>
433        <tr class="big">
434          <th>Error handler factory</th>
435          <td><%=displayFactory(epFile, ep.getErrorHandlerFactory() == null ? 
436              ec.getDefaultErrorHandlerFactory() : ep.getErrorHandlerFactory())%></td>
437        </tr>
438        </tbody>
439        <%
440      }
441    if (file != null)
442    {
443      About about = file.getAbout();
444      if (about == null) about = new AboutBean();
445      %>
446      <tbody>
447      <tr>
448        <th>File</th>
449        <td><%=file.getName()%></td>
450      </tr>
451      <tr>
452        <th>Type</th>
453        <td><%=file.isJar() ? "JAR file" : "XML file"%></td>
454      </tr>
455      <tr>
456        <th>Up to date</th>
457        <td><%=file.checkModified() ? "No" : "Yes"%></td>
458      </tr>
459      <tr class="big">
460        <th>Errors</th>
461        <td>
462          <%
463          if (file.hasError())
464          {
465            ProcessResults results = ec.getLastScanResults();
466            FileResults fileResults = results.getResults(file);
467            List<String> messages = fileResults.getMessages();
468            Throwable validationError = file.getValidationError();
469            %>
470            <div class="messagecontainer error">
471            <ul style="padding-left: 20px; margin: 0px; text-align: left;">
472            <%
473            if (validationError != null)
474            {
475              %>
476              <li><%=validationError.getClass().getSimpleName()%>: <%=HTML.niceFormat(validationError.getMessage())%>
477              <%
478            }
479            for (String msg : messages)
480            {
481              %>
482              <li><%=HTML.niceFormat(msg)%>
483              <%
484            }
485            %>
486            </ul>
487            </div>
488            <%
489          }
490          else
491          {
492            %>
493            No
494            <%
495          }
496          %>
497        </td>
498      </tr>
499      <tr>
500        <th>Name</th>
501        <td><%=HTML.encodeTags(about.getName())%></td>
502      </tr>
503      <tr>
504        <th>Version</th>
505        <td><%=HTML.encodeTags(about.getVersion())%></td>
506      </tr>
507      <tr class="big">
508        <th>Description</th>
509        <td><%=HTML.niceFormat(about.getDescription())%></td>
510      </tr>
511      <tr>
512        <th>Copyright</th>
513        <td><%=HTML.encodeTags(about.getCopyright())%></td>
514      </tr>
515      <tr>
516        <th>Contact</th>
517        <td><%=HTML.encodeTags(about.getContact())%></td>
518      </tr>
519      <tr>
520        <th>Email</th>
521        <td><%=HTML.scanForLinks(about.getEmail(), HTML.LINK_EMAIL, "_new")%></td>
522      </tr>
523      <tr>
524        <th>Url</th>
525        <td><%=HTML.scanForLinks(about.getUrl(), HTML.LINK_URL, "_new")%></td>
526      </tr>
527      </tbody>
528      <%
529    }
530    %>
531    <%
532    if (ext == null && ep == null && file == null)
533    {
534      ProcessResults results = ec.getLastScanResults();
535      Formatter dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
536      %>
537      <tbody>
538      <tr>
539        <th>Last installation</th>
540        <td><%=results.hasError() ? "Failed": "Successful" %></td>
541      </tr>
542      <tr>
543        <th class="subprompt">- ended</td>
544        <td><%=dateTimeFormatter.format(new Date(results.getEndTime())) %></td>
545      </tr>
546      <tr class="big">
547        <th class="subprompt">- summary</th>
548        <td>
549        <%=HTML.niceFormat(results.getSummary())%></td>
550      </tr>
551      <tr>
552        <th class="subprompt"></th>
553        <td>
554          <table><tr><td>
555          <base:button image="bullet.gif" 
556            onclick="scanResults()" 
557            title="More details&hellip;"
558            tooltip="Display detailed information about the last scan"
559          />
560          </td></tr></table>
561        </td>
562      </tr>
563      </tbody>
564      <%
565    }
566    %>
567    </div>
568    </div>
569    </base:body>
570  </base:page>
571  <%
572}
573finally
574{
575  if (dc != null) dc.close();
576}
577%>
Note: See TracBrowser for help on using the repository browser.