Skip to content

Commit c3573fd

Browse files
committed
441300 TableOrganizer: Cannot invoke "org.eclipse.scout.rt.client.ui.basic.table.columns.IColumn.getColumnId()" because "col" is null
TableAdapter.ts should always send a columnId. If the column is no longer known by the JsonTable adapter, simply ignore the event. Similar handling as in JsonTree.
1 parent 29ad595 commit c3573fd

File tree

3 files changed

+109
-5
lines changed
  • org.eclipse.scout.rt.client/src/main/java/org/eclipse/scout/rt/client/ui/basic/table/organizer
  • org.eclipse.scout.rt.ui.html.test/src/test/java/org/eclipse/scout/rt/ui/html/json/table
  • org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/table

3 files changed

+109
-5
lines changed

org.eclipse.scout.rt.client/src/main/java/org/eclipse/scout/rt/client/ui/basic/table/organizer/ITableOrganizer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2023 BSI Business Systems Integration AG
2+
* Copyright (c) 2010, 2026 BSI Business Systems Integration AG
33
*
44
* This program and the accompanying materials are made
55
* available under the terms of the Eclipse Public License 2.0
@@ -24,7 +24,7 @@ public interface ITableOrganizer {
2424

2525
boolean isColumnModifiable(IColumn column);
2626

27-
void addColumn(IColumn<?> column);
27+
void addColumn(IColumn column);
2828

2929
void removeColumn(IColumn column);
3030

org.eclipse.scout.rt.ui.html.test/src/test/java/org/eclipse/scout/rt/ui/html/json/table/JsonTableTest.java

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2023 BSI Business Systems Integration AG
2+
* Copyright (c) 2010, 2026 BSI Business Systems Integration AG
33
*
44
* This program and the accompanying materials are made
55
* available under the terms of the Eclipse Public License 2.0
@@ -26,9 +26,13 @@
2626
import org.eclipse.scout.rt.client.ui.basic.table.ITableRow;
2727
import org.eclipse.scout.rt.client.ui.basic.table.ITableRowFilter;
2828
import org.eclipse.scout.rt.client.ui.basic.table.TableEvent;
29+
import org.eclipse.scout.rt.client.ui.basic.table.TableOrganizer;
2930
import org.eclipse.scout.rt.client.ui.basic.table.columns.AbstractStringColumn;
3031
import org.eclipse.scout.rt.client.ui.basic.table.columns.IColumn;
32+
import org.eclipse.scout.rt.client.ui.basic.table.organizer.ITableOrganizer;
3133
import org.eclipse.scout.rt.client.ui.basic.table.userfilter.UserTableRowFilter;
34+
import org.eclipse.scout.rt.platform.util.ImmutablePair;
35+
import org.eclipse.scout.rt.platform.util.Pair;
3236
import org.eclipse.scout.rt.platform.util.StringUtility;
3337
import org.eclipse.scout.rt.shared.services.lookup.ILookupRow;
3438
import org.eclipse.scout.rt.shared.services.lookup.LookupRow;
@@ -1621,6 +1625,93 @@ public void testTriggerStructureChangesDuringInitColumn() {
16211625
.anyMatch(p -> "columnStructureChanged".equals(p.getType())));
16221626
}
16231627

