KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > emf > ecore > change > impl > ChangeDescriptionImpl


1 /**
2  * <copyright>
3  *
4  * Copyright (c) 2003-2005 IBM Corporation and others.
5  * All rights reserved. This program and the accompanying materials
6  * are made available under the terms of the Eclipse Public License v1.0
7  * which accompanies this distribution, and is available at
8  * http://www.eclipse.org/legal/epl-v10.html
9  *
10  * Contributors:
11  * IBM - Initial API and implementation
12  *
13  * </copyright>
14  *
15  * $Id: ChangeDescriptionImpl.java,v 1.11 2005/06/14 14:51:05 emerks Exp $
16  */

17 package org.eclipse.emf.ecore.change.impl;
18
19
20 import java.util.ArrayList JavaDoc;
21 import java.util.Collection JavaDoc;
22 import java.util.HashMap JavaDoc;
23 import java.util.Iterator JavaDoc;
24 import java.util.List JavaDoc;
25 import java.util.Map JavaDoc;
26
27 import org.eclipse.emf.common.notify.NotificationChain;
28 import org.eclipse.emf.common.util.BasicEList;
29 import org.eclipse.emf.common.util.EList;
30 import org.eclipse.emf.common.util.EMap;
31 import org.eclipse.emf.common.util.UniqueEList;
32 import org.eclipse.emf.ecore.EClass;
33 import org.eclipse.emf.ecore.EObject;
34 import org.eclipse.emf.ecore.EReference;
35 import org.eclipse.emf.ecore.EStructuralFeature;
36 import org.eclipse.emf.ecore.InternalEObject;
37 import org.eclipse.emf.ecore.change.ChangeDescription;
38 import org.eclipse.emf.ecore.change.ChangePackage;
39 import org.eclipse.emf.ecore.change.FeatureChange;
40 import org.eclipse.emf.ecore.change.ListChange;
41 import org.eclipse.emf.ecore.change.ResourceChange;
42 import org.eclipse.emf.ecore.impl.EObjectImpl;
43 import org.eclipse.emf.ecore.resource.Resource;
44 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
45 import org.eclipse.emf.ecore.util.EObjectEList;
46 import org.eclipse.emf.ecore.util.EcoreEMap;
47 import org.eclipse.emf.ecore.util.FeatureMap;
48 import org.eclipse.emf.ecore.util.FeatureMapUtil;
49 import org.eclipse.emf.ecore.util.InternalEList;
50
51
52 /**
53  * <!-- begin-user-doc -->
54  * An implementation of the model object '<em><b>Description</b></em>'.
55  * <!-- end-user-doc -->
56  * <p>
57  * The following features are implemented:
58  * <ul>
59  * <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getObjectChanges <em>Object Changes</em>}</li>
60  * <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getObjectsToDetach <em>Objects To Detach</em>}</li>
61  * <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getObjectsToAttach <em>Objects To Attach</em>}</li>
62  * <li>{@link org.eclipse.emf.ecore.change.impl.ChangeDescriptionImpl#getResourceChanges <em>Resource Changes</em>}</li>
63  * </ul>
64  * </p>
65  *
66  * @generated
67  */

