Skip to content

Commit

Permalink
dbeaver#22963 Merge branch 'devel' into '3rd_pr_official'
Browse files Browse the repository at this point in the history
  • Loading branch information
longhaseng52 committed Mar 28, 2024
1 parent 06d75ef commit 032190b
Show file tree
Hide file tree
Showing 245 changed files with 6,056 additions and 3,265 deletions.
11 changes: 11 additions & 0 deletions features/org.jkiss.dbeaver.rcp.feature/feature.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,16 @@
<plugin id="com.ibm.icu.base" version="0.0.0"/>
<!-- Network -->
<plugin id="org.eclipse.ui.net" version="0.0.0"/>
<plugin id="org.eclipse.core.net" version="0.0.0"/>
<plugin id="org.eclipse.core.net.linux" os="linux" version="0.0.0"/>
<plugin id="org.eclipse.core.net.win32" os="win32" version="0.0.0"/>
<plugin id="org.eclipse.core.net.win32.x86_64" os="win32" arch="x86_64" version="0.0.0"/>
<!-- Filesystem -->
<plugin id="org.eclipse.core.filesystem.linux.x86_64" os="linux" arch="x86_64" version="0.0.0"/>
<plugin id="org.eclipse.core.filesystem.linux.aarch64" os="linux" arch="aarch64" version="0.0.0"/>
<plugin id="org.eclipse.core.filesystem.macosx" os="macosx" version="0.0.0"/>
<plugin id="org.eclipse.core.filesystem.win32.x86_64" os="win32" arch="x86_64" version="0.0.0"/>
<plugin id="org.eclipse.core.resources.win32.x86_64" os="win32" arch="x86_64" version="0.0.0"/>


</feature>
1 change: 1 addition & 0 deletions features/org.jkiss.dbeaver.runtime.feature/feature.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
<plugin id="org.jkiss.dbeaver.data.transfer" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.tasks.native" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.erd.model" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.model.dashboard" version="0.0.0" />

<plugin id="org.jkiss.dbeaver.dpi.app" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.dpi.model" version="0.0.0" />
Expand Down
1 change: 1 addition & 0 deletions features/org.jkiss.dbeaver.ui.feature/feature.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
<plugin id="org.jkiss.dbeaver.ui.editors.xml" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.ui.navigator" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.ui.search" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.ui.swt" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.erd.ui" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.data.transfer.ui" version="0.0.0" />
<plugin id="org.jkiss.dbeaver.data.gis.view" version="0.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.internal.image.FileFormat;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.jkiss.awt.injector.ProxyInjector;
import org.jkiss.dbeaver.DBeaverPreferences;
Expand All @@ -26,11 +27,14 @@
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.runtime.features.DBRFeatureRegistry;
import org.jkiss.dbeaver.ui.browser.BrowsePeerMethods;
import org.jkiss.utils.ArrayUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;

import java.awt.*;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

Expand Down Expand Up @@ -85,13 +89,49 @@ public void start(BundleContext context)
getPreferenceStore().setValue(DBeaverPreferences.UI_USE_EMBEDDED_AUTH, false);
}
}

try {
injectSvgFileFormat();
} catch (Throwable e) {
getLog().error("Unable to inject SVG file format support", e);
}
}

private void injectProxyPeer() throws NoSuchFieldException, IllegalAccessException {
ProxyInjector proxyInjector = new ProxyInjector();
proxyInjector.injectBrowseInteraction(BrowsePeerMethods::canBrowseInSWTBrowser, BrowsePeerMethods::browseInSWTBrowser);
}

/**
* Registers {@code SVGFileFormat} as a file format for SWT {@link org.eclipse.swt.graphics.ImageLoader}.
*
* @throws Throwable if the registration fails
*/
@SuppressWarnings("JavaReflectionInvocation")
private static void injectSvgFileFormat() throws Throwable {
Field FileFormat_formats = FileFormat.class.getDeclaredField("FORMATS"); //$NON-NLS-1$
FileFormat_formats.setAccessible(true);

String[] formats = (String[]) FileFormat_formats.get(null);
String[] patched = ArrayUtils.add(String.class, formats, "SVG");

Class<?> Unsafe = Class.forName("sun.misc.Unsafe"); //$NON-NLS-1$
Method Unsafe_staticFieldBase = Unsafe.getDeclaredMethod("staticFieldBase", Field.class); //$NON-NLS-1$
Method Unsafe_staticFieldOffset = Unsafe.getDeclaredMethod("staticFieldOffset", Field.class); //$NON-NLS-1$
Method Unsafe_putObject = Unsafe.getDeclaredMethod("putObject", Object.class, long.class, Object.class); //$NON-NLS-1$

Field theUnsafe = Unsafe.getDeclaredField("theUnsafe"); //$NON-NLS-1$
theUnsafe.setAccessible(true);
Object unsafe = theUnsafe.get(null);

Unsafe_putObject.invoke(
unsafe,
Unsafe_staticFieldBase.invoke(unsafe, FileFormat_formats),
Unsafe_staticFieldOffset.invoke(unsafe, FileFormat_formats),
patched
);
}

