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

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

Fixes #1360: Existing annotatation on an item may not be visible/editable in some cases

This should make sure that all existing annotations can be viewed and edited. The problem with the "Unhandled item: ANNOTATION..." will be fixed as part of #1361.

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