source: trunk/www/common/overview/info.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 Date Id
File size: 19.5 KB
Line 
1<%-- $Id: info.jsp 7605 2019-02-26 10:10:15Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2009 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<%@ page pageEncoding="UTF-8" session="false"
23  import="net.sf.basedb.core.SessionControl"
24  import="net.sf.basedb.core.DbControl"
25  import="net.sf.basedb.core.Project"
26  import="net.sf.basedb.core.Item"
27  import="net.sf.basedb.core.BasicItem"
28  import="net.sf.basedb.core.Nameable"
29  import="net.sf.basedb.core.Annotatable"
30  import="net.sf.basedb.core.AnnotationSet"
31  import="net.sf.basedb.core.AnnotationType"
32  import="net.sf.basedb.core.Annotation"
33  import="net.sf.basedb.core.ItemSubtype"
34  import="net.sf.basedb.core.Subtypable"
35  import="net.sf.basedb.core.AnyToAny"
36  import="net.sf.basedb.core.Protocol"
37  import="net.sf.basedb.core.Unit"
38  import="net.sf.basedb.core.FileStoreEnabled"
39  import="net.sf.basedb.core.FileSetMember"
40  import="net.sf.basedb.core.File"
41  import="net.sf.basedb.core.DataFileType"
42  import="net.sf.basedb.core.ItemContext"
43  import="net.sf.basedb.core.Permission"
44  import="net.sf.basedb.core.PermissionDeniedException"
45  import="net.sf.basedb.core.ItemNotFoundException"
46  import="net.sf.basedb.core.snapshot.SnapshotManager"
47  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
48  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
49  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
50  import="net.sf.basedb.core.snapshot.AnnotationFilter"
51  import="net.sf.basedb.clients.web.Base"
52  import="net.sf.basedb.clients.web.util.HTML"
53  import="net.sf.basedb.clients.web.extensions.section.SectionAction"
54  import="net.sf.basedb.clients.web.extensions.JspContext"
55  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
56  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
57  import="net.sf.basedb.util.Values"
58  import="net.sf.basedb.util.NestedIterator"
59  import="net.sf.basedb.util.units.UnitConverter"
60  import="net.sf.basedb.util.formatter.Formatter"
61  import="net.sf.basedb.util.overview.GenericOverview"
62  import="net.sf.basedb.util.overview.OverviewUtil"
63  import="net.sf.basedb.util.overview.Node"
64  import="net.sf.basedb.util.overview.ValidationOptions"
65  import="net.sf.basedb.util.overview.Validator"
66  import="net.sf.basedb.util.overview.Severity"
67  import="net.sf.basedb.util.overview.Failure"
68  import="net.sf.basedb.util.overview.Fix"
69  import="net.sf.basedb.util.overview.extensions.ValidationRuleAction"
70  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
71  import="java.util.ArrayList"
72  import="java.util.Date"
73  import="java.util.List"
74  import="java.util.LinkedList"
75  import="java.util.Iterator"
76  import="java.util.Collection"
77  import="java.util.Collections"
78%>
79<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
80<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
81<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
82<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
83<%!
84private String getPath(DbControl dc, String ID, Node node)
85{
86  Node parent = node.getParent();
87  if (parent == null) return "";
88  String path = getPath(dc, ID, parent);
89  if (parent.getNodeType() == Node.Type.FOLDER)
90  {
91    //path += "/" + HTML.encodeTags(parent.getTitle());
92  }
93  else
94  {
95    BasicItem item = parent.getItem();
96    if (path.length() > 0)
97    {
98      path += " <b>›</b> ";
99    }
100    path += Base.getLink(ID, parent.getTitle(), item.getType(), item.getId(), item.hasPermission(Permission.WRITE));
101   
102    if (item instanceof Subtypable)
103    {
104      ItemSubtype subtype = ((Subtypable)parent.getItem(dc)).getItemSubtype();
105      if (subtype != null)
106      {
107        path += " <span class=\"itemsubtype\">(" + Base.getLinkedName(ID, subtype, false, true) + ")</span>";
108      }
109    }
110  }
111  return path;
112}
113%>
114<%
115final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
116final String ID = sc.getId();
117final float scale = Base.getScale(sc);
118final DbControl dc = sc.newDbControl();
119try
120{
121  final GenericOverview overview = OverviewUtil.getCurrentOverview(sc);
122  final ItemContext cc = sc.getCurrentContext(overview.getRootItem().getType());
123  final SnapshotManager snapshotManager = new SnapshotManager();
124  final AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter();
125  final AnnotationFilter annotationFilter = new AnnotationFilter();
126  ValidationOptions options = overview.getValidationOptions();
127  String nodeId = request.getParameter("nodeId");
128  Boolean showFailures = Values.getBoolean(request.getParameter("show_failures"), false);
129  Node node = overview.getNode(nodeId);
130  if (node == null) node = overview.getRootNode();
131
132  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, null, node);
133  ExtensionsInvoker<SectionAction> invoker = ExtensionsControl.useExtensions(
134      jspContext, "net.sf.basedb.clients.web.overview.info-details");
135 
136  BasicItem item = node.getItem(dc);
137  List<Failure> failures = overview.getFailures();
138  if (failures == null) failures = new LinkedList<Failure>();
139 
140  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
141
142  %>
143  <base:page title="" type="iframe">
144  <base:head styles="table.css" scripts="dragdrop.js,~info.js">
145    <ext:scripts context="<%=jspContext%>" />
146    <ext:stylesheets context="<%=jspContext%>" />
147  <style>
148  .itemsubtype .link
149  {
150    color: #777777;
151  }
152  .edit-annotation
153  {
154    float: right;
155  }
156  </style>
157  </base:head>
158
159    <base:body>
160      <div class="absolutefull auto-init" data-auto-init="drag-support">
161      <div>
162      <table class="fullform bottomborder outlined">
163      <tr>
164        <th>Path</th>
165        <td><%=getPath(dc, ID, node)%></td>
166      </tr>
167      <%
168      if (item instanceof FileSetMember)
169      {
170        FileSetMember member = null;
171        boolean notFound = false;
172        try
173        { 
174          member = FileSetMember.getById(dc, item.getId());
175        }
176        catch (ItemNotFoundException ex)
177        {
178          notFound = true;
179        }
180        File file = null;
181        DataFileType dft = null;
182        boolean deniedFile = false;
183        boolean deniedFileType = false;
184        if (member != null)
185        {
186          try
187          {
188            file = member.getFile();
189          }
190          catch (PermissionDeniedException ex)
191          {
192            deniedFile = true;
193          }
194          try
195          {
196            dft = member.getDataFileType();
197          }
198          catch (PermissionDeniedException ex)
199          {
200            deniedFileType = true;
201          }
202        }
203        if (dft != null || file != null)
204        {
205          %>
206          <tr>
207            <th><%=dft == null ? "Data file" : HTML.encodeTags(dft.getName())%></th>
208            <td>
209              <%=Base.getLinkedFile(ID, file, deniedFile, true, true, "../../")%>
210            </td>
211          </tr>
212          <%
213        }
214        else
215        {
216          %>
217          <tr>
218          <th><%=HTML.encodeTags(node.getTitle())%></th>
219          <td>
220            <%=notFound ? "<i>- not found -</i>" : "<i>- denied -</i>"%>
221          </td>
222          </tr>
223          <%
224        }
225      }
226      else if (item instanceof AnyToAny)
227      {
228        AnyToAny any = AnyToAny.getById(dc, item.getId());
229        String linkTo = null;
230        try
231        {
232          BasicItem to = any.getTo();
233          String name = to instanceof Nameable ? ((Nameable)to).getName() : to.toString();
234          linkTo = Base.getLink(ID, HTML.encodeTags(name), 
235              to.getType(), to.getId(), to.hasPermission(Permission.WRITE));
236        }
237        catch (PermissionDeniedException ex)
238        {
239          linkTo = any.getToType() + "[id=" + any.getToId() + "] (<i>denied</i>)";
240        }
241        catch (ItemNotFoundException ex)
242        {
243          linkTo = any.getToType() + "[id=" + any.getToId() + "] (<i>missing</i>)";
244        }
245        %>
246        <tr>
247          <th>Any-to-any link</th>
248          <td>
249            <table>
250            <tr>
251              <td><%=Base.getLinkedName(ID, any, false, true) %></td>
252              <td><base:icon image="bullet.png" /></td>
253              <td><%=linkTo%></td>
254            </tr>
255            </table>
256          </td>
257        </tr>
258        <%
259      }
260      else
261      {
262        %>
263        <tr>
264          <th><%=node.getNodeType() == Node.Type.FOLDER ? 
265              "Folder" : item != null ? item.getType().toString() : "Item"%></th>
266          <td>
267            <%
268            if (item != null)
269            {
270              %>
271              <%=Base.getLink(ID, node.getTitle(), item.getType(),item.getId(), item.hasPermission(Permission.WRITE))%>
272              <%
273              if (item instanceof Subtypable)
274              {
275                ItemSubtype subtype = ((Subtypable)item).getItemSubtype();
276                if (subtype != null)
277                {
278                  %>
279                  <span class="itemsubtype">(<%=Base.getLinkedName(ID, subtype, false, true)%>)</span>
280                  <%
281                }
282              }
283            }
284            else
285            {
286              %>
287              <%=HTML.encodeTags(node.getTitle())%>
288              <%
289            }
290            %>
291          </td>
292        </tr>
293        <%
294      }
295      %>
296      <tr>
297        <th>Errors (children)</th>
298        <%
299        if (showFailures)
300        {
301        %>
302          <td><%=node.getNumErrors()+node.getChildErrors()%> (<%=node.getChildErrors()%>)</td>
303        <%
304        }
305        else
306        {       
307        %>
308          <td><i>- n/a -</i></td>
309        <%
310        }
311        %>
312      </tr>
313      <tr>
314        <th>Warnings (children)</th>
315        <%
316        if (showFailures)
317        {
318        %>
319          <td><%=node.getNumWarnings()+node.getChildWarnings()%> (<%=node.getChildWarnings()%>)</td>
320        <%
321        }
322        else
323        {       
324        %>
325          <td><i>- n/a -</i></td>
326        <%
327        }
328        %>
329      </tr>
330      <%
331      if (item instanceof Nameable)
332      {
333        Nameable nameable = (Nameable)item;
334        %>
335        <tr>
336          <th>Description</th>
337          <td><%=HTML.niceFormat(nameable.getDescription())%></td>
338        </tr>
339        <%
340      }
341      %>
342      </table>
343      </div>
344      <%
345      List<AnnotationSnapshot> annotations = new LinkedList<AnnotationSnapshot>();
346      String annotationsTitle = "";
347      Annotatable annotatable = null;
348      if (item instanceof Annotation)
349      {
350        Annotation a = Annotation.getById(dc, item.getId());
351        AnnotationSetSnapshot snapshot = snapshotManager.getSnapshot(dc, a.getAnnotationSet().getId());
352        annotationFilter.setAnnotation(a);
353        annotations.addAll(snapshotManager.findAnnotations(dc, snapshot, annotationFilter, true));
354       
355        // Find the annotatable parent node
356        Node parentNode = node;
357        while (parentNode != null)
358        {
359          BasicItem parentItem = parentNode.getItem();
360          if (parentItem instanceof Annotatable)
361          {
362            annotatable = (Annotatable)parentItem;
363            break;
364          }
365          parentNode = parentNode.getParent();
366        }
367        annotationsTitle = "Annotation values";
368      }
369      else if (item instanceof AnnotationType)
370      {
371        // Find the annotatable parent
372        Node parentNode = node;
373        while (parentNode != null)
374        {
375          BasicItem parentItem = parentNode.getItem();
376          if (parentItem instanceof Annotatable && !(parentItem instanceof Protocol))
377          {
378            annotatable = (Annotatable)parentItem.getType().getById(dc, parentItem.getId());
379            if (annotatable.isAnnotated())
380            {
381              annotationTypeFilter.setAnnotationType((AnnotationType)item);
382              annotations.addAll(snapshotManager.findAnnotations(dc, annotatable, annotationTypeFilter, true));
383            }
384            annotationsTitle = "Annotation values";
385            break;
386          }
387          parentNode = parentNode.getParent();
388        }
389      }
390      else if (item instanceof Annotatable)
391      {
392        annotationsTitle = "Annotations &amp; protocol parameters";
393        annotatable = (Annotatable)item.getType().getById(dc, item.getId());
394        if (annotatable.isAnnotated())
395        {
396          annotations.addAll(snapshotManager.findAnnotations(dc, annotatable, null, true));
397        }
398       
399      }
400      if (annotations != null && annotations.size() > 0)
401      {
402        Collections.sort(annotations, AnnotationSnapshot.sortByAnnotationType(dc));
403        %>
404        <base:section
405          id="allAnnotations"
406          title="<%="Annotations &amp; parameters (" +  annotations.size() + ")"%>"
407          context="<%=cc %>">
408       
409        <tbl:table id="annotations">
410          <tbl:columndef id="annotation" title="Annotation/parameter" />
411          <tbl:columndef id="values" title="Values" />
412          <tbl:columndef 
413            id="item"
414            title="Parent item"
415          />
416          <tbl:columndef 
417            id="note"
418            title="Note"
419          />
420          <tbl:columndef
421            id="lastModified"
422            title="Last modified"
423            formatter="<%=dateTimeFormatter %>"
424          />
425          <tbl:data>
426            <tbl:headers>
427              <tbl:headerrow>
428                <tbl:columnheaders />
429              </tbl:headerrow>
430            </tbl:headers>
431            <tbl:rows>
432              <%
433              for (AnnotationSnapshot snapshot : annotations)
434              {
435                AnnotationType at = snapshot.getAnnotationType(dc);
436               
437                // Unit and formatter for the values
438                Formatter<Object> formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
439                Unit unit = snapshot.getActualUnit(dc);
440                UnitConverter converter = null;
441                if (unit != null)
442                {
443                  converter = unit.getUnitConverter(at.getDefaultUnit());
444                  formatter = unit.getFormatter(formatter);
445                }
446                // Get values
447                List<?> values = snapshot.getActualValues(converter, at.getValueType());
448               
449                // Project-specific values
450                List<?> defaultValues = null;
451                boolean projectSpecific = snapshot.getProjectId() != 0;;
452                boolean overrideDefault = snapshot.getOverrideId() != 0;
453                if (overrideDefault)
454                {
455                  Annotation defAnn = Annotation.getById(dc, snapshot.getOverrideId());
456                  if (defAnn.getSource() == Annotation.Source.INHERITED)
457                  {
458                    defAnn = defAnn.getInheritedFrom();
459                  }
460                  defaultValues = defAnn.getValues();
461                }
462
463                // Inheritance information
464                Date lastModified = snapshot.getThisLastUpdate();
465                boolean isUpToDate = snapshot.isUpToDate();
466                AnnotationSnapshot inherited = snapshot.getInheritedFrom();
467                Annotatable inheritedFrom = null;
468                if (inherited != null)
469                {
470                  if (lastModified == null)
471                  {
472                    lastModified = inherited.getThisLastUpdate();
473                  }
474                  try
475                  {
476                    inheritedFrom = inherited.getThisItem(dc);
477                  }
478                  catch (Throwable t)
479                  {}
480                }
481               
482                String icon = at != null && at.isProtocolParameter() ? 
483                    "parameter.png" : "annotation.png";
484                boolean editPermission = snapshot.hasPermission(dc, Permission.WRITE);
485                %>
486                <tbl:row>
487                  <tbl:cell column="annotation"><base:icon image="<%=icon%>" />
488                    <%=Base.getLinkedName(ID, at, false, true)%>
489                  </tbl:cell>
490                  <tbl:cell column="values" clazz="<%=projectSpecific && defaultValues != null ? "cell ps-annotation" : "cell" %>">
491                    <%=Values.getString(values, ", ", true, formatter)%>
492                    <base:icon id="<%=Integer.toString(snapshot.getThisAnnotationId())%>" 
493                      image="<%=isUpToDate ? "edit.png" : "edit-outofsync.png"%>" 
494                      subclass="edit-annotation auto-init" 
495                      data-auto-init="edit-annotation"
496                      data-item-type="<%=annotatable.getType().name()%>" 
497                      data-item-id="<%=annotatable.getId()%>" 
498                      data-annotation-type-id="<%=at.getId()%>"
499                      data-annotation-id="<%=snapshot.getThisAnnotationId()%>"
500                      tooltip="Edit this annotation" visible="<%=editPermission %>"/>
501                  </tbl:cell>
502                  <tbl:cell column="item">
503                    <%
504                    if (inheritedFrom != null)
505                    {
506                      String ownerName = inheritedFrom instanceof Nameable ?
507                          ((Nameable)inheritedFrom).getName() : inheritedFrom.toString();
508                      %>
509                      <%=Base.getLink(ID, ownerName, inheritedFrom.getType(), inheritedFrom.getId(), inheritedFrom.hasPermission(Permission.WRITE)) %>
510                      <%
511                    }
512                    else if (snapshot.getSource() == Annotation.Source.CLONED)
513                    {
514                      %>
515                      <i>- missing -</i>
516                      <%
517                    }
518                    %>
519                  </tbl:cell>
520                  <tbl:cell column="note">
521                    <%=snapshot.getSource() == Annotation.Source.CLONED ? "Cloned" + (isUpToDate ? "; up-to-date" : "; modified") : "" %>
522                    <%
523                    if (projectSpecific)
524                    {
525                      %>
526                      <%=defaultValues == null || defaultValues.size() == 0 ? "No default value" : "Default value: " + Values.getString(defaultValues, ", ", true, formatter)%>
527                      <%
528                    }
529                    %>
530                  </tbl:cell>
531                  <tbl:cell column="lastModified" value="<%=lastModified %>" />
532                </tbl:row>
533                <%
534              }
535              %>
536            </tbl:rows>
537          </tbl:data>       
538        </tbl:table>
539        </base:section>
540        <%
541      }     
542      if (showFailures)
543      {
544        %>
545        <base:section
546          id="failures"
547          title="<%="Failure details (" + (node.getNumErrors() + node.getNumWarnings()) + ")"%>"
548          context="<%=cc %>"
549          >
550        <table>
551        <%
552        int numFailures = 0;
553        for (Failure failure : failures)
554        {
555          ValidationRuleAction validator = failure.getValidator();
556          Severity severity = options.getSeverity(validator);
557          if (failure.getNode() == node && severity != Severity.IGNORE)
558          {
559            numFailures++;
560            List<Fix> fixes = failure.getFixes();
561            %>
562            <tr>
563              <td><base:icon image="<%=severity == Severity.ERROR ? "error.png" : "warning.png"%>" style="padding-right: 4px;"/></td>
564              <td><b><%=HTML.encodeTags(failure.getMessage())%></b></td>
565            </tr>
566            <tr>
567              <td></td>
568              <td style="padding-bottom: 0.3em;">
569                <%=HTML.encodeTags(validator.getDescription())%><br>
570                <%
571                if (fixes != null && fixes.size() > 0)
572                {
573                  for (Fix fix : fixes)
574                  {
575                    if (fix == null) continue;
576                    BasicItem fixItem = fix.getItem();
577                    AnnotationType at = fix.getAnnotationType();
578                    Annotation a = fix.getAnnotation();
579                    boolean enabled = a != null ? 
580                      a.hasPermission(Permission.WRITE) : fixItem.hasPermission(Permission.WRITE);
581                    String autoInit = "";
582                    if (enabled)
583                    {
584                      if (fix.isAnnotationFix())
585                      {
586                        autoInit = "edit-annotation";
587                      }
588                      else if (fix.isDataFileFix())
589                      {
590                        autoInit = "edit-data-file";
591                      }
592                      else
593                      {
594                        autoInit = "edit-item";
595                      }
596                    }
597                    %>
598                    <base:icon image="fixit.png" 
599                      style="padding-bottom: 4px;" 
600                      id="<%=Integer.toString(fix.hashCode())%>"
601                      enabled="<%=enabled %>"
602                      subclass="auto-init"
603                      data-auto-init="<%=autoInit%>"
604                      data-item-type="<%=fixItem.getType().name()%>"
605                      data-item-id="<%=fixItem.getId()%>"
606                      data-annotation-type-id="<%=at != null ? at.getId() : ""%>"
607                      data-annotation-id="<%=a != null ? a.getId() : "" %>"
608                      tooltip="<%=enabled ? "Edit this item to fix the problem" : "You do not have permission to modify this item" %>"
609                    ><%=HTML.encodeTags(fix.getMessage())%></base:icon><br>
610                    <%
611                  }
612                }
613                %>
614              </td>
615            </tr>
616            <%
617          }
618        }
619        %>
620        </table>
621        <%
622        if (numFailures == 0)
623        {
624          %>
625          <div class="messagecontainer note">
626          No validation failures on this item
627          </div>
628          <%
629        }
630        %>
631        </base:section>
632        <%
633      }
634     
635      for (SectionAction section : invoker)
636      {
637        %>
638        <base:section 
639          id="<%=section.getId() %>" 
640          showclazz="<%=section.getShowClazz() %>"
641          hideclazz="<%=section.getHideClazz() %>"
642          style="<%=section.getStyle() %>"
643          contentstyle="<%=section.getContentStyle() %>"
644          title="<%=section.getTitle() %>"
645          context="<%=cc %>"
646          ><%=section.getContent() %></base:section>
647        <%
648      }
649      %>
650      </div>
651    </base:body>
652  </base:page>
653  <%
654}
655finally
656{
657  if (dc != null) dc.close();
658}
659%>
Note: See TracBrowser for help on using the repository browser.