src/core/net/sf/basedb/util/Enumeration.java

Code
Comments
Other
Rev Date Author Line
1708 13 Dec 05 nicklas 1 /*
1708 13 Dec 05 nicklas 2   $Id$
1708 13 Dec 05 nicklas 3
3675 16 Aug 07 jari 4   Copyright (C) 2005 Nicklas Nordborg
4889 06 Apr 09 nicklas 5   Copyright (C) 2006 Johan Enell, Jari Häkkinen, Nicklas Nordborg
3675 16 Aug 07 jari 6   Copyright (C) 2007 Nicklas Nordborg
1708 13 Dec 05 nicklas 7
2304 22 May 06 jari 8   This file is part of BASE - BioArray Software Environment.
2304 22 May 06 jari 9   Available at http://base.thep.lu.se/
1708 13 Dec 05 nicklas 10
1708 13 Dec 05 nicklas 11   BASE is free software; you can redistribute it and/or
1708 13 Dec 05 nicklas 12   modify it under the terms of the GNU General Public License
4479 05 Sep 08 jari 13   as published by the Free Software Foundation; either version 3
1708 13 Dec 05 nicklas 14   of the License, or (at your option) any later version.
1708 13 Dec 05 nicklas 15
1708 13 Dec 05 nicklas 16   BASE is distributed in the hope that it will be useful,
1708 13 Dec 05 nicklas 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
1708 13 Dec 05 nicklas 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1708 13 Dec 05 nicklas 19   GNU General Public License for more details.
1708 13 Dec 05 nicklas 20
1708 13 Dec 05 nicklas 21   You should have received a copy of the GNU General Public License
4515 11 Sep 08 jari 22   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 37   @author Nicklas
1708 13 Dec 05 nicklas 38   @version 2.0
1708 13 Dec 05 nicklas 39   @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 48     Create a new enumeration from a list of basic items.
5643 26 May 11 nicklas 49     The key of the enumeration is the id of each item
5643 26 May 11 nicklas 50     and the value is the name.
5643 26 May 11 nicklas 51     @param items A collection with items
5643 26 May 11 nicklas 52     @param noneOption If not null, this options will be inserted first in the
5643 26 May 11 nicklas 53       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 61     Create a new enumeration from a list of basic items.
7307 07 Mar 17 nicklas 62     The key of the enumeration is the id of each item
7307 07 Mar 17 nicklas 63     and the value is the name.
7307 07 Mar 17 nicklas 64     @param items A collection with items
7307 07 Mar 17 nicklas 65     @param noneOption If not null, this options will be inserted first in the
7307 07 Mar 17 nicklas 66       enumeration with an empty string as the key
7307 07 Mar 17 nicklas 67     @param noneValue Value for the 'none' option (empty string by default)
7307 07 Mar 17 nicklas 68     @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 86     Create a new enumeration from a list strings. The key
7333 11 Apr 17 nicklas 87     and value are the same for each entry. A null value in
7333 11 Apr 17 nicklas 88     the array will be translated to key="" and value="none"
7333 11 Apr 17 nicklas 89     @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 158     Get a list with all entries that equals the given key.
6372 06 Dec 13 nicklas 159     @return A list which may be empty if no entries are found
6372 06 Dec 13 nicklas 160     @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 173     Get a list with all entries that equals the given value.
6372 06 Dec 13 nicklas 174     @return A list which may be empty if no entries are found
6372 06 Dec 13 nicklas 175     @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 194     This method will sort the enumration on the keys using 
3461 07 Jun 07 nicklas 195     {@link Collections#sort(List, Comparator)}. 
3461 07 Jun 07 nicklas 196     The comparator will try to use the keys 'compareTo' method 
3461 07 Jun 07 nicklas 197     if it implements the Comparable interface
3461 07 Jun 07 nicklas 198     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 223     This method will sort the enumration on the values using 
3461 07 Jun 07 nicklas 224     {@link Collections#sort(List, Comparator)}. 
3461 07 Jun 07 nicklas 225     The comparator will try to use the values 'compareTo' method 
3461 07 Jun 07 nicklas 226     if it implements the Comparable interface
3461 07 Jun 07 nicklas 227     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 }