001    package de.deepamehta.core.util;
002    
003    import java.util.ArrayList;
004    import java.util.LinkedHashMap;
005    import java.util.List;
006    
007    
008    
009    public class SequencedHashMap<K,V> extends LinkedHashMap<K,V> {
010    
011        /**
012         * @param   beforeKey   the key <i>before</i> the key-value entry is put.
013         *                      If <code>null</code> the entry is put at the end.
014         *                      If non-<code>null</code> but not contained in the map an exception is thrown.
015         */
016        public void putBefore(K key, V value, K beforeKey) {
017            // collect keys of entries to shift
018            List<K> shiftKeys = new ArrayList<K>();
019            if (beforeKey != null) {
020                boolean shift = false;
021                for (K k : keySet()) {
022                    if (!shift && k.equals(beforeKey)) {
023                        shift = true;
024                    }
025                    if (shift) {
026                        shiftKeys.add(k);
027                    }
028                }
029                //
030                if (shiftKeys.isEmpty()) {
031                    throw new RuntimeException("Key \"" + beforeKey + "\" not found in " + keySet());
032                }
033            }
034            //
035            put(key, value);
036            //
037            // shift entries
038            for (K k : shiftKeys) {
039                put(k, remove(k));
040            }
041        }
042    }