package net.i2p.util; /* * free (adj.): unencumbered; not under the control of others * Written by jrandom in 2003 and released into the public domain * with no warranty of any kind, either expressed or implied. * It probably won't make your computer catch on fire, or eat * your children, but it might. Use at your own risk. * */ import java.io.Serializable; import java.util.Collections; import java.util.Comparator; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeSet; /** * Properties map that has its keySet ordered consistently (via the key's lexicographical ordering). * This is useful in environments where maps must stay the same order (e.g. for signature verification) * This does NOT support remove against the iterators / etc. * * @author zzz Rewritten * * Now unsorted until the keyset or entryset is requested. * The class is unsynchronized. * The keySet() and entrySet() methods return ordered sets. * Others - such as the enumerations values(), keys(), propertyNames() - do not. */ public class OrderedProperties extends Properties { public OrderedProperties() { super(); } @Override public Set<Object> keySet() { if (size() <= 1) return super.keySet(); return Collections.unmodifiableSortedSet(new TreeSet<Object>(super.keySet())); } @Override public Set<Map.Entry<Object, Object>> entrySet() { if (size() <= 1) return super.entrySet(); TreeSet<Map.Entry<Object, Object>> rv = new TreeSet<Map.Entry<Object, Object>>(new EntryComparator()); rv.addAll(super.entrySet()); return Collections.unmodifiableSortedSet(rv); } private static class EntryComparator implements Comparator<Map.Entry<Object, Object>>, Serializable { public int compare(Map.Entry<Object, Object> l, Map.Entry<Object, Object> r) { return ((String)l.getKey()).compareTo(((String)r.getKey())); } } }