5652 |
10 Jun 11 |
nicklas |
1 |
/** |
5652 |
10 Jun 11 |
nicklas |
$Id$ |
5652 |
10 Jun 11 |
nicklas |
3 |
|
5652 |
10 Jun 11 |
nicklas |
Copyright (C) 2011 Nicklas Nordborg |
5652 |
10 Jun 11 |
nicklas |
5 |
|
5652 |
10 Jun 11 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
5652 |
10 Jun 11 |
nicklas |
Available at http://base.thep.lu.se/ |
5652 |
10 Jun 11 |
nicklas |
8 |
|
5652 |
10 Jun 11 |
nicklas |
BASE is free software; you can redistribute it and/or |
5652 |
10 Jun 11 |
nicklas |
modify it under the terms of the GNU General Public License |
5652 |
10 Jun 11 |
nicklas |
as published by the Free Software Foundation; either version 3 |
5652 |
10 Jun 11 |
nicklas |
of the License, or (at your option) any later version. |
5652 |
10 Jun 11 |
nicklas |
13 |
|
5652 |
10 Jun 11 |
nicklas |
BASE is distributed in the hope that it will be useful, |
5652 |
10 Jun 11 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
5652 |
10 Jun 11 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
5652 |
10 Jun 11 |
nicklas |
GNU General Public License for more details. |
5652 |
10 Jun 11 |
nicklas |
18 |
|
5652 |
10 Jun 11 |
nicklas |
You should have received a copy of the GNU General Public License |
5652 |
10 Jun 11 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
5652 |
10 Jun 11 |
nicklas |
21 |
*/ |
5652 |
10 Jun 11 |
nicklas |
22 |
package net.sf.basedb.util.overview.loader; |
5652 |
10 Jun 11 |
nicklas |
23 |
|
7303 |
01 Mar 17 |
nicklas |
24 |
import java.util.Collections; |
6090 |
22 Aug 12 |
nicklas |
25 |
import java.util.HashSet; |
6090 |
22 Aug 12 |
nicklas |
26 |
import java.util.List; |
6090 |
22 Aug 12 |
nicklas |
27 |
import java.util.Set; |
6090 |
22 Aug 12 |
nicklas |
28 |
|
5652 |
10 Jun 11 |
nicklas |
29 |
import net.sf.basedb.core.DbControl; |
5652 |
10 Jun 11 |
nicklas |
30 |
import net.sf.basedb.core.DerivedBioAssay; |
5748 |
19 Sep 11 |
nicklas |
31 |
import net.sf.basedb.core.Extract; |
5652 |
10 Jun 11 |
nicklas |
32 |
import net.sf.basedb.core.Item; |
5652 |
10 Jun 11 |
nicklas |
33 |
import net.sf.basedb.core.ItemQuery; |
5652 |
10 Jun 11 |
nicklas |
34 |
import net.sf.basedb.core.ItemResultIterator; |
5652 |
10 Jun 11 |
nicklas |
35 |
import net.sf.basedb.core.PermissionDeniedException; |
5652 |
10 Jun 11 |
nicklas |
36 |
import net.sf.basedb.core.PhysicalBioAssay; |
5748 |
19 Sep 11 |
nicklas |
37 |
import net.sf.basedb.core.RawBioAssay; |
6959 |
01 Oct 15 |
nicklas |
38 |
import net.sf.basedb.core.RootRawBioAssay; |
6090 |
22 Aug 12 |
nicklas |
39 |
import net.sf.basedb.core.Type; |
6090 |
22 Aug 12 |
nicklas |
40 |
import net.sf.basedb.core.query.Expressions; |
5748 |
19 Sep 11 |
nicklas |
41 |
import net.sf.basedb.core.query.Hql; |
5748 |
19 Sep 11 |
nicklas |
42 |
import net.sf.basedb.core.query.Restrictions; |
7302 |
01 Mar 17 |
nicklas |
43 |
import net.sf.basedb.util.listable.ExtractToParentExtractTransformer; |
7302 |
01 Mar 17 |
nicklas |
44 |
import net.sf.basedb.util.listable.SourceItemTransformer; |
7302 |
01 Mar 17 |
nicklas |
45 |
import net.sf.basedb.util.listable.TransformContext; |
6090 |
22 Aug 12 |
nicklas |
46 |
import net.sf.basedb.util.overview.Fix; |
5652 |
10 Jun 11 |
nicklas |
47 |
import net.sf.basedb.util.overview.Node; |
5748 |
19 Sep 11 |
nicklas |
48 |
import net.sf.basedb.util.overview.NodeAttribute; |
5652 |
10 Jun 11 |
nicklas |
49 |
import net.sf.basedb.util.overview.OverviewContext; |
6090 |
22 Aug 12 |
nicklas |
50 |
import net.sf.basedb.util.overview.OverviewUtil; |
6090 |
22 Aug 12 |
nicklas |
51 |
import net.sf.basedb.util.overview.Validator; |
7494 |
04 Jun 18 |
nicklas |
52 |
import net.sf.basedb.util.overview.filter.BasicItemFilter; |
5653 |
13 Jun 11 |
nicklas |
53 |
import net.sf.basedb.util.overview.filter.ItemTypeFilter; |
5652 |
10 Jun 11 |
nicklas |
54 |
import net.sf.basedb.util.overview.node.ChildNodeDirection; |
5652 |
10 Jun 11 |
nicklas |
55 |
import net.sf.basedb.util.overview.node.NameableNameGenerator; |
5652 |
10 Jun 11 |
nicklas |
56 |
import net.sf.basedb.util.overview.node.NodeFactory; |
5652 |
10 Jun 11 |
nicklas |
57 |
|
5652 |
10 Jun 11 |
nicklas |
58 |
/** |
5652 |
10 Jun 11 |
nicklas |
59 |
|
5652 |
10 Jun 11 |
nicklas |
@author Nicklas |
5652 |
10 Jun 11 |
nicklas |
@since 3.0 |
5652 |
10 Jun 11 |
nicklas |
@base.modified $Date$ |
5652 |
10 Jun 11 |
nicklas |
63 |
*/ |
5685 |
04 Aug 11 |
nicklas |
64 |
public class DerivedBioAssayLoader |
5685 |
04 Aug 11 |
nicklas |
65 |
extends BasicItemNodeLoader<DerivedBioAssay> |
5652 |
10 Jun 11 |
nicklas |
66 |
{ |
5685 |
04 Aug 11 |
nicklas |
67 |
public DerivedBioAssayLoader() |
5652 |
10 Jun 11 |
nicklas |
68 |
{ |
5685 |
04 Aug 11 |
nicklas |
69 |
super(Item.DERIVEDBIOASSAY, ALLOW_ROOT_NODE, |
5685 |
04 Aug 11 |
nicklas |
70 |
new NameableNameGenerator<DerivedBioAssay>("bioassayset", "Bioassay")); |
5652 |
10 Jun 11 |
nicklas |
71 |
} |
5652 |
10 Jun 11 |
nicklas |
72 |
|
5652 |
10 Jun 11 |
nicklas |
73 |
/* |
5652 |
10 Jun 11 |
nicklas |
From the NodeLoader interface |
5652 |
10 Jun 11 |
nicklas |
75 |
------------------------------ |
5652 |
10 Jun 11 |
nicklas |
76 |
*/ |
5748 |
19 Sep 11 |
nicklas |
77 |
@Override |
5748 |
19 Sep 11 |
nicklas |
78 |
public Node createRootNode(DbControl dc, OverviewContext context, DerivedBioAssay item) |
5748 |
19 Sep 11 |
nicklas |
79 |
{ |
5748 |
19 Sep 11 |
nicklas |
80 |
Node node = super.createRootNode(dc, context, item); |
6090 |
22 Aug 12 |
nicklas |
81 |
Extract extract = getExtract(item); |
5748 |
19 Sep 11 |
nicklas |
82 |
if (extract != null) node.setAttribute(NodeAttribute.EXTRACT, extract); |
5748 |
19 Sep 11 |
nicklas |
83 |
return node; |
5748 |
19 Sep 11 |
nicklas |
84 |
} |
5748 |
19 Sep 11 |
nicklas |
85 |
|
5652 |
10 Jun 11 |
nicklas |
86 |
/** |
5652 |
10 Jun 11 |
nicklas |
Create forward-loading bioassay nodes from a given physical bioassay node or a |
5652 |
10 Jun 11 |
nicklas |
parent derived bioassay set node. The returned node is a folder-type node containing |
5652 |
10 Jun 11 |
nicklas |
item nodes for each bioassay set. |
5652 |
10 Jun 11 |
nicklas |
@return The folder node for the bioassay sets |
5652 |
10 Jun 11 |
nicklas |
91 |
*/ |
5652 |
10 Jun 11 |
nicklas |
92 |
@Override |
5652 |
10 Jun 11 |
nicklas |
93 |
public Node createForwardNode(DbControl dc, OverviewContext context, Node parentNode) |
5652 |
10 Jun 11 |
nicklas |
94 |
{ |
5652 |
10 Jun 11 |
nicklas |
95 |
Node returnNode = null; |
5652 |
10 Jun 11 |
nicklas |
96 |
Item parentType = parentNode.getItemType(); |
5652 |
10 Jun 11 |
nicklas |
97 |
if (parentType == Item.PHYSICALBIOASSAY) |
5652 |
10 Jun 11 |
nicklas |
98 |
{ |
5652 |
10 Jun 11 |
nicklas |
99 |
returnNode = createForwardNode((PhysicalBioAssay)parentNode.getItem(dc), dc, context, parentNode); |
5652 |
10 Jun 11 |
nicklas |
100 |
} |
5685 |
04 Aug 11 |
nicklas |
101 |
else if (parentType == Item.DERIVEDBIOASSAY) |
5652 |
10 Jun 11 |
nicklas |
102 |
{ |
5685 |
04 Aug 11 |
nicklas |
103 |
returnNode = createForwardNode((DerivedBioAssay)parentNode.getItem(dc), dc, context, parentNode); |
5652 |
10 Jun 11 |
nicklas |
104 |
} |
7301 |
01 Mar 17 |
nicklas |
105 |
else if (parentType == Item.EXTRACT) |
7301 |
01 Mar 17 |
nicklas |
106 |
{ |
7301 |
01 Mar 17 |
nicklas |
107 |
returnNode = createForwardNode((Extract)parentNode.getItem(dc), dc, context, parentNode); |
7301 |
01 Mar 17 |
nicklas |
108 |
} |
6755 |
20 Feb 15 |
nicklas |
109 |
else if (parentType == Item.ITEMLIST) |
6755 |
20 Feb 15 |
nicklas |
110 |
{ |
6755 |
20 Feb 15 |
nicklas |
111 |
ItemListLoader.loadMemberNodes(this, dc, context, parentNode); |
6755 |
20 Feb 15 |
nicklas |
112 |
} |
5653 |
13 Jun 11 |
nicklas |
113 |
return returnNode; |
5652 |
10 Jun 11 |
nicklas |
114 |
} |
5652 |
10 Jun 11 |
nicklas |
115 |
|
5652 |
10 Jun 11 |
nicklas |
116 |
/** |
5748 |
19 Sep 11 |
nicklas |
Create a reverse-loading bioassay node from a cild bioassay node or |
5748 |
19 Sep 11 |
nicklas |
a raw bioassay node. |
5748 |
19 Sep 11 |
nicklas |
@return A bioassay node, or null if the raw bioassay doesn't have a parent bioassay |
5652 |
10 Jun 11 |
nicklas |
120 |
*/ |
5652 |
10 Jun 11 |
nicklas |
121 |
@Override |
5653 |
13 Jun 11 |
nicklas |
122 |
public Node createReverseNode(DbControl dc, OverviewContext context, Node parentNode) |
5652 |
10 Jun 11 |
nicklas |
123 |
{ |
5653 |
13 Jun 11 |
nicklas |
124 |
Node returnNode = null; |
5653 |
13 Jun 11 |
nicklas |
125 |
Item parentType = parentNode.getItemType(); |
5653 |
13 Jun 11 |
nicklas |
126 |
if (parentType == Item.DERIVEDBIOASSAY) |
5653 |
13 Jun 11 |
nicklas |
127 |
{ |
5653 |
13 Jun 11 |
nicklas |
128 |
returnNode = createReverseNode((DerivedBioAssay)parentNode.getItem(dc), dc, context, parentNode); |
5653 |
13 Jun 11 |
nicklas |
129 |
} |
5748 |
19 Sep 11 |
nicklas |
130 |
else if (parentType == Item.RAWBIOASSAY) |
5652 |
10 Jun 11 |
nicklas |
131 |
{ |
5748 |
19 Sep 11 |
nicklas |
132 |
returnNode = createReverseNode((RawBioAssay)parentNode.getItem(dc), dc, context, parentNode); |
5652 |
10 Jun 11 |
nicklas |
133 |
} |
6959 |
01 Oct 15 |
nicklas |
134 |
else if (parentType == Item.ROOTRAWBIOASSAY) |
6959 |
01 Oct 15 |
nicklas |
135 |
{ |
6959 |
01 Oct 15 |
nicklas |
136 |
RootRawBioAssay root = (RootRawBioAssay)parentNode.getItem(dc); |
6959 |
01 Oct 15 |
nicklas |
137 |
returnNode = createReverseNode(root.getRawBioAssay(), dc, context, parentNode); |
6959 |
01 Oct 15 |
nicklas |
138 |
} |
5653 |
13 Jun 11 |
nicklas |
139 |
return returnNode; |
5652 |
10 Jun 11 |
nicklas |
140 |
} |
5652 |
10 Jun 11 |
nicklas |
141 |
// -------------------------------- |
5652 |
10 Jun 11 |
nicklas |
142 |
/* |
5652 |
10 Jun 11 |
nicklas |
From the AbstractNodeLoader class |
5652 |
10 Jun 11 |
nicklas |
144 |
---------------------------------- |
5652 |
10 Jun 11 |
nicklas |
145 |
*/ |
5652 |
10 Jun 11 |
nicklas |
146 |
/** |
5652 |
10 Jun 11 |
nicklas |
Loads property nodes of a derived bioassay set. |
5652 |
10 Jun 11 |
nicklas |
<ul> |
5652 |
10 Jun 11 |
nicklas |
<li>Annotations: {@link AnnotationLoader#createPropertyNode(DbControl, OverviewContext, Node)} |
5652 |
10 Jun 11 |
nicklas |
<li>Data files: {@link DataFileLoader#createPropertyNode(DbControl, OverviewContext, Node)} |
5652 |
10 Jun 11 |
nicklas |
<li>Protocol: {@link ProtocolLoader#createPropertyNode(DbControl, OverviewContext, Node)} |
7004 |
09 Nov 15 |
nicklas |
<li>Kit: {@link KitLoader#createPropertyNode(DbControl, OverviewContext, Node)} |
5652 |
10 Jun 11 |
nicklas |
<li>Hardware: {@link HardwareLoader#createPropertyNode(DbControl, OverviewContext, Node)} |
5652 |
10 Jun 11 |
nicklas |
<li>Software: {@link SoftwareLoader#createPropertyNode(DbControl, OverviewContext, Node)} |
5652 |
10 Jun 11 |
nicklas |
</ul> |
5652 |
10 Jun 11 |
nicklas |
156 |
*/ |
5652 |
10 Jun 11 |
nicklas |
157 |
@Override |
5652 |
10 Jun 11 |
nicklas |
158 |
protected void loadPropertyChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode) |
5652 |
10 Jun 11 |
nicklas |
159 |
{ |
7494 |
04 Jun 18 |
nicklas |
160 |
Extract e = getExtract((DerivedBioAssay)bioAssayNode.getItem()); |
7494 |
04 Jun 18 |
nicklas |
161 |
if (e == null || bioAssayNode.getFirstParent(new BasicItemFilter(e)) == null) |
7494 |
04 Jun 18 |
nicklas |
162 |
{ |
7494 |
04 Jun 18 |
nicklas |
// Only load the extract if it is not already a parent node |
7494 |
04 Jun 18 |
nicklas |
164 |
getNodeLoader(context, Item.EXTRACT).createReverseNode(dc, context, bioAssayNode); |
7494 |
04 Jun 18 |
nicklas |
165 |
} |
5652 |
10 Jun 11 |
nicklas |
166 |
getNodeLoader(context, Item.ANNOTATION).createPropertyNode(dc, context, bioAssayNode); |
5652 |
10 Jun 11 |
nicklas |
167 |
getNodeLoader(context, Item.FILESETMEMBER).createPropertyNode(dc, context, bioAssayNode); |
5652 |
10 Jun 11 |
nicklas |
168 |
getNodeLoader(context, Item.PROTOCOL).createPropertyNode(dc, context, bioAssayNode); |
7004 |
09 Nov 15 |
nicklas |
169 |
getNodeLoader(context, Item.KIT).createPropertyNode(dc, context, bioAssayNode); |
5652 |
10 Jun 11 |
nicklas |
170 |
getNodeLoader(context, Item.HARDWARE).createPropertyNode(dc, context, bioAssayNode); |
5652 |
10 Jun 11 |
nicklas |
171 |
getNodeLoader(context, Item.SOFTWARE).createPropertyNode(dc, context, bioAssayNode); |
5652 |
10 Jun 11 |
nicklas |
172 |
getNodeLoader(context, Item.ANYTOANY).createPropertyNode(dc, context, bioAssayNode); |
5652 |
10 Jun 11 |
nicklas |
173 |
} |
5652 |
10 Jun 11 |
nicklas |
174 |
|
5652 |
10 Jun 11 |
nicklas |
175 |
/** |
5685 |
04 Aug 11 |
nicklas |
Loads all child derived bioassay and raw bioassay nodes. |
5652 |
10 Jun 11 |
nicklas |
@see DerivedBioAssayLoader#createForwardNode(DbControl, OverviewContext, Node) |
5685 |
04 Aug 11 |
nicklas |
@see RawBioAssayLoader#createForwardNode(DbControl, OverviewContext, Node) |
5652 |
10 Jun 11 |
nicklas |
179 |
*/ |
5652 |
10 Jun 11 |
nicklas |
180 |
@Override |
5652 |
10 Jun 11 |
nicklas |
181 |
protected void loadForwardChildNodes(DbControl dc, OverviewContext context, Node parentNode) |
5652 |
10 Jun 11 |
nicklas |
182 |
{ |
5652 |
10 Jun 11 |
nicklas |
183 |
getNodeLoader(context, Item.DERIVEDBIOASSAY).createForwardNode(dc, context, parentNode); |
5685 |
04 Aug 11 |
nicklas |
184 |
getNodeLoader(context, Item.RAWBIOASSAY).createForwardNode(dc, context, parentNode); |
5652 |
10 Jun 11 |
nicklas |
185 |
} |
5652 |
10 Jun 11 |
nicklas |
186 |
|
5652 |
10 Jun 11 |
nicklas |
187 |
/** |
5748 |
19 Sep 11 |
nicklas |
Loads the parent bioassay or the parent physical bioassay. |
5652 |
10 Jun 11 |
nicklas |
@see PhysicalBioAssayLoader#createReverseNode(DbControl, OverviewContext, Node) |
5685 |
04 Aug 11 |
nicklas |
@see DerivedBioAssayLoader#createReverseNode(DbControl, OverviewContext, Node) |
5652 |
10 Jun 11 |
nicklas |
191 |
*/ |
5652 |
10 Jun 11 |
nicklas |
192 |
@Override |
5748 |
19 Sep 11 |
nicklas |
193 |
protected void loadReverseChildNodes(DbControl dc, OverviewContext context, Node bioAssayNode) |
5652 |
10 Jun 11 |
nicklas |
194 |
{ |
5748 |
19 Sep 11 |
nicklas |
195 |
DerivedBioAssay dbas = (DerivedBioAssay)bioAssayNode.getItem(dc); |
5653 |
13 Jun 11 |
nicklas |
196 |
if (dbas.isRoot()) |
5653 |
13 Jun 11 |
nicklas |
197 |
{ |
5748 |
19 Sep 11 |
nicklas |
198 |
getNodeLoader(context, Item.PHYSICALBIOASSAY).createReverseNode(dc, context, bioAssayNode); |
5653 |
13 Jun 11 |
nicklas |
199 |
} |
5653 |
13 Jun 11 |
nicklas |
200 |
else |
5653 |
13 Jun 11 |
nicklas |
201 |
{ |
5748 |
19 Sep 11 |
nicklas |
202 |
getNodeLoader(context, Item.DERIVEDBIOASSAY).createReverseNode(dc, context, bioAssayNode); |
5653 |
13 Jun 11 |
nicklas |
203 |
} |
5652 |
10 Jun 11 |
nicklas |
204 |
} |
5652 |
10 Jun 11 |
nicklas |
205 |
// --------------------------------------- |
5652 |
10 Jun 11 |
nicklas |
206 |
|
5652 |
10 Jun 11 |
nicklas |
207 |
|
5652 |
10 Jun 11 |
nicklas |
208 |
/** |
5685 |
04 Aug 11 |
nicklas |
Create forward-loading derived bioassay nodes that have the given |
5685 |
04 Aug 11 |
nicklas |
physical bioassay as the immediate parent (eg. root bioassays). |
5652 |
10 Jun 11 |
nicklas |
211 |
*/ |
5748 |
19 Sep 11 |
nicklas |
212 |
private Node createForwardNode(PhysicalBioAssay bioAssay, DbControl dc, OverviewContext context, Node bioAssayNode) |
5652 |
10 Jun 11 |
nicklas |
213 |
{ |
5685 |
04 Aug 11 |
nicklas |
214 |
NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context); |
5652 |
10 Jun 11 |
nicklas |
215 |
Node folderNode = null; |
5685 |
04 Aug 11 |
nicklas |
216 |
ItemQuery<DerivedBioAssay> query = context.initQuery(bioAssay.getRootDerivedBioAssays(), "name"); |
5748 |
19 Sep 11 |
nicklas |
217 |
|
6090 |
22 Aug 12 |
nicklas |
// We should only load derived bioassays that has a null extract or an |
6090 |
22 Aug 12 |
nicklas |
// extract that is found in the parent chain |
7303 |
01 Mar 17 |
nicklas |
220 |
Set<Integer> extractIds = getExtractChain(dc, bioAssayNode); |
6090 |
22 Aug 12 |
nicklas |
221 |
if (extractIds.size() > 0) |
7303 |
01 Mar 17 |
nicklas |
222 |
{ |
6090 |
22 Aug 12 |
nicklas |
223 |
query.restrict( |
6090 |
22 Aug 12 |
nicklas |
224 |
Restrictions.or( |
6090 |
22 Aug 12 |
nicklas |
225 |
Restrictions.eq(Hql.property("extract"), null), |
6090 |
22 Aug 12 |
nicklas |
226 |
Restrictions.in(Hql.property("extract"), Expressions.parameter("extracts")) |
6090 |
22 Aug 12 |
nicklas |
227 |
)); |
7303 |
01 Mar 17 |
nicklas |
228 |
query.setParameter("extracts", extractIds, Type.INT); |
5748 |
19 Sep 11 |
nicklas |
229 |
} |
6090 |
22 Aug 12 |
nicklas |
230 |
|
5685 |
04 Aug 11 |
nicklas |
231 |
ItemResultIterator<DerivedBioAssay> it = query.iterate(dc); |
5652 |
10 Jun 11 |
nicklas |
232 |
while (it.hasNext()) |
5652 |
10 Jun 11 |
nicklas |
233 |
{ |
5748 |
19 Sep 11 |
nicklas |
234 |
DerivedBioAssay child = it.next(); |
5652 |
10 Jun 11 |
nicklas |
235 |
if (folderNode == null) |
5652 |
10 Jun 11 |
nicklas |
236 |
{ |
5748 |
19 Sep 11 |
nicklas |
237 |
folderNode = new Node("bioassays", "Bioassays", bioAssayNode, ChildNodeDirection.FORWARD); |
5652 |
10 Jun 11 |
nicklas |
238 |
} |
6090 |
22 Aug 12 |
nicklas |
239 |
Object cacheKey = extractIds.size() > 0 ? null : child; |
5748 |
19 Sep 11 |
nicklas |
240 |
createItemNode(nf, child, cacheKey, false, folderNode, ChildNodeDirection.FORWARD); |
5652 |
10 Jun 11 |
nicklas |
241 |
} |
5748 |
19 Sep 11 |
nicklas |
242 |
postValidateFolder(nf, folderNode, bioAssayNode, false); |
5652 |
10 Jun 11 |
nicklas |
243 |
return folderNode; |
5652 |
10 Jun 11 |
nicklas |
244 |
} |
5652 |
10 Jun 11 |
nicklas |
245 |
|
5652 |
10 Jun 11 |
nicklas |
246 |
/** |
5652 |
10 Jun 11 |
nicklas |
Create forward-loading derived bioassay set nodes that have the given |
5652 |
10 Jun 11 |
nicklas |
derived bioassay set as the parent |
5652 |
10 Jun 11 |
nicklas |
249 |
*/ |
5685 |
04 Aug 11 |
nicklas |
250 |
private Node createForwardNode(DerivedBioAssay parent, DbControl dc, OverviewContext context, Node parentNode) |
5652 |
10 Jun 11 |
nicklas |
251 |
{ |
5685 |
04 Aug 11 |
nicklas |
252 |
NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context); |
5652 |
10 Jun 11 |
nicklas |
253 |
Node folderNode = null; |
5748 |
19 Sep 11 |
nicklas |
254 |
|
5685 |
04 Aug 11 |
nicklas |
255 |
ItemQuery<DerivedBioAssay> query = context.initQuery(parent.getChildren(), "name"); |
5748 |
19 Sep 11 |
nicklas |
256 |
|
6090 |
22 Aug 12 |
nicklas |
// We should only load derived bioassays that has a null extract or an |
6090 |
22 Aug 12 |
nicklas |
// extract that is found in the parent chain |
7303 |
01 Mar 17 |
nicklas |
259 |
Set<Integer> extractIds = getExtractChain(dc, parentNode); |
6090 |
22 Aug 12 |
nicklas |
260 |
if (extractIds.size() > 0) |
7303 |
01 Mar 17 |
nicklas |
261 |
{ |
6090 |
22 Aug 12 |
nicklas |
262 |
query.restrict( |
6090 |
22 Aug 12 |
nicklas |
263 |
Restrictions.or( |
6090 |
22 Aug 12 |
nicklas |
264 |
Restrictions.eq(Hql.property("extract"), null), |
6090 |
22 Aug 12 |
nicklas |
265 |
Restrictions.in(Hql.property("extract"), Expressions.parameter("extracts")) |
6090 |
22 Aug 12 |
nicklas |
266 |
)); |
7303 |
01 Mar 17 |
nicklas |
267 |
query.setParameter("extracts", extractIds, Type.INT); |
5748 |
19 Sep 11 |
nicklas |
268 |
} |
5748 |
19 Sep 11 |
nicklas |
269 |
|
5685 |
04 Aug 11 |
nicklas |
270 |
ItemResultIterator<DerivedBioAssay> it = query.iterate(dc); |
5652 |
10 Jun 11 |
nicklas |
271 |
while (it.hasNext()) |
5652 |
10 Jun 11 |
nicklas |
272 |
{ |
5748 |
19 Sep 11 |
nicklas |
273 |
DerivedBioAssay child = it.next(); |
5652 |
10 Jun 11 |
nicklas |
274 |
if (folderNode == null) |
5652 |
10 Jun 11 |
nicklas |
275 |
{ |
5748 |
19 Sep 11 |
nicklas |
276 |
folderNode = new Node("bioassays", "Child bioassays", parentNode, ChildNodeDirection.FORWARD); |
5652 |
10 Jun 11 |
nicklas |
277 |
} |
6090 |
22 Aug 12 |
nicklas |
278 |
Object cacheKey = extractIds.size() > 0 ? null : child; |
5748 |
19 Sep 11 |
nicklas |
279 |
createItemNode(nf, child, cacheKey, false, folderNode, ChildNodeDirection.FORWARD); |
5652 |
10 Jun 11 |
nicklas |
280 |
} |
5652 |
10 Jun 11 |
nicklas |
281 |
postValidateFolder(nf, folderNode, parentNode, false); |
5652 |
10 Jun 11 |
nicklas |
282 |
return folderNode; |
5652 |
10 Jun 11 |
nicklas |
283 |
} |
5652 |
10 Jun 11 |
nicklas |
284 |
|
7301 |
01 Mar 17 |
nicklas |
285 |
private Node createForwardNode(Extract extract, DbControl dc, OverviewContext context, Node extractNode) |
7301 |
01 Mar 17 |
nicklas |
286 |
{ |
7301 |
01 Mar 17 |
nicklas |
287 |
NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context); |
7301 |
01 Mar 17 |
nicklas |
288 |
Node folderNode = null; |
7494 |
04 Jun 18 |
nicklas |
// Load derived bioassays linked to the 'extract' if: |
7494 |
04 Jun 18 |
nicklas |
// they have no parent bioassay OR |
7494 |
04 Jun 18 |
nicklas |
// the parent bioassay has no parent extract OR |
7494 |
04 Jun 18 |
nicklas |
// the parent bioassay has a different parent extract |
7301 |
01 Mar 17 |
nicklas |
293 |
ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery(); |
7301 |
01 Mar 17 |
nicklas |
294 |
query.restrict(Restrictions.eq(Hql.property("extract"), Hql.entity(extract))); |
7301 |
01 Mar 17 |
nicklas |
295 |
query.join(Hql.leftJoin("parents", "parent")); |
7494 |
04 Jun 18 |
nicklas |
296 |
query.join(Hql.leftJoin("parent", "extract", "parentExtract", null, false)); |
7494 |
04 Jun 18 |
nicklas |
297 |
query.restrict( |
7494 |
04 Jun 18 |
nicklas |
298 |
Restrictions.or( |
7494 |
04 Jun 18 |
nicklas |
299 |
Restrictions.eq(Hql.alias("parent"), null), |
7494 |
04 Jun 18 |
nicklas |
300 |
Restrictions.eq(Hql.alias("parentExtract"), null), |
7494 |
04 Jun 18 |
nicklas |
301 |
Restrictions.neq(Hql.alias("parentExtract"), Hql.entity(extract)) |
7494 |
04 Jun 18 |
nicklas |
302 |
)); |
7494 |
04 Jun 18 |
nicklas |
303 |
query.setDistinct(true); // left joins may create multiple hits for items with more than one parent |
7301 |
01 Mar 17 |
nicklas |
304 |
context.initQuery(query, "name"); |
7301 |
01 Mar 17 |
nicklas |
305 |
ItemResultIterator<DerivedBioAssay> it = query.iterate(dc); |
7301 |
01 Mar 17 |
nicklas |
306 |
while (it.hasNext()) |
7301 |
01 Mar 17 |
nicklas |
307 |
{ |
7301 |
01 Mar 17 |
nicklas |
308 |
DerivedBioAssay dba = it.next(); |
7301 |
01 Mar 17 |
nicklas |
309 |
if (folderNode == null) |
7301 |
01 Mar 17 |
nicklas |
310 |
{ |
7301 |
01 Mar 17 |
nicklas |
311 |
folderNode = new Node("derivedbioassays", "Derived bioassays", extractNode, ChildNodeDirection.FORWARD); |
7301 |
01 Mar 17 |
nicklas |
312 |
} |
7301 |
01 Mar 17 |
nicklas |
313 |
createItemNode(nf, dba, dba, false, folderNode, ChildNodeDirection.FORWARD); |
7301 |
01 Mar 17 |
nicklas |
314 |
} |
7301 |
01 Mar 17 |
nicklas |
315 |
postValidateFolder(nf, folderNode, extractNode, false); |
7301 |
01 Mar 17 |
nicklas |
316 |
return folderNode; |
7301 |
01 Mar 17 |
nicklas |
317 |
} |
7301 |
01 Mar 17 |
nicklas |
318 |
|
7301 |
01 Mar 17 |
nicklas |
319 |
|
5748 |
19 Sep 11 |
nicklas |
320 |
/** |
5748 |
19 Sep 11 |
nicklas |
Create a reverse-loading bioassay node for the bioassay that is the parent |
5748 |
19 Sep 11 |
nicklas |
to the given raw bioassay. |
5748 |
19 Sep 11 |
nicklas |
323 |
*/ |
5748 |
19 Sep 11 |
nicklas |
324 |
private Node createReverseNode(RawBioAssay raw, DbControl dc, OverviewContext context, Node rawNode) |
5653 |
13 Jun 11 |
nicklas |
325 |
{ |
5685 |
04 Aug 11 |
nicklas |
326 |
NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context); |
5748 |
19 Sep 11 |
nicklas |
327 |
DerivedBioAssay bioAssay = null; |
5748 |
19 Sep 11 |
nicklas |
328 |
Extract extract = null; |
5653 |
13 Jun 11 |
nicklas |
329 |
boolean denied = false; |
5653 |
13 Jun 11 |
nicklas |
330 |
try |
5653 |
13 Jun 11 |
nicklas |
331 |
{ |
5748 |
19 Sep 11 |
nicklas |
332 |
bioAssay = raw.getParentBioAssay(); |
6090 |
22 Aug 12 |
nicklas |
// We must set the EXTRACT attribute so that upstream loaders |
5748 |
19 Sep 11 |
nicklas |
// follow the correct path when reaching the biomaterials section |
6090 |
22 Aug 12 |
nicklas |
335 |
if (bioAssay != null) extract = getExtract(bioAssay); |
5653 |
13 Jun 11 |
nicklas |
336 |
} |
5653 |
13 Jun 11 |
nicklas |
337 |
catch (PermissionDeniedException ex) |
5653 |
13 Jun 11 |
nicklas |
338 |
{ |
5653 |
13 Jun 11 |
nicklas |
339 |
denied = true; |
5653 |
13 Jun 11 |
nicklas |
340 |
} |
6090 |
22 Aug 12 |
nicklas |
341 |
Node bioAssayNode = createItemNode(nf, bioAssay, null, denied, |
5748 |
19 Sep 11 |
nicklas |
342 |
rawNode, ChildNodeDirection.REVERSE); |
5748 |
19 Sep 11 |
nicklas |
343 |
if (extract != null && bioAssayNode != null) |
5748 |
19 Sep 11 |
nicklas |
344 |
{ |
5748 |
19 Sep 11 |
nicklas |
345 |
bioAssayNode.setAttribute(NodeAttribute.EXTRACT, extract); |
5748 |
19 Sep 11 |
nicklas |
346 |
} |
5748 |
19 Sep 11 |
nicklas |
347 |
return bioAssayNode; |
5653 |
13 Jun 11 |
nicklas |
348 |
} |
5653 |
13 Jun 11 |
nicklas |
349 |
|
5653 |
13 Jun 11 |
nicklas |
350 |
/** |
5748 |
19 Sep 11 |
nicklas |
Create a reverse-loading bioassay node for the bioassay that is |
5748 |
19 Sep 11 |
nicklas |
the parent to the given child bioassay. |
5653 |
13 Jun 11 |
nicklas |
353 |
*/ |
5748 |
19 Sep 11 |
nicklas |
354 |
private Node createReverseNode(DerivedBioAssay child, DbControl dc, OverviewContext context, Node childNode) |
5653 |
13 Jun 11 |
nicklas |
355 |
{ |
5748 |
19 Sep 11 |
nicklas |
356 |
NodeFactory<DerivedBioAssay> nf = getNodeFactory(dc, context); |
6090 |
22 Aug 12 |
nicklas |
357 |
|
6090 |
22 Aug 12 |
nicklas |
358 |
ItemQuery<DerivedBioAssay> query = context.initQuery(child.getParents(), "name"); |
6090 |
22 Aug 12 |
nicklas |
359 |
List<DerivedBioAssay> parents = query.list(dc); |
6090 |
22 Aug 12 |
nicklas |
360 |
|
6090 |
22 Aug 12 |
nicklas |
361 |
Node folderNode = null; |
6090 |
22 Aug 12 |
nicklas |
362 |
Node bioAssayNode = null; |
6090 |
22 Aug 12 |
nicklas |
363 |
if (parents.size() > 1) |
5748 |
19 Sep 11 |
nicklas |
364 |
{ |
6090 |
22 Aug 12 |
nicklas |
365 |
folderNode = new Node("parents", "Parents", childNode, ChildNodeDirection.REVERSE); |
5748 |
19 Sep 11 |
nicklas |
366 |
} |
6090 |
22 Aug 12 |
nicklas |
367 |
|
6090 |
22 Aug 12 |
nicklas |
368 |
for (DerivedBioAssay dba : parents) |
5748 |
19 Sep 11 |
nicklas |
369 |
{ |
6090 |
22 Aug 12 |
nicklas |
// We need to handle circular references inline because |
6090 |
22 Aug 12 |
nicklas |
// we can never require that a validator implementation handles this |
6090 |
22 Aug 12 |
nicklas |
372 |
Node circularNode = OverviewUtil.getCircularRef(childNode, dba); |
6090 |
22 Aug 12 |
nicklas |
373 |
if (circularNode != null) |
6090 |
22 Aug 12 |
nicklas |
374 |
{ |
6090 |
22 Aug 12 |
nicklas |
375 |
context.createFailure(Validator.CIRCULAR_REFERENCE, childNode, |
6090 |
22 Aug 12 |
nicklas |
376 |
"Circular reference to '" + dba.getName() + "'", |
6090 |
22 Aug 12 |
nicklas |
377 |
new Fix("Modify parents of '" + child.getName() + "'", child), |
6090 |
22 Aug 12 |
nicklas |
378 |
new Fix("Modify parents of '" + dba.getName() + "'", dba) |
6090 |
22 Aug 12 |
nicklas |
379 |
); |
6090 |
22 Aug 12 |
nicklas |
380 |
} |
6090 |
22 Aug 12 |
nicklas |
381 |
else |
6090 |
22 Aug 12 |
nicklas |
382 |
{ |
6090 |
22 Aug 12 |
nicklas |
383 |
Extract extract = getExtract(dba); |
6090 |
22 Aug 12 |
nicklas |
384 |
bioAssayNode = createItemNode(nf, dba, null, false, folderNode == null ? childNode : folderNode, ChildNodeDirection.REVERSE); |
6090 |
22 Aug 12 |
nicklas |
385 |
if (extract != null && bioAssayNode != null) |
6090 |
22 Aug 12 |
nicklas |
386 |
{ |
6090 |
22 Aug 12 |
nicklas |
387 |
bioAssayNode.setAttribute(NodeAttribute.EXTRACT, extract); |
6090 |
22 Aug 12 |
nicklas |
388 |
} |
6090 |
22 Aug 12 |
nicklas |
389 |
} |
5748 |
19 Sep 11 |
nicklas |
390 |
} |
6090 |
22 Aug 12 |
nicklas |
391 |
postValidateFolder(nf, folderNode, childNode, bioAssayNode == null); |
6090 |
22 Aug 12 |
nicklas |
392 |
return folderNode == null ? bioAssayNode : folderNode; |
5653 |
13 Jun 11 |
nicklas |
393 |
} |
5748 |
19 Sep 11 |
nicklas |
394 |
|
5748 |
19 Sep 11 |
nicklas |
395 |
/** |
6090 |
22 Aug 12 |
nicklas |
Get the extract that is associated with the current derived bioassay |
5748 |
19 Sep 11 |
nicklas |
@return The extract or null if none was found |
5748 |
19 Sep 11 |
nicklas |
398 |
*/ |
6090 |
22 Aug 12 |
nicklas |
399 |
private Extract getExtract(DerivedBioAssay bioAssay) |
5748 |
19 Sep 11 |
nicklas |
400 |
{ |
5748 |
19 Sep 11 |
nicklas |
401 |
Extract extract = null; |
6090 |
22 Aug 12 |
nicklas |
402 |
try |
5748 |
19 Sep 11 |
nicklas |
403 |
{ |
6090 |
22 Aug 12 |
nicklas |
404 |
extract = bioAssay.getExtract(); |
5748 |
19 Sep 11 |
nicklas |
405 |
} |
6090 |
22 Aug 12 |
nicklas |
406 |
catch (PermissionDeniedException ex) |
6090 |
22 Aug 12 |
nicklas |
407 |
{} |
6090 |
22 Aug 12 |
nicklas |
408 |
return extract; |
6090 |
22 Aug 12 |
nicklas |
409 |
} |
6090 |
22 Aug 12 |
nicklas |
410 |
|
7303 |
01 Mar 17 |
nicklas |
411 |
private Set<Integer> getExtractChain(DbControl dc, Node node) |
6090 |
22 Aug 12 |
nicklas |
412 |
{ |
6090 |
22 Aug 12 |
nicklas |
413 |
List<Node> extractNodes = node.findAll(new ItemTypeFilter(Item.EXTRACT)); |
6090 |
22 Aug 12 |
nicklas |
414 |
Set<Integer> extractIds = new HashSet<Integer>(extractNodes.size()); |
6090 |
22 Aug 12 |
nicklas |
415 |
for (Node n : extractNodes) |
5748 |
19 Sep 11 |
nicklas |
416 |
{ |
6090 |
22 Aug 12 |
nicklas |
417 |
extractIds.add(n.getItem().getId()); |
7303 |
01 Mar 17 |
nicklas |
418 |
if (n.getParent() == null) |
7303 |
01 Mar 17 |
nicklas |
419 |
{ |
7303 |
01 Mar 17 |
nicklas |
// We have reach the root node, continue to load parent extracts from here |
7303 |
01 Mar 17 |
nicklas |
421 |
SourceItemTransformer transformer = new ExtractToParentExtractTransformer(true); |
7303 |
01 Mar 17 |
nicklas |
422 |
extractIds.addAll(transformer.transform(new TransformContext(dc), Collections.singleton(n.getItem().getId()))); |
7303 |
01 Mar 17 |
nicklas |
423 |
|
7303 |
01 Mar 17 |
nicklas |
424 |
} |
5748 |
19 Sep 11 |
nicklas |
425 |
} |
6090 |
22 Aug 12 |
nicklas |
426 |
return extractIds; |
5748 |
19 Sep 11 |
nicklas |
427 |
} |
7302 |
01 Mar 17 |
nicklas |
428 |
|
7302 |
01 Mar 17 |
nicklas |
429 |
|
5652 |
10 Jun 11 |
nicklas |
430 |
} |