package pt.ist.fenixframework.dml.runtime;
import java.util.LinkedList;
import java.util.ListIterator;
import pt.ist.fenixframework.DomainObject;
public class InverseRelation<C1 extends DomainObject,C2 extends DomainObject> implements Relation<C1,C2> {
private Relation<C2,C1> inverseRelation;
private final String name;
//private LinkedList<InverseListener<C2,C1>> inverseListeners = null;
public InverseRelation(Relation<C2,C1> inverseRelation, String name) {
this.inverseRelation = inverseRelation;
this.name = name;
}
public void add(C1 o1, C2 o2) {
inverseRelation.add(o2, o1);
}
public void remove(C1 o1, C2 o2) {
inverseRelation.remove(o2, o1);
}
public Relation<C2,C1> getInverseRelation() {
return inverseRelation;
}
public String getName() {
return name;
}
/*
* The following methods are commented out because, currently, we
* can only add listeners to DirectRelations (a consequence of the
* initialization order of classes)
protected LinkedList<InverseListener<C2,C1>> getListeners() {
if (inverseListeners == null) {
inverseListeners = new LinkedList<InverseListener<C2,C1>>();
}
return inverseListeners;
}
public void addListener(RelationListener<C1,C2> listener) {
InverseListener<C2,C1> invListener = new InverseListener<C2,C1>(listener);
inverseRelation.addListener(invListener);
getListeners().add(invListener);
}
public void removeListener(RelationListener<C1,C2> listener) {
ListIterator<InverseListener<C2,C1>> iter = getListeners().listIterator();
while (iter.hasNext()) {
if (iter.next().inverseListener.equals(listener)) {
iter.remove();
}
}
}
static class InverseListener<C1,C2> implements RelationListener<C1,C2> {
RelationListener<C2,C1> inverseListener;
InverseListener(RelationListener<C2,C1> inverseListener) {
this.inverseListener = inverseListener;
}
public void beforeAdd(Relation<C1,C2> rel, C1 o1, C2 o2) {
inverseListener.beforeAdd(rel.getInverseRelation(), o2, o1);
}
public void afterAdd(Relation<C1,C2> rel, C1 o1, C2 o2) {
inverseListener.afterAdd(rel.getInverseRelation(), o2, o1);
}
public void beforeRemove(Relation<C1,C2> rel, C1 o1, C2 o2) {
inverseListener.beforeRemove(rel.getInverseRelation(), o2, o1);
}
public void afterRemove(Relation<C1,C2> rel, C1 o1, C2 o2) {
inverseListener.afterRemove(rel.getInverseRelation(), o2, o1);
}
}
*/
}