/*******************************************************************************
* Copyright (c) 2007, 2009 IBM Corporation and others.
* 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:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.internal.evaluation;
import org.eclipse.ocl.EvaluationVisitor;
import org.eclipse.ocl.EvaluationVisitorDecorator;
import org.eclipse.ocl.expressions.AssociationClassCallExp;
import org.eclipse.ocl.expressions.BooleanLiteralExp;
import org.eclipse.ocl.expressions.CollectionItem;
import org.eclipse.ocl.expressions.CollectionLiteralExp;
import org.eclipse.ocl.expressions.CollectionRange;
import org.eclipse.ocl.expressions.EnumLiteralExp;
import org.eclipse.ocl.expressions.IfExp;
import org.eclipse.ocl.expressions.IntegerLiteralExp;
import org.eclipse.ocl.expressions.InvalidLiteralExp;
import org.eclipse.ocl.expressions.IterateExp;
import org.eclipse.ocl.expressions.IteratorExp;
import org.eclipse.ocl.expressions.LetExp;
import org.eclipse.ocl.expressions.MessageExp;
import org.eclipse.ocl.expressions.NullLiteralExp;
import org.eclipse.ocl.expressions.OCLExpression;
import org.eclipse.ocl.expressions.OperationCallExp;
import org.eclipse.ocl.expressions.PropertyCallExp;
import org.eclipse.ocl.expressions.RealLiteralExp;
import org.eclipse.ocl.expressions.StateExp;
import org.eclipse.ocl.expressions.StringLiteralExp;
import org.eclipse.ocl.expressions.TupleLiteralExp;
import org.eclipse.ocl.expressions.TupleLiteralPart;
import org.eclipse.ocl.expressions.TypeExp;
import org.eclipse.ocl.expressions.UnlimitedNaturalLiteralExp;
import org.eclipse.ocl.expressions.UnspecifiedValueExp;
import org.eclipse.ocl.expressions.Variable;
import org.eclipse.ocl.expressions.VariableExp;
import org.eclipse.ocl.internal.OCLPlugin;
import org.eclipse.ocl.utilities.ExpressionInOCL;
/**
* A decorator for evaluation visitors that is installed when evaluation tracing
* is enabled, to trace interim evaluation results to the console.
*
* @author Christian W. Damus (cdamus)
*/
public class TracingEvaluationVisitor<PK, C, O, P, EL, PM, S, COA, SSA, CT, CLS, E>
extends EvaluationVisitorDecorator<PK, C, O, P, EL, PM, S, COA, SSA, CT, CLS, E> {
/**
* Initializes me with the visitor whose evaluation I trace to the console.
*
* @param decorated a real evaluation visitor
*/
public TracingEvaluationVisitor(
EvaluationVisitor<PK, C, O, P, EL, PM, S, COA, SSA, CT, CLS, E> decorated) {
super(decorated);
}
private boolean isInvalid(Object value) {
return value == getEnvironment().getOCLStandardLibrary().getInvalid();
}
private Object trace(Object expression, Object value) {
try {
OCLPlugin.trace("Evaluate: " + expression); //$NON-NLS-1$
OCLPlugin.trace("Result : " + //$NON-NLS-1$
(isInvalid(value)? "OclInvalid" : String.valueOf(value))); //$NON-NLS-1$
} catch (Exception e) {
// tracing must not interfere with evaluation
}
return value;
}
@Override
public Object visitAssociationClassCallExp(
AssociationClassCallExp<C, P> callExp) {
return trace(callExp, getDelegate().visitAssociationClassCallExp(callExp));
}
@Override
public Object visitBooleanLiteralExp(BooleanLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitBooleanLiteralExp(literalExp));
}
@Override
public Object visitCollectionItem(CollectionItem<C> item) {
return trace(item, getDelegate().visitCollectionItem(item));
}
@Override
public Object visitCollectionLiteralExp(CollectionLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitCollectionLiteralExp(literalExp));
}
@Override
public Object visitCollectionRange(CollectionRange<C> range) {
return trace(range, getDelegate().visitCollectionRange(range));
}
@Override
public Object visitConstraint(CT constraint) {
return trace(constraint, getDelegate().visitConstraint(constraint));
}
@Override
public Object visitEnumLiteralExp(EnumLiteralExp<C, EL> literalExp) {
return trace(literalExp, getDelegate().visitEnumLiteralExp(literalExp));
}
@Override
public Object visitExpression(OCLExpression<C> expression) {
return trace(expression, getDelegate().visitExpression(expression));
}
@Override
public Object visitExpressionInOCL(ExpressionInOCL<C, PM> expression) {
return trace(expression, getDelegate().visitExpressionInOCL(expression));
}
@Override
public Object visitIfExp(IfExp<C> ifExp) {
return trace(ifExp, getDelegate().visitIfExp(ifExp));
}
@Override
public Object visitIntegerLiteralExp(IntegerLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitIntegerLiteralExp(literalExp));
}
@Override
public Object visitInvalidLiteralExp(InvalidLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitInvalidLiteralExp(literalExp));
}
@Override
public Object visitIterateExp(IterateExp<C, PM> callExp) {
return trace(callExp, getDelegate().visitIterateExp(callExp));
}
@Override
public Object visitIteratorExp(IteratorExp<C, PM> callExp) {
return trace(callExp, getDelegate().visitIteratorExp(callExp));
}
@Override
public Object visitLetExp(LetExp<C, PM> letExp) {
return trace(letExp, getDelegate().visitLetExp(letExp));
}
@Override
public Object visitMessageExp(MessageExp<C, COA, SSA> messageExp) {
return trace(messageExp, getDelegate().visitMessageExp(messageExp));
}
@Override
public Object visitNullLiteralExp(NullLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitNullLiteralExp(literalExp));
}
@Override
public Object visitOperationCallExp(OperationCallExp<C, O> callExp) {
return trace(callExp, getDelegate().visitOperationCallExp(callExp));
}
@Override
public Object visitPropertyCallExp(PropertyCallExp<C, P> callExp) {
return trace(callExp, getDelegate().visitPropertyCallExp(callExp));
}
@Override
public Object visitRealLiteralExp(RealLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitRealLiteralExp(literalExp));
}
@Override
public Object visitStateExp(StateExp<C, S> stateExp) {
return trace(stateExp, getDelegate().visitStateExp(stateExp));
}
@Override
public Object visitStringLiteralExp(StringLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitStringLiteralExp(literalExp));
}
@Override
public Object visitTupleLiteralExp(TupleLiteralExp<C, P> literalExp) {
return trace(literalExp, getDelegate().visitTupleLiteralExp(literalExp));
}
@Override
public Object visitTupleLiteralPart(TupleLiteralPart<C, P> part) {
return trace(part, getDelegate().visitTupleLiteralPart(part));
}
@Override
public Object visitTypeExp(TypeExp<C> typeExp) {
return trace(typeExp, getDelegate().visitTypeExp(typeExp));
}
@Override
public Object visitUnlimitedNaturalLiteralExp(
UnlimitedNaturalLiteralExp<C> literalExp) {
return trace(literalExp, getDelegate().visitUnlimitedNaturalLiteralExp(literalExp));
}
@Override
public Object visitUnspecifiedValueExp(UnspecifiedValueExp<C> unspecExp) {
return trace(unspecExp, getDelegate().visitUnspecifiedValueExp(unspecExp));
}
@Override
public Object visitVariable(Variable<C, PM> variable) {
return trace(variable, getDelegate().visitVariable(variable));
}
@Override
public Object visitVariableExp(VariableExp<C, PM> variableExp) {
return trace(variableExp, getDelegate().visitVariableExp(variableExp));
}
}