package pt.ist.fenixframework.dml.runtime;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
import pt.ist.fenixframework.DomainObject;
public class RelationAwareSet<E1 extends DomainObject,E2 extends DomainObject> extends AbstractSet<E2> implements Set<E2>,RelationBaseSet<E2> {
private Set<E2> set;
private E1 owner;
private Relation<E1,E2> relation;
public RelationAwareSet(E1 owner, Relation<E1,E2> relation, Set<E2> set) {
this.owner = owner;
this.relation = relation;
this.set = set;
}
public void justAdd(E2 elem) {
set.add(elem);
}
public void justRemove(E2 elem) {
set.remove(elem);
}
public int size() {
return set.size();
}
public boolean contains(Object o) {
return set.contains(o);
}
@Override
public Iterator<E2> iterator() {
return new RelationAwareIterator(set);
}
@Override
public boolean add(E2 o) {
if (set.contains(o)) {
return false;
} else {
relation.add(owner, o);
return true;
}
}
@Override
public boolean remove(Object o) {
if (set.contains(o)) {
relation.remove(owner, (E2)o);
return true;
} else {
return false;
}
}
private class RelationAwareIterator implements Iterator<E2> {
private Iterator<E2> iterator;
private E2 current = null;
private boolean canRemove = false;
RelationAwareIterator(Set<E2> set) {
this.iterator = set.iterator();
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public E2 next() {
E2 result = iterator.next();
canRemove = true;
current = result;
return current;
}
@Override
public void remove() {
if (! canRemove) {
throw new IllegalStateException();
} else {
canRemove = false;
relation.remove(owner, current);
}
}
}
}