68 public class ChangeDescriptionImpl extends EObjectImpl implements ChangeDescription
69 {
70   /**
71    * The cached value of the '{@link #getObjectChanges() <em>Object Changes</em>}' map.
72    * <!-- begin-user-doc -->
73    * <!-- end-user-doc -->
74    * @see #getObjectChanges()
75    * @generated
76    * @ordered
77    */

78   protected EMap objectChanges = null;
79
80   /**
81    * The cached value of the '{@link #getObjectsToDetach() <em>Objects To Detach</em>}' reference list.
82    * <!-- begin-user-doc -->
83    * The Objects to Detach list is first calculated when the {@link #getObjectsToDetach()}
84    * method is invoked and reset when new changes are described.
85    * <!-- end-user-doc -->
86    * @see #getObjectsToDetach()
87    * @generated
88    * @ordered
89    */

90   protected EList objectsToDetach = null;
91   
92   /**
93    * The cached value of the '{@link #getObjectsToAttach() <em>Objects To Attach</em>}' containment reference list.
94    * <!-- begin-user-doc -->
95    * <!-- end-user-doc -->
96    * @see #getObjectsToAttach()
97    * @generated
98    * @ordered
99    */

100   protected EList objectsToAttach = null;
101
102   /**
103    * The cached value of the '{@link #getResourceChanges() <em>Resource Changes</em>}' containment reference list.
104    * <!-- begin-user-doc -->
105    * <!-- end-user-doc -->
106    * @see #getResourceChanges()
107    * @generated
108    * @ordered
109    */

110   protected EList resourceChanges = null;
111
112   /**
113    * <!-- begin-user-doc -->
114    * <!-- end-user-doc -->
115    * @generated
116    */

117   protected ChangeDescriptionImpl()
118   {
119     super();
120   }
121
122   /**
123    * <!-- begin-user-doc -->
124    * <!-- end-user-doc -->
125    * @generated
126    */

127   protected EClass eStaticClass()
128   {
129     return ChangePackage.eINSTANCE.getChangeDescription();
130   }
131
132   /**
133    * <!-- begin-user-doc -->
134    * <!-- end-user-doc -->
135    * @generated
136    */

137   public EMap getObjectChanges()
138   {
139     if (objectChanges == null)
140     {
141       objectChanges = new EcoreEMap(ChangePackage.eINSTANCE.getEObjectToChangesMapEntry(), EObjectToChangesMapEntryImpl.class, this, ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES);
142     }
143     return objectChanges;
144   }
145
146   /**
147    * <!-- begin-user-doc -->
148    * <!-- end-user-doc -->
149    * @generated
150    */

151   public EList getObjectsToDetachGen()
152   {
153     if (objectsToDetach == null)
154     {
155       objectsToDetach = new EObjectEList(EObject.class, this, ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH);
156     }
157     return objectsToDetach;
158   }
159
160   protected static List JavaDoc getContainedEObjects(List JavaDoc featureMapEntries)
161   {
162     List JavaDoc result = new ArrayList JavaDoc();
163     for (Iterator JavaDoc i = featureMapEntries.iterator(); i.hasNext(); )
164     {
165       FeatureMap.Entry entry = (FeatureMap.Entry)i.next();
166       EStructuralFeature feature = entry.getEStructuralFeature();
167       if (feature instanceof EReference && ((EReference)feature).isContainment())
168       {
169         result.add(entry.getValue());
170       }
171     }
172     return result;
173   }
174
175   public EList getObjectsToDetach()
176   {
177     List JavaDoc objectsBeforeChange = new UniqueEList.FastCompare();
178     List JavaDoc objectsAfterChange = new UniqueEList.FastCompare();
179
180     if (!getObjectChanges().isEmpty())
181     {
182       preApply(false);
183
184       for (Iterator JavaDoc i = getObjectChanges().iterator(); i.hasNext();)
185       {
186         EObjectToChangesMapEntryImpl entry = (EObjectToChangesMapEntryImpl)i.next();
187         EObject objectToChange = entry.getTypedKey();
188         for (Iterator JavaDoc j = entry.getTypedValue().iterator(); j.hasNext();)
189         {
190           FeatureChange featureChange = (FeatureChange)j.next();
191           EStructuralFeature feature = featureChange.getFeature();
192           if (FeatureMapUtil.isFeatureMap(feature))
193           {
194             objectsBeforeChange.addAll(getContainedEObjects((List JavaDoc)featureChange.getValue()));
195             objectsAfterChange.addAll(getContainedEObjects((List JavaDoc)objectToChange.eGet(feature)));
196           }
197           else if (feature instanceof EReference && ((EReference)feature).isContainment())
198           {
199             if (feature.isMany())
200             {
201               objectsBeforeChange.addAll((List JavaDoc)featureChange.getValue());
202               objectsAfterChange.addAll((List JavaDoc)objectToChange.eGet(feature));
203             }
204             else
205             {
206               Object JavaDoc value = featureChange.getValue();
207               if (value != null) objectsBeforeChange.add(value);
208               value = objectToChange.eGet(feature);
209               if (value != null) objectsAfterChange.add(value);
210             }
211           }
212         }
213       }
214     }
215     
216     if (!getResourceChanges().isEmpty())
217     {
218       for (Iterator JavaDoc i = getResourceChanges().iterator(); i.hasNext();)
219       {
220         ResourceChange resourceChange = (ResourceChange)i.next();
221         Resource resource = resourceChange.getResource();
222         if (resource == null)
223         {
224           resource = eResource();
225         }
226         
227         if (resource != null)
228         {
229           EList currentContentCopy = new BasicEList(resource.getContents());
230           for (Iterator JavaDoc j = resourceChange.getListChanges().iterator(); j.hasNext();)
231           {
232             ListChange listChange = (ListChange)j.next();
233             ((ListChangeImpl)listChange).apply(currentContentCopy);
234           }
235         
236           objectsBeforeChange.addAll(currentContentCopy);
237           objectsAfterChange.addAll(resource.getContents());
238         }
239       }
240     }
241     
242     // Isolating the new objects
243
objectsAfterChange.removeAll(objectsBeforeChange);
244     
245     // getObjectsToDetachGen() should be changed only if required
246
getObjectsToDetachGen().retainAll(objectsAfterChange);
247     getObjectsToDetachGen().addAll(objectsAfterChange);
248     
249     return getObjectsToDetachGen();
250   }
251
252   /**
253    * <!-- begin-user-doc -->
254    * <!-- end-user-doc -->
255    * @generated
256    */

257   public EList getObjectsToAttach()
258   {
259     if (objectsToAttach == null)
260     {
261       objectsToAttach = new EObjectContainmentEList(EObject.class, this, ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH);
262     }
263     return objectsToAttach;
264   }
265
266   /**
267    * <!-- begin-user-doc -->
268    * <!-- end-user-doc -->
269    * @generated
270    */

271   public EList getResourceChanges()
272   {
273     if (resourceChanges == null)
274     {
275       resourceChanges = new EObjectContainmentEList(ResourceChange.class, this, ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES);
276     }
277     return resourceChanges;
278   }
279
280   /**
281    * <!-- begin-user-doc -->
282    * <!-- end-user-doc -->
283    * @generated NOT
284    */

285   public void apply()
286   {
287     preApply(false);
288
289     // Apply the change.
290
//
291
for (Iterator JavaDoc iter = getObjectChanges().iterator(); iter.hasNext(); )
292     {
293       EObjectToChangesMapEntryImpl entry = (EObjectToChangesMapEntryImpl)iter.next();
294       EObject objectToChange = entry.getTypedKey();
295       for (Iterator JavaDoc fIter = entry.getTypedValue().iterator(); fIter.hasNext(); )
296       {
297         FeatureChange featureChange = (FeatureChange)fIter.next();
298         featureChange.apply(objectToChange);
299       }
300     }
301
302     for (Iterator JavaDoc iter = getResourceChanges().iterator(); iter.hasNext(); )
303     {
304       ResourceChange resourceChange = (ResourceChange)iter.next();
305       resourceChange.apply();
306     }
307
308     // Delete the change information because it is invalid now that the objects have been changed.
309
//
310
getObjectsToAttach().clear();
311     getObjectChanges().clear();
312     getResourceChanges().clear();
313     oldContainmentInformation = null;
314   }
315
316   /**
317    * <!-- begin-user-doc -->
318    * <!-- end-user-doc -->
319    * @generated NOT
320    */

321   public void applyAndReverse()
322   {
323     preApply(true);
324     
325     List JavaDoc objectsBeforeApply = new UniqueEList.FastCompare();
326     List JavaDoc objectsAfterApply = new UniqueEList.FastCompare();
327     
328     // Apply the change and reverse the change information.
329
//
330
for (Iterator JavaDoc iter = getObjectChanges().iterator(); iter.hasNext(); )
331     {
332       EObjectToChangesMapEntryImpl entry = (EObjectToChangesMapEntryImpl)iter.next();
333       EObject objectToChange = entry.getTypedKey();
334       for (Iterator JavaDoc fIter = entry.getTypedValue().iterator(); fIter.hasNext(); )
335       {
336         FeatureChange featureChange = (FeatureChange)fIter.next();
337         EStructuralFeature feature = featureChange.getFeature();
338
339         int featureKind =
340           FeatureMapUtil.isFeatureMap(feature) ?
341             3 :
342             feature instanceof EReference && ((EReference)feature).isContainment() ?
343               feature.isMany() ?
344                 1 :
345                 2 :
346             0;
347         switch (featureKind)
348         {
349           case 1:
350           {
351             objectsBeforeApply.addAll((List JavaDoc)objectToChange.eGet(feature));
352             break;
353           }
354           case 2:
355           {
356             Object JavaDoc value = objectToChange.eGet(feature);
357             if (value != null)
358             {
359               objectsBeforeApply.add(objectToChange.eGet(feature));
360             }
361             break;
362           }
363           case 3:
364           {
365             objectsBeforeApply.addAll(getContainedEObjects((List JavaDoc)objectToChange.eGet(feature)));
366             break;
367           }
368         }
369                
370         featureChange.applyAndReverse(objectToChange);
371         
372         switch (featureKind)
373         {
374           case 1:
375           {
376             objectsAfterApply.addAll((List JavaDoc)objectToChange.eGet(feature));
377             break;
378           }
379           case 2:
380           {
381             Object JavaDoc value = objectToChange.eGet(feature);
382             if (value != null)
383             {
384               objectsAfterApply.add(objectToChange.eGet(feature));
385             }
386             break;
387           }
388           case 3:
389           {
390             objectsAfterApply.addAll(getContainedEObjects((List JavaDoc)objectToChange.eGet(feature)));
391             break;
392           }
393         }
394       }
395     }
396
397     for (Iterator JavaDoc iter = getResourceChanges().iterator(); iter.hasNext(); )
398     {
399       ResourceChange resourceChange = (ResourceChange)iter.next();
400       Resource resource = resourceChange.getResource();
401       if (resource != null)
402       {
403         objectsBeforeApply.addAll(resource.getContents());
404       }
405       resourceChange.applyAndReverse();
406       if (resource != null)
407       {
408         objectsAfterApply.addAll(resource.getContents());
409       }
410     }
411     
412     // The next line leaves objectsBeforeApply with all the objects that were
413
// added during the last recording.
414
objectsBeforeApply.removeAll(objectsAfterApply);
415     
416     // Reverse the objects to attach and detach lists.
417
//
418
getObjectsToAttach().clear();
419     for (Iterator JavaDoc iter = objectsBeforeApply.iterator(); iter.hasNext(); )
420     {
421       EObject eObject = (EObject)iter.next();
422       if (eObject.eContainer() == null && eObject.eResource() == null)
423       {
424         getObjectsToAttach().add(eObject);
425       }
426     }
427     oldContainmentInformation = null;
428   }
429
430   protected void preApply(boolean reverse)
431   {
432     // Make sure the changed values of bi-directional reference lists are cached before we
433
// start to apply the change.
434
//
435
for (Iterator JavaDoc iter = getObjectChanges().iterator(); iter.hasNext(); )
436     {
437       EObjectToChangesMapEntryImpl entry = (EObjectToChangesMapEntryImpl)iter.next();
438       EObject objectToChange = entry.getTypedKey();
439       for (Iterator JavaDoc fIter = entry.getTypedValue().iterator(); fIter.hasNext(); )
440       {
441         FeatureChangeImpl featureChange = (FeatureChangeImpl)fIter.next();
442         featureChange.preApply(objectToChange, reverse);
443         if (reverse || featureChange.isSet())
444         {
445           EStructuralFeature feature = featureChange.getFeature();
446           if (FeatureMapUtil.isFeatureMap(feature) ||
447                 feature != null &&
448                   feature.isMany() &&
449                   feature instanceof EReference &&
450                   (((EReference)feature).getEOpposite() != null || ((EReference)feature).isContainment()))
451           {
452             if (reverse)
453             {
454               // This case will be handled special during apply
455
//
456
EList applyToList = new BasicEList((EList)objectToChange.eGet(feature));
457               for (Iterator JavaDoc k = featureChange.getListChanges().iterator(); k.hasNext(); )
458               {
459                 ListChange listChange = (ListChange)k.next();
460                 listChange.applyAndReverse(applyToList);
461               }
462               featureChange.setValue(applyToList); // cache the list value.
463
}
464             else
465             {
466               featureChange.getValue(); // cache the list value.
467
}
468           }
469         }
470       }
471     }
472   }
473
474   protected Map JavaDoc oldContainmentInformation;
475
476   protected static class OldContainmentInformation
477   {
478     public EObject container;
479     public EReference containmentFeature;
480
481     public OldContainmentInformation(EObject container, EReference containmentFeature)
482     {
483       this.container = container;
484       this.containmentFeature = containmentFeature;
485     }
486   }
487
488   protected Map JavaDoc getOldContainmentInformation()
489   {
490     if (oldContainmentInformation == null)
491     {
492       oldContainmentInformation = new HashMap JavaDoc();
493       for (Iterator JavaDoc i = getObjectChanges().iterator(); i.hasNext(); )
494       {
495         Map.Entry JavaDoc entry = (Map.Entry JavaDoc)i.next();
496         List JavaDoc featureChanges = (List JavaDoc)entry.getValue();
497         for (Iterator JavaDoc j = featureChanges.iterator(); j.hasNext(); )
498         {
499           FeatureChange featureChange = (FeatureChange)j.next();
500           EStructuralFeature feature = featureChange.getFeature();
501           if (feature instanceof EReference && ((EReference)feature).isContainment())
502           {
503             EObject container = (EObject)entry.getKey();
504             if (feature.isMany())
505             {
506               for (Iterator JavaDoc k = ((List JavaDoc)featureChange.getValue()).iterator(); k.hasNext(); )
507               {
508                 EObject eObject = (EObject)k.next();
509                 if (eObject.eContainer() != container || eObject.eContainmentFeature() != feature)
510                 {
511                   oldContainmentInformation.put(eObject, new OldContainmentInformation(container, (EReference)feature));
512                 }
513               }
514             }
515             else
516             {
517               EObject eObject = (EObject)featureChange.getValue();
518               if (eObject != null && (eObject.eContainer() != container || eObject.eContainmentFeature() != feature))
519               {
520                 oldContainmentInformation.put(eObject, new OldContainmentInformation(container, (EReference)feature));
521               }
522             }
523           }
524         }
525       }
526     }
527
528     for (Iterator JavaDoc i= getObjectsToDetach().iterator(); i.hasNext(); )
529     {
530       EObject eObject = (EObject)i.next();
531       oldContainmentInformation.put(eObject, new OldContainmentInformation(null, null));
532     }
533
534     return oldContainmentInformation;
535   }
536
537   public EObject getOldContainer(EObject eObject)
538   {
539     OldContainmentInformation oldContainmentInformation = (OldContainmentInformation)getOldContainmentInformation().get(eObject);
540     if (oldContainmentInformation == null)
541     {
542       return eObject.eContainer();
543     }
544     else
545     {
546       return oldContainmentInformation.container;
547     }
548   }
549
550   public EReference getOldContainmentFeature(EObject eObject)
551   {
552     OldContainmentInformation oldContainmentInformation = (OldContainmentInformation)getOldContainmentInformation().get(eObject);
553     if (oldContainmentInformation == null)
554     {
555       return eObject.eContainmentFeature();
556     }
557     else
558     {
559       return oldContainmentInformation.containmentFeature;
560     }
561   }
562   /**
563    * <!-- begin-user-doc -->
564    * <!-- end-user-doc -->
565    * @generated
566    */

567   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class JavaDoc baseClass, NotificationChain msgs)
568   {
569     if (featureID >= 0)
570     {
571       switch (eDerivedStructuralFeatureID(featureID, baseClass))
572       {
573         case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
574           return ((InternalEList)getObjectChanges()).basicRemove(otherEnd, msgs);
575         case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
576           return ((InternalEList)getObjectsToAttach()).basicRemove(otherEnd, msgs);
577         case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
578           return ((InternalEList)getResourceChanges()).basicRemove(otherEnd, msgs);
579         default:
580           return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
581       }
582     }
583     return eBasicSetContainer(null, featureID, msgs);
584   }
585
586   /**
587    * <!-- begin-user-doc -->
588    * <!-- end-user-doc -->
589    * @generated
590    */

