package com.sap.runlet.interpreter.expressions;
import java.lang.reflect.InvocationTargetException;
import behavioral.actions.Statement;
import com.sap.runlet.abstractinterpreter.Interpreter;
import com.sap.runlet.interpreter.RunletInterpreter;
import com.sap.runlet.interpreter.RunletStackFrame;
import com.sap.runlet.interpreter.objects.NativeObject;
import com.sap.runlet.interpreter.objects.ValueObject;
import data.classes.Association;
import data.classes.AssociationEnd;
import data.classes.ClassTypeDefinition;
import data.classes.NativeImpl;
import data.classes.SapClass;
import data.classes.SignatureImplementation;
import data.classes.TypeDefinition;
import dataaccess.expressions.Equals;
import dataaccess.expressions.Expression;
/**
* Implements the notion of equality. Two objects of entity classes compare equal if they
* have equal identity. (Note that in this programming model it shall not be possible to hold
* two distinct copies of the same entity.)<p>
*
* For objects of value classes this comparison works recursively along all association ends
* whose navigation feature is exposed by the value class as a signature. The rationale behind this
* is that otherwise the notion of a value class's equality would be altered by adding an external
* association to it, which is not a desirable behavior.
*
* TODO Equals must be extensible for natively-implemented value classes
*
* @author Axel Uhl (D043530)
*/
public class EqualsInterpreter implements Interpreter<Equals, SapClass, TypeDefinition, ClassTypeDefinition, Association, AssociationEnd, Statement, Expression, SignatureImplementation, RunletStackFrame, NativeImpl, RunletInterpreter> {
private Equals equals;
public EqualsInterpreter(Equals equals) {
this.equals = equals;
}
@Override
public ValueObject evaluate(RunletInterpreter interpreter)
throws SecurityException, IllegalArgumentException,
NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {
Expression firstExp = equals.getLeft();
Expression secondExp = equals.getRight();
ValueObject result = new NativeObject((ClassTypeDefinition) equals.getType(),
interpreter.evaluate(firstExp).logicallyEquals(interpreter.evaluate(secondExp)), interpreter.getDefaultSnapshot(), interpreter);
return result;
}
}