6041 |
02 Apr 12 |
nicklas |
1 |
/** |
6041 |
02 Apr 12 |
nicklas |
$Id$ |
6041 |
02 Apr 12 |
nicklas |
3 |
|
6041 |
02 Apr 12 |
nicklas |
Copyright (C) 2012 Nicklas Nordborg |
6041 |
02 Apr 12 |
nicklas |
5 |
|
6041 |
02 Apr 12 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
6041 |
02 Apr 12 |
nicklas |
Available at http://base.thep.lu.se/ |
6041 |
02 Apr 12 |
nicklas |
8 |
|
6041 |
02 Apr 12 |
nicklas |
BASE is free software; you can redistribute it and/or |
6041 |
02 Apr 12 |
nicklas |
modify it under the terms of the GNU General Public License |
6041 |
02 Apr 12 |
nicklas |
as published by the Free Software Foundation; either version 3 |
6041 |
02 Apr 12 |
nicklas |
of the License, or (at your option) any later version. |
6041 |
02 Apr 12 |
nicklas |
13 |
|
6041 |
02 Apr 12 |
nicklas |
BASE is distributed in the hope that it will be useful, |
6041 |
02 Apr 12 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
6041 |
02 Apr 12 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
6041 |
02 Apr 12 |
nicklas |
GNU General Public License for more details. |
6041 |
02 Apr 12 |
nicklas |
18 |
|
6041 |
02 Apr 12 |
nicklas |
You should have received a copy of the GNU General Public License |
6041 |
02 Apr 12 |
nicklas |
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 |
Node loader implementation for bioplates. Bioplates are |
6210 |
06 Dec 12 |
nicklas |
loaded as root nodes, or as property nodes of a biomaterial |
6210 |
06 Dec 12 |
nicklas |
or bioplate event. The forward-loading direction goes to the biomaterial |
6210 |
06 Dec 12 |
nicklas |
that is located on the plate. The reverse direction is not loading |
6041 |
02 Apr 12 |
nicklas |
anything. |
6041 |
02 Apr 12 |
nicklas |
51 |
|
6041 |
02 Apr 12 |
nicklas |
@author nicklas |
6041 |
02 Apr 12 |
nicklas |
@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 |
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 |
Create a bioplate property node from a biomaterial that is located on a plate |
6210 |
06 Dec 12 |
nicklas |
or property nodes for each bioplate that is part of a bioplate event. If the parent |
6210 |
06 Dec 12 |
nicklas |
node is a bioplate event the loader only create new nodes for bioplates that are |
6210 |
06 Dec 12 |
nicklas |
different from the grandparent (which should be one of the bioplates in the event). |
6041 |
02 Apr 12 |
nicklas |
@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 |
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 |
Loads the non-empty biowells on the bioplate. |
6044 |
03 Apr 12 |
nicklas |
@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 |
Load the freezer node. |
6132 |
14 Sep 12 |
nicklas |
@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 |
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 |
Create a property node(s) when the parent item is a bioplate event. All |
6210 |
06 Dec 12 |
nicklas |
participants in the events except the immediate parent (if any) are loaded |
6210 |
06 Dec 12 |
nicklas |
as property nodes directly under that parent node (not using a folder node). |
6210 |
06 Dec 12 |
nicklas |
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 |
// 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 |
} |