|
Lines 77-88
Link Here
|
| 77 |
* This local ThreadMap stores all pre-registered objects. This avoids a neverending loop when setting the container |
77 |
* This local ThreadMap stores all pre-registered objects. This avoids a neverending loop when setting the container |
| 78 |
* for the object. |
78 |
* for the object. |
| 79 |
*/ |
79 |
*/ |
| 80 |
private static ThreadLocal<Map<CDOID, EObject>> preRegisteredObjects = new InheritableThreadLocal<Map<CDOID, EObject>>() |
80 |
private static ThreadLocal<Map<CDOID, CDOLegacyWrapper>> wrapperRegistry = new InheritableThreadLocal<Map<CDOID, CDOLegacyWrapper>>() |
| 81 |
{ |
81 |
{ |
| 82 |
@Override |
82 |
@Override |
| 83 |
protected Map<CDOID, EObject> initialValue() |
83 |
protected Map<CDOID, CDOLegacyWrapper> initialValue() |
| 84 |
{ |
84 |
{ |
| 85 |
return new HashMap<CDOID, EObject>(); |
85 |
return new HashMap<CDOID, CDOLegacyWrapper>(); |
| 86 |
} |
86 |
} |
| 87 |
}; |
87 |
}; |
| 88 |
|
88 |
|
|
Lines 191-196
Link Here
|
| 191 |
|
191 |
|
| 192 |
public void cdoInternalCleanup() |
192 |
public void cdoInternalCleanup() |
| 193 |
{ |
193 |
{ |
|
|
194 |
// clean(); |
| 194 |
} |
195 |
} |
| 195 |
|
196 |
|
| 196 |
@Override |
197 |
@Override |
|
Lines 284-290
Link Here
|
| 284 |
Counter counter = recursionCounter.get(); |
285 |
Counter counter = recursionCounter.get(); |
| 285 |
try |
286 |
try |
| 286 |
{ |
287 |
{ |
| 287 |
preRegisterObject(this); |
288 |
registerWrapper(this); |
| 288 |
counter.increment(); |
289 |
counter.increment(); |
| 289 |
|
290 |
|
| 290 |
revisionToInstanceContainment(); |
291 |
revisionToInstanceContainment(); |
|
Lines 306-332
Link Here
|
| 306 |
instance.eSetDeliver(true); |
307 |
instance.eSetDeliver(true); |
| 307 |
} |
308 |
} |
| 308 |
|
309 |
|
| 309 |
int newThreadCount = counter.decrement(); |
310 |
counter.decrement(); |
| 310 |
|
311 |
unregisterWrapper(this); |
| 311 |
if (newThreadCount == 0 && getPreRegisteredObjects() != null) |
|
|
| 312 |
{ |
| 313 |
// localThread.remove(); // TODO Martin: check why new |
| 314 |
// objects will be created if this list is cleared |
| 315 |
} |
| 316 |
|
| 317 |
underConstruction = false; |
312 |
underConstruction = false; |
| 318 |
} |
313 |
} |
| 319 |
} |
314 |
} |
| 320 |
|
315 |
|
| 321 |
/** |
|
|
| 322 |
* adds an object to the pre-registered objects list which hold all created objects even if they are not registered in |
| 323 |
* the view |
| 324 |
*/ |
| 325 |
private void preRegisterObject(CDOLegacyWrapper wrapper) |
| 326 |
{ |
| 327 |
getPreRegisteredObjects().put(wrapper.cdoID(), wrapper); |
| 328 |
} |
| 329 |
|
| 330 |
protected void revisionToInstanceContainment() |
316 |
protected void revisionToInstanceContainment() |
| 331 |
{ |
317 |
{ |
| 332 |
CDOID resourceID = revision.getResourceID(); |
318 |
CDOID resourceID = revision.getResourceID(); |
|
Lines 338-348
Link Here
|
| 338 |
setInstanceContainer(container, revision.getContainingFeatureID()); |
324 |
setInstanceContainer(container, revision.getContainingFeatureID()); |
| 339 |
} |
325 |
} |
| 340 |
|
326 |
|
| 341 |
private Map<CDOID, EObject> getPreRegisteredObjects() |
|
|
| 342 |
{ |
| 343 |
return preRegisteredObjects.get(); |
| 344 |
} |
| 345 |
|
| 346 |
/** |
327 |
/** |
| 347 |
* @since 3.0 |
328 |
* @since 3.0 |
| 348 |
*/ |
329 |
*/ |
|
Lines 370-376
Link Here
|
| 370 |
|
351 |
|
| 371 |
if (TRACER.isEnabled()) |
352 |
if (TRACER.isEnabled()) |
| 372 |
{ |
353 |
{ |
| 373 |
TRACER.format(("Adding " + object + " to feature " + feature + "in instance " + instance)); |
354 |
TRACER.format("Adding " + object + " to feature " + feature + "in instance " + instance); |
| 374 |
} |
355 |
} |
| 375 |
|
356 |
|
| 376 |
list.basicAdd(object, null); |
357 |
list.basicAdd(object, null); |
|
Lines 400-424
Link Here
|
| 400 |
|
381 |
|
| 401 |
int featureID = instance.eClass().getFeatureID(feature); |
382 |
int featureID = instance.eClass().getFeatureID(feature); |
| 402 |
Class<? extends Object> baseClass = object == null ? null : object.getClass(); |
383 |
Class<? extends Object> baseClass = object == null ? null : object.getClass(); |
|
|
384 |
EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)feature; |
| 385 |
EReference oppositeReference = cdoID().isTemporary() ? null : internalFeature.getEOpposite(); |
| 403 |
|
386 |
|
| 404 |
try |
387 |
if (oppositeReference != null) |
| 405 |
{ |
388 |
{ |
| 406 |
instance.eInverseAdd((InternalEObject)object, featureID, baseClass, null); |
389 |
instance.eInverseAdd((InternalEObject)object, featureID, baseClass, null); |
|
|
390 |
|
| 391 |
if (object != null && !EMFUtil.isPersistent(oppositeReference)) |
| 392 |
{ |
| 393 |
adjustOppositeReference(instance, (InternalEObject)object, oppositeReference); |
| 394 |
} |
| 407 |
} |
395 |
} |
| 408 |
catch (NullPointerException e) |
396 |
else |
| 409 |
{ |
397 |
{ |
| 410 |
// TODO: Martin:quick hack, because there is still a problem with the feature id. Should investigate this soon |
|
|
| 411 |
instance.eSet(feature, object); |
398 |
instance.eSet(feature, object); |
| 412 |
} |
399 |
} |
| 413 |
|
400 |
|
| 414 |
// Adjust opposite for transient opposite features |
401 |
// Adjust opposite for transient opposite features |
| 415 |
EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)feature; |
|
|
| 416 |
EReference oppositeReference = cdoID().isTemporary() ? null : internalFeature.getEOpposite(); |
| 417 |
if (oppositeReference != null && object != null && !EMFUtil.isPersistent(oppositeReference)) |
| 418 |
{ |
| 419 |
adjustOppositeReference(instance, (InternalEObject)object, oppositeReference); |
| 420 |
} |
| 421 |
|
| 422 |
if (TRACER.isEnabled()) |
402 |
if (TRACER.isEnabled()) |
| 423 |
{ |
403 |
{ |
| 424 |
TRACER.format(("Added object " + object + " to feature " + feature + " in instance " + instance)); |
404 |
TRACER.format(("Added object " + object + " to feature " + feature + " in instance " + instance)); |
|
Lines 494-520
Link Here
|
| 494 |
return null; |
474 |
return null; |
| 495 |
} |
475 |
} |
| 496 |
|
476 |
|
|
|
477 |
if (object instanceof CDOLegacyWrapper) |
| 478 |
{ |
| 479 |
return ((CDOLegacyWrapper)object).cdoInternalInstance(); |
| 480 |
} |
| 481 |
|
| 497 |
CDOType type = CDOModelUtil.getType(feature.getEType()); |
482 |
CDOType type = CDOModelUtil.getType(feature.getEType()); |
| 498 |
object = type.convertToEMF(feature.getEType(), object); |
483 |
object = type.convertToEMF(feature.getEType(), object); |
| 499 |
|
484 |
|
| 500 |
if (type == CDOType.OBJECT) |
485 |
if (type == CDOType.OBJECT) |
| 501 |
{ |
486 |
{ |
| 502 |
CDOID id = (CDOID)object; |
487 |
if (object instanceof CDOID) |
| 503 |
if (id.isNull()) |
|
|
| 504 |
{ |
488 |
{ |
| 505 |
return null; |
489 |
CDOID id = (CDOID)object; |
| 506 |
} |
490 |
if (id.isNull()) |
|
|
491 |
{ |
| 492 |
return null; |
| 493 |
} |
| 507 |
|
494 |
|
| 508 |
object = getPreRegisteredObjects().get(id); |
495 |
object = getRegisteredWrapper(id); |
| 509 |
if (object != null) |
496 |
if (object != null) |
| 510 |
{ |
497 |
{ |
| 511 |
return ((CDOLegacyWrapper)object).cdoInternalInstance(); |
498 |
return ((CDOLegacyWrapper)object).cdoInternalInstance(); |
| 512 |
} |
499 |
} |
| 513 |
|
500 |
|
| 514 |
object = view.getObject(id); |
501 |
object = view.getObject(id); |
| 515 |
if (object instanceof CDOObjectWrapper) |
502 |
if (object instanceof CDOObjectWrapper) |
| 516 |
{ |
503 |
{ |
| 517 |
return ((CDOObjectWrapper)object).cdoInternalInstance(); |
504 |
return ((CDOObjectWrapper)object).cdoInternalInstance(); |
|
|
505 |
} |
| 518 |
} |
506 |
} |
| 519 |
} |
507 |
} |
| 520 |
|
508 |
|
|
Lines 569-581
Link Here
|
| 569 |
protected InternalEObject getEObjectFromPotentialID(InternalCDOView view, EStructuralFeature feature, |
557 |
protected InternalEObject getEObjectFromPotentialID(InternalCDOView view, EStructuralFeature feature, |
| 570 |
Object potentialID) |
558 |
Object potentialID) |
| 571 |
{ |
559 |
{ |
| 572 |
if (getPreRegisteredObjects().get(potentialID) != null) |
560 |
CDOLegacyWrapper wrapper; |
|
|
561 |
if (potentialID instanceof CDOID && (wrapper = getRegisteredWrapper((CDOID)potentialID)) != null) |
| 573 |
{ |
562 |
{ |
| 574 |
potentialID = ((CDOLegacyWrapper)getPreRegisteredObjects().get(potentialID)).instance; |
563 |
potentialID = wrapper.instance; |
| 575 |
|
564 |
|
| 576 |
if (TRACER.isEnabled()) |
565 |
if (TRACER.isEnabled()) |
| 577 |
{ |
566 |
{ |
| 578 |
TRACER.format(("getting Object (" + potentialID + ") from localThread instead of the view")); |
567 |
TRACER.format("getting Object (" + potentialID + ") from localThread instead of the view"); |
| 579 |
} |
568 |
} |
| 580 |
} |
569 |
} |
| 581 |
else |
570 |
else |
|
Lines 759-764
Link Here
|
| 759 |
} |
748 |
} |
| 760 |
} |
749 |
} |
| 761 |
|
750 |
|
|
|
751 |
public static boolean isLegacyProxy(Object object) |
| 752 |
{ |
| 753 |
return object instanceof LegacyProxy; |
| 754 |
} |
| 755 |
|
| 762 |
protected static int getEFlagMask(Class<?> instanceClass, String flagName) |
756 |
protected static int getEFlagMask(Class<?> instanceClass, String flagName) |
| 763 |
{ |
757 |
{ |
| 764 |
Field field = ReflectUtil.getField(instanceClass, flagName); |
758 |
Field field = ReflectUtil.getField(instanceClass, flagName); |
|
Lines 766-772
Link Here
|
| 766 |
{ |
760 |
{ |
| 767 |
field.setAccessible(true); |
761 |
field.setAccessible(true); |
| 768 |
} |
762 |
} |
| 769 |
|
763 |
|
| 770 |
try |
764 |
try |
| 771 |
{ |
765 |
{ |
| 772 |
return (Integer)field.get(null); |
766 |
return (Integer)field.get(null); |
|
Lines 777-785
Link Here
|
| 777 |
} |
771 |
} |
| 778 |
} |
772 |
} |
| 779 |
|
773 |
|
| 780 |
public static boolean isLegacyProxy(Object object) |
774 |
private static CDOLegacyWrapper getRegisteredWrapper(CDOID id) |
| 781 |
{ |
775 |
{ |
| 782 |
return object instanceof LegacyProxy; |
776 |
return wrapperRegistry.get().get(id); |
|
|
777 |
} |
| 778 |
|
| 779 |
/** |
| 780 |
* adds an object to the pre-registered objects list which hold all created objects even if they are not registered in |
| 781 |
* the view |
| 782 |
*/ |
| 783 |
private static void registerWrapper(CDOLegacyWrapper wrapper) |
| 784 |
{ |
| 785 |
wrapperRegistry.get().put(wrapper.cdoID(), wrapper); |
| 786 |
} |
| 787 |
|
| 788 |
private static void unregisterWrapper(CDOLegacyWrapper wrapper) |
| 789 |
{ |
| 790 |
wrapperRegistry.get().remove(wrapper.cdoID()); |
| 783 |
} |
791 |
} |
| 784 |
|
792 |
|
| 785 |
/** |
793 |
/** |