/* * Copyright (c) 2003- michael lawley and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation * which accompanies this distribution, and is available by writing to * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Contributors: * michael lawley * * */ package tefkat.model.impl; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EStructuralFeature; 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.model.NotTerm; import tefkat.model.SourceTerm; import tefkat.model.TRule; import tefkat.model.TargetTerm; import tefkat.model.TefkatFactory; import tefkat.model.TefkatPackage; import tefkat.model.Term; import tefkat.model.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.model.impl.TRuleImpl#getTransformation <em>Transformation</em>}</li> * <li>{@link tefkat.model.impl.TRuleImpl#getSrc <em>Src</em>}</li> * <li>{@link tefkat.model.impl.TRuleImpl#getTgt <em>Tgt</em>}</li> * <li>{@link tefkat.model.impl.TRuleImpl#getExtended <em>Extended</em>}</li> * <li>{@link tefkat.model.impl.TRuleImpl#getSuperseded <em>Superseded</em>}</li> * <li>{@link tefkat.model.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 Pty Ltd 2003-2007"; /** * 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; /** * Cached collection of all the source Terms in the transitive closure * of the extends and supersedes relationship of the TRule. */ private Collection sourceTerms = null; /** * Cached collection of all the override Terms in the transitive closure * of the extends and supersedes relationship of the TRule. */ private Collection overrideTerms = null; /** * Cached collection of all the target Terms in the transitive closure * of the extends relationship of the TRule. */ private Collection targetTerms = null; /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ protected TRuleImpl() { super(); eAdapters().add(new AdapterImpl() { public void notifyChanged(Notification msg) { switch (msg.getFeatureID(TRule.class)) { case TefkatPackage.TRULE__SUPERSEDED: sourceTerms = null; overrideTerms = null; Transformation t = getTransformation(); switch(msg.getEventType()) { case Notification.ADD: t.addSupersedes(TRuleImpl.this, (TRule) msg.getNewValue()); break; case Notification.ADD_MANY: for (Iterator itr = ((Collection) msg.getNewValue()).iterator(); itr.hasNext(); ) { TRule superseded = (TRule) itr.next(); t.addSupersedes(TRuleImpl.this, superseded); } break; case Notification.REMOVE: t.removeSupersedes(TRuleImpl.this, (TRule) msg.getNewValue()); break; case Notification.REMOVE_MANY: for (Iterator itr = ((Collection) msg.getNewValue()).iterator(); itr.hasNext(); ) { TRule superseded = (TRule) itr.next(); t.removeSupersedes(TRuleImpl.this, superseded); } break; } break; case TefkatPackage.TRULE__EXTENDED: sourceTerms = null; overrideTerms = null; targetTerms = null; break; } } }); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected EClass eStaticClass() { return TefkatPackage.Literals.TRULE; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Transformation getTransformation() { if (eContainerFeatureID != TefkatPackage.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, TefkatPackage.TRULE__TRANSFORMATION, msgs); return msgs; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setTransformation(Transformation newTransformation) { if (newTransformation != eInternalContainer() || (eContainerFeatureID != TefkatPackage.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, TefkatPackage.TRANSFORMATION__TRULE, Transformation.class, msgs); msgs = basicSetTransformation(newTransformation, msgs); if (msgs != null) msgs.dispatch(); } else if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, TefkatPackage.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, TefkatPackage.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, TefkatPackage.SOURCE_TERM__TRULE_SRC, SourceTerm.class, msgs); if (newSrc != null) msgs = ((InternalEObject)newSrc).eInverseAdd(this, TefkatPackage.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, TefkatPackage.TRULE__SRC, newSrc, newSrc)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EList getTgt() { if (tgt == null) { tgt = new EObjectContainmentWithInverseEList(TargetTerm.class, this, TefkatPackage.TRULE__TGT, TefkatPackage.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, TefkatPackage.TRULE__EXTENDED); } return extended; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EList getSuperseded() { if (superseded == null) { superseded = new EObjectResolvingEList(TRule.class, this, TefkatPackage.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, TefkatPackage.TRULE__ABSTRACT, oldAbstract, abstract_)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ 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 */ public Collection getSourceTerms() { if (null == sourceTerms) { sourceTerms = new ArrayList(); Term srcTerm = getSrc(); if (null != srcTerm) { sourceTerms.add(srcTerm); } for (Iterator itr = getExtended().iterator(); itr.hasNext();) { TRule extRule = (TRule) itr.next(); sourceTerms.addAll(extRule.getSourceTerms()); } for (Iterator itr = getSuperseded().iterator(); itr.hasNext();) { TRule supRule = (TRule) 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 */ public Collection getOverrideTerms() { if (null == overrideTerms) { overrideTerms = new ArrayList(); Collection supersedingRules = getTransformation().getSupersedingRules(this); for (Iterator itr = supersedingRules.iterator(); itr.hasNext();) { TRule supersedingRule = (TRule) itr.next(); NotTerm override = TefkatFactory.eINSTANCE.createNotTerm(); override.getTerm().addAll(supersedingRule.getSourceTerms()); overrideTerms.add(override); } for (Iterator itr = getExtended().iterator(); itr.hasNext();) { TRule extRule = (TRule) itr.next(); overrideTerms.addAll(extRule.getOverrideTerms()); } } return overrideTerms; } /** * Returns all the target Terms in the transitive closure of the extends * relationship of the TRule. * * @param rule * @return */ public Collection getTargetTerms() { if (null == targetTerms) { targetTerms = new ArrayList(); targetTerms.addAll(getTgt()); for (Iterator itr = getExtended().iterator(); itr.hasNext();) { TRule extRule = (TRule) itr.next(); targetTerms.addAll(extRule.getTargetTerms()); } } return targetTerms; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case TefkatPackage.TRULE__TRANSFORMATION: if (eInternalContainer() != null) msgs = eBasicRemoveFromContainer(msgs); return basicSetTransformation((Transformation)otherEnd, msgs); case TefkatPackage.TRULE__SRC: if (src != null) msgs = ((InternalEObject)src).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - TefkatPackage.TRULE__SRC, null, msgs); return basicSetSrc((SourceTerm)otherEnd, msgs); case TefkatPackage.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 TefkatPackage.TRULE__TRANSFORMATION: return basicSetTransformation(null, msgs); case TefkatPackage.TRULE__SRC: return basicSetSrc(null, msgs); case TefkatPackage.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 TefkatPackage.TRULE__TRANSFORMATION: return eInternalContainer().eInverseRemove(this, TefkatPackage.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 TefkatPackage.TRULE__TRANSFORMATION: return getTransformation(); case TefkatPackage.TRULE__SRC: return getSrc(); case TefkatPackage.TRULE__TGT: return getTgt(); case TefkatPackage.TRULE__EXTENDED: return getExtended(); case TefkatPackage.TRULE__SUPERSEDED: return getSuperseded(); case TefkatPackage.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 TefkatPackage.TRULE__TRANSFORMATION: setTransformation((Transformation)newValue); return; case TefkatPackage.TRULE__SRC: setSrc((SourceTerm)newValue); return; case TefkatPackage.TRULE__TGT: getTgt().clear(); getTgt().addAll((Collection)newValue); return; case TefkatPackage.TRULE__EXTENDED: getExtended().clear(); getExtended().addAll((Collection)newValue); return; case TefkatPackage.TRULE__SUPERSEDED: getSuperseded().clear(); getSuperseded().addAll((Collection)newValue); return; case TefkatPackage.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 TefkatPackage.TRULE__TRANSFORMATION: setTransformation((Transformation)null); return; case TefkatPackage.TRULE__SRC: setSrc((SourceTerm)null); return; case TefkatPackage.TRULE__TGT: getTgt().clear(); return; case TefkatPackage.TRULE__EXTENDED: getExtended().clear(); return; case TefkatPackage.TRULE__SUPERSEDED: getSuperseded().clear(); return; case TefkatPackage.TRULE__ABSTRACT: setAbstract(ABSTRACT_EDEFAULT); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public boolean eIsSet(int featureID) { switch (featureID) { case TefkatPackage.TRULE__TRANSFORMATION: return getTransformation() != null; case TefkatPackage.TRULE__SRC: return src != null; case TefkatPackage.TRULE__TGT: return tgt != null && !tgt.isEmpty(); case TefkatPackage.TRULE__EXTENDED: return extended != null && !extended.isEmpty(); case TefkatPackage.TRULE__SUPERSEDED: return superseded != null && !superseded.isEmpty(); case TefkatPackage.TRULE__ABSTRACT: return abstract_ != ABSTRACT_EDEFAULT; } return super.eIsSet(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public String toString() { if (eIsProxy()) return super.toString(); return (abstract_ ? "ABSTRACT " : "") + "RULE " + name; } } //TRuleImpl