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 352977 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/emf/cdo/tests/TransactionTest.java (+54 lines)
Lines 624-627 Link Here
624
    Company company2 = (Company)resource2.getContents().get(0);
624
    Company company2 = (Company)resource2.getContents().get(0);
625
    assertEquals("ESC", company2.getName());
625
    assertEquals("ESC", company2.getName());
626
  }
626
  }
627
628
  /**
629
   * Bug 352977.
630
   */
631
  public void testModifyDetachCommit() throws Exception
632
  {
633
    {
634
      Company company = getModel1Factory().createCompany();
635
636
      CDOSession session = openSession();
637
      CDOTransaction transaction = session.openTransaction();
638
      CDOResource resource = transaction.getOrCreateResource(getResourcePath("/test1"));
639
      resource.getContents().add(company);
640
      transaction.commit();
641
642
      company.setName("ESC");
643
      resource.getContents().remove(company);
644
      transaction.commit();
645
    }
646
647
    CDOSession session2 = openSession();
648
    CDOTransaction transaction2 = session2.openTransaction();
649
    CDOResource resource2 = transaction2.getOrCreateResource(getResourcePath("/test1"));
650
    assertEquals(0, resource2.getContents().size());
651
  }
652
653
  /**
654
   * Bug 352977.
655
   */
656
  public void testModifyDetachWithSavepoints() throws Exception
657
  {
658
    {
659
      Company company = getModel1Factory().createCompany();
660
661
      CDOSession session = openSession();
662
      CDOTransaction transaction = session.openTransaction();
663
      CDOResource resource = transaction.getOrCreateResource(getResourcePath("/test1"));
664
      resource.getContents().add(company);
665
      transaction.commit();
666
667
      company.setName("ESC");
668
      transaction.setSavepoint();
669
670
      resource.getContents().remove(company);
671
      // transaction.setSavepoint();
672
673
      transaction.commit();
674
    }
675
676
    CDOSession session2 = openSession();
677
    CDOTransaction transaction2 = session2.openTransaction();
678
    CDOResource resource2 = transaction2.getOrCreateResource(getResourcePath("/test1"));
679
    assertEquals(0, resource2.getContents().size());
680
  }
627
}
681
}
(-)src/org/eclipse/emf/internal/cdo/object/CDOObjectMerger.java (-1 / +2 lines)
Lines 32-38 Link Here
32
   */
32
   */
33
  public synchronized void merge(InternalCDOObject object, CDORevisionDelta delta)
33
  public synchronized void merge(InternalCDOObject object, CDORevisionDelta delta)
34
  {
34
  {
35
    InternalCDORevision revision = object.cdoRevision().copy();
35
    InternalCDORevision oldRevision = object.cdoRevision();
36
    InternalCDORevision revision = oldRevision.copy();
36
    object.cdoInternalSetRevision(revision);
37
    object.cdoInternalSetRevision(revision);
37
38
38
    // NEW object should stay that state.
39
    // NEW object should stay that state.
(-)src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java (-4 / +11 lines)
Lines 1294-1304 Link Here
1294
        Map<CDOID, CDOObject> map = isNew ? newObjMaps : dirtyObjects;
1294
        Map<CDOID, CDOObject> map = isNew ? newObjMaps : dirtyObjects;
1295
        InternalCDOObject object = (InternalCDOObject)map.get(id);
1295
        InternalCDOObject object = (InternalCDOObject)map.get(id);
1296
1296
1297
        // Change state of the objects
1297
        if (object != null)
1298
        merger.merge(object, delta);
1298
        {
1299
          // Change state of the objects
1300
          merger.merge(object, delta);
1299
1301
1300
        // Load the object from revision to EObject
1302
          // Load the object from revision to EObject
1301
        object.cdoInternalPostLoad();
1303
          object.cdoInternalPostLoad();
1304
        }
1305
        else
1306
        {
1307
          removeObject(id);
1308
        }
1302
      }
1309
      }
1303
    }
1310
    }