1628+
@Test
1629+
public void testColumnOrganizeAction() {
1630+
List<Pair<String, IColumn>> organizeActions = new ArrayList<>();
1631+
Table table = new Table() {
1632+
@Override
1633+
protected ITableOrganizer createTableOrganizer() {
1634+
return new TableOrganizer(this) {
1635+
1636+
@Override
1637+
public void addColumn(IColumn column) {
1638+
organizeActions.add(ImmutablePair.of("add", column));
1639+
}
1640+
1641+
@Override
1642+
public void removeColumn(IColumn column) {
1643+
organizeActions.add(ImmutablePair.of("remove", column));
1644+
}
1645+
1646+
@Override
1647+
public void modifyColumn(IColumn column) {
1648+
organizeActions.add(ImmutablePair.of("modify", column));
1649+
}
1650+
};
1651+
}
1652+
};
1653+
table.init();
1654+
1655+
IColumn col = table.getColumns().getFirst();
1656+
1657+
JsonTable<ITable> jsonTable = m_uiSession.createJsonAdapter(table, new JsonAdapterMock());
1658+
jsonTable.toJson();
1659+
1660+
String validColumnId = jsonTable.getColumnId(col);
1661+
assertNotNull(validColumnId);
1662+
assertEquals(0, organizeActions.size());
1663+
1664+
// ----------
1665+
1666+
JsonEvent addValidColumnEvent = createJsonColumnOrganizeActionEvent("add", validColumnId);
1667+
jsonTable.handleUiEvent(addValidColumnEvent);
1668+
1669+
assertEquals(1, organizeActions.size());
1670+
assertEquals("add", organizeActions.getFirst().getLeft());
1671+
assertSame(col, organizeActions.getFirst().getRight());
1672+
organizeActions.clear();
1673+
1674+
JsonEvent addInvalidColumnEvent = createJsonColumnOrganizeActionEvent("add", "INVALID_COLUM_ID");
1675+
jsonTable.handleUiEvent(addInvalidColumnEvent);
1676+
1677+
assertEquals(0, organizeActions.size());
1678+
1679+
// ----------
1680+
1681+
JsonEvent removeValidColumnEvent = createJsonColumnOrganizeActionEvent("remove", validColumnId);
1682+
jsonTable.handleUiEvent(removeValidColumnEvent);
1683+
1684+
assertEquals(1, organizeActions.size());
1685+
assertEquals("remove", organizeActions.getFirst().getLeft());
1686+
assertSame(col, organizeActions.getFirst().getRight());
1687+
organizeActions.clear();
1688+
1689+
JsonEvent removeInvalidColumnEvent = createJsonColumnOrganizeActionEvent("remove", "INVALID_COLUM_ID");
1690+
jsonTable.handleUiEvent(removeInvalidColumnEvent);
1691+
1692+
assertEquals(0, organizeActions.size());
1693+
1694+
// ----------
1695+
1696+
JsonEvent modifyValidColumnEvent = createJsonColumnOrganizeActionEvent("modify", validColumnId);
1697+
jsonTable.handleUiEvent(modifyValidColumnEvent);
1698+
1699+
assertEquals(1, organizeActions.size());
1700+
assertEquals("modify", organizeActions.getFirst().getLeft());
1701+
assertSame(col, organizeActions.getFirst().getRight());
1702+
organizeActions.clear();
1703+
1704+
JsonEvent modifyInvalidColumnEvent = createJsonColumnOrganizeActionEvent("modify", "INVALID_COLUM_ID");
1705+
jsonTable.handleUiEvent(modifyInvalidColumnEvent);
1706+
1707+
assertEquals(0, organizeActions.size());
1708+
1709+
// ----------
1710+
1711+
JsonEvent invalidActionEvent = createJsonColumnOrganizeActionEvent("INVALID_ACTION", validColumnId);
1712+
assertThrows(IllegalArgumentException.class, () -> jsonTable.handleUiEvent(invalidActionEvent));
1713+
}
1714+
16241715
public static Table createTableFixture(int numRows) {
16251716
Table table = new Table();
16261717
table.fill(numRows);
@@ -1667,4 +1758,12 @@ public static JsonEvent createJsonColumnMovedEvent(String columnId, int index) t
16671758
data.put("index", index);
16681759
return new JsonEvent(tableId, JsonTable.EVENT_COLUMN_MOVED, data);
16691760
}
1761+
1762+
public static JsonEvent createJsonColumnOrganizeActionEvent(String actionId, String columnId) throws JSONException {
1763+
String tableId = "x"; // never used
1764+
JSONObject data = new JSONObject();
1765+
data.put("action", actionId);
1766+
data.put("columnId", columnId);
1767+
return new JsonEvent(tableId, JsonTable.EVENT_COLUMN_ORGANIZE_ACTION, data);
1768+
}
16701769
}

org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/table/JsonTable.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
2+
* Copyright (c) 2010, 2026 BSI Business Systems Integration AG
33
*
44
* This program and the accompanying materials are made
55
* available under the terms of the Eclipse Public License 2.0
@@ -681,7 +681,12 @@ protected void handleUiPropertyChange(String propertyName, JSONObject data) {
681681
protected void handleUiColumnOrganizeAction(JsonEvent event) {
682682
JSONObject data = event.getData();
683683
String action = data.getString("action");
684-
IColumn<?> column = extractColumn(data);
684+
String columnId = data.optString(PROP_COLUMN_ID, null);
685+
IColumn<?> column = optColumn(columnId);
686+
if (column == null) {
687+
LOG.info("Requested column with ID {} doesn't exist. Skip columnOrganizeAction event. [action={}]", columnId, action);
688+
return;
689+
}
685690
switch (action) {
686691
case "add":
687692
getModel().getUIFacade().fireOrganizeColumnAddFromUI(column);

0 commit comments

Comments
 (0)