Expression.java

package org.andromda.core.translation;

import org.andromda.core.common.ExceptionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;

/**
 * Stores the translated expression,
 *
 * @author Chad Brandon
 */
public class Expression
{
    /**
     * The resulting translated expression.
     */
    private StringBuffer translatedExpression;

    /**
     * Creates a new instance of this Expression object
     *
     * @param originalExpression the expression that will be translated.
     */
    public Expression(final String originalExpression)
    {
        ExceptionUtils.checkEmpty("originalExpression", originalExpression);
        this.originalExpression = StringUtils.trimToEmpty(originalExpression);
        this.translatedExpression = new StringBuffer();
    }

    /**
     * Appends the value of the value of the <code>object</code>'s toString result to the current translated expression
     * String Buffer.
     *
     * @param object the object to append.
     */
    public void appendToTranslatedExpression(final Object object)
    {
        this.translatedExpression.append(object);
    }

    /**
     * Appends a space character to the current translated expression String Buffer.
     */
    public void appendSpaceToTranslatedExpression()
    {
        this.translatedExpression.append(' ');
    }

    /**
     * Replaces the regular expression <code>pattern</code> with the replacement within the translated expression
     * buffer.
     *
     * @param pattern     the regular expression pattern to replace
     * @param replacement the replacement string.
     */
    public void replaceInTranslatedExpression(
        final String pattern,
        final String replacement)
    {
        this.translatedExpression =
            new StringBuffer(this.getTranslatedExpression().replaceAll(pattern, replacement));
    }

    /**
     * Performs replacement of the value of the <code>object</code>'s toString result at the start and end positions of
     * the buffer containing the Expression.
     *
     * @param position the position at which to insert
     * @param object   the
     * @see StringBuffer#insert(int,String)
     */
    public void insertInTranslatedExpression(
        final int position,
        final Object object)
    {
        this.translatedExpression.insert(position, object);
    }

    /**
     * Returns the expression after translation.
     *
     * @return String
     */
    public String getTranslatedExpression()
    {
        return TranslationUtils.removeExtraWhitespace(this.translatedExpression.toString());
    }

    /**
     * The original expression before translation
     */
    private String originalExpression;

    /**
     * Returns the expression before translation.
     *
     * @return String
     */
    public String getOriginalExpression()
    {
        return TranslationUtils.removeExtraWhitespace(this.originalExpression);
    }

    /**
     * The element to which the expression applies.
     */
    private String contextElement;

    /**
     * Returns the element which is the context of this expression.
     *
     * @return String the context element element.
     */
    public String getContextElement()
    {
        final String methodName = "Expression.getContextElement";
        if (this.contextElement == null)
        {
            throw new ExpressionException(methodName + " - contextElement can not be null");
        }
        return this.contextElement;
    }

    /**
     * The kind of the expression that was translated.
     */
    private String kind;

    /**
     * Returns the Kind of this Expression (inv, post, or pre)
     *
     * @return String returns the Kind of this translation
     */
    public String getKind()
    {
        final String methodName = "Expression.getKind";
        if (this.contextElement == null)
        {
            throw new ExpressionException(methodName + " - kind can not be null");
        }
        return this.kind;
    }

    /**
     * The name of the expression.
     */
    private String name;

    /**
     * Gets the name of the expression.
     *
     * @return String
     */
    public String getName()
    {
        return name;
    }

    /**
     * Sets the name.
     *
     * @param name the name to set.
     */
    public void setName(final String name)
    {
        this.name = name;
    }

    /**
     * Sets the context element (the element to which the expression applies --> the element declared after the
     * <code>context</code>)
     *
     * @param contextElement the name of the element which is the context element.
     */
    public void setContextElement(final String contextElement)
    {
        this.contextElement = contextElement;
    }

    /**
     * Sets the "kind" of the expression (i.e, "pre", "post", "inv", etc.)
     *
     * @param kind the kind to set.
     */
    public void setKind(final String kind)
    {
        this.kind = kind;
    }

    /**
     * @see Object#toString()
     */
    public String toString()
    {
        return ToStringBuilder.reflectionToString(this);
    }
}