/**
 * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
 *  All rights reserved. This program and the accompanying materials 
 *  are made available under the terms of the Eclipse Public License 2.0  
 *  which accompanies this distribution, and is available at 
 *  https://www.eclipse.org/legal/epl-2.0/ 
 *  
 *  SPDX-License-Identifier: EPL-2.0 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.datainterchange;

import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Data Interchange Export Filter Condition</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getRefProperty <em>Ref Property</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator <em>Operator</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getValue <em>Value</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator2 <em>Operator2</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getSubcondition <em>Subcondition</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition()
 * @model
 * @generated
 */
public interface DataInterchangeExportFilterCondition extends DataInterchangeLazyResolver {
	/**
	 * Returns the value of the '<em><b>Ref Property</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Ref Property</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Ref Property</em>' reference.
	 * @see #setRefProperty(LEntityFeature)
	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_RefProperty()
	 * @model
	 * @generated
	 */
	LEntityFeature getRefProperty();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getRefProperty <em>Ref Property</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Ref Property</em>' reference.
	 * @see #getRefProperty()
	 * @generated
	 */
	void setRefProperty(LEntityFeature value);

	/**
	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.Operator}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Operator</em>' attribute.
	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
	 * @see #setOperator(Operator)
	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Operator()
	 * @model unique="false"
	 * @generated
	 */
	Operator getOperator();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator <em>Operator</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Operator</em>' attribute.
	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
	 * @see #getOperator()
	 * @generated
	 */
	void setOperator(Operator value);

	/**
	 * Returns the value of the '<em><b>Value</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Value</em>' attribute.
	 * @see #setValue(String)
	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Value()
	 * @model unique="false"
	 * @generated
	 */
	String getValue();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getValue <em>Value</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Value</em>' attribute.
	 * @see #getValue()
	 * @generated
	 */
	void setValue(String value);

	/**
	 * Returns the value of the '<em><b>Operator2</b></em>' attribute.
	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.Junction}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Operator2</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Operator2</em>' attribute.
	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
	 * @see #setOperator2(Junction)
	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Operator2()
	 * @model unique="false"
	 * @generated
	 */
	Junction getOperator2();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator2 <em>Operator2</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Operator2</em>' attribute.
	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
	 * @see #getOperator2()
	 * @generated
	 */
	void setOperator2(Junction value);

	/**
	 * Returns the value of the '<em><b>Subcondition</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Subcondition</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Subcondition</em>' containment reference.
	 * @see #setSubcondition(DataInterchangeExportFilterCondition)
	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Subcondition()
	 * @model containment="true"
	 * @generated
	 */
	DataInterchangeExportFilterCondition getSubcondition();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getSubcondition <em>Subcondition</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Subcondition</em>' containment reference.
	 * @see #getSubcondition()
	 * @generated
	 */
	void setSubcondition(DataInterchangeExportFilterCondition value);

} // DataInterchangeExportFilterCondition
