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/transaction/CDOTransactionImpl.java (-8 / +20 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
Lines 1393-1404 Link Here
1393
    {
1400
    {
1394
      // Remember current revisions
1401
      // Remember current revisions
1395
      Map<CDOObject, CDORevision> oldRevisions = new HashMap<CDOObject, CDORevision>();
1402
      Map<CDOObject, CDORevision> oldRevisions = new HashMap<CDOObject, CDORevision>();
1396
      for (CDOObject object : getDirtyObjects().values())
1403
      InternalCDOSavepoint previousSavepoint = savepoint.getPreviousSavepoint();
1404
      if (previousSavepoint != null)
1397
      {
1405
      {
1398
        CDORevision oldRevision = object.cdoRevision();
1406
        Map<CDOID, CDOObject> allDirtyObjects = previousSavepoint.getAllDirtyObjects();
1399
        if (oldRevision != null)
1407
        for (CDOObject object : allDirtyObjects.values())
1400
        {
1408
        {
1401
          oldRevisions.put(object, oldRevision);
1409
          CDORevision oldRevision = object.cdoRevision();
1410
          if (oldRevision != null)
1411
          {
1412
            oldRevisions.put(object, oldRevision);
1413
          }
1402
        }
1414
        }
1403
      }
1415
      }
1404
1416
(-)src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java (-39 / +64 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
        }
247
248
        if (savepoint == this)
249
        {
250
          break;
251
        }
242
      }
252
      }
243
253
244
      return dirtyObjects;
254
      return dirtyObjects;
Lines 266-271 Link Here
266
        {
276
        {
267
          newObjects.remove(removedID);
277
          newObjects.remove(removedID);
268
        }
278
        }
279
280
        if (savepoint == this)
281
        {
282
          break;
283
        }
269
      }
284
      }
270
285
271
      return newObjects;
286
      return newObjects;
Lines 335-340 Link Here
335
        {
350
        {
336
          allRevisionDeltas.remove(detachedID);
351
          allRevisionDeltas.remove(detachedID);
337
        }
352
        }
353
354
        if (savepoint == this)
355
        {
356
          break;
357
        }
338
      }
358
      }
339
359
340
      return Collections.unmodifiableMap(allRevisionDeltas);
360
      return Collections.unmodifiableMap(allRevisionDeltas);
Lines 368-401 Link Here
368
        {
388
        {
369
          detachedObjects.remove(reattachedID);
389
          detachedObjects.remove(reattachedID);
370
        }
390
        }
371
      }
372
391
373
      return detachedObjects;
392
        if (savepoint == this)
374
    }
375
  }
376
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
        {
393
        {
390
          return true;
394
          break;
391
        }
395
        }
392
      }
396
      }
393
    }
394
397
395
    return false;
398
      return detachedObjects;
399
    }
396
  }
400
  }
397
401
398
  // TODO Not sure if this new implementation is needed. The existing one passes all tests.
399
  // public boolean isNewObject(CDOID id)
402
  // public boolean isNewObject(CDOID id)
400
  // {
403
  // {
401
  // if (id.isTemporary())
404
  // if (id.isTemporary())
Lines 403-435 Link Here
403
  // return true;
406
  // return true;
404
  // }
407
  // }
405
  //
408
  //
406
  // boolean isNew = false;
407
  // boolean wasNew = false;
408
  // synchronized (transaction)
409
  // synchronized (transaction)
409
  // {
410
  // {
410
  // for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
411
  // for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
411
  // {
412
  // {
412
  // if (savepoint.getNewObjects().containsKey(id))
413
  // if (savepoint.getNewObjects().containsKey(id))
413
  // {
414
  // {
414
  // isNew = true;
415
  // 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
  // }
416
  // }
427
  // }
417
  // }
428
  // }
418
  // }
429
  //
419
  //
430
  // return isNew;
420
  // return false;
431
  // }
421
  // }
432
422
423
  // TODO Not sure if this new implementation is needed. The existing one passes all tests.
424
  public boolean isNewObject(CDOID id)
425
  {
426
    if (id.isTemporary())
427
    {
428
      return true;
429
    }
430
431
    boolean isNew = false;
432
    boolean wasNew = false;
433
    synchronized (transaction)
434
    {
435
      for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint())
436
      {
437
        if (savepoint.getNewObjects().containsKey(id))
438
        {
439
          isNew = true;
440
          wasNew = true;
441
        }
442
443
        if (isNew && savepoint.getDetachedObjects().containsKey(id))
444
        {
445
          isNew = false;
446
        }
447
448
        if (!isNew && wasNew && savepoint.getReattachedObjects().containsKey(id))
449
        {
450
          isNew = true;
451
        }
452
      }
453
    }
454
455
    return isNew;
456
  }
457
433
  public void rollback()
458
  public void rollback()
434
  {
459
  {
435
    synchronized (transaction)
460
    synchronized (transaction)

Return to bug 352977