|
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) |