blob: df3ee9bb00133835ac15e036ac75f773dc311aff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Borland Software Corporation
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.library;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.ast.parser.QvtOperationalUtil;
import org.eclipse.m2m.internal.qvt.oml.evaluator.DeferredAssignmentListener;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtOperationalEvaluationVisitor;
import org.eclipse.m2m.internal.qvt.oml.expressions.AssignExp;
import org.eclipse.m2m.internal.qvt.oml.expressions.ResolveExp;
import org.eclipse.m2m.internal.qvt.oml.library.QvtResolveUtil.SavedSourceObjectHolder;
/**
* @author aigdalov
*/
public abstract class AbstractLateResolveTask implements Runnable, SavedSourceObjectHolder {
private final ResolveExp myResolveExp;
private final QvtOperationalEvaluationVisitor myVisitor;
private final QvtOperationalEvaluationEnv myEvalEnv;
private final EObjectEStructuralFeaturePair myLvalue;
private Object mySourceObj;
private final DeferredAssignmentListener myListener;
public AbstractLateResolveTask(ResolveExp resolveExp, EObjectEStructuralFeaturePair lvalue, QvtOperationalEvaluationVisitor visitor,
QvtOperationalEvaluationEnv evalEnv, DeferredAssignmentListener deferredListener) {
myResolveExp = resolveExp;
myLvalue = lvalue;
myVisitor = visitor;
myEvalEnv = evalEnv.cloneEvaluationEnv();
if(myResolveExp.getSource() != null) {
mySourceObj = myResolveExp.getSource().accept(visitor);
}
myListener = deferredListener;
}
public void run() {
QvtOperationalEvaluationEnv oldEvalEnv =
myVisitor.getOperationalEvaluationEnv();
myVisitor.setOperationalEvaluationEnv(myEvalEnv);
Object resolveResult = getResolveResult();
try {
AssignExp assignExp = QvtResolveUtil.getDeferredAssignmentFor(myResolveExp);
if(assignExp != null && myLvalue != null) {
myEvalEnv.callSetter(myLvalue.getEObject(), myLvalue.getEStructuralFeature(),
resolveResult, QvtOperationalUtil.isUndefined(resolveResult), assignExp.isIsReset());
if(myListener != null) {
myListener.notifyAfterDeferredAssign(assignExp, resolveResult);
}
} else {
// there was not appropriate assignment to receive the value
}
} finally {
myVisitor.setOperationalEvaluationEnv(oldEvalEnv);
}
}
public void schedule() {
myVisitor.getContext().addDeferredTask(this);
}
protected abstract Object getResolveResult();
public ResolveExp getResolveExp() {
return myResolveExp;
}
public QvtOperationalEvaluationVisitor getVisitor() {
return myVisitor;
}
public QvtOperationalEvaluationEnv getEvalEnv() {
return myEvalEnv;
}
public EObjectEStructuralFeaturePair getLvalue() {
return myLvalue;
}
public Object getSourceObj() {
return mySourceObj;
}
public boolean isInDeferredExecution() {
return true;
}
}