/** * Remove the value which is associated with the given key. If the key does not exist, this method * simply ignores the operation. * * @param key key whose associated value is to be removed * @return object which was associated with the given key, or <code>null</code> if no association * existed with given key. */ Object remove(Object key) throws IOException { int hash = hashCode(key); long child_recid = _children[hash]; if (child_recid == 0) { // not bucket/page --> not found return null; } else { HashNode node = (HashNode) _recman.fetch(child_recid, tree.SERIALIZER); // System.out.println("HashDirectory.remove() child is : "+node); if (node instanceof HashDirectory) { // recurse into next directory level HashDirectory dir = (HashDirectory) node; dir.setPersistenceContext(_recman, child_recid); Object existing = dir.remove(key); if (existing != null) { if (dir.isEmpty()) { // delete empty directory _recman.delete(child_recid); _children[hash] = 0; _recman.update(_recid, this, tree.SERIALIZER); } } return existing; } else { // node is a bucket HashBucket bucket = (HashBucket) node; Object existing = bucket.removeElement(key); if (existing != null) { if (bucket.getElementCount() >= 1) { _recman.update(child_recid, bucket, tree.SERIALIZER); } else { // delete bucket, it's empty _recman.delete(child_recid); _children[hash] = 0; _recman.update(_recid, this, tree.SERIALIZER); } } return existing; } } }