/**
* <copyright>
* </copyright>
*
* $Id$
*/
package tefkat.engine.runtime.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.InternalEList;
import tefkat.engine.runtime.NotTerm;
import tefkat.engine.runtime.RuntimeFactory;
import tefkat.engine.runtime.RuntimePackage;
import tefkat.engine.runtime.SourceTerm;
import tefkat.engine.runtime.TRule;
import tefkat.engine.runtime.TargetTerm;
import tefkat.engine.runtime.Term;
import tefkat.engine.runtime.Transformation;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>TRule</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link tefkat.engine.runtime.impl.TRuleImpl#getTransformation <em>Transformation</em>}</li>
* <li>{@link tefkat.engine.runtime.impl.TRuleImpl#getSrc <em>Src</em>}</li>
* <li>{@link tefkat.engine.runtime.impl.TRuleImpl#getTgt <em>Tgt</em>}</li>
* <li>{@link tefkat.engine.runtime.impl.TRuleImpl#getExtended <em>Extended</em>}</li>
* <li>{@link tefkat.engine.runtime.impl.TRuleImpl#getSuperseded <em>Superseded</em>}</li>
* <li>{@link tefkat.engine.runtime.impl.TRuleImpl#isAbstract <em>Abstract</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class TRuleImpl extends VarScopeImpl implements TRule {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static final String copyright = "Copyright michael lawley 2004";
/**
* The cached value of the '{@link #getSrc() <em>Src</em>}' containment reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSrc()
* @generated
* @ordered
*/
protected SourceTerm src = null;
/**
* The cached value of the '{@link #getTgt() <em>Tgt</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getTgt()
* @generated
* @ordered
*/
protected EList tgt = null;
/**
* The cached value of the '{@link #getExtended() <em>Extended</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getExtended()
* @generated
* @ordered
*/
protected EList extended = null;
/**
* The cached value of the '{@link #getSuperseded() <em>Superseded</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSuperseded()
* @generated
* @ordered
*/
protected EList superseded = null;
/**
* The default value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isAbstract()
* @generated
* @ordered
*/
protected static final boolean ABSTRACT_EDEFAULT = false;
/**
* The cached value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isAbstract()
* @generated
* @ordered
*/
protected boolean abstract_ = ABSTRACT_EDEFAULT;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected TRuleImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return RuntimePackage.Literals.TRULE;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Transformation getTransformation() {
if (eContainerFeatureID != RuntimePackage.TRULE__TRANSFORMATION) return null;
return (Transformation)eContainer();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetTransformation(Transformation newTransformation, NotificationChain msgs) {
msgs = eBasicSetContainer((InternalEObject)newTransformation, RuntimePackage.TRULE__TRANSFORMATION, msgs);
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setTransformation(Transformation newTransformation) {
if (newTransformation != eInternalContainer() || (eContainerFeatureID != RuntimePackage.TRULE__TRANSFORMATION && newTransformation != null)) {
if (EcoreUtil.isAncestor(this, newTransformation))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
NotificationChain msgs = null;
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
if (newTransformation != null)
msgs = ((InternalEObject)newTransformation).eInverseAdd(this, RuntimePackage.TRANSFORMATION__TRULE, Transformation.class, msgs);
msgs = basicSetTransformation(newTransformation, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, RuntimePackage.TRULE__TRANSFORMATION, newTransformation, newTransformation));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public SourceTerm getSrc() {
return src;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetSrc(SourceTerm newSrc, NotificationChain msgs) {
SourceTerm oldSrc = src;
src = newSrc;
if (eNotificationRequired()) {
ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RuntimePackage.TRULE__SRC, oldSrc, newSrc);
if (msgs == null) msgs = notification; else msgs.add(notification);
}
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setSrc(SourceTerm newSrc) {
if (newSrc != src) {
NotificationChain msgs = null;
if (src != null)
msgs = ((InternalEObject)src).eInverseRemove(this, RuntimePackage.SOURCE_TERM__TRULE_SRC, SourceTerm.class, msgs);
if (newSrc != null)
msgs = ((InternalEObject)newSrc).eInverseAdd(this, RuntimePackage.SOURCE_TERM__TRULE_SRC, SourceTerm.class, msgs);
msgs = basicSetSrc(newSrc, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, RuntimePackage.TRULE__SRC, newSrc, newSrc));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList getTgt() {
if (tgt == null) {
tgt = new EObjectContainmentWithInverseEList(TargetTerm.class, this, RuntimePackage.TRULE__TGT, RuntimePackage.TARGET_TERM__TRULE_TGT);
}
return tgt;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList getExtended() {
if (extended == null) {
extended = new EObjectResolvingEList(TRule.class, this, RuntimePackage.TRULE__EXTENDED);
}
return extended;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList getSuperseded() {
if (superseded == null) {
superseded = new EObjectResolvingEList(TRule.class, this, RuntimePackage.TRULE__SUPERSEDED);
}
return superseded;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isAbstract() {
return abstract_;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setAbstract(boolean newAbstract) {
boolean oldAbstract = abstract_;
abstract_ = newAbstract;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, RuntimePackage.TRULE__ABSTRACT, oldAbstract, abstract_));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
return basicSetTransformation((Transformation)otherEnd, msgs);
case RuntimePackage.TRULE__SRC:
if (src != null)
msgs = ((InternalEObject)src).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RuntimePackage.TRULE__SRC, null, msgs);
return basicSetSrc((SourceTerm)otherEnd, msgs);
case RuntimePackage.TRULE__TGT:
return ((InternalEList)getTgt()).basicAdd(otherEnd, msgs);
}
return super.eInverseAdd(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
return basicSetTransformation(null, msgs);
case RuntimePackage.TRULE__SRC:
return basicSetSrc(null, msgs);
case RuntimePackage.TRULE__TGT:
return ((InternalEList)getTgt()).basicRemove(otherEnd, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
switch (eContainerFeatureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
return eInternalContainer().eInverseRemove(this, RuntimePackage.TRANSFORMATION__TRULE, Transformation.class, msgs);
}
return super.eBasicRemoveFromContainerFeature(msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
return getTransformation();
case RuntimePackage.TRULE__SRC:
return getSrc();
case RuntimePackage.TRULE__TGT:
return getTgt();
case RuntimePackage.TRULE__EXTENDED:
return getExtended();
case RuntimePackage.TRULE__SUPERSEDED:
return getSuperseded();
case RuntimePackage.TRULE__ABSTRACT:
return isAbstract() ? Boolean.TRUE : Boolean.FALSE;
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
setTransformation((Transformation)newValue);
return;
case RuntimePackage.TRULE__SRC:
setSrc((SourceTerm)newValue);
return;
case RuntimePackage.TRULE__TGT:
getTgt().clear();
getTgt().addAll((Collection)newValue);
return;
case RuntimePackage.TRULE__EXTENDED:
getExtended().clear();
getExtended().addAll((Collection)newValue);
return;
case RuntimePackage.TRULE__SUPERSEDED:
getSuperseded().clear();
getSuperseded().addAll((Collection)newValue);
return;
case RuntimePackage.TRULE__ABSTRACT:
setAbstract(((Boolean)newValue).booleanValue());
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eUnset(int featureID) {
switch (featureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
setTransformation((Transformation)null);
return;
case RuntimePackage.TRULE__SRC:
setSrc((SourceTerm)null);
return;
case RuntimePackage.TRULE__TGT:
getTgt().clear();
return;
case RuntimePackage.TRULE__EXTENDED:
getExtended().clear();
return;
case RuntimePackage.TRULE__SUPERSEDED:
getSuperseded().clear();
return;
case RuntimePackage.TRULE__ABSTRACT:
setAbstract(ABSTRACT_EDEFAULT);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean eIsSet(int featureID) {
switch (featureID) {
case RuntimePackage.TRULE__TRANSFORMATION:
return getTransformation() != null;
case RuntimePackage.TRULE__SRC:
return src != null;
case RuntimePackage.TRULE__TGT:
return tgt != null && !tgt.isEmpty();
case RuntimePackage.TRULE__EXTENDED:
return extended != null && !extended.isEmpty();
case RuntimePackage.TRULE__SUPERSEDED:
return superseded != null && !superseded.isEmpty();
case RuntimePackage.TRULE__ABSTRACT:
return abstract_ != ABSTRACT_EDEFAULT;
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public String toString() {
return "RULE " + getName();
}
public Collection getGoal() {
Collection goal = new ArrayList();
goal.addAll(getSourceTerms());
goal.addAll(getOverrideTerms());
goal.addAll(getTargetTerms());
return goal;
}
/**
* Returns all the source Terms in the transitive closure of the extends and
* supersedes relationship of the TRule.
*
* @return
*/
private Collection getSourceTerms() {
Map sourceTermsMap = ((TransformationImpl) getTransformation()).getSourceTermsMap();
List sourceTerms = (List) sourceTermsMap.get(this);
if (null == sourceTerms) {
sourceTerms = new ArrayList();
sourceTermsMap.put(this, sourceTerms);
Term srcTerm = getSrc();
if (null != srcTerm) {
sourceTerms.add(srcTerm);
}
for (Iterator itr = getExtended().iterator(); itr.hasNext();) {
TRuleImpl extRule = (TRuleImpl) itr.next();
sourceTerms.addAll(extRule.getSourceTerms());
}
for (Iterator itr = getSuperseded().iterator(); itr.hasNext();) {
TRuleImpl supRule = (TRuleImpl) itr.next();
sourceTerms.addAll(supRule.getSourceTerms());
}
}
return sourceTerms;
}
/**
* Returns all the overriding Terms in the transitive closure of the
* extends and supersedes relationship of the TRule.
*
* @return
*/
private Collection getOverrideTerms() {
Map overrideTermsMap = ((TransformationImpl) getTransformation()).getOverrideTermsMap();
List overrideTerms = (List) overrideTermsMap.get(this);
if (null == overrideTerms) {
overrideTerms = new ArrayList();
overrideTermsMap.put(this, overrideTerms);
Collection supersedingRules = getTransformation().getSupersedingRules(this);
for (Iterator itr = supersedingRules.iterator(); itr.hasNext();) {
TRuleImpl supersedingRule = (TRuleImpl) itr.next();
NotTerm override = RuntimeFactory.eINSTANCE.createNotTerm();
override.getTerm().addAll(supersedingRule.getSourceTerms());
overrideTerms.add(override);
}
for (Iterator itr = getExtended().iterator(); itr.hasNext();) {
TRuleImpl extRule = (TRuleImpl) itr.next();
overrideTerms.addAll(extRule.getOverrideTerms());
}
}
return overrideTerms;
}
/**
* Returns all the target Terms in the transitive closure of the extends
* relationship of the TRule.
*
* @return
*/
private Collection getTargetTerms() {
Map targetTermsMap = ((TransformationImpl) getTransformation()).getTargetTermsMap();
List targetTerms = (List) targetTermsMap.get(this);
if (null == targetTerms) {
targetTerms = new ArrayList();
targetTermsMap.put(this, targetTerms);
targetTerms.addAll(getTgt());
for (Iterator itr = getExtended().iterator(); itr.hasNext();) {
TRuleImpl extRule = (TRuleImpl) itr.next();
targetTerms.addAll(extRule.getTargetTerms());
}
}
return targetTerms;
}
} //TRuleImpl