package org.openntf.domino.helpers;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Vector;
import org.openntf.domino.Document;
public class DocumentEntrySet extends AbstractSet<Entry<String, Object>> {
private Document doc;
class DocumentEntrySetIterator implements Iterator<Entry<String, Object>> {
private Iterator<String> keys;
public DocumentEntrySetIterator(final Set<String> keySet) {
keys = keySet.iterator();
}
@Override
public boolean hasNext() {
return keys.hasNext();
}
@Override
public Entry<String, Object> next() {
final String key = keys.next();
return new Entry<String, Object>() {
@Override
public String getKey() {
return key;
}
@Override
public Object getValue() {
return doc.get(key);
}
@Override
public Object setValue(final Object value) {
return doc.put(key, value);
}
@Override
public String toString() {
return key + "=" + getValue();
}
};
}
@Override
public void remove() {
keys.remove();
}
}
public DocumentEntrySet(final Document document) {
doc = document;
}
@Override
public boolean add(final Entry<String, Object> entry) {
return doc.put(entry.getKey(), entry.getValue()) != null;
}
@Override
public void clear() {
doc.clear();
}
@Override
public boolean isEmpty() {
return doc.isEmpty();
}
@Override
public Iterator<Entry<String, Object>> iterator() {
return new DocumentEntrySetIterator(doc.keySet());
}
@Override
public boolean remove(final Object arg0) {
if (arg0 instanceof Entry) {
@SuppressWarnings("unchecked")
final Entry<String, Object> entry = (Entry<String, Object>) arg0;
return doc.remove(entry.getKey()) != null;
}
return false;
}
@Override
public int size() {
return doc.size();
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((doc == null) ? 0 : doc.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@SuppressWarnings("rawtypes")
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof DocumentEntrySet)) {
return false;
}
DocumentEntrySet other = (DocumentEntrySet) obj;
Set<String> myKeySet = doc.keySet();
Object otherKeySet = other.doc.keySet();
if (!myKeySet.equals(otherKeySet))
return false;
for (String key : myKeySet) {
Vector myVal = doc.getItemValue(key);
Vector otherVal = other.doc.getItemValue(key);
if (myVal == null && otherVal == null) {
// nop
} else if (myVal == null || otherVal == null) {
return false;
} else if (!myVal.equals(otherVal)) {
return false;
}
}
return true;
}
}