source: branches/2.9-stable/www/views/experiments/bioassaysets/analysis_tree.jsp @ 4737

Last change on this file since 4737 was 4737, checked in by Martin Svensson, 13 years ago

Fixes #1235 Experiment->Bioassay sets tab shows annotations followed by "null".
Experiment->Bioassay set->Bioassays was also containing this error.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 32.2 KB
Line 
1<%-- $Id: analysis_tree.jsp 4737 2009-01-26 10:13:37Z martin $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Hakkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Jari Hakkinen, 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 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.PermissionDeniedException"
48  import="net.sf.basedb.core.query.Restrictions"
49  import="net.sf.basedb.core.query.Expressions"
50  import="net.sf.basedb.core.query.Orders"
51  import="net.sf.basedb.core.query.Hql"
52  import="net.sf.basedb.core.query.Restrictions"
53  import="net.sf.basedb.core.plugin.GuiContext"
54  import="net.sf.basedb.core.plugin.Plugin"
55  import="net.sf.basedb.util.Tree"
56  import="net.sf.basedb.util.Enumeration"
57  import="net.sf.basedb.clients.web.Base"
58  import="net.sf.basedb.clients.web.ModeInfo"
59  import="net.sf.basedb.clients.web.util.HTML"
60  import="net.sf.basedb.util.Values"
61  import="net.sf.basedb.util.formatter.Formatter"
62  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
63  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
64  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction"
65  import="net.sf.basedb.clients.web.extensions.JspContext"
66  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
67  import="net.sf.basedb.util.extensions.Renderer"
68  import="java.util.Date"
69  import="java.util.List"
70  import="java.util.ArrayList"
71  import="java.util.LinkedList"
72  import="java.util.Map"
73  import="java.util.HashMap"
74  import="java.util.Iterator"
75  import="java.util.Collection"
76%>
77<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
78<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
79<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
80<%!
81  private static final Item itemType = Item.BIOASSAYSET;
82  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
83%>
84<%!
85
86private static void addToTree(Tree<BasicItem> tree, BioAssaySet bas)
87{
88  if (!tree.contains(bas))
89  {
90    Transformation transformation = bas.getTransformation();
91    Tree.Entry<BasicItem> parent = tree.getEntry(transformation);
92    if (parent == null) 
93    {
94      addToTree(tree, transformation);
95      parent = tree.getEntry(transformation);
96    }
97    Tree.Entry<BasicItem> basEntry = parent.addChild(bas);
98    for (ExtraValue xv : bas.getExtraValues().list(bas.getDbControl())) 
99    {
100      basEntry.addChild(xv);
101    }
102  }
103}
104
105private static void addToTree(Tree<BasicItem> tree, Transformation transformation)
106{
107  if (!tree.contains(transformation))
108  {
109    BioAssaySet source = transformation.getSource();
110    Tree.Entry<BasicItem> parent = tree.getEntry(source);
111    if (parent == null) 
112    {
113      addToTree(tree, source);
114      parent = tree.getEntry(source);
115    }
116    parent.addChild(transformation);
117  }
118}
119
120private static Tree<BasicItem> getAnalysisTree(DbControl dc, ItemQuery<BioAssaySet> bioAssaySetQuery, ItemQuery<Transformation> transformationQuery)
121{
122  Tree<BasicItem> tree = new Tree<BasicItem>(null);
123  ItemResultList<BioAssaySet> allBioAssaySets = bioAssaySetQuery.list(dc);
124  List<Integer> ids = new ArrayList<Integer>(allBioAssaySets.size());
125 
126  for (BioAssaySet bas : allBioAssaySets)
127  {
128    addToTree(tree, bas);
129    ids.add(bas.getId());
130  }
131 
132  transformationQuery.restrict(
133    Restrictions.in(
134      Hql.property("source.id"), 
135      Expressions.parameter("bioAssaySets", ids)
136    )
137  );
138  ItemResultList<Transformation> allTransformations = transformationQuery.list(dc);
139  for (Transformation t: allTransformations)
140  {
141    addToTree(tree, t);
142  }
143  return tree;
144}
145String generateTree(Tree<BasicItem> tree, BasicItem root, BasicItem parentItem, Collection<String> closed)
146{
147  StringBuilder sb = new StringBuilder();
148  Tree.Entry<BasicItem> parentEntry = tree.getEntry(parentItem);
149  if (parentEntry == null) return "";
150 
151  if (root != null && root == parentItem)
152  {
153    appendNode(sb, root, null, true);
154  }
155 
156  List<Tree.Entry<BasicItem>> children = parentEntry.getChildren();
157  if (children != null)
158  {
159    for (Tree.Entry<BasicItem> child : children)
160    {
161      BasicItem node = child.getNode();
162      String var = node.getType().name() + "_" + node.getId();
163      appendNode(sb, node, parentItem, (closed == null || !closed.contains(var)) && child.getNumChildren() > 0);
164      sb.append(generateTree(tree, root, node, closed));
165    }
166  }
167  return sb.toString();
168}
169
170void appendNode(StringBuilder sb, BasicItem node, BasicItem parentItem, boolean open)
171{
172  int id = node.getId();
173  String var = node.getType().name() + "_" + id;
174  String name = "";
175 
176  Item nodeType = node.getType();
177  String folderIcon = "";
178  if (nodeType == Item.BIOASSAYSET)
179  {
180    folderIcon = "BioAssaySet";
181    name = ((BioAssaySet)node).getName();
182  } 
183  else if (nodeType == Item.TRANSFORMATION)
184  {
185    Transformation t = (Transformation)node;
186    folderIcon = "Transformation";
187    try
188    {
189      if (t.getJob().getPluginDefinition().supports("net.sf.basedb.core.plugin.AnalysisFilterPlugin"))
190      {
191        folderIcon = "Filter";
192      }
193    }
194    catch (Throwable tt)
195    {}
196    name = t.getName();
197  } 
198  else if (nodeType == Item.EXTRAVALUE) 
199  {
200    folderIcon = "ExtraValue";
201    try
202    {
203      name = ((ExtraValue)node).getExtraValueType().getName();
204    }
205    catch (PermissionDeniedException ex)
206    {
207      name = ((ExtraValue)node).getValueType().toString();
208    }
209  }
210  sb.append("var ").append(var);
211  if (parentItem == null)
212  {
213    sb.append(" = JoustMenu.addMenuItem(-1");
214  }
215  else
216  {
217    String rootVar = parentItem.getType().name() + "_" + parentItem.getId();
218    sb.append(" = JoustMenu.addChildItem(").append(rootVar); 
219  }
220  sb.append(",'").append(folderIcon).append("'");
221  sb.append(",'").append(HTML.javaScriptEncode(name)).append("'");
222  sb.append(", null, '', '").append(var).append("');\n");
223  if (open)
224  {
225    sb.append("JoustMenu.menuItems[").append(var).append("].isOpen = true;\n");
226  }
227}
228%>
229<%
230final int experimentId = Values.getInt(request.getParameter("experiment_id"));
231final int bioAssaySetId = Values.getInt(request.getParameter("item_id"));
232final int transformationId = Values.getInt(request.getParameter("transformation_id"));
233final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
234final String ID = sc.getId();
235final String rootPath = request.getContextPath()+"/";
236final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
237final ItemContext tc = sc.getCurrentContext(Item.TRANSFORMATION);
238final ItemContext xvc = sc.getCurrentContext(Item.EXTRAVALUE);
239
240final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
241final String callback = request.getParameter("callback");
242final String title = mode.generateTitle("bioassay set", "bioassay sets");
243final DbControl dc = sc.newDbControl();
244Tree<BasicItem> analysisTree = null;
245ItemResultList<AnnotationType> annotationTypes = null;
246try
247{
248  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
249  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
250  final Experiment experiment = Experiment.getById(dc, experimentId);
251  final BasicItem root = transformationId == 0 ? 
252      (bioAssaySetId == 0 ? null : BioAssaySet.getById(dc, bioAssaySetId))
253      : Transformation.getById(dc, transformationId);
254  final boolean createPermission = experiment.hasPermission(Permission.USE);
255  final boolean deletePermission = createPermission;
256  final boolean writePermission = createPermission;
257
258  final ItemQuery<Transformation> transformationQuery = experiment.getTransformations();
259  transformationQuery.include(cc.getInclude());
260  transformationQuery.setFirstResult(0);
261  transformationQuery.setMaxResults(-1);
262  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
263  annotationTypes = annotationTypeQuery.list(dc);
264  try
265  {
266    final ItemQuery<BioAssaySet> query = Base.getConfiguredQuery(dc, cc, true, experiment.getBioAssaySets(), mode);
267    query.setFirstResult(0);
268    query.setMaxResults(-1);
269    analysisTree = getAnalysisTree(dc, query, transformationQuery);
270  }
271  catch (Throwable t)
272  {
273    cc.setMessage(t.getMessage());
274    t.printStackTrace();
275  }
276  // Contains the ID:s of the bioassaysets that are closed in the tree
277  Collection<String> closed = (Collection<String>)cc.getObject("closed");
278  int numListed = 0;
279 
280  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
281  ExtensionsInvoker invoker = ExtensionsControl.useExtensions(jspContext, 
282      "net.sf.basedb.clients.web.bioassayset.list.tools");
283  %>
284<base:page type="include">
285  <base:body>
286    <ext:scripts context="<%=jspContext%>" />
287    <ext:stylesheets context="<%=jspContext%>" />
288    <script language="JavaScript">
289    var submitPage = '<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>';
290    var formId = 'bioAssaySets';
291    function newItem()
292    {
293      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=NewItem&experiment_id=<%=experimentId%>', 'NewBioAssaySet', 740, 540);
294    }
295    function editBioAssaySet(itemId)
296    {
297      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
298    }
299    function viewBioAssaySet(itemId)
300    {
301      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
302    }
303    function bioAssaySetOnClick(evt, itemId)
304    {
305      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewBioAssaySet, editBioAssaySet, returnSelected);
306    }
307    function viewTransformation(itemId)
308    {
309      Main.viewOrEditItem('<%=ID%>', 'TRANSFORMATION', itemId, false);
310    }
311    function editTransformation(itemId)
312    {
313      Main.viewOrEditItem('<%=ID%>', 'TRANSFORMATION', itemId, true);
314    }
315    function transformationOnClick(evt, itemId)
316    {
317      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewTransformation, editTransformation, returnSelected);
318    }
319    function viewExtraValue(itemId)
320    {
321      Main.viewOrEditItem('<%=ID%>', 'EXTRAVALUE', itemId, false);
322    }
323    function editExtraValue(itemId)
324    {
325      Main.viewOrEditItem('<%=ID%>', 'EXTRAVALUE', itemId, true);
326    }
327    function extraValueOnClick(evt, itemId)
328    {
329      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewExtraValue, editExtraValue, returnSelected);
330    }
331    function deleteItems()
332    {
333      var frm = document.forms[formId];
334      if (Forms.numChecked(frm) == 0)
335      {
336        alert('Please select at least one item in the list');
337        return;
338      }
339      if (Forms.numChecked(frm, /^X:/) > 0)
340      {
341        if (!confirm('Extra values are deleted immediately and cannot be restored. Do you want to continue?'))
342        {
343          return;
344        }
345      }
346      frm.action = submitPage;
347      frm.cmd.value = 'DeleteItems';
348      frm.submit();
349    }
350    function restoreItems()
351    {
352      var frm = document.forms[formId];
353      if (Forms.numChecked(frm) == 0)
354      {
355        alert('Please select at least one item in the list');
356        return;
357      }
358      frm.action = submitPage;
359      frm.cmd.value = 'RestoreItems';
360      frm.submit();
361    }
362    function deleteItemPermanently(itemType, itemId)
363    {
364      Main.deleteItemPermanently('<%=ID%>', true, itemType, itemId);
365    }
366    function configureColumns()
367    {
368      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
369    }
370    function runPlugin(cmd)
371    {
372      Table.submitToPopup(formId, cmd, 740, 540);
373    }
374    function filter(itemId)
375    {
376      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=NewFilteredBioAssaySet&experiment_id=<%=experimentId%>&item_id='+itemId, 'FilterBioAssaySet', 740, 540);
377    }
378    function openPlotTool(itemId)
379    {
380      Main.openPopup('../plotter/index.jsp?ID=<%=ID%>&bioassayset_id='+itemId, 'Plotter', 1000, 700);
381    }
382    function openExperimentExplorer(itemId)
383    {
384      location.href = '../explorer/view/index.jsp?ID=<%=ID%>&bioassayset_id='+itemId;
385    }
386    function runAnalysisPlugin(itemId)
387    {
388      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=RunAnalysisPlugin&experiment_id=<%=experimentId%>&item_id='+itemId, 'RunPlugin', 740, 540);
389    }
390    function runExportPlugin(itemId)
391    {
392      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=ExportItem&experiment_id=<%=experimentId%>&item_id='+itemId, 'Export', 740, 540);
393    }
394    function copyJob(jobId)
395    {
396      var url = '../../../common/plugin/index.jsp?ID=<%=ID%>';
397      url += '&cmd=CopyJob&job_id='+jobId;
398      url += '&item_type=BIOASSAYSET&context_type=LIST'
399      Main.openPopup(url, 'CopyJob', 740, 540);
400    }
401    function returnSelected()
402    {
403      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
404      window.close();
405    }
406    function presetOnChange()
407    {
408      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
409    }
410   
411    function sendClosedWithAjax()
412    {
413      var request = Main.getAjaxRequest();
414      if (request != null)
415      {
416        var frm = document.forms[formId];
417        var url = '../bioassaysets/index.jsp?ID=<%=ID%>&cmd=SetClosedWithAjax';
418        request.open("POST", url, true);
419        var postdata = 'closed=' + frm.closed.value;
420        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
421        request.setRequestHeader("Content-length", postdata.length);
422        request.setRequestHeader("Connection", "close");
423        request.send(postdata);
424      }
425    }
426   
427    function initTree()
428    {
429      var bigDir = getRoot()+'images/joust/big/';
430      IconStore.init(bigDir, 18, 22);
431      IconStore.addIcon('BioAssaySet', bigDir + 'bioassayset.gif', 18, 22);
432      IconStore.addIcon('Transformation', bigDir + 'transformation.gif', 18, 22);
433      IconStore.addIcon('Filter', bigDir + 'filter.gif', 18, 22);
434      IconStore.addIcon('ExtraValue', bigDir + 'extravalue.gif', 18, 22);
435
436      JoustMenu.toggle = function(menuItemIndex)
437      {
438        var menuItem = this.menuItems[menuItemIndex];
439        if (!menuItem) return;
440        // Switch the open/closed status and hide or show the children
441        menuItem.isOpen = !menuItem.isOpen;
442        if (menuItem.isOpen)
443        {
444          this.showChildren(menuItemIndex);
445          var frm = document.forms[formId];
446          frm.closed.value = frm.closed.value.replace(','+menuItem.externalId+',', ',');
447        }
448        else
449        {
450          this.hideChildren(menuItemIndex);
451          var frm = document.forms[formId];
452          frm.closed.value += menuItem.externalId+',';
453        }
454        sendClosedWithAjax();
455        // alert(document.forms[formId].closed.value);
456        this.updateIconsAndText(menuItemIndex);
457      }
458     
459      JoustMenu.drawMenuItems = function(firstIndex, indentString)
460      {
461        var menuItem = this.menuItems[firstIndex];
462        while (menuItem)
463        {
464          var html = menuItem.draw(indentString);
465          var padIcon = IconStore.getIcon(menuItem.noOutlineIcon == true ? null : menuItem.nextItemIndex == -1 ? 'iconBlank' : 'iconLine');
466          var padHtml = padIcon == null ? '' : padIcon.getImgTag();
467         
468          var menuDiv = document.getElementById('tree.'+menuItem.externalId);
469          menuDiv.innerHTML = html;
470         
471          if (menuItem.firstChildIndex != -1)
472          {
473            this.drawMenuItems(menuItem.firstChildIndex, indentString+padHtml);
474          }
475          if (!menuItem.isOpen)
476          {
477            this.hideChildren(menuItem.index);
478          }
479          menuItem = this.menuItems[menuItem.nextItemIndex];
480        }
481        return '';
482      }
483
484      JoustMenu.hideChildren = function(menuItemIndex)
485      {
486        var menuItem = this.menuItems[menuItemIndex];
487        if (menuItem)
488        {
489          var firstChildIndex = menuItem.firstChildIndex;
490          var child = this.menuItems[firstChildIndex];
491          while (child)
492          {
493            var e = document.getElementById('row.'+child.externalId);
494            e.style.display = 'none';
495            this.hideChildren(child.index);
496            child = this.menuItems[child.nextItemIndex];
497          }
498        }
499      }
500     
501      JoustMenu.showChildren = function(menuItemIndex)
502      {
503        var menuItem = this.menuItems[menuItemIndex];
504        if (menuItem)
505        {
506          var firstChildIndex = menuItem.firstChildIndex;
507          var child = this.menuItems[firstChildIndex];
508          while (child)
509          {
510            var e = document.getElementById('row.'+child.externalId);
511            e.style.display = Browser.isIE ? 'block' : 'table-row';
512            if (child.isOpen)
513            {
514              this.showChildren(child.index);
515            }
516            child = this.menuItems[child.nextItemIndex];
517          }
518        }
519      }
520
521      <%=analysisTree == null ? "" : generateTree(analysisTree, root, root, closed)%>
522      JoustMenu.draw('joust');
523     
524    }
525    </script>
526 
527
528    <%
529    if (cc.getMessage() != null)
530    {
531      %>
532      <div class="error"><%=cc.getMessage()%></div>
533      <%
534      cc.setMessage(null);
535    }
536    %>
537    <tbl:table 
538      id="bioAssaySets" 
539      clazz="itemlist" 
540      columns="<%=cc.getSetting("columns")%>"
541      sortby="<%=cc.getSortProperty()%>" 
542      direction="<%=cc.getSortDirection()%>"
543      title="<%=title%>"
544      action="<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>"
545      sc="<%=sc%>"
546      item="<%=itemType%>"
547      >
548      <tbl:hidden 
549        name="mode" 
550        value="<%=mode.getName()%>" 
551      />
552      <tbl:hidden 
553        name="experiment_id" 
554        value="<%=String.valueOf(experimentId)%>" 
555      />
556      <tbl:hidden 
557        name="item_id" 
558        value="<%=String.valueOf(bioAssaySetId)%>"
559        skip="<%=bioAssaySetId == 0%>"
560      />
561      <tbl:hidden 
562        name="transformation_id" 
563        value="<%=String.valueOf(transformationId)%>"
564        skip="<%=transformationId == 0%>"
565      />
566      <tbl:hidden 
567        name="callback" 
568        value="<%=callback%>" 
569        skip="<%=callback == null%>" 
570      />
571      <tbl:hidden
572        name="closed"
573        value="<%=closed == null ? "," : ","+Values.getString(closed, ",", true)+","%>"
574      />
575      <tbl:columndef 
576        id="name"
577        property="name"
578        datatype="string"
579        title="Name"
580        sortable="true" 
581        filterable="true"
582        exportable="true"
583        show="always" 
584      />
585      <tbl:columndef 
586        id="spots"
587        property="numSpots"
588        datatype="int"
589        title="Spots/Values in db"
590        sortable="true" 
591        filterable="true"
592        exportable="true"
593      />
594      <tbl:columndef 
595        id="reporters"
596        property="numReporters"
597        datatype="int"
598        title="Reporters in db"
599        sortable="true" 
600        filterable="true"
601        exportable="true"
602      />
603      <tbl:columndef 
604        id="fileSpots"
605        property="numFileSpots"
606        datatype="int"
607        title="Spots/Values in file"
608        sortable="true" 
609        filterable="true"
610        exportable="true"
611      />
612      <tbl:columndef 
613        id="fileReporters"
614        property="numFileReporters"
615        datatype="int"
616        title="Reporters in file"
617        sortable="true" 
618        filterable="true"
619        exportable="true"
620      />
621      <tbl:columndef 
622        id="date"
623        property="transformation.job.ended"
624        datatype="string"
625        title="Date"
626        sortable="true" 
627        filterable="true"
628        exportable="true"
629      />
630      <tbl:columndef 
631        id="plugin"
632        property="transformation.job.pluginDefinition.name"
633        datatype="string"
634        title="Plugin"
635        sortable="true" 
636        filterable="true"
637        exportable="true"
638      />
639      <tbl:columndef 
640        id="description"
641        property="description"
642        datatype="string"
643        title="Description" 
644        sortable="true" 
645        filterable="true" 
646        exportable="true"
647      />
648      <%
649      for (AnnotationType at : annotationTypes)
650      {
651        Enumeration<String, String> annotationEnum = null;
652        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
653        if (at.isEnumeration())
654        {
655          annotationEnum = new Enumeration<String, String>();
656          List<?> values = at.getValues();
657          for (Object value : values)
658          {
659            String encoded = formatter.format(value);
660            annotationEnum.add(encoded, encoded);
661          }
662        }
663        %>
664        <tbl:columndef 
665          id="<%="at"+at.getId()%>"
666          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
667          property="<%="#"+at.getId()%>"
668          annotation="true"
669          datatype="<%=at.getValueType().getStringValue()%>"
670          enumeration="<%=annotationEnum%>"
671          sortable="false" 
672          filterable="true" 
673          exportable="true"
674          formatter="<%=formatter%>"
675          unit="<%=at.getDefaultUnit()%>"
676        />
677        <%
678      }
679      %>
680      <tbl:columndef 
681        id="tools"
682        title="Tools" 
683      />
684
685      <tbl:toolbar
686        visible="<%=mode.hasToolbar()%>"
687        >
688        <tbl:button 
689          disabled="<%=createPermission ? false : true%>" 
690          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
691          onclick="newItem()" 
692          title="New root bioassay set&hellip;" 
693          tooltip="<%=createPermission ? "Create a new root bioassay set" : "You do not have permission to create bioassay sets"%>" 
694          visible="<%=root == null && pluginCount.containsKey(Plugin.MainType.INTENSITY)%>"
695        />
696        <tbl:button 
697          disabled="<%=deletePermission ? false : true%>" 
698          image="<%=deletePermission ? "delete.gif" : "delete_disabled.gif"%>" 
699          title="Delete"
700          onclick="deleteItems()" 
701          tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete items"%>" 
702        />
703        <tbl:button 
704          disabled="<%=writePermission ? false : true%>" 
705          image="<%=writePermission ? "restore.gif" : "restore_disabled.gif"%>" 
706          onclick="restoreItems()" 
707          title="Restore"
708          tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to restore items"%>" 
709        />
710        <tbl:button 
711          image="columns.gif" 
712          onclick="configureColumns()" 
713          title="Columns&hellip;" 
714          tooltip="Show, hide and re-order columns" 
715        />
716        <tbl:button 
717          image="import.gif" 
718          onclick="runPlugin('ImportItems')" 
719          title="Import&hellip;" 
720          tooltip="Import data" 
721          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
722        />
723        <tbl:button 
724          image="export.gif" 
725          onclick="runPlugin('ExportItems')" 
726          title="Export&hellip;" 
727          tooltip="Export data" 
728          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
729        />
730        <tbl:button 
731          image="runplugin.gif" 
732          onclick="runPlugin('RunListPlugin')" 
733          title="Run plugin&hellip;" 
734          tooltip="Run a plugin" 
735          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
736        />
737      </tbl:toolbar>
738      <tbl:data>
739        <tbl:columns>
740        <tbl:presetselector 
741          clazz="columnheader"
742          colspan="3"
743          onchange="presetOnChange()"
744        />
745        </tbl:columns>
746        <tr>
747          <tbl:header 
748            clazz="index"
749            >&nbsp;</tbl:header>
750          <tbl:header 
751            clazz="check" 
752            visible="<%=mode.hasCheck()%>"
753            ><base:icon 
754              image="check_uncheck.gif" 
755              tooltip="Check/uncheck all" 
756              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
757            /></tbl:header>
758          <tbl:header 
759            clazz="check" 
760            visible="<%=mode.hasRadio()%>"
761            />
762          <tbl:header 
763            clazz="icons" 
764            visible="<%=mode.hasIcons()%>"
765            >&nbsp;</tbl:header>
766          <tbl:propertyfilter />
767        </tr>
768   
769          <tbl:rows>
770          <%
771          int index = cc.getPage()*cc.getRowsPerPage();
772          int selectedItemId = cc.getId();
773          if (analysisTree != null)
774          {           
775            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
776            while (baas.hasNext())
777            {
778              Tree.Entry<BasicItem> entry = baas.next();
779              BasicItem item = entry.getNode();
780              if (item != null)
781              {
782                int level = entry.getDepth() - 1;
783                int itemId = item.getId();
784                String joustId = item.getType().name() + "_" + itemId;
785                String name = "";
786                String description = "";
787                String tooltip = mode.isSelectionMode() ?
788                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
789                String deletePermanently = "deleteItemPermanently('" + item.getType().name() + "', "+itemId+")";
790                boolean removed = false;
791                Transformation t = null;
792                BioAssaySet bas = null;
793                ExtraValue xv = null;
794                PluginDefinition plugin = null;
795                Job job = null;
796                String prefix = "";
797                ItemContext ccc = null;
798                String view = "";
799                String onClick = "";
800                Item itemType = item.getType();
801                if (itemType == Item.TRANSFORMATION)
802                {
803                  t = (Transformation)item;
804                  removed = t.isRemoved();
805                  prefix = "T:";
806                  ccc = tc;
807                  onClick = "transformationOnClick";
808                  name = HTML.encodeTags(t.getName());
809                  description = HTML.encodeTags(t.getDescription());
810                  try
811                  {
812                    job = t.getJob();
813                    plugin = job.getPluginDefinition();
814                  }
815                  catch (Throwable ex)
816                  {}
817                }
818                else if (itemType == Item.BIOASSAYSET)
819                {
820                  bas = (BioAssaySet)item;
821                  removed = bas.isRemoved();
822                  ccc = cc;
823                  onClick = "bioAssaySetOnClick";
824                  name = HTML.encodeTags(bas.getName());
825                  description = HTML.encodeTags(bas.getDescription());
826                }
827                else if (itemType == Item.EXTRAVALUE)
828                {
829                  xv = (ExtraValue)item;
830                  prefix = "X:";
831                  removed = false;
832                  ccc = xvc;
833                  onClick = "extraValueOnClick";
834                  try
835                  {
836                    ExtraValueType xvType = xv.getExtraValueType();
837                    name = HTML.encodeTags(xvType.getName());
838                    description = HTML.encodeTags(xvType.getDescription());
839                  }
840                  catch (PermissionDeniedException ex)
841                  {
842                    name = xv.getValueType().toString();
843                    description = "";
844                  }
845                  try
846                  {
847                    job = xv.getJob();
848                    plugin = job.getPluginDefinition();
849                  }
850                  catch (Throwable ex)
851                  {}
852                }
853               
854                index++;
855                numListed++;
856
857                %>
858                <tbl:row
859                  id="<%="row."+joustId%>"
860                  >
861                  <tbl:header 
862                    clazz="index"
863                    ><%=index%></tbl:header>
864                  <tbl:header 
865                    clazz="check" 
866                    visible="<%=mode.hasCheck()%>"
867                    ><input 
868                        type="checkbox" 
869                        name="<%=prefix+itemId%>" 
870                        value="<%=itemId%>" 
871                        title="<%=name%>" 
872                        <%=ccc.getSelected().contains(itemId) ? "checked" : ""%>
873                      ></tbl:header>
874                  <tbl:header 
875                    clazz="check" 
876                    visible="<%=mode.hasRadio()%>"
877                    ><input 
878                        type="radio" 
879                        name="item_id" 
880                        value="<%=itemId%>" 
881                        title="<%=name%>" 
882                        <%=selectedItemId == itemId ? "checked" : ""%>
883                      ></tbl:header>
884                  <tbl:header 
885                    clazz="icons" 
886                    visible="<%=mode.hasIcons()%>"
887                    ><base:icon 
888                      image="<%=deletePermission ? "deleted.gif" : "deleted_disabled.gif"%>"
889                      onclick="<%=deletePermission ? deletePermanently : null%>"
890                      tooltip="This item has been scheduled for deletion" 
891                      visible="<%=removed%>"
892                    />&nbsp;</tbl:header>
893                 
894                  <tbl:cell clazz="joustcell" column="name">
895                    <div id="tree.<%=joustId%>" class="link" 
896                      onclick="<%=onClick%>(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
897                      title="<%=tooltip%>"><%=name%>
898                    </div>
899                  </tbl:cell>
900                  <%
901                  if (t != null)
902                  {
903                    %>
904                    <tbl:cell column="spots">&nbsp;</tbl:cell>
905                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
906                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
907                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
908                    <tbl:cell column="tools">
909                      <nobr>
910                      <%
911                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
912                      {
913                        %>
914                        <a href="javascript:copyJob(<%=job.getId()%>)" 
915                          title="Copy this transformation"><img 
916                          src="../../../images/copy.gif" border="0"></a>
917                        <%
918                      }
919                      %>
920                      <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" item="<%=item%>" />
921                      </nobr>
922                    </tbl:cell>
923                    <%
924                  }
925                  if (bas != null)
926                  {
927                    %>
928                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
929                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
930                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
931                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
932                    <tbl:cell column="date">&nbsp;</tbl:cell>
933                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
934                    <%
935                    AnnotationSet as = bas.isAnnotated() ? bas.getAnnotationSet() : null;
936                    if (as != null)
937                    {
938                      for (AnnotationType at : annotationTypes)
939                      {
940                        if (as.hasAnnotation(at))
941                        {
942                          Annotation a = as.getAnnotation(at);
943                          String suffix = a.getUnitSymbol(null);
944                          if (suffix != null) suffix = "&nbsp;" + suffix;
945                          %>
946                          <tbl:cell 
947                            column="<%="at"+at.getId()%>"
948                            ><tbl:cellvalue 
949                              list="<%=a.getValues(null)%>"
950                              suffix="<%=suffix%>"
951                          /></tbl:cell>
952                          <%
953                        }
954                      }
955                    }
956                    %>
957                    <tbl:cell column="tools">
958                      <nobr>
959                      <%
960                      if (bas.getNumSpots() > 0)
961                      {
962                        %>
963                        <a href="javascript:openPlotTool(<%=itemId%>)" 
964                          title="A simple plot tool"><img 
965                          src="../../../images/plotter.gif" border="0"></a>
966                        <a href="javascript:openExperimentExplorer(<%=itemId%>)"
967                          title="Experiment explorer"><img
968                          src="../../../images/explorer.png" border="0"></a>
969                        <%
970                      }
971                      %>
972                      <a href="javascript:runExportPlugin(<%=itemId%>)"
973                        title="Export data"><img 
974                        src="../../../images/export.gif" border="0"></a>
975                       
976                      <%
977                      if (createPermission)
978                      {
979                        %>
980                        <a href="javascript:filter(<%=itemId%>)" 
981                          title="Create a filtered bioassay set"><img 
982                          src="../../../images/filter.gif" border="0"></a>
983                        <a href="javascript:runAnalysisPlugin(<%=itemId%>)" title="Run an analysis plugin"><img 
984                          src="../../../images/runplugin.gif" border="0"></a>
985                        <%
986                      }
987                      %>
988                      <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" item="<%=item%>" />
989                      </nobr>
990                    </tbl:cell>
991                    <%
992                  }
993                  if (xv != null)
994                  {
995                    %>
996                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
997                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
998                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
999                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
1000                    <tbl:cell column="tools">
1001                      <nobr>
1002                      <%
1003                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
1004                      {
1005                        %>
1006                        <a href="javascript:copyJob(<%=job.getId()%>)" 
1007                          title="Copy this extra value"><img 
1008                          src="../../../images/copy.gif" border="0"></a>
1009                        <%
1010                      }
1011                      %>
1012                      <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" item="<%=item%>" />                           
1013                      </nobr>
1014                    </tbl:cell>
1015                    <%
1016                  }
1017                  %>
1018                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
1019                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
1020                  <tbl:cell column="description"><%=description%></tbl:cell>
1021                </tbl:row>
1022                <%
1023              }
1024            }
1025          }
1026          %>
1027          </tbl:rows>
1028        </tbl:data>
1029      <%
1030      if (numListed == 0)
1031      {
1032        %>
1033        <tbl:panel>No bioassay sets or transformations were found.</tbl:panel>
1034        <%
1035      }
1036      %>
1037    </tbl:table>
1038
1039    <script language="JavaScript">
1040    initTree();
1041    </script>
1042  </base:body>
1043  </base:page>
1044  <%
1045}
1046finally
1047{
1048  if (dc != null) dc.close();
1049}
1050%>
Note: See TracBrowser for help on using the repository browser.