source: branches/3.4-stable/www/common/annotations/list_annotations.jsp @ 6722

Last change on this file since 6722 was 6722, checked in by Nicklas Nordborg, 7 years ago

Fixes #1919: The primary annotations list may not contain all annotation in category

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 16.5 KB
Line 
1<%-- $Id: list_annotations.jsp 6722 2015-02-11 12:57:10Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
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.Item"
29  import="net.sf.basedb.core.Permission"
30  import="net.sf.basedb.core.AnnotationType"
31  import="net.sf.basedb.core.Protocol"
32  import="net.sf.basedb.core.AnnotationSet"
33  import="net.sf.basedb.core.Annotation"
34  import="net.sf.basedb.core.Annotatable"
35  import="net.sf.basedb.core.AnnotatableProxy"
36  import="net.sf.basedb.core.Unit"
37  import="net.sf.basedb.core.Nameable"
38  import="net.sf.basedb.core.Subtypable"
39  import="net.sf.basedb.core.ItemSubtype"
40  import="net.sf.basedb.core.BioPlate"
41  import="net.sf.basedb.core.BioPlateType"
42  import="net.sf.basedb.core.ItemQuery"
43  import="net.sf.basedb.core.ItemResultList"
44  import="net.sf.basedb.core.Include"
45  import="net.sf.basedb.core.PermissionDeniedException"
46  import="net.sf.basedb.core.query.Orders"
47  import="net.sf.basedb.core.query.Hql"
48  import="net.sf.basedb.core.query.Restrictions"
49  import="net.sf.basedb.core.query.Expressions"
50  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
51  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
52  import="net.sf.basedb.core.snapshot.SnapshotManager"
53  import="net.sf.basedb.clients.web.Base"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.NameableComparator"
56  import="net.sf.basedb.util.formatter.Formatter"
57  import="net.sf.basedb.util.formatter.PrefixSuffixFormatter"
58  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
59  import="net.sf.basedb.util.Values"
60  import="java.util.ArrayList"
61  import="java.util.List"
62  import="java.util.Set"
63  import="java.util.HashSet"
64  import="java.util.TreeSet"
65  import="java.util.Map"
66  import="java.util.HashMap"
67%>
68<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
69<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
70
71<%
72final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
73final String ID = sc.getId();
74final Item itemType = Item.valueOf(request.getParameter("item_type"));
75final int itemId = Values.getInt(request.getParameter("item_id"));
76final float scale = Base.getScale(sc);
77final DbControl dc = sc.newDbControl();
78
79Set<AnnotationType> annotationTypes = null;
80Set<AnnotationType> protocolParameters = null;
81Map<AnnotationType, AnnotationSnapshot> existing = null;
82
83try
84{
85  final Annotatable item = (Annotatable)itemType.getById(dc, itemId);
86  final boolean writePermission = item.hasPermission(Permission.WRITE);
87  final SnapshotManager manager = new SnapshotManager();
88 
89  ItemQuery<AnnotationType> annotationTypeQuery = null;
90  String message = null;
91  boolean isProxy = item instanceof AnnotatableProxy;
92
93  // Load all annotation types that are possible for this item type
94  if (isProxy)
95  {
96    AnnotatableProxy proxy = (AnnotatableProxy)item;
97    annotationTypeQuery = Base.getAnnotationTypesQuery(proxy);
98    message = proxy.getAnnotationMessage();
99  }
100  else
101  {
102    annotationTypeQuery = Base.getAnnotationTypesQuery(itemType, false);
103  }
104  annotationTypes = new TreeSet<AnnotationType>(new NameableComparator(false));
105  annotationTypes.addAll(annotationTypeQuery.list(dc));
106
107  final AnnotationSetSnapshot snapshot = item.isAnnotated() ? 
108      manager.getSnapshot(dc, item.getAnnotationSet().getId()) : null;
109  List<AnnotationSnapshot> inheritedAnnotations = null;
110  if (snapshot != null)
111  {
112    // Load the existing primary and inherited annotations
113    existing = new HashMap<AnnotationType, AnnotationSnapshot>();
114    inheritedAnnotations = new ArrayList<AnnotationSnapshot>();
115    for (AnnotationSnapshot a : manager.findAnnotations(dc, snapshot, null, true))
116    {
117      AnnotationType at = a.getAnnotationType(dc);
118      if (!a.isInherited())
119      {
120        existing.put(a.getAnnotationType(dc), a);
121      }
122      else
123      {
124        inheritedAnnotations.add(a);
125      }
126    }
127    annotationTypes.addAll(existing.keySet());
128  }
129 
130  // Load the possible protocol parameters
131  Protocol protocol = null;
132  boolean readProtocol = true;
133  try
134  {
135    protocol = item.getProtocol();
136  }
137  catch (PermissionDeniedException ex)
138  {
139    readProtocol = false;
140  }
141  ItemQuery<AnnotationType> parameterQuery = Base.getProtocolParametersQuery(protocol);
142  if (parameterQuery != null)
143  {
144    protocolParameters = new HashSet<AnnotationType>(parameterQuery.list(dc));
145    annotationTypes.removeAll(protocolParameters);
146  }
147  // Load the current subtype
148  // NOTE! User may have selected a different subtype in the form than what is
149  // currently saved so if a subtype_id is sent in the request we use that
150  String selectedCategoryName = null;
151  try
152  {
153    ItemSubtype subtype = null;
154    if (item instanceof Subtypable)
155    {
156      subtype = ((Subtypable)item).getItemSubtype();
157    }
158    else if (item instanceof BioPlate)
159    {
160      BioPlateType bpt = ((BioPlate)item).getBioPlateType();
161      subtype = bpt.getItemSubtype();
162      if (subtype == null) selectedCategoryName = bpt.getName();
163    }
164    if (subtype != null) selectedCategoryName = subtype.getName();
165  }
166  catch (PermissionDeniedException ex)
167  {}
168  Set<AnnotationType> annotationTypesInCategory = new HashSet<AnnotationType>();
169  if (selectedCategoryName != null)
170  {
171    ItemQuery<AnnotationType> query = AnnotationType.getQuery(item.getType());
172    query.setIncludes(Include.ALL);
173    query.join(Hql.innerJoin("categories", "ct"));
174    query.restrict(Restrictions.eq(Hql.property("ct", "name"), Expressions.string(selectedCategoryName)));
175    annotationTypesInCategory.addAll(query.list(dc));
176  }
177  %>
178  <base:page type="iframe" id="list-annotations">
179  <base:head scripts="~list.js" styles="table.css">
180  <style>
181    #annotations-data.all
182    {}
183   
184    #annotations-data.values .novalues
185    {
186      display: none;
187    }
188   
189    #annotations-data.category .nocategory
190    {
191      display: none;
192    }
193  </style>
194  </base:head>
195  <base:body>
196    <%
197    if (message != null)
198    {
199      %>
200      <div class="messagecontainer note"><%=message%></div>
201      <%
202    }
203    %>
204    <base:section
205      id="primaryAnnotations"
206      title="<%="Primary annotations (" + annotationTypes.size() + ")"%>"
207      >
208      <%
209      int allWithValues = 0;
210      int allOfCategory = 0;
211      if (annotationTypes.size() == 0)
212      {
213        %>
214        <div class="messagecontainer note">
215        No annotation types has been defined for this type of item
216        (or you don't have permission to view them).
217        </div>
218        <%
219      }
220      else
221      {
222        %>
223        <tbl:table
224          id="annotations"
225          columns="all"
226          >
227          <tbl:columndef 
228            id="annotation"
229            title="Annotation"
230          />
231          <tbl:columndef 
232            id="values"
233            title="Values"
234          />
235          <tbl:columndef 
236            id="description"
237            title="Description"
238          />
239          <div class="panelgroup topborder leftborder rightborder bg-filled-100">
240            <tbl:panel style="height: auto; padding: 2px;">
241              <b>View:</b> 
242              <%
243              if (selectedCategoryName != null)
244              {
245                %>
246                <label><input type="radio" name="view" id="view_category" value="category" checked>All of <i><%=HTML.encodeTags(selectedCategoryName)%></i> category</label> (<span id="allOfCategory">?</span>)
247                <%
248              }
249              %>
250              <label><input type="radio" name="view" id="view_values" value="values" <%=selectedCategoryName == null ? "checked" : ""%>>All with values</label> (<span id="allWithValues">?</span>)
251              <label><input type="radio" name="view" id="view_all" value="all">All annotations</label> (<%=annotationTypes.size()%>)
252            </tbl:panel>
253          </div>
254          <tbl:data id="annotations-data">
255            <tbl:headers>
256              <tbl:headerrow>
257                <tbl:columnheaders />
258              </tbl:headerrow>
259            </tbl:headers>
260            <tbl:rows>
261            <%
262            for (AnnotationType at : annotationTypes)
263            {
264              AnnotationSnapshot a = existing != null ? existing.get(at) : null;
265              List<?> values = null;
266              Formatter formatter = null;
267              if (a != null)
268              {
269                Annotation ann = a.getAnnotation(dc);
270                values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
271                formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
272              }
273              if (values != null || !at.isRemoved())
274              {
275                String rowClass = "";
276                if (values == null || values.size() == 0) 
277                {
278                  rowClass += " novalues";
279                }
280                else
281                {
282                  allWithValues++;
283                }
284                if (!annotationTypesInCategory.contains(at)) 
285                {
286                  rowClass += " nocategory";
287                }
288                else
289                {
290                  allOfCategory++;
291                }
292                %>
293                <tbl:row subclass="<%=rowClass%>">
294                  <tbl:cell column="annotation"><base:icon 
295                    image="deleted.png" 
296                    tooltip="This item has been scheduled for deletion" 
297                    visible="<%=at.isRemoved()%>"
298                  /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
299                  <tbl:cell column="values"><%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
300                  <%
301                    if (writePermission)
302                    {
303                      %>: <base:icon image="edit.png" subclass="auto-init link" 
304                        data-auto-init="edit-annotation" data-annotation-type="<%=at.getId()%>"
305                        data-item-type="<%=itemType.name()%>" data-item-id="<%=itemId %>"
306                        tooltip="Modify the values of this annotation" />
307                      <%
308                    }
309                    %>
310                  </tbl:cell>
311                  <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
312                </tbl:row>
313                <%
314              }
315            }
316            %>
317            </tbl:rows>
318          </tbl:data>
319        </tbl:table>
320        <%
321      }
322      %>
323      <div id="annotations-stat" class="datacontainer"
324        data-all-with-values="<%=allWithValues %>"
325        data-all-of-category="<%=allOfCategory%>"
326      ></div>
327     
328    </base:section>
329
330    <%
331    if (protocolParameters != null)
332    {
333      %>
334      <base:section 
335        id="parameterSection" 
336        title="<%="Protocol parameters for " + HTML.encodeTags(protocol.getName()) + 
337          " (" + protocolParameters.size() + ")"%>"
338        >
339        <%
340        if (protocolParameters.size() == 0)
341        {
342          %>
343          <div class="messagecontainer note">
344          No protocol parameters has been defined for the protocol
345          <%=Base.getLinkedName(ID, protocol, !readProtocol, true)%> 
346          (or you don't have permission to view them).
347          </div>
348          <%
349        }
350        else
351        {
352          %>
353          <tbl:table
354            id="parameters"
355            columns="all"
356            >
357            <tbl:columndef 
358              id="parameter"
359              title="Parameter"
360            />
361            <tbl:columndef 
362              id="values"
363              title="Values"
364            />
365            <tbl:columndef 
366              id="description"
367              title="Description"
368            />
369            <tbl:data>
370              <tbl:headers>
371                <tbl:headerrow>
372                  <tbl:columnheaders />
373                </tbl:headerrow>
374              </tbl:headers>
375              <tbl:rows>
376              <%
377              for (AnnotationType at : protocolParameters)
378              {
379                AnnotationSnapshot a = existing != null ? existing.get(at) : null;
380                Formatter formatter = null;
381                List<?> values = null;
382                if (a != null)
383                {
384                  Annotation ann = a.getAnnotation(dc);
385                  values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
386                  formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
387                }
388                if (values != null || !at.isRemoved())
389                {
390                  %>
391                  <tbl:row>
392                    <tbl:cell column="parameter"><base:icon 
393                      image="deleted.png" 
394                      tooltip="This item has been scheduled for deletion" 
395                      visible="<%=at.isRemoved()%>"
396                    /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
397                    <tbl:cell column="values">
398                      <%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
399                      <%
400                      if (writePermission)
401                      {
402                        %>: <base:icon image="edit.png" subclass="auto-init link" 
403                          data-auto-init="edit-annotation" data-annotation-type="<%=at.getId()%>"
404                          data-item-type="<%=itemType.name()%>" data-item-id="<%=itemId %>"
405                          tooltip="Modify the values of this protocol parameter" />
406                        <%
407                      }
408                      %>
409                    </tbl:cell>
410                    <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
411                  </tbl:row>
412                  <%
413                }
414              }
415              %>
416              </tbl:rows>
417            </tbl:data>
418          </tbl:table>
419          <%
420        }
421        %>
422      </base:section>
423      <%
424    }
425    %>
426    <%
427    if (!isProxy)
428    {
429      int numInherited = inheritedAnnotations == null ? 0 : inheritedAnnotations.size();
430      %>
431      <base:section 
432        id="inherited"
433        title="<%="Inherited annotations and protocol parameters (" + numInherited + ")"%>"         
434        >
435        <%
436        if (numInherited == 0)
437        {
438          %>
439          <div class="messagecontainer note">
440          No annotations are inherited by this item.
441          (or you don't have permission to view them).
442          </div>
443          <%
444        }
445        else
446        {
447        %>
448        <tbl:table
449          id="inheritedAnnotations"
450          columns="all"
451          >
452          <tbl:columndef 
453            id="annotation"
454            title="Annotation"
455          />
456          <tbl:columndef 
457            id="item"
458            title="From item"
459          />
460          <tbl:columndef 
461            id="values"
462            title="Values"
463          />
464          <tbl:columndef 
465            id="description"
466            title="Description"
467          />
468          <tbl:data>
469            <tbl:headers>
470              <tbl:headerrow>
471                <tbl:columnheaders />
472              </tbl:headerrow>
473            </tbl:headers>
474            <tbl:rows>
475            <%
476            for (AnnotationSnapshot a : inheritedAnnotations)
477            {
478              Annotation ann = a.getAnnotation(dc);
479              AnnotationType at = a.getAnnotationType(dc);
480              String name = HTML.encodeTags(at.getName());
481              String description = HTML.encodeTags(at.getDescription());
482              boolean writeInherited = false;
483              String icon = "annotation.png";
484              if (at.isRemoved())
485              {
486                icon = "deleted.png";
487              }
488              else if (at.isProtocolParameter())
489              {
490                icon = "parameter.png";
491              }
492              List<?> values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
493              Formatter formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
494              Nameable aItem = null;
495              String fromType = a.getItemType().toString();
496              try
497              {
498                aItem = (Nameable)a.getItem(dc);
499                writeInherited = aItem.hasPermission(Permission.WRITE);
500              }
501              catch (PermissionDeniedException ex)
502              {}
503              if (aItem instanceof Subtypable)
504              {
505                try
506                {
507                  ItemSubtype subtype = ((Subtypable)aItem).getItemSubtype();
508                  if (subtype != null) fromType = subtype.getName();
509                }
510                catch (PermissionDeniedException ex)
511                {}
512              }             %>
513              <tbl:row>
514                <tbl:cell column="annotation"><base:icon image="<%=icon%>" style="padding-right: 2px;" /><%=Base.getLinkedName(ID, at, at == null, true)%></tbl:cell>
515                <tbl:cell column="item"><%=Base.getLinkedName(ID, aItem, aItem == null, true)%><%=aItem != null ? " <span class=\"itemsubtype\">("+fromType+")</span>" : ""%></tbl:cell>
516                <tbl:cell column="values">
517                  <%=values == null || values.size() == 0 ? 
518                    "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
519                  <%
520                  if (writeInherited && aItem != null)
521                  {
522                    %>: <base:icon image="edit.png" subclass="auto-init link" 
523                      data-auto-init="edit-annotation" data-annotation-type="<%=at.getId()%>"
524                      data-item-type="<%=aItem.getType().name()%>" data-item-id="<%=aItem.getId() %>"
525                      tooltip="Modify the values of this annotation" />
526                    <%
527                  }
528                  %>
529                </tbl:cell>
530                <tbl:cell column="description"><%=description%></tbl:cell>
531              </tbl:row>
532              <%
533            }
534            %>
535            </tbl:rows>
536          </tbl:data>
537        </tbl:table>
538        <base:icon image="joust/annotation.gif" /> = Annotation,
539        <base:icon image="parameter.png" /> = Protocol parameter
540        <%
541      }
542      %>
543      </base:section>
544      <%
545    }
546    %>
547  </base:body>
548  </base:page>
549  <%
550}
551finally
552{
553  if (dc != null) dc.close();
554}
555
556%>
Note: See TracBrowser for help on using the repository browser.