/*******************************************************************************
* Copyright (c) 2010 Michal Antkiewicz.
* 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:
* Michal Antkiewicz - initial API and implementation
******************************************************************************/
package ca.uwaterloo.gsd.fsml.sync;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EObject;
/**
* <!-- begin-user-doc -->
* A representation of the literals of the enumeration '<em><b>Synchronization State</b></em>',
* and utility methods for working with them.
* <!-- end-user-doc -->
* @see ca.uwaterloo.gsd.fsml.sync.SyncPackage#getSynchronizationState()
* @model
* @generated
*/
public enum SynchronizationState implements Enumerator
{
/**
* The '<em><b>Unspecified</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #UNSPECIFIED
* @generated
* @ordered
*/
UNSPECIFIED_LITERAL(-1, "unspecified", "unspecified"),
/**
* The '<em><b>Unchanged</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #UNCHANGED
* @generated
* @ordered
*/
UNCHANGED_LITERAL(0, "unchanged", "unchanged"),
/**
* The '<em><b>Added Model</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #ADDED_MODEL
* @generated
* @ordered
*/
ADDED_MODEL_LITERAL(1, "addedModel", "addedModel"),
/**
* The '<em><b>Changed Model</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #CHANGED_MODEL
* @generated
* @ordered
*/
CHANGED_MODEL_LITERAL(2, "changedModel", "changedModel"),
/**
* The '<em><b>Removed Model</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #REMOVED_MODEL
* @generated
* @ordered
*/
REMOVED_MODEL_LITERAL(3, "removedModel", "removedModel"),
/**
* The '<em><b>Added Code</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #ADDED_CODE
* @generated
* @ordered
*/
ADDED_CODE_LITERAL(4, "addedCode", "addedCode"),
/**
* The '<em><b>Changed Code</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #CHANGED_CODE
* @generated
* @ordered
*/
CHANGED_CODE_LITERAL(5, "changedCode", "changedCode"),
/**
* The '<em><b>Removed Code</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #REMOVED_CODE
* @generated
* @ordered
*/
REMOVED_CODE_LITERAL(6, "removedCode", "removedCode"),
/**
* The '<em><b>Changed</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #CHANGED
* @generated
* @ordered
*/
CHANGED_LITERAL(7, "changed", "changed"),
/**
* The '<em><b>Added Consistently</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #ADDED_CONSISTENTLY
* @generated
* @ordered
*/
ADDED_CONSISTENTLY_LITERAL(8, "addedConsistently", "addedConsistently"),
/**
* The '<em><b>Changed Consistently</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #CHANGED_CONSISTENTLY
* @generated
* @ordered
*/
CHANGED_CONSISTENTLY_LITERAL(9, "changedConsistently", "changedConsistently"),
/**
* The '<em><b>Removed Consistently</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #REMOVED_CONSISTENTLY
* @generated
* @ordered
*/
REMOVED_CONSISTENTLY_LITERAL(10, "removedConsistently", "removedConsistently"),
/**
* The '<em><b>Added Inconsistently</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #ADDED_INCONSISTENTLY
* @generated
* @ordered
*/
ADDED_INCONSISTENTLY_LITERAL(11, "addedInconsistently", "addedInconsistently"),
/**
* The '<em><b>Changed Inconsistently</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #CHANGED_INCONSISTENTLY
* @generated
* @ordered
*/
CHANGED_INCONSISTENTLY_LITERAL(12, "changedInconsistently", "changedInconsistently"),
/**
* The '<em><b>Removed Code Changed Model</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #REMOVED_CODE_CHANGED_MODEL
* @generated
* @ordered
*/
REMOVED_CODE_CHANGED_MODEL_LITERAL(13, "removedCodeChangedModel", "removedCodeChangedModel"),
/**
* The '<em><b>Removed Model Changed Code</b></em>' literal object.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #REMOVED_MODEL_CHANGED_CODE
* @generated
* @ordered
*/
REMOVED_MODEL_CHANGED_CODE_LITERAL(14, "removedModelChangedCode", "removedModelChangedCode");
/**
* The '<em><b>Unspecified</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Unspecified</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #UNSPECIFIED_LITERAL
* @model name="unspecified"
* @generated
* @ordered
*/
public static final int UNSPECIFIED = -1;
/**
* The '<em><b>Unchanged</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Unchanged</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #UNCHANGED_LITERAL
* @model name="unchanged"
* @generated
* @ordered
*/
public static final int UNCHANGED = 0;
/**
* The '<em><b>Added Model</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Added Model</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #ADDED_MODEL_LITERAL
* @model name="addedModel"
* @generated
* @ordered
*/
public static final int ADDED_MODEL = 1;
/**
* The '<em><b>Changed Model</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Changed Model</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #CHANGED_MODEL_LITERAL
* @model name="changedModel"
* @generated
* @ordered
*/
public static final int CHANGED_MODEL = 2;
/**
* The '<em><b>Removed Model</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Removed Model</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #REMOVED_MODEL_LITERAL
* @model name="removedModel"
* @generated
* @ordered
*/
public static final int REMOVED_MODEL = 3;
/**
* The '<em><b>Added Code</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Added Code</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #ADDED_CODE_LITERAL
* @model name="addedCode"
* @generated
* @ordered
*/
public static final int ADDED_CODE = 4;
/**
* The '<em><b>Changed Code</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Changed Code</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #CHANGED_CODE_LITERAL
* @model name="changedCode"
* @generated
* @ordered
*/
public static final int CHANGED_CODE = 5;
/**
* The '<em><b>Removed Code</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Removed Code</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #REMOVED_CODE_LITERAL
* @model name="removedCode"
* @generated
* @ordered
*/
public static final int REMOVED_CODE = 6;
/**
* The '<em><b>Changed</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Changed</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #CHANGED_LITERAL
* @model name="changed"
* @generated
* @ordered
*/
public static final int CHANGED = 7;
/**
* The '<em><b>Added Consistently</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Added Consistently</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #ADDED_CONSISTENTLY_LITERAL
* @model name="addedConsistently"
* @generated
* @ordered
*/
public static final int ADDED_CONSISTENTLY = 8;
/**
* The '<em><b>Changed Consistently</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Changed Consistently</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #CHANGED_CONSISTENTLY_LITERAL
* @model name="changedConsistently"
* @generated
* @ordered
*/
public static final int CHANGED_CONSISTENTLY = 9;
/**
* The '<em><b>Removed Consistently</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Removed Consistently</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #REMOVED_CONSISTENTLY_LITERAL
* @model name="removedConsistently"
* @generated
* @ordered
*/
public static final int REMOVED_CONSISTENTLY = 10;
/**
* The '<em><b>Added Inconsistently</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Added Inconsistently</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #ADDED_INCONSISTENTLY_LITERAL
* @model name="addedInconsistently"
* @generated
* @ordered
*/
public static final int ADDED_INCONSISTENTLY = 11;
/**
* The '<em><b>Changed Inconsistently</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Changed Inconsistently</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #CHANGED_INCONSISTENTLY_LITERAL
* @model name="changedInconsistently"
* @generated
* @ordered
*/
public static final int CHANGED_INCONSISTENTLY = 12;
/**
* The '<em><b>Removed Code Changed Model</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Removed Code Changed Model</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #REMOVED_CODE_CHANGED_MODEL_LITERAL
* @model name="removedCodeChangedModel"
* @generated
* @ordered
*/
public static final int REMOVED_CODE_CHANGED_MODEL = 13;
/**
* The '<em><b>Removed Model Changed Code</b></em>' literal value.
* <!-- begin-user-doc -->
* <p>
* If the meaning of '<em><b>Removed Model Changed Code</b></em>' literal object isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @see #REMOVED_MODEL_CHANGED_CODE_LITERAL
* @model name="removedModelChangedCode"
* @generated
* @ordered
*/
public static final int REMOVED_MODEL_CHANGED_CODE = 14;
/**
* An array of all the '<em><b>Synchronization State</b></em>' enumerators.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private static final SynchronizationState[] VALUES_ARRAY =
new SynchronizationState[] {
UNSPECIFIED_LITERAL,
UNCHANGED_LITERAL,
ADDED_MODEL_LITERAL,
CHANGED_MODEL_LITERAL,
REMOVED_MODEL_LITERAL,
ADDED_CODE_LITERAL,
CHANGED_CODE_LITERAL,
REMOVED_CODE_LITERAL,
CHANGED_LITERAL,
ADDED_CONSISTENTLY_LITERAL,
CHANGED_CONSISTENTLY_LITERAL,
REMOVED_CONSISTENTLY_LITERAL,
ADDED_INCONSISTENTLY_LITERAL,
CHANGED_INCONSISTENTLY_LITERAL,
REMOVED_CODE_CHANGED_MODEL_LITERAL,
REMOVED_MODEL_CHANGED_CODE_LITERAL,
};
/**
* A public read-only list of all the '<em><b>Synchronization State</b></em>' enumerators.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static final List<SynchronizationState> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
/**
* Returns the '<em><b>Synchronization State</b></em>' literal with the specified literal value.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static SynchronizationState get(String literal) {
for (int i = 0; i < VALUES_ARRAY.length; ++i) {
SynchronizationState result = VALUES_ARRAY[i];
if (result.toString().equals(literal)) {
return result;
}
}
return null;
}
/**
* Returns the '<em><b>Synchronization State</b></em>' literal with the specified name.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static SynchronizationState getByName(String name) {
for (int i = 0; i < VALUES_ARRAY.length; ++i) {
SynchronizationState result = VALUES_ARRAY[i];
if (result.getName().equals(name)) {
return result;
}
}
return null;
}
/**
* Returns the '<em><b>Synchronization State</b></em>' literal with the specified integer value.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static SynchronizationState get(int value) {
switch (value) {
case UNSPECIFIED: return UNSPECIFIED_LITERAL;
case UNCHANGED: return UNCHANGED_LITERAL;
case ADDED_MODEL: return ADDED_MODEL_LITERAL;
case CHANGED_MODEL: return CHANGED_MODEL_LITERAL;
case REMOVED_MODEL: return REMOVED_MODEL_LITERAL;
case ADDED_CODE: return ADDED_CODE_LITERAL;
case CHANGED_CODE: return CHANGED_CODE_LITERAL;
case REMOVED_CODE: return REMOVED_CODE_LITERAL;
case CHANGED: return CHANGED_LITERAL;
case ADDED_CONSISTENTLY: return ADDED_CONSISTENTLY_LITERAL;
case CHANGED_CONSISTENTLY: return CHANGED_CONSISTENTLY_LITERAL;
case REMOVED_CONSISTENTLY: return REMOVED_CONSISTENTLY_LITERAL;
case ADDED_INCONSISTENTLY: return ADDED_INCONSISTENTLY_LITERAL;
case CHANGED_INCONSISTENTLY: return CHANGED_INCONSISTENTLY_LITERAL;
case REMOVED_CODE_CHANGED_MODEL: return REMOVED_CODE_CHANGED_MODEL_LITERAL;
case REMOVED_MODEL_CHANGED_CODE: return REMOVED_MODEL_CHANGED_CODE_LITERAL;
}
return null;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private final int value;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private final String name;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private final String literal;
/**
* Only this class can construct instances.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private SynchronizationState(int value, String name, String literal) {
this.value = value;
this.name = name;
this.literal = literal;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public int getValue() {
return value;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getName() {
return name;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getLiteral() {
return literal;
}
/**
* Returns the literal value of the enumerator, which is its string representation.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String toString() {
return literal;
}
// helper functions
public boolean isForward() {
switch (getValue()) {
case ADDED_MODEL:
case CHANGED_MODEL:
case REMOVED_MODEL:
return true;
}
return false;
}
public boolean isReverse() {
switch (getValue()) {
case ADDED_CODE:
case CHANGED_CODE:
case REMOVED_CODE:
return true;
}
return false;
}
public boolean isChanged() {
return getValue() == CHANGED;
}
public boolean isAddition() {
switch (getValue()) {
case ADDED_CODE:
case ADDED_MODEL:
return true;
}
return false;
}
public boolean isRemoval() {
switch (getValue()) {
case REMOVED_CODE:
case REMOVED_MODEL:
return true;
}
return false;
}
public boolean isConflict() {
switch (getValue()) {
case CHANGED_INCONSISTENTLY:
case ADDED_INCONSISTENTLY:
case REMOVED_CODE_CHANGED_MODEL:
case REMOVED_MODEL_CHANGED_CODE:
return true;
}
return false;
}
public boolean isConsistent() {
switch (getValue()) {
case CHANGED_CONSISTENTLY:
case ADDED_CONSISTENTLY:
case UNCHANGED:
case REMOVED_CONSISTENTLY:
return true;
}
return false;
}
/**
* @param model - class instance from the asserted model
* @param code - class instance from the implementation model
* @param lrm - class instance from the last reconciled model
* @param hasConflict
* @param hasForward
* @param hasReverse
* @param hasChanged
* @return a synchronization state computed according to the class instance synchronization state decision table.
*/
public static SynchronizationState getClassInstanceSynchronizationState(EObject model, EObject code, EObject lrm, boolean hasConflict, boolean hasForward, boolean hasReverse, boolean hasChanged) {
boolean allConsistent = !hasConflict && !hasForward && !hasReverse && !hasChanged;
if (model != null) {
if (code != null) {
if (lrm != null) {
if (allConsistent)
return UNCHANGED_LITERAL; // #1
else if (hasForward && hasReverse && !hasConflict)
return CHANGED_LITERAL; // #2
else if (hasForward && !hasReverse && !hasConflict)
return CHANGED_MODEL_LITERAL; // #3
else if (!hasForward && hasReverse && !hasConflict)
return CHANGED_CODE_LITERAL; // #4
else if (hasConflict)
return CHANGED_INCONSISTENTLY_LITERAL; // #5
}
else { // lrm == null
if (allConsistent)
return ADDED_CONSISTENTLY_LITERAL; // #6
else
return ADDED_INCONSISTENTLY_LITERAL; // #7
}
}
else { // code == null
if (lrm != null)
return REMOVED_CODE_LITERAL; // #8
else // lrm == null
return ADDED_MODEL_LITERAL; // #9
}
}
else { // model == null
if (code != null) {
if (lrm != null)
return REMOVED_MODEL_LITERAL; // #10
else // lrm == null
return ADDED_CODE_LITERAL; // #11
}
else { // code == null
if (lrm != null)
return REMOVED_CONSISTENTLY_LITERAL; // #12
else // lrm == null
return UNCHANGED_LITERAL; // #13
}
}
// this should never happen, because all possible cases have been already investigated.
return UNSPECIFIED_LITERAL;
}
/**
* @param model - feature's value from the asserted model
* @param code - feature's value from the implementation model
* @param lrm - feature's value from the last reconciled model
* @return a synchronization state computed according to the attribute/non-containment reference synchronization state decision table.
*/
public static SynchronizationState getFeatureSynchronizationState(Object model, Object code, Object lrm) {
if (model != null && code != null) {
if (model.equals(code)) {
if (lrm != null) {
if (model.equals(lrm))
return UNCHANGED_LITERAL; // #1
else
return CHANGED_CONSISTENTLY_LITERAL; // #2
}
else
return ADDED_CONSISTENTLY_LITERAL; // #3
}
else { // model != code
if (lrm != null) {
if (!model.equals(code)) {
if (model.equals(lrm))
return CHANGED_CODE_LITERAL; // #4
else if (code.equals(lrm))
return CHANGED_MODEL_LITERAL; // #5
else // model != lrm && code != lrm
return CHANGED_INCONSISTENTLY_LITERAL; // #6
}
}
else
return ADDED_INCONSISTENTLY_LITERAL; // #7
}
}
else if (model != null && code == null) {
if (lrm != null) {
if (model.equals(lrm))
return REMOVED_CODE_LITERAL; // #8
else
return REMOVED_CODE_CHANGED_MODEL_LITERAL; // #9
}
else
return ADDED_MODEL_LITERAL; // #12
}
else if (model == null && code != null) {
if (lrm != null) {
if (code.equals(lrm))
return REMOVED_MODEL_LITERAL; // #10
else
return REMOVED_MODEL_CHANGED_CODE_LITERAL; // #11
}
else
return ADDED_CODE_LITERAL; // #13
}
else if (model == null && code == null) {
if (lrm != null)
return REMOVED_CONSISTENTLY_LITERAL; // #14
else
return UNCHANGED_LITERAL; // #15
}
// this should never happen, because all possible cases have been already investigated.
return UNSPECIFIED_LITERAL;
}
}