package org.eclipse.gmf.tooling.runtime.impl.ocl.tracker.activeocl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.tooling.runtime.impl.ocl.activeocl.ActiveOclListener;
import org.eclipse.gmf.tooling.runtime.impl.ocl.activeocl.ActiveOclResult;
import org.eclipse.ocl.ParserException;
class ActiveOclResultImpl implements ActiveOclResult, ActiveOclListener {
private final List<ActiveOclListener> myListeners;
private Object myResult;
private final ListeningDependencyCollector myDependencyCollector;
private final DependencyEvaluator myDependencyEvaluator;
public ActiveOclResultImpl(EObject context, String oclExp) throws ParserException {
myListeners = new ArrayList<ActiveOclListener>();
myDependencyCollector = new ListeningDependencyCollector(this);
myDependencyEvaluator = new DependencyEvaluator(context, oclExp, myDependencyCollector);
myResult = myDependencyEvaluator.evaluate();
}
public void onResultChanged() {
myDependencyCollector.clear();
Object newResult = myDependencyEvaluator.evaluate();
if (myResult == null && newResult == null //
|| myResult != null && myResult.equals(newResult)) {
return;
}
myResult = newResult;
for (ActiveOclListener listener : myListeners) {
listener.onResultChanged();
}
}
public void removeListener(ActiveOclListener listener) {
myListeners.remove(listener);
}
public Object getResult() {
return myResult;
}
public void dispose() {
myDependencyCollector.clear();
}
public boolean canListenForChanges() {
return true;
}
public void addListener(ActiveOclListener listener) {
myListeners.add(listener);
}
public Notifier adaptToEMFNotifier() {
// TODO Auto-generated method stub
return null;
}
}