From 71e6ad7111740dbefb044c260e25d7f0f00bfac9 Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Thu, 15 Jan 2026 09:34:25 +0100 Subject: [PATCH 1/2] Fix cancel table transform issue --- .../set/feature/table/ToolboxTableView.java | 52 +++++++++------ .../table/internal/TableServiceImpl.java | 65 ++++++++++++------- .../set/services/table/TableService.java | 24 +++++-- .../src/org/eclipse/set/utils/BasePart.java | 7 +- 4 files changed, 100 insertions(+), 48 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java index 2be18f648b..d1d39f8d0a 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java @@ -26,6 +26,7 @@ import org.apache.commons.lang3.ThreadUtils; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.e4.core.services.nls.Translation; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.model.application.ui.basic.MPart; @@ -96,6 +97,7 @@ import org.eclipse.set.services.export.ExportService; import org.eclipse.set.services.export.TableCompileService; import org.eclipse.set.services.table.TableService; +import org.eclipse.set.services.table.TableService.TableRendereUtil; import org.eclipse.set.utils.BasePart; import org.eclipse.set.utils.RefreshAction; import org.eclipse.set.utils.SelectableAction; @@ -315,7 +317,7 @@ public void accept(final SelectedControlAreaChangedEvent t) { .equalsIgnoreCase(Events.COMPARE_MODEL_LOADED)) { return; } - updateModel(getToolboxPart()); + updateModel(getToolboxPart(), transformToTableModel()); }; getBroker().subscribe(Events.COMPARE_MODEL_LOADED, @@ -362,15 +364,19 @@ private Table transformToTableModel() { } private void updateTableView(final List tableCategories) { - tableService.updateTable(this, tableCategories, () -> { - updateModel(getToolboxPart()); - natTable.doCommand(new RowHeightResetCommand()); - natTable.refresh(); - updateButtons(); - - // Update footnotes - updateFootnotes(); - }, tableInstances::clear); + tableService.updateTable(this, tableCategories, new TableRendereUtil( + () -> transformToTableModel(), transformedTable -> { + if (transformedTable == null) { + return; + } + updateModel(getToolboxPart(), transformedTable); + natTable.doCommand(new RowHeightResetCommand()); + natTable.refresh(); + updateButtons(); + + // Update footnotes + updateFootnotes(); + })); } private void updateFootnotes() { @@ -405,7 +411,8 @@ private void updateFootnotes() { } @Override - protected void createView(final Composite parent) { + protected void createView(final Composite parent) + throws OperationCanceledException { tableInfo = tableService.getTableInfo(this); // initialize table type tableType = getModelSession().getTableType(); @@ -413,16 +420,23 @@ protected void createView(final Composite parent) { .stream() .map(Pair::getSecond) .collect(Collectors.toSet()); - tableService.updateTable(this, Collections.emptyList(), - () -> updateModel(getToolboxPart()), tableInstances::clear); - subcribeTriggerResortEvent(); + new TableRendereUtil(this::transformToTableModel, + transformedTable -> { + if (transformedTable == null) { + return; + } + updateModel(getToolboxPart(), transformedTable); + })); + // tableService.updateTable(this, Collections.emptyList(), + // () -> updateModel(getToolboxPart()), tableInstances::clear); + // if the table was not created (possibly the creation was canceled by // the user), we stop here with creating the view if (table == null) { - return; + throw new OperationCanceledException(); } - + subcribeTriggerResortEvent(); final ColumnDescriptor rootColumnDescriptor = table .getColumndescriptors() .get(0); @@ -803,18 +817,16 @@ void updateButtons() { getBanderole().setEnableExport(!getModelSession().isDirty()); } - void updateModel(final MPart part) { + void updateModel(final MPart part, final Table transformedTable) { // update banderole getBanderole().setTableType(tableType); - - table = transformToTableModel(); + table = transformedTable; // flag creation MApplicationElementExtensions.setViewState(part, ToolboxViewState.CREATED); tableInstances.clear(); tableInstances.addAll(TableExtensions.getTableRows(table)); - } private void addMenuItems() { diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java index a1e1ae40c4..5d6ba6ac2d 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java @@ -25,6 +25,7 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -129,7 +130,7 @@ public final class TableServiceImpl implements TableService { private final Map modelServiceMap = new ConcurrentHashMap<>(); private final Map diffServiceMap = new ConcurrentHashMap<>(); - private static final Queue> transformTableThreads = new LinkedList<>(); + private static final Queue> transformTableThreads = new LinkedList<>(); private static final Set nonTransformableTables = new HashSet<>(); private static final String EMPTY = "empty"; //$NON-NLS-1$ @@ -230,7 +231,8 @@ public TableInfo getTableInfo(final BasePart part) { @Override public TableInfo getTableInfo(final String shortcut) { - return getAvailableTables().stream() + return modelServiceMap.keySet() + .stream() .filter(table -> table.shortcut().equalsIgnoreCase(shortcut)) .findFirst() .orElse(null); @@ -503,13 +505,23 @@ public Table transformToTable(final TableInfo tableInfo, for (final Pair cacheKey : cacheKeys) { final String areaId = cacheKey.getKey(); final String areaCacheKey = cacheKey.getValue(); - Table table = (Table) cache.getIfPresent(areaCacheKey); + final Object cachedObj = cache.get(areaCacheKey, () -> { + final Object transformed = loadTransform(tableInfo, tableType, + modelSession, areaId); + if (transformed != null + && transformed instanceof final Table transformedTable) { + saveTableToCache(transformedTable, modelSession, + containerId, tableInfo, tableType, areaCacheKey); + return transformedTable; + } + return MissingSupplier.MISSING_VALUE; + }); + final Table table = cachedObj != null + && Table.class.isInstance(cachedObj) ? (Table) cachedObj + : null; if (table == null) { - table = (Table) loadTransform(tableInfo, tableType, - modelSession, areaId); - saveTableToCache(table, modelSession, containerId, tableInfo, - tableType, areaCacheKey); + return null; } if (resultTable == null) { resultTable = EcoreUtil.copy(table); @@ -576,7 +588,7 @@ private void saveTableToCache(final Table table, @Override public void updateTable(final BasePart tablePart, final List tableCategories, - final Runnable updateTableHandler, final Runnable clearInstance) { + final TableRendereUtil rendereUtil) { // Find which table categories should be update final List tablePrefixes = List .of(ToolboxConstants.ESTW_TABLE_PART_ID_PREFIX, @@ -601,7 +613,7 @@ public void updateTable(final BasePart tablePart, .map(MPart.class::cast) .toList(); - transformTableThreads.add(new Pair<>(tablePart, updateTableHandler)); + transformTableThreads.add(new Pair<>(tablePart, rendereUtil)); final List parts = transformTableThreads.stream() .map(pair -> pair.getKey().getToolboxPart()) .toList(); @@ -623,12 +635,6 @@ public void updateTable(final BasePart tablePart, logger.error(e.toString(), e); throw new RuntimeException(e); } catch (final InterruptedException e) { - clearInstance.run(); - transformTableThreads - .forEach(pair -> MApplicationElementExtensions - .setViewState(pair.getKey().getToolboxPart(), - ToolboxViewState.CANCELED)); - Thread.currentThread().interrupt(); } } @@ -647,18 +653,32 @@ private IRunnableWithProgress createProgressMonitor() { Threads.stopCurrentOnCancel(monitor); // Wait for table transform - for (Pair transformThread; (transformThread = transformTableThreads + for (Pair transformThread; (transformThread = transformTableThreads .poll()) != null;) { final TableInfo tableInfo = getTableInfo( transformThread.getKey()); final TableNameInfo tableNameInfo = getTableNameInfo(tableInfo); + final BasePart tablePart = transformThread.getKey(); + final Consumer updateTableUIAction = transformThread + .getValue() + .updateTableUIAction(); monitor.subTask(tableNameInfo.getFullDisplayName()); - Display.getDefault().syncExec(transformThread.getValue()); + final Table transformedTable = transformThread.getValue() + .transfromTableAction() + .get(); + Display.getDefault() + .asyncExec(() -> updateTableUIAction + .accept(transformedTable)); + // Display.getDefault().syncExec(transformThread.getValue()); monitor.worked(1); + if (monitor.isCanceled()) { + MApplicationElementExtensions.setViewState( + tablePart.getToolboxPart(), + ToolboxViewState.CANCELED); + Thread.currentThread().interrupt(); + } } - if (monitor.isCanceled()) { - throw new InterruptedException(); - } + // stop progress monitor.done(); logger.info("ProgressMonitorDialog done."); //$NON-NLS-1$ @@ -678,7 +698,9 @@ public Map transformTables(final IProgressMonitor monitor, try { final TableNameInfo nameInfo = getTableNameInfo(tableInfo); monitor.subTask(nameInfo.getFullDisplayName()); - final Table table = createDiffTable(tableInfo, tableType, + final Table table = transformToTable(tableInfo, tableType, + sessionService.getLoadedSession( + ToolboxFileRole.SESSION), controlAreaIds); while (!TableService.isTransformComplete(tableInfo, null)) { Thread.sleep(2000); @@ -690,7 +712,6 @@ public Map transformTables(final IProgressMonitor monitor, } } - monitor.done(); return result; } diff --git a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java index 741b42163e..9b55434289 100644 --- a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java +++ b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java @@ -13,7 +13,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.function.Supplier; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.set.basis.IModelSession; @@ -34,6 +36,20 @@ * @author rumpf */ public interface TableService { + + /** + * Helper class for transform and reload table + * + * @param transfromTableAction + * create table from PlanPro model data + * @param updateTableUIAction + * update table ui + */ + public static record TableRendereUtil(Supplier
transfromTableAction, + Consumer
updateTableUIAction) { + + } + /** * Extract the shortcut from an configuration element. * @@ -148,13 +164,11 @@ Map transformTables(IProgressMonitor monitor, * @param tableCategories * the list of table category. when the list is empty, then * update all table - * @param updateTableHandler - * the update table handler - * @param clearInstance - * the clear table instance handler + * @param rendereUtil + * the {@link TableRendereUtil} */ void updateTable(BasePart part, List tableCategories, - Runnable updateTableHandler, Runnable clearInstance); + TableRendereUtil rendereUtil); /** * Get fixed columns diff --git a/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java b/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java index 74e359ad9b..54740fdeb7 100644 --- a/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java +++ b/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java @@ -10,6 +10,7 @@ import java.util.List; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.core.services.nls.Translation; import org.eclipse.e4.ui.model.application.MApplication; @@ -296,6 +297,9 @@ public void accept(final SessionDirtyChanged e) { }; ToolboxEvents.subscribe(broker, SessionDirtyChanged.class, sessionDirtyHandler); + } catch (final OperationCanceledException canceledException) { + LOGGER.debug( + "Rendere part canceled: " + canceledException.getMessage()); } catch (final Exception e) { dialogService.error(shell, e); } @@ -326,7 +330,8 @@ protected Control createTitle(final Composite parent) { return createBanderole(parent).getControl(); } - protected abstract void createView(Composite parent); + protected abstract void createView(Composite parent) + throws OperationCanceledException; protected Banderole getBanderole() { return banderole; From ac61ba0078bca36e3432aa59bcf862ed62ef7f08 Mon Sep 17 00:00:00 2001 From: TruongQuangSB Date: Thu, 15 Jan 2026 13:12:26 +0100 Subject: [PATCH 2/2] Remove OperationCancelException --- .../org/eclipse/set/feature/table/ToolboxTableView.java | 8 ++------ .../src/org/eclipse/set/utils/BasePart.java | 7 +------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java index d1d39f8d0a..59ea135632 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java @@ -26,7 +26,6 @@ import org.apache.commons.lang3.ThreadUtils; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.e4.core.services.nls.Translation; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.model.application.ui.basic.MPart; @@ -411,8 +410,7 @@ private void updateFootnotes() { } @Override - protected void createView(final Composite parent) - throws OperationCanceledException { + protected void createView(final Composite parent) { tableInfo = tableService.getTableInfo(this); // initialize table type tableType = getModelSession().getTableType(); @@ -428,13 +426,11 @@ protected void createView(final Composite parent) } updateModel(getToolboxPart(), transformedTable); })); - // tableService.updateTable(this, Collections.emptyList(), - // () -> updateModel(getToolboxPart()), tableInstances::clear); // if the table was not created (possibly the creation was canceled by // the user), we stop here with creating the view if (table == null) { - throw new OperationCanceledException(); + return; } subcribeTriggerResortEvent(); final ColumnDescriptor rootColumnDescriptor = table diff --git a/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java b/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java index 54740fdeb7..74e359ad9b 100644 --- a/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java +++ b/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/BasePart.java @@ -10,7 +10,6 @@ import java.util.List; -import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.core.services.nls.Translation; import org.eclipse.e4.ui.model.application.MApplication; @@ -297,9 +296,6 @@ public void accept(final SessionDirtyChanged e) { }; ToolboxEvents.subscribe(broker, SessionDirtyChanged.class, sessionDirtyHandler); - } catch (final OperationCanceledException canceledException) { - LOGGER.debug( - "Rendere part canceled: " + canceledException.getMessage()); } catch (final Exception e) { dialogService.error(shell, e); } @@ -330,8 +326,7 @@ protected Control createTitle(final Composite parent) { return createBanderole(parent).getControl(); } - protected abstract void createView(Composite parent) - throws OperationCanceledException; + protected abstract void createView(Composite parent); protected Banderole getBanderole() { return banderole;