blob: a596673e4aed3da5090a9eda4908ebd960bb2b93 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Peter Pasztor, Akos Horvath, Gergely Varro, Istvan Rath and Daniel Varro
* 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:
* Peter Pasztor, Akos Horvath, Gergely Varro, Istvan Rath - initial API and implementation
*******************************************************************************/
package org.eclipse.viatra2.gtasm.interpreter.term.rules;
import org.eclipse.viatra2.core.IEntity;
import org.eclipse.viatra2.core.IModelElement;
import org.eclipse.viatra2.core.IRelation;
import org.eclipse.viatra2.gtasm.interpreter.exception.ViatraTransformationException;
import org.eclipse.viatra2.gtasm.interpreter.executionEnvironment.IExecutionEnvironment;
import org.eclipse.viatra2.gtasm.interpreter.term.internal.TermInterpreterErrorString;
import org.eclipse.viatra2.gtasm.interpreter.term.internal.TermInterpreterException;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.enums.ValueKind;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.terms.ModelElementQuery;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.terms.Term;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Aggregate;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.ElementReference;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.FullyQualifiedName;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Inverse;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Multiplicity;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Name;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Source;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Target;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.Value;
/**All model query operations evaluation are handled by the class
* @author Peter Pasztor, Akos Horvath
*
*/
public class ModelElementQueryEvaluator extends TermEvaluator {
private static ModelElementQueryEvaluator _instance = new ModelElementQueryEvaluator();
private ModelElementQueryEvaluator() {
;
}
public static ModelElementQueryEvaluator getInstance() {
return _instance;
}
@Override
public Object evaluate(IExecutionEnvironment executionEnvironment,
Term termToBeEvaluated) throws ViatraTransformationException {
ModelElementQuery modelElementQuery = (ModelElementQuery) termToBeEvaluated;
//evaluate the argument of the operation
Object result = TermEvaluator.getInstance().evaluate(
executionEnvironment, (modelElementQuery).getArgument());
if (modelElementQuery instanceof Aggregate) {
if (!(result instanceof IRelation)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_RELATION_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
return ((IRelation) result).getIsAggregation();
} else if (modelElementQuery instanceof FullyQualifiedName) {
// result is a model element right now - if it's correct...
if (!(result instanceof IModelElement)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_MODELELEMENT_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
return ((IModelElement) result).getFullyQualifiedName();
} else if (modelElementQuery instanceof Name) {
if (!(result instanceof IModelElement)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_MODELELEMENT_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
return ((IModelElement) result).getName();
}
else if (modelElementQuery instanceof ElementReference) {
// result is definitely not null
if (!(result instanceof String)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_STRING_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
result = executionEnvironment.getFramework().getTopmodel()
.getModelManager().getElementByName((String) result);
return result != null ? result : ValueKind.UNDEF_LITERAL;
} else if (modelElementQuery instanceof Value) {
if (!(result instanceof IEntity)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_ENTITY_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
return ((IEntity) result).getValue();
} else if (modelElementQuery instanceof Multiplicity) {
if (!(result instanceof IRelation)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_RELATION_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
return ((IRelation) result).getMultiplicity();
} else if (modelElementQuery instanceof Inverse) {
if (!(result instanceof IRelation)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_RELATION_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
return ((IRelation) result).getInverse();
} else if (modelElementQuery instanceof Target) {
if (!(result instanceof IRelation)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_RELATION_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
result = ((IRelation) result).getTo();
return result != null ? result : ValueKind.UNDEF_LITERAL;
} else if (modelElementQuery instanceof Source) {
if (!(result instanceof IRelation)) {
if (ValueKind.UNDEF_LITERAL.equals(result))
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_EXIST_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
else
{
String[] context = {modelElementQuery.getName(), convertToJavaType(result)};
throw new TermInterpreterException(
TermInterpreterErrorString.REF_NOT_RELATION_MODELELEMENTQUERY
,context
,termToBeEvaluated);
}
}
result = ((IRelation) result).getFrom();
return result != null ? result : ValueKind.UNDEF_LITERAL;
}
else
{
String[] context = {modelElementQuery.getName()};
throw new TermInterpreterException(
TermInterpreterErrorString.UNIMP_MODELQUERY
,context
,termToBeEvaluated);
}
}
}