source: trunk/www/common/annotations/list_annotations.jsp @ 4544

Last change on this file since 4544 was 4544, checked in by Nicklas Nordborg, 14 years ago

References #792: Add support for units to annotation values

  • Made it possible to select a default unit for an annotation type
  • Display annotations with units on the "Annotations" tab in the single-item view
  • Test for displaying annotations with units in list pages on the Array designs list page
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 12.0 KB
Line 
1<%-- $Id: list_annotations.jsp 4544 2008-09-25 07:01:30Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Hakkinen, 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 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.ItemQuery"
39  import="net.sf.basedb.core.ItemResultList"
40  import="net.sf.basedb.core.PermissionDeniedException"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.clients.web.Base"
44  import="net.sf.basedb.clients.web.util.HTML"
45  import="net.sf.basedb.util.formatter.Formatter"
46  import="net.sf.basedb.util.formatter.PrefixSuffixFormatter"
47  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
48  import="net.sf.basedb.util.Values"
49  import="java.util.List"
50%>
51<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
52<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
53
54<%
55final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
56final String ID = sc.getId();
57final Item itemType = Item.valueOf(request.getParameter("item_type"));
58final int itemId = Values.getInt(request.getParameter("item_id"));
59final float scale = Base.getScale(sc);
60final DbControl dc = sc.newDbControl();
61
62try
63{
64  final Annotatable item = (Annotatable)itemType.getById(dc, itemId);
65  ItemQuery<AnnotationType> annotationTypeQuery = null;
66  String message = null;
67  boolean isProxy = item instanceof AnnotatableProxy;
68
69  if (isProxy)
70  {
71    AnnotatableProxy proxy = (AnnotatableProxy)item;
72    annotationTypeQuery = Base.getAnnotationTypesQuery(proxy);
73    message = proxy.getAnnotationMessage();
74  }
75  else
76  {
77    annotationTypeQuery = Base.getAnnotationTypesQuery(itemType, false);
78  }
79  final List<AnnotationType> annotationTypes = annotationTypeQuery.list(dc);
80  Protocol protocol = null;
81  boolean readProtocol = true;
82  try
83  {
84    protocol = item.getProtocol();
85  }
86  catch (PermissionDeniedException ex)
87  {
88    readProtocol = false;
89  }
90  final List<AnnotationType> protocolParameters = protocol == null ? 
91    null : Base.getProtocolParametersQuery(protocol).list(dc);
92  final boolean writePermission = item.hasPermission(Permission.WRITE);
93
94  final AnnotationSet as = item.isAnnotated() ? item.getAnnotationSet() : null;
95  ItemResultList<Annotation> inheritedAnnotations = null;
96  if (as != null)
97  {
98    ItemQuery<Annotation> inheritedQuery = as.getAllInheritedAnnotations();
99    // Need FETCH JOIN because Postgres don't like the DISTINCT keyword
100    // if we sort on a non-selected column See ticket #731
101    inheritedQuery.join(Hql.innerJoin(null, "annotationType", "at", true));
102    inheritedQuery.order(Orders.asc(Hql.property("annotationSet")));
103    inheritedQuery.order(Orders.asc(Hql.property("at", "name")));
104    inheritedAnnotations = inheritedQuery.list(dc);
105  }
106%>
107  <base:page type="include">
108  <base:body>
109    <script language="JavaScript">
110    function editAnnotation(annotationTypeId)
111    {
112      var url = getRoot() + 'common/annotations/annotate.jsp?ID=<%=ID%>';
113      url += '&item_type=<%=itemType.name()%>';
114      url += '&item_id=<%=itemId%>';
115      url += '&annotationtype_id='+annotationTypeId;
116      url += '&standalone=1';
117      Main.openPopup(url, 'EditAnnotation', 700, 460);
118    }
119    function editInheritedAnnotation(itemType, itemId, annotationTypeId)
120    {
121      var url = getRoot() + 'common/annotations/annotate.jsp?ID=<%=ID%>';
122      url += '&item_type='+itemType;
123      url += '&item_id='+itemId;
124      url += '&annotationtype_id='+annotationTypeId;
125      url += '&standalone=1';
126      Main.openPopup(url, 'EditAnnotation', 700, 460);
127    }
128    </script>
129      <%
130      if (annotationTypes.size() == 0)
131      {
132        %>
133        <h4>Primary annotations</h4>
134        No annotation types has been defined for this type of item
135        (or you don't have permission to view them).
136        <%
137      }
138      else
139      {
140        %>
141        <%=message == null ? "" : message%>
142        <h4 class="docked">Primary annotations</h4>
143        <tbl:table
144          id="annotations"
145          clazz="itemlist"
146          columns="all"
147          >
148          <tbl:columndef 
149            id="annotation"
150            title="Annotation"
151          />
152          <tbl:columndef 
153            id="values"
154            title="Values"
155          />
156          <tbl:columndef 
157            id="description"
158            title="Description"
159          />
160          <tbl:data>
161            <tbl:columns>
162            </tbl:columns>
163            <tbl:rows>
164            <%
165            for (AnnotationType at : annotationTypes)
166            {
167              Annotation a = as != null && as.hasAnnotation(at) ? as.getAnnotation(at) : null;
168              List<?> values = null;
169              Formatter formatter = null;
170              if (a != null)
171              {
172                values = a.getValues(null);
173                formatter = FormatterFactory.getAnnotationFormatter(sc, a, null);
174              }
175              if (values != null || !at.isRemoved())
176              {
177              %>
178                <tbl:row>
179                  <tbl:cell column="annotation"><base:icon 
180                    image="deleted.gif" 
181                    tooltip="This item has been scheduled for deletion" 
182                    visible="<%=at.isRemoved()%>"
183                  /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
184                  <tbl:cell column="values"><%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
185                  <%
186                    if (writePermission)
187                    {
188                      %>: <base:icon image="edit.gif" 
189                        onclick="<%="editAnnotation("+at.getId()+")"%>" 
190                        tooltip="Modify the values of this annotation" />
191                      <%
192                    }
193                    %>
194                  </tbl:cell>
195                  <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
196                </tbl:row>
197                <%
198              }
199            }
200            %>
201            </tbl:rows>
202          </tbl:data>
203        </tbl:table>
204        <br>
205        <%
206      }
207      char nbsp = 0xA0;
208      %>
209      :<%="a" + nbsp + "b" %>:
210      <%
211      if (protocolParameters != null )
212      {
213        if (protocolParameters.size() == 0)
214        {
215          %>
216          <h4>Protocol parameters</h4>
217          No protocol parameters has been defined for the protocol
218          <%=Base.getLinkedName(ID, protocol, !readProtocol, true)%> 
219          (or you don't have permission to view them).
220          <%
221        }
222        else
223        {
224          %>
225          <h4 class="docked">Protocol parameters for:
226            <%=Base.getLinkedName(ID, protocol, !readProtocol, true)%></h4>
227          <tbl:table
228            id="parameters"
229            clazz="itemlist"
230            columns="all"
231            >
232            <tbl:columndef 
233              id="parameter"
234              title="Parameter"
235            />
236            <tbl:columndef 
237              id="values"
238              title="Values"
239            />
240            <tbl:columndef 
241              id="description"
242              title="Description"
243            />
244            <tbl:data>
245              <tbl:columns>
246              </tbl:columns>
247              <tbl:rows>
248              <%
249              for (AnnotationType at : protocolParameters)
250              {
251                Annotation a = as != null && as.hasAnnotation(at) ? as.getAnnotation(at) : null;
252                Formatter formatter = null;
253                List<?> values = null;
254                if (a != null)
255                {
256                  values = a.getValues(null);
257                  formatter = FormatterFactory.getAnnotationFormatter(sc, a, null);
258                }
259                if (values != null || !at.isRemoved())
260                {
261                  %>
262                  <tbl:row>
263                    <tbl:cell column="parameter"><base:icon 
264                      image="deleted.gif" 
265                      tooltip="This item has been scheduled for deletion" 
266                      visible="<%=at.isRemoved()%>"
267                    /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
268                    <tbl:cell column="values">
269                      <%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
270                      <%
271                      if (writePermission)
272                      {
273                        %>: <base:icon image="edit.gif" 
274                          onclick="<%="editAnnotation("+at.getId()+")"%>" 
275                          tooltip="Modify the values of this protocol parameter" />
276                        <%
277                      }
278                      %>
279                    </tbl:cell>
280                    <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
281                  </tbl:row>
282                  <%
283                }
284              }
285              %>
286              </tbl:rows>
287            </tbl:data>
288          </tbl:table>
289          <br>
290          <%
291        }
292      }
293      %>
294
295      <%
296      if (!isProxy)
297      {
298      if (inheritedAnnotations == null || inheritedAnnotations.size() == 0)
299      {
300        %>
301        <h4>Inherited annotations and protocol parameters</h4>
302        No annotations are inherited by this item.
303        <%
304      }
305      else
306      {
307        %>
308        <h4 class="docked">Inherited annotations and protocol parameters</h4>
309        <tbl:table
310          id="inheritedAnnotations"
311          clazz="itemlist"
312          columns="all"
313          >
314          <tbl:columndef 
315            id="annotation"
316            title="Annotation"
317          />
318          <tbl:columndef 
319            id="item"
320            title="From item"
321          />
322          <tbl:columndef 
323            id="values"
324            title="Values"
325          />
326          <tbl:columndef 
327            id="description"
328            title="Description"
329          />
330          <tbl:data>
331            <tbl:columns>
332            </tbl:columns>
333            <tbl:rows>
334            <%
335            String denied = "<i>- denied -</i>";
336            for (Annotation a : inheritedAnnotations)
337            {
338              AnnotationType at = null;
339              int annotationTypeId = 0;
340              String name = denied;
341              String description = "";
342              boolean writeInherited = false;
343              String icon = "joust/annotation.gif";
344              Formatter formatter = FormatterFactory.getAnnotationFormatter(sc, a, null);
345              try
346              {
347                at = a.getAnnotationType();
348                annotationTypeId = at.getId();
349                name = HTML.encodeTags(at.getName());
350                if (at.isRemoved())
351                {
352                  icon = "deleted.gif";
353                }
354                else if (at.isProtocolParameter())
355                {
356                  icon = "parameter.gif";
357                }
358                description = HTML.encodeTags(at.getDescription());
359              }
360              catch (PermissionDeniedException ex)
361              {}
362              Nameable aItem = null;
363              try
364              {
365                aItem = (Nameable)a.getAnnotationSet().getItem();
366                writeInherited = aItem.hasPermission(Permission.WRITE);
367              }
368              catch (PermissionDeniedException ex)
369              {}
370              List<?> values = a.getValues();
371              %>
372              <tbl:row>
373                <tbl:cell column="annotation"><base:icon image="<%=icon%>" />&nbsp;<%=Base.getLinkedName(ID, at, at == null, true)%></tbl:cell>
374                <tbl:cell column="item"><%=Base.getLinkedName(ID, aItem, aItem == null, true)%><%=aItem != null ? " ["+aItem.getType()+"]" : ""%></tbl:cell>
375                <tbl:cell column="values">
376                  <%=values == null || values.size() == 0 ? 
377                    "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
378                  <%
379                  if (writeInherited && aItem != null)
380                  {
381                    %>: <base:icon image="edit.gif" 
382                      onclick="<%="editInheritedAnnotation('"+aItem.getType().name()+"', "+aItem.getId()+", "+at.getId()+")"%>" 
383                      tooltip="Modify the values of this annotation" />
384                    <%
385                  }
386                  %>
387                </tbl:cell>
388                <tbl:cell column="description"><%=description%></tbl:cell>
389              </tbl:row>
390              <%
391            }
392            %>
393            </tbl:rows>
394          </tbl:data>
395        </tbl:table>
396        <base:icon image="joust/annotation.gif" /> = Annotation,
397        <base:icon image="parameter.gif" /> = Protocol parameter
398        <%
399      }
400      }
401      %>
402
403  </base:body>
404  </base:page>
405  <%
406}
407finally
408{
409  if (dc != null) dc.close();
410}
411
412%>
Note: See TracBrowser for help on using the repository browser.