1708 |
13 Dec 05 |
nicklas |
1 |
/* |
1708 |
13 Dec 05 |
nicklas |
$Id$ |
1708 |
13 Dec 05 |
nicklas |
3 |
|
3675 |
16 Aug 07 |
jari |
Copyright (C) 2005 Nicklas Nordborg |
4889 |
06 Apr 09 |
nicklas |
Copyright (C) 2006 Johan Enell, Jari Häkkinen, Nicklas Nordborg |
3675 |
16 Aug 07 |
jari |
Copyright (C) 2007 Nicklas Nordborg |
1708 |
13 Dec 05 |
nicklas |
7 |
|
2304 |
22 May 06 |
jari |
This file is part of BASE - BioArray Software Environment. |
2304 |
22 May 06 |
jari |
Available at http://base.thep.lu.se/ |
1708 |
13 Dec 05 |
nicklas |
10 |
|
1708 |
13 Dec 05 |
nicklas |
BASE is free software; you can redistribute it and/or |
1708 |
13 Dec 05 |
nicklas |
modify it under the terms of the GNU General Public License |
4479 |
05 Sep 08 |
jari |
as published by the Free Software Foundation; either version 3 |
1708 |
13 Dec 05 |
nicklas |
of the License, or (at your option) any later version. |
1708 |
13 Dec 05 |
nicklas |
15 |
|
1708 |
13 Dec 05 |
nicklas |
BASE is distributed in the hope that it will be useful, |
1708 |
13 Dec 05 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
1708 |
13 Dec 05 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1708 |
13 Dec 05 |
nicklas |
GNU General Public License for more details. |
1708 |
13 Dec 05 |
nicklas |
20 |
|
1708 |
13 Dec 05 |
nicklas |
You should have received a copy of the GNU General Public License |
4515 |
11 Sep 08 |
jari |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
1708 |
13 Dec 05 |
nicklas |
23 |
*/ |
1708 |
13 Dec 05 |
nicklas |
24 |
package net.sf.basedb.util; |
1708 |
13 Dec 05 |
nicklas |
25 |
|
5384 |
13 Aug 10 |
nicklas |
26 |
import java.io.Serializable; |
5643 |
26 May 11 |
nicklas |
27 |
import java.util.Collection; |
2992 |
01 Dec 06 |
enell |
28 |
import java.util.Collections; |
2992 |
01 Dec 06 |
enell |
29 |
import java.util.Comparator; |
1708 |
13 Dec 05 |
nicklas |
30 |
import java.util.List; |
1708 |
13 Dec 05 |
nicklas |
31 |
import java.util.LinkedList; |
1708 |
13 Dec 05 |
nicklas |
32 |
|
5643 |
26 May 11 |
nicklas |
33 |
import net.sf.basedb.core.Nameable; |
5643 |
26 May 11 |
nicklas |
34 |
|
1708 |
13 Dec 05 |
nicklas |
35 |
/** |
1708 |
13 Dec 05 |
nicklas |
36 |
|
1708 |
13 Dec 05 |
nicklas |
@author Nicklas |
1708 |
13 Dec 05 |
nicklas |
@version 2.0 |
1708 |
13 Dec 05 |
nicklas |
@base.modified $Date$ |
1708 |
13 Dec 05 |
nicklas |
40 |
*/ |
1708 |
13 Dec 05 |
nicklas |
41 |
public class Enumeration<K, V> |
5384 |
13 Aug 10 |
nicklas |
42 |
implements Serializable |
1708 |
13 Dec 05 |
nicklas |
43 |
{ |
1708 |
13 Dec 05 |
nicklas |
44 |
|
5384 |
13 Aug 10 |
nicklas |
45 |
private static final long serialVersionUID = 1222952912319368574L; |
5643 |
26 May 11 |
nicklas |
46 |
|
5643 |
26 May 11 |
nicklas |
47 |
/** |
5643 |
26 May 11 |
nicklas |
Create a new enumeration from a list of basic items. |
5643 |
26 May 11 |
nicklas |
The key of the enumeration is the id of each item |
5643 |
26 May 11 |
nicklas |
and the value is the name. |
5643 |
26 May 11 |
nicklas |
@param items A collection with items |
5643 |
26 May 11 |
nicklas |
@param noneOption If not null, this options will be inserted first in the |
5643 |
26 May 11 |
nicklas |
enumeration with an empty string as the key |
5643 |
26 May 11 |
nicklas |
54 |
*/ |
5643 |
26 May 11 |
nicklas |
55 |
public static Enumeration<String, String> fromItems(Collection<? extends Nameable> items, String noneOption) |
5643 |
26 May 11 |
nicklas |
56 |
{ |
7307 |
07 Mar 17 |
nicklas |
57 |
return fromItems(items, noneOption, ""); |
7307 |
07 Mar 17 |
nicklas |
58 |
} |
7307 |
07 Mar 17 |
nicklas |
59 |
|
7307 |
07 Mar 17 |
nicklas |
60 |
/** |
7307 |
07 Mar 17 |
nicklas |
Create a new enumeration from a list of basic items. |
7307 |
07 Mar 17 |
nicklas |
The key of the enumeration is the id of each item |
7307 |
07 Mar 17 |
nicklas |
and the value is the name. |
7307 |
07 Mar 17 |
nicklas |
@param items A collection with items |
7307 |
07 Mar 17 |
nicklas |
@param noneOption If not null, this options will be inserted first in the |
7307 |
07 Mar 17 |
nicklas |
enumeration with an empty string as the key |
7307 |
07 Mar 17 |
nicklas |
@param noneValue Value for the 'none' option (empty string by default) |
7307 |
07 Mar 17 |
nicklas |
@since 3.11 |
7307 |
07 Mar 17 |
nicklas |
69 |
*/ |
7307 |
07 Mar 17 |
nicklas |
70 |
public static Enumeration<String, String> fromItems(Collection<? extends Nameable> items, String noneOption, String noneValue) |
7307 |
07 Mar 17 |
nicklas |
71 |
{ |
5643 |
26 May 11 |
nicklas |
72 |
Enumeration<String, String> e = new Enumeration<String, String>(); |
5643 |
26 May 11 |
nicklas |
73 |
if (noneOption != null) |
5643 |
26 May 11 |
nicklas |
74 |
{ |
7307 |
07 Mar 17 |
nicklas |
75 |
e.add(noneValue == null ? "" : noneValue, noneOption); |
5643 |
26 May 11 |
nicklas |
76 |
} |
5643 |
26 May 11 |
nicklas |
77 |
for (Nameable item : items) |
5643 |
26 May 11 |
nicklas |
78 |
{ |
6870 |
16 Apr 15 |
nicklas |
79 |
e.add(Integer.toString(item.getId()), item.getName()); |
5643 |
26 May 11 |
nicklas |
80 |
} |
5643 |
26 May 11 |
nicklas |
81 |
e.lock(); |
5643 |
26 May 11 |
nicklas |
82 |
return e; |
5643 |
26 May 11 |
nicklas |
83 |
} |
5643 |
26 May 11 |
nicklas |
84 |
|
7333 |
11 Apr 17 |
nicklas |
85 |
/** |
7333 |
11 Apr 17 |
nicklas |
Create a new enumeration from a list strings. The key |
7333 |
11 Apr 17 |
nicklas |
and value are the same for each entry. A null value in |
7333 |
11 Apr 17 |
nicklas |
the array will be translated to key="" and value="none" |
7333 |
11 Apr 17 |
nicklas |
@since 3.11 |
7333 |
11 Apr 17 |
nicklas |
90 |
*/ |
7333 |
11 Apr 17 |
nicklas |
91 |
public static Enumeration<String, String> from(String... values) |
7333 |
11 Apr 17 |
nicklas |
92 |
{ |
7333 |
11 Apr 17 |
nicklas |
93 |
Enumeration<String, String> e = new Enumeration<String, String>(); |
7333 |
11 Apr 17 |
nicklas |
94 |
for (String v : values) |
7333 |
11 Apr 17 |
nicklas |
95 |
{ |
7333 |
11 Apr 17 |
nicklas |
96 |
if (v == null) |
7333 |
11 Apr 17 |
nicklas |
97 |
{ |
7333 |
11 Apr 17 |
nicklas |
98 |
e.add("", "none"); |
7333 |
11 Apr 17 |
nicklas |
99 |
} |
7333 |
11 Apr 17 |
nicklas |
100 |
else |
7333 |
11 Apr 17 |
nicklas |
101 |
{ |
7333 |
11 Apr 17 |
nicklas |
102 |
e.add(v, v); |
7333 |
11 Apr 17 |
nicklas |
103 |
} |
7333 |
11 Apr 17 |
nicklas |
104 |
} |
7333 |
11 Apr 17 |
nicklas |
105 |
e.lock(); |
7333 |
11 Apr 17 |
nicklas |
106 |
return e; |
7333 |
11 Apr 17 |
nicklas |
107 |
} |
7333 |
11 Apr 17 |
nicklas |
108 |
|
7333 |
11 Apr 17 |
nicklas |
109 |
|
2190 |
25 Apr 06 |
nicklas |
110 |
private final List<Entry<K, V>> entries; |
2190 |
25 Apr 06 |
nicklas |
111 |
private boolean locked; |
1708 |
13 Dec 05 |
nicklas |
112 |
|
1708 |
13 Dec 05 |
nicklas |
113 |
public Enumeration() |
1708 |
13 Dec 05 |
nicklas |
114 |
{ |
1708 |
13 Dec 05 |
nicklas |
115 |
entries = new LinkedList<Entry<K, V>>(); |
2190 |
25 Apr 06 |
nicklas |
116 |
locked = false; |
1708 |
13 Dec 05 |
nicklas |
117 |
} |
1708 |
13 Dec 05 |
nicklas |
118 |
|
2190 |
25 Apr 06 |
nicklas |
119 |
public boolean isLocked() |
2190 |
25 Apr 06 |
nicklas |
120 |
{ |
2190 |
25 Apr 06 |
nicklas |
121 |
return locked; |
2190 |
25 Apr 06 |
nicklas |
122 |
} |
2190 |
25 Apr 06 |
nicklas |
123 |
|
2190 |
25 Apr 06 |
nicklas |
124 |
public void lock() |
2190 |
25 Apr 06 |
nicklas |
125 |
{ |
2190 |
25 Apr 06 |
nicklas |
126 |
this.locked = true; |
2190 |
25 Apr 06 |
nicklas |
127 |
} |
2190 |
25 Apr 06 |
nicklas |
128 |
|
1708 |
13 Dec 05 |
nicklas |
129 |
public int size() |
1708 |
13 Dec 05 |
nicklas |
130 |
{ |
1708 |
13 Dec 05 |
nicklas |
131 |
return entries.size(); |
1708 |
13 Dec 05 |
nicklas |
132 |
} |
1708 |
13 Dec 05 |
nicklas |
133 |
|
1708 |
13 Dec 05 |
nicklas |
134 |
public int add(K key, V value) |
1708 |
13 Dec 05 |
nicklas |
135 |
{ |
2190 |
25 Apr 06 |
nicklas |
136 |
if (locked) throw new UnsupportedOperationException("add; The enumeration has been locked for modifications."); |
1708 |
13 Dec 05 |
nicklas |
137 |
int index = size(); |
1708 |
13 Dec 05 |
nicklas |
138 |
entries.add(new Entry<K, V>(key, value)); |
1708 |
13 Dec 05 |
nicklas |
139 |
return index; |
1708 |
13 Dec 05 |
nicklas |
140 |
} |
1708 |
13 Dec 05 |
nicklas |
141 |
|
1708 |
13 Dec 05 |
nicklas |
142 |
public K getKey(int index) |
1708 |
13 Dec 05 |
nicklas |
143 |
{ |
1708 |
13 Dec 05 |
nicklas |
144 |
return entries.get(index).getKey(); |
1708 |
13 Dec 05 |
nicklas |
145 |
} |
1708 |
13 Dec 05 |
nicklas |
146 |
|
1708 |
13 Dec 05 |
nicklas |
147 |
public V getValue(int index) |
1708 |
13 Dec 05 |
nicklas |
148 |
{ |
1708 |
13 Dec 05 |
nicklas |
149 |
return entries.get(index).getValue(); |
1708 |
13 Dec 05 |
nicklas |
150 |
} |
1708 |
13 Dec 05 |
nicklas |
151 |
|
1708 |
13 Dec 05 |
nicklas |
152 |
public Entry<K, V> getEntry(int index) |
1708 |
13 Dec 05 |
nicklas |
153 |
{ |
1708 |
13 Dec 05 |
nicklas |
154 |
return entries.get(index); |
1708 |
13 Dec 05 |
nicklas |
155 |
} |
1708 |
13 Dec 05 |
nicklas |
156 |
|
6372 |
06 Dec 13 |
nicklas |
157 |
/** |
6372 |
06 Dec 13 |
nicklas |
Get a list with all entries that equals the given key. |
6372 |
06 Dec 13 |
nicklas |
@return A list which may be empty if no entries are found |
6372 |
06 Dec 13 |
nicklas |
@since 3.2.4 |
6372 |
06 Dec 13 |
nicklas |
161 |
*/ |
6372 |
06 Dec 13 |
nicklas |
162 |
public List<Entry<K, V>> getEntriesByKey(K key) |
6372 |
06 Dec 13 |
nicklas |
163 |
{ |
6372 |
06 Dec 13 |
nicklas |
164 |
List<Entry<K, V>> result = new LinkedList<Enumeration.Entry<K,V>>(); |
6372 |
06 Dec 13 |
nicklas |
165 |
for (Entry<K, V> e : entries) |
6372 |
06 Dec 13 |
nicklas |
166 |
{ |
6372 |
06 Dec 13 |
nicklas |
167 |
if (EqualsHelper.equals(e.key, key)) result.add(e); |
6372 |
06 Dec 13 |
nicklas |
168 |
} |
6372 |
06 Dec 13 |
nicklas |
169 |
return result; |
6372 |
06 Dec 13 |
nicklas |
170 |
} |
6372 |
06 Dec 13 |
nicklas |
171 |
|
6372 |
06 Dec 13 |
nicklas |
172 |
/** |
6372 |
06 Dec 13 |
nicklas |
Get a list with all entries that equals the given value. |
6372 |
06 Dec 13 |
nicklas |
@return A list which may be empty if no entries are found |
6372 |
06 Dec 13 |
nicklas |
@since 3.2.4 |
6372 |
06 Dec 13 |
nicklas |
176 |
*/ |
6372 |
06 Dec 13 |
nicklas |
177 |
public List<Entry<K, V>> getEntriesByValue(V value) |
6372 |
06 Dec 13 |
nicklas |
178 |
{ |
6372 |
06 Dec 13 |
nicklas |
179 |
List<Entry<K, V>> result = new LinkedList<Enumeration.Entry<K,V>>(); |
6372 |
06 Dec 13 |
nicklas |
180 |
for (Entry<K, V> e : entries) |
6372 |
06 Dec 13 |
nicklas |
181 |
{ |
6372 |
06 Dec 13 |
nicklas |
182 |
if (EqualsHelper.equals(e.value, value)) result.add(e); |
6372 |
06 Dec 13 |
nicklas |
183 |
} |
6372 |
06 Dec 13 |
nicklas |
184 |
return result; |
6372 |
06 Dec 13 |
nicklas |
185 |
} |
6372 |
06 Dec 13 |
nicklas |
186 |
|
1708 |
13 Dec 05 |
nicklas |
187 |
public void remove(int index) |
1708 |
13 Dec 05 |
nicklas |
188 |
{ |
5643 |
26 May 11 |
nicklas |
189 |
if (locked) throw new UnsupportedOperationException("remove; The enumeration has been locked for modifications."); |
1708 |
13 Dec 05 |
nicklas |
190 |
entries.remove(index); |
1708 |
13 Dec 05 |
nicklas |
191 |
} |
1708 |
13 Dec 05 |
nicklas |
192 |
|
2992 |
01 Dec 06 |
enell |
193 |
/** |
3461 |
07 Jun 07 |
nicklas |
This method will sort the enumration on the keys using |
3461 |
07 Jun 07 |
nicklas |
{@link Collections#sort(List, Comparator)}. |
3461 |
07 Jun 07 |
nicklas |
The comparator will try to use the keys 'compareTo' method |
3461 |
07 Jun 07 |
nicklas |
if it implements the Comparable interface |
3461 |
07 Jun 07 |
nicklas |
otherwilse it will treat the key as a String. |
3461 |
07 Jun 07 |
nicklas |
199 |
*/ |
2992 |
01 Dec 06 |
enell |
200 |
public void sortKeys() |
2992 |
01 Dec 06 |
enell |
201 |
{ |
2992 |
01 Dec 06 |
enell |
202 |
Collections.sort(entries, new Comparator<Entry<K, V>>() |
2992 |
01 Dec 06 |
enell |
203 |
{ |
6127 |
14 Sep 12 |
nicklas |
204 |
@Override |
2992 |
01 Dec 06 |
enell |
205 |
@SuppressWarnings("unchecked") |
2992 |
01 Dec 06 |
enell |
206 |
public int compare(Entry<K, V> o1, Entry<K, V> o2) |
2992 |
01 Dec 06 |
enell |
207 |
{ |
2992 |
01 Dec 06 |
enell |
208 |
K key1 = o1.getKey(); |
2992 |
01 Dec 06 |
enell |
209 |
K key2 = o2.getKey(); |
2992 |
01 Dec 06 |
enell |
210 |
if (key1 instanceof Comparable) |
2992 |
01 Dec 06 |
enell |
211 |
{ |
2992 |
01 Dec 06 |
enell |
212 |
return ((Comparable<K>) key1).compareTo(key2); |
2992 |
01 Dec 06 |
enell |
213 |
} |
2992 |
01 Dec 06 |
enell |
214 |
else |
2992 |
01 Dec 06 |
enell |
215 |
{ |
2992 |
01 Dec 06 |
enell |
216 |
return key1.toString().compareTo(key2.toString()); |
2992 |
01 Dec 06 |
enell |
217 |
} |
2992 |
01 Dec 06 |
enell |
218 |
} |
2992 |
01 Dec 06 |
enell |
219 |
}); |
2992 |
01 Dec 06 |
enell |
220 |
} |
2992 |
01 Dec 06 |
enell |
221 |
|
2992 |
01 Dec 06 |
enell |
222 |
/** |
3461 |
07 Jun 07 |
nicklas |
This method will sort the enumration on the values using |
3461 |
07 Jun 07 |
nicklas |
{@link Collections#sort(List, Comparator)}. |
3461 |
07 Jun 07 |
nicklas |
The comparator will try to use the values 'compareTo' method |
3461 |
07 Jun 07 |
nicklas |
if it implements the Comparable interface |
3461 |
07 Jun 07 |
nicklas |
otherwilse it will treat the value as a String. |
3461 |
07 Jun 07 |
nicklas |
228 |
*/ |
2992 |
01 Dec 06 |
enell |
229 |
public void sortValues() |
2992 |
01 Dec 06 |
enell |
230 |
{ |
2992 |
01 Dec 06 |
enell |
231 |
Collections.sort(entries, new Comparator<Entry<K, V>>() |
2992 |
01 Dec 06 |
enell |
232 |
{ |
6127 |
14 Sep 12 |
nicklas |
233 |
@Override |
2992 |
01 Dec 06 |
enell |
234 |
@SuppressWarnings("unchecked") |
2992 |
01 Dec 06 |
enell |
235 |
public int compare(Entry<K, V> o1, Entry<K, V> o2) |
2992 |
01 Dec 06 |
enell |
236 |
{ |
2992 |
01 Dec 06 |
enell |
237 |
V value1 = o1.getValue(); |
2992 |
01 Dec 06 |
enell |
238 |
V value2 = o2.getValue(); |
2992 |
01 Dec 06 |
enell |
239 |
if (value1 instanceof Comparable) |
2992 |
01 Dec 06 |
enell |
240 |
{ |
2992 |
01 Dec 06 |
enell |
241 |
return ((Comparable<V>) value1).compareTo(value2); |
2992 |
01 Dec 06 |
enell |
242 |
} |
2992 |
01 Dec 06 |
enell |
243 |
else |
2992 |
01 Dec 06 |
enell |
244 |
{ |
2992 |
01 Dec 06 |
enell |
245 |
return value1.toString().compareTo(value2.toString()); |
2992 |
01 Dec 06 |
enell |
246 |
} |
2992 |
01 Dec 06 |
enell |
247 |
} |
2992 |
01 Dec 06 |
enell |
248 |
}); |
2992 |
01 Dec 06 |
enell |
249 |
} |
1708 |
13 Dec 05 |
nicklas |
250 |
public static class Entry<K, V> |
1708 |
13 Dec 05 |
nicklas |
251 |
{ |
1708 |
13 Dec 05 |
nicklas |
252 |
private final K key; |
1708 |
13 Dec 05 |
nicklas |
253 |
private final V value; |
1708 |
13 Dec 05 |
nicklas |
254 |
|
1708 |
13 Dec 05 |
nicklas |
255 |
private Entry(K key, V value) |
1708 |
13 Dec 05 |
nicklas |
256 |
{ |
1708 |
13 Dec 05 |
nicklas |
257 |
this.key = key; |
1708 |
13 Dec 05 |
nicklas |
258 |
this.value = value; |
1708 |
13 Dec 05 |
nicklas |
259 |
} |
1708 |
13 Dec 05 |
nicklas |
260 |
|
1708 |
13 Dec 05 |
nicklas |
261 |
public K getKey() |
1708 |
13 Dec 05 |
nicklas |
262 |
{ |
1708 |
13 Dec 05 |
nicklas |
263 |
return key; |
1708 |
13 Dec 05 |
nicklas |
264 |
} |
1708 |
13 Dec 05 |
nicklas |
265 |
|
1708 |
13 Dec 05 |
nicklas |
266 |
public V getValue() |
1708 |
13 Dec 05 |
nicklas |
267 |
{ |
1708 |
13 Dec 05 |
nicklas |
268 |
return value; |
1708 |
13 Dec 05 |
nicklas |
269 |
} |
1708 |
13 Dec 05 |
nicklas |
270 |
|
1708 |
13 Dec 05 |
nicklas |
271 |
} |
1708 |
13 Dec 05 |
nicklas |
272 |
|
1708 |
13 Dec 05 |
nicklas |
273 |
|
1708 |
13 Dec 05 |
nicklas |
274 |
|
1708 |
13 Dec 05 |
nicklas |
275 |
} |