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

Last change on this file since 6780 was 6780, checked in by Nicklas Nordborg, 8 years ago

Fixes #1929: Add 'none' option in annotation filters

  • 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 6780 2015-03-18 06:53:09Z 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          if (!at.getDisplayAsList()) annotationEnum.add("", "-none-");
481          List<?> values = at.getValues();
482          for (Object value : values)
483          {
484            String encoded = formatter.format(value);
485            annotationEnum.add(encoded, encoded);
486          }
487        }
488        %>
489        <tbl:columndef 
490          id="<%="at"+at.getId()%>"
491          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
492          property="<%="#"+at.getId()%>"
493          annotation="true"
494          datatype="<%=at.getValueType().getStringValue()%>"
495          enumeration="<%=annotationEnum%>"
496          smartenum="<%=at.getDisplayAsList() %>"
497          sortable="<%=at.getMultiplicity() == 1%>" 
498          filterable="true" 
499          exportable="true"
500          formatter="<%=formatter%>"
501          unit="<%=at.getDefaultUnit()%>"
502        />
503        <%
504      }
505      %>
506      <tbl:columndef 
507        id="tools"
508        title="Tools" 
509      />
510      <tbl:columndef 
511        id="xt-columns" 
512        extensions="<%=columnsInvoker%>" 
513        jspcontext="<%=jspContext%>" 
514      />
515
516      <div class="panelgroup">
517      <tbl:toolbar
518        visible="<%=mode.hasToolbar()%>"
519        subclass="<%=root == null ? "bottomborder" : "topborder leftborder rightborder" %>"
520        >
521        <tbl:button 
522          id="btnNewRootBioAssaySet"
523          disabled="<%=!createPermission%>" 
524          image="new.png" 
525          title="New root bioassay set&hellip;" 
526          tooltip="<%=createPermission ? "Create a new root bioassay set" : "You do not have permission to create bioassay sets"%>" 
527          visible="<%=root == null && pluginCount.containsKey(Plugin.MainType.INTENSITY)%>"
528        />
529        <tbl:button 
530          id="btnDeleteTreeItems"
531          disabled="<%=!deletePermission%>" 
532          image="delete.png" 
533          title="Delete"
534          tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete items"%>" 
535        />
536        <tbl:button 
537          id="btnRestoreTreeItems"
538          disabled="<%=!writePermission%>" 
539          image="restore.png" 
540          title="Restore"
541          tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to restore items"%>" 
542        />
543        <tbl:button 
544          id="btnTreeColumns"
545          image="columns.png" 
546          title="Columns&hellip;" 
547          tooltip="Show, hide and re-order columns" 
548        />
549        <tbl:button 
550          id="btnTreeImport"
551          data-plugin-type="IMPORT"
552          image="import.png" 
553          title="Import&hellip;" 
554          tooltip="Import data" 
555          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
556        />
557        <tbl:button 
558          id="btnTreeExport"
559          data-plugin-type="EXPORT"
560          image="export.png" 
561          title="Export&hellip;" 
562          tooltip="Export data" 
563          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
564        />
565        <tbl:button 
566          id="btnTreeRunPlugin"
567          data-plugin-type="OTHER"
568          image="runplugin.png" 
569          title="Run plugin&hellip;" 
570          tooltip="Run a plugin" 
571          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
572        />
573        <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
574          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
575      </tbl:toolbar>
576      </div>
577      <tbl:data style="<%=root == null ? "top: 1.75em;" : "" %>">
578        <tbl:headers>
579          <tbl:headerrow>
580            <tbl:header colspan="3">
581            <tbl:presetselector 
582              style="border-right: 0px;"
583            />
584            </tbl:header>
585            <tbl:columnheaders />
586          </tbl:headerrow>
587          <tbl:headerrow>
588            <tbl:header subclass="index" />
589            <tbl:header 
590              subclass="check" 
591              visible="<%=mode.hasCheck()%>"
592              ><base:icon 
593                id="check.uncheck"
594                image="check_uncheck.png" 
595                tooltip="Check/uncheck all" 
596                 
597              /></tbl:header>
598            <tbl:header 
599              subclass="check" 
600              visible="<%=mode.hasRadio()%>"
601              />
602            <tbl:header 
603              subclass="icons" 
604              visible="<%=mode.hasIcons()%>"
605              />
606            <tbl:propertyfilter />
607          </tbl:headerrow>
608        </tbl:headers>
609        <tbl:rows>
610          <%
611          if (cc.getMessage() != null)
612          {
613            %>
614            <tbl:panel subclass="bg-filled-50">
615              <div class="messagecontainer error"><%=cc.getMessage()%></div>
616            </tbl:panel>
617            <%
618            cc.setMessage(null);
619          }
620          int index = cc.getPage()*cc.getRowsPerPage();
621          int selectedItemId = cc.getId();
622          if (analysisTree != null)
623          {           
624            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
625            while (baas.hasNext())
626            {
627              Tree.Entry<BasicItem> entry = baas.next();
628              BasicItem item = entry.getNode();
629              if (item != null)
630              {
631                int level = entry.getDepth() - 1;
632                int itemId = item.getId();
633                String joustId = item.getType().name() + "_" + itemId;
634               
635                boolean isVisible = true;
636                BasicItem parent = entry.getParent().getNode();
637                if (parent != null && closed != null)
638                {
639                  String parentId = parent.getType().name()+"_"+parent.getId();
640                  isVisible = !closed.contains(parentId);
641                  if (!isVisible) closed.add(joustId);
642                }
643                String name = "";
644                String description = "";
645                String tooltip = mode.isSelectionMode() ?
646                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
647                boolean removed = false;
648                Transformation t = null;
649                BioAssaySet bas = null;
650                ExtraValue xv = null;
651                PluginDefinition plugin = null;
652                Job job = null;
653                String prefix = "";
654                ItemContext ccc = null;
655                Item itemType = item.getType();
656                if (itemType == Item.TRANSFORMATION)
657                {
658                  t = (Transformation)item;
659                  removed = t.isRemoved();
660                  prefix = "T:";
661                  ccc = tc;
662                  name = HTML.encodeTags(t.getName());
663                  description = HTML.encodeTags(t.getDescription());
664                  try
665                  {
666                    job = t.getJob();
667                    plugin = job.getPluginDefinition();
668                  }
669                  catch (Throwable ex)
670                  {}
671                }
672                else if (itemType == Item.BIOASSAYSET)
673                {
674                  bas = (BioAssaySet)item;
675                  removed = bas.isRemoved();
676                  ccc = cc;
677                  name = HTML.encodeTags(bas.getName());
678                  description = HTML.encodeTags(bas.getDescription());
679                }
680                else if (itemType == Item.EXTRAVALUE)
681                {
682                  xv = (ExtraValue)item;
683                  prefix = "X:";
684                  removed = false;
685                  ccc = xvc;
686                  try
687                  {
688                    ExtraValueType xvType = xv.getExtraValueType();
689                    name = HTML.encodeTags(xvType.getName());
690                    description = HTML.encodeTags(xvType.getDescription());
691                  }
692                  catch (PermissionDeniedException ex)
693                  {
694                    name = xv.getValueType().toString();
695                    description = "";
696                  }
697                  try
698                  {
699                    job = xv.getJob();
700                    plugin = job.getPluginDefinition();
701                  }
702                  catch (Throwable ex)
703                  {}
704                }
705               
706                index++;
707                numListed++;
708                %>
709                <tbl:row
710                  id="<%="row."+joustId%>"
711                  style="<%=isVisible ? "" : "display: none;" %>"
712                  >
713                  <tbl:header 
714                    clazz="index"
715                    ><%=index%></tbl:header>
716                  <tbl:header 
717                    clazz="check" 
718                    visible="<%=mode.hasCheck()%>"
719                    ><input 
720                        type="checkbox" 
721                        name="<%=prefix+itemId%>" 
722                        value="<%=itemId%>" 
723                        title="<%=name%>" 
724                        <%=ccc.getSelected().contains(itemId) ? "checked" : ""%>
725                      ></tbl:header>
726                  <tbl:header 
727                    clazz="check" 
728                    visible="<%=mode.hasRadio()%>"
729                    ><input 
730                        type="radio" 
731                        name="item_id" 
732                        value="<%=itemId%>" 
733                        title="<%=name%>" 
734                        <%=selectedItemId == itemId ? "checked" : ""%>
735                      ></tbl:header>
736                  <tbl:header 
737                    clazz="icons" 
738                    visible="<%=mode.hasIcons()%>"
739                    ><base:icon 
740                      image="deleted.png"
741                      id="<%="delete."+itemId %>"
742                      subclass="<%=deletePermission ? "table-delete-item" : null %>"
743                      data-item-type="<%=itemType.name() %>"
744                      data-item-id="<%=itemId%>"
745                      data-notify="reloadOnNotify"
746                      tooltip="This item has been scheduled for deletion" 
747                      visible="<%=removed%>"
748                    />&nbsp;</tbl:header>
749                 
750                  <tbl:cell clazz="cell joust" column="name">
751                    <div id="<%=joustId%>" class="link auto-init"
752                      data-auto-init="item-link"
753                      data-item-type="<%=itemType.name() %>" 
754                      data-item-id="<%=itemId %>"
755                      data-no-edit="<%=writePermission ? 0 : 1 %>" 
756                      tabindex="0"
757                      title="<%=tooltip%>"><%=name%></div>
758                  </tbl:cell>
759                  <%
760                  if (t != null)
761                  {
762                    %>
763                    <tbl:cell column="spots">&nbsp;</tbl:cell>
764                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
765                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
766                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
767                    <tbl:cell column="tools" style="white-space: nowrap;">
768                      <%
769                      if (createPermission && job != null && plugin != null && plugin.isInteractive() && plugin.hasPermission(Permission.USE))
770                      {
771                        // User may not have permission to read plug-in configuration for job
772                        boolean copyTransformationAllowed = false;
773                        try
774                        {
775                          PluginConfiguration pluginConfig = job.getPluginConfiguration();
776                          if (pluginConfig == null || pluginConfig.hasPermission(Permission.USE))
777                          {
778                            copyTransformationAllowed = true;
779                          }
780                        }
781                        catch (Exception e)
782                        {}
783                        if (copyTransformationAllowed)
784                        {
785                          %>
786                          <base:icon 
787                            subclass="link auto-init"
788                            data-auto-init="copy-job"
789                            data-job-id="<%=job.getId() %>"
790                            image="copy.png" 
791                            tooltip="Copy this transformation"
792                          />
793                          <%
794                        }
795                      }
796                      %>
797                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
798                    </tbl:cell>
799                    <%
800                  }
801                  if (bas != null)
802                  {
803                    %>
804                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
805                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
806                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
807                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
808                    <tbl:cell column="date">&nbsp;</tbl:cell>
809                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
810                    <%
811                    if (bas.isAnnotated())
812                    {
813                      AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, bas.getAnnotationSet().getId());
814                      for (AnnotationLoaderUtil loader : annotationLoaders)
815                      {
816                        %>
817                        <tbl:cell 
818                          column="<%="at"+loader.getId()%>"
819                          ><%
820                          if (loader.find(snapshot)) 
821                          {
822                            %><tbl:cellvalue 
823                              list="<%=loader.getValues()%>"
824                              suffix="<%=loader.getUnitSymbol()%>"
825                            /><%
826                          }
827                          %></tbl:cell>
828                        <%
829                      }
830                    }
831                    %>
832                    <tbl:cell column="tools" style="white-space: nowrap;">
833                      <%
834                      if (bas.getNumSpots() > 0)
835                      {
836                        %>
837                        <base:icon 
838                          subclass="link auto-init"
839                          data-auto-init="bioassayset-plotter"
840                          data-item-id="<%=itemId %>"
841                          image="plotter.png" 
842                          tooltip="A simple plot tool"
843                        />
844                        <base:icon 
845                          subclass="link auto-init"
846                          data-auto-init="experiment-explorer"
847                          data-item-id="<%=itemId %>"
848                          image="explorer.png" 
849                          tooltip="Experiment explorer"
850                        />
851                        <%
852                      }
853                      %>
854                      <base:icon 
855                        subclass="link auto-init"
856                        data-auto-init="bioassayset-plugin"
857                        data-plugin-type="EXPORT"
858                        data-item-id="<%=itemId %>"
859                        image="export.png" 
860                        tooltip="Export data"
861                      />
862                      <%
863                      if (createPermission)
864                      {
865                        %>
866                        <base:icon 
867                          subclass="link auto-init"
868                          data-auto-init="bioassayset-plugin"
869                          data-plugin-type="ANALYZE"
870                          data-cmd="NewFilteredBioAssaySet"
871                          data-item-id="<%=itemId %>"
872                          image="filter.png" 
873                          tooltip="Create a filtered bioassay set"
874                        />
875                        <base:icon 
876                          subclass="link auto-init"
877                          data-auto-init="bioassayset-plugin"
878                          data-plugin-type="ANALYZE"
879                          data-item-id="<%=itemId %>"
880                          image="runplugin.png" 
881                          tooltip="Run an analysis plugin"
882                        />
883                        <%
884                      }
885                      %>
886                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
887                    </tbl:cell>
888                    <%
889                  }
890                  if (xv != null)
891                  {
892                    %>
893                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
894                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
895                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
896                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
897                    <tbl:cell column="tools" style="white-space: nowrap;">
898                      <%
899                      if (createPermission && job != null && plugin != null && plugin.isInteractive() && plugin.hasPermission(Permission.USE))
900                      {
901                        // User may not have permission to read plug-in configuration for job
902                        boolean copyTransformationAllowed = false;
903                        try
904                        {
905                          PluginConfiguration pluginConfig = job.getPluginConfiguration();
906                          if (pluginConfig == null || pluginConfig.hasPermission(Permission.USE))
907                          {
908                            copyTransformationAllowed = true;
909                          }
910                        }
911                        catch (Exception e)
912                        {}
913                        if (copyTransformationAllowed)
914                        {
915                          %>
916                          <base:icon 
917                            subclass="link auto-init"
918                            data-auto-init="copy-job"
919                            data-job-id="<%=job.getId() %>"
920                            image="copy.png" 
921                            tooltip="Copy this extra value"
922                          />
923                          <%
924                        }
925                      }
926                      %>
927                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
928                    </tbl:cell>
929                    <%
930                  }
931                  %>
932                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
933                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
934                  <tbl:cell column="description"><%=description%></tbl:cell>
935                  <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
936                    <tbl:cell column="xt-columns" />
937                  </tbl:xt-cells>
938                </tbl:row>
939                <%
940              }
941            }
942          }
943          if (numListed == 0)
944          {
945            %>
946            <tbl:panel subclass="bg-filled-50">
947              <div class="messagecontainer note">
948              No bioassay sets or transformations were found.
949              </div>
950            </tbl:panel>
951            <%
952          }
953          %>
954        </tbl:rows>
955      </tbl:data>
956    </tbl:table>
957
958    <div id="reloadOnNotify"></div>
959  </base:body>
960  </base:page>
961  <%
962}
963finally
964{
965  if (dc != null) dc.close();
966}
967%>
Note: See TracBrowser for help on using the repository browser.