source: trunk/www/views/experiments/rootrawbioassays/view_bioassay.jsp @ 6942

Last change on this file since 6942 was 6942, checked in by Nicklas Nordborg, 6 years ago

References #1941: Store experimental factor values as part experiments

Updated lists that display experimental factors so that they are able to handle inherited/cloned annotations correctly.

File size: 14.1 KB
Line 
1<%-- $Id: view_bioassay.jsp 6909 2015-05-18 06:48:30Z 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
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.RootRawBioAssay"
35  import="net.sf.basedb.core.Type"
36  import="net.sf.basedb.core.Unit"
37  import="net.sf.basedb.core.Annotatable"
38  import="net.sf.basedb.core.AnnotationSet"
39  import="net.sf.basedb.core.AnnotationType"
40  import="net.sf.basedb.core.Annotation"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.ItemResultList"
43  import="net.sf.basedb.core.Include"
44  import="net.sf.basedb.core.BaseException"
45  import="net.sf.basedb.core.PluginDefinition"
46  import="net.sf.basedb.core.ItemSubtype"
47  import="net.sf.basedb.core.Subtypable"
48  import="net.sf.basedb.core.PermissionDeniedException"
49  import="net.sf.basedb.core.Nameable"
50  import="net.sf.basedb.core.plugin.GuiContext"
51  import="net.sf.basedb.core.plugin.Plugin"
52  import="net.sf.basedb.core.query.Orders"
53  import="net.sf.basedb.core.query.Hql"
54  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
55  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
56  import="net.sf.basedb.core.snapshot.SnapshotManager"
57  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
58  import="net.sf.basedb.util.formatter.Formatter"
59  import="net.sf.basedb.util.units.UnitConverter"
60  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
61  import="net.sf.basedb.clients.web.Base"
62  import="net.sf.basedb.clients.web.PermissionUtil"
63  import="net.sf.basedb.clients.web.util.HTML"
64  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
65  import="net.sf.basedb.clients.web.extensions.JspContext"
66  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
67  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
68  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
69  import="net.sf.basedb.util.Values"
70  import="java.util.Map"
71  import="java.util.List"
72  import="java.util.HashMap"
73  import="java.util.LinkedList"
74  import="java.util.Date"
75%>
76<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
77<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
78<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
79<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
80<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
81<%!
82  private static final Item itemType = Item.ROOTRAWBIOASSAY;
83  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
84%>
85<%
86final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
87final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
88final int itemId = cc.getId();
89final String ID = sc.getId();
90final float scale = Base.getScale(sc);
91final String tabId = Values.getString(request.getParameter("tab"), "properties");
92final DbControl dc = sc.newDbControl();
93try
94{
95  RootRawBioAssay bioAssay = RootRawBioAssay.getById(dc, itemId);
96  Experiment experiment = bioAssay.getExperiment();
97  String title = null;
98 
99  ItemQuery<AnnotationType> efQuery = experiment.getExperimentalFactors();
100  efQuery.include(Include.ALL);
101  efQuery.order(Orders.asc(Hql.property("name")));
102  ItemResultList<AnnotationType> experimentalFactors = efQuery.list(dc);
103  SnapshotManager manager = new SnapshotManager();
104  AnnotationSetSnapshot snapshot = bioAssay.isAnnotated() ? 
105    manager.getSnapshot(dc, bioAssay.getAnnotationSet().getId()) : null;
106
107  final boolean writePermission = bioAssay.hasPermission(Permission.WRITE);
108  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
109  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioAssay);
110  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
111  %>
112  <base:page title="<%=title%>" id="view-page">
113  <base:head scripts="table.js,tabcontrol-2.js,~bioassays.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
114    <ext:scripts context="<%=jspContext%>" />
115    <ext:stylesheets context="<%=jspContext%>" />
116    <style>
117    .edit-experimental-factor
118    {
119      float: right;
120    }
121    </style>
122  </base:head>
123  <base:body>
124    <p:path><p:pathelement 
125      title="Experiments" href="<%="../index.jsp?ID="+ID%>" 
126      /><p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
127        href="<%="../index.jsp?ID="+ID+"&amp;cmd=ViewItem&amp;item_id="+experiment.getId()%>"
128      /><p:pathelement title="<%=HTML.encodeTags(bioAssay.getName())%>"
129      /></p:path>
130    <div id="page-data" data-item-id="<%=itemId%>"></div>
131
132    <t:tabcontrol 
133      id="main" 
134      subclass="content mastertabcontrol"
135      active="<%=tabId%>">
136    <t:tab id="properties" title="Properties">
137      <div>
138      <table class="fullform bottomborder">
139      <tr>
140        <th class="itemstatus">
141        </th>
142        <td style="padding: 0px;">
143          <tbl:toolbar subclass="bottomborder bg-filled-50">
144            <tbl:button 
145              id="btnEdit"
146              disabled="<%=!writePermission%>" 
147              image="edit.png" 
148              title="Edit&hellip;" 
149              tooltip="<%=writePermission ? "Edit this bioassay" : "You do not have permission to edit this bioassay"%>" 
150            />
151            <tbl:button 
152              id="btnImport"
153              image="import.png" 
154              data-plugin-type="IMPORT" 
155              title="Import&hellip;" 
156              tooltip="Import data" 
157              visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
158            />
159            <tbl:button 
160              id="btnExport"
161              image="export.png"
162              data-plugin-type="EXPORT" 
163              title="Export&hellip;" 
164              tooltip="Export data" 
165              visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
166            />
167            <tbl:button 
168              id="btnRunPlugin"
169              image="runplugin.png" 
170              data-plugin-type="OTHER" 
171              title="Run plugin&hellip;" 
172              tooltip="Run a plugin" 
173              visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
174            />
175            <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
176              wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
177            <tbl:button
178              image="help.png"
179              subclass="auto-init"
180              data-auto-init="help"
181              data-help-id="rootrawbioassay.view.properties"
182              title="Help&hellip;"
183              tooltip="Get help about this page"
184            />
185          </tbl:toolbar>
186        </td>
187      </tr>
188      <tr>
189        <th>Name</th>
190        <td><%=HTML.encodeTags(bioAssay.getName())%></td>
191      </tr>
192      <tr>
193        <th>Parent raw bioassay</th>
194        <td><base:propertyvalue item="<%=bioAssay%>" property="rawBioAssay" />
195      <tr>
196        <th>Description</th>
197        <td><%=HTML.encodeTags(bioAssay.getDescription())%></td>
198      </tr>
199      </table>
200      </div>
201
202      <base:section 
203        id="experimentalFactors" 
204        title="<%="Experimental factors (" + experimentalFactors.size() +")"%>"
205        context="<%=cc%>"
206        >
207        <%
208        if (experimentalFactors.size() == 0)
209        {
210          %>
211          <div class="messagecontainer note">
212          No experimental factors has been added to this experiment
213          (or, you don't have permission to view them).
214          </div>
215          <%
216        }
217        else
218        {
219          %>
220          <div style="width: 100%; max-width: 1000px;">
221          <tbl:table
222            id="tbl.experimentalFactors"
223            columns="all"
224            action="index.jsp"
225            >
226            <tbl:hidden name="item_id" value="<%=Integer.toString(itemId)%>" />
227            <tbl:columndef 
228              id="name"
229              title="Name"
230            />
231            <tbl:columndef
232              id="type"
233              title="Value type"
234            />
235            <tbl:columndef
236              id="values"
237              title="Values"
238            />
239            <tbl:columndef
240              id="item"
241              title="Parent item"
242            />
243            <tbl:columndef 
244              id="note"
245              title="Note"
246            />
247            <tbl:columndef 
248              id="description"
249              title="Description"
250            />
251            <tbl:data>
252              <tbl:headers>
253                <tbl:headerrow>
254                  <tbl:columnheaders />
255                </tbl:headerrow>
256              </tbl:headers>
257              <tbl:rows>
258              <%
259              AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter();
260              for (AnnotationType at : experimentalFactors)
261              {
262                Type valueType = at.getValueType();
263                annotationTypeFilter.setAnnotationType(at);
264                List<AnnotationSnapshot> all = snapshot == null ? 
265                    null : manager.findAnnotations(dc, snapshot, annotationTypeFilter, true);
266               
267                List<?> values = null;
268                Formatter formatter = FormatterFactory.getTypeFormatter(sc, valueType);
269                Nameable parentItem = null;
270                String parentType = "";
271                if (all != null && all.size() > 0)
272                {
273                  for (AnnotationSnapshot a : all)
274                  {
275                    Unit unit = a.getActualUnit(dc);
276                    UnitConverter converter = null;
277                    if (unit != null)
278                    {
279                      converter = unit.getUnitConverter(at.getDefaultUnit());
280                      formatter = unit.getFormatter(formatter);
281                    }
282                    values = a.getActualValues(converter, valueType);
283
284                    Date lastModified = a.getThisLastUpdate();
285                    boolean isUpToDate = true;
286                    AnnotationSnapshot inherited = a.getInheritedFrom();
287                    if (inherited != null)
288                    {
289                      parentType = inherited.getItemType().toString();
290                      if (lastModified == null)
291                      {
292                        lastModified = inherited.getThisLastUpdate();
293                      }
294                      else
295                      {
296                        isUpToDate = !lastModified.before(inherited.getThisLastUpdate());
297                      }
298                      try
299                      {
300                        parentItem = (Nameable)inherited.getThisItem(dc);
301                        if (parentItem instanceof Subtypable)
302                        {
303                          ItemSubtype subtype = ((Subtypable)parentItem).getItemSubtype();
304                          if (subtype != null) parentType = subtype.getName();
305                        }
306                      }
307                      catch (PermissionDeniedException ex)
308                      {}
309                    }
310                    %>
311                    <tbl:row>
312                      <tbl:cell column="name"><base:icon 
313                        image="deleted.png" 
314                        tooltip="This item has been scheduled for deletion" 
315                        visible="<%=at.isRemoved()%>"
316                        /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
317                      <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
318                      <tbl:cell column="type">
319                        <%=valueType%>
320                        <%=at.isEnumeration() ? "(enumeration)" : ""%>
321                      </tbl:cell>
322                      <tbl:cell column="values">
323                        <%=Values.getString(values, ", ", true, formatter)%>
324                        <base:icon id="<%=Integer.toString(a.getThisAnnotationId())%>"
325                          image="edit.png" subclass="edit-experimental-factor auto-init" data-auto-init="edit-experimental-factor"
326                          data-item-type="ROOTRAWBIOASSAY" 
327                          data-item-id="<%=itemId%>" 
328                          data-annotation-type-id="<%=at.getId()%>"
329                          data-annotation-id="<%=a.getThisAnnotationId()%>"
330                          tooltip="Edit this annotation" visible="<%=writePermission %>"/>
331                      </tbl:cell>
332                      <tbl:cell column="item">
333                        <%
334                        if (parentItem != null)
335                        {
336                          %>
337                          <%=Base.getLinkedName(ID, parentItem, false, true)%>
338                          <span class="itemsubtype">(<%=parentType%>)</span>
339                          <%
340                        }
341                        else if (a.getSource() == Annotation.Source.CLONED)
342                        {
343                          %>
344                          <i>- missing -</i>
345                          <%
346                        }
347                        %>
348                      </tbl:cell>
349                      <tbl:cell column="note"><%=a.getSource() == Annotation.Source.CLONED ? "Cloned" + (isUpToDate ? "; up-to-date" : "; modified") : "" %></tbl:cell>
350                    </tbl:row>
351                    <%
352                  }
353                }
354                else
355                {
356                  %>
357                  <tbl:row>
358                    <tbl:cell column="name"><base:icon 
359                      image="deleted.png" 
360                      tooltip="This item has been scheduled for deletion" 
361                      visible="<%=at.isRemoved()%>"
362                      /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
363                    <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
364                    <tbl:cell column="type">
365                      <%=valueType%>
366                      <%=at.isEnumeration() ? "(enumeration)" : ""%>
367                    </tbl:cell>
368                  </tbl:row>
369                  <%
370                }
371              }
372              %>
373              </tbl:rows>
374            </tbl:data>
375          </tbl:table>
376          <div id="warning.missing" style="display: none; text-align: right;">
377            <base:icon image="warning.png" /> = Some raw bioassays are missing this factor value
378          </div>
379        </div>
380        <%
381        }
382        %>
383      </base:section>
384
385    </t:tab>
386   
387    <t:tab id="annotations" title="Annotations" 
388      tooltip="View annotation values" clazz="white">
389      <jsp:include page="../../../common/annotations/list_frameset.jsp">
390        <jsp:param name="item_type" value="<%=itemType.name()%>" />
391        <jsp:param name="item_id" value="<%=itemId%>" />
392        <jsp:param name="ID" value="<%=ID%>" />
393      </jsp:include>
394    </t:tab>
395
396    </t:tabcontrol>
397
398  </base:body>
399  </base:page>
400  <%
401}
402finally
403{
404  if (dc != null) dc.close();
405}
406%>
Note: See TracBrowser for help on using the repository browser.