Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 247226 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/emf/internal/cdo/CDOLegacyWrapper.java (-56 / +64 lines)
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
  /**

Return to bug 247226