public T remove(T value) { Name name = nameMapper.apply(value); Map<Name, T> nameMap = getMapForValue(nameMultiMap, value); nameMap.remove(name); Map<String, T> idMap = getMapForValue(idMultiMap, value); return idMap.remove(value.getId()); }
<K> Map<K, T> getMapForValue(ConcurrentHashMap<Class<T>, Map<K, T>> maps, T value) { Class<T> vc; if (Proxy.isProxyClass(value.getClass())) { ModificationProxy h = (ModificationProxy) Proxy.getInvocationHandler(value); Object po = (T) h.getProxyObject(); vc = (Class<T>) po.getClass(); } else { vc = (Class<T>) value.getClass(); } return getMapForValue(maps, vc); }
public T add(T value) { if (Proxy.isProxyClass(value.getClass())) { ModificationProxy h = (ModificationProxy) Proxy.getInvocationHandler(value); value = (T) h.getProxyObject(); } Map<Name, T> nameMap = getMapForValue(nameMultiMap, value); Name name = nameMapper.apply(value); nameMap.put(name, value); Map<String, T> idMap = getMapForValue(idMultiMap, value); return idMap.put(value.getId(), value); }
/** Updates the value in the name map. The new value must be a ModificationProxy */ public void update(T proxiedValue) { ModificationProxy h = (ModificationProxy) Proxy.getInvocationHandler(proxiedValue); T actualValue = (T) h.getProxyObject(); Name oldName = nameMapper.apply(actualValue); Name newName = nameMapper.apply(proxiedValue); if (!oldName.equals(newName)) { Map<Name, T> nameMap = getMapForValue(nameMultiMap, actualValue); nameMap.remove(oldName); nameMap.put(newName, actualValue); } }