source: branches/3.4-stable/www/views/experiments/bioassaysets/analysis_tree.jsp @ 6711

Last change on this file since 6711 was 6711, checked in by Nicklas Nordborg, 7 years ago

Fixes #1916: List pages are loading annotations for non-visible columns

Moved the call to loader.find(snapshot) inside the <tbl:cell> tag which means that it is only executed for visible columns.

Bad news is that this change conflicts with #1906 ([6690] and others) so merging to trunk will require some extra work.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 30.3 KB
Line 
1<%-- $Id: analysis_tree.jsp 6711 2015-02-03 08:23:37Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Jari Häkkinen, Nicklas Nordborg
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.BasicItem"
32  import="net.sf.basedb.core.Experiment"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.Transformation"
35  import="net.sf.basedb.core.ExtraValue"
36  import="net.sf.basedb.core.ExtraValueType"
37  import="net.sf.basedb.core.AnnotationSet"
38  import="net.sf.basedb.core.AnnotationType"
39  import="net.sf.basedb.core.Annotation"
40  import="net.sf.basedb.core.Job"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.Nameable"
43  import="net.sf.basedb.core.ItemResultIterator"
44  import="net.sf.basedb.core.ItemResultList"
45  import="net.sf.basedb.core.Permission"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.PluginConfiguration"
48  import="net.sf.basedb.core.PermissionDeniedException"
49  import="net.sf.basedb.core.query.Restrictions"
50  import="net.sf.basedb.core.query.Expressions"
51  import="net.sf.basedb.core.query.Orders"
52  import="net.sf.basedb.core.query.Hql"
53  import="net.sf.basedb.core.query.Restrictions"
54  import="net.sf.basedb.core.plugin.GuiContext"
55  import="net.sf.basedb.core.plugin.Plugin"
56  import="net.sf.basedb.core.snapshot.AnnotationLoaderUtil"
57  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
58  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
59  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
60  import="net.sf.basedb.core.snapshot.SnapshotManager"
61  import="net.sf.basedb.util.Tree"
62  import="net.sf.basedb.util.Enumeration"
63  import="net.sf.basedb.clients.web.Base"
64  import="net.sf.basedb.clients.web.ModeInfo"
65  import="net.sf.basedb.clients.web.util.HTML"
66  import="net.sf.basedb.util.Values"
67  import="net.sf.basedb.util.formatter.Formatter"
68  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
69  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
70  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction"
71  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
72  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
73  import="net.sf.basedb.clients.web.extensions.JspContext"
74  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
75  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
76  import="net.sf.basedb.util.extensions.Renderer"
77  import="java.util.Date"
78  import="java.util.List"
79  import="java.util.ArrayList"
80  import="java.util.LinkedList"
81  import="java.util.Map"
82  import="java.util.HashMap"
83  import="java.util.Iterator"
84  import="java.util.Collection"
85  import="org.json.simple.JSONObject"
86  import="org.json.simple.JSONArray"
87%>
88<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
89<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
90<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
91<%!
92  private static final Item itemType = Item.BIOASSAYSET;
93  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
94%>
95<%!
96
97private static void addToTree(Tree<BasicItem> tree, BioAssaySet bas)
98{
99  if (!tree.contains(bas))
100  {
101    Transformation transformation = bas.getTransformation();
102    Tree.Entry<BasicItem> parent = tree.getEntry(transformation);
103    if (parent == null) 
104    {
105      addToTree(tree, transformation);
106      parent = tree.getEntry(transformation);
107    }
108    Tree.Entry<BasicItem> basEntry = parent.addChild(bas);
109    for (ExtraValue xv : bas.getExtraValues().list(bas.getDbControl())) 
110    {
111      basEntry.addChild(xv);
112    }
113  }
114}
115
116private static void addToTree(Tree<BasicItem> tree, Transformation transformation)
117{
118  if (!tree.contains(transformation))
119  {
120    BioAssaySet source = transformation.getSource();
121    Tree.Entry<BasicItem> parent = tree.getEntry(source);
122    if (parent == null) 
123    {
124      addToTree(tree, source);
125      parent = tree.getEntry(source);
126    }
127    parent.addChild(transformation);
128  }
129}
130
131private static Tree<BasicItem> getAnalysisTree(DbControl dc, ItemQuery<BioAssaySet> bioAssaySetQuery, ItemQuery<Transformation> transformationQuery)
132{
133  Tree<BasicItem> tree = new Tree<BasicItem>(null);
134  ItemResultList<BioAssaySet> allBioAssaySets = bioAssaySetQuery.list(dc);
135  List<Integer> ids = new ArrayList<Integer>(allBioAssaySets.size());
136 
137  for (BioAssaySet bas : allBioAssaySets)
138  {
139    addToTree(tree, bas);
140    ids.add(bas.getId());
141  }
142 
143  transformationQuery.restrict(
144    Restrictions.in(
145      Hql.property("source.id"), 
146      Expressions.parameter("bioAssaySets", ids)
147    )
148  );
149  ItemResultList<Transformation> allTransformations = transformationQuery.list(dc);
150  for (Transformation t: allTransformations)
151  {
152    addToTree(tree, t);
153  }
154  return tree;
155}
156
157JSONArray generateSubTree(JSONObject jsonParent, BasicItem parent, Tree<BasicItem> tree, Collection<String> closed)
158{
159  JSONArray json = new JSONArray();
160 
161  Tree.Entry<BasicItem> parentEntry = tree.getEntry(parent);
162  if (parentEntry == null) return json;
163 
164  if (jsonParent == null && parent != null)
165  {
166    Item parentType = parent.getType();
167    if (parentType == Item.BIOASSAYSET)
168    {
169      jsonParent = newJoustBioAssaySet(null, (BioAssaySet)parent, true);
170    }
171    else if (parentType == Item.TRANSFORMATION)
172    {
173      jsonParent = newJoustTransformation(null, (Transformation)parent, true);
174    }
175    if (jsonParent != null) 
176    {
177      jsonParent.put("noOutlineIcon", 1);
178      json.add(jsonParent);
179    }
180  }
181 
182  List<Tree.Entry<BasicItem>> children = parentEntry.getChildren();
183  if (children != null)
184  {
185    for (Tree.Entry<BasicItem> childEntry : children)
186    {
187      BasicItem child = childEntry.getNode();
188      Item childType = child.getType();
189      JSONObject jsonChild = null;
190      String var = childType.name() + "_" + child.getId();
191      boolean isOpen = (closed == null || !closed.contains(var)) && childEntry.getNumChildren() > 0;
192      if (childType == Item.BIOASSAYSET)
193      {
194        jsonChild = newJoustBioAssaySet(jsonParent, (BioAssaySet)child, isOpen);
195      }
196      else if (childType == Item.TRANSFORMATION)
197      {
198        jsonChild = newJoustTransformation(jsonParent, (Transformation)child, isOpen);
199      }
200      else if (childType == Item.EXTRAVALUE)
201      {
202        jsonChild = newJoustExtraValue(jsonParent, (ExtraValue)child, isOpen);
203      }
204      if (jsonParent == null) json.add(jsonChild);
205      generateSubTree(jsonChild, child, tree, closed);
206    }
207  }
208  return json;
209}
210
211
212JSONObject newJoustBioAssaySet(JSONObject jsonParent, BioAssaySet bas, boolean open)
213{
214  String id = "BIOASSAYSET_"+bas.getId();
215  String name = bas.getName();
216  String icon = "BioAssaySet";
217 
218  JSONObject json = newJoustEntry(jsonParent, icon, HTML.encodeTags(name), id);
219  json.put("type", "bioassayset");
220  json.put("isOpen", open ? 1 : 0);
221  return json;
222}
223
224JSONObject newJoustTransformation(JSONObject jsonParent, Transformation t, boolean open)
225{
226  String id = "TRANSFORMATION_"+t.getId();
227  String name = t.getName();
228  String icon = "Transformation";
229  try
230  {
231    if (t.getJob().getPluginDefinition().supports("net.sf.basedb.core.plugin.AnalysisFilterPlugin"))
232    {
233      icon = "Filter";
234    }
235  }
236  catch (Throwable tt)
237  {}
238 
239  JSONObject json = newJoustEntry(jsonParent, icon, HTML.encodeTags(name), id);
240  json.put("type", "transformation");
241  json.put("isOpen", open ? 1 : 0);
242  return json;
243}
244
245JSONObject newJoustExtraValue(JSONObject jsonParent, ExtraValue ev, boolean open)
246{
247  String id = "EXTRAVALUE_"+ev.getId();
248  String name = ev.getValueType().toString();
249  String icon = "ExtraValue";
250 
251  try
252  {
253    name = ev.getExtraValueType().getName();
254  }
255  catch (PermissionDeniedException ex)
256  {}
257 
258  JSONObject json = newJoustEntry(jsonParent, icon, HTML.encodeTags(name), id);
259  json.put("type", "extra-value");
260  json.put("isOpen", open ? 1 : 0);
261  return json;
262}
263
264JSONObject newJoustEntry(JSONObject jsonParent, String icon, String text, String id)
265{
266  JSONObject jsonJoust = new JSONObject();
267  jsonJoust.put("icon", icon);
268  jsonJoust.put("text", text);
269  jsonJoust.put("id", id);
270  if (jsonParent != null)
271  {
272    JSONArray jsonChildren = (JSONArray)jsonParent.get("children");
273    if (jsonChildren == null)
274    {
275      jsonChildren = new JSONArray();
276      jsonParent.put("children", jsonChildren);
277      jsonParent.remove("isLazy");
278    }
279    jsonChildren.add(jsonJoust);
280  }
281  return jsonJoust;
282}
283%>
284<%
285final int experimentId = Values.getInt(request.getParameter("experiment_id"));
286final int bioAssaySetId = Values.getInt(request.getParameter("item_id"));
287final int transformationId = Values.getInt(request.getParameter("transformation_id"));
288final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
289final String ID = sc.getId();
290final String rootPath = request.getContextPath()+"/";
291final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
292final ItemContext tc = sc.getCurrentContext(Item.TRANSFORMATION);
293final ItemContext xvc = sc.getCurrentContext(Item.EXTRAVALUE);
294
295final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
296final String callback = request.getParameter("callback");
297final String title = mode.generateTitle("bioassay set", "bioassay sets");
298final DbControl dc = sc.newDbControl();
299Tree<BasicItem> analysisTree = null;
300List<AnnotationLoaderUtil> annotationLoaders = new ArrayList<AnnotationLoaderUtil>();
301try
302{
303  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
304  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
305  SnapshotManager manager = new SnapshotManager();
306  for (AnnotationType at : annotationTypeQuery.list(dc))
307  {
308    annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at));
309  }
310  final Experiment experiment = Experiment.getById(dc, experimentId);
311  final BasicItem root = transformationId == 0 ? 
312      (bioAssaySetId == 0 ? null : BioAssaySet.getById(dc, bioAssaySetId))
313      : Transformation.getById(dc, transformationId);
314  final boolean createPermission = experiment.hasPermission(Permission.USE);
315  final boolean deletePermission = createPermission;
316  final boolean writePermission = createPermission;
317
318  final ItemQuery<Transformation> transformationQuery = experiment.getTransformations();
319  transformationQuery.include(cc.getInclude());
320  transformationQuery.setFirstResult(0);
321  transformationQuery.setMaxResults(-1);
322  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
323  try
324  {
325    final ItemQuery<BioAssaySet> query = Base.getConfiguredQuery(dc, cc, true, experiment.getBioAssaySets(), mode);
326    query.setFirstResult(0);
327    query.setMaxResults(-1);
328    analysisTree = getAnalysisTree(dc, query, transformationQuery);
329  }
330  catch (Throwable t)
331  {
332    cc.setMessage(t.getMessage());
333    t.printStackTrace();
334  }
335  // Contains the ID:s of the bioassaysets that are closed in the tree
336  Collection<String> closed = (Collection<String>)cc.getObject("closed");
337  int numListed = 0;
338 
339  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
340    guiContext, root == null ? experiment : root);
341  ExtensionsInvoker toolsInvoker = ExtensionsControl.useExtensions(jspContext, 
342      "net.sf.basedb.clients.web.bioassayset.list.tools");
343  ExtensionsInvoker toolbarInvoker = ToolbarUtil.useExtensions(jspContext);
344  ExtensionsInvoker columnsInvoker = ListColumnUtil.useExtensions(jspContext);
345 
346  JSONArray json = generateSubTree(null, root, analysisTree, closed);
347  %>
348  <base:page type="include">
349  <base:head scripts="joust-2.js,/views/experiments/bioassaysets/analysis_tree.js" />
350  <base:body>
351    <ext:scripts context="<%=jspContext%>" />
352    <ext:stylesheets context="<%=jspContext%>" />
353   
354    <div id="tree-data" class="datacontainer"
355      data-experiment-id="<%=experimentId%>"
356      data-bioassayset-id="<%=bioAssaySetId%>"
357      data-transformation-id="<%=transformationId %>"
358      data-joust-tree="<%=HTML.encodeTags(json.toJSONString()) %>"
359    ></div>
360   
361    <tbl:table 
362      id="bioAssaySets" 
363      columns="<%=cc.getSetting("columns")%>"
364      sortby="<%=cc.getSortProperty()%>" 
365      direction="<%=cc.getSortDirection()%>"
366      action="<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>"
367      sc="<%=sc%>"
368      item="<%=itemType%>"
369      subclass="<%=root == null ? "fulltable" : "" %>"
370      >
371      <tbl:hidden 
372        name="mode" 
373        value="<%=mode.getName()%>" 
374      />
375      <tbl:hidden 
376        name="experiment_id" 
377        value="<%=String.valueOf(experimentId)%>" 
378      />
379      <tbl:hidden 
380        name="item_id" 
381        value="<%=String.valueOf(bioAssaySetId)%>"
382        skip="<%=bioAssaySetId == 0%>"
383      />
384      <tbl:hidden 
385        name="transformation_id" 
386        value="<%=String.valueOf(transformationId)%>"
387        skip="<%=transformationId == 0%>"
388      />
389      <tbl:hidden 
390        name="callback" 
391        value="<%=callback%>" 
392        skip="<%=callback == null%>" 
393      />
394      <tbl:hidden
395        name="closed"
396        value="<%=closed == null ? "," : ","+Values.getString(closed, ",", true)+","%>"
397      />
398      <tbl:columndef 
399        id="name"
400        property="name"
401        datatype="string"
402        title="Name"
403        sortable="true" 
404        filterable="true"
405        exportable="true"
406        show="always" 
407      />
408      <tbl:columndef 
409        id="spots"
410        property="numSpots"
411        datatype="int"
412        title="Spots/Values in db"
413        sortable="true" 
414        filterable="true"
415        exportable="true"
416      />
417      <tbl:columndef 
418        id="reporters"
419        property="numReporters"
420        datatype="int"
421        title="Reporters in db"
422        sortable="true" 
423        filterable="true"
424        exportable="true"
425      />
426      <tbl:columndef 
427        id="fileSpots"
428        property="numFileSpots"
429        datatype="int"
430        title="Spots/Values in file"
431        sortable="true" 
432        filterable="true"
433        exportable="true"
434      />
435      <tbl:columndef 
436        id="fileReporters"
437        property="numFileReporters"
438        datatype="int"
439        title="Reporters in file"
440        sortable="true" 
441        filterable="true"
442        exportable="true"
443      />
444      <tbl:columndef 
445        id="date"
446        property="transformation.job.ended"
447        datatype="timestamp"
448        title="Date"
449        sortable="true" 
450        filterable="true"
451        exportable="true"
452      />
453      <tbl:columndef 
454        id="plugin"
455        property="transformation.job.pluginDefinition.name"
456        datatype="string"
457        title="Plugin"
458        sortable="true" 
459        filterable="true"
460        exportable="true"
461      />
462      <tbl:columndef 
463        id="description"
464        property="description"
465        datatype="string"
466        title="Description" 
467        sortable="true" 
468        filterable="true" 
469        exportable="true"
470      />
471      <%
472      for (AnnotationLoaderUtil loader : annotationLoaders)
473      {
474        AnnotationType at = loader.getAnnotationType();
475        Enumeration<String, String> annotationEnum = null;
476        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
477        if (at.isEnumeration())
478        {
479          annotationEnum = new Enumeration<String, String>();
480          List<?> values = at.getValues();
481          for (Object value : values)
482          {
483            String encoded = formatter.format(value);
484            annotationEnum.add(encoded, encoded);
485          }
486        }
487        %>
488        <tbl:columndef 
489          id="<%="at"+at.getId()%>"
490          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
491          property="<%="#"+at.getId()%>"
492          annotation="true"
493          datatype="<%=at.getValueType().getStringValue()%>"
494          enumeration="<%=annotationEnum%>"
495          smartenum="<%=at.getDisplayAsList() %>"
496          sortable="<%=at.getMultiplicity() == 1%>" 
497          filterable="true" 
498          exportable="true"
499          formatter="<%=formatter%>"
500          unit="<%=at.getDefaultUnit()%>"
501        />
502        <%
503      }
504      %>
505      <tbl:columndef 
506        id="tools"
507        title="Tools" 
508      />
509      <tbl:columndef 
510        id="xt-columns" 
511        extensions="<%=columnsInvoker%>" 
512        jspcontext="<%=jspContext%>" 
513      />
514
515      <div class="panelgroup">
516      <tbl:toolbar
517        visible="<%=mode.hasToolbar()%>"
518        subclass="<%=root == null ? "bottomborder" : "topborder leftborder rightborder" %>"
519        >
520        <tbl:button 
521          id="btnNewRootBioAssaySet"
522          disabled="<%=!createPermission%>" 
523          image="new.png" 
524          title="New root bioassay set&hellip;" 
525          tooltip="<%=createPermission ? "Create a new root bioassay set" : "You do not have permission to create bioassay sets"%>" 
526          visible="<%=root == null && pluginCount.containsKey(Plugin.MainType.INTENSITY)%>"
527        />
528        <tbl:button 
529          id="btnDeleteTreeItems"
530          disabled="<%=!deletePermission%>" 
531          image="delete.png" 
532          title="Delete"
533          tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete items"%>" 
534        />
535        <tbl:button 
536          id="btnRestoreTreeItems"
537          disabled="<%=!writePermission%>" 
538          image="restore.png" 
539          title="Restore"
540          tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to restore items"%>" 
541        />
542        <tbl:button 
543          id="btnTreeColumns"
544          image="columns.png" 
545          title="Columns&hellip;" 
546          tooltip="Show, hide and re-order columns" 
547        />
548        <tbl:button 
549          id="btnTreeImport"
550          data-plugin-type="IMPORT"
551          image="import.png" 
552          title="Import&hellip;" 
553          tooltip="Import data" 
554          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
555        />
556        <tbl:button 
557          id="btnTreeExport"
558          data-plugin-type="EXPORT"
559          image="export.png" 
560          title="Export&hellip;" 
561          tooltip="Export data" 
562          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
563        />
564        <tbl:button 
565          id="btnTreeRunPlugin"
566          data-plugin-type="OTHER"
567          image="runplugin.png" 
568          title="Run plugin&hellip;" 
569          tooltip="Run a plugin" 
570          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
571        />
572        <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
573          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
574      </tbl:toolbar>
575      </div>
576      <tbl:data style="<%=root == null ? "top: 1.75em;" : "" %>">
577        <tbl:headers>
578          <tbl:headerrow>
579            <tbl:header colspan="3">
580            <tbl:presetselector 
581              style="border-right: 0px;"
582            />
583            </tbl:header>
584            <tbl:columnheaders />
585          </tbl:headerrow>
586          <tbl:headerrow>
587            <tbl:header subclass="index" />
588            <tbl:header 
589              subclass="check" 
590              visible="<%=mode.hasCheck()%>"
591              ><base:icon 
592                id="check.uncheck"
593                image="check_uncheck.png" 
594                tooltip="Check/uncheck all" 
595                 
596              /></tbl:header>
597            <tbl:header 
598              subclass="check" 
599              visible="<%=mode.hasRadio()%>"
600              />
601            <tbl:header 
602              subclass="icons" 
603              visible="<%=mode.hasIcons()%>"
604              />
605            <tbl:propertyfilter />
606          </tbl:headerrow>
607        </tbl:headers>
608        <tbl:rows>
609          <%
610          if (cc.getMessage() != null)
611          {
612            %>
613            <tbl:panel subclass="bg-filled-50">
614              <div class="messagecontainer error"><%=cc.getMessage()%></div>
615            </tbl:panel>
616            <%
617            cc.setMessage(null);
618          }
619          int index = cc.getPage()*cc.getRowsPerPage();
620          int selectedItemId = cc.getId();
621          if (analysisTree != null)
622          {           
623            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
624            while (baas.hasNext())
625            {
626              Tree.Entry<BasicItem> entry = baas.next();
627              BasicItem item = entry.getNode();
628              if (item != null)
629              {
630                int level = entry.getDepth() - 1;
631                int itemId = item.getId();
632                String joustId = item.getType().name() + "_" + itemId;
633               
634                boolean isVisible = true;
635                BasicItem parent = entry.getParent().getNode();
636                if (parent != null && closed != null)
637                {
638                  String parentId = parent.getType().name()+"_"+parent.getId();
639                  isVisible = !closed.contains(parentId);
640                  if (!isVisible) closed.add(joustId);
641                }
642                String name = "";
643                String description = "";
644                String tooltip = mode.isSelectionMode() ?
645                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
646                boolean removed = false;
647                Transformation t = null;
648                BioAssaySet bas = null;
649                ExtraValue xv = null;
650                PluginDefinition plugin = null;
651                Job job = null;
652                String prefix = "";
653                ItemContext ccc = null;
654                Item itemType = item.getType();
655                if (itemType == Item.TRANSFORMATION)
656                {
657                  t = (Transformation)item;
658                  removed = t.isRemoved();
659                  prefix = "T:";
660                  ccc = tc;
661                  name = HTML.encodeTags(t.getName());
662                  description = HTML.encodeTags(t.getDescription());
663                  try
664                  {
665                    job = t.getJob();
666                    plugin = job.getPluginDefinition();
667                  }
668                  catch (Throwable ex)
669                  {}
670                }
671                else if (itemType == Item.BIOASSAYSET)
672                {
673                  bas = (BioAssaySet)item;
674                  removed = bas.isRemoved();
675                  ccc = cc;
676                  name = HTML.encodeTags(bas.getName());
677                  description = HTML.encodeTags(bas.getDescription());
678                }
679                else if (itemType == Item.EXTRAVALUE)
680                {
681                  xv = (ExtraValue)item;
682                  prefix = "X:";
683                  removed = false;
684                  ccc = xvc;
685                  try
686                  {
687                    ExtraValueType xvType = xv.getExtraValueType();
688                    name = HTML.encodeTags(xvType.getName());
689                    description = HTML.encodeTags(xvType.getDescription());
690                  }
691                  catch (PermissionDeniedException ex)
692                  {
693                    name = xv.getValueType().toString();
694                    description = "";
695                  }
696                  try
697                  {
698                    job = xv.getJob();
699                    plugin = job.getPluginDefinition();
700                  }
701                  catch (Throwable ex)
702                  {}
703                }
704               
705                index++;
706                numListed++;
707                %>
708                <tbl:row
709                  id="<%="row."+joustId%>"
710                  style="<%=isVisible ? "" : "display: none;" %>"
711                  >
712                  <tbl:header 
713                    clazz="index"
714                    ><%=index%></tbl:header>
715                  <tbl:header 
716                    clazz="check" 
717                    visible="<%=mode.hasCheck()%>"
718                    ><input 
719                        type="checkbox" 
720                        name="<%=prefix+itemId%>" 
721                        value="<%=itemId%>" 
722                        title="<%=name%>" 
723                        <%=ccc.getSelected().contains(itemId) ? "checked" : ""%>
724                      ></tbl:header>
725                  <tbl:header 
726                    clazz="check" 
727                    visible="<%=mode.hasRadio()%>"
728                    ><input 
729                        type="radio" 
730                        name="item_id" 
731                        value="<%=itemId%>" 
732                        title="<%=name%>" 
733                        <%=selectedItemId == itemId ? "checked" : ""%>
734                      ></tbl:header>
735                  <tbl:header 
736                    clazz="icons" 
737                    visible="<%=mode.hasIcons()%>"
738                    ><base:icon 
739                      image="deleted.png"
740                      id="<%="delete."+itemId %>"
741                      subclass="<%=deletePermission ? "table-delete-item" : null %>"
742                      data-item-type="<%=itemType.name() %>"
743                      data-item-id="<%=itemId%>"
744                      data-notify="reloadOnNotify"
745                      tooltip="This item has been scheduled for deletion" 
746                      visible="<%=removed%>"
747                    />&nbsp;</tbl:header>
748                 
749                  <tbl:cell clazz="cell joust" column="name">
750                    <div id="<%=joustId%>" class="link auto-init"
751                      data-auto-init="item-link"
752                      data-item-type="<%=itemType.name() %>" 
753                      data-item-id="<%=itemId %>"
754                      data-no-edit="<%=writePermission ? 0 : 1 %>" 
755                      tabindex="0"
756                      title="<%=tooltip%>"><%=name%></div>
757                  </tbl:cell>
758                  <%
759                  if (t != null)
760                  {
761                    %>
762                    <tbl:cell column="spots">&nbsp;</tbl:cell>
763                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
764                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
765                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
766                    <tbl:cell column="tools" style="white-space: nowrap;">
767                      <%
768                      if (createPermission && job != null && plugin != null && plugin.isInteractive() && plugin.hasPermission(Permission.USE))
769                      {
770                        // User may not have permission to read plug-in configuration for job
771                        boolean copyTransformationAllowed = false;
772                        try
773                        {
774                          PluginConfiguration pluginConfig = job.getPluginConfiguration();
775                          if (pluginConfig == null || pluginConfig.hasPermission(Permission.USE))
776                          {
777                            copyTransformationAllowed = true;
778                          }
779                        }
780                        catch (Exception e)
781                        {}
782                        if (copyTransformationAllowed)
783                        {
784                          %>
785                          <base:icon 
786                            subclass="link auto-init"
787                            data-auto-init="copy-job"
788                            data-job-id="<%=job.getId() %>"
789                            image="copy.png" 
790                            tooltip="Copy this transformation"
791                          />
792                          <%
793                        }
794                      }
795                      %>
796                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
797                    </tbl:cell>
798                    <%
799                  }
800                  if (bas != null)
801                  {
802                    %>
803                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
804                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
805                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
806                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
807                    <tbl:cell column="date">&nbsp;</tbl:cell>
808                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
809                    <%
810                    if (bas.isAnnotated())
811                    {
812                      AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, bas.getAnnotationSet().getId());
813                      for (AnnotationLoaderUtil loader : annotationLoaders)
814                      {
815                        %>
816                        <tbl:cell 
817                          column="<%="at"+loader.getId()%>"
818                          ><%
819                          if (loader.find(snapshot)) 
820                          {
821                            %><tbl:cellvalue 
822                              list="<%=loader.getValues()%>"
823                              suffix="<%=loader.getUnitSymbol()%>"
824                            /><%
825                          }
826                          %></tbl:cell>
827                        <%
828                      }
829                    }
830                    %>
831                    <tbl:cell column="tools" style="white-space: nowrap;">
832                      <%
833                      if (bas.getNumSpots() > 0)
834                      {
835                        %>
836                        <base:icon 
837                          subclass="link auto-init"
838                          data-auto-init="bioassayset-plotter"
839                          data-item-id="<%=itemId %>"
840                          image="plotter.png" 
841                          tooltip="A simple plot tool"
842                        />
843                        <base:icon 
844                          subclass="link auto-init"
845                          data-auto-init="experiment-explorer"
846                          data-item-id="<%=itemId %>"
847                          image="explorer.png" 
848                          tooltip="Experiment explorer"
849                        />
850                        <%
851                      }
852                      %>
853                      <base:icon 
854                        subclass="link auto-init"
855                        data-auto-init="bioassayset-plugin"
856                        data-plugin-type="EXPORT"
857                        data-item-id="<%=itemId %>"
858                        image="export.png" 
859                        tooltip="Export data"
860                      />
861                      <%
862                      if (createPermission)
863                      {
864                        %>
865                        <base:icon 
866                          subclass="link auto-init"
867                          data-auto-init="bioassayset-plugin"
868                          data-plugin-type="ANALYZE"
869                          data-cmd="NewFilteredBioAssaySet"
870                          data-item-id="<%=itemId %>"
871                          image="filter.png" 
872                          tooltip="Create a filtered bioassay set"
873                        />
874                        <base:icon 
875                          subclass="link auto-init"
876                          data-auto-init="bioassayset-plugin"
877                          data-plugin-type="ANALYZE"
878                          data-item-id="<%=itemId %>"
879                          image="runplugin.png" 
880                          tooltip="Run an analysis plugin"
881                        />
882                        <%
883                      }
884                      %>
885                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
886                    </tbl:cell>
887                    <%
888                  }
889                  if (xv != null)
890                  {
891                    %>
892                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
893                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
894                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
895                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
896                    <tbl:cell column="tools" style="white-space: nowrap;">
897                      <%
898                      if (createPermission && job != null && plugin != null && plugin.isInteractive() && plugin.hasPermission(Permission.USE))
899                      {
900                        // User may not have permission to read plug-in configuration for job
901                        boolean copyTransformationAllowed = false;
902                        try
903                        {
904                          PluginConfiguration pluginConfig = job.getPluginConfiguration();
905                          if (pluginConfig == null || pluginConfig.hasPermission(Permission.USE))
906                          {
907                            copyTransformationAllowed = true;
908                          }
909                        }
910                        catch (Exception e)
911                        {}
912                        if (copyTransformationAllowed)
913                        {
914                          %>
915                          <base:icon 
916                            subclass="link auto-init"
917                            data-auto-init="copy-job"
918                            data-job-id="<%=job.getId() %>"
919                            image="copy.png" 
920                            tooltip="Copy this extra value"
921                          />
922                          <%
923                        }
924                      }
925                      %>
926                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
927                    </tbl:cell>
928                    <%
929                  }
930                  %>
931                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
932                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
933                  <tbl:cell column="description"><%=description%></tbl:cell>
934                  <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
935                    <tbl:cell column="xt-columns" />
936                  </tbl:xt-cells>
937                </tbl:row>
938                <%
939              }
940            }
941          }
942          if (numListed == 0)
943          {
944            %>
945            <tbl:panel subclass="bg-filled-50">
946              <div class="messagecontainer note">
947              No bioassay sets or transformations were found.
948              </div>
949            </tbl:panel>
950            <%
951          }
952          %>
953        </tbl:rows>
954      </tbl:data>
955    </tbl:table>
956
957    <div id="reloadOnNotify"></div>
958  </base:body>
959  </base:page>
960  <%
961}
962finally
963{
964  if (dc != null) dc.close();
965}
966%>
Note: See TracBrowser for help on using the repository browser.