source: trunk/www/views/experiments/view_experiment.jsp @ 5877

Last change on this file since 5877 was 5877, checked in by Nicklas Nordborg, 11 years ago

References #1616: Clone reporter information to per-experiment tables in the dynamic database

Added gui for defining reporter clone templates. Changes to the batcher API. Added an API (TransactionalAction) for hooking into transaction commit/rollback.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 29.9 KB
Line 
1<%-- $Id: view_experiment.jsp 5877 2011-11-16 14:39:47Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson, Gregory Vincic
4  Copyright (C) 2007 Nicklas Nordborg, Martin Svensson
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.Permission"
32  import="net.sf.basedb.core.Experiment"
33  import="net.sf.basedb.core.RawBioAssay"
34  import="net.sf.basedb.core.AnnotationType"
35  import="net.sf.basedb.core.AnnotationSet"
36  import="net.sf.basedb.core.Annotation"
37  import="net.sf.basedb.core.Annotatable"
38  import="net.sf.basedb.core.Unit"
39  import="net.sf.basedb.core.Type"
40  import="net.sf.basedb.core.User"
41  import="net.sf.basedb.core.Group"
42  import="net.sf.basedb.core.ItemQuery"
43  import="net.sf.basedb.core.ItemResultList"
44  import="net.sf.basedb.core.ItemResultIterator"
45  import="net.sf.basedb.core.Include"
46  import="net.sf.basedb.core.MultiPermissions"
47  import="net.sf.basedb.core.PermissionDeniedException"
48  import="net.sf.basedb.core.PluginDefinition"
49  import="net.sf.basedb.core.plugin.GuiContext"
50  import="net.sf.basedb.core.plugin.Plugin"
51  import="net.sf.basedb.core.Project"
52  import="net.sf.basedb.core.query.Orders"
53  import="net.sf.basedb.core.query.Hql"
54  import="net.sf.basedb.clients.web.Base"
55  import="net.sf.basedb.clients.web.PermissionUtil"
56  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
57  import="net.sf.basedb.clients.web.util.HTML"
58  import="net.sf.basedb.util.Values"
59  import="net.sf.basedb.core.snapshot.SnapshotManager"
60  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
61  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
62  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
63  import="net.sf.basedb.util.formatter.Formatter"
64  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
65  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
66  import="net.sf.basedb.clients.web.extensions.JspContext"
67  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
68  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
69  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
70  import="java.util.Collections"
71  import="java.util.Date"
72  import="java.util.Map"
73  import="java.util.HashMap"
74  import="java.util.Set"
75  import="java.util.HashSet"
76  import="java.util.List"
77  import="java.util.LinkedList"
78  import="java.util.Date"
79%>
80<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
81<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
82<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
83<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
84<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
85<%!
86  private static final Item itemType = Item.EXPERIMENT;
87  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
88%>
89<%
90final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
91final String ID = sc.getId();
92final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
93final int itemId = cc.getId();
94final String tab = Values.getString(request.getParameter("tab"), "properties");
95final float scale = Base.getScale(sc);
96final String root = request.getContextPath();
97final DbControl dc = sc.newDbControl();
98try
99{
100  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
101  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
102
103  String title = null;
104  Experiment experiment = Experiment.getById(dc, itemId);
105 
106  final boolean writePermission = experiment.hasPermission(Permission.WRITE);
107  final boolean deletePermission = experiment.hasPermission(Permission.DELETE);
108  final boolean sharePermission = experiment.hasPermission(Permission.SET_PERMISSION);
109  final boolean setOwnerPermission = experiment.hasPermission(Permission.SET_OWNER);
110  final boolean isOwner = experiment.isOwner();
111  final boolean isRemoved = experiment.isRemoved();
112  final boolean isUsed = isRemoved && experiment.isUsed();
113  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
114 
115  Map<AnnotationType, Set<Object>> usedFactorValues = 
116    new HashMap<AnnotationType, Set<Object>>();
117  Map<AnnotationType, Integer> factorValuesCount = new HashMap<AnnotationType, Integer>();
118  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, experiment);
119  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
120  %>
121  <base:page title="<%=title%>">
122  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
123    <ext:scripts context="<%=jspContext%>" />
124    <ext:stylesheets context="<%=jspContext%>" />
125    <script language="JavaScript">
126    function editItem()
127    {
128      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
129    }
130    function shareItem()
131    {
132      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id=<%=itemId%>', 'ShareRawBioAssay', 600, 400);
133    }
134    function deleteItem()
135    {
136      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&item_id=<%=itemId%>');
137    }
138    function restoreItem()
139    {
140      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&item_id=<%=itemId%>');
141    }
142    function deleteItemPermanently()
143    {
144      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', <%=itemId%>, '&callback=itemDeleted');
145    }
146    function itemDeleted()
147    {
148      Main.listItems('<%=ID%>', '<%=itemType.name()%>');
149    }
150    function showUsingItems()
151    {
152      Main.showUsingItems('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>);
153    }   
154    function setOwner()
155    {
156      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=SetOwnerOfItem&item_id=<%=itemId%>', 'SetOwnerOfItem', 450, 150);
157    }
158    function runPlugin(cmd)
159    {
160      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&item_id=<%=itemId%>', 'RunPlugin'+cmd, 740, 540);
161    }
162    function analyzeItem()
163    {
164      location.href = '<%=root%>/analyze/index.jsp?ID=<%=ID%>&experiment_id=<%=itemId%>';
165    }
166    function viewBioAssaySets()
167    {
168      location.href = 'bioassaysets/index.jsp?ID=<%=ID%>&experiment_id=<%=itemId%>';
169    }
170    function switchTab(tabControlId, tabId)
171    {
172      if (TabControl.isActive(tabControlId, tabId)) return;
173      if ((tabId == 'overview' || tabId == 'history') && tabId != '<%=tab%>')
174      {
175        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=itemId%>&tab='+tabId;
176      }
177      else if (tabId == 'bioassaysets')
178      {
179        viewBioAssaySets();
180      }
181      else
182      {
183        TabControl.setActiveTab(tabControlId, tabId);
184      }
185    }
186    function editAnnotation(itemType, itemId, annotationTypeId)
187    {
188      var url = getRoot() + 'common/annotations/annotate.jsp?ID=<%=ID%>';
189      url += '&item_type='+itemType;
190      url += '&item_id='+itemId;
191      url += '&annotationtype_id='+annotationTypeId;
192      url += '&standalone=1';
193      Main.openPopup(url, 'EditAnnotation', 700, 460);
194    }
195    function editInheritedAnnotation(itemType, itemId, annotationTypeId)
196    {
197      var url = getRoot() + 'common/annotations/inherit.jsp?ID=<%=ID%>';
198      url += '&item_type='+itemType;
199      url += '&item_id='+itemId;
200      url += '&annotationtype_id='+annotationTypeId;
201      url += '&standalone=1';
202      Main.openPopup(url, 'EditAnnotation', 700, 460);
203    }
204    function setUsedFactorValue(annotationTypeId, values)
205    {
206      var div = document.getElementById('usedvalues.'+annotationTypeId);
207      div.innerHTML = values;
208      if (values && values.length > 50)
209      {
210        Main.addClass(div, 'constrained unchecked autoshow');
211        if (window.textOverflowChecker)
212        {
213          window.textOverflowChecker.checkTag(div);
214        }
215      }
216    }
217    var hasMissingFactors = false;
218    function showStatus(annotationTypeId, numTotal, numInherited)
219    {
220      var sss = document.getElementById('status.'+annotationTypeId);
221      var html;
222      if (numInherited >= numTotal)
223      {
224        html = '<img src="../../images/ok.gif" title="All ' + numTotal +
225          ' raw bioassays have a value for this experimental factor">';
226      }
227      else
228      {
229        var numMissing = numTotal - numInherited;
230        html = '<table border="0" cellspacing="0" cellpadding="0"><tr>';
231        html += '<td width="20"><img src="../../images/warning.gif" border="0"';
232        html += ' title="' + numMissing + ' raw bioassays are missing a value for this experimental factor"></td>';
233        html += '<td width="20" style="text-align: center;">';
234        html += '<input type="checkbox" name="autoinherit" id="autoinherit'+annotationTypeId+'" value="'+annotationTypeId+'" checked';
235        html += ' title="Select to automatically inherit annotations from parents"></td>';
236        html += '<td>&nbsp;<label for="autoinherit'+annotationTypeId+'">' + numMissing + ' missing</label></td>'
237        html += '</tr></table>';
238
239        if (!hasMissingFactors)
240        {
241          hasMissingFactors = true;
242          var checkAll = '<table border="0" cellspacing="0" cellpadding="0"><tr>';
243          checkAll += '<td width="20"></td>';
244          checkAll += '<td width="20" style="text-align: center;">';
245          checkAll += '<a href="javascript:checkFactors()" title="Check/uncheck all">';
246          checkAll += '<img src="../../images/check_uncheck.gif" border="0"></a></td>';
247          checkAll += '<td width="20"><img src="../../images/bullet.gif" border="0"></td>';
248          checkAll += '<td><a href="javascript:autoInherit()"';
249          checkAll += ' title="Automatically try to inherit values for the selected experimental factors from parent items">';
250          checkAll += 'Auto-inherit</a></td>'
251          checkAll += '</tr></table>';
252          document.getElementById('status').innerHTML = checkAll;
253          Main.show('warning.missing');
254        }
255      }
256      sss.innerHTML = html;
257    }
258    function checkFactors()
259    {
260      var frm = document.forms['experimentalFactors'];
261      Forms.checkUncheck(frm, /autoinherit/);
262    }
263    function autoInherit()
264    {
265      var frm = document.forms['experimentalFactors'];
266      if (Forms.numChecked(frm, /autoinherit/) == 0)
267      {
268        alert('Please select at least on experimental factor');
269        return;
270      }
271      Main.openPopup('../../common/progress_reporter.jsp?ID=<%=ID%>&progress=autoinherit&title=Inheriting experimental factors', 'Progress', 400, 200);
272      frm.cmd.value = 'AutoInherit';
273      frm.submit();
274    }
275    </script>
276  </base:head>
277  <base:body onload="initUsedFactorValues()">
278    <p>
279    <p:path>
280      <p:pathelement title="Experiments" href="<%="index.jsp?ID="+ID%>" />
281      <p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" />
282    </p:path>
283   
284    <t:tabcontrol id="main" active="<%=tab%>" switch="switchTab" remember="false">
285    <t:tab id="properties" title="Properties">
286   
287    <tbl:toolbar
288      >
289      <tbl:button 
290        disabled="<%=writePermission ? false : true%>" 
291        image="<%=writePermission ? "edit.gif" : "edit_disabled.gif"%>" 
292        onclick="editItem()" 
293        title="Edit&hellip;" 
294        tooltip="<%=writePermission ? "Edit this experiment" : "You do not have permission to edit this experiment"%>" 
295      />
296      <tbl:button 
297        disabled="<%=deletePermission ? false : true%>" 
298        image="<%=deletePermission ? "delete.gif" : "delete_disabled.gif"%>" 
299        onclick="deleteItem()" 
300        title="Delete"
301        visible="<%=!experiment.isRemoved()%>"
302        tooltip="<%=deletePermission ? "Delete this experiment" : "You do not have permission to delete this experiment"%>" 
303      />
304      <tbl:button 
305        disabled="<%=writePermission ? false : true%>" 
306        image="<%=writePermission ? "restore.gif" : "restore_disabled.gif"%>" 
307        onclick="restoreItem()" 
308        title="Restore"
309        visible="<%=experiment.isRemoved()%>"
310        tooltip="<%=writePermission ? "Restore this experiment" : "You do not have permission to restore this experiment"%>" 
311      />
312      <tbl:button 
313        disabled="<%=sharePermission ? false : true%>"
314        image="<%=sharePermission ? "share.gif" : "share_disabled.gif"%>"
315        onclick="shareItem()" 
316        title="Share&hellip;" 
317        tooltip="<%=sharePermission ? "Share this experiment to other user, groups and projects" : "You do not have permission to share this experiment"%>"
318      />
319      <tbl:button 
320        disabled="<%=setOwnerPermission ? false : true%>"
321        image="<%=setOwnerPermission ? "take_ownership.png" : "take_ownership_disabled.png"%>"
322        onclick="setOwner()" 
323        title="Set owner&hellip;"
324        tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
325      />
326      <tbl:button 
327        image="import.gif" 
328        onclick="runPlugin('ImportItem')" 
329        title="Import&hellip;" 
330        tooltip="Import data" 
331        visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
332      />
333      <tbl:button 
334        image="export.gif" 
335        onclick="runPlugin('ExportItem')" 
336        title="Export&hellip;" 
337        tooltip="Export data" 
338        visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
339      />
340      <tbl:button 
341        image="runplugin.gif" 
342        onclick="runPlugin('RunPlugin')" 
343        title="Run plugin&hellip;" 
344        tooltip="Run a plugin" 
345        visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
346      />
347      <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
348        wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
349      <tbl:button
350        image="help.gif"
351        onclick="<%="Main.openHelp('" + ID +"', 'experiment.view.properties')"%>"
352        title="Help&hellip;"
353        tooltip="Get help about this page"
354      />
355      </tbl:toolbar>
356    <div class="boxedbottom">
357      <div class="itemstatus">Permissions on this item: <i><%=PermissionUtil.getFullPermissionNames(experiment)%></i></div>
358      <%
359      if (experiment.isRemoved() || experiment.isShared())
360      {
361        %>
362        <div class="itemstatus">
363          <base:icon 
364            image="<%=deletePermanentlyPermission ? "deleted.gif" : "deleted_disabled.gif"%>"
365            onclick="<%=deletePermanentlyPermission ? "deleteItemPermanently()" : null%>"
366            tooltip="<%=deletePermanentlyPermission ? "Permanently delete this item" : null%>"
367            visible="<%=isRemoved%>"> This item has been flagged for deletion<br></base:icon>
368          <base:icon image="used.gif" 
369            onclick="showUsingItems()"
370            tooltip="Show the items that are using this one"
371            visible="<%=isUsed%>"> This item is used by other items and can't be permanently deleted<br></base:icon>
372          <base:icon image="shared.gif" 
373            visible="<%=experiment.isShared()%>"> This item is shared to other users, groups and/or projects</base:icon>
374        </div>
375        <%
376      }
377      %>
378      <table class="form" cellspacing="0">
379      <tr>
380        <td class="prompt">Name</td>
381        <td><%=HTML.encodeTags(experiment.getName())%></td>
382      </tr>
383      <tr>
384        <td class="prompt">Registered</td>
385        <td><%=dateFormatter.format(experiment.getEntryDate())%></td>
386      </tr>
387      <tr>
388        <td class="prompt">Raw data type</td>
389        <td><base:catch><%=HTML.encodeTags(experiment.getRawDataType().getName())%></base:catch></td>
390      </tr>
391      <tr>
392        <td class="prompt">Directory</td>
393        <td><base:propertyvalue item="<%=experiment%>" property="directory" /></td>
394      </tr>
395      <tr>
396        <td class="prompt">Reporter clone template</td>
397        <td><base:propertyvalue item="<%=experiment%>" property="virtualDb.reporterCloneTemplate" nulltext="<i>- no cloned reporters -</i>" /></td>
398      </tr>
399      <tr>
400        <td class="prompt">Bytes</td>
401        <td><%=Values.formatBytes(experiment.getBytes())%></td>
402      </tr>
403      <tr>
404        <td class="prompt">Owner</td>
405        <td><base:propertyvalue item="<%=experiment%>" property="owner" /></td>
406      </tr>
407      <tr>
408        <td class="prompt">Description</td>
409        <td><%=HTML.niceFormat(experiment.getDescription())%></td>
410      </tr>
411      </table>
412     
413    <base:section 
414      id="publication" 
415      title="Publication"
416      context="<%=cc%>"
417      >
418      <table class="form" cellspacing="0">
419      <tr>
420        <td class="prompt">PubMed ID</td>
421        <td>
422          <%=HTML.encodeTags(experiment.getPubMedId())%>
423          <%
424          int pubMedId = Values.getInt(experiment.getPubMedId(), -1);
425          if (pubMedId != -1)
426          {
427            %>
428            <b>Link to:</b>
429            <a href="http://www.ebi.ac.uk/citexplore/citationDetails.do?externalId=<%=pubMedId%>&dataSource=MED"
430              target="_new" title="External link to EBI Citation database"
431              >EBI Citation database</a>,
432            <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=PureSearch&db=pubmed&details_term=<%=pubMedId%>"
433              target="_new" title="External link to NCBI Entrez PubMed">NCBI Entrez PubMed</a>
434            <%
435          }
436          %>
437        </td>
438      </tr>
439      <tr>
440        <td class="prompt">Title</td>
441        <td><%=HTML.niceFormat(experiment.getTitle())%></td>
442      </tr>
443      <tr>
444        <td class="prompt">Publication date</td>
445        <td><%=dateFormatter.format(experiment.getPublicationDate())%></td>
446      </tr>
447      <tr>
448        <td class="prompt">Abstract</td>
449        <td><%=HTML.niceFormat(experiment.getAbstract())%></td>
450      </tr>
451      <tr>
452        <td class="prompt">Experiment design</td>
453        <td><%=HTML.niceFormat(experiment.getExperimentDesign())%></td>
454      </tr>
455      <tr>
456        <td class="prompt">Experiment type</td>
457        <td><%=HTML.niceFormat(experiment.getExperimentType())%></td>
458      </tr>
459      <tr>
460        <td class="prompt">Affiliations</td>
461        <td><%=HTML.niceFormat(experiment.getAffiliations())%></td>
462      </tr>
463      <tr>
464        <td class="prompt">Authors</td>
465        <td><%=HTML.niceFormat(experiment.getAuthors())%></td>
466      </tr>
467      <tr>
468        <td class="prompt">Publication</td>
469        <td><%=HTML.niceFormat(experiment.getPublication())%></td>
470      </tr>
471      </table>
472    </base:section>
473     
474      <%
475      ItemQuery<AnnotationType> efQuery = experiment.getExperimentalFactors();
476      efQuery.include(Include.ALL);
477      efQuery.order(Orders.asc(Hql.property("name")));
478      ItemResultList<AnnotationType> experimentalFactors = efQuery.list(dc);
479      if (experimentalFactors.size() == 0)
480      {
481        %>
482        <h4>Experimental factors</h4>
483        No experimental factors has been added to this experiment
484        (or, you don't have permission to view them).
485        <%
486      }
487      else
488      {
489        %>
490        <base:section 
491          id="experimentalFactors" 
492          title="<%="Experimental factors (" + experimentalFactors.size() +")"%>"
493          context="<%=cc%>"
494          >
495        <table border="0" cellspacing="0" cellpadding="0" style="width: 100%; max-width: 1000px;"><tr><td>
496        <tbl:table
497          id="experimentalFactors"
498          clazz="itemlist"
499          columns="all"
500          action="index.jsp"
501          >
502        <tbl:hidden name="item_id" value="<%=Integer.toString(itemId)%>" />
503        <tbl:columndef 
504          id="name"
505          title="Name"
506        />
507        <tbl:columndef
508          id="type"
509          title="Value type"
510        />
511        <tbl:columndef
512          id="values"
513          title="Used values"
514        />
515        <tbl:columndef 
516          id="description"
517          title="Description"
518        />
519        <tbl:columndef 
520          id="status"
521          title="Status"
522        />
523        <tbl:data>
524          <tbl:columns>
525          </tbl:columns>
526          <tbl:rows>
527          <%
528          for (AnnotationType item : experimentalFactors)
529          {
530            Type valueType = item.getValueType();
531            usedFactorValues.put(item, new HashSet<Object>());
532            factorValuesCount.put(item, 0);
533            Formatter formatter = FormatterFactory.getTypeFormatter(sc, valueType);
534            %>
535            <tbl:row>
536              <tbl:cell column="name"><base:icon 
537                  image="deleted.gif" 
538                  tooltip="This item has been scheduled for deletion" 
539                  visible="<%=item.isRemoved()%>"
540                /><%=Base.getLinkedName(ID, item, false, true)%></tbl:cell>
541              <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
542              <tbl:cell column="type">
543                <%=valueType%>
544                <%=item.isEnumeration() ? "(enumeration)" : ""%>
545              </tbl:cell>
546              <tbl:cell column="values">
547                <%
548                if (!item.isEnumeration() && (valueType == Type.TEXT || valueType == Type.STRING))
549                {
550                  %>
551                  N/A
552                  <%
553                }
554                else
555                {
556                  %>
557                  <div id="usedvalues.<%=item.getId()%>">Loading...</div>
558                  <%
559                }
560                %>
561              </tbl:cell>
562              <tbl:cell column="status" id="<%="status." + item.getId()%>">
563              </tbl:cell>
564            </tbl:row>
565            <%
566          }
567          %>
568          </tbl:rows>
569        </tbl:data>
570        </tbl:table>
571        <div align="right" id="warning.missing" style="display: none;">
572          <base:icon image="warning.gif" /> = Some raw bioassays are missing this factor value<br>
573          <base:icon image="ok.gif" /> = All raw bioassays have a value for this factor
574        </div>
575        </td></tr></table>
576        </base:section>
577        <%
578      }
579      %>
580      <%
581      ItemQuery<RawBioAssay> rbaQuery = experiment.getRawBioAssays();
582      rbaQuery.include(Include.ALL);
583      rbaQuery.order(Orders.asc(Hql.property("name")));
584      ItemResultList<RawBioAssay> rawBioAssays = rbaQuery.list(dc);
585      if (rawBioAssays.size() == 0)
586      {
587        %>
588        <h4>Raw bioassays</h4>
589        No raw bioassays has been added to this experiment
590        (or, you don't have permission to view them).
591        <%
592      }
593      else
594      {
595        %>
596        <base:section 
597          id="rawbioassays" 
598          title="<%="Raw bioassays (" + rawBioAssays.size() +")"%>"
599          context="<%=cc%>">
600        <tbl:table
601          id="rawbioassays"
602          clazz="itemlist"
603          columns="all"
604          >
605        <tbl:columndef 
606          id="name"
607          title="Name"
608        />
609        <tbl:columndef 
610          id="description"
611          title="Description"
612        />
613        <%
614        for (AnnotationType at : experimentalFactors)
615        {
616          Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
617          %>
618          <tbl:columndef
619            id="<%="at"+at.getId()%>"
620            title="<%=HTML.encodeTags(at.getName())%>"
621            formatter="<%=formatter%>"
622          />
623          <%
624        }
625        %>
626        <tbl:data>
627          <tbl:columns>
628          </tbl:columns>
629          <tbl:rows>
630          <%
631          SnapshotManager manager = new SnapshotManager();
632          AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter();
633          for (RawBioAssay item : rawBioAssays)
634          {
635            AnnotationSet as = item.isAnnotated() ? item.getAnnotationSet() : null;
636            AnnotationSetSnapshot snapshot = as == null ? null : manager.getSnapshot(dc, as.getId());
637            %>
638            <tbl:row>
639              <tbl:cell column="name"><base:icon 
640                  image="deleted.gif" 
641                  tooltip="This item has been scheduled for deletion" 
642                  visible="<%=item.isRemoved()%>"
643                /><%=Base.getLinkedName(ID, item, false, true)%></tbl:cell>
644              <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
645              <%
646              for (AnnotationType at : experimentalFactors)
647              {
648                Unit unit = at.getDefaultUnit();
649                String unitSymbol = unit == null ? "" : "&nbsp;" + unit.getDisplaySymbol();
650               
651                String value = "<i>- none -</i>";
652                annotationTypeFilter.setAnnotationType(at);
653                List<AnnotationSnapshot> all = snapshot == null ? 
654                    null : manager.findAnnotations(dc, snapshot, annotationTypeFilter, true);
655                Map<Annotatable, List> factorValues = new HashMap<Annotatable, List>();
656                if (all != null && all.size() > 0)
657                {
658                  for (AnnotationSnapshot a : all)
659                  {
660                    List values = a.getValues();
661                    usedFactorValues.get(at).addAll(values);
662                    factorValuesCount.put(at, factorValuesCount.get(at)+1);
663                    Annotatable aItem = null;
664                    try
665                    {
666                      aItem = a.getItem(dc);
667                    }
668                    catch (Throwable t)
669                    {}
670                    List toAdd = factorValues.get(aItem);
671                    if (toAdd == null)
672                    {
673                      toAdd = new LinkedList();
674                      factorValues.put(aItem, toAdd);
675                    }
676                    toAdd.addAll(values);
677                  }
678                }
679                %>
680                <tbl:cell column="<%="at"+at.getId()%>"
681                  >
682                  <%
683                  for (Map.Entry<Annotatable, List> entry : factorValues.entrySet())
684                  {
685                    Annotatable aItem = entry.getKey();
686                    List values = entry.getValue();
687                    %>
688                    <tbl:cellvalue list="<%=values%>" suffix="<%=unitSymbol%>"/>
689                    <%
690                    if (aItem != null && aItem.hasPermission(Permission.WRITE))
691                    {
692                      %>: <base:icon image="edit.gif" 
693                        onclick="<%="editAnnotation('"+aItem.getType().name()+"',"+aItem.getId()+","+at.getId()+")"%>" 
694                        tooltip="Modify the values of this experimental factor" />
695                      <%
696                    }
697                  }
698                  %>
699                </tbl:cell>
700                <%
701              }
702              %>
703            </tbl:row>
704            <%
705          }
706          %>
707          </tbl:rows>
708        </tbl:data>
709        </tbl:table>
710        </base:section>
711        <%
712      }
713      %>
714      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
715        <jsp:param name="ID" value="<%=ID%>" />
716        <jsp:param name="item_type" value="<%=itemType.name()%>" />
717        <jsp:param name="item_id" value="<%=itemId%>" />
718        <jsp:param name="title" value="Other items related to this experiment" />
719      </jsp:include>
720      <%
721      // Tables with users/groups/projects that this item is shared to
722      MultiPermissions mp = new MultiPermissions(Collections.singleton(experiment));
723      ItemResultIterator<User> users = mp.getUsers().iterate(dc);
724      ItemResultIterator<Group> groups = mp.getGroups().iterate(dc);
725      ItemResultIterator<Project> projects = mp.getProjects().iterate(dc);
726     
727      if (users.hasNext() || groups.hasNext() || projects.hasNext())
728      {
729        %>
730        <base:section 
731          id="sharedTo" 
732          title="Shared to"
733          context="<%=cc%>">
734        <tbl:table 
735          id="itemsSharedTo"
736          clazz="itemlist"
737          columns="all"
738        >
739          <tbl:columndef 
740            id="itemType"
741            title="Item type"
742          />
743          <tbl:columndef 
744            id="name"
745            title="Name"
746          />
747          <tbl:columndef 
748            id="permissions"
749            title="Permissions"
750          />
751          <tbl:data>
752            <tbl:columns>
753            </tbl:columns>
754            <tbl:rows>
755            <%
756            while(projects.hasNext())
757            {
758              Project project = projects.next();
759              Set<Permission> permissions = mp.getPermissions(project).values().iterator().next();
760              %>     
761              <tbl:row>
762                <tbl:cell column="itemType"><%=project.getType()%></tbl:cell>
763                <tbl:cell column="name"><base:icon 
764                  image="deleted.gif" 
765                  tooltip="This item has been scheduled for deletion" 
766                  visible="<%=project.isRemoved()%>"
767                /><%=Base.getLinkedName(ID, project, false, true)%></tbl:cell>
768                <tbl:cell column="permissions">
769                  <%=PermissionUtil.translatePermissionsToString(permissions)%>
770                </tbl:cell>
771              </tbl:row>
772              <%
773            }
774            while(groups.hasNext())
775            {
776              Group group = groups.next();
777              Set<Permission> permissions = mp.getPermissions(group).values().iterator().next();
778              %>
779              <tbl:row>             
780                <tbl:cell column="itemType"><%=group.getType()%></tbl:cell>
781                <tbl:cell column="name"><base:icon 
782                  image="deleted.gif" 
783                  tooltip="This item has been scheduled for deletion" 
784                  visible="<%=group.isRemoved()%>"
785                /><%=Base.getLinkedName(ID, group, false, true)%></tbl:cell>
786                <tbl:cell column="permissions">
787                  <%=PermissionUtil.translatePermissionsToString(permissions)%>
788                </tbl:cell>
789              </tbl:row>
790              <% 
791            }
792            while (users.hasNext())
793            {
794              User user = users.next();
795              Set<Permission> permissions = mp.getPermissions(user).values().iterator().next();
796              %>
797              <tbl:row>             
798                <tbl:cell column="itemType"><%=user.getType()%></tbl:cell>
799                <tbl:cell column="name"><base:icon 
800                  image="deleted.gif" 
801                  tooltip="This item has been scheduled for deletion" 
802                  visible="<%=user.isRemoved()%>"
803                /><%=Base.getLinkedName(ID, user, false, true)%></tbl:cell>
804                <tbl:cell column="permissions">
805                  <%=PermissionUtil.translatePermissionsToString(permissions)%>
806                </tbl:cell>
807              </tbl:row>
808              <%
809            }
810            %>
811            </tbl:rows>
812          </tbl:data>
813        </tbl:table>
814        </base:section>
815        <%
816      }
817      else
818      {
819        %>
820        <h4>Shared to</h4>
821        This experiment is not shared
822        (or, you don't have permission to view the ones it is shared to).
823        <%
824      }
825      %>
826    </div>
827   
828    <script language="JavaScript">
829    function initUsedFactorValues()
830    {
831      <%
832      int numRawBioAssays = rawBioAssays.size();
833      for (Map.Entry<AnnotationType, Set<Object>> entry : usedFactorValues.entrySet())
834      {
835        AnnotationType at = entry.getKey();
836        int numRawBioAssaysWithFactor = factorValuesCount.get(at);
837        Type valueType = at.getValueType();
838        if (at.isEnumeration() || (valueType != Type.TEXT && valueType != Type.STRING))
839        {
840          Set<Object> values = entry.getValue();
841          Formatter formatter = FormatterFactory.getTypeFormatter(sc, valueType);
842          Unit unit = at.getDefaultUnit();
843          if (unit != null) formatter = unit.getFormatter(formatter);
844          String formattedValues = HTML.encodeTags(Values.getString(values, ", ", true, formatter));
845          %>
846          setUsedFactorValue(<%=at.getId()%>, '<%=HTML.javaScriptEncode(formattedValues)%>');
847          <%
848        }
849        %>
850        showStatus(<%=at.getId()%>, <%=numRawBioAssays%>, <%=numRawBioAssaysWithFactor%>);
851        <%
852      }
853      %>
854    }
855    </script>
856      </t:tab>
857     
858      <t:tab id="bioassaysets" title="Bioassay sets" />
859      <t:tab id="overview" title="Overview" 
860        tooltip="Display a tree overview of related items">
861        <%
862        if ("overview".equals(tab))
863        {
864          %>
865          <jsp:include page="../../common/overview/overview.jsp">
866            <jsp:param name="item_type" value="<%=itemType.name()%>" />
867            <jsp:param name="item_id" value="<%=itemId%>" />
868            <jsp:param name="ID" value="<%=ID%>" />
869          </jsp:include>
870          <%
871        }
872        %>
873      </t:tab>     
874      <t:tab id="history" title="Change history" 
875        tooltip="Displays a log of all modifications made to this item"
876        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
877        <%
878        if ("history".equals(tab))
879        {
880          %>
881          <jsp:include page="../../common/history/frameset.jsp">
882            <jsp:param name="source_type" value="<%=itemType.name()%>" />
883            <jsp:param name="source_id" value="<%=itemId%>" />
884            <jsp:param name="ID" value="<%=ID%>" />
885          </jsp:include>
886          <%
887        }
888        %>
889      </t:tab>
890      </t:tabcontrol>
891
892  </base:body>
893  </base:page>
894  <%
895}
896finally
897{
898  if (dc != null) dc.close();
899}
900
901%>
Note: See TracBrowser for help on using the repository browser.