/** * IMPORTANT: Compile errors in this method might indicate an old version of EMF. Legacy support * is only enabled for EMF with fixed bug #247130. These compile errors do not affect native * models! */ protected void resolveProxies(EStructuralFeature feature) { Object value = getInstanceValue(instance, feature); if (value != null) { if (feature.isMany()) { @SuppressWarnings("unchecked") InternalEList<Object> list = (InternalEList<Object>) value; int size = list.size(); boolean deliver = instance.eDeliver(); if (deliver) { instance.eSetDeliver(false); } for (int i = 0; i < size; i++) { Object element = list.get(i); if (element instanceof LegacyProxy) { CDOID id = ((LegacyProxy) element).getID(); InternalCDOObject resolved = (InternalCDOObject) viewAndState.view.getObject(id); InternalEObject instance = resolved.cdoInternalInstance(); // TODO LEGACY // // TODO Is InternalEList.basicSet() needed??? // if (list instanceof // org.eclipse.emf.ecore.util.DelegatingInternalEList) // { // list = // ((org.eclipse.emf.ecore.util.DelegatingInternalEList)list).getDelegateInternalEList(); // } // if (list instanceof NotifyingListImpl<?>) // { // ((NotifyingListImpl<Object>)list).basicSet(i, instance, null); // } // else // { list.set(i, instance); // } } } if (deliver) { instance.eSetDeliver(true); } } else { if (value instanceof LegacyProxy) { CDOID id = ((LegacyProxy) value).getID(); InternalCDOObject resolved = (InternalCDOObject) viewAndState.view.getObject(id); InternalEObject instance = resolved.cdoInternalInstance(); setInstanceValue(instance, feature, instance); } } } }
void resolve(EObject object, EReference reference, EObject proxy) { EReference opposite = reference.getEOpposite(); if (opposite != null) { if (opposite.isMany()) { InternalEList<?> list = (InternalEList<?>) object.eGet(opposite, false); int index = list.basicIndexOf(proxy); if (index >= 0) { list.get(index); // resolve just this index } } else { object.eGet(opposite, true); // resolve the scalar reference } } }
protected void clearEList(InternalEList<?> list) { for (int i = list.size() - 1; i >= 0; --i) { Object obj = list.get(i); // Disable notifications from value during the // invalidation in case of // eInverseAdd/eInverseRemove boolean eDeliver = false; if (obj instanceof Notifier) { Notifier notifier = (Notifier) obj; eDeliver = notifier.eDeliver(); if (eDeliver) { notifier.eSetDeliver(false); } } list.basicRemove(obj, null); if (obj instanceof Notifier && eDeliver) { Notifier notifier = (Notifier) obj; notifier.eSetDeliver(eDeliver); } } }