591   public Object JavaDoc eGet(EStructuralFeature eFeature, boolean resolve)
592   {
593     switch (eDerivedStructuralFeatureID(eFeature))
594     {
595       case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
596         return getObjectChanges();
597       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
598         return getObjectsToDetach();
599       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
600         return getObjectsToAttach();
601       case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
602         return getResourceChanges();
603     }
604     return eDynamicGet(eFeature, resolve);
605   }
606
607   /**
608    * <!-- begin-user-doc -->
609    * <!-- end-user-doc -->
610    * @generated
611    */

612   public void eSet(EStructuralFeature eFeature, Object JavaDoc newValue)
613   {
614     switch (eDerivedStructuralFeatureID(eFeature))
615     {
616       case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
617         getObjectChanges().clear();
618         getObjectChanges().addAll((Collection JavaDoc)newValue);
619         return;
620       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
621         getObjectsToDetach().clear();
622         getObjectsToDetach().addAll((Collection JavaDoc)newValue);
623         return;
624       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
625         getObjectsToAttach().clear();
626         getObjectsToAttach().addAll((Collection JavaDoc)newValue);
627         return;
628       case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
629         getResourceChanges().clear();
630         getResourceChanges().addAll((Collection JavaDoc)newValue);
631         return;
632     }
633     eDynamicSet(eFeature, newValue);
634   }
635
636   /**
637    * <!-- begin-user-doc -->
638    * <!-- end-user-doc -->
639    * @generated
640    */

