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

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

References #1592: Unified installation procedure for plug-ins, extensions and more...
References #1593: Extension system for the core API

Started to move the web client extensions into the core registry. So far the extensions are loaded at startup, but there is no support for adding more at runtime. The administrative interface is a bit of a mess right now, since a lot of the metadata that we used to get from the registration process is not yet available.

  • 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 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.util.extensions.manager.ExtensionsFile"
42  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
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 = null; //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.getFileByObjectId("extension:" + 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.getFileByObjectId("extension-point:" + 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 = false; //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            <%=false /*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              <%=true /*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 (false /*file.hasError()*/)
457            {
458              ScanResults results = ec.getLastScanResults();
459              FileResults fileResults = null; //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        ScanResults results = ec.getLastScanResults();
520        Formatter dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
521        %>
522        <table class="form" cellspacing="0">
523        <tr>
524          <td class="prompt">Last scan</td>
525          <td><%=results.hasError() ? "Failed": "Successful" %></td>
526        </tr>
527        <tr>
528          <td class="prompt" style="text-align: right; font-weight: normal;">- ended</td>
529          <td><%=dateTimeFormatter.format(new Date(results.getEndTime())) %></td>
530        </tr>
531        <tr>
532          <td class="prompt" style="text-align: right; font-weight: normal;">- summary</td>
533          <td>
534          <%=HTML.niceFormat(results.getSummary())%></td>
535        </tr>
536        <tr>
537          <td  class="prompt" style="text-align: right; font-weight: normal;"><base:icon image="bullet.gif" /></td>
538          <td>
539            <a href="javascript:scanResults()" 
540              title="Display detailed information about the last scan"
541              >More details&hellip;</a>
542          </td>
543        </tr>
544        </table>
545        <%
546      }
547      %>
548      </div>
549    </base:body>
550  </base:page>
551  <%
552}
553finally
554{
555  if (dc != null) dc.close();
556}
557%>
Note: See TracBrowser for help on using the repository browser.