@Override
public void stop(BundleContext context)
throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@

package org.jkiss.dbeaver.core;

import org.eclipse.core.internal.registry.IRegistryConstants;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.ui.PlatformUI;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.Log;
Expand All @@ -49,9 +48,9 @@
import org.jkiss.utils.StandardConstants;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Expand All @@ -65,9 +64,12 @@ public class DesktopPlatform extends BasePlatformImpl implements DBPPlatformDesk

// The plug-in ID
public static final String PLUGIN_ID = "org.jkiss.dbeaver.core"; //$NON-NLS-1$
public static final String DBEAVER_DATA_DIR = "DBeaverData";

private static final String TEMP_PROJECT_NAME = ".dbeaver-temp"; //$NON-NLS-1$
private static final String OSGI_CONFIG_FILE = "config.ini";
private static final String DBEAVER_CONFIG_FOLDER = "settings";
private static final String DBEAVER_CONFIG_FILE = "global-settings.ini";
private static final String DBEAVER_PROP_LANGUAGE = "nl";

private static final Log log = Log.getLog(DesktopPlatform.class);

Expand Down Expand Up @@ -100,18 +102,13 @@ static void setClosing(boolean closing) {
isClosing = closing;
}

public static DBPPreferenceStore getGlobalPreferenceStore() {
return DBeaverActivator.getInstance().getPreferences();
}

public DesktopPlatform() {
instance = this;
}

