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

Code
Comments
Other
Rev Date Author Line
6041 02 Apr 12 nicklas 1 /**
6041 02 Apr 12 nicklas 2   $Id$
6041 02 Apr 12 nicklas 3   
6041 02 Apr 12 nicklas 4   Copyright (C) 2012 Nicklas Nordborg
6041 02 Apr 12 nicklas 5   
6041 02 Apr 12 nicklas 6   This file is part of BASE - BioArray Software Environment.
6041 02 Apr 12 nicklas 7   Available at http://base.thep.lu.se/
6041 02 Apr 12 nicklas 8   
6041 02 Apr 12 nicklas 9   BASE is free software; you can redistribute it and/or
6041 02 Apr 12 nicklas 10   modify it under the terms of the GNU General Public License
6041 02 Apr 12 nicklas 11   as published by the Free Software Foundation; either version 3
6041 02 Apr 12 nicklas 12   of the License, or (at your option) any later version.
6041 02 Apr 12 nicklas 13   
6041 02 Apr 12 nicklas 14   BASE is distributed in the hope that it will be useful,
6041 02 Apr 12 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6041 02 Apr 12 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6041 02 Apr 12 nicklas 17   GNU General Public License for more details.
6041 02 Apr 12 nicklas 18   
6041 02 Apr 12 nicklas 19   You should have received a copy of the GNU General Public License
6041 02 Apr 12 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6041 02 Apr 12 nicklas 21 */
6041 02 Apr 12 nicklas 22 package net.sf.basedb.util.overview.loader;
6041 02 Apr 12 nicklas 23
6041 02 Apr 12 nicklas 24 import net.sf.basedb.core.BioPlate;
6210 06 Dec 12 nicklas 25 import net.sf.basedb.core.BioPlateEvent;
6210 06 Dec 12 nicklas 26 import net.sf.basedb.core.BioPlateEventParticipant;
6041 02 Apr 12 nicklas 27 import net.sf.basedb.core.BioWell;
6041 02 Apr 12 nicklas 28 import net.sf.basedb.core.DbControl;
6041 02 Apr 12 nicklas 29 import net.sf.basedb.core.Item;
6210 06 Dec 12 nicklas 30 import net.sf.basedb.core.ItemQuery;
6210 06 Dec 12 nicklas 31 import net.sf.basedb.core.ItemResultIterator;
6041 02 Apr 12 nicklas 32 import net.sf.basedb.core.MeasuredBioMaterial;
6041 02 Apr 12 nicklas 33 import net.sf.basedb.core.PermissionDeniedException;
6210 06 Dec 12 nicklas 34 import net.sf.basedb.core.query.Hql;
6210 06 Dec 12 nicklas 35 import net.sf.basedb.core.query.Orders;
6210 06 Dec 12 nicklas 36 import net.sf.basedb.core.query.Restrictions;
6041 02 Apr 12 nicklas 37 import net.sf.basedb.util.overview.Node;
6041 02 Apr 12 nicklas 38 import net.sf.basedb.util.overview.OverviewContext;
6210 06 Dec 12 nicklas 39 import net.sf.basedb.util.overview.filter.ItemTypeFilter;
6041 02 Apr 12 nicklas 40 import net.sf.basedb.util.overview.node.BioPlateNameGenerator;
6041 02 Apr 12 nicklas 41 import net.sf.basedb.util.overview.node.ChildNodeDirection;
6041 02 Apr 12 nicklas 42 import net.sf.basedb.util.overview.node.NodeFactory;
6041 02 Apr 12 nicklas 43
6041 02 Apr 12 nicklas 44
6041 02 Apr 12 nicklas 45 /**
6041 02 Apr 12 nicklas 46   Node loader implementation for bioplates. Bioplates are
6210 06 Dec 12 nicklas 47   loaded as root nodes, or as property nodes of a biomaterial
6210 06 Dec 12 nicklas 48   or bioplate event. The forward-loading direction goes to the biomaterial 
6210 06 Dec 12 nicklas 49   that is located on the plate. The reverse direction is not loading 
6041 02 Apr 12 nicklas 50   anything.
6041 02 Apr 12 nicklas 51   
6041 02 Apr 12 nicklas 52   @author nicklas
6041 02 Apr 12 nicklas 53   @since 3.2
6041 02 Apr 12 nicklas 54 */
6041 02 Apr 12 nicklas 55 public class BioPlateLoader 
6041 02 Apr 12 nicklas 56   extends BasicItemNodeLoader<BioPlate> 
6041 02 Apr 12 nicklas 57 {
6041 02 Apr 12 nicklas 58   public BioPlateLoader()
6041 02 Apr 12 nicklas 59   {
6041 02 Apr 12 nicklas 60     super(Item.BIOPLATE, ALLOW_ROOT_NODE, 
6041 02 Apr 12 nicklas 61         new BioPlateNameGenerator("bioplate", "Bioplate"));
6041 02 Apr 12 nicklas 62   }
6041 02 Apr 12 nicklas 63   
6041 02 Apr 12 nicklas 64   /*
6041 02 Apr 12 nicklas 65     From the NodeLoader interface
6041 02 Apr 12 nicklas 66     ------------------------------
6041 02 Apr 12 nicklas 67   */
6041 02 Apr 12 nicklas 68
6041 02 Apr 12 nicklas 69   /**
6210 06 Dec 12 nicklas 70     Create a bioplate property node from a biomaterial that is located on a plate
6210 06 Dec 12 nicklas 71     or property nodes for each bioplate that is part of a bioplate event. If the parent
6210 06 Dec 12 nicklas 72     node is a bioplate event the loader only create new nodes for bioplates that are
6210 06 Dec 12 nicklas 73     different from the grandparent (which should be one of the bioplates in the event).
6041 02 Apr 12 nicklas 74     @return A bioplate node, or null if the biomaterial is not located on a plate
6041 02 Apr 12 nicklas 75   */
6041 02 Apr 12 nicklas 76   @Override
6041 02 Apr 12 nicklas 77   public Node createPropertyNode(DbControl dc, OverviewContext context, Node parentNode)
6041 02 Apr 12 nicklas 78   {
6041 02 Apr 12 nicklas 79     Node returnNode = null;
6041 02 Apr 12 nicklas 80     Item parentType = parentNode.getItemType();
6041 02 Apr 12 nicklas 81     if (parentNode.getItem() instanceof MeasuredBioMaterial)
6041 02 Apr 12 nicklas 82     {
6041 02 Apr 12 nicklas 83       returnNode = createPropertyNode((MeasuredBioMaterial)parentNode.getItem(dc), dc, context, parentNode);
6041 02 Apr 12 nicklas 84     }
6210 06 Dec 12 nicklas 85     else if (parentType == Item.BIOPLATEEVENT)
6210 06 Dec 12 nicklas 86     {
6210 06 Dec 12 nicklas 87       returnNode = createPropertyNode((BioPlateEvent)parentNode.getItem(dc), dc, context, parentNode);
6210 06 Dec 12 nicklas 88     }
6041 02 Apr 12 nicklas 89     return returnNode;
6041 02 Apr 12 nicklas 90   }  
6041 02 Apr 12 nicklas 91   // -------------------------------------
6041 02 Apr 12 nicklas 92   
6041 02 Apr 12 nicklas 93   
6041 02 Apr 12 nicklas 94   /*
6041 02 Apr 12 nicklas 95     From the AbstractNodeLoader class
6041 02 Apr 12 nicklas 96     ----------------------------------
6041 02 Apr 12 nicklas 97   */
6041 02 Apr 12 nicklas 98   
6041 02 Apr 12 nicklas 99   /**
6041 02 Apr 12 nicklas 100     Loads the non-empty biowells on the bioplate.
6044 03 Apr 12 nicklas 101     @see BioWellLoader#createForwardNode(DbControl, OverviewContext, Node)
6041 02 Apr 12 nicklas 102   */
6041 02 Apr 12 nicklas 103   @Override
6041 02 Apr 12 nicklas 104   protected void loadForwardChildNodes(DbControl dc, OverviewContext context, Node plateNode)
6041 02 Apr 12 nicklas 105   {
6044 03 Apr 12 nicklas 106     getNodeLoader(context, Item.BIOWELL).createForwardNode(dc, context, plateNode);
6041 02 Apr 12 nicklas 107   }
6042 03 Apr 12 nicklas 108   
6042 03 Apr 12 nicklas 109   /**
6042 03 Apr 12 nicklas 110     Load the freezer node.
6132 14 Sep 12 nicklas 111     @see HardwareLoader#createPropertyNode(DbControl, OverviewContext, Node)
6042 03 Apr 12 nicklas 112   */
6042 03 Apr 12 nicklas 113   @Override
6042 03 Apr 12 nicklas 114   protected void loadPropertyChildNodes(DbControl dc, OverviewContext context, Node plateNode) 
6042 03 Apr 12 nicklas 115   {
6210 06 Dec 12 nicklas 116     getNodeLoader(context, Item.BIOPLATEEVENT).createForwardNode(dc, context, plateNode);
6214 13 Dec 12 nicklas 117     getNodeLoader(context, Item.ANNOTATION).createPropertyNode(dc, context, plateNode);
6042 03 Apr 12 nicklas 118     getNodeLoader(context, Item.HARDWARE).createPropertyNode(dc, context, plateNode);
6214 13 Dec 12 nicklas 119     getNodeLoader(context, Item.ANYTOANY).createPropertyNode(dc, context, plateNode);
6042 03 Apr 12 nicklas 120   }
6041 02 Apr 12 nicklas 121   // ---------------------------------------
6041 02 Apr 12 nicklas 122
6041 02 Apr 12 nicklas 123   /**
6210 06 Dec 12 nicklas 124     Create a property node when the parent item is a biomaterial.
6041 02 Apr 12 nicklas 125   */
6041 02 Apr 12 nicklas 126   private Node createPropertyNode(MeasuredBioMaterial bioMaterial, DbControl dc, OverviewContext context, Node parentNode)
6041 02 Apr 12 nicklas 127   {
6041 02 Apr 12 nicklas 128     NodeFactory<BioPlate> nf = getNodeFactory(dc, context);
6041 02 Apr 12 nicklas 129     BioWell well = null;
6041 02 Apr 12 nicklas 130     BioPlate plate = null;
6041 02 Apr 12 nicklas 131     boolean denied = false;
6041 02 Apr 12 nicklas 132     try
6041 02 Apr 12 nicklas 133     {
6041 02 Apr 12 nicklas 134       well = bioMaterial.getBioWell();
6041 02 Apr 12 nicklas 135       if (well != null) plate = well.getPlate();
6041 02 Apr 12 nicklas 136     }
6041 02 Apr 12 nicklas 137     catch (PermissionDeniedException ex)
6041 02 Apr 12 nicklas 138     {
6041 02 Apr 12 nicklas 139       denied = true;
6041 02 Apr 12 nicklas 140     }
6210 06 Dec 12 nicklas 141     BioPlateNameGenerator nameGenerator = (BioPlateNameGenerator)getNodeNameGenerator();
6210 06 Dec 12 nicklas 142     nameGenerator.setCurrentBioWell(well);
6041 02 Apr 12 nicklas 143     Node plateNode = createItemNode(nf, plate, well, denied, parentNode, ChildNodeDirection.PROPERTY);
6041 02 Apr 12 nicklas 144     return plateNode;
6041 02 Apr 12 nicklas 145   }
6041 02 Apr 12 nicklas 146
6210 06 Dec 12 nicklas 147   /**
6210 06 Dec 12 nicklas 148     Create a property node(s) when the parent item is a bioplate event. All
6210 06 Dec 12 nicklas 149     participants in the events except the immediate parent (if any) are loaded
6210 06 Dec 12 nicklas 150     as property nodes directly under that parent node (not using a folder node).
6210 06 Dec 12 nicklas 151     Null is always returned.
6210 06 Dec 12 nicklas 152   */
6210 06 Dec 12 nicklas 153   private Node createPropertyNode(BioPlateEvent event, DbControl dc, OverviewContext context, Node parentNode)
6210 06 Dec 12 nicklas 154   {
6210 06 Dec 12 nicklas 155     NodeFactory<BioPlate> nf = getNodeFactory(dc, context);
6210 06 Dec 12 nicklas 156     BioPlateNameGenerator nameGenerator = (BioPlateNameGenerator)getNodeNameGenerator();
6210 06 Dec 12 nicklas 157     ItemQuery<BioPlateEventParticipant> query = context.initQuery(event.getParticipants(), Orders.asc(Hql.property("index")));
6210 06 Dec 12 nicklas 158
6210 06 Dec 12 nicklas 159     // Filter away the bioplate we are coming from to avoid infinite recursion problems
6210 06 Dec 12 nicklas 160     Node plateNode = parentNode.getFirstParent(new ItemTypeFilter(Item.BIOPLATE));
6210 06 Dec 12 nicklas 161     if (plateNode != null)
6210 06 Dec 12 nicklas 162     {
6210 06 Dec 12 nicklas 163       query.restrict(Restrictions.neq(Hql.property("bioPlate"), Hql.entity(plateNode.getItem())));
6210 06 Dec 12 nicklas 164     }
6210 06 Dec 12 nicklas 165     
6210 06 Dec 12 nicklas 166     ItemResultIterator<BioPlateEventParticipant> it = query.iterate(dc);
6210 06 Dec 12 nicklas 167     while (it.hasNext())
6210 06 Dec 12 nicklas 168     {
6210 06 Dec 12 nicklas 169       BioPlateEventParticipant participant = it.next();
6210 06 Dec 12 nicklas 170       nameGenerator.setCurrentEventParticipant(participant);
6210 06 Dec 12 nicklas 171       BioPlate plate = null;
6210 06 Dec 12 nicklas 172       try
6210 06 Dec 12 nicklas 173       {
6210 06 Dec 12 nicklas 174         plate = participant.getBioPlate();
6210 06 Dec 12 nicklas 175       }
6210 06 Dec 12 nicklas 176       catch (PermissionDeniedException ex)
6210 06 Dec 12 nicklas 177       {}
6210 06 Dec 12 nicklas 178       createItemNode(nf, plate, participant, plate == null, parentNode, ChildNodeDirection.PROPERTY);
6210 06 Dec 12 nicklas 179     }
6210 06 Dec 12 nicklas 180
6210 06 Dec 12 nicklas 181     return null;
6210 06 Dec 12 nicklas 182   }
6041 02 Apr 12 nicklas 183 }