package pt.ist.fenixframework.dml.runtime;
import java.util.LinkedList;
import pt.ist.fenixframework.DomainObject;
public class DirectRelation<C1 extends DomainObject,C2 extends DomainObject> implements Relation<C1,C2> {
private Relation<C2,C1> inverse;
private Role<C1,C2> firstRole;
private final String name;
private LinkedList<RelationListener<C1,C2>> listeners = null;
public DirectRelation(Role<C1,C2> firstRole, String name) {
this.firstRole = firstRole;
this.name = name;
inverse = new InverseRelation<C2,C1>(this, name);
}
public DirectRelation(Role<C1,C2> firstRole, String name, RelationListener<C1,C2> ... listeners) {
this(firstRole, name);
for (RelationListener<C1,C2> listener : listeners) {
addListener(listener);
}
}
public void add(C1 o1, C2 o2) {
if (listeners != null) {
for (RelationListener<C1,C2> l : listeners) {
l.beforeAdd(this, o1, o2);
}
}
firstRole.add(o1, o2, this);
firstRole.getInverseRole().add(o2, o1, inverse);
if (listeners != null) {
for (RelationListener<C1,C2> l : listeners) {
l.afterAdd(this, o1, o2);
}
}
}
public void remove(C1 o1, C2 o2) {
if (listeners != null) {
for (RelationListener<C1,C2> l : listeners) {
l.beforeRemove(this, o1, o2);
}
}
firstRole.remove(o1, o2);
firstRole.getInverseRole().remove(o2, o1);
if (listeners != null) {
for (RelationListener<C1,C2> l : listeners) {
l.afterRemove(this, o1, o2);
}
}
}
public Relation<C2,C1> getInverseRelation() {
return inverse;
}
protected LinkedList<RelationListener<C1,C2>> getListeners() {
if (listeners == null) {
listeners = new LinkedList<RelationListener<C1,C2>>();
}
return listeners;
}
public void addListener(RelationListener<C1,C2> listener) {
getListeners().add(listener);
}
public void removeListener(RelationListener<C1,C2> listener) {
getListeners().remove(listener);
}
public String getName() {
return name;
}
}