package com.sap.runlet.interpreter.statements;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import behavioral.actions.LinkManipulationStatement;
import com.sap.runlet.abstractinterpreter.Side;
import com.sap.runlet.abstractinterpreter.objects.RunletObject;
import com.sap.runlet.interpreter.RunletInterpreter;
import data.classes.AssociationEnd;
import data.classes.ClassTypeDefinition;
import data.classes.TypeDefinition;
import dataaccess.expressions.Expression;
public abstract class LinkManipulationInterpreter {
private LinkManipulationStatement linkManipulationStatement;
public LinkManipulationInterpreter(LinkManipulationStatement linkManipulationStatement) {
this.linkManipulationStatement = linkManipulationStatement;
}
/**
* Returns the results for evaluating the expressions for the sides of the association,
* {@link RunletInterpreter#convert(RunletObject, data.classes.TypeDefinition) converted} to match
* the ends' types. Use {@link Side#endNumber} values as index into the array returned.
*/
@SuppressWarnings("unchecked")
protected RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition>[] evaluteEndExpressions(RunletInterpreter interpreter)
throws SecurityException, IllegalArgumentException, NoSuchMethodException,
InstantiationException, IllegalAccessException, InvocationTargetException {
RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition>[] result = (RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition>[]) new RunletObject<?, ?, ?>[Side.values().length];
List<Expression> expressions = linkManipulationStatement.getObjects();
for (Side side:Side.values()) {
Expression e = expressions.get(side.endNumber());
RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> eValue = interpreter.convert(interpreter.evaluate(e),
linkManipulationStatement.getAssociation().getEnds().get(side.endNumber()).getType());
result[side.endNumber()] = eValue;
}
return result;
}
protected LinkManipulationStatement getLinkManipulationStatement() {
return linkManipulationStatement;
}
}