package org.eclipse.gmf.tooling.runtime.impl.ocl.tracker.activeocl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.diagram.core.listener.NotificationListener;
import org.eclipse.gmf.tooling.runtime.ocl.tracker.OclTrackerBase;
import org.eclipse.ocl.ParserException;
class ActiveOclTracker extends OclTrackerBase {
private NotificationListener myListener;
private SimpleDependencyCollector myDependecyCollector;
private List<EObject> myParserElements;
private Registrator myRegistrator;
private Object myValue;
private boolean myValueInitialized = false;
private final boolean myCached;
public ActiveOclTracker(String expressionBody, boolean cached) {
super(expressionBody);
myCached = cached;
myDependecyCollector = new SimpleDependencyCollector();
}
public void installListeners(TransactionalEditingDomain domain, NotificationListener listener, Registrator registrator) {
myListener = listener;
myRegistrator = registrator;
registerListeners();
}
public void uninstallListeners() {
unregisterListeners();
}
private void registerListeners() {
if (myRegistrator == null) {
return;
}
myParserElements = new ArrayList<EObject>(myDependecyCollector.getContext2Data().keySet());
for (int i = 0; i < myParserElements.size(); i++) {
myRegistrator.registerListener("ActiveOclTracker#SemanticModel" + i, myListener, myParserElements.get(i)); //$NON-NLS-1$
}
}
private void unregisterListeners() {
if (myParserElements == null) {
return;
}
for (int i = 0; i < myParserElements.size(); i++) {
myRegistrator.unregisterListener("ActiveOclTracker#SemanticModel" + i); //$NON-NLS-1$
}
}
public Object getValue() {
if (!myValueInitialized || !isCached()) {
doInitialize();
}
return myValue;
}
public boolean handleNotification(Notification notification) {
ContextData contextData = myDependecyCollector.getContext2Data().get(notification.getNotifier());
boolean affected = contextData != null && contextData.getFeatures().contains(notification.getFeature());
if (affected) {
doInitialize();
}
return affected;
}
@Override
protected void doInitialize() {
unregisterListeners();
myDependecyCollector.clear();
try {
myValue = new ActiveOclEvaluatorImpl().evaluate(getContext(), getExpressionBody(), myDependecyCollector);
} catch (ParserException e) {
throw new RuntimeException(e);
}
registerListeners();
}
private boolean isCached() {
return myCached;
}
}