protected void initialize() {
long startTime = System.currentTimeMillis();
log.debug("Initialize desktop platform...");

{
this.language = PlatformLanguageRegistry.getInstance().getLanguage(Locale.getDefault());
if (this.language == null) {
Expand Down Expand Up @@ -214,8 +211,8 @@ public DBPWorkspaceDesktop getWorkspace() {

@NotNull
@Override
public DBPApplication getApplication() {
return BaseApplicationImpl.getInstance();
public DBPApplicationDesktop getApplication() {
return (DBPApplicationDesktop) BaseApplicationImpl.getInstance();
}

@NotNull
Expand All @@ -231,27 +228,38 @@ public void setPlatformLanguage(@NotNull DBPPlatformLanguage language) throws DB
}

try {
final File config = new File(RuntimeUtils.getLocalFileFromURL(Platform.getConfigurationLocation().getURL()), OSGI_CONFIG_FILE);
final Properties properties = new Properties();

if (config.exists()) {
try (FileInputStream is = new FileInputStream(config)) {
properties.load(is);
}
}

properties.put(IRegistryConstants.PROP_NL, language.getCode());

try (FileOutputStream os = new FileOutputStream(config)) {
properties.store(os, null);
}

setConfigProperty(DBEAVER_PROP_LANGUAGE, language.getCode());
this.language = language;
// This property is fake. But we set it to trigger property change listener
// which will ask to restart workbench.
getPreferenceStore().setValue(ModelPreferences.PLATFORM_LANGUAGE, language.getCode());
} catch (IOException e) {
throw new DBException("Unexpected error while saving startup configuration", e);
throw new DBException("Can't change platform language: " + e.getMessage(), e);
}
}

private void setConfigProperty(@NotNull String key, @Nullable String value) throws IOException {
final Path root = Path.of(RuntimeUtils.getWorkingDirectory(DBEAVER_DATA_DIR));
final Path file = root.resolve(DBEAVER_CONFIG_FOLDER).resolve(DBEAVER_CONFIG_FILE);
final Properties properties = new Properties();

if (Files.exists(file)) {
try (Reader reader = Files.newBufferedReader(file)) {
properties.load(reader);
}
}

if (value != null) {
properties.setProperty(key, value);
} else {
properties.remove(key);
}

// Ensure the config directory exists
Files.createDirectories(file.getParent());

try (Writer writer = Files.newBufferedWriter(file)) {
properties.store(writer, "DBeaver configuration");
}
}

Expand Down Expand Up @@ -292,7 +300,7 @@ public DBPDataFormatterRegistry getDataFormatterRegistry() {
@NotNull
@Override
public DBPPreferenceStore getPreferenceStore() {
return DBeaverActivator.getInstance().getPreferences();
return getApplication().getPreferenceStore();
}

@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ public void refreshPartContexts(IWorkbenchPart part) {

@Override
public void notifyAgent(String message, int status) {
if (!ModelPreferences.getPreferences().getBoolean(DBeaverPreferences.AGENT_LONG_OPERATION_NOTIFY)) {
if (!DBWorkbench.getPlatform().getPreferenceStore().getBoolean(DBeaverPreferences.AGENT_LONG_OPERATION_NOTIFY)) {
// Notifications disabled
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
import org.eclipse.equinox.app.IApplicationContext;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.core.DBeaverActivator;
import org.jkiss.dbeaver.core.DesktopPlatform;
import org.jkiss.dbeaver.core.DesktopUI;
import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.runtime.ui.DBPPlatformUI;

Expand Down Expand Up @@ -89,4 +91,16 @@ public Class<? extends DBPPlatformUI> getPlatformUIClass() {
return DesktopUI.class;
}

@Override
public long getLastUserActivityTime() {
return -1;
}

@NotNull
@Override
public DBPPreferenceStore getPreferenceStore() {
return DBeaverActivator.getInstance().getPreferences();

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
Expand Down Expand Up @@ -73,7 +74,7 @@ private SWTBrowserRegistry() {
*/
@NotNull
public static BrowserSelection getActiveBrowser() {
DBPPreferenceStore preferences = ModelPreferences.getPreferences();
DBPPreferenceStore preferences = DBWorkbench.getPlatform().getPreferenceStore();
String type = preferences.getString(ModelPreferences.CLIENT_BROWSER);
if (CommonUtils.isEmpty(type)) {
return getDefaultBrowser();
Expand Down Expand Up @@ -111,7 +112,7 @@ public static void overrideBrowser() {
* @param browser selected browser
*/
public static void setActiveBrowser(@NotNull BrowserSelection browser) {
DBPPreferenceStore preferences = ModelPreferences.getPreferences();
DBPPreferenceStore preferences = DBWorkbench.getPlatform().getPreferenceStore();
preferences.setValue(ModelPreferences.CLIENT_BROWSER, browser.name());
System.setProperty(INTERNAL_BROWSER_PROPERTY, preferences.getString(ModelPreferences.CLIENT_BROWSER));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.jobs.DefaultInvalidationFeedbackHandler;
import org.jkiss.dbeaver.runtime.jobs.DisconnectJob;
import org.jkiss.dbeaver.runtime.jobs.InvalidateJob;
import org.jkiss.dbeaver.ui.IDataSourceContainerUpdate;
Expand All @@ -43,6 +44,8 @@
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.ArrayUtils;

import java.util.Set;

// TODO: invalidate ALL contexts
public class DataSourceInvalidateHandler extends AbstractDataSourceHandler
{
Expand Down Expand Up @@ -72,39 +75,45 @@ public static boolean invalidateDataSource(final DBPDataSource dataSource) {
if (dataSource != null) {
//final DataSourceDescriptor dataSourceDescriptor = (DataSourceDescriptor) context;
DBPDataSourceContainer container = dataSource.getContainer();
if (!ArrayUtils.isEmpty(Job.getJobManager().find(container)) ||
!DataSourceHandler.checkAndCloseActiveTransaction(container, true)) {
if (!ArrayUtils.isEmpty(Job.getJobManager().find(container))) {
// Already connecting/disconnecting or cancelled - just return
return false;
}
final InvalidateJob invalidateJob = new InvalidateJob(dataSource);
invalidateJob.setFeedbackHandler(() -> DBWorkbench.getPlatformUI().openConnectionEditor(dataSource.getContainer()));
invalidateJob.setFeedbackHandler(new DefaultInvalidationFeedbackHandler() {
@Override
public boolean confirmInvalidate(@NotNull Set<DBPDataSourceContainer> containersToInvalidate) {
for (DBPDataSourceContainer container : containersToInvalidate) {
if (!DataSourceHandler.checkAndCloseActiveTransaction(container, true)) {
return false;
}
}

return true;
}
});
invalidateJob.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
StringBuilder message = new StringBuilder();
Throwable error = null;
int totalNum = 0, connectedNum = 0, aliveNum = 0;
int totalNum = 0;
int connectedNum = 0;
for (InvalidateJob.ContextInvalidateResult result : invalidateJob.getInvalidateResults()) {
totalNum++;
if (result.error != null) {
error = result.error;
}
switch (result.result) {
case CONNECTED:
case RECONNECTED:
connectedNum++;
break;
case ALIVE:
aliveNum++;
break;
default:
break;
if (result instanceof InvalidateJob.ContextInvalidateResult.Error e) {
error = e.exception();
} else {
connectedNum++;
}
}
if (totalNum == 0) {
// no invalidation happened
return;
}
if (connectedNum > 0) {
message.insert(0, "Connections reopened: " + connectedNum + " (of " + totalNum + ")");
} else if (message.length() == 0) {
} else if (message.isEmpty()) {
message.insert(0, "All connections (" + totalNum + ") are alive!");
}
if (error != null) {
Expand Down

0 comments on commit 032190b

Please sign in to comment.