6774 |
17 Mar 15 |
nicklas |
1 |
/** |
6774 |
17 Mar 15 |
nicklas |
$Id$ |
6774 |
17 Mar 15 |
nicklas |
3 |
|
6774 |
17 Mar 15 |
nicklas |
Copyright (C) 2015 Nicklas Nordborg |
6774 |
17 Mar 15 |
nicklas |
5 |
|
6774 |
17 Mar 15 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
6774 |
17 Mar 15 |
nicklas |
Available at http://base.thep.lu.se/ |
6774 |
17 Mar 15 |
nicklas |
8 |
|
6774 |
17 Mar 15 |
nicklas |
BASE is free software; you can redistribute it and/or |
6774 |
17 Mar 15 |
nicklas |
modify it under the terms of the GNU General Public License |
6774 |
17 Mar 15 |
nicklas |
as published by the Free Software Foundation; either version 3 |
6774 |
17 Mar 15 |
nicklas |
of the License, or (at your option) any later version. |
6774 |
17 Mar 15 |
nicklas |
13 |
|
6774 |
17 Mar 15 |
nicklas |
BASE is distributed in the hope that it will be useful, |
6774 |
17 Mar 15 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
6774 |
17 Mar 15 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
6774 |
17 Mar 15 |
nicklas |
GNU General Public License for more details. |
6774 |
17 Mar 15 |
nicklas |
18 |
|
6774 |
17 Mar 15 |
nicklas |
You should have received a copy of the GNU General Public License |
6774 |
17 Mar 15 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
6774 |
17 Mar 15 |
nicklas |
21 |
*/ |
6774 |
17 Mar 15 |
nicklas |
22 |
package net.sf.basedb.util.listable; |
6774 |
17 Mar 15 |
nicklas |
23 |
|
6848 |
13 Apr 15 |
nicklas |
24 |
import java.util.Collection; |
8094 |
04 Nov 22 |
nicklas |
25 |
import java.util.HashMap; |
8094 |
04 Nov 22 |
nicklas |
26 |
import java.util.HashSet; |
8094 |
04 Nov 22 |
nicklas |
27 |
import java.util.Map; |
8094 |
04 Nov 22 |
nicklas |
28 |
import java.util.Set; |
6848 |
13 Apr 15 |
nicklas |
29 |
|
6774 |
17 Mar 15 |
nicklas |
30 |
import net.sf.basedb.core.DbControl; |
6848 |
13 Apr 15 |
nicklas |
31 |
import net.sf.basedb.core.Include; |
8094 |
04 Nov 22 |
nicklas |
32 |
import net.sf.basedb.core.Item; |
6774 |
17 Mar 15 |
nicklas |
33 |
|
6774 |
17 Mar 15 |
nicklas |
34 |
/** |
6774 |
17 Mar 15 |
nicklas |
Transformation context that can be used to keep track of vital |
6774 |
17 Mar 15 |
nicklas |
information when doing multi-step transformations. |
6774 |
17 Mar 15 |
nicklas |
37 |
|
6774 |
17 Mar 15 |
nicklas |
@author Nicklas |
6774 |
17 Mar 15 |
nicklas |
@since 3.5 |
6774 |
17 Mar 15 |
nicklas |
40 |
*/ |
6774 |
17 Mar 15 |
nicklas |
41 |
public class TransformContext |
6774 |
17 Mar 15 |
nicklas |
42 |
{ |
6774 |
17 Mar 15 |
nicklas |
43 |
|
6774 |
17 Mar 15 |
nicklas |
44 |
private final DbControl dc; |
6848 |
13 Apr 15 |
nicklas |
45 |
private Collection<Include> include; |
6774 |
17 Mar 15 |
nicklas |
46 |
|
6774 |
17 Mar 15 |
nicklas |
47 |
/** |
6774 |
17 Mar 15 |
nicklas |
Creates a new transformation context that will use the given DbControl |
6774 |
17 Mar 15 |
nicklas |
for database access. |
6774 |
17 Mar 15 |
nicklas |
50 |
*/ |
6774 |
17 Mar 15 |
nicklas |
51 |
public TransformContext(DbControl dc) |
6774 |
17 Mar 15 |
nicklas |
52 |
{ |
6774 |
17 Mar 15 |
nicklas |
53 |
this.dc = dc; |
6848 |
13 Apr 15 |
nicklas |
54 |
this.include = Include.ALL; |
6774 |
17 Mar 15 |
nicklas |
55 |
} |
6774 |
17 Mar 15 |
nicklas |
56 |
|
6774 |
17 Mar 15 |
nicklas |
57 |
/** |
6774 |
17 Mar 15 |
nicklas |
Get the DbControl to use in this transformation context. |
6774 |
17 Mar 15 |
nicklas |
59 |
*/ |
6774 |
17 Mar 15 |
nicklas |
60 |
public DbControl getDbControl() |
6774 |
17 Mar 15 |
nicklas |
61 |
{ |
6774 |
17 Mar 15 |
nicklas |
62 |
return dc; |
6774 |
17 Mar 15 |
nicklas |
63 |
} |
6774 |
17 Mar 15 |
nicklas |
64 |
|
6848 |
13 Apr 15 |
nicklas |
65 |
/** |
6848 |
13 Apr 15 |
nicklas |
Include options when executing queries to find |
6848 |
13 Apr 15 |
nicklas |
parent/child items. Default is Include.ALL. |
6848 |
13 Apr 15 |
nicklas |
68 |
*/ |
6848 |
13 Apr 15 |
nicklas |
69 |
public Collection<Include> getInclude() |
6848 |
13 Apr 15 |
nicklas |
70 |
{ |
6848 |
13 Apr 15 |
nicklas |
71 |
return include; |
6848 |
13 Apr 15 |
nicklas |
72 |
} |
6848 |
13 Apr 15 |
nicklas |
73 |
|
6848 |
13 Apr 15 |
nicklas |
74 |
public void setInclude(Collection<Include> include) |
6848 |
13 Apr 15 |
nicklas |
75 |
{ |
6848 |
13 Apr 15 |
nicklas |
76 |
this.include = include; |
6848 |
13 Apr 15 |
nicklas |
77 |
} |
6848 |
13 Apr 15 |
nicklas |
78 |
|
7770 |
10 Feb 20 |
nicklas |
79 |
/** |
7770 |
10 Feb 20 |
nicklas |
Get a cache that can be used for storing transformation |
7770 |
10 Feb 20 |
nicklas |
results for some time. The cache is stored in the current |
7770 |
10 Feb 20 |
nicklas |
session and is lost if the user logs out. |
7770 |
10 Feb 20 |
nicklas |
@since 3.16 |
7770 |
10 Feb 20 |
nicklas |
84 |
*/ |
7770 |
10 Feb 20 |
nicklas |
85 |
public TransformCache getCache() |
7770 |
10 Feb 20 |
nicklas |
86 |
{ |
7770 |
10 Feb 20 |
nicklas |
87 |
TransformCache cache = dc.getSessionControl().getSessionSetting(TransformCache.class.getName()); |
7770 |
10 Feb 20 |
nicklas |
88 |
if (cache == null) |
7770 |
10 Feb 20 |
nicklas |
89 |
{ |
7770 |
10 Feb 20 |
nicklas |
90 |
cache = new TransformCache(20); |
7770 |
10 Feb 20 |
nicklas |
91 |
dc.getSessionControl().setSessionSetting(TransformCache.class.getName(), cache); |
7770 |
10 Feb 20 |
nicklas |
92 |
} |
7770 |
10 Feb 20 |
nicklas |
93 |
return cache; |
7770 |
10 Feb 20 |
nicklas |
94 |
} |
7770 |
10 Feb 20 |
nicklas |
95 |
|
8094 |
04 Nov 22 |
nicklas |
96 |
private boolean collecting; |
8094 |
04 Nov 22 |
nicklas |
97 |
private boolean avoiding; |
8094 |
04 Nov 22 |
nicklas |
98 |
private Map<Item, Set<Integer>> collectedByItemType; |
8094 |
04 Nov 22 |
nicklas |
99 |
|
8094 |
04 Nov 22 |
nicklas |
100 |
|
8094 |
04 Nov 22 |
nicklas |
101 |
/** |
8094 |
04 Nov 22 |
nicklas |
Enable/disable collecting of all source items that the transformers in |
8094 |
04 Nov 22 |
nicklas |
this context are using. |
8094 |
04 Nov 22 |
nicklas |
@since 3.19.5 |
8094 |
04 Nov 22 |
nicklas |
105 |
*/ |
8094 |
04 Nov 22 |
nicklas |
106 |
public void setCollecting(boolean collecting) |
8094 |
04 Nov 22 |
nicklas |
107 |
{ |
8094 |
04 Nov 22 |
nicklas |
108 |
this.collecting = collecting; |
8094 |
04 Nov 22 |
nicklas |
109 |
} |
8094 |
04 Nov 22 |
nicklas |
110 |
|
8094 |
04 Nov 22 |
nicklas |
111 |
/** |
8094 |
04 Nov 22 |
nicklas |
Shortcut for enabling 'collecting' and disabling 'avoiding'. |
8094 |
04 Nov 22 |
nicklas |
@since 3.19.5 |
8094 |
04 Nov 22 |
nicklas |
114 |
*/ |
8094 |
04 Nov 22 |
nicklas |
115 |
public void setCollecting() |
8094 |
04 Nov 22 |
nicklas |
116 |
{ |
8094 |
04 Nov 22 |
nicklas |
117 |
this.collecting = true; |
8094 |
04 Nov 22 |
nicklas |
118 |
this.avoiding = false; |
8094 |
04 Nov 22 |
nicklas |
119 |
} |
8094 |
04 Nov 22 |
nicklas |
120 |
|
8094 |
04 Nov 22 |
nicklas |
121 |
public boolean isCollecting() |
8094 |
04 Nov 22 |
nicklas |
122 |
{ |
8094 |
04 Nov 22 |
nicklas |
123 |
return collecting; |
8094 |
04 Nov 22 |
nicklas |
124 |
} |
8094 |
04 Nov 22 |
nicklas |
125 |
|
8094 |
04 Nov 22 |
nicklas |
126 |
/** |
8094 |
04 Nov 22 |
nicklas |
Enable/disable avoiding of returning any source items that has |
8094 |
04 Nov 22 |
nicklas |
been previously collected. |
8094 |
04 Nov 22 |
nicklas |
@since 3.19.5 |
8094 |
04 Nov 22 |
nicklas |
130 |
*/ |
8094 |
04 Nov 22 |
nicklas |
131 |
public void setAvoiding(boolean avoiding) |
8094 |
04 Nov 22 |
nicklas |
132 |
{ |
8094 |
04 Nov 22 |
nicklas |
133 |
this.avoiding = avoiding; |
8094 |
04 Nov 22 |
nicklas |
134 |
} |
8094 |
04 Nov 22 |
nicklas |
135 |
/** |
8094 |
04 Nov 22 |
nicklas |
Shortcut for enabling 'avoiding' and disabling 'collecting'. |
8094 |
04 Nov 22 |
nicklas |
@since 3.19.5 |
8094 |
04 Nov 22 |
nicklas |
138 |
*/ |
8094 |
04 Nov 22 |
nicklas |
139 |
public void setAvoiding() |
8094 |
04 Nov 22 |
nicklas |
140 |
{ |
8094 |
04 Nov 22 |
nicklas |
141 |
this.collecting = false; |
8094 |
04 Nov 22 |
nicklas |
142 |
this.avoiding = true; |
8094 |
04 Nov 22 |
nicklas |
143 |
} |
8094 |
04 Nov 22 |
nicklas |
144 |
|
8094 |
04 Nov 22 |
nicklas |
145 |
public boolean isAvoiding() |
8094 |
04 Nov 22 |
nicklas |
146 |
{ |
8094 |
04 Nov 22 |
nicklas |
147 |
return avoiding; |
8094 |
04 Nov 22 |
nicklas |
148 |
} |
8094 |
04 Nov 22 |
nicklas |
149 |
|
8094 |
04 Nov 22 |
nicklas |
150 |
/** |
8094 |
04 Nov 22 |
nicklas |
Clear all collected items and disable both 'collecting' and |
8094 |
04 Nov 22 |
nicklas |
'avoiding'. |
8094 |
04 Nov 22 |
nicklas |
@since 3.19.5 |
8094 |
04 Nov 22 |
nicklas |
154 |
*/ |
8094 |
04 Nov 22 |
nicklas |
155 |
public void resetCollected() |
8094 |
04 Nov 22 |
nicklas |
156 |
{ |
8094 |
04 Nov 22 |
nicklas |
157 |
this.collecting = false; |
8094 |
04 Nov 22 |
nicklas |
158 |
this.avoiding = false; |
8094 |
04 Nov 22 |
nicklas |
159 |
if (collectedByItemType != null) collectedByItemType.clear(); |
8094 |
04 Nov 22 |
nicklas |
160 |
} |
8094 |
04 Nov 22 |
nicklas |
161 |
|
8094 |
04 Nov 22 |
nicklas |
162 |
/** |
8094 |
04 Nov 22 |
nicklas |
Store collected items for later use if collecting has been enabled. |
8094 |
04 Nov 22 |
nicklas |
@return The source items |
8094 |
04 Nov 22 |
nicklas |
165 |
*/ |
8094 |
04 Nov 22 |
nicklas |
166 |
public Set<Integer> collect(Item itemType, Set<Integer> source) |
8094 |
04 Nov 22 |
nicklas |
167 |
{ |
8094 |
04 Nov 22 |
nicklas |
168 |
if (collecting && source.size() > 0) |
8094 |
04 Nov 22 |
nicklas |
169 |
{ |
8094 |
04 Nov 22 |
nicklas |
170 |
if (collectedByItemType == null) collectedByItemType = new HashMap<>(); |
8094 |
04 Nov 22 |
nicklas |
171 |
Set<Integer> collected = collectedByItemType.get(itemType); |
8094 |
04 Nov 22 |
nicklas |
172 |
if (collected == null) |
8094 |
04 Nov 22 |
nicklas |
173 |
{ |
8094 |
04 Nov 22 |
nicklas |
174 |
collected = new HashSet<>(); |
8094 |
04 Nov 22 |
nicklas |
175 |
collectedByItemType.put(itemType, collected); |
8094 |
04 Nov 22 |
nicklas |
176 |
} |
8094 |
04 Nov 22 |
nicklas |
177 |
collected.addAll(source); |
8094 |
04 Nov 22 |
nicklas |
178 |
} |
8094 |
04 Nov 22 |
nicklas |
179 |
return source; |
8094 |
04 Nov 22 |
nicklas |
180 |
} |
8094 |
04 Nov 22 |
nicklas |
181 |
|
8094 |
04 Nov 22 |
nicklas |
182 |
/** |
8094 |
04 Nov 22 |
nicklas |
Avoid collected items by removing them from the source set. |
8094 |
04 Nov 22 |
nicklas |
Note that this method modified the source set directly. |
8094 |
04 Nov 22 |
nicklas |
@return The source set |
8094 |
04 Nov 22 |
nicklas |
186 |
*/ |
8094 |
04 Nov 22 |
nicklas |
187 |
public Set<Integer> avoid(Item itemType, Set<Integer> source) |
8094 |
04 Nov 22 |
nicklas |
188 |
{ |
8094 |
04 Nov 22 |
nicklas |
189 |
if (avoiding && source.size() > 0) |
8094 |
04 Nov 22 |
nicklas |
190 |
{ |
8094 |
04 Nov 22 |
nicklas |
191 |
if (collectedByItemType != null && collectedByItemType.containsKey(itemType)) |
8094 |
04 Nov 22 |
nicklas |
192 |
{ |
8094 |
04 Nov 22 |
nicklas |
193 |
Set<Integer> collected = collectedByItemType.get(itemType); |
8094 |
04 Nov 22 |
nicklas |
194 |
source.removeAll(collected); |
8094 |
04 Nov 22 |
nicklas |
195 |
} |
8094 |
04 Nov 22 |
nicklas |
196 |
} |
8094 |
04 Nov 22 |
nicklas |
197 |
return source; |
8094 |
04 Nov 22 |
nicklas |
198 |
} |
8094 |
04 Nov 22 |
nicklas |
199 |
|
6774 |
17 Mar 15 |
nicklas |
200 |
} |