|
Lines 34-39
Link Here
|
| 34 |
import org.eclipse.emf.common.notify.Adapter; |
34 |
import org.eclipse.emf.common.notify.Adapter; |
| 35 |
import org.eclipse.emf.common.notify.Notification; |
35 |
import org.eclipse.emf.common.notify.Notification; |
| 36 |
import org.eclipse.emf.common.notify.NotificationChain; |
36 |
import org.eclipse.emf.common.notify.NotificationChain; |
|
|
37 |
import org.eclipse.emf.common.util.BasicEList; |
| 37 |
import org.eclipse.emf.common.util.BasicEMap; |
38 |
import org.eclipse.emf.common.util.BasicEMap; |
| 38 |
import org.eclipse.emf.common.util.ECollections; |
39 |
import org.eclipse.emf.common.util.ECollections; |
| 39 |
import org.eclipse.emf.common.util.EList; |
40 |
import org.eclipse.emf.common.util.EList; |
|
Lines 49-55
Link Here
|
| 49 |
import org.eclipse.emf.ecore.impl.EStoreEObjectImpl; |
50 |
import org.eclipse.emf.ecore.impl.EStoreEObjectImpl; |
| 50 |
import org.eclipse.emf.ecore.resource.Resource; |
51 |
import org.eclipse.emf.ecore.resource.Resource; |
| 51 |
import org.eclipse.emf.ecore.resource.Resource.Internal; |
52 |
import org.eclipse.emf.ecore.resource.Resource.Internal; |
| 52 |
import org.eclipse.emf.ecore.util.DelegatingEcoreEList; |
|
|
| 53 |
import org.eclipse.emf.ecore.util.DelegatingFeatureMap; |
53 |
import org.eclipse.emf.ecore.util.DelegatingFeatureMap; |
| 54 |
import org.eclipse.emf.ecore.util.EcoreEList; |
54 |
import org.eclipse.emf.ecore.util.EcoreEList; |
| 55 |
import org.eclipse.emf.ecore.util.EcoreEMap; |
55 |
import org.eclipse.emf.ecore.util.EcoreEMap; |
|
Lines 77-86
Link Here
|
| 77 |
|
77 |
|
| 78 |
private InternalCDORevision revision; |
78 |
private InternalCDORevision revision; |
| 79 |
|
79 |
|
|
|
80 |
/** |
| 81 |
* CDO used this list instead of eSettings for transient objects. EMF used eSettings as cache. CDO deactivated the |
| 82 |
* cache but EMF still used eSettings to store list wrappers. CDO needs another place to store the real list with the |
| 83 |
* actual data (transient mode) and accessible through EStore. This allows CDO to always use the same instance of the |
| 84 |
* list wrapper. |
| 85 |
*/ |
| 86 |
private transient Object cdoSettings[]; |
| 87 |
|
| 80 |
public CDOObjectImpl() |
88 |
public CDOObjectImpl() |
| 81 |
{ |
89 |
{ |
| 82 |
state = CDOState.TRANSIENT; |
90 |
state = CDOState.TRANSIENT; |
| 83 |
eContainer = null; |
91 |
eContainer = null; |
|
|
92 |
cdoSettings = null; |
| 84 |
} |
93 |
} |
| 85 |
|
94 |
|
| 86 |
public CDOID cdoID() |
95 |
public CDOID cdoID() |
|
Lines 98-103
Link Here
|
| 98 |
return revision; |
107 |
return revision; |
| 99 |
} |
108 |
} |
| 100 |
|
109 |
|
|
|
110 |
/** |
| 111 |
* @since 2.0 |
| 112 |
*/ |
| 113 |
protected Object[] cdoSettings() |
| 114 |
{ |
| 115 |
if (cdoSettings == null) |
| 116 |
{ |
| 117 |
int size = eClass().getFeatureCount() - eStaticFeatureCount(); |
| 118 |
cdoSettings = size == 0 ? ENO_SETTINGS : new Object[size]; |
| 119 |
} |
| 120 |
|
| 121 |
return cdoSettings; |
| 122 |
} |
| 123 |
|
| 124 |
/** |
| 125 |
* @since 2.0 |
| 126 |
*/ |
| 127 |
protected Object[] cdoBasicSettings() |
| 128 |
{ |
| 129 |
return cdoSettings; |
| 130 |
} |
| 131 |
|
| 101 |
public CDOClass cdoClass() |
132 |
public CDOClass cdoClass() |
| 102 |
{ |
133 |
{ |
| 103 |
return getCDOClass(this); |
134 |
return getCDOClass(this); |
|
Lines 201-213
Link Here
|
| 201 |
|
232 |
|
| 202 |
public void cdoInternalPostLoad() |
233 |
public void cdoInternalPostLoad() |
| 203 |
{ |
234 |
{ |
|
|
235 |
// Reset EMAP objects |
| 204 |
if (eSettings != null) |
236 |
if (eSettings != null) |
| 205 |
{ |
237 |
{ |
| 206 |
// Make sure transient feature are kept but persisted value are not cached. |
238 |
// Make sure transient features are kept but persisted values are not cached. |
| 207 |
EClass eClass = eClass(); |
239 |
EClass eClass = eClass(); |
| 208 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
240 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
| 209 |
{ |
241 |
{ |
| 210 |
EStructuralFeature eFeature = cdoInternalDynamicFeature(i); |
242 |
EStructuralFeature eFeature = cdoInternalDynamicFeature(i); |
|
|
243 |
|
| 211 |
// We need to keep the existing list if possible. |
244 |
// We need to keep the existing list if possible. |
| 212 |
if (!eFeature.isTransient() && eSettings[i] instanceof InternalCDOLoadable) |
245 |
if (!eFeature.isTransient() && eSettings[i] instanceof InternalCDOLoadable) |
| 213 |
{ |
246 |
{ |
|
Lines 230-249
Link Here
|
| 230 |
*/ |
263 |
*/ |
| 231 |
public void cdoInternalCleanup() |
264 |
public void cdoInternalCleanup() |
| 232 |
{ |
265 |
{ |
| 233 |
if (eSettings != null) |
266 |
// Do nothing |
| 234 |
{ |
|
|
| 235 |
// Make sure transient feature are kept but persisted value are not cached. |
| 236 |
EClass eClass = eClass(); |
| 237 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
| 238 |
{ |
| 239 |
EStructuralFeature eFeature = cdoInternalDynamicFeature(i); |
| 240 |
// We need to keep the existing list if possible. |
| 241 |
if (!eFeature.isTransient()) |
| 242 |
{ |
| 243 |
eSettings[i] = null; |
| 244 |
} |
| 245 |
} |
| 246 |
} |
| 247 |
} |
267 |
} |
| 248 |
|
268 |
|
| 249 |
public void cdoInternalPostAttach() |
269 |
public void cdoInternalPostAttach() |
|
Lines 256-261
Link Here
|
| 256 |
CDOViewImpl view = cdoView(); |
276 |
CDOViewImpl view = cdoView(); |
| 257 |
revision.setContainerID(eContainer == null ? CDOID.NULL : cdoView().convertObjectToID(eContainer, true)); |
277 |
revision.setContainerID(eContainer == null ? CDOID.NULL : cdoView().convertObjectToID(eContainer, true)); |
| 258 |
revision.setContainingFeatureID(eContainerFeatureID); |
278 |
revision.setContainingFeatureID(eContainerFeatureID); |
|
|
279 |
|
| 259 |
Resource directResource = eDirectResource(); |
280 |
Resource directResource = eDirectResource(); |
| 260 |
if (directResource instanceof CDOResource) |
281 |
if (directResource instanceof CDOResource) |
| 261 |
{ |
282 |
{ |
|
Lines 263-270
Link Here
|
| 263 |
revision.setResourceID(cdoResource.cdoID()); |
284 |
revision.setResourceID(cdoResource.cdoID()); |
| 264 |
} |
285 |
} |
| 265 |
|
286 |
|
| 266 |
eSettings(); |
|
|
| 267 |
|
| 268 |
EClass eClass = eClass(); |
287 |
EClass eClass = eClass(); |
| 269 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
288 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
| 270 |
{ |
289 |
{ |
|
Lines 274-279
Link Here
|
| 274 |
populateRevisionFeature(view, revision, eFeature, eSettings, i); |
293 |
populateRevisionFeature(view, revision, eFeature, eSettings, i); |
| 275 |
} |
294 |
} |
| 276 |
} |
295 |
} |
|
|
296 |
|
| 297 |
cdoSettings = null; |
| 277 |
} |
298 |
} |
| 278 |
|
299 |
|
| 279 |
@SuppressWarnings("unchecked") |
300 |
@SuppressWarnings("unchecked") |
|
Lines 287-293
Link Here
|
| 287 |
TRACER.format("Populating feature {0}", cdoFeature); |
308 |
TRACER.format("Populating feature {0}", cdoFeature); |
| 288 |
} |
309 |
} |
| 289 |
|
310 |
|
| 290 |
Object setting = eSettings[i]; |
311 |
Object setting = cdoBasicSettings() != null ? cdoSettings()[i] : null; |
| 291 |
if (setting == null) |
312 |
if (setting == null) |
| 292 |
{ |
313 |
{ |
| 293 |
setting = eFeature.getDefaultValue(); |
314 |
setting = eFeature.getDefaultValue(); |
|
Lines 330-342
Link Here
|
| 330 |
|
351 |
|
| 331 |
revision.set(cdoFeature, 0, setting); |
352 |
revision.set(cdoFeature, 0, setting); |
| 332 |
} |
353 |
} |
| 333 |
|
|
|
| 334 |
if (eSettings != null) |
| 335 |
{ |
| 336 |
eSettings[i] = null; |
| 337 |
} |
| 338 |
} |
354 |
} |
| 339 |
|
355 |
|
|
|
356 |
/** |
| 357 |
* It is really important for accessing the data to go through {@link #cdoStore()}. {@link #eStore()} will redirect |
| 358 |
* you to the transient data. |
| 359 |
*/ |
| 340 |
public void cdoInternalPostDetach() |
360 |
public void cdoInternalPostDetach() |
| 341 |
{ |
361 |
{ |
| 342 |
if (TRACER.isEnabled()) |
362 |
if (TRACER.isEnabled()) |
|
Lines 346-360
Link Here
|
| 346 |
|
366 |
|
| 347 |
CDOViewImpl view = cdoView(); |
367 |
CDOViewImpl view = cdoView(); |
| 348 |
super.eSetDirectResource(cdoDirectResource()); |
368 |
super.eSetDirectResource(cdoDirectResource()); |
| 349 |
eContainer = eStore().getContainer(this); |
369 |
|
| 350 |
eContainerFeatureID = getStore().getContainingFeatureID(this); |
370 |
CDOStore store = cdoStore(); |
|
|
371 |
eContainer = store.getContainer(this); |
| 372 |
eContainerFeatureID = store.getContainingFeatureID(this); |
| 351 |
if (eContainer != null && eContainmentFeature().isResolveProxies()) |
373 |
if (eContainer != null && eContainmentFeature().isResolveProxies()) |
| 352 |
{ |
374 |
{ |
| 353 |
adjustOppositeReference(eContainer, eContainmentFeature()); |
375 |
adjustOppositeReference(eContainer, eContainmentFeature()); |
| 354 |
} |
376 |
} |
| 355 |
|
377 |
|
| 356 |
// Ensure that the internal eSettings array is initialized; |
378 |
// Ensure that the internal eSettings array is initialized; |
| 357 |
eSettings(); |
379 |
resetSettings(); |
| 358 |
|
380 |
|
| 359 |
EClass eClass = eClass(); |
381 |
EClass eClass = eClass(); |
| 360 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
382 |
for (int i = 0; i < eClass.getFeatureCount(); i++) |
|
Lines 367-373
Link Here
|
| 367 |
} |
389 |
} |
| 368 |
} |
390 |
} |
| 369 |
|
391 |
|
| 370 |
@SuppressWarnings("unchecked") |
392 |
private void resetSettings() |
|
|
393 |
{ |
| 394 |
cdoSettings = null; |
| 395 |
cdoSettings(); |
| 396 |
} |
| 397 |
|
| 371 |
private void depopulateRevisionFeature(CDOViewImpl view, InternalCDORevision revision, EStructuralFeature eFeature, |
398 |
private void depopulateRevisionFeature(CDOViewImpl view, InternalCDORevision revision, EStructuralFeature eFeature, |
| 372 |
Object[] eSettings, int i) |
399 |
Object[] eSettings, int i) |
| 373 |
{ |
400 |
{ |
|
Lines 379-395
Link Here
|
| 379 |
EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)eFeature; |
406 |
EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)eFeature; |
| 380 |
EReference oppositeReference = cdoID().isTemporary() ? null : internalFeature.getEOpposite(); |
407 |
EReference oppositeReference = cdoID().isTemporary() ? null : internalFeature.getEOpposite(); |
| 381 |
|
408 |
|
|
|
409 |
CDOStore cdoStore = cdoStore(); |
| 410 |
EStore eStore = eStore(); |
| 382 |
if (eFeature.isMany()) |
411 |
if (eFeature.isMany()) |
| 383 |
{ |
412 |
{ |
| 384 |
eSettings[i] = null; |
413 |
|
| 385 |
InternalEList<Object> setting = (InternalEList<Object>)eGet(eFeature, true); |
414 |
int size = cdoStore.size(this, eFeature); |
| 386 |
int size = eStore().size(this, eFeature); |
|
|
| 387 |
for (int index = 0; index < size; index++) |
415 |
for (int index = 0; index < size; index++) |
| 388 |
{ |
416 |
{ |
| 389 |
// Do not trigger events |
417 |
// Do not trigger events |
| 390 |
// Do not trigger inverse updates |
418 |
// Do not trigger inverse updates |
| 391 |
Object object = eStore().get(this, eFeature, index); |
419 |
Object object = cdoStore.get(this, eFeature, index); |
| 392 |
setting.basicAdd(object, null); |
420 |
eStore.add(this, eFeature, index, object); |
| 393 |
if (oppositeReference != null) |
421 |
if (oppositeReference != null) |
| 394 |
{ |
422 |
{ |
| 395 |
adjustOppositeReference((InternalEObject)object, oppositeReference); |
423 |
adjustOppositeReference((InternalEObject)object, oppositeReference); |
|
Lines 398-407
Link Here
|
| 398 |
} |
426 |
} |
| 399 |
else |
427 |
else |
| 400 |
{ |
428 |
{ |
| 401 |
eSettings[i] = eStore().get(this, eFeature, 0); |
429 |
Object object = cdoStore.get(this, eFeature, EStore.NO_INDEX); |
|
|
430 |
eStore.set(this, eFeature, EStore.NO_INDEX, object); |
| 402 |
if (oppositeReference != null) |
431 |
if (oppositeReference != null) |
| 403 |
{ |
432 |
{ |
| 404 |
adjustOppositeReference((InternalEObject)eSettings[i], oppositeReference); |
433 |
adjustOppositeReference((InternalEObject)object, oppositeReference); |
| 405 |
} |
434 |
} |
| 406 |
} |
435 |
} |
| 407 |
} |
436 |
} |
|
Lines 534-540
Link Here
|
| 534 |
public EStoreEcoreEMap() |
563 |
public EStoreEcoreEMap() |
| 535 |
{ |
564 |
{ |
| 536 |
super((EClass)eType, eType.getInstanceClass(), null); |
565 |
super((EClass)eType, eType.getInstanceClass(), null); |
| 537 |
delegateEList = new CDOStoreEList<BasicEMap.Entry<Object, Object>>(eStructuralFeature) |
566 |
delegateEList = new BasicEStoreEList<BasicEMap.Entry<Object, Object>>(CDOObjectImpl.this, eStructuralFeature) |
| 538 |
{ |
567 |
{ |
| 539 |
private static final long serialVersionUID = 1L; |
568 |
private static final long serialVersionUID = 1L; |
| 540 |
|
569 |
|
|
Lines 576-582
Link Here
|
| 576 |
|
605 |
|
| 577 |
private void checkListForReading() |
606 |
private void checkListForReading() |
| 578 |
{ |
607 |
{ |
| 579 |
CDOStateMachine.INSTANCE.read(CDOObjectImpl.this); |
608 |
if (!FSMUtil.isTransient(CDOObjectImpl.this)) |
|
|
609 |
{ |
| 610 |
CDOStateMachine.INSTANCE.read(CDOObjectImpl.this); |
| 611 |
} |
| 580 |
} |
612 |
} |
| 581 |
|
613 |
|
| 582 |
/** |
614 |
/** |
|
Lines 641-647
Link Here
|
| 641 |
return new EStoreEcoreEMap(); |
673 |
return new EStoreEcoreEMap(); |
| 642 |
} |
674 |
} |
| 643 |
|
675 |
|
| 644 |
return new CDOStoreEList<Object>(eStructuralFeature); |
676 |
return super.createList(eStructuralFeature); |
| 645 |
} |
677 |
} |
| 646 |
|
678 |
|
| 647 |
@Override |
679 |
@Override |
|
Lines 659-665
Link Here
|
| 659 |
} |
691 |
} |
| 660 |
else if (resource instanceof CDOResourceImpl || resource == null) |
692 |
else if (resource instanceof CDOResourceImpl || resource == null) |
| 661 |
{ |
693 |
{ |
| 662 |
getStore().setContainer(this, (CDOResourceImpl)resource, eInternalContainer(), eContainerFeatureID()); |
694 |
cdoStore().setContainer(this, (CDOResourceImpl)resource, eInternalContainer(), eContainerFeatureID()); |
| 663 |
} |
695 |
} |
| 664 |
else |
696 |
else |
| 665 |
{ |
697 |
{ |
|
Lines 678-760
Link Here
|
| 678 |
return super.eDirectResource(); |
710 |
return super.eDirectResource(); |
| 679 |
} |
711 |
} |
| 680 |
|
712 |
|
| 681 |
return (Resource.Internal)getStore().getResource(this); |
713 |
return (Resource.Internal)cdoStore().getResource(this); |
| 682 |
} |
714 |
} |
| 683 |
|
715 |
|
| 684 |
/** |
716 |
/** |
| 685 |
* Don't cache non-transient features in this CDOObject's {@link #eSettings()}. |
717 |
* @since 2.0 |
| 686 |
*/ |
718 |
*/ |
| 687 |
@Override |
719 |
@Override |
| 688 |
protected boolean eIsCaching() |
720 |
public InternalEObject.EStore eStore() |
| 689 |
{ |
|
|
| 690 |
return false; |
| 691 |
} |
| 692 |
|
| 693 |
@Override |
| 694 |
public Object dynamicGet(int dynamicFeatureID) |
| 695 |
{ |
| 696 |
if (FSMUtil.isTransient(this)) |
| 697 |
{ |
| 698 |
if (eSettings == null) |
| 699 |
{ |
| 700 |
return null; |
| 701 |
} |
| 702 |
|
| 703 |
return eSettings[dynamicFeatureID]; |
| 704 |
} |
| 705 |
|
| 706 |
// Delegate to CDOStore |
| 707 |
return super.dynamicGet(dynamicFeatureID); |
| 708 |
} |
| 709 |
|
| 710 |
@Override |
| 711 |
public boolean eIsSet(EStructuralFeature feature) |
| 712 |
{ |
721 |
{ |
| 713 |
if (FSMUtil.isTransient(this)) |
722 |
if (FSMUtil.isTransient(this)) |
| 714 |
{ |
723 |
{ |
| 715 |
// TODO What about defaultValues != null? |
724 |
return CDOStoreSettingsImpl.INSTANCE; |
| 716 |
if (eSettings == null) |
|
|
| 717 |
{ |
| 718 |
return false; |
| 719 |
} |
| 720 |
|
| 721 |
return eSettings[eDynamicFeatureID(feature)] != null; |
| 722 |
} |
725 |
} |
| 723 |
|
726 |
|
| 724 |
// Delegate to CDOStore |
727 |
return cdoStore(); |
| 725 |
return super.eIsSet(feature); |
|
|
| 726 |
} |
| 727 |
|
| 728 |
@Override |
| 729 |
public void dynamicSet(int dynamicFeatureID, Object value) |
| 730 |
{ |
| 731 |
if (FSMUtil.isTransient(this)) |
| 732 |
{ |
| 733 |
eSettings(); // Important to create eSettings array if necessary |
| 734 |
eSettings[dynamicFeatureID] = value; |
| 735 |
} |
| 736 |
else |
| 737 |
{ |
| 738 |
// Delegate to CDOStore |
| 739 |
super.dynamicSet(dynamicFeatureID, value); |
| 740 |
} |
| 741 |
} |
728 |
} |
| 742 |
|
729 |
|
|
|
730 |
/** |
| 731 |
* Don't cache non-transient features in this CDOObject's {@link #eSettings()}. |
| 732 |
*/ |
| 743 |
@Override |
733 |
@Override |
| 744 |
public void dynamicUnset(int dynamicFeatureID) |
734 |
protected boolean eIsCaching() |
| 745 |
{ |
735 |
{ |
| 746 |
if (FSMUtil.isTransient(this)) |
736 |
return false; |
| 747 |
{ |
|
|
| 748 |
if (eSettings != null) |
| 749 |
{ |
| 750 |
eSettings[dynamicFeatureID] = null; |
| 751 |
} |
| 752 |
} |
| 753 |
else |
| 754 |
{ |
| 755 |
// Delegate to CDOStore |
| 756 |
super.dynamicUnset(dynamicFeatureID); |
| 757 |
} |
| 758 |
} |
737 |
} |
| 759 |
|
738 |
|
| 760 |
@Override |
739 |
@Override |
|
Lines 768-774
Link Here
|
| 768 |
else |
747 |
else |
| 769 |
{ |
748 |
{ |
| 770 |
// Delegate to CDOStore |
749 |
// Delegate to CDOStore |
| 771 |
container = getStore().getContainer(this); |
750 |
container = cdoStore().getContainer(this); |
| 772 |
} |
751 |
} |
| 773 |
|
752 |
|
| 774 |
if (container instanceof CDOResource) |
753 |
if (container instanceof CDOResource) |
|
Lines 788-794
Link Here
|
| 788 |
} |
767 |
} |
| 789 |
|
768 |
|
| 790 |
// Delegate to CDOStore |
769 |
// Delegate to CDOStore |
| 791 |
return getStore().getContainingFeatureID(this); |
770 |
return cdoStore().getContainingFeatureID(this); |
| 792 |
} |
771 |
} |
| 793 |
|
772 |
|
| 794 |
/** |
773 |
/** |
|
Lines 960-966
Link Here
|
| 960 |
} |
939 |
} |
| 961 |
else |
940 |
else |
| 962 |
{ |
941 |
{ |
| 963 |
getStore().setContainer(this, cdoDirectResource(), newEContainer, newContainerFeatureID); |
942 |
cdoStore().setContainer(this, cdoDirectResource(), newEContainer, newContainerFeatureID); |
| 964 |
} |
943 |
} |
| 965 |
} |
944 |
} |
| 966 |
|
945 |
|
|
Lines 991-1206
Link Here
|
| 991 |
return ModelUtil.getCDOClass(cdoObject.eClass(), packageManager); |
970 |
return ModelUtil.getCDOClass(cdoObject.eClass(), packageManager); |
| 992 |
} |
971 |
} |
| 993 |
|
972 |
|
| 994 |
private CDOStore getStore() |
973 |
private CDOStore cdoStore() |
| 995 |
{ |
974 |
{ |
| 996 |
return (CDOStore)eStore(); |
975 |
return cdoView().getStore(); |
| 997 |
} |
976 |
} |
| 998 |
|
977 |
|
| 999 |
/** |
978 |
/** |
| 1000 |
* TODO Remove this when EMF has fixed http://bugs.eclipse.org/197487 |
|
|
| 1001 |
* |
| 1002 |
* @author Eike Stepper |
979 |
* @author Eike Stepper |
|
|
980 |
* @since 2.0 |
| 1003 |
*/ |
981 |
*/ |
| 1004 |
public class CDOStoreEList<E> extends DelegatingEcoreEList.Dynamic<E> |
982 |
public static class CDOStoreSettingsImpl implements InternalEObject.EStore |
| 1005 |
{ |
983 |
{ |
| 1006 |
private static final long serialVersionUID = 1L; |
984 |
public static CDOStoreSettingsImpl INSTANCE = new CDOStoreSettingsImpl(); |
| 1007 |
|
985 |
|
| 1008 |
public CDOStoreEList(EStructuralFeature eStructuralFeature) |
986 |
private CDOStoreSettingsImpl() |
| 1009 |
{ |
987 |
{ |
| 1010 |
super(CDOObjectImpl.this, eStructuralFeature); |
|
|
| 1011 |
} |
988 |
} |
| 1012 |
|
989 |
|
| 1013 |
@Override |
990 |
protected Object getValue(InternalEObject eObject, int dynamicFeatureID) |
| 1014 |
protected List<E> delegateList() |
|
|
| 1015 |
{ |
991 |
{ |
| 1016 |
throw new UnsupportedOperationException(); |
992 |
return ((CDOObjectImpl)eObject).cdoSettings()[dynamicFeatureID]; |
|
|
993 |
|
| 1017 |
} |
994 |
} |
| 1018 |
|
995 |
|
| 1019 |
@Override |
996 |
protected EList<Object> getValueAsList(InternalEObject eObject, int dynamicFeatureID) |
| 1020 |
public EStructuralFeature getEStructuralFeature() |
|
|
| 1021 |
{ |
997 |
{ |
| 1022 |
return eStructuralFeature; |
998 |
@SuppressWarnings("unchecked") |
|
|
999 |
EList<Object> result = (EList<Object>)getValue(eObject, dynamicFeatureID); |
| 1000 |
if (result == null) |
| 1001 |
{ |
| 1002 |
result = new BasicEList<Object>(); |
| 1003 |
((CDOObjectImpl)eObject).cdoSettings()[dynamicFeatureID] = result; |
| 1004 |
} |
| 1005 |
|
| 1006 |
return result; |
| 1023 |
} |
1007 |
} |
| 1024 |
|
1008 |
|
| 1025 |
@Override |
1009 |
protected Object setValue(InternalEObject eObject, int dynamicFeatureID, Object newValue) |
| 1026 |
protected void delegateAdd(int index, Object object) |
|
|
| 1027 |
{ |
1010 |
{ |
| 1028 |
getStore().add(owner, eStructuralFeature, index, object); |
1011 |
Object eSettings[] = ((CDOObjectImpl)eObject).cdoSettings(); |
|
|
1012 |
|
| 1013 |
try |
| 1014 |
{ |
| 1015 |
return eSettings[dynamicFeatureID]; |
| 1016 |
} |
| 1017 |
finally |
| 1018 |
{ |
| 1019 |
eSettings[dynamicFeatureID] = newValue; |
| 1020 |
} |
| 1029 |
} |
1021 |
} |
| 1030 |
|
1022 |
|
| 1031 |
@Override |
1023 |
protected int eDynamicFeatureID(InternalEObject eObject, EStructuralFeature feature) |
| 1032 |
protected void delegateAdd(Object object) |
|
|
| 1033 |
{ |
1024 |
{ |
| 1034 |
delegateAdd(delegateSize(), object); |
1025 |
return ((CDOObjectImpl)eObject).eDynamicFeatureID(feature); |
| 1035 |
} |
1026 |
} |
| 1036 |
|
1027 |
|
| 1037 |
@Override |
1028 |
public Object get(InternalEObject eObject, EStructuralFeature feature, int index) |
| 1038 |
protected List<E> delegateBasicList() |
|
|
| 1039 |
{ |
1029 |
{ |
| 1040 |
int size = delegateSize(); |
1030 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
| 1041 |
if (size == 0) |
1031 |
if (feature.isMany()) |
| 1042 |
{ |
1032 |
{ |
| 1043 |
return ECollections.emptyEList(); |
1033 |
return getValueAsList(eObject, dynamicFeatureID).get(index); |
| 1044 |
} |
1034 |
} |
| 1045 |
|
1035 |
|
| 1046 |
Object[] data = getStore().toArray(owner, eStructuralFeature); |
1036 |
return getValue(eObject, dynamicFeatureID); |
| 1047 |
return new EcoreEList.UnmodifiableEList<E>(owner, eStructuralFeature, data.length, data); |
|
|
| 1048 |
} |
1037 |
} |
| 1049 |
|
1038 |
|
| 1050 |
@Override |
1039 |
public Object set(InternalEObject eObject, EStructuralFeature feature, int index, Object value) |
| 1051 |
protected void delegateClear() |
|
|
| 1052 |
{ |
1040 |
{ |
| 1053 |
getStore().clear(owner, eStructuralFeature); |
1041 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1042 |
if (feature.isMany()) |
| 1043 |
{ |
| 1044 |
return getValueAsList(eObject, dynamicFeatureID).set(index, value); |
| 1045 |
} |
| 1046 |
|
| 1047 |
return setValue(eObject, dynamicFeatureID, value); |
| 1054 |
} |
1048 |
} |
| 1055 |
|
1049 |
|
| 1056 |
@Override |
1050 |
public void add(InternalEObject eObject, EStructuralFeature feature, int index, Object value) |
| 1057 |
protected boolean delegateContains(Object object) |
|
|
| 1058 |
{ |
1051 |
{ |
| 1059 |
return getStore().contains(owner, eStructuralFeature, object); |
1052 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1053 |
getValueAsList(eObject, dynamicFeatureID).add(index, value); |
| 1060 |
} |
1054 |
} |
| 1061 |
|
1055 |
|
| 1062 |
@Override |
1056 |
public Object remove(InternalEObject eObject, EStructuralFeature feature, int index) |
| 1063 |
protected boolean delegateContainsAll(Collection<?> collection) |
|
|
| 1064 |
{ |
1057 |
{ |
| 1065 |
for (Object o : collection) |
1058 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
| 1066 |
{ |
1059 |
return getValueAsList(eObject, dynamicFeatureID).remove(index); |
| 1067 |
if (!delegateContains(o)) |
|
|
| 1068 |
{ |
| 1069 |
return false; |
| 1070 |
} |
| 1071 |
} |
| 1072 |
return true; |
| 1073 |
} |
1060 |
} |
| 1074 |
|
1061 |
|
| 1075 |
@SuppressWarnings("unchecked") |
1062 |
public Object move(InternalEObject eObject, EStructuralFeature feature, int targetIndex, int sourceIndex) |
| 1076 |
@Override |
|
|
| 1077 |
protected E delegateGet(int index) |
| 1078 |
{ |
1063 |
{ |
| 1079 |
return (E)getStore().get(owner, eStructuralFeature, index); |
1064 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1065 |
return getValueAsList(eObject, dynamicFeatureID).move(targetIndex, sourceIndex); |
| 1080 |
} |
1066 |
} |
| 1081 |
|
1067 |
|
| 1082 |
@Override |
1068 |
public void clear(InternalEObject eObject, EStructuralFeature feature) |
| 1083 |
protected int delegateHashCode() |
|
|
| 1084 |
{ |
1069 |
{ |
| 1085 |
return getStore().hashCode(owner, eStructuralFeature); |
1070 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1071 |
if (feature.isMany()) |
| 1072 |
{ |
| 1073 |
getValueAsList(eObject, dynamicFeatureID).clear(); |
| 1074 |
} |
| 1075 |
|
| 1076 |
setValue(eObject, dynamicFeatureID, null); |
| 1086 |
} |
1077 |
} |
| 1087 |
|
1078 |
|
| 1088 |
@Override |
1079 |
public int size(InternalEObject eObject, EStructuralFeature feature) |
| 1089 |
protected int delegateIndexOf(Object object) |
|
|
| 1090 |
{ |
1080 |
{ |
| 1091 |
return getStore().indexOf(owner, eStructuralFeature, object); |
1081 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1082 |
return getValueAsList(eObject, dynamicFeatureID).size(); |
| 1092 |
} |
1083 |
} |
| 1093 |
|
1084 |
|
| 1094 |
@Override |
1085 |
public int indexOf(InternalEObject eObject, EStructuralFeature feature, Object value) |
| 1095 |
protected boolean delegateIsEmpty() |
|
|
| 1096 |
{ |
1086 |
{ |
| 1097 |
return getStore().isEmpty(owner, eStructuralFeature); |
1087 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1088 |
return getValueAsList(eObject, dynamicFeatureID).indexOf(value); |
| 1098 |
} |
1089 |
} |
| 1099 |
|
1090 |
|
| 1100 |
@Override |
1091 |
public int lastIndexOf(InternalEObject eObject, EStructuralFeature feature, Object value) |
| 1101 |
protected Iterator<E> delegateIterator() |
|
|
| 1102 |
{ |
1092 |
{ |
| 1103 |
return iterator(); |
1093 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1094 |
return getValueAsList(eObject, dynamicFeatureID).lastIndexOf(value); |
| 1104 |
} |
1095 |
} |
| 1105 |
|
1096 |
|
| 1106 |
@Override |
1097 |
public Object[] toArray(InternalEObject eObject, EStructuralFeature feature) |
| 1107 |
protected int delegateLastIndexOf(Object object) |
|
|
| 1108 |
{ |
1098 |
{ |
| 1109 |
return getStore().lastIndexOf(owner, eStructuralFeature, object); |
1099 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1100 |
return getValueAsList(eObject, dynamicFeatureID).toArray(); |
| 1110 |
} |
1101 |
} |
| 1111 |
|
1102 |
|
| 1112 |
@Override |
1103 |
public <T> T[] toArray(InternalEObject eObject, EStructuralFeature feature, T[] array) |
| 1113 |
protected ListIterator<E> delegateListIterator() |
|
|
| 1114 |
{ |
1104 |
{ |
| 1115 |
return listIterator(); |
1105 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1106 |
return getValueAsList(eObject, dynamicFeatureID).toArray(array); |
| 1116 |
} |
1107 |
} |
| 1117 |
|
1108 |
|
| 1118 |
@SuppressWarnings("unchecked") |
1109 |
public boolean isEmpty(InternalEObject eObject, EStructuralFeature feature) |
| 1119 |
@Override |
|
|
| 1120 |
protected E delegateRemove(int index) |
| 1121 |
{ |
1110 |
{ |
| 1122 |
return (E)getStore().remove(owner, eStructuralFeature, index); |
1111 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1112 |
return getValueAsList(eObject, dynamicFeatureID).isEmpty(); |
| 1123 |
} |
1113 |
} |
| 1124 |
|
1114 |
|
| 1125 |
@SuppressWarnings("unchecked") |
1115 |
public boolean contains(InternalEObject eObject, EStructuralFeature feature, Object value) |
| 1126 |
@Override |
|
|
| 1127 |
protected E delegateSet(int index, E object) |
| 1128 |
{ |
1116 |
{ |
| 1129 |
return (E)getStore().set(owner, eStructuralFeature, index, object); |
1117 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1118 |
return getValueAsList(eObject, dynamicFeatureID).contains(value); |
| 1130 |
} |
1119 |
} |
| 1131 |
|
1120 |
|
| 1132 |
@Override |
1121 |
public int hashCode(InternalEObject eObject, EStructuralFeature feature) |
| 1133 |
protected int delegateSize() |
|
|
| 1134 |
{ |
1122 |
{ |
| 1135 |
return getStore().size(owner, eStructuralFeature); |
1123 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
|
|
1124 |
return getValueAsList(eObject, dynamicFeatureID).hashCode(); |
| 1136 |
} |
1125 |
} |
| 1137 |
|
1126 |
|
| 1138 |
@Override |
1127 |
public InternalEObject getContainer(InternalEObject eObject) |
| 1139 |
protected Object[] delegateToArray() |
|
|
| 1140 |
{ |
1128 |
{ |
| 1141 |
return getStore().toArray(owner, eStructuralFeature); |
1129 |
return null; |
| 1142 |
} |
1130 |
} |
| 1143 |
|
1131 |
|
| 1144 |
@Override |
1132 |
public EStructuralFeature getContainingFeature(InternalEObject eObject) |
| 1145 |
protected <T> T[] delegateToArray(T[] array) |
|
|
| 1146 |
{ |
1133 |
{ |
| 1147 |
return getStore().toArray(owner, eStructuralFeature, array); |
1134 |
// This should never be called. |
|
|
1135 |
throw new UnsupportedOperationException(); |
| 1148 |
} |
1136 |
} |
| 1149 |
|
1137 |
|
| 1150 |
@SuppressWarnings("unchecked") |
1138 |
public EObject create(EClass eClass) |
| 1151 |
@Override |
|
|
| 1152 |
protected E delegateMove(int targetIndex, int sourceIndex) |
| 1153 |
{ |
1139 |
{ |
| 1154 |
return (E)getStore().move(owner, eStructuralFeature, targetIndex, sourceIndex); |
1140 |
return new EStoreEObjectImpl(eClass, this); |
| 1155 |
} |
1141 |
} |
| 1156 |
|
1142 |
|
| 1157 |
@Override |
1143 |
public boolean isSet(InternalEObject eObject, EStructuralFeature feature) |
| 1158 |
protected boolean delegateEquals(Object object) |
|
|
| 1159 |
{ |
1144 |
{ |
| 1160 |
if (object == this) |
1145 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
| 1161 |
{ |
1146 |
return getValue(eObject, dynamicFeatureID) != null; |
| 1162 |
return true; |
|
|
| 1163 |
} |
| 1164 |
|
| 1165 |
if (!(object instanceof List)) |
| 1166 |
{ |
| 1167 |
return false; |
| 1168 |
} |
| 1169 |
|
| 1170 |
List<?> list = (List<?>)object; |
| 1171 |
if (list.size() != delegateSize()) |
| 1172 |
{ |
| 1173 |
return false; |
| 1174 |
} |
| 1175 |
|
| 1176 |
for (ListIterator<?> i = list.listIterator(); i.hasNext();) |
| 1177 |
{ |
| 1178 |
Object element = i.next(); |
| 1179 |
if (element == null ? get(i.previousIndex()) != null : !element.equals(get(i.previousIndex()))) |
| 1180 |
{ |
| 1181 |
return false; |
| 1182 |
} |
| 1183 |
} |
| 1184 |
|
| 1185 |
return true; |
| 1186 |
} |
1147 |
} |
| 1187 |
|
1148 |
|
| 1188 |
@Override |
1149 |
public void unset(InternalEObject eObject, EStructuralFeature feature) |
| 1189 |
protected String delegateToString() |
|
|
| 1190 |
{ |
1150 |
{ |
| 1191 |
StringBuffer stringBuffer = new StringBuffer(); |
1151 |
int dynamicFeatureID = eDynamicFeatureID(eObject, feature); |
| 1192 |
stringBuffer.append("["); |
1152 |
setValue(eObject, dynamicFeatureID, null); |
| 1193 |
for (int i = 0, size = size(); i < size;) |
|
|
| 1194 |
{ |
| 1195 |
Object value = delegateGet(i); |
| 1196 |
stringBuffer.append(String.valueOf(value)); |
| 1197 |
if (++i < size) |
| 1198 |
{ |
| 1199 |
stringBuffer.append(", "); |
| 1200 |
} |
| 1201 |
} |
| 1202 |
stringBuffer.append("]"); |
| 1203 |
return stringBuffer.toString(); |
| 1204 |
} |
1153 |
} |
| 1205 |
} |
1154 |
} |
| 1206 |
|
1155 |
|
|
Lines 1233-1239
Link Here
|
| 1233 |
@Override |
1182 |
@Override |
| 1234 |
protected void delegateAdd(int index, Entry object) |
1183 |
protected void delegateAdd(int index, Entry object) |
| 1235 |
{ |
1184 |
{ |
| 1236 |
getStore().add(owner, eStructuralFeature, index, object); |
1185 |
eStore().add(owner, eStructuralFeature, index, object); |
| 1237 |
} |
1186 |
} |
| 1238 |
|
1187 |
|
| 1239 |
@Override |
1188 |
@Override |
|
Lines 1251-1270
Link Here
|
| 1251 |
return ECollections.emptyEList(); |
1200 |
return ECollections.emptyEList(); |
| 1252 |
} |
1201 |
} |
| 1253 |
|
1202 |
|
| 1254 |
Object[] data = getStore().toArray(owner, eStructuralFeature); |
1203 |
Object[] data = cdoStore().toArray(owner, eStructuralFeature); |
| 1255 |
return new EcoreEList.UnmodifiableEList<FeatureMap.Entry>(owner, eStructuralFeature, data.length, data); |
1204 |
return new EcoreEList.UnmodifiableEList<FeatureMap.Entry>(owner, eStructuralFeature, data.length, data); |
| 1256 |
} |
1205 |
} |
| 1257 |
|
1206 |
|
| 1258 |
@Override |
1207 |
@Override |
| 1259 |
protected void delegateClear() |
1208 |
protected void delegateClear() |
| 1260 |
{ |
1209 |
{ |
| 1261 |
getStore().clear(owner, eStructuralFeature); |
1210 |
eStore().clear(owner, eStructuralFeature); |
| 1262 |
} |
1211 |
} |
| 1263 |
|
1212 |
|
| 1264 |
@Override |
1213 |
@Override |
| 1265 |
protected boolean delegateContains(Object object) |
1214 |
protected boolean delegateContains(Object object) |
| 1266 |
{ |
1215 |
{ |
| 1267 |
return getStore().contains(owner, eStructuralFeature, object); |
1216 |
return eStore().contains(owner, eStructuralFeature, object); |
| 1268 |
} |
1217 |
} |
| 1269 |
|
1218 |
|
| 1270 |
@Override |
1219 |
@Override |
|
Lines 1277-1307
Link Here
|
| 1277 |
return false; |
1226 |
return false; |
| 1278 |
} |
1227 |
} |
| 1279 |
} |
1228 |
} |
|
|
1229 |
|
| 1280 |
return true; |
1230 |
return true; |
| 1281 |
} |
1231 |
} |
| 1282 |
|
1232 |
|
| 1283 |
@Override |
1233 |
@Override |
| 1284 |
protected Entry delegateGet(int index) |
1234 |
protected Entry delegateGet(int index) |
| 1285 |
{ |
1235 |
{ |
| 1286 |
return (Entry)getStore().get(owner, eStructuralFeature, index); |
1236 |
return (Entry)eStore().get(owner, eStructuralFeature, index); |
| 1287 |
} |
1237 |
} |
| 1288 |
|
1238 |
|
| 1289 |
@Override |
1239 |
@Override |
| 1290 |
protected int delegateHashCode() |
1240 |
protected int delegateHashCode() |
| 1291 |
{ |
1241 |
{ |
| 1292 |
return getStore().hashCode(owner, eStructuralFeature); |
1242 |
return eStore().hashCode(owner, eStructuralFeature); |
| 1293 |
} |
1243 |
} |
| 1294 |
|
1244 |
|
| 1295 |
@Override |
1245 |
@Override |
| 1296 |
protected int delegateIndexOf(Object object) |
1246 |
protected int delegateIndexOf(Object object) |
| 1297 |
{ |
1247 |
{ |
| 1298 |
return getStore().indexOf(owner, eStructuralFeature, object); |
1248 |
return eStore().indexOf(owner, eStructuralFeature, object); |
| 1299 |
} |
1249 |
} |
| 1300 |
|
1250 |
|
| 1301 |
@Override |
1251 |
@Override |
| 1302 |
protected boolean delegateIsEmpty() |
1252 |
protected boolean delegateIsEmpty() |
| 1303 |
{ |
1253 |
{ |
| 1304 |
return getStore().isEmpty(owner, eStructuralFeature); |
1254 |
return eStore().isEmpty(owner, eStructuralFeature); |
| 1305 |
} |
1255 |
} |
| 1306 |
|
1256 |
|
| 1307 |
@Override |
1257 |
@Override |
|
Lines 1313-1319
Link Here
|
| 1313 |
@Override |
1263 |
@Override |
| 1314 |
protected int delegateLastIndexOf(Object object) |
1264 |
protected int delegateLastIndexOf(Object object) |
| 1315 |
{ |
1265 |
{ |
| 1316 |
return getStore().lastIndexOf(owner, eStructuralFeature, object); |
1266 |
return eStore().lastIndexOf(owner, eStructuralFeature, object); |
| 1317 |
} |
1267 |
} |
| 1318 |
|
1268 |
|
| 1319 |
@Override |
1269 |
@Override |
|
Lines 1325-1361
Link Here
|
| 1325 |
@Override |
1275 |
@Override |
| 1326 |
protected Entry delegateRemove(int index) |
1276 |
protected Entry delegateRemove(int index) |
| 1327 |
{ |
1277 |
{ |
| 1328 |
return (Entry)getStore().remove(owner, eStructuralFeature, index); |
1278 |
return (Entry)eStore().remove(owner, eStructuralFeature, index); |
| 1329 |
} |
1279 |
} |
| 1330 |
|
1280 |
|
| 1331 |
@Override |
1281 |
@Override |
| 1332 |
protected Entry delegateSet(int index, Entry object) |
1282 |
protected Entry delegateSet(int index, Entry object) |
| 1333 |
{ |
1283 |
{ |
| 1334 |
return (Entry)getStore().set(owner, eStructuralFeature, index, object); |
1284 |
return (Entry)eStore().set(owner, eStructuralFeature, index, object); |
| 1335 |
} |
1285 |
} |
| 1336 |
|
1286 |
|
| 1337 |
@Override |
1287 |
@Override |
| 1338 |
protected int delegateSize() |
1288 |
protected int delegateSize() |
| 1339 |
{ |
1289 |
{ |
| 1340 |
return getStore().size(owner, eStructuralFeature); |
1290 |
return eStore().size(owner, eStructuralFeature); |
| 1341 |
} |
1291 |
} |
| 1342 |
|
1292 |
|
| 1343 |
@Override |
1293 |
@Override |
| 1344 |
protected Object[] delegateToArray() |
1294 |
protected Object[] delegateToArray() |
| 1345 |
{ |
1295 |
{ |
| 1346 |
return getStore().toArray(owner, eStructuralFeature); |
1296 |
return eStore().toArray(owner, eStructuralFeature); |
| 1347 |
} |
1297 |
} |
| 1348 |
|
1298 |
|
| 1349 |
@Override |
1299 |
@Override |
| 1350 |
protected <T> T[] delegateToArray(T[] array) |
1300 |
protected <T> T[] delegateToArray(T[] array) |
| 1351 |
{ |
1301 |
{ |
| 1352 |
return getStore().toArray(owner, eStructuralFeature, array); |
1302 |
return eStore().toArray(owner, eStructuralFeature, array); |
| 1353 |
} |
1303 |
} |
| 1354 |
|
1304 |
|
| 1355 |
@Override |
1305 |
@Override |
| 1356 |
protected Entry delegateMove(int targetIndex, int sourceIndex) |
1306 |
protected Entry delegateMove(int targetIndex, int sourceIndex) |
| 1357 |
{ |
1307 |
{ |
| 1358 |
return (Entry)getStore().move(owner, eStructuralFeature, targetIndex, sourceIndex); |
1308 |
return (Entry)eStore().move(owner, eStructuralFeature, targetIndex, sourceIndex); |
| 1359 |
} |
1309 |
} |
| 1360 |
|
1310 |
|
| 1361 |
@Override |
1311 |
@Override |
|
Lines 1372-1377
Link Here
|
| 1372 |
stringBuffer.append(", "); |
1322 |
stringBuffer.append(", "); |
| 1373 |
} |
1323 |
} |
| 1374 |
} |
1324 |
} |
|
|
1325 |
|
| 1375 |
stringBuffer.append("]"); |
1326 |
stringBuffer.append("]"); |
| 1376 |
return stringBuffer.toString(); |
1327 |
return stringBuffer.toString(); |
| 1377 |
} |
1328 |
} |