641   public void eUnset(EStructuralFeature eFeature)
642   {
643     switch (eDerivedStructuralFeatureID(eFeature))
644     {
645       case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
646         getObjectChanges().clear();
647         return;
648       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
649         getObjectsToDetach().clear();
650         return;
651       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
652         getObjectsToAttach().clear();
653         return;
654       case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
655         getResourceChanges().clear();
656         return;
657     }
658     eDynamicUnset(eFeature);
659   }
660
661   /**
662    * <!-- begin-user-doc -->
663    * <!-- end-user-doc -->
664    * @generated
665    */

666   public boolean eIsSet(EStructuralFeature eFeature)
667   {
668     switch (eDerivedStructuralFeatureID(eFeature))
669     {
670       case ChangePackage.CHANGE_DESCRIPTION__OBJECT_CHANGES:
671         return objectChanges != null && !objectChanges.isEmpty();
672       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_DETACH:
673         return objectsToDetach != null && !objectsToDetach.isEmpty();
674       case ChangePackage.CHANGE_DESCRIPTION__OBJECTS_TO_ATTACH:
675         return objectsToAttach != null && !objectsToAttach.isEmpty();
676       case ChangePackage.CHANGE_DESCRIPTION__RESOURCE_CHANGES:
677         return resourceChanges != null && !resourceChanges.isEmpty();
678     }
679     return eDynamicIsSet(eFeature);
680   }
681
682 } //ChangeDescriptionImpl
683
Popular Tags