From 4d4049fcd1c71b4948437a9327ad0b0a25ddba08 Mon Sep 17 00:00:00 2001 From: Ainur <59531286+yagudin10@users.noreply.github.com> Date: Tue, 4 Aug 2026 15:55:27 +0300 Subject: [PATCH 1/4] dbeaver/pro#10054 fix returning default values for non-object properties (#4510) Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com> Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com> --- .../io/cloudbeaver/model/WebPropertyInfo.java | 89 +++++++++---------- 1 file changed, 41 insertions(+), 48 deletions(-) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebPropertyInfo.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebPropertyInfo.java index 71a81511a0..56f9990210 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebPropertyInfo.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebPropertyInfo.java @@ -42,63 +42,58 @@ import java.util.*; * Web connection info */ public class WebPropertyInfo { - private WebSession session; - private DBPPropertyDescriptor property; - private DBPPropertySource propertySource; - private boolean showProtected; + @NotNull + private final WebSession session; + @NotNull + private final DBPPropertyDescriptor property; + @Nullable + private final DBPPropertySource propertySource; - private Object[] validValues; - - private String[] supportedConfigurationTypes = new String[0]; - - private Object defaultValue; - - public WebPropertyInfo(WebSession session, DBPPropertyDescriptor property, DBPPropertySource propertySource) { + public WebPropertyInfo( + @NotNull WebSession session, + @NotNull DBPPropertyDescriptor property, + @Nullable DBPPropertySource propertySource + ) { this.session = session; this.property = property; this.propertySource = propertySource; } - public WebPropertyInfo(WebSession session, DBPPropertyDescriptor property) { - this.session = session; - this.property = property; - } - - public boolean isShowProtected() { - return showProtected; - } - - public void setShowProtected(boolean showProtected) { - this.showProtected = showProtected; + public WebPropertyInfo(@NotNull WebSession session, @NotNull DBPPropertyDescriptor property) { + this(session, property, null); } /////////////////////////////////// // General properties /////////////////////////////////// + @NotNull @Property public String getId() { return CommonUtils.toString(property.getId()); } + @NotNull @Property public String getDisplayName() { - if (property instanceof DBPNamedObjectLocalized) { - return ((DBPNamedObjectLocalized) property).getLocalizedName(session.getLocale()); + if (property instanceof DBPNamedObjectLocalized localized) { + return localized.getLocalizedName(session.getLocale()); } else { return property.getDisplayName(); } } + @Nullable @Property public String getDescription() { - if (property instanceof DBPObjectWithDescriptionLocalized) { - return ((DBPObjectWithDescriptionLocalized) property).getLocalizedDescription(session.getLocale()); + if (property instanceof DBPObjectWithDescriptionLocalized localized) { + return localized.getLocalizedDescription(session.getLocale()); } else { return property.getDescription(); } } + @Nullable @Property public String getHint() { return property.getHint(); @@ -109,38 +104,47 @@ public class WebPropertyInfo { return property instanceof ObjectPropertyDescriptor ? ((ObjectPropertyDescriptor) property).getOrderNumber() : -1; } + @Nullable @Property public String getCategory() { return property.getCategory(); } + @Nullable @Property public String getType() { return getDataType(); } + @Nullable @Property public String getDataType() { Class dataType = property.getDataType(); return dataType == null ? null : dataType.getSimpleName(); } + @NotNull @Property public PropertyLength getLength() { return property.getLength(); } + @Nullable @Property public Object getDefaultValue() throws DBException { - var defaultValue = property.getDefaultValue() == null ? this.defaultValue : property.getDefaultValue(); - return defaultValue == null ? getValue() : defaultValue; + Object defaultValue = property.getDefaultValue(); + if (property instanceof ObjectPropertyDescriptor && defaultValue == null) { + return getValue(); + } + return defaultValue; } + @Nullable @Property public Object getValue() throws DBException { Object value = propertySource == null ? null : propertySource.getPropertyValue(session.getProgressMonitor(), property.getId()); if (property instanceof ObjectPropertyDescriptor opd && - (!showProtected && opd.isPassword() || opd.isHidden()) + (opd.isPassword() || opd.isHidden()) ) { return maskValue(value); } else if (property instanceof PropertyDescriptor pd) { @@ -152,6 +156,7 @@ public class WebPropertyInfo { return value == null ? null : makePropertyValue(value); } + @Nullable @Property public Object[] getValidValues() { if (property instanceof IPropertyValueListProvider) { @@ -164,17 +169,18 @@ public class WebPropertyInfo { } return validValues; } - return validValues; } - return validValues; + return null; } + @NotNull @Property public String[] getFeatures() { String[] features = property.getFeatures(); return features == null ? new String[0] : features; } + @NotNull @Property public String[] getSupportedConfigurationTypes() { if (property instanceof ProviderPropertyDescriptor) { @@ -182,7 +188,7 @@ public class WebPropertyInfo { .map(DBPDriverConfigurationType::toString) .toArray(String[]::new); } - return supportedConfigurationTypes; + return new String[0]; } @Property @@ -203,12 +209,14 @@ public class WebPropertyInfo { return false; } + @NotNull @Override public String toString() { return CommonUtils.toString(property.getId()); } - private Object makePropertyValue(Object value) { + @Nullable + private Object makePropertyValue(@Nullable Object value) { if (value == null) { return null; // } else if (value instanceof DBSObject) { @@ -290,21 +298,6 @@ public class WebPropertyInfo { return conditions; } - - //TODO: delete after refactoring on front-end - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } - //TODO: delete after refactoring on front-end - public void setValidValues(Object[] validValues) { - this.validValues = validValues; - } - - //TODO: delete after refactoring on front-end - public void setSupportedConfigurationTypes(String[] supportedConfigurationTypes) { - this.supportedConfigurationTypes = supportedConfigurationTypes; - } - public record Condition(@NotNull String expression, @NotNull Type conditionType) { public enum Type { HIDE, From 317ba5486a687449ec32eb650f314eabf74cdeab Mon Sep 17 00:00:00 2001 From: alex <48489896+devnaumov@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:14:12 +0200 Subject: [PATCH 2/4] dbeaver/pro#8482 fetch conditions for handlers (#4475) Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com> Co-authored-by: Ainur <59531286+yagudin10@users.noreply.github.com> --- .../fragments/UserConnectionNetworkHandlerProperties.gql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webapp/packages/core-sdk/src/queries/fragments/UserConnectionNetworkHandlerProperties.gql b/webapp/packages/core-sdk/src/queries/fragments/UserConnectionNetworkHandlerProperties.gql index 7da8a6818c..0dacdd9adb 100644 --- a/webapp/packages/core-sdk/src/queries/fragments/UserConnectionNetworkHandlerProperties.gql +++ b/webapp/packages/core-sdk/src/queries/fragments/UserConnectionNetworkHandlerProperties.gql @@ -11,4 +11,7 @@ fragment UserConnectionNetworkHandlerProperties on ObjectPropertyInfo { length features required -} \ No newline at end of file + conditions { + ...Condition + } +} From fb43b0f56737c98bc8611672319fe05faf9c0e09 Mon Sep 17 00:00:00 2001 From: Ruslan Musaev <43766501+HocKu7@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:16:45 +0200 Subject: [PATCH 3/4] dbeaver/pro#9076 clear log for ws and long pooling (#4514) Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com> Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com> --- .../server/websockets/CBEventsLongPollingServlet.java | 2 +- .../cloudbeaver/server/websockets/CBEventsWebSocket.java | 7 ++++++- .../server/websockets/CBWebSocketServerConfigurator.java | 5 +++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java index fdc5eaf576..46432e8550 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java @@ -168,7 +168,7 @@ public class CBEventsLongPollingServlet extends HttpServlet { log.debug("LP request rejected: access token expired"); sendError(resp, HttpConstants.CODE_TOKEN_EXPIRED, e.getMessage()); } catch (SecurityException e) { - log.warn("LP session resolve failed", e); + log.debug("LP request rejected: " + e.getMessage()); sendError(resp, HttpConstants.CODE_UNAUTHORIZED, e.getMessage()); } return null; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java index 131ac00043..f3618e3b80 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 DBeaver Corp and others + * Copyright (C) 2010-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,6 +47,11 @@ public class CBEventsWebSocket extends CBAbstractWebSocket implements CBWebSessi } else { this.webSession = (BaseWebSession) session.getUserProperties() .get(CBWebSocketServerConfigurator.PROP_WEB_SESSION); + if (this.webSession == null) { + log.debug("No web session for websocket connection, closing"); + close(); + return; + } this.webSession.addEventHandler(this); handleEvent(new WSSocketConnectedEvent(webSession.getApplication().getApplicationRunId())); log.debug("EventWebSocket connected to the " + webSession.getSessionId() + " session"); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBWebSocketServerConfigurator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBWebSocketServerConfigurator.java index b427b9d73d..3c0bda182d 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBWebSocketServerConfigurator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBWebSocketServerConfigurator.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2025 DBeaver Corp and others + * Copyright (C) 2010-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,7 +88,8 @@ public class CBWebSocketServerConfigurator extends ServerEndpointConfig.Configur throw new RuntimeException(e.getMessage(), e); } if (sec.getUserProperties().get(PROP_WEB_SESSION) == null) { - throw new RuntimeException("No web session found for websocket request"); + // no throwing exception here. will be handled in onOpen + log.debug("No web session found for websocket request, connection will be closed on open"); } } From 1b8ea64cd09dc09bd1e64c4f46a41b28c6d594ad Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 4 Aug 2026 17:34:39 +0200 Subject: [PATCH 4/4] dbeaver/pro#10062 moves focused cell after pin/unpin (#4513) Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com> --- .../src/DataGrid/DataGridTable.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx index 2025d477e7..18ec20b2a4 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridTable.tsx @@ -210,15 +210,21 @@ export const DataGridTable = observer(function DataGridT }, unpinColumns(keys) { tableData.view.unpinColumns(keys.map(key => key.column)); + // re-select the focused cell so the highlight follows the column to its new position after reordering + handlers.focusCell(selectionAction.getFocusedElement(), false, true); }, pinColumns(keys) { tableData.view.pinColumns(keys.map(key => key.column)); + // re-select the focused cell so the highlight follows the column to its new position after reordering + handlers.focusCell(selectionAction.getFocusedElement(), false, true); }, isColumnPinned(key) { return tableData.view.isColumnPinned(key.column); }, unpinAllColumns() { tableData.view.unpinAllColumns(); + // re-select the focused cell so the highlight follows the column to its new position after reordering + handlers.focusCell(selectionAction.getFocusedElement(), false, true); }, hasPinnedColumns() { return tableData.view.hasPinnedColumns();