1304
1311
(-)src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java (-40 / +45 lines)
Lines 235-244 Link Here
235
        return Collections.unmodifiableMap(getDirtyObjects());
235
        return Collections.unmodifiableMap(getDirtyObjects());
236
      }
236
      }
237
237
238
      MultiMap.ListBased<CDOID, CDOObject> dirtyObjects = new MultiMap.ListBased<CDOID, CDOObject>();
238
      Map<CDOID, CDOObject> allDirtyObjects = new HashMap<CDOID, CDOObject>();
239
      for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
239
      for (InternalCDOSavepoint savepoint = getFirstSavePoint(); savepoint != null; savepoint = savepoint
240
          .getNextSavepoint())
240
      {
241
      {
241
        dirtyObjects.getDelegates().add(savepoint.getDirtyObjects());
242
        allDirtyObjects.putAll(savepoint.getDirtyObjects());
243
        for (CDOID removedID : savepoint.getDetachedObjects().keySet())
244
        {
245
          allDirtyObjects.remove(removedID);
246
        }
242
      }
247
      }
243
248
244
      return dirtyObjects;
249
      return dirtyObjects;
Lines 374-401 Link Here
374
    }
379
    }
375
  }
380
  }
376
381
377
  public boolean isNewObject(CDOID id)
378
  {
379
    if (id.isTemporary())
380
    {
381
      return true;
382
    }
383
384
    synchronized (transaction)
385
    {
386
      for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
387
      {
388
        if (savepoint.getNewObjects().containsKey(id))
389
        {
390
          return true;
391
        }
392
      }
393
    }
394
395
    return false;
396
  }
397
398
  // TODO Not sure if this new implementation is needed. The existing one passes all tests.
399
  // public boolean isNewObject(CDOID id)
382
  // public boolean isNewObject(CDOID id)
400
  // {
383
  // {
401
  // if (id.isTemporary())
384
  // if (id.isTemporary())
Lines 403-435 Link Here
403
  // return true;
386
  // return true;
404
  // }
387
  // }
405
  //
388
  //
406
  // boolean isNew = false;
407
  // boolean wasNew = false;
408
  // synchronized (transaction)
389
  // synchronized (transaction)
409
  // {
390
  // {
410
  // for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
391
  // for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
411
  // {
392
  // {
412
  // if (savepoint.getNewObjects().containsKey(id))
393
  // if (savepoint.getNewObjects().containsKey(id))
413
  // {
394
  // {
414
  // isNew = true;
395
  // return true;
415
  // wasNew = true;
416
  // }
417
  //
418
  // if (isNew && savepoint.getDetachedObjects().containsKey(id))
419
  // {
420
  // isNew = false;
421
  // }
422
  //
423
  // if (!isNew && wasNew && savepoint.getReattachedObjects().containsKey(id))
424
  // {
425
  // isNew = true;
426
  // }
396
  // }
427
  // }
397
  // }
428
  // }
398
  // }
429
  //
399
  //
430
  // return isNew;
400
  // return false;
431
  // }
401
  // }
432
402
403
  // TODO Not sure if this new implementation is needed. The existing one passes all tests.
404
  public boolean isNewObject(CDOID id)
405
  {
406
    if (id.isTemporary())
407
    {
408
      return true;
409
    }
410
411
    boolean isNew = false;
412
    boolean wasNew = false;
413
    synchronized (transaction)
414
    {
415
      for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
416
      {
417
        if (savepoint.getNewObjects().containsKey(id))
418
        {
419
          isNew = true;
420
          wasNew = true;
421
        }
422
423
        if (isNew && savepoint.getDetachedObjects().containsKey(id))
424
        {
425
          isNew = false;
426
        }
427
428
        if (!isNew && wasNew && savepoint.getReattachedObjects().containsKey(id))
429
        {
430
          isNew = true;
431
        }
432
      }
433
    }
434
435
    return isNew;
436
  }
437
433
  public void rollback()
438
  public void rollback()
434
  {
439
  {
435
    synchronized (transaction)
440
    synchronized (transaction)

Return to bug 352977