src/core/net/sf/basedb/util/overview/loader/PhysicalBioAssayLoader.java

Code
Comments
Other
Rev Date Author Line
4740 05 Feb 09 nicklas 1 /**
4740 05 Feb 09 nicklas 2   $Id$
4740 05 Feb 09 nicklas 3
4740 05 Feb 09 nicklas 4   Copyright (C) 2008 Nicklas Nordborg
4740 05 Feb 09 nicklas 5
4740 05 Feb 09 nicklas 6   This file is part of BASE - BioArray Software Environment.
4740 05 Feb 09 nicklas 7   Available at http://base.thep.lu.se/
4740 05 Feb 09 nicklas 8
4740 05 Feb 09 nicklas 9   BASE is free software; you can redistribute it and/or
4740 05 Feb 09 nicklas 10   modify it under the terms of the GNU General Public License
4740 05 Feb 09 nicklas 11   as published by the Free Software Foundation; either version 3
4740 05 Feb 09 nicklas 12   of the License, or (at your option) any later version.
4740 05 Feb 09 nicklas 13
4740 05 Feb 09 nicklas 14   BASE is distributed in the hope that it will be useful,
4740 05 Feb 09 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
4740 05 Feb 09 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4740 05 Feb 09 nicklas 17   GNU General Public License for more details.
4740 05 Feb 09 nicklas 18
4740 05 Feb 09 nicklas 19   You should have received a copy of the GNU General Public License
4740 05 Feb 09 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
4740 05 Feb 09 nicklas 21 */
4740 05 Feb 09 nicklas 22 package net.sf.basedb.util.overview.loader;
4740 05 Feb 09 nicklas 23
6090 22 Aug 12 nicklas 24 import java.util.List;
6090 22 Aug 12 nicklas 25
4740 05 Feb 09 nicklas 26 import net.sf.basedb.core.ArraySlide;
4740 05 Feb 09 nicklas 27 import net.sf.basedb.core.DbControl;
5685 04 Aug 11 nicklas 28 import net.sf.basedb.core.DerivedBioAssay;
5641 25 May 11 nicklas 29 import net.sf.basedb.core.Extract;
5985 24 Feb 12 nicklas 30 import net.sf.basedb.core.ItemSubtype;
5642 26 May 11 nicklas 31 import net.sf.basedb.core.PhysicalBioAssay;
4740 05 Feb 09 nicklas 32 import net.sf.basedb.core.Item;
4740 05 Feb 09 nicklas 33 import net.sf.basedb.core.ItemQuery;
4740 05 Feb 09 nicklas 34 import net.sf.basedb.core.ItemResultIterator;
4740 05 Feb 09 nicklas 35 import net.sf.basedb.core.PermissionDeniedException;
4740 05 Feb 09 nicklas 36 import net.sf.basedb.util.overview.Node;
4740 05 Feb 09 nicklas 37 import net.sf.basedb.util.overview.OverviewContext;
5985 24 Feb 12 nicklas 38 import net.sf.basedb.util.overview.OverviewUtil;
4740 05 Feb 09 nicklas 39 import net.sf.basedb.util.overview.cache.IndexedCacheKey;
4740 05 Feb 09 nicklas 40 import net.sf.basedb.util.overview.node.ChildNodeDirection;
4740 05 Feb 09 nicklas 41 import net.sf.basedb.util.overview.node.NameableNameGenerator;
4740 05 Feb 09 nicklas 42 import net.sf.basedb.util.overview.node.NodeFactory;
4740 05 Feb 09 nicklas 43
4740 05 Feb 09 nicklas 44 /**
5651 08 Jun 11 nicklas 45   Node loader implementation for physical bioassays. There are two forward-loading
4740 05 Feb 09 nicklas 46   directions:
4740 05 Feb 09 nicklas 47   <ol>
5651 08 Jun 11 nicklas 48   <li>{@link Extract}:s -&gt; {@link PhysicalBioAssay}:s -&gt; 
5685 04 Aug 11 nicklas 49   {@link DerivedBioAssay}:s. 
5642 26 May 11 nicklas 50   <li>{@link ArraySlide}:s -&gt; {@link PhysicalBioAssay}:s -&gt; 
5685 04 Aug 11 nicklas 51   {@link DerivedBioAssay}:s
4740 05 Feb 09 nicklas 52   </ol>
4740 05 Feb 09 nicklas 53   
5652 10 Jun 11 nicklas 54   The reverse-loading direction starts with a derived bioassay set and moves to both
5651 08 Jun 11 nicklas 55   extracts and array slide.
4740 05 Feb 09 nicklas 56
4740 05 Feb 09 nicklas 57   @author Nicklas
4740 05 Feb 09 nicklas 58   @version 2.10
4740 05 Feb 09 nicklas 59   @base.modified $Date$
4740 05 Feb 09 nicklas 60 */
5651 08 Jun 11 nicklas 61 public class PhysicalBioAssayLoader
5642 26 May 11 nicklas 62   extends BasicItemNodeLoader<PhysicalBioAssay>
4740 05 Feb 09 nicklas 63 {
5651 08 Jun 11 nicklas 64   public PhysicalBioAssayLoader()
4740 05 Feb 09 nicklas 65   {
5642 26 May 11 nicklas 66     super(Item.PHYSICALBIOASSAY, ALLOW_ROOT_NODE, 
5651 08 Jun 11 nicklas 67         new NameableNameGenerator<PhysicalBioAssay>("bioassay", "Physical bioassay"));
4740 05 Feb 09 nicklas 68   }
4740 05 Feb 09 nicklas 69
4740 05 Feb 09 nicklas 70   /*
4740 05 Feb 09 nicklas 71     From the NodeLoader interface
4740 05 Feb 09 nicklas 72     ------------------------------
4740 05 Feb 09 nicklas 73   */
4740 05 Feb 09 nicklas 74   /**
5652 10 Jun 11 nicklas 75     Create forward-loading physical bioassay nodes from either an extract or
4740 05 Feb 09 nicklas 76     an array slide node. The returned node is either folder-type node containing 
5651 08 Jun 11 nicklas 77     nodes for each bioassay that has been created from the extract
5651 08 Jun 11 nicklas 78     or an item node with the bioassay on the array slide.
5651 08 Jun 11 nicklas 79     @return The folder node with the bioassays, or the item node (can be null)
4740 05 Feb 09 nicklas 80   */
4740 05 Feb 09 nicklas 81   @Override
4740 05 Feb 09 nicklas 82   public Node createForwardNode(DbControl dc, OverviewContext context, Node parentNode)
4740 05 Feb 09 nicklas 83   {
4740 05 Feb 09 nicklas 84     Node returnNode = null;
4740 05 Feb 09 nicklas 85     Item parentType = parentNode.getItemType();
5641 25 May 11 nicklas 86     if (parentType == Item.EXTRACT)
4740 05 Feb 09 nicklas 87     {
5985 24 Feb 12 nicklas 88       returnNode = createForwardNode((Extract)parentNode.getItem(dc), dc, context, parentNode, false);
4740 05 Feb 09 nicklas 89     }
4740 05 Feb 09 nicklas 90     else if (parentType == Item.ARRAYSLIDE)
4740 05 Feb 09 nicklas 91     {
4740 05 Feb 09 nicklas 92       returnNode = createForwardNode((ArraySlide)parentNode.getItem(dc), dc, context, parentNode);
4740 05 Feb 09 nicklas 93     }
6755 20 Feb 15 nicklas 94     else if (parentType == Item.ITEMLIST)
6755 20 Feb 15 nicklas 95     {
6755 20 Feb 15 nicklas 96       ItemListLoader.loadMemberNodes(this, dc, context, parentNode);
6755 20 Feb 15 nicklas 97     }
4740 05 Feb 09 nicklas 98     return returnNode;
4740 05 Feb 09 nicklas 99   }
4740 05 Feb 09 nicklas 100   
4740 05 Feb 09 nicklas 101   /**
5685 04 Aug 11 nicklas 102     Create a reverse-loading bioassay node from the derived bioassay node.
5652 10 Jun 11 nicklas 103     @return A bioassay node
4740 05 Feb 09 nicklas 104   */
4740 05 Feb 09 nicklas 105   @Override
5685 04 Aug 11 nicklas 106   public Node createReverseNode(DbControl dc, OverviewContext context, Node derivedBioAssayNode)
4740 05 Feb 09 nicklas 107   {
5642 26 May 11 nicklas 108     NodeFactory<PhysicalBioAssay> nf = getNodeFactory(dc, context);
6090 22 Aug 12 nicklas 109     DerivedBioAssay dba = (DerivedBioAssay)derivedBioAssayNode.getItem(dc);
6090 22 Aug 12 nicklas 110     
6090 22 Aug 12 nicklas 111     ItemQuery<PhysicalBioAssay> query = context.initQuery(dba.getPhysicalBioAssays(), "name");
6090 22 Aug 12 nicklas 112     List<PhysicalBioAssay> parents = query.list(dc);
6090 22 Aug 12 nicklas 113
6090 22 Aug 12 nicklas 114     Node folderNode = null;
6090 22 Aug 12 nicklas 115     Node bioAssayNode = null;
6090 22 Aug 12 nicklas 116     if (parents.size() > 1)
4740 05 Feb 09 nicklas 117     {
6090 22 Aug 12 nicklas 118       folderNode = new Node("parents", "Physical bioassays", derivedBioAssayNode, ChildNodeDirection.REVERSE);
4740 05 Feb 09 nicklas 119     }
6090 22 Aug 12 nicklas 120
6090 22 Aug 12 nicklas 121     for (PhysicalBioAssay pba : parents)
4740 05 Feb 09 nicklas 122     {
6090 22 Aug 12 nicklas 123       bioAssayNode = createItemNode(nf, pba, null, false, folderNode == null ? derivedBioAssayNode : folderNode, ChildNodeDirection.REVERSE);
4740 05 Feb 09 nicklas 124     }
6090 22 Aug 12 nicklas 125     postValidateFolder(nf, folderNode, derivedBioAssayNode, bioAssayNode == null);
6090 22 Aug 12 nicklas 126     return folderNode == null ? bioAssayNode : folderNode;
4740 05 Feb 09 nicklas 127   }
5985 24 Feb 12 nicklas 128   
5985 24 Feb 12 nicklas 129   /**
5985 24 Feb 12 nicklas 130     A property node is created when moving in the reverse direction so that we
5985 24 Feb 12 nicklas 131     can load child physical bioassays with the {@link ItemSubtype#getPushAnnotations()} 
5985 24 Feb 12 nicklas 132     flag set. The parent node should be an extract node.
5985 24 Feb 12 nicklas 133     @since 3.1
5985 24 Feb 12 nicklas 134   */
5985 24 Feb 12 nicklas 135   @Override
5985 24 Feb 12 nicklas 136   public Node createPropertyNode(DbControl dc, OverviewContext context, Node parentNode) 
5985 24 Feb 12 nicklas 137   {
5985 24 Feb 12 nicklas 138     Node returnNode = null;
5985 24 Feb 12 nicklas 139     Item parentType = parentNode.getItemType();
5985 24 Feb 12 nicklas 140     if (parentType == Item.EXTRACT)
5985 24 Feb 12 nicklas 141     {
5985 24 Feb 12 nicklas 142       returnNode = createForwardNode((Extract)parentNode.getItem(dc), dc, context, parentNode, true);
5985 24 Feb 12 nicklas 143     }
5985 24 Feb 12 nicklas 144     return returnNode;
5985 24 Feb 12 nicklas 145   }
4740 05 Feb 09 nicklas 146   // --------------------------------------
4740 05 Feb 09 nicklas 147   /*
4740 05 Feb 09 nicklas 148     From the AbstractNodeLoader class
4740 05 Feb 09 nicklas 149     ----------------------------------
4740 05 Feb 09 nicklas 150   */
4740 05 Feb 09 nicklas 151   /**
5651 08 Jun 11 nicklas 152     Loads property nodes of a physical bioassay. 
4740 05 Feb 09 nicklas 153     <ul>
4740 05 Feb 09 nicklas 154     <li>Annotations: {@link AnnotationLoader#createPropertyNode(DbControl, OverviewContext, Node)}
4740 05 Feb 09 nicklas 155     <li>Protocol: {@link ProtocolLoader#createPropertyNode(DbControl, OverviewContext, Node)}
7004 09 Nov 15 nicklas 156     <li>Kit: {@link KitLoader#createPropertyNode(DbControl, OverviewContext, Node)}
5651 08 Jun 11 nicklas 157     <li>Hardware: {@link HardwareLoader#createPropertyNode(DbControl, OverviewContext, Node)}
4740 05 Feb 09 nicklas 158     </ul>
4740 05 Feb 09 nicklas 159   */
4740 05 Feb 09 nicklas 160   @Override
5651 08 Jun 11 nicklas 161   protected void loadPropertyChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode)
4740 05 Feb 09 nicklas 162   {
5651 08 Jun 11 nicklas 163     getNodeLoader(context, Item.ANNOTATIONTYPE).createPropertyNode(dc, context, bioAssayNode);
5651 08 Jun 11 nicklas 164     getNodeLoader(context, Item.PROTOCOL).createPropertyNode(dc, context, bioAssayNode);
7004 09 Nov 15 nicklas 165     getNodeLoader(context, Item.KIT).createPropertyNode(dc, context, bioAssayNode);
5651 08 Jun 11 nicklas 166     getNodeLoader(context, Item.HARDWARE).createPropertyNode(dc, context, bioAssayNode);
5651 08 Jun 11 nicklas 167     getNodeLoader(context, Item.ANYTOANY).createPropertyNode(dc, context, bioAssayNode);
4740 05 Feb 09 nicklas 168   }
4740 05 Feb 09 nicklas 169   
4740 05 Feb 09 nicklas 170   /**
4740 05 Feb 09 nicklas 171     Load forward-loading child nodes:
4740 05 Feb 09 nicklas 172     <ul>
5685 04 Aug 11 nicklas 173     <li>Derived bioassay sets (root): {@link DerivedBioAssayLoader#createForwardNode(DbControl, OverviewContext, Node)}
5651 08 Jun 11 nicklas 174     <li>Array slide in reverse direction (if the parent node is an extract):
4740 05 Feb 09 nicklas 175       {@link ArraySlideLoader#createReverseNode(DbControl, OverviewContext, Node)}
5651 08 Jun 11 nicklas 176     <li>Extracts in reverse direction (if the parent node is the array slide):
5651 08 Jun 11 nicklas 177       {@link ExtractLoader#createReverseNode(DbControl, OverviewContext, Node)}
4740 05 Feb 09 nicklas 178     </ul>
4740 05 Feb 09 nicklas 179   */
4740 05 Feb 09 nicklas 180   @Override
5651 08 Jun 11 nicklas 181   protected void loadForwardChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode)
4740 05 Feb 09 nicklas 182   {
5685 04 Aug 11 nicklas 183     getNodeLoader(context, Item.DERIVEDBIOASSAY).createForwardNode(dc, context, bioAssayNode);
5651 08 Jun 11 nicklas 184     Node parent = bioAssayNode.getParent();
4864 30 Mar 09 nicklas 185     if (parent != null && parent.getNodeType() == Node.Type.FOLDER) 
4864 30 Mar 09 nicklas 186     {
4864 30 Mar 09 nicklas 187       parent = parent.getParent();
4864 30 Mar 09 nicklas 188     }
4740 05 Feb 09 nicklas 189     Item parentItemType = parent == null ? null : parent.getItemType();
5641 25 May 11 nicklas 190     if (parentItemType == Item.EXTRACT)
4740 05 Feb 09 nicklas 191     {
5651 08 Jun 11 nicklas 192       getNodeLoader(context, Item.ARRAYSLIDE).createReverseNode(dc, context, bioAssayNode);
4740 05 Feb 09 nicklas 193     }
4740 05 Feb 09 nicklas 194     if (parentItemType == Item.ARRAYSLIDE)
4740 05 Feb 09 nicklas 195     {
5651 08 Jun 11 nicklas 196       getNodeLoader(context, Item.EXTRACT).createReverseNode(dc, context, bioAssayNode);
4740 05 Feb 09 nicklas 197     }
4740 05 Feb 09 nicklas 198   }
4740 05 Feb 09 nicklas 199   
4740 05 Feb 09 nicklas 200   /**
4740 05 Feb 09 nicklas 201     Load reverse child nodes:
4740 05 Feb 09 nicklas 202     <ul>
5651 08 Jun 11 nicklas 203     <li>Extracts: {@link ExtractLoader#createReverseNode(DbControl, OverviewContext, Node)}
4740 05 Feb 09 nicklas 204     <li>Array slide: {@link ArraySlideLoader#createReverseNode(DbControl, OverviewContext, Node)}
4740 05 Feb 09 nicklas 205     </ul>
4740 05 Feb 09 nicklas 206   */
4740 05 Feb 09 nicklas 207   @Override
5652 10 Jun 11 nicklas 208   protected void loadReverseChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode)
4740 05 Feb 09 nicklas 209   {
5652 10 Jun 11 nicklas 210     getNodeLoader(context, Item.EXTRACT).createReverseNode(dc, context, bioAssayNode);
5652 10 Jun 11 nicklas 211     getNodeLoader(context, Item.ARRAYSLIDE).createReverseNode(dc, context, bioAssayNode);
4740 05 Feb 09 nicklas 212   }
4740 05 Feb 09 nicklas 213   // --------------------------------------
4740 05 Feb 09 nicklas 214   
4740 05 Feb 09 nicklas 215   /**
5651 08 Jun 11 nicklas 216     Create forward-loading bioassay nodes for the bioassays 
5651 08 Jun 11 nicklas 217     that has a given extract as a source.
4740 05 Feb 09 nicklas 218   */
5985 24 Feb 12 nicklas 219   private Node createForwardNode(Extract extract, DbControl dc, OverviewContext context, Node parentNode,
5985 24 Feb 12 nicklas 220     boolean onlyPushAnnotationTypes)
4740 05 Feb 09 nicklas 221   {
5642 26 May 11 nicklas 222     NodeFactory<PhysicalBioAssay> nf = getNodeFactory(dc, context);
4740 05 Feb 09 nicklas 223     Node folderNode = null;
5642 26 May 11 nicklas 224     ItemQuery<PhysicalBioAssay> query = context.initQuery(extract.getPhysicalBioAssays(), "name");
5985 24 Feb 12 nicklas 225     if (onlyPushAnnotationTypes) OverviewUtil.restrictToPushAnnotationSubtypes(query);
5642 26 May 11 nicklas 226     ItemResultIterator<PhysicalBioAssay> it = query.iterate(dc);
4740 05 Feb 09 nicklas 227     while (it.hasNext())
4740 05 Feb 09 nicklas 228     {
5651 08 Jun 11 nicklas 229       PhysicalBioAssay bioAssay = it.next();
6090 22 Aug 12 nicklas 230       Object cacheKey = new IndexedCacheKey(bioAssay, extract);
4740 05 Feb 09 nicklas 231       if (folderNode == null)
4740 05 Feb 09 nicklas 232       {
5651 08 Jun 11 nicklas 233         folderNode = new Node("bioassays", "Physical bioassays", parentNode, ChildNodeDirection.FORWARD);
4740 05 Feb 09 nicklas 234       }
5651 08 Jun 11 nicklas 235       createItemNode(nf, bioAssay, cacheKey, false, folderNode, ChildNodeDirection.FORWARD);
4740 05 Feb 09 nicklas 236     }
4740 05 Feb 09 nicklas 237     postValidateFolder(nf, folderNode, parentNode, false);
4740 05 Feb 09 nicklas 238     return folderNode;
4740 05 Feb 09 nicklas 239   }
4740 05 Feb 09 nicklas 240
4740 05 Feb 09 nicklas 241   /**
5651 08 Jun 11 nicklas 242     Create a forward-loading bioassay node from an array slide.
4740 05 Feb 09 nicklas 243   */
4740 05 Feb 09 nicklas 244   private Node createForwardNode(ArraySlide slide, DbControl dc, OverviewContext context, Node parentNode)
4740 05 Feb 09 nicklas 245   {
5642 26 May 11 nicklas 246     NodeFactory<PhysicalBioAssay> nf = getNodeFactory(dc, context);
5651 08 Jun 11 nicklas 247     PhysicalBioAssay bioAssay = null;
4740 05 Feb 09 nicklas 248     boolean denied = false;
4740 05 Feb 09 nicklas 249     try
4740 05 Feb 09 nicklas 250     {
5651 08 Jun 11 nicklas 251       bioAssay = slide.getPhysicalBioAssay();
4740 05 Feb 09 nicklas 252     }
4740 05 Feb 09 nicklas 253     catch (PermissionDeniedException ex)
4740 05 Feb 09 nicklas 254     {
4740 05 Feb 09 nicklas 255       denied = true;
4740 05 Feb 09 nicklas 256     }
5651 08 Jun 11 nicklas 257     Node hybNode = createItemNode(nf, bioAssay, bioAssay, denied, parentNode, ChildNodeDirection.FORWARD);
4740 05 Feb 09 nicklas 258     return hybNode;
4740 05 Feb 09 nicklas 259   }
4740 05 Feb 09 nicklas 260
4740 05 Feb 09 nicklas 261 }