/**
 * Copyright (c) 2012, 2015 Obeo.
 * 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:
 *     Obeo - initial API and implementation
 */
package org.eclipse.emf.compare;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;

/**
 * <!-- begin-user-doc --> A representation of the model object '<em><b>Diff</b></em>'. <!-- end-user-doc -->
 *
 * <!-- begin-model-doc -->
 * A DiffElement describes a difference related to the EObjects mapped by its parent MatchElement.
 * <!-- end-model-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.emf.compare.Diff#getMatch <em>Match</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getRequires <em>Requires</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getRequiredBy <em>Required By</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getImplies <em>Implies</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getImpliedBy <em>Implied By</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getRefines <em>Refines</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getRefinedBy <em>Refined By</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getPrimeRefining <em>Prime Refining</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getKind <em>Kind</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getSource <em>Source</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getState <em>State</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getEquivalence <em>Equivalence</em>}</li>
 *   <li>{@link org.eclipse.emf.compare.Diff#getConflict <em>Conflict</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.emf.compare.ComparePackage#getDiff()
 * @model
 * @generated
 */
public interface Diff extends EObject {
	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	String copyright = "Copyright (c) 2012 Obeo.\r\nAll rights reserved. This program and the accompanying materials\r\nare made available under the terms of the Eclipse Public License v1.0\r\nwhich accompanies this distribution, and is available at\r\nhttp://www.eclipse.org/legal/epl-v10.html\r\n\r\nContributors:\r\n    Obeo - initial API and implementation"; //$NON-NLS-1$

	/**
	 * Returns the value of the '<em><b>Match</b></em>' container reference. It is bidirectional and its
	 * opposite is '{@link org.eclipse.emf.compare.Match#getDifferences <em>Differences</em>}'. <!--
	 * begin-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> Back-reference towards this
	 * difference's parent match, it points towards the mapping on which this difference has been detected.
	 * <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Match</em>' container reference.
	 * @see #setMatch(Match)
	 * @model derived="true"
	 * @generated
	 */
	Match getMatch();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.compare.Diff#getMatch <em>Match</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Match</em>' reference.
	 * @see #getMatch()
	 * @generated
	 */
	void setMatch(Match value);

	/**
	 * Returns the value of the '<em><b>Requires</b></em>' reference list. The list contents are of type
	 * {@link org.eclipse.emf.compare.Diff}. It is bidirectional and its opposite is '
	 * {@link org.eclipse.emf.compare.Diff#getRequiredBy <em>Required By</em>}'. <!-- begin-user-doc --> <!--
	 * end-user-doc --> <!-- begin-model-doc --> This will reference all differences that should be merged
	 * before this one. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Requires</em>' reference list.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Requires()
	 * @see org.eclipse.emf.compare.Diff#getRequiredBy
	 * @model opposite="requiredBy"
	 * @generated
	 */
	EList<Diff> getRequires();

	/**
	 * Returns the value of the '<em><b>Required By</b></em>' reference list. The list contents are of type
	 * {@link org.eclipse.emf.compare.Diff}. It is bidirectional and its opposite is '
	 * {@link org.eclipse.emf.compare.Diff#getRequires <em>Requires</em>}'. <!-- begin-user-doc --> <!--
	 * end-user-doc --> <!-- begin-model-doc --> This will reference all differences that depend on this one
	 * for their merging. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Required By</em>' reference list.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_RequiredBy()
	 * @see org.eclipse.emf.compare.Diff#getRequires
	 * @model opposite="requires"
	 * @generated
	 */
	EList<Diff> getRequiredBy();

	/**
	 * Returns the value of the '<em><b>Implies</b></em>' reference list.
	 * The list contents are of type {@link org.eclipse.emf.compare.Diff}.
	 * It is bidirectional and its opposite is '{@link org.eclipse.emf.compare.Diff#getImpliedBy <em>Implied By</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Implies</em>' reference list isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Implies</em>' reference list.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Implies()
	 * @see org.eclipse.emf.compare.Diff#getImpliedBy
	 * @model opposite="impliedBy"
	 * @generated
	 */
	EList<Diff> getImplies();

