4630 |
07 Nov 08 |
nicklas |
1 |
/** |
4630 |
07 Nov 08 |
nicklas |
$Id$ |
4630 |
07 Nov 08 |
nicklas |
3 |
|
4630 |
07 Nov 08 |
nicklas |
Copyright (C) 2008 Nicklas Nordborg |
4630 |
07 Nov 08 |
nicklas |
5 |
|
4630 |
07 Nov 08 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
4630 |
07 Nov 08 |
nicklas |
Available at http://base.thep.lu.se/ |
4630 |
07 Nov 08 |
nicklas |
8 |
|
4630 |
07 Nov 08 |
nicklas |
BASE is free software; you can redistribute it and/or |
4630 |
07 Nov 08 |
nicklas |
modify it under the terms of the GNU General Public License |
4630 |
07 Nov 08 |
nicklas |
as published by the Free Software Foundation; either version 3 |
4630 |
07 Nov 08 |
nicklas |
of the License, or (at your option) any later version. |
4630 |
07 Nov 08 |
nicklas |
13 |
|
4630 |
07 Nov 08 |
nicklas |
BASE is distributed in the hope that it will be useful, |
4630 |
07 Nov 08 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
4630 |
07 Nov 08 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4630 |
07 Nov 08 |
nicklas |
GNU General Public License for more details. |
4630 |
07 Nov 08 |
nicklas |
18 |
|
4630 |
07 Nov 08 |
nicklas |
You should have received a copy of the GNU General Public License |
4630 |
07 Nov 08 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
4630 |
07 Nov 08 |
nicklas |
21 |
*/ |
4630 |
07 Nov 08 |
nicklas |
22 |
package net.sf.basedb.util; |
4630 |
07 Nov 08 |
nicklas |
23 |
|
6091 |
24 Aug 12 |
nicklas |
24 |
import java.util.Collection; |
4630 |
07 Nov 08 |
nicklas |
25 |
import java.util.Collections; |
6091 |
24 Aug 12 |
nicklas |
26 |
import java.util.HashMap; |
4630 |
07 Nov 08 |
nicklas |
27 |
import java.util.HashSet; |
6091 |
24 Aug 12 |
nicklas |
28 |
import java.util.LinkedHashSet; |
4630 |
07 Nov 08 |
nicklas |
29 |
import java.util.LinkedList; |
6091 |
24 Aug 12 |
nicklas |
30 |
import java.util.Map; |
4630 |
07 Nov 08 |
nicklas |
31 |
import java.util.Queue; |
4630 |
07 Nov 08 |
nicklas |
32 |
import java.util.Set; |
4630 |
07 Nov 08 |
nicklas |
33 |
|
4630 |
07 Nov 08 |
nicklas |
34 |
import net.sf.basedb.core.Annotatable; |
4630 |
07 Nov 08 |
nicklas |
35 |
import net.sf.basedb.core.BaseException; |
4630 |
07 Nov 08 |
nicklas |
36 |
import net.sf.basedb.core.DbControl; |
5685 |
04 Aug 11 |
nicklas |
37 |
import net.sf.basedb.core.DerivedBioAssay; |
5749 |
19 Sep 11 |
nicklas |
38 |
import net.sf.basedb.core.Extract; |
7002 |
05 Nov 15 |
nicklas |
39 |
import net.sf.basedb.core.PermissionDeniedException; |
5642 |
26 May 11 |
nicklas |
40 |
import net.sf.basedb.core.PhysicalBioAssay; |
4630 |
07 Nov 08 |
nicklas |
41 |
import net.sf.basedb.core.RawBioAssay; |
4630 |
07 Nov 08 |
nicklas |
42 |
import net.sf.basedb.util.filter.Filter; |
6799 |
25 Mar 15 |
nicklas |
43 |
import net.sf.basedb.util.listable.ExtractToChildExtractTransformer; |
6799 |
25 Mar 15 |
nicklas |
44 |
import net.sf.basedb.util.listable.SourceItemTransformer; |
6799 |
25 Mar 15 |
nicklas |
45 |
import net.sf.basedb.util.listable.TransformContext; |
4630 |
07 Nov 08 |
nicklas |
46 |
|
4630 |
07 Nov 08 |
nicklas |
47 |
/** |
4630 |
07 Nov 08 |
nicklas |
Utility class for working with annotations. |
4630 |
07 Nov 08 |
nicklas |
49 |
|
4630 |
07 Nov 08 |
nicklas |
@author Nicklas |
4630 |
07 Nov 08 |
nicklas |
@version 2.9 |
4630 |
07 Nov 08 |
nicklas |
@base.modified $Date$ |
4630 |
07 Nov 08 |
nicklas |
53 |
*/ |
4630 |
07 Nov 08 |
nicklas |
54 |
public class AnnotationUtil |
4630 |
07 Nov 08 |
nicklas |
55 |
{ |
6091 |
24 Aug 12 |
nicklas |
56 |
/** |
6091 |
24 Aug 12 |
nicklas |
Create a new cache object that can be used with |
6091 |
24 Aug 12 |
nicklas |
{@link #getAllAnnotatableParentItems(DbControl, Annotatable, Filter, Cache)} |
6091 |
24 Aug 12 |
nicklas |
@since 3.2 |
6091 |
24 Aug 12 |
nicklas |
60 |
*/ |
6091 |
24 Aug 12 |
nicklas |
61 |
public static Cache createCache() |
6091 |
24 Aug 12 |
nicklas |
62 |
{ |
6091 |
24 Aug 12 |
nicklas |
63 |
return new Cache(); |
6091 |
24 Aug 12 |
nicklas |
64 |
} |
4630 |
07 Nov 08 |
nicklas |
65 |
|
4630 |
07 Nov 08 |
nicklas |
66 |
/** |
4630 |
07 Nov 08 |
nicklas |
Get all annotatable parent items for a given item. A {@link Filter} |
4630 |
07 Nov 08 |
nicklas |
may be used to filter the returned collection. If a filter |
4630 |
07 Nov 08 |
nicklas |
is specified only parent items for which the {@link Filter#evaluate(Object)} |
4630 |
07 Nov 08 |
nicklas |
method returns true are included in the returned collection. Note |
4630 |
07 Nov 08 |
nicklas |
that all parent items are loaded before the filter is evaluated |
4630 |
07 Nov 08 |
nicklas |
and that the evaluation order is undefined. |
4630 |
07 Nov 08 |
nicklas |
73 |
|
4630 |
07 Nov 08 |
nicklas |
@param dc The DbControl to use for database access |
4630 |
07 Nov 08 |
nicklas |
@param item The item to find the parents for |
4630 |
07 Nov 08 |
nicklas |
@param filter An optional filter that can be used to filter |
4630 |
07 Nov 08 |
nicklas |
which parents to include |
4630 |
07 Nov 08 |
nicklas |
@return A set containing the parent items |
6091 |
24 Aug 12 |
nicklas |
@see #getAllAnnotatableParentItems(DbControl, Annotatable, Filter, Cache) |
4630 |
07 Nov 08 |
nicklas |
80 |
*/ |
4630 |
07 Nov 08 |
nicklas |
81 |
public static Set<Annotatable> getAllAnnotatableParentItems(DbControl dc, |
4630 |
07 Nov 08 |
nicklas |
82 |
Annotatable item, Filter<Annotatable> filter) |
4630 |
07 Nov 08 |
nicklas |
83 |
{ |
6091 |
24 Aug 12 |
nicklas |
84 |
return getAllAnnotatableParentItems(dc, item, filter, null); |
6091 |
24 Aug 12 |
nicklas |
85 |
} |
6091 |
24 Aug 12 |
nicklas |
86 |
|
6091 |
24 Aug 12 |
nicklas |
87 |
/** |
6091 |
24 Aug 12 |
nicklas |
Get all annotatable parent items for a given item. A {@link Filter} |
6091 |
24 Aug 12 |
nicklas |
may be used to filter the returned collection. If a filter |
6091 |
24 Aug 12 |
nicklas |
is specified only parent items for which the {@link Filter#evaluate(Object)} |
6091 |
24 Aug 12 |
nicklas |
method returns true are included in the returned collection. Note |
6091 |
24 Aug 12 |
nicklas |
that all parent items are loaded before the filter is evaluated |
6091 |
24 Aug 12 |
nicklas |
and that the evaluation order is undefined. A cache may be used |
6091 |
24 Aug 12 |
nicklas |
to improve performance if this method is called multiple times |
6091 |
24 Aug 12 |
nicklas |
with different items that have overlapping parent trees. |
6091 |
24 Aug 12 |
nicklas |
96 |
|
6091 |
24 Aug 12 |
nicklas |
@param dc The DbControl to use for database access |
6091 |
24 Aug 12 |
nicklas |
@param item The item to find the parents for |
6091 |
24 Aug 12 |
nicklas |
@param filter An optional filter that can be used to filter |
6091 |
24 Aug 12 |
nicklas |
which parents to include |
6091 |
24 Aug 12 |
nicklas |
@param cache An optional cache object |
6091 |
24 Aug 12 |
nicklas |
@return A set containing the parent items |
6091 |
24 Aug 12 |
nicklas |
@see #createCache() |
6091 |
24 Aug 12 |
nicklas |
@since 3.2 |
6091 |
24 Aug 12 |
nicklas |
105 |
*/ |
6091 |
24 Aug 12 |
nicklas |
106 |
public static Set<Annotatable> getAllAnnotatableParentItems(DbControl dc, |
6091 |
24 Aug 12 |
nicklas |
107 |
Annotatable item, Filter<Annotatable> filter, Cache cache) |
6091 |
24 Aug 12 |
nicklas |
108 |
{ |
6091 |
24 Aug 12 |
nicklas |
109 |
Set<AnnotatableWrapper> processed = new LinkedHashSet<AnnotatableWrapper>(); |
4630 |
07 Nov 08 |
nicklas |
110 |
Queue<AnnotatableWrapper> unprocessed = new LinkedList<AnnotatableWrapper>(); |
6091 |
24 Aug 12 |
nicklas |
111 |
unprocessed.add(new AnnotatableWrapper(item, cache)); |
6091 |
24 Aug 12 |
nicklas |
112 |
|
4630 |
07 Nov 08 |
nicklas |
// As long as we have unprocessed entries... |
4630 |
07 Nov 08 |
nicklas |
114 |
while (!unprocessed.isEmpty()) |
4630 |
07 Nov 08 |
nicklas |
115 |
{ |
4630 |
07 Nov 08 |
nicklas |
116 |
AnnotatableWrapper toProcess = unprocessed.remove(); |
4630 |
07 Nov 08 |
nicklas |
// ...mark it as processed... |
4630 |
07 Nov 08 |
nicklas |
118 |
if (processed.add(toProcess)) |
4630 |
07 Nov 08 |
nicklas |
119 |
{ |
4630 |
07 Nov 08 |
nicklas |
// ...and queue the parents items for processing... |
6456 |
09 May 14 |
nicklas |
121 |
unprocessed.addAll(toProcess.getAnnotatableParentWrappers(dc)); |
4630 |
07 Nov 08 |
nicklas |
122 |
} |
4630 |
07 Nov 08 |
nicklas |
123 |
} |
4630 |
07 Nov 08 |
nicklas |
124 |
|
4630 |
07 Nov 08 |
nicklas |
// All parents are now loaded... |
6091 |
24 Aug 12 |
nicklas |
126 |
Set<Annotatable> allParents = new LinkedHashSet<Annotatable>(processed.size()); |
4630 |
07 Nov 08 |
nicklas |
127 |
for (AnnotatableWrapper wrapper : processed) |
4630 |
07 Nov 08 |
nicklas |
128 |
{ |
4630 |
07 Nov 08 |
nicklas |
// ...copy all parents that passes the filter |
4630 |
07 Nov 08 |
nicklas |
130 |
Annotatable parent = wrapper.getAnnotatable(); |
4630 |
07 Nov 08 |
nicklas |
131 |
if (filter == null || filter.evaluate(parent)) allParents.add(parent); |
4630 |
07 Nov 08 |
nicklas |
132 |
} |
4630 |
07 Nov 08 |
nicklas |
// Do not include the root item in the result |
4630 |
07 Nov 08 |
nicklas |
134 |
allParents.remove(item); |
4630 |
07 Nov 08 |
nicklas |
135 |
return allParents; |
4630 |
07 Nov 08 |
nicklas |
136 |
} |
4630 |
07 Nov 08 |
nicklas |
137 |
|
4630 |
07 Nov 08 |
nicklas |
138 |
|
4630 |
07 Nov 08 |
nicklas |
139 |
/** |
4630 |
07 Nov 08 |
nicklas |
This wrapper class is needed because we need to keep |
6091 |
24 Aug 12 |
nicklas |
track of extracts linked with raw bioassays and derived bioassays |
5652 |
10 Jun 11 |
nicklas |
until we have loaded the Extracts of a Physical Bioassay. |
4630 |
07 Nov 08 |
nicklas |
<p> |
6091 |
24 Aug 12 |
nicklas |
When we reach a {@link RawBioAssay} item or {@link DerivedBioAssay} item, we |
6091 |
24 Aug 12 |
nicklas |
remember the extract on that as we move up towards PhysicalBioAssay. |
6091 |
24 Aug 12 |
nicklas |
When the PhysicalBioAssay is reached we use the extracts to call |
6091 |
24 Aug 12 |
nicklas |
{@link PhysicalBioAssay#getAnnotatableParents(int, Collection)}. |
4630 |
07 Nov 08 |
nicklas |
148 |
*/ |
4630 |
07 Nov 08 |
nicklas |
149 |
static class AnnotatableWrapper |
4630 |
07 Nov 08 |
nicklas |
150 |
{ |
4630 |
07 Nov 08 |
nicklas |
151 |
/** |
5749 |
19 Sep 11 |
nicklas |
Get the extract to use. This method returns: |
4630 |
07 Nov 08 |
nicklas |
153 |
|
4630 |
07 Nov 08 |
nicklas |
<ul> |
5749 |
19 Sep 11 |
nicklas |
<li>If the item is a raw bioassay, {@link RawBioAssay#getParentExtract()} |
6091 |
24 Aug 12 |
nicklas |
<li>If the item is a derived bioassay, {@link DerivedBioAssay#getExtract()} |
5749 |
19 Sep 11 |
nicklas |
<li>null in all other cases. |
6091 |
24 Aug 12 |
nicklas |
</ul> |
4630 |
07 Nov 08 |
nicklas |
159 |
*/ |
6091 |
24 Aug 12 |
nicklas |
160 |
private static Extract getExtract(Annotatable item) |
4630 |
07 Nov 08 |
nicklas |
161 |
{ |
5749 |
19 Sep 11 |
nicklas |
162 |
Extract result = null; |
7002 |
05 Nov 15 |
nicklas |
163 |
try |
4630 |
07 Nov 08 |
nicklas |
164 |
{ |
7002 |
05 Nov 15 |
nicklas |
165 |
if (item instanceof RawBioAssay) |
7002 |
05 Nov 15 |
nicklas |
166 |
{ |
7002 |
05 Nov 15 |
nicklas |
167 |
result = ((RawBioAssay)item).getParentExtract(); |
7002 |
05 Nov 15 |
nicklas |
168 |
} |
7002 |
05 Nov 15 |
nicklas |
169 |
else if (item instanceof DerivedBioAssay) |
7002 |
05 Nov 15 |
nicklas |
170 |
{ |
7002 |
05 Nov 15 |
nicklas |
171 |
result = ((DerivedBioAssay)item).getExtract(); |
7002 |
05 Nov 15 |
nicklas |
172 |
} |
4630 |
07 Nov 08 |
nicklas |
173 |
} |
7002 |
05 Nov 15 |
nicklas |
174 |
catch (PermissionDeniedException ex) |
7002 |
05 Nov 15 |
nicklas |
175 |
{} |
5749 |
19 Sep 11 |
nicklas |
176 |
return result; |
4630 |
07 Nov 08 |
nicklas |
177 |
} |
4630 |
07 Nov 08 |
nicklas |
178 |
|
4630 |
07 Nov 08 |
nicklas |
179 |
private final Annotatable item; |
6799 |
25 Mar 15 |
nicklas |
180 |
private final Set<Integer> extractsInChain; |
6456 |
09 May 14 |
nicklas |
181 |
private Set<Extract> allChildExtractsInChain; |
6091 |
24 Aug 12 |
nicklas |
182 |
private final AnnotatableWrapper chain; |
6091 |
24 Aug 12 |
nicklas |
183 |
private final Cache cache; |
6124 |
13 Sep 12 |
nicklas |
184 |
private final Extract extract; |
4630 |
07 Nov 08 |
nicklas |
185 |
|
6091 |
24 Aug 12 |
nicklas |
186 |
AnnotatableWrapper(Annotatable item, Cache cache) |
4630 |
07 Nov 08 |
nicklas |
187 |
{ |
4630 |
07 Nov 08 |
nicklas |
188 |
this.item = item; |
6091 |
24 Aug 12 |
nicklas |
189 |
this.chain = null; |
6091 |
24 Aug 12 |
nicklas |
190 |
this.cache = cache; |
6124 |
13 Sep 12 |
nicklas |
191 |
this.extract = getExtract(item); |
6124 |
13 Sep 12 |
nicklas |
192 |
this.extractsInChain = loadExtracts(); |
6456 |
09 May 14 |
nicklas |
193 |
this.allChildExtractsInChain = null; |
4630 |
07 Nov 08 |
nicklas |
194 |
} |
4630 |
07 Nov 08 |
nicklas |
195 |
|
6091 |
24 Aug 12 |
nicklas |
196 |
AnnotatableWrapper(Annotatable item, AnnotatableWrapper chain) |
6091 |
24 Aug 12 |
nicklas |
197 |
{ |
6091 |
24 Aug 12 |
nicklas |
198 |
this.item = item; |
6091 |
24 Aug 12 |
nicklas |
199 |
this.chain = chain; |
6091 |
24 Aug 12 |
nicklas |
200 |
this.cache = chain.cache; |
6124 |
13 Sep 12 |
nicklas |
201 |
this.extract = getExtract(item); |
6124 |
13 Sep 12 |
nicklas |
202 |
this.extractsInChain = loadExtracts(); |
6456 |
09 May 14 |
nicklas |
203 |
this.allChildExtractsInChain = chain.allChildExtractsInChain; |
6091 |
24 Aug 12 |
nicklas |
204 |
} |
6091 |
24 Aug 12 |
nicklas |
205 |
|
6091 |
24 Aug 12 |
nicklas |
206 |
|
4630 |
07 Nov 08 |
nicklas |
207 |
/** |
4630 |
07 Nov 08 |
nicklas |
The annotatable that we are wrapping. |
4630 |
07 Nov 08 |
nicklas |
209 |
*/ |
4630 |
07 Nov 08 |
nicklas |
210 |
Annotatable getAnnotatable() |
4630 |
07 Nov 08 |
nicklas |
211 |
{ |
4630 |
07 Nov 08 |
nicklas |
212 |
return item; |
4630 |
07 Nov 08 |
nicklas |
213 |
} |
4630 |
07 Nov 08 |
nicklas |
214 |
|
6124 |
13 Sep 12 |
nicklas |
215 |
/** |
6124 |
13 Sep 12 |
nicklas |
Load extracts in parent chain. We have to consider this for rawbioassay, |
6124 |
13 Sep 12 |
nicklas |
derived bioassay and physical bioassay since the annotatable parents |
6124 |
13 Sep 12 |
nicklas |
to a physical bioassay depends on the extracts we have seen while |
6124 |
13 Sep 12 |
nicklas |
traversing the path from the raw bioassay and up. After reaching the physical |
6124 |
13 Sep 12 |
nicklas |
bioassay we can forget about the extracts. |
6124 |
13 Sep 12 |
nicklas |
221 |
*/ |
6799 |
25 Mar 15 |
nicklas |
222 |
private Set<Integer> loadExtracts() |
6091 |
24 Aug 12 |
nicklas |
223 |
{ |
7776 |
18 Feb 20 |
nicklas |
224 |
Set<Integer> extractsInChain = Collections.emptySet(); |
6124 |
13 Sep 12 |
nicklas |
225 |
switch (item.getType()) |
6091 |
24 Aug 12 |
nicklas |
226 |
{ |
6124 |
13 Sep 12 |
nicklas |
227 |
case PHYSICALBIOASSAY: |
6124 |
13 Sep 12 |
nicklas |
228 |
case DERIVEDBIOASSAY: |
6124 |
13 Sep 12 |
nicklas |
229 |
case RAWBIOASSAY: |
6124 |
13 Sep 12 |
nicklas |
230 |
{ |
7776 |
18 Feb 20 |
nicklas |
231 |
extractsInChain = new HashSet<>(); |
6124 |
13 Sep 12 |
nicklas |
232 |
if (chain != null) extractsInChain.addAll(chain.extractsInChain); |
6799 |
25 Mar 15 |
nicklas |
233 |
if (extract != null) extractsInChain.add(extract.getId()); |
6124 |
13 Sep 12 |
nicklas |
234 |
break; |
6124 |
13 Sep 12 |
nicklas |
235 |
} |
7776 |
18 Feb 20 |
nicklas |
236 |
case EXTRACT: |
6124 |
13 Sep 12 |
nicklas |
237 |
{ |
7776 |
18 Feb 20 |
nicklas |
238 |
if (chain != null && !chain.extractsInChain.contains(item.getId())) |
7776 |
18 Feb 20 |
nicklas |
239 |
{ |
7776 |
18 Feb 20 |
nicklas |
240 |
extractsInChain = new HashSet<>(chain.extractsInChain); |
7776 |
18 Feb 20 |
nicklas |
241 |
} |
7776 |
18 Feb 20 |
nicklas |
242 |
break; |
6124 |
13 Sep 12 |
nicklas |
243 |
} |
7776 |
18 Feb 20 |
nicklas |
244 |
default: |
7776 |
18 Feb 20 |
nicklas |
245 |
{} |
6091 |
24 Aug 12 |
nicklas |
246 |
} |
6091 |
24 Aug 12 |
nicklas |
247 |
return extractsInChain; |
6091 |
24 Aug 12 |
nicklas |
248 |
} |
6091 |
24 Aug 12 |
nicklas |
249 |
|
4630 |
07 Nov 08 |
nicklas |
250 |
/** |
4630 |
07 Nov 08 |
nicklas |
Get all annotatable parents wrapped inside AnnotatableWrapper:s |
4630 |
07 Nov 08 |
nicklas |
252 |
*/ |
6456 |
09 May 14 |
nicklas |
253 |
Set<AnnotatableWrapper> getAnnotatableParentWrappers(DbControl dc) |
4630 |
07 Nov 08 |
nicklas |
254 |
throws BaseException |
4630 |
07 Nov 08 |
nicklas |
255 |
{ |
4630 |
07 Nov 08 |
nicklas |
256 |
Set<Annotatable> parents = null; |
4630 |
07 Nov 08 |
nicklas |
257 |
Set<AnnotatableWrapper> wrappedParents = Collections.emptySet(); |
6091 |
24 Aug 12 |
nicklas |
258 |
|
6124 |
13 Sep 12 |
nicklas |
259 |
if (cache != null && cache.contains(this)) |
4630 |
07 Nov 08 |
nicklas |
260 |
{ |
6124 |
13 Sep 12 |
nicklas |
261 |
wrappedParents = cache.get(this); |
4630 |
07 Nov 08 |
nicklas |
262 |
} |
4630 |
07 Nov 08 |
nicklas |
263 |
else |
4630 |
07 Nov 08 |
nicklas |
264 |
{ |
6091 |
24 Aug 12 |
nicklas |
265 |
if (item instanceof PhysicalBioAssay) |
4630 |
07 Nov 08 |
nicklas |
266 |
{ |
6456 |
09 May 14 |
nicklas |
267 |
allChildExtractsInChain = new HashSet<Extract>(); |
6456 |
09 May 14 |
nicklas |
268 |
if (extractsInChain.size() > 0) |
6456 |
09 May 14 |
nicklas |
269 |
{ |
6456 |
09 May 14 |
nicklas |
// Only load parents that eventually lead up to one of the extracts in the chain |
6799 |
25 Mar 15 |
nicklas |
271 |
SourceItemTransformer transformer = new ExtractToChildExtractTransformer(true); |
6799 |
25 Mar 15 |
nicklas |
272 |
Set<Integer> childExtracts = transformer.transform(new TransformContext(dc), extractsInChain); |
6799 |
25 Mar 15 |
nicklas |
273 |
for (int id : childExtracts) |
6799 |
25 Mar 15 |
nicklas |
274 |
{ |
6799 |
25 Mar 15 |
nicklas |
275 |
allChildExtractsInChain.add(Extract.getById(dc, id)); |
6799 |
25 Mar 15 |
nicklas |
276 |
} |
6456 |
09 May 14 |
nicklas |
277 |
} |
6456 |
09 May 14 |
nicklas |
278 |
parents = ((PhysicalBioAssay)item).getAnnotatableParents(0, allChildExtractsInChain); |
4630 |
07 Nov 08 |
nicklas |
279 |
} |
6456 |
09 May 14 |
nicklas |
280 |
else if (item instanceof Extract) |
6456 |
09 May 14 |
nicklas |
281 |
{ |
6799 |
25 Mar 15 |
nicklas |
282 |
if (extractsInChain.contains(item.getId())) |
6456 |
09 May 14 |
nicklas |
283 |
{ |
6456 |
09 May 14 |
nicklas |
// When we have reached one of the items in the chain, we no longed need to restrict the loading of parent items |
6456 |
09 May 14 |
nicklas |
285 |
allChildExtractsInChain = null; |
6456 |
09 May 14 |
nicklas |
286 |
} |
6456 |
09 May 14 |
nicklas |
287 |
parents = ((Extract)item).getAnnotatableParents(allChildExtractsInChain); |
6456 |
09 May 14 |
nicklas |
288 |
} |
6091 |
24 Aug 12 |
nicklas |
289 |
else |
6091 |
24 Aug 12 |
nicklas |
290 |
{ |
6091 |
24 Aug 12 |
nicklas |
291 |
parents = item.getAnnotatableParents(); |
6091 |
24 Aug 12 |
nicklas |
292 |
} |
6091 |
24 Aug 12 |
nicklas |
293 |
if (parents != null) |
6091 |
24 Aug 12 |
nicklas |
294 |
{ |
6091 |
24 Aug 12 |
nicklas |
295 |
wrappedParents = new HashSet<AnnotatableWrapper>(parents.size()); |
6091 |
24 Aug 12 |
nicklas |
296 |
for (Annotatable parent : parents) |
6091 |
24 Aug 12 |
nicklas |
297 |
{ |
6091 |
24 Aug 12 |
nicklas |
298 |
wrappedParents.add(new AnnotatableWrapper(parent, this)); |
6091 |
24 Aug 12 |
nicklas |
299 |
} |
6091 |
24 Aug 12 |
nicklas |
300 |
} |
6124 |
13 Sep 12 |
nicklas |
301 |
if (cache != null) cache.put(this, wrappedParents); |
4630 |
07 Nov 08 |
nicklas |
302 |
} |
4630 |
07 Nov 08 |
nicklas |
303 |
return wrappedParents; |
4630 |
07 Nov 08 |
nicklas |
304 |
} |
4630 |
07 Nov 08 |
nicklas |
305 |
|
4630 |
07 Nov 08 |
nicklas |
306 |
/** |
4630 |
07 Nov 08 |
nicklas |
A wrapper is equal to another if they references the same item |
6124 |
13 Sep 12 |
nicklas |
and chain of extracts. |
4630 |
07 Nov 08 |
nicklas |
309 |
*/ |
4630 |
07 Nov 08 |
nicklas |
310 |
@Override |
4630 |
07 Nov 08 |
nicklas |
311 |
public boolean equals(Object o) |
4630 |
07 Nov 08 |
nicklas |
312 |
{ |
4630 |
07 Nov 08 |
nicklas |
313 |
if (o == this) return true; |
5384 |
13 Aug 10 |
nicklas |
314 |
if (o == null || o.getClass() != this.getClass()) return false; |
4630 |
07 Nov 08 |
nicklas |
315 |
AnnotatableWrapper other = (AnnotatableWrapper)o; |
6124 |
13 Sep 12 |
nicklas |
316 |
return this.item.equals(other.item) && this.extractsInChain.equals(other.extractsInChain); |
4630 |
07 Nov 08 |
nicklas |
317 |
} |
4630 |
07 Nov 08 |
nicklas |
318 |
|
4630 |
07 Nov 08 |
nicklas |
319 |
@Override |
4630 |
07 Nov 08 |
nicklas |
320 |
public int hashCode() |
4630 |
07 Nov 08 |
nicklas |
321 |
{ |
6124 |
13 Sep 12 |
nicklas |
322 |
return item.hashCode() + extractsInChain.hashCode(); |
4630 |
07 Nov 08 |
nicklas |
323 |
} |
6124 |
13 Sep 12 |
nicklas |
324 |
|
6124 |
13 Sep 12 |
nicklas |
325 |
@Override |
6124 |
13 Sep 12 |
nicklas |
326 |
public String toString() |
6124 |
13 Sep 12 |
nicklas |
327 |
{ |
6124 |
13 Sep 12 |
nicklas |
328 |
return item.toString() + ":" + extractsInChain; |
6124 |
13 Sep 12 |
nicklas |
329 |
} |
4630 |
07 Nov 08 |
nicklas |
330 |
} |
6091 |
24 Aug 12 |
nicklas |
331 |
|
6091 |
24 Aug 12 |
nicklas |
332 |
public static class Cache |
6091 |
24 Aug 12 |
nicklas |
333 |
{ |
6124 |
13 Sep 12 |
nicklas |
334 |
private final Map<AnnotatableWrapper, Set<AnnotatableWrapper>> cmap; |
6091 |
24 Aug 12 |
nicklas |
335 |
|
6091 |
24 Aug 12 |
nicklas |
336 |
Cache() |
6091 |
24 Aug 12 |
nicklas |
337 |
{ |
6124 |
13 Sep 12 |
nicklas |
338 |
this.cmap = new HashMap<AnnotatableWrapper, Set<AnnotatableWrapper>>(); |
6091 |
24 Aug 12 |
nicklas |
339 |
} |
7767 |
06 Feb 20 |
nicklas |
340 |
|
7767 |
06 Feb 20 |
nicklas |
341 |
/** |
7767 |
06 Feb 20 |
nicklas |
Clear all information from the cache. |
7767 |
06 Feb 20 |
nicklas |
@since 3.16 |
7767 |
06 Feb 20 |
nicklas |
344 |
*/ |
7767 |
06 Feb 20 |
nicklas |
345 |
public void clear() |
7767 |
06 Feb 20 |
nicklas |
346 |
{ |
7767 |
06 Feb 20 |
nicklas |
347 |
cmap.clear(); |
7767 |
06 Feb 20 |
nicklas |
348 |
} |
6091 |
24 Aug 12 |
nicklas |
349 |
|
6124 |
13 Sep 12 |
nicklas |
350 |
boolean contains(AnnotatableWrapper wrapper) |
6091 |
24 Aug 12 |
nicklas |
351 |
{ |
6124 |
13 Sep 12 |
nicklas |
352 |
return cmap.containsKey(wrapper); |
6091 |
24 Aug 12 |
nicklas |
353 |
} |
6091 |
24 Aug 12 |
nicklas |
354 |
|
6124 |
13 Sep 12 |
nicklas |
355 |
Set<AnnotatableWrapper> get(AnnotatableWrapper wrapper) |
6091 |
24 Aug 12 |
nicklas |
356 |
{ |
6124 |
13 Sep 12 |
nicklas |
357 |
return cmap.get(wrapper); |
6091 |
24 Aug 12 |
nicklas |
358 |
} |
6091 |
24 Aug 12 |
nicklas |
359 |
|
6124 |
13 Sep 12 |
nicklas |
360 |
void put(AnnotatableWrapper wrapper, Set<AnnotatableWrapper> parents) |
6091 |
24 Aug 12 |
nicklas |
361 |
{ |
6124 |
13 Sep 12 |
nicklas |
362 |
cmap.put(wrapper, parents); |
6091 |
24 Aug 12 |
nicklas |
363 |
} |
7776 |
18 Feb 20 |
nicklas |
364 |
|
7776 |
18 Feb 20 |
nicklas |
365 |
@Override |
7776 |
18 Feb 20 |
nicklas |
366 |
public String toString() |
7776 |
18 Feb 20 |
nicklas |
367 |
{ |
7776 |
18 Feb 20 |
nicklas |
368 |
return cmap.toString(); |
7776 |
18 Feb 20 |
nicklas |
369 |
} |
6091 |
24 Aug 12 |
nicklas |
370 |
|
7776 |
18 Feb 20 |
nicklas |
371 |
|
6091 |
24 Aug 12 |
nicklas |
372 |
} |
4630 |
07 Nov 08 |
nicklas |
373 |
} |