/* * Copyright (c) 2005, 2008 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: * Radek Dvorak (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.validate; import java.text.MessageFormat; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.ETypedElement; import org.eclipse.gmf.internal.validate.expressions.AbstractExpression; import org.eclipse.gmf.internal.validate.expressions.IEvaluationEnvironment; import org.eclipse.gmf.internal.validate.expressions.IModelExpression; /** * An expression with severity and description */ public class ConstraintAdapter extends AbstractExpression { private IModelExpression expression; private EClassifier resultType; private int severity; private String description; public ConstraintAdapter(IModelExpression expression, int severity, String description) { super(expression.getBody(), expression.getContext(), null); this.expression = expression; this.severity = severity; this.description = description; if(getStatus().isOK()) { this.resultType = expression.getResultType(); if(this.resultType != null && !expression.isLooselyTyped()) { if(!resultType.isInstance(Boolean.TRUE)) { String msg = MessageFormat.format( Messages.invalidConstraintExprType, new Object[] { resultType.getName(), getBody() }); setStatus(new Status(IStatus.ERROR, GMFValidationPlugin.getPluginId(), StatusCodes.INVALID_EXPRESSION_TYPE, msg, null)); } } } } public int getSeverity() { return severity; } public String getDescription() { return description; } public IStatus getStatus() { if(expression.getStatus().isOK()) { return super.getStatus(); } return expression.getStatus(); } public String getLanguage() { return expression.getLanguage(); } public boolean isLooselyTyped() { return expression.isLooselyTyped(); } public boolean isAssignableToElement(ETypedElement typedElement) { return expression.isAssignableToElement(typedElement); } public boolean isAssignableTo(EClassifier ecoreType) { return expression.isAssignableTo(ecoreType); } public EClassifier getResultType() { return resultType; } protected Object doEvaluate(Object context) { return expression.evaluate(context); } protected Object doEvaluate(Object context, IEvaluationEnvironment extEnvironment) { return expression.evaluate(context, extEnvironment); } public boolean isSatisfied(EObject context) { Object value = evaluate(context); return (value instanceof Boolean) ? ((Boolean)value).booleanValue() : false; } }