| /** |
| * <copyright> |
| * |
| * Copyright (c) 2004, 2008 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 |
| * |
| * </copyright> |
| * |
| * $Id: OCLHelper.java,v 1.5 2008/04/17 19:38:15 cdamus Exp $ |
| */ |
| |
| package org.eclipse.ocl.helper; |
| |
| import java.util.List; |
| |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.ocl.Environment; |
| import org.eclipse.ocl.OCL; |
| import org.eclipse.ocl.ParserException; |
| import org.eclipse.ocl.expressions.OCLExpression; |
| |
| |
| /** |
| * A utility object that provides OCL syntax completion suggestions for OCL |
| * expressions and convenient API for parsing OCL constraint expressions without |
| * the encumbrance of context declarations. The latter is most useful for |
| * processing OCL constraints and expressions embedded in the user model, where |
| * the context is implied by the placement of the constraint in the model. |
| * <p> |
| * An OCL helper is created by the {@link OCL#createOCLHelper()} factory method |
| * and inherits the current context {@link Environment} of the {@link OCL} that |
| * created it. |
| * </p><p> |
| * Since 1.2, the helper supplies {@linkplain #getProblems() diagnostics} |
| * indicating any problems encountered while parsing. The diagnostics pertain |
| * always to the most recently executed parse operation. |
| * </p> |
| * <p> |
| * <b>Note</b> that this interface is not intended to be implemented |
| * by clients. |
| * </p> |
| * <p> |
| * See the {@link Environment} class for a description of the |
| * generic type parameters of this class. |
| * </p> |
| * |
| * @see OCL#createOCLHelper() |
| * |
| * @author Yasser Lulu |
| * @author Christian W. Damus (cdamus) |
| */ |
| public interface OCLHelper<C, O, P, CT> { |
| |
| /** |
| * Sets the classifier context of the OCL expression for which syntax or |
| * parsing help is to be provided. |
| * |
| * @param context the OCL context classifier |
| * |
| * @see #setOperationContext(Object, Object) |
| * @see #setAttributeContext(Object, Object) |
| */ |
| void setContext(C context); |
| |
| /** |
| * Obtains my OCL context classifier as a classifier. |
| * |
| * @return my context classifier (never <code>null</code>) |
| */ |
| C getContextClassifier(); |
| |
| /** |
| * Sets the operation context of the OCL expression for which syntax or |
| * parsing help is to be provided. The operation is the model element |
| * against which the OCL will be parsed as an operation applicable to an |
| * OCL type. Note that the operation needs not necessarily be defined by |
| * the specified context classifier; it could be inherited. |
| * |
| * @param context the OCL context classifier |
| * @param operation the OCL context operation |
| * |
| * @see #setContext(Object) |
| */ |
| void setOperationContext(C context, O operation); |
| |
| /** |
| * Obtains my context operation, if my environment is an operation context. |
| * |
| * @return my context operation, or <code>null</code> if there is only a |
| * classifier or attribute context |
| */ |
| O getContextOperation(); |
| |
| /** |
| * Sets the attribute context of the OCL expression for which syntax or |
| * parsing help is to be provided. The attribute is the model element |
| * against which the OCL will be parsed as an attribute available in an OCL |
| * classifier. Note that the attribute needs not necessarily be defined by |
| * the specified context classifier; it could be inherited. |
| * |
| * @param context the OCL context classifier |
| * @param property the OCL context attribute |
| * |
| * @see #setContext(Object) |
| */ |
| void setAttributeContext(C context, P property); |
| |
| /** |
| * Obtains my context attribute, if my environment is an attribute context. |
| * |
| * @return my context attribute, or <code>null</code> if there is only a |
| * classifier or operation context |
| */ |
| P getContextAttribute(); |
| |
| /** |
| * Sets the classifier context implied by the specified instance. The |
| * appropriate classifier will be determined from the run-time type of this |
| * object, if possible. If not possible, <tt>OclAny</tt> is assumed. |
| * <p> |
| * This method is convenient for ad hoc parsing and evaluation of |
| * OCL constraints or expressions in the context of a model instance. |
| * </p> |
| * |
| * @param instance the OCL context instance |
| * |
| * @see #setContext(Object) |
| */ |
| void setInstanceContext(Object instance); |
| |
| /** |
| * Sets the operation context implied by the specified instance. The |
| * appropriate classifier will be determined from the run-time type of this |
| * object, if possible. If not possible, <tt>OclAny</tt> is assumed. |
| * <p> |
| * This method is convenient for ad hoc parsing and evaluation of |
| * OCL constraints or expressions in the context of a model instance. |
| * </p> |
| * |
| * @param instance the OCL context instance |
| * @param operation the OCL context operation |
| * |
| * @see #setOperationContext(Object, Object) |
| */ |
| void setInstanceOperationContext(Object instance, O operation); |
| |
| /** |
| * Sets the operation context implied by the specified instance. The |
| * appropriate classifier will be determined from the run-time type of this |
| * object, if possible. If not possible, <tt>OclAny</tt> is assumed. |
| * <p> |
| * This method is convenient for ad hoc parsing and evaluation of |
| * OCL constraints or expressions in the context of a model instance. |
| * </p> |
| * |
| * @param instance the OCL context instance |
| * @param property the OCL context attribute |
| * |
| * @see #setAttributeContext(Object, Object) |
| */ |
| void setInstanceAttributeContext(Object instance, P property); |
| |
| /** |
| * Obtains the OCL instance that created me. Note that many of the generic |
| * type parameter bindings will not be known, so clients should keep track |
| * of the OCL instance themselves where that is a problem. |
| * |
| * @return the OCL instance that created me |
| */ |
| OCL<?, C, O, P, ?, ?, ?, ?, ?, CT, ?, ?> getOCL(); |
| |
| /** |
| * Obtains the environment defining my current |
| * {@linkplain #getContextClassifier() classifier}, |
| * {@linkplain #getContextOperation() operation}, or |
| * {@linkplain #getContextAttribute() attribute} context. Accessing the |
| * environment is convenient for, e.g., adding variable definitions to |
| * insert global objects into the OCL context. |
| * |
| * @return my current context environment, or <code>null</code> if I have |
| * not yet been assigned a context |
| * |
| * @see #setContext(Object) |
| * @see #setOperationContext(Object, Object) |
| * @see #setAttributeContext(Object, Object) |
| * |
| * @since 1.2 |
| */ |
| Environment<?, C, O, P, ?, ?, ?, ?, ?, CT, ?, ?> getEnvironment(); |
| |
| /** |
| * Queries whether I validate the expressions that I parse. Validation |
| * applies more well-formedness checks than are implied by parsing, especially |
| * because parsing supports partial (incomplete) expressions for syntax |
| * completion. Validation adds some amount of processing, which is not |
| * necessary in all cases. |
| * |
| * @return whether I validate the expressions that I parse. Validation is |
| * on by default |
| */ |
| boolean isValidating(); |
| |
| /** |
| * Sets whether I should validate the expressions that I parse. |
| * |
| * @param validating whether I should validate parsed expressions |
| */ |
| void setValidating(boolean validating); |
| |
| /** |
| * Creates a query expression in the current classifier context. This may |
| * be specified, for example, as an expression value in the model. |
| * |
| * @param expression the expression (without any context declaration). |
| * This expression can have any result type; it needs not be a boolean |
| * |
| * @return the query expression |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| */ |
| OCLExpression<C> createQuery(String expression) throws ParserException; |
| |
| /** |
| * Creates a constraint of the specified kind, by parsing the given |
| * expression. In the case of additional attribute or operation definition |
| * constraints, the expression must be prefixed by the signature of the |
| * feature as follows: |
| * <blockquote><pre> |
| * <i>attribute-name</i> : <i>type</i> = <i>expr</i> |
| * </pre></blockquote> |
| * <blockquote><pre> |
| * <i>operation-name</i>(<i>parameters?</i>) : <i>type</i> = <i>expr</i> |
| * </pre></blockquote> |
| * |
| * @param kind the kind of constraint to create |
| * @param expression the constraint body |
| * @return the constraint |
| * |
| * @throws ParserException on failure to parse the constraint |
| */ |
| CT createConstraint(ConstraintKind kind, String expression) throws ParserException; |
| |
| /** |
| * Creates an invariant constraint in the current classifier context. |
| * |
| * @param expression the constraint expression (without any context |
| * declaration). This must be a boolean-valued expression |
| * |
| * @return the invariant constraint |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| */ |
| CT createInvariant(String expression) throws ParserException; |
| |
| /** |
| * Creates an operation precondition constraint. This is appropriate only |
| * if my context is an operation. |
| * |
| * @param expression the constraint expression (without any context |
| * declaration). This must be a boolean-valued expression |
| * |
| * @return the precondition |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| * |
| * @see #setOperationContext(Object, Object) |
| */ |
| CT createPrecondition(String expression) throws ParserException; |
| |
| /** |
| * Creates an operation postcondition constraint. This is appropriate only |
| * if my context is an operation. |
| * |
| * @param expression the constraint expression (without any context |
| * declaration). This must be a boolean-valued expression |
| * |
| * @return the postcondition |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| * |
| * @see #setOperationContext(Object, Object) |
| */ |
| CT createPostcondition(String expression) throws ParserException; |
| |
| /** |
| * Creates an operation body. This is appropriate only |
| * if my context is an operation. |
| * |
| * @param expression the constraint expression (without any context |
| * declaration). Ordinarily, this is an expression of the same type |
| * as the operation, specifying the value of the operation. |
| * Alternatively, this may be a boolean-valued expression phrased like |
| * a post-condition (according to the well-formedness rules of UML |
| * constraints) |
| * |
| * @return the body condition |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| * |
| * @see #setOperationContext(Object, Object) |
| */ |
| CT createBodyCondition(String expression) throws ParserException; |
| |
| /** |
| * Creates a property initial value expression. This is appropriate only |
| * if my context is a property. |
| * |
| * @param expression the initial value expression (without any context |
| * declaration). This must conform to my context property type |
| * |
| * @return the initial value expression |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| * or is not valid for my context property |
| * |
| * @see #setAttributeContext(Object, Object) |
| */ |
| CT createInitialValueExpression(String expression) throws ParserException; |
| |
| /** |
| * Creates a property derived value expression. This is appropriate only |
| * if my context is a property. |
| * |
| * @param expression the derived value expression (without any context |
| * declaration). This must conform to my context property type |
| * |
| * @return the derived value expression |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| * or is not valid for my context property |
| * |
| * @see #setAttributeContext(Object, Object) |
| */ |
| CT createDerivedValueExpression(String expression) throws ParserException; |
| |
| /** |
| * Defines an additional operation in the context classifier, |
| * for use in formulating OCL queries and constraints. This is a |
| * "def expression", taking the form of: |
| * <blockquote><pre> |
| * <i>operation-name</i>(<i>parameters?</i>) : <i>type</i> = <i>expr</i> |
| * </pre></blockquote> |
| * |
| * @param defExpression the definition expression (without any other context |
| * declaration). |
| * @return the newly defined operation |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| */ |
| O defineOperation(String defExpression) throws ParserException; |
| |
| /** |
| * Defines an additional attribute in the context classifier, |
| * for use in formulating OCL queries and constraints. This is a |
| * "def expression", taking the form of: |
| * <blockquote><pre> |
| * <i>attribute-name</i> : <i>type</i> = <i>expr</i> |
| * </pre></blockquote> |
| * |
| * @param defExpression the definition expression (without any other context |
| * declaration). |
| * @return the newly defined attribute |
| * |
| * @throws ParserException if the <code>expression</code> fails to parse |
| */ |
| P defineAttribute(String defExpression) throws ParserException; |
| |
| /** |
| * Obtains syntax completion choices for the specified fragment of an OCL |
| * expression given that it is intended for a constraint of the specified |
| * kind. The choices returned (if any) will be appropriate for |
| * appending to the end of the specified text in the context of this kind |
| * of constraint. |
| * |
| * @param constraintType the kind of constraint that is being composed, |
| * or <code>null</code> to indicate completions for a query expression |
| * @param txt a partial OCL expression for which to seek choices that |
| * could be appended to it |
| * @return a list of {@link Choice}s, possibly empty. The ordering of the |
| * list may or may not indicate relative relevance or frequency of |
| * a choice |
| */ |
| List<Choice> getSyntaxHelp(ConstraintKind constraintType, String txt); |
| |
| /** |
| * Obtains problems, if any, found in parsing the last OCL constraint or |
| * query expression. |
| * |
| * @return parsing problems or <code>null</code> if all was OK |
| * |
| * @since 1.2 |
| */ |
| Diagnostic getProblems(); |
| } |