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

Code
Comments
Other
Rev Date Author Line
6210 06 Dec 12 nicklas 1 /**
6210 06 Dec 12 nicklas 2   $Id$
6210 06 Dec 12 nicklas 3   
6210 06 Dec 12 nicklas 4   Copyright (C) 2012 Nicklas Nordborg
6210 06 Dec 12 nicklas 5   
6210 06 Dec 12 nicklas 6   This file is part of BASE - BioArray Software Environment.
6210 06 Dec 12 nicklas 7   Available at http://base.thep.lu.se/
6210 06 Dec 12 nicklas 8   
6210 06 Dec 12 nicklas 9   BASE is free software; you can redistribute it and/or
6210 06 Dec 12 nicklas 10   modify it under the terms of the GNU General Public License
6210 06 Dec 12 nicklas 11   as published by the Free Software Foundation; either version 3
6210 06 Dec 12 nicklas 12   of the License, or (at your option) any later version.
6210 06 Dec 12 nicklas 13   
6210 06 Dec 12 nicklas 14   BASE is distributed in the hope that it will be useful,
6210 06 Dec 12 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6210 06 Dec 12 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6210 06 Dec 12 nicklas 17   GNU General Public License for more details.
6210 06 Dec 12 nicklas 18   
6210 06 Dec 12 nicklas 19   You should have received a copy of the GNU General Public License
6210 06 Dec 12 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6210 06 Dec 12 nicklas 21 */
6210 06 Dec 12 nicklas 22 package net.sf.basedb.util.overview.loader;
6210 06 Dec 12 nicklas 23
6210 06 Dec 12 nicklas 24 import java.util.HashSet;
6210 06 Dec 12 nicklas 25 import java.util.List;
6210 06 Dec 12 nicklas 26 import java.util.Set;
6210 06 Dec 12 nicklas 27
6210 06 Dec 12 nicklas 28 import net.sf.basedb.core.BioPlate;
6210 06 Dec 12 nicklas 29 import net.sf.basedb.core.BioPlateEvent;
6210 06 Dec 12 nicklas 30 import net.sf.basedb.core.DbControl;
6210 06 Dec 12 nicklas 31 import net.sf.basedb.core.Item;
6210 06 Dec 12 nicklas 32 import net.sf.basedb.core.ItemQuery;
6210 06 Dec 12 nicklas 33 import net.sf.basedb.core.ItemResultIterator;
6210 06 Dec 12 nicklas 34 import net.sf.basedb.core.Type;
6210 06 Dec 12 nicklas 35 import net.sf.basedb.core.query.Expressions;
6210 06 Dec 12 nicklas 36 import net.sf.basedb.core.query.Hql;
6210 06 Dec 12 nicklas 37 import net.sf.basedb.core.query.Restrictions;
6210 06 Dec 12 nicklas 38 import net.sf.basedb.util.overview.Node;
6210 06 Dec 12 nicklas 39 import net.sf.basedb.util.overview.OverviewContext;
6210 06 Dec 12 nicklas 40 import net.sf.basedb.util.overview.filter.ItemTypeFilter;
6210 06 Dec 12 nicklas 41 import net.sf.basedb.util.overview.node.ChildNodeDirection;
6210 06 Dec 12 nicklas 42 import net.sf.basedb.util.overview.node.NameableNameGenerator;
6210 06 Dec 12 nicklas 43 import net.sf.basedb.util.overview.node.NodeFactory;
6210 06 Dec 12 nicklas 44
6210 06 Dec 12 nicklas 45
6210 06 Dec 12 nicklas 46 /**
6210 06 Dec 12 nicklas 47   Node loader implementation for bioplate events. Events are
6210 06 Dec 12 nicklas 48   forward-loading property nodes of a bioplate. The reverse 
6210 06 Dec 12 nicklas 49   direction is not loading anything.
6210 06 Dec 12 nicklas 50   
6210 06 Dec 12 nicklas 51   @author nicklas
6210 06 Dec 12 nicklas 52   @since 3.3
6210 06 Dec 12 nicklas 53 */
6210 06 Dec 12 nicklas 54 public class BioPlateEventLoader 
6210 06 Dec 12 nicklas 55   extends BasicItemNodeLoader<BioPlateEvent> 
6210 06 Dec 12 nicklas 56 {
6210 06 Dec 12 nicklas 57   public BioPlateEventLoader()
6210 06 Dec 12 nicklas 58   {
6210 06 Dec 12 nicklas 59     super(Item.BIOPLATEEVENT, false, 
6210 06 Dec 12 nicklas 60         new NameableNameGenerator<BioPlateEvent>("event", "Event"));
6210 06 Dec 12 nicklas 61   }
6210 06 Dec 12 nicklas 62   
6210 06 Dec 12 nicklas 63   /*
6210 06 Dec 12 nicklas 64     From the NodeLoader interface
6210 06 Dec 12 nicklas 65     ------------------------------
6210 06 Dec 12 nicklas 66   */
6210 06 Dec 12 nicklas 67
6210 06 Dec 12 nicklas 68   /**
6210 06 Dec 12 nicklas 69     Create a forward-loading node from a bioplate. Note that events that already
6210 06 Dec 12 nicklas 70     exists in the parent chain are not loaded again to avoid infinite recursive
6210 06 Dec 12 nicklas 71     loading.
6210 06 Dec 12 nicklas 72     @return A folder node with the events, or null if there are no events for the bioplate
6210 06 Dec 12 nicklas 73   */
6210 06 Dec 12 nicklas 74   @Override
6210 06 Dec 12 nicklas 75   public Node createForwardNode(DbControl dc, OverviewContext context, Node plateNode)
6210 06 Dec 12 nicklas 76   {
6210 06 Dec 12 nicklas 77     BioPlate plate = (BioPlate)plateNode.getItem();
6210 06 Dec 12 nicklas 78     NodeFactory<BioPlateEvent> nf = getNodeFactory(dc, context);
6210 06 Dec 12 nicklas 79     Node folderNode = null;
6210 06 Dec 12 nicklas 80     ItemQuery<BioPlateEvent> query = context.initQuery(plate.getEvents(), "name");
6210 06 Dec 12 nicklas 81     
6210 06 Dec 12 nicklas 82     // We should only load events that hasn't already been loaded in the parent chain
6210 06 Dec 12 nicklas 83     List<Node> eventNodes = plateNode.findAll(new ItemTypeFilter(Item.BIOPLATEEVENT));
6210 06 Dec 12 nicklas 84     if (eventNodes.size() > 0)
6210 06 Dec 12 nicklas 85     {
6210 06 Dec 12 nicklas 86       Set<Integer> eventIds = new HashSet<Integer>(eventNodes.size());
6210 06 Dec 12 nicklas 87       for (Node n : eventNodes)
6210 06 Dec 12 nicklas 88       {
6210 06 Dec 12 nicklas 89         eventIds.add(n.getItem().getId());
6210 06 Dec 12 nicklas 90       }
6210 06 Dec 12 nicklas 91       query.restrict(Restrictions.not(Restrictions.in(Hql.property("id"), Expressions.parameter("events"))));
6210 06 Dec 12 nicklas 92       query.setParameter("events", eventIds, Type.INT);
6210 06 Dec 12 nicklas 93     }
6210 06 Dec 12 nicklas 94
6210 06 Dec 12 nicklas 95     ItemResultIterator<BioPlateEvent> it = query.iterate(dc);
6210 06 Dec 12 nicklas 96     while (it.hasNext())
6210 06 Dec 12 nicklas 97     {
6210 06 Dec 12 nicklas 98       BioPlateEvent event = it.next();
6210 06 Dec 12 nicklas 99       if (folderNode == null)
6210 06 Dec 12 nicklas 100       {
6210 06 Dec 12 nicklas 101         folderNode = new Node("events", "Events", plateNode, ChildNodeDirection.FORWARD);
6210 06 Dec 12 nicklas 102       }
6210 06 Dec 12 nicklas 103       createItemNode(nf, event, event, false, folderNode, ChildNodeDirection.FORWARD);
6210 06 Dec 12 nicklas 104     }
6210 06 Dec 12 nicklas 105     postValidateFolder(nf, folderNode, plateNode, false);
6210 06 Dec 12 nicklas 106     return folderNode;
6210 06 Dec 12 nicklas 107   }  
6210 06 Dec 12 nicklas 108   // -------------------------------------
6210 06 Dec 12 nicklas 109   
6210 06 Dec 12 nicklas 110   /*
6210 06 Dec 12 nicklas 111     From the AbstractNodeLoader class
6210 06 Dec 12 nicklas 112     ----------------------------------
6210 06 Dec 12 nicklas 113   */
6210 06 Dec 12 nicklas 114   
6210 06 Dec 12 nicklas 115   /**
6210 06 Dec 12 nicklas 116     Loads the bioplates that are part of the event.
6497 26 Jun 14 nicklas 117     @see BioPlateLoader#createPropertyNode(DbControl, OverviewContext, Node)
6210 06 Dec 12 nicklas 118   */
6210 06 Dec 12 nicklas 119   @Override
6210 06 Dec 12 nicklas 120   protected void loadForwardChildNodes(DbControl dc, OverviewContext context, Node eventNode)
6210 06 Dec 12 nicklas 121   {
6210 06 Dec 12 nicklas 122     getNodeLoader(context, Item.BIOPLATE).createPropertyNode(dc, context, eventNode);
6210 06 Dec 12 nicklas 123   }
6210 06 Dec 12 nicklas 124   
6210 06 Dec 12 nicklas 125   /**
6210 06 Dec 12 nicklas 126     Loads property nodes of an event. 
6210 06 Dec 12 nicklas 127     <ul>
6210 06 Dec 12 nicklas 128     <li>Protocol: {@link ProtocolLoader#createPropertyNode(DbControl, OverviewContext, Node)}
7004 09 Nov 15 nicklas 129     <li>Kit: {@link KitLoader#createPropertyNode(DbControl, OverviewContext, Node)}
6210 06 Dec 12 nicklas 130     <li>Hardware: {@link HardwareLoader#createPropertyNode(DbControl, OverviewContext, Node)}
6210 06 Dec 12 nicklas 131     </ul>
6210 06 Dec 12 nicklas 132   */
6210 06 Dec 12 nicklas 133   @Override
6210 06 Dec 12 nicklas 134   protected void loadPropertyChildNodes(DbControl dc, OverviewContext context, Node eventNode) 
6210 06 Dec 12 nicklas 135   {
6210 06 Dec 12 nicklas 136     getNodeLoader(context, Item.PROTOCOL).createPropertyNode(dc, context, eventNode);
7004 09 Nov 15 nicklas 137     getNodeLoader(context, Item.KIT).createPropertyNode(dc, context, eventNode);
6210 06 Dec 12 nicklas 138     getNodeLoader(context, Item.HARDWARE).createPropertyNode(dc, context, eventNode);
6210 06 Dec 12 nicklas 139   }
6210 06 Dec 12 nicklas 140   // ---------------------------------------
6210 06 Dec 12 nicklas 141
6210 06 Dec 12 nicklas 142 }