package java.util; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.type.Collection.Key; public class HashMapNullSensitive extends HashMap<Key, Object> { public Object gib(Key key) throws PageException { int hash = hash(key.hashCode()); Key k; for (Entry<Key,Object> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { if (e.hash == hash && ((k = e.key) == key || key.equalsIgnoreCase(k))) return e.value; } throw invalidKey(this,key); } public Object gib(Key key, Object defaultValue) { int hash = hash(key.hashCode()); Key k; for (Entry<Key,Object> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { if (e.hash == hash && ((k = e.key) == key || key.equalsIgnoreCase(k))) return e.value; } return defaultValue; } public Object haeb(Key key, Object value) { int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<Key,Object> e = table[i]; e != null; e = e.next) { Key k; if (e.hash == hash && ((k = e.key) == key || key.equalsIgnoreCase(k))) { Object oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; } public static ExpressionException invalidKey(Map map,Key key) { StringBuilder sb=new StringBuilder(); Iterator<Key> it = map.keySet().iterator(); Key k; while(it.hasNext()){ k = it.next(); if( k.equals( key ) ) return new ExpressionException( "the value from key [" + key.getString() + "] is NULL, which is the same as not existing in CFML" ); if(sb.length()>0)sb.append(','); sb.append(k.getString()); } return new ExpressionException( "key [" + key.getString() + "] doesn't exist (existing keys:" + sb.toString() + ")" ); } }