/***********************************************************************************************************************
 * Copyright (c) 2010 Attensity Europe GmbH. 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
 **********************************************************************************************************************/
package org.eclipse.smila.processing.designer.model.processor;

import org.eclipse.smila.processing.designer.model.record.ExtensionElement;

/**
 * <!-- begin-user-doc --> A representation of the model object '<em><b>Variables</b></em>'. <!-- end-user-doc -->
 * 
 * <p>
 * The following features are supported:
 * <ul>
 * <li>{@link org.eclipse.smila.processing.designer.model.processor.Variables#getInput <em>Input</em>}</li>
 * <li>{@link org.eclipse.smila.processing.designer.model.processor.Variables#getOutput <em>Output</em>}</li>
 * </ul>
 * </p>
 * 
 * @see org.eclipse.smila.processing.designer.model.processor.ProcessorPackage#getVariables()
 * @model
 * @generated
 */
public interface Variables extends ExtensionElement {
  /**
   * Returns the value of the '<em><b>Input</b></em>' attribute. <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Input</em>' attribute isn't clear, there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * 
   * @return the value of the '<em>Input</em>' attribute.
   * @see #setInput(String)
   * @see org.eclipse.smila.processing.designer.model.processor.ProcessorPackage#getVariables_Input()
   * @model required="true"
   * @generated
   */
  String getInput();

  /**
   * Sets the value of the '{@link org.eclipse.smila.processing.designer.model.processor.Variables#getInput
   * <em>Input</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
   * 
   * @param value
   *          the new value of the '<em>Input</em>' attribute.
   * @see #getInput()
   * @generated
   */
  void setInput(String value);

  /**
   * Returns the value of the '<em><b>Output</b></em>' attribute. <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Output</em>' attribute isn't clear, there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * 
   * @return the value of the '<em>Output</em>' attribute.
   * @see #setOutput(String)
   * @see org.eclipse.smila.processing.designer.model.processor.ProcessorPackage#getVariables_Output()
   * @model required="true"
   * @generated
   */
  String getOutput();

  /**
   * Sets the value of the '{@link org.eclipse.smila.processing.designer.model.processor.Variables#getOutput
   * <em>Output</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
   * 
   * @param value
   *          the new value of the '<em>Output</em>' attribute.
   * @see #getOutput()
   * @generated
   */
  void setOutput(String value);

} // Variables
