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

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

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

Added a reporter cloning plug-in and buttons in the gui for starting it and for removing the cloned table. The gui probaby need some improvements and it should be possible to get more information about the cloned reporters...

Added permission checks in the ReporterCloneBatcher.

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