From 335e949b023a3f687788c8f4b1f17af4854c899e Mon Sep 17 00:00:00 2001 From: TruongQuangSB Date: Fri, 10 Jul 2026 18:26:49 +0200 Subject: [PATCH 1/3] Fix create DiffContent --- .../table/diff/TableStateDiffService.java | 120 +++++++++++++----- .../extensions/CellContentExtensions.xtend | 7 + 2 files changed, 94 insertions(+), 33 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/diff/TableStateDiffService.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/diff/TableStateDiffService.java index 66a0d3a5c6..e01c7382a8 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/diff/TableStateDiffService.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/diff/TableStateDiffService.java @@ -10,7 +10,7 @@ */ package org.eclipse.set.feature.table.diff; -import static org.eclipse.set.model.tablemodel.extensions.CellContentExtensions.createStringCellContent; +import static org.eclipse.set.model.tablemodel.extensions.CellContentExtensions.*; import static org.eclipse.set.model.tablemodel.extensions.TableCellExtensions.getIterableStringValue; import java.util.Collections; @@ -23,7 +23,6 @@ import org.eclipse.set.model.tablemodel.StringCellContent; import org.eclipse.set.model.tablemodel.TableCell; import org.eclipse.set.model.tablemodel.TablemodelFactory; -import org.eclipse.set.model.tablemodel.extensions.CellContentExtensions; import org.eclipse.set.ppmodel.extensions.EObjectExtensions; import org.eclipse.set.services.table.TableDiffService; import org.osgi.service.component.annotations.Component; @@ -51,8 +50,8 @@ CellContent createDiffContent(final TableCell oldCell, if (oldCell.getContent() instanceof MultiColorCellContent || newCell != null && newCell .getContent() instanceof MultiColorCellContent) { - createMultiColorDiffCotent(oldCell, newCell); - return oldCell.getContent(); + return createMultiColorDiffContent(oldCell.getContent(), + newCell.getContent()); } if (!(oldCell.getContent() instanceof StringCellContent) @@ -78,38 +77,93 @@ CellContent createDiffContent(final TableCell oldCell, return compareContent; } - private static void createMultiColorDiffCotent(final TableCell oldCell, - final TableCell newCell) { - if (oldCell - .getContent() instanceof final MultiColorCellContent oldCellContent - && newCell != null && newCell - .getContent() instanceof final MultiColorCellContent newCellContent) { - if (CellContentExtensions.getPlainStringValue(oldCellContent) - .equals(CellContentExtensions - .getPlainStringValue(newCellContent))) { - oldCellContent.getValue() - .forEach(e -> e.setDisableMultiColor(false)); - return; + @SuppressWarnings("nls") + private static CellContent createMultiColorDiffContent( + final CellContent oldContent, final CellContent newContent) { + if (oldContent == null + && newContent instanceof final MultiColorCellContent newMuliColorCellContent) { + return createCompareStateCellContent(oldContent, + createStringCellContent( + getStringValueIterable(newMuliColorCellContent))); + } + + if (oldContent == null) { + throw new IllegalArgumentException(); + } + + return switch (oldContent) { + case final StringCellContent oldStringCellContent -> { + if (newContent instanceof final MultiColorCellContent newMultiColorCellContent) { + yield createMultiColorDiffContent(oldStringCellContent, + newMultiColorCellContent); + } + throw new IllegalArgumentException( + "At least one cell content is multicolor cellcontent"); } + case final MultiColorCellContent oldMultiColorCellContent -> { + if (newContent instanceof final StringCellContent newStringCellContent) { + yield createMultiColorDiffContent(oldMultiColorCellContent, + newStringCellContent); + } + + if (newContent instanceof final MultiColorCellContent newMultiColorCellContent) { + yield createMultiColorDiffContent(oldMultiColorCellContent, + newMultiColorCellContent); + } + throw new IllegalArgumentException( + "At least one cell content is multicolor cellcontent"); + } + + default -> throw new IllegalArgumentException( + "At least one cell content is multicolor cellcontent"); + }; + } + + private static CellContent createMultiColorDiffContent( + final StringCellContent oldContent, + final MultiColorCellContent newContent) { + final String plainStringValue = getPlainStringValue(oldContent); + if (!plainStringValue.isEmpty()) { + throw new IllegalArgumentException( + "The compare cells content must be same type"); //$NON-NLS-1$ + } + return createCompareStateCellContent(oldContent, + createStringCellContent(getStringValueIterable(newContent))); + } + + private static CellContent createMultiColorDiffContent( + final MultiColorCellContent oldContent, + final StringCellContent newContent) { + if (!getPlainStringValue(newContent).isEmpty()) { + throw new IllegalArgumentException( + "The compare cells content must be same type"); //$NON-NLS-1$ + } + return createCompareStateCellContent( + createStringCellContent(getStringValueIterable(oldContent)), + newContent); + } - // Convert to CompareCellContent, when give different between - // initial - // and final state - final CompareStateCellContent compareCellContent = TablemodelFactory.eINSTANCE - .createCompareStateCellContent(); - oldCellContent.getValue() - .forEach(colorContent -> compareCellContent - .setOldValue(createStringCellContent(String.format( - colorContent.getStringFormat(), - colorContent.getMultiColorValue())))); - - newCellContent.getValue() - .forEach(colorContent -> compareCellContent - .setNewValue(createStringCellContent(String.format( - colorContent.getStringFormat(), - colorContent.getMultiColorValue())))); - oldCell.setContent(compareCellContent); + private static CellContent createMultiColorDiffContent( + final MultiColorCellContent oldContent, + final MultiColorCellContent newContent) { + if (getPlainStringValue(oldContent) + .equals(getPlainStringValue(newContent))) { + oldContent.getValue() + .forEach(value -> value.setDisableMultiColor(false)); + return oldContent; } + return createCompareStateCellContent( + createStringCellContent(getStringValueIterable(oldContent)), + createStringCellContent(getStringValueIterable(newContent))); + } + + private static CompareStateCellContent createCompareStateCellContent( + final CellContent oldContent, final CellContent newContent) { + final CompareStateCellContent compareStateCellContent = TablemodelFactory.eINSTANCE + .createCompareStateCellContent(); + compareStateCellContent.setOldValue(oldContent); + compareStateCellContent.setNewValue(newContent); + return compareStateCellContent; } @Override diff --git a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend index 39e7354540..2b3a561bb1 100644 --- a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend +++ b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend @@ -240,10 +240,17 @@ class CellContentExtensions { !blank && !nullOrEmpty ] ?: #[] } + + static def dispatch Iterable getStringValueIterable(MultiColorCellContent content) { + return content?.value?.filterNull?.map[v | + String.format(v.stringFormat, v.multiColorValue).trim + ]?.filter[!blank && !nullOrEmpty] + } static def List getStringValueList(CellContent content) { return content.stringValueIterable.toList } + /** * @param text the text From e10e47b368a00f8bb15bd9778ad679bead85c56e Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Mon, 13 Jul 2026 13:46:31 +0200 Subject: [PATCH 2/3] Add unit test for create diff cell for multicolor content --- .../table/diff/TableStateDiffServiceTest.java | 97 +++++++++++++++++++ .../extensions/TableCellExtensions.xtend | 12 ++- .../extensions/TableExtensions.xtend | 33 +++++-- 3 files changed, 130 insertions(+), 12 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java b/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java index b6b0549bc3..d8d78c0f81 100644 --- a/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java +++ b/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java @@ -13,11 +13,18 @@ import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.set.model.planpro.Basisobjekte.Ur_Objekt; +import org.eclipse.set.model.tablemodel.MultiColorCellContent; +import org.eclipse.set.model.tablemodel.MultiColorContent; import org.eclipse.set.model.tablemodel.Table; +import org.eclipse.set.model.tablemodel.TableCell; +import org.eclipse.set.model.tablemodel.TableRow; +import org.eclipse.set.model.tablemodel.TablemodelFactory; import org.eclipse.set.model.tablemodel.extensions.TableExtensions; +import org.eclipse.set.model.tablemodel.extensions.TableRowExtensions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -366,4 +373,94 @@ public void testSimpleChange() { assertEquals("[1]/[B]", TableExtensions.getPlainStringValue(diffTable, 1, "B")); } + + @Test + void testMultiColorCellSimpleChange() { + final Table oldTable = TableExtensions.create("oldTable", "A"); + TableExtensions.addRow(LEADING_OBJECT, 0, oldTable, + createMultiColorTableCell("1", "%s (R)", true)); + TableExtensions.addRow(LEADING_OBJECT, 1, oldTable, ""); + + final Table newTable = EcoreUtil.copy(oldTable); + final List tableRows = TableExtensions.getTableRows(newTable); + TableRowExtensions.set(tableRows.get(0), + TableExtensions.getColumns(newTable).getFirst(), ""); + final MultiColorContent multiColorContent = createMultiColorContent("1", + "%s (L)", true); + TableRowExtensions.set(tableRows.get(1), + TableExtensions.getColumns(newTable).getFirst(), + List.of(multiColorContent), "/n"); + final Table diffTable = service.createDiffTable(oldTable, newTable); + System.out.println(TableExtensions.toDebugString(oldTable, 1)); + System.out.println(TableExtensions.toDebugString(newTable, 1)); + System.out.println(TableExtensions.toDebugString(diffTable, 10)); + final List diffRows = TableExtensions.getTableRows(diffTable); + assertEquals( + "

1 ​(R)​

", + TableRowExtensions.getRichTextValue(diffRows.get(0), 0)); + assertEquals( + "

1 ​(L)​

", + TableRowExtensions.getRichTextValue(diffRows.get(1), 0)); + } + + @Test + void testMultiColorCellChange() { + final Table oldTable = TableExtensions.create("oldTable", "A"); + TableExtensions.addRow(LEADING_OBJECT, 0, oldTable, + createMultiColorTableCell("1", "%s (R)", true)); + TableExtensions.addRow(LEADING_OBJECT, 1, oldTable, + createMultiColorTableCell("2", "%s (R)", true)); + + final Table newTable = EcoreUtil.copy(oldTable); + final List newTableRows = TableExtensions.getTableRows(newTable); + for (int i = 0; i < newTableRows.size(); i++) { + final MultiColorContent multiColorContent = createMultiColorContent( + String.valueOf(i + 2), "%s (L)", false); + TableRowExtensions.set(newTableRows.get(i), + TableExtensions.getColumns(newTable).getFirst(), + List.of(multiColorContent), "/n"); + } + // Test multi color cell in FINAL state + assertEquals( + "

22 (L)

", + TableRowExtensions.getRichTextValue(newTableRows.getFirst(), 0)); + final Table diffTable = service.createDiffTable(oldTable, newTable); + System.out.println(TableExtensions.toDebugString(oldTable, 1)); + System.out.println(TableExtensions.toDebugString(newTable, 1)); + System.out.println(TableExtensions.toDebugString(diffTable, 10)); + final List diffRows = TableExtensions.getTableRows(diffTable); + assertEquals( + "

2 ​(L)​

1 ​(R)​

", + TableRowExtensions.getRichTextValue(diffRows.get(0), 0)); + assertEquals( + "

3 ​(L)​

2 ​(R)​

", + TableRowExtensions.getRichTextValue(diffRows.get(1), 0)); + } + + private static TableCell createMultiColorTableCell( + final String multiColorValue, final String stringFormat, + final boolean disableMultiColor) { + final MultiColorCellContent multiColorCellContent = TablemodelFactory.eINSTANCE + .createMultiColorCellContent(); + multiColorCellContent.getValue() + .add(createMultiColorContent(multiColorValue, stringFormat, + disableMultiColor)); + final TableCell tableCell = TablemodelFactory.eINSTANCE + .createTableCell(); + tableCell.setContent(multiColorCellContent); + return tableCell; + } + + private static MultiColorContent createMultiColorContent( + final String multiColorValue, final String stringFormat, + final boolean disableMultiColor) { + final MultiColorContent multiColorContent = TablemodelFactory.eINSTANCE + .createMultiColorContent(); + multiColorContent.setMultiColorValue(multiColorValue); + multiColorContent.setStringFormat(stringFormat); + multiColorContent.setDisableMultiColor(disableMultiColor); + return multiColorContent; + + } + } diff --git a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableCellExtensions.xtend b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableCellExtensions.xtend index 2c561af017..4314e36d5d 100644 --- a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableCellExtensions.xtend +++ b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableCellExtensions.xtend @@ -11,6 +11,7 @@ package org.eclipse.set.model.tablemodel.extensions import java.util.Set import org.eclipse.set.model.tablemodel.TableCell import org.eclipse.set.model.tablemodel.TableRow +import org.eclipse.set.model.tablemodel.TablemodelFactory import org.eclipse.set.model.tablemodel.format.CellFormat import org.eclipse.set.model.tablemodel.format.TableformatFactory import org.eclipse.set.model.tablemodel.format.TextAlignment @@ -98,8 +99,9 @@ class TableCellExtensions { TextAlignment textAlignment) { cell.format.textAlignment = textAlignment } - - def static void setTopologicalCalcultation(TableCell cell, boolean isTopologicalCalculation) { + + def static void setTopologicalCalcultation(TableCell cell, + boolean isTopologicalCalculation) { cell.format.topologicalCalculation = isTopologicalCalculation } @@ -115,4 +117,10 @@ class TableCellExtensions { } return results.get(0) } + + def static void addContents(TableCell cell, String... contents) { + val stringContent = TablemodelFactory.eINSTANCE.createStringCellContent + stringContent.value.addAll(contents) + cell.content = stringContent + } } diff --git a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableExtensions.xtend b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableExtensions.xtend index 24eb86acae..70575171a0 100644 --- a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableExtensions.xtend +++ b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/TableExtensions.xtend @@ -12,6 +12,7 @@ import java.io.IOException import java.nio.file.Path import java.util.Collections import java.util.List +import org.apache.commons.lang3.StringUtils import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.resource.Resource @@ -28,6 +29,7 @@ import org.eclipse.set.model.tablemodel.FootnoteContainer import org.eclipse.set.model.tablemodel.RowGroup import org.eclipse.set.model.tablemodel.SimpleFootnoteContainer import org.eclipse.set.model.tablemodel.Table +import org.eclipse.set.model.tablemodel.TableCell import org.eclipse.set.model.tablemodel.TableRow import org.eclipse.set.model.tablemodel.TablemodelFactory import org.eclipse.set.model.tablemodel.TablemodelPackage @@ -35,14 +37,13 @@ import org.eclipse.set.model.tablemodel.format.TextAlignment import static extension org.eclipse.set.model.tablemodel.extensions.ColumnDescriptorExtensions.* import static extension org.eclipse.set.model.tablemodel.extensions.RowGroupExtensions.* +import static extension org.eclipse.set.model.tablemodel.extensions.TableCellExtensions.* import static extension org.eclipse.set.model.tablemodel.extensions.TableContentExtensions.* import static extension org.eclipse.set.model.tablemodel.extensions.TableRowExtensions.* import static extension org.eclipse.set.ppmodel.extensions.EObjectExtensions.* import static extension org.eclipse.set.ppmodel.extensions.UrObjectExtensions.* import static extension org.eclipse.set.ppmodel.extensions.utils.IterableExtensions.* import static extension org.eclipse.set.utils.StringExtensions.* -import org.eclipse.set.model.tablemodel.extensions.TableExtensions.FootnoteInfo -import org.apache.commons.lang3.StringUtils; /** * Extensions for {@link Table}. @@ -157,14 +158,28 @@ class TableExtensions { */ static def TableRow addRow(Ur_Objekt leadingObject, int leadingObjectIndex, Table table, String... values) { + + val cells = table.columns.indexed.map [ + val cell = value.createTableCell + cell.addContents(values.get(key)) + return cell + ] + return addRow(leadingObject, leadingObjectIndex, table, cells) + } + + static def TableRow addRow(Ur_Objekt leadingObject, int leadingObjectIndex, + Table table, TableCell... cells) { val newRowGroup = TablemodelFactory.eINSTANCE.createRowGroup val newRow = TablemodelFactory.eINSTANCE.createTableRow newRowGroup.rows.add(newRow) newRowGroup.leadingObject = leadingObject newRowGroup.leadingObjectIndex = leadingObjectIndex table.tablecontent.rowgroups.add(newRowGroup) - table.columns.forEach[newRow.cells.add(createTableCell)] - values.indexed.forEach[newRow.set(key, value)] + cells.indexed.forEach [ + val col = table.columns.get(key) + value.columndescriptor = col + ] + newRow.cells.addAll(cells) return newRow } @@ -562,9 +577,8 @@ class TableExtensions { val compareFootnote = compareTableFootnotes.findFirst [ cF | cF.sameBv(mF) ] - val existsAsNormalFootnote = footnotes.empty - ? false - : footnotes.exists[nF|nF.sameBv(mF)] + val existsAsNormalFootnote = footnotes.empty ? false : footnotes. + exists[nF|nF.sameBv(mF)] compareFootnote === null && !existsAsNormalFootnote ].forEach[changedInCompare = true] @@ -574,9 +588,8 @@ class TableExtensions { val compareFootnote = mainTableFootnotes.findFirst [ mF | mF.sameBv(cF) ] - val existsAsNormalFootnote = footnotes.empty - ? false - : footnotes.exists[nF|nF.sameBv(cF)] + val existsAsNormalFootnote = footnotes.empty ? false : footnotes. + exists[nF|nF.sameBv(cF)] compareFootnote === null && !existsAsNormalFootnote ].map [ new FootnoteInfo(null, FootnoteType.COMMON_FOOTNOTE, null, true, From 1d0b5317ce45427b36bf69d57dbaa393ff587356 Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Mon, 13 Jul 2026 15:29:55 +0200 Subject: [PATCH 3/3] Formatting --- .../set/feature/table/diff/TableStateDiffServiceTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java b/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java index d8d78c0f81..26a90d29cc 100644 --- a/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java +++ b/java/bundles/org.eclipse.set.feature.table.test/src/org/eclipse/set/feature/table/diff/TableStateDiffServiceTest.java @@ -412,7 +412,8 @@ void testMultiColorCellChange() { createMultiColorTableCell("2", "%s (R)", true)); final Table newTable = EcoreUtil.copy(oldTable); - final List newTableRows = TableExtensions.getTableRows(newTable); + final List newTableRows = TableExtensions + .getTableRows(newTable); for (int i = 0; i < newTableRows.size(); i++) { final MultiColorContent multiColorContent = createMultiColorContent( String.valueOf(i + 2), "%s (L)", false); @@ -423,7 +424,8 @@ void testMultiColorCellChange() { // Test multi color cell in FINAL state assertEquals( "

22 (L)

", - TableRowExtensions.getRichTextValue(newTableRows.getFirst(), 0)); + TableRowExtensions.getRichTextValue(newTableRows.getFirst(), + 0)); final Table diffTable = service.createDiffTable(oldTable, newTable); System.out.println(TableExtensions.toDebugString(oldTable, 1)); System.out.println(TableExtensions.toDebugString(newTable, 1));