Skip to content

Commit b2fe12b

Browse files
committed
XWIKI-23441: Merge fallback of xobjects is badly handled
* Ensure to properly record a conflict when an xobject is missing in current version but present in previous and next, and properly handle the fallback version
1 parent 5ffdf52 commit b2fe12b

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

xwiki-platform-core/xwiki-platform-store/xwiki-platform-store-merge/xwiki-platform-store-merge-default/src/main/java/org/xwiki/store/merge/internal/DefaultMergeManager.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -485,16 +485,22 @@ private MergeManagerResult<Map<DocumentReference, List<BaseObject>>, BaseObject>
485485
} else {
486486
// collision between DB and new: property to modify but does not exist in DB
487487
// Lets assume it's a mistake to fix
488-
objectMergeResult.getLog().warn("Object [{}] does not exist",
488+
objectMergeResult.getLog().warn("Property [{}] does not exist",
489489
newProperty.getReference());
490490

491491
objectResult.safeput(diff.getPropName(), newProperty);
492492
objectMergeResult.setModified(true);
493493
}
494494
}
495495
} else {
496-
// Object explitely removed from the DB, lets assume we don't care about the changes
497-
objectMergeResult.getLog().warn(WARNING_OBJECT_REMOVED, previousObject.getReference());
496+
// Object explicitely removed from the DB, it's a conflict
497+
objectMergeResult.getLog().error(ERROR_COLLISION_OBJECT, previousObject.getReference());
498+
499+
// We put the new object only if the fallback is to take new version.
500+
if (configuration.getConflictFallbackVersion() == ConflictFallbackVersion.NEXT) {
501+
mergedDocument.setXObject(newObject.getNumber(), newObject.clone());
502+
objectMergeResult.setModified(true);
503+
}
498504
}
499505
}
500506
}

xwiki-platform-core/xwiki-platform-store/xwiki-platform-store-merge/xwiki-platform-store-merge-default/src/test/java/org/xwiki/store/merge/internal/DefaultMergeManagerTest.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,13 +449,44 @@ public void testMergeCurrentObjectRemoved() throws Exception
449449
newobj.setStringValue("newtest", "newtest");
450450
this.nextDocument.addXObject(newobj);
451451

452-
merge();
453-
454-
BaseObject mergedobj = this.currentDocument.getXObject(this.xclass.getReference(), 0);
452+
MergeDocumentResult result = this.mergeManager.mergeDocument(this.previousDocument, this.nextDocument,
453+
this.currentDocument, this.configuration);
454+
List<LogEvent> logs = result.getLog().getLogs(LogLevel.ERROR);
455+
// We get 2 logs: one for the change on existing property, one for the new property.
456+
assertEquals(2, logs.size());
457+
assertEquals("Collision found on object [Object wiki:space.page^classspace.class[0]]",
458+
logs.get(0).getFormattedMessage());
459+
assertEquals("Collision found on object [Object wiki:space.page^classspace.class[0]]",
460+
logs.get(1).getFormattedMessage());
455461

462+
BaseObject mergedobj = ((XWikiDocument) result.getMergeResult()).getXObject(this.xclass.getReference(), 0);
456463
assertNull(mergedobj);
457464
}
458465

466+
@Test
467+
public void testMergeCurrentObjectRemovedFallbackNext() throws Exception
468+
{
469+
this.configuration.setConflictFallbackVersion(MergeConfiguration.ConflictFallbackVersion.NEXT);
470+
this.xobject.setStringValue("test", "");
471+
this.xobject.setStringValue("previoustest", "previoustest");
472+
this.previousDocument.addXObject(this.xobject);
473+
474+
BaseObject newobj = this.xobject.clone();
475+
newobj.setStringValue("test", "test2");
476+
newobj.setStringValue("newtest", "newtest");
477+
this.nextDocument.addXObject(newobj);
478+
479+
MergeDocumentResult result = this.mergeManager.mergeDocument(this.previousDocument, this.nextDocument,
480+
this.currentDocument, this.configuration);
481+
List<LogEvent> logs = result.getLog().getLogs(LogLevel.ERROR);
482+
// We get a single log because at second pass the object is set.
483+
assertEquals(1, logs.size());
484+
assertEquals("Collision found on object [Object wiki:space.page^classspace.class[0]]", logs.get(0).getFormattedMessage());
485+
486+
BaseObject mergedobj = ((XWikiDocument) result.getMergeResult()).getXObject(this.xclass.getReference(), 0);
487+
assertEquals(newobj, mergedobj);
488+
}
489+
459490
@Test
460491
public void testMergeAttachmentEquals() throws Exception
461492
{

0 commit comments

Comments
 (0)