	/**
	 * Returns the value of the '<em><b>Implied By</b></em>' reference list.
	 * The list contents are of type {@link org.eclipse.emf.compare.Diff}.
	 * It is bidirectional and its opposite is '{@link org.eclipse.emf.compare.Diff#getImplies <em>Implies</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Implied By</em>' reference list isn't clear, there really should be more of
	 * a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Implied By</em>' reference list.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_ImpliedBy()
	 * @see org.eclipse.emf.compare.Diff#getImplies
	 * @model opposite="implies"
	 * @generated
	 */
	EList<Diff> getImpliedBy();

	/**
	 * Returns the value of the '<em><b>Refines</b></em>' reference list. The list contents are of type
	 * {@link org.eclipse.emf.compare.Diff}. It is bidirectional and its opposite is '
	 * {@link org.eclipse.emf.compare.Diff#getRefinedBy <em>Refined By</em>}'. <!-- begin-user-doc --> <!--
	 * end-user-doc --> <!-- begin-model-doc --> This can be used to create "high level" differences to
	 * regroup one or more diffs in a common "container". For example, this could be used to regroup <i>n</i>
	 * technical differences into one single semantic difference, such as the differences
	 * "profile application added" and "reference to stereotype added" that can actually be regrouped under a
	 * single, more understandable "stereotype application added". <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Refines</em>' reference list.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Refines()
	 * @see org.eclipse.emf.compare.Diff#getRefinedBy
	 * @model opposite="refinedBy"
	 * @generated
	 */
	EList<Diff> getRefines();

	/**
	 * Returns the value of the '<em><b>Refined By</b></em>' reference list. The list contents are of type
	 * {@link org.eclipse.emf.compare.Diff}. It is bidirectional and its opposite is '
	 * {@link org.eclipse.emf.compare.Diff#getRefines <em>Refines</em>}'. <!-- begin-user-doc --> <!--
	 * end-user-doc --> <!-- begin-model-doc --> This will reference the higher-level difference that shadows
	 * this one, if any. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Refined By</em>' reference list.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_RefinedBy()
	 * @see org.eclipse.emf.compare.Diff#getRefines
	 * @model opposite="refines"
	 * @generated
	 */
	EList<Diff> getRefinedBy();

	/**
	 * Returns the value of the '<em><b>Prime Refining</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Prime Refining</em>' reference isn't clear, there really should be more of a
	 * description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Prime Refining</em>' reference.
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_PrimeRefining()
	 * @model transient="true" changeable="false" derived="true"
	 * @generated
	 */
	Diff getPrimeRefining();

	/**
	 * Returns the value of the '<em><b>Kind</b></em>' attribute. The literals are from the enumeration
	 * {@link org.eclipse.emf.compare.DifferenceKind}. <!-- begin-user-doc --> <!-- end-user-doc --> <!--
	 * begin-model-doc --> Describes the kind of this difference, whether it is an addition, deletion, change,
	 * or move. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Kind</em>' attribute.
	 * @see org.eclipse.emf.compare.DifferenceKind
	 * @see #setKind(DifferenceKind)
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Kind()
	 * @model required="true"
	 * @generated
	 */
	DifferenceKind getKind();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.compare.Diff#getKind <em>Kind</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *            the new value of the '<em>Kind</em>' attribute.
	 * @see org.eclipse.emf.compare.DifferenceKind
	 * @see #getKind()
	 * @generated
	 */
	void setKind(DifferenceKind value);

	/**
	 * Returns the value of the '<em><b>Conflict</b></em>' reference. It is bidirectional and its opposite is
	 * '{@link org.eclipse.emf.compare.Conflict#getDifferences <em>Differences</em>}'. <!-- begin-user-doc -->
	 * <!-- end-user-doc --> <!-- begin-model-doc --> If this element is in conflict with one (or more) other
	 * differences, this will reference the Conflict association. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Conflict</em>' reference.
	 * @see #setConflict(Conflict)
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Conflict()
	 * @see org.eclipse.emf.compare.Conflict#getDifferences
	 * @model opposite="differences"
	 * @generated
	 */
	Conflict getConflict();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.compare.Diff#getConflict <em>Conflict</em>}' reference.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @param value the new value of the '<em>Conflict</em>' reference.
	 * @see #getConflict()
	 * @generated
	 */
	void setConflict(Conflict value);

	/**
	 * Returns the value of the '<em><b>Source</b></em>' attribute. The literals are from the enumeration
	 * {@link org.eclipse.emf.compare.DifferenceSource}. <!-- begin-user-doc --> <!-- end-user-doc --> <!--
	 * begin-model-doc --> Returns the source of this diff, either one of DifferenceSource.LEFT (for two-way
	 * comparisons or differences detected between the left and origin elements) or DifferenceSource.RIGHT
	 * (for differences between the right and origin elements). <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Source</em>' attribute.
	 * @see org.eclipse.emf.compare.DifferenceSource
	 * @see #setSource(DifferenceSource)
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Source()
	 * @model required="true"
	 * @generated
	 */
	DifferenceSource getSource();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.compare.Diff#getSource <em>Source</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *            the new value of the '<em>Source</em>' attribute.
	 * @see org.eclipse.emf.compare.DifferenceSource
	 * @see #getSource()
	 * @generated
	 */
	void setSource(DifferenceSource value);

	/**
	 * Returns the value of the '<em><b>State</b></em>' attribute. The literals are from the enumeration
	 * {@link org.eclipse.emf.compare.DifferenceState}. <!-- begin-user-doc --> <!-- end-user-doc --> <!--
	 * begin-model-doc --> Returns the current state of this diff, either one of DifferenceState.UNRESOLVED
	 * (Diff is still in its initial state), DifferenceState.MERGED when the Diff has been merged or
	 * DifferenceState.DISCARDED if the user chose to ignore this difference. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>State</em>' attribute.
	 * @see org.eclipse.emf.compare.DifferenceState
	 * @see #setState(DifferenceState)
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_State()
	 * @model required="true"
	 * @generated
	 */
	DifferenceState getState();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.compare.Diff#getState <em>State</em>}' attribute. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @param value
	 *            the new value of the '<em>State</em>' attribute.
	 * @see org.eclipse.emf.compare.DifferenceState
	 * @see #getState()
	 * @generated
	 */
	void setState(DifferenceState value);

	/**
	 * Returns the value of the '<em><b>Equivalence</b></em>' reference. It is bidirectional and its opposite
	 * is '{@link org.eclipse.emf.compare.Equivalence#getDifferences <em>Differences</em>}'. <!--
	 * begin-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> If this diff is equivalent to
	 * another, we will reference the equivalence from here. For example, if a reference has an eOpposite, we
	 * will detect one diff for each side of the bidirectional reference, yet merging one of these diffs is
	 * enough. We consider them equivalent. <!-- end-model-doc -->
	 * 
	 * @return the value of the '<em>Equivalence</em>' reference.
	 * @see #setEquivalence(Equivalence)
	 * @see org.eclipse.emf.compare.ComparePackage#getDiff_Equivalence()
	 * @see org.eclipse.emf.compare.Equivalence#getDifferences
	 * @model opposite="differences"
	 * @generated
	 */
	Equivalence getEquivalence();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.compare.Diff#getEquivalence <em>Equivalence</em>}' reference.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @param value the new value of the '<em>Equivalence</em>' reference.
	 * @see #getEquivalence()
	 * @generated
	 */
	void setEquivalence(Equivalence value);

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> This will merge the diff from
	 * left to right. <!-- end-model-doc -->
	 * 
	 * @model
	 * @generated
	 */
	@Deprecated
	void copyRightToLeft();

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> This will merge the diff from
	 * right to left. <!-- end-model-doc -->
	 * 
	 * @model
	 * @generated
	 */
	@Deprecated
	void copyLeftToRight();

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> This will remove the diff from
	 * the model, effectively "forgetting" about it. <!-- end-model-doc -->
	 * 
	 * @model
	 * @generated
	 */
	void discard();

} // Diff
