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

Last change on this file since 5123 was 5123, checked in by Nicklas Nordborg, 13 years ago

References #1374: Caching of experimental factors

The 'Annotations & parameters' tab on single-item view pages is now using the cached snapshots as well. The main reason is that this will re-create the snapshot immediately after a change has been made and it should improve performance on pages that needs to list lots of annotations.

NOTE! This change also affect the change made in [5102] for ticket #1373 (due to be released in BASE 2.13.1). The changes are incompatible and changes for list_annotations.jsp that was made in 5102 SHOULD NOT be merged back to the trunk.

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