From dd15372b8eacb3ebb36774575c241eb9a86edb35 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sun, 26 May 2019 01:24:23 +0300 Subject: [PATCH] Refactoring: model.sql bundle extraction Former-commit-id: 427266a339b30fd0469d58aa384d4208dd82852a --- .../org/jkiss/dbeaver/core/DBeaverCore.java | 8 - .../datasource/DataSourceToolbarUtils.java | 8 +- .../dialogs/net/HTTPTunnelConfiguratorUI.java | 5 + .../net/SSLConfiguratorAbstractUI.java | 5 + .../dialogs/net/SocksProxyConfiguratorUI.java | 5 + .../org/jkiss/dbeaver/ext/db2/DB2Utils.java | 4 +- .../db2/model/DB2TableCheckConstraint.java | 4 +- .../dbeaver/ext/db2/model/DB2Trigger.java | 4 +- .../dbeaver/ext/db2/model/DB2ViewBase.java | 4 +- .../dbeaver/ext/exasol/model/ExasolView.java | 4 +- .../META-INF/MANIFEST.MF | 3 + .../plugin.xml | 7 +- .../SQLWorkbenchJAdapterFactory.java | 45 ++ .../SQLWorkbenchJFormatterSettingsPage.java | 2 +- .../META-INF/MANIFEST.MF | 3 +- .../dbeaver/ext/hana/model/HANAMetaModel.java | 4 +- .../dbeaver/ext/hive/model/HiveMetaModel.java | 5 +- .../ext/hsqldb/model/HSQLMetaModel.java | 4 +- .../dbeaver/ext/hsqldb/model/HSQLTrigger.java | 4 +- .../META-INF/MANIFEST.MF | 1 + .../dbeaver/ext/mysql/model/MySQLView.java | 4 +- .../META-INF/MANIFEST.MF | 1 + .../ext/postgresql/model/PostgreTrigger.java | 3 +- .../model/plan/PostgrePlanNodeBase.java | 5 +- .../META-INF/MANIFEST.MF | 6 +- .../OSGI-INF/l10n/bundle.properties | 9 + .../OSGI-INF/l10n/bundle_de.properties | 2 + .../OSGI-INF/l10n/bundle_fr.properties | 2 + .../OSGI-INF/l10n/bundle_ja.properties | 2 + .../OSGI-INF/l10n/bundle_ko.properties | 9 + .../OSGI-INF/l10n/bundle_ru.properties | 7 + .../OSGI-INF/l10n/bundle_zh.properties | 2 + .../org.jkiss.dbeaver.model.sql/plugin.xml | 11 + .../org.jkiss.dbeaver.sqlFormatter.exsd | 0 .../model/sql/SQLModelPreferences.java | 27 + .../model/sql/format/SQLFormatUtils.java | 40 ++ .../model/sql/format/SQLFormatter.java | 0 .../sql/format/SQLFormatterConfiguration.java | 275 ++++---- .../sql/format/SQLFormatterRegistry.java | 0 .../format/external/SQLFormatterExternal.java | 0 .../sql/format/tokenized/FormatterToken.java | 148 ++--- .../sql/format/tokenized/IndentFormatter.java | 0 .../format/tokenized/SQLFormatterCompact.java | 0 .../tokenized/SQLFormatterTokenized.java | 0 .../sql/format/tokenized/SQLTokensParser.java | 604 +++++++++--------- .../model/sql/format/tokenized/TokenType.java | 0 .../SQLModelPreferencesInitializer.java | 40 ++ .../SQLFormatterConfigurationRegistry.java | 18 +- .../sql/registry/SQLFormatterDescriptor.java | 22 +- .../tokenized/SQLFormatterTokenizedTest.java | 0 .../META-INF/MANIFEST.MF | 3 - .../org/jkiss/dbeaver/ModelPreferences.java | 3 - .../jkiss/dbeaver/model/app/DBPPlatform.java | 4 - .../org/jkiss/dbeaver/model/sql/SQLUtils.java | 14 - .../ui/net/ssh/SSHTunnelConfiguratorUI.java | 5 + .../META-INF/MANIFEST.MF | 2 +- .../OSGI-INF/l10n/bundle.properties | 7 - .../plugin.xml | 7 - .../sql/preferences/PrefPageSQLFormat.java | 40 +- .../BaseFormatterConfigurationPage.java | 5 +- ...SQLExternalFormatterConfigurationPage.java | 2 +- .../format}/SQLFormatterConfigurator.java | 8 +- ...QLTokenizedFormatterConfigurationPage.java | 4 +- .../sql/syntax/SQLFormattingStrategy.java | 2 +- .../ui/IObjectPropertyConfigurator.java | 4 +- 65 files changed, 822 insertions(+), 654 deletions(-) create mode 100644 plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJAdapterFactory.java create mode 100644 plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_de.properties create mode 100644 plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_fr.properties create mode 100644 plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ja.properties create mode 100644 plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ko.properties create mode 100644 plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ru.properties create mode 100644 plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_zh.properties rename plugins/{org.jkiss.dbeaver.ui.editors.sql/schema => org.jkiss.dbeaver.model.sql/schemas}/org.jkiss.dbeaver.sqlFormatter.exsd (100%) create mode 100644 plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/SQLModelPreferences.java create mode 100644 plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatUtils.java rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/SQLFormatter.java (100%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java (89%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterRegistry.java (100%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/external/SQLFormatterExternal.java (100%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java (95%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/tokenized/IndentFormatter.java (100%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterCompact.java (100%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java (100%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java (97%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/src/org/jkiss/dbeaver/model/sql/format/tokenized/TokenType.java (100%) create mode 100644 plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/internal/SQLModelPreferencesInitializer.java rename plugins/{org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors => org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model}/sql/registry/SQLFormatterConfigurationRegistry.java (83%) rename plugins/{org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors => org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model}/sql/registry/SQLFormatterDescriptor.java (73%) rename plugins/{org.jkiss.dbeaver.model => org.jkiss.dbeaver.model.sql}/tests/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenizedTest.java (100%) rename plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/{ => preferences}/format/BaseFormatterConfigurationPage.java (92%) rename plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/{ => preferences}/format/SQLExternalFormatterConfigurationPage.java (98%) rename plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/{registry => preferences/format}/SQLFormatterConfigurator.java (83%) rename plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/{ => preferences}/format/tokenized/SQLTokenizedFormatterConfigurationPage.java (97%) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverCore.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverCore.java index f3cba18679..dc1c05c01e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverCore.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverCore.java @@ -44,7 +44,6 @@ import org.jkiss.dbeaver.model.qm.QMUtils; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.OSDescriptor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -import org.jkiss.dbeaver.model.sql.format.SQLFormatterRegistry; import org.jkiss.dbeaver.registry.*; import org.jkiss.dbeaver.registry.datatype.DataTypeProviderRegistry; import org.jkiss.dbeaver.registry.driver.DriverDescriptor; @@ -56,7 +55,6 @@ import org.jkiss.dbeaver.runtime.jobs.KeepAliveJob; import org.jkiss.dbeaver.runtime.net.GlobalProxySelector; import org.jkiss.dbeaver.runtime.qm.QMControllerImpl; import org.jkiss.dbeaver.runtime.qm.QMLogFileWriter; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterConfigurationRegistry; import org.jkiss.dbeaver.ui.resources.DefaultResourceHandlerImpl; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.GeneralUtils; @@ -484,12 +482,6 @@ public class DBeaverCore implements DBPPlatform { return DataFormatterRegistry.getInstance(); } - @NotNull - @Override - public SQLFormatterRegistry getSQLFormatterRegistry() { - return SQLFormatterConfigurationRegistry.getInstance(); - } - @NotNull @Override public DBPPreferenceStore getPreferenceStore() { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceToolbarUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceToolbarUtils.java index 84ab4beda0..fdf78e9f5e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceToolbarUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceToolbarUtils.java @@ -70,8 +70,10 @@ public class DataSourceToolbarUtils public static void updateCommandsUI() { ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class); - commandService.refreshElements("org.jkiss.dbeaver.ui.tools.select.connection", null); - commandService.refreshElements("org.jkiss.dbeaver.ui.tools.select.schema", null); - commandService.refreshElements("org.jkiss.dbeaver.ui.editors.sql.sync.connection", null); + if (commandService != null) { + commandService.refreshElements("org.jkiss.dbeaver.ui.tools.select.connection", null); + commandService.refreshElements("org.jkiss.dbeaver.ui.tools.select.schema", null); + commandService.refreshElements("org.jkiss.dbeaver.ui.editors.sql.sync.connection", null); + } } } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/HTTPTunnelConfiguratorUI.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/HTTPTunnelConfiguratorUI.java index 7740a8b49f..814fe3f4c7 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/HTTPTunnelConfiguratorUI.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/HTTPTunnelConfiguratorUI.java @@ -44,6 +44,11 @@ public class HTTPTunnelConfiguratorUI implements IObjectPropertyConfigurator { + @Override + public void resetSettings(DBWHandlerConfiguration configuration) { + + } + @Override public boolean isComplete() { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/SocksProxyConfiguratorUI.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/SocksProxyConfiguratorUI.java index 1542ef2e00..0d266635d0 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/SocksProxyConfiguratorUI.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/net/SocksProxyConfiguratorUI.java @@ -87,6 +87,11 @@ public class SocksProxyConfiguratorUI implements IObjectPropertyConfigurator imple @Override public String getObjectDefinitionText(DBRProgressMonitor monitor, Map options) throws DBException { - return SQLUtils.formatSQL(getDataSource(), text); + return SQLFormatUtils.formatSQL(getDataSource(), text); } // ----------------- diff --git a/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2Trigger.java b/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2Trigger.java index f0c43953ae..10827b1908 100644 --- a/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2Trigger.java +++ b/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2Trigger.java @@ -35,7 +35,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectState; import org.jkiss.dbeaver.model.struct.rdb.DBSTrigger; @@ -160,7 +160,7 @@ public class DB2Trigger extends DB2SchemaObject implements DBSTrigger, DB2Source @Override public String getObjectDefinitionText(DBRProgressMonitor monitor, Map options) throws DBException { - return SQLUtils.formatSQL(getDataSource(), text); + return SQLFormatUtils.formatSQL(getDataSource(), text); } // ----------------- diff --git a/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2ViewBase.java b/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2ViewBase.java index f433c7e1d6..cbf48d819b 100644 --- a/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2ViewBase.java +++ b/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/model/DB2ViewBase.java @@ -34,7 +34,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectState; import org.jkiss.dbeaver.model.struct.rdb.DBSView; @@ -117,7 +117,7 @@ public abstract class DB2ViewBase extends DB2TableBase implements DB2SourceObjec @Property(hidden = true, editable = true, updatable = true, order = -1) public String getObjectDefinitionText(DBRProgressMonitor monitor, Map options) throws DBException { - return SQLUtils.formatSQL(getDataSource(), text); + return SQLFormatUtils.formatSQL(getDataSource(), text); } // ----------------- diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolView.java b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolView.java index 1cbf30f629..185f043d93 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolView.java +++ b/plugins/org.jkiss.dbeaver.ext.exasol/src/org/jkiss/dbeaver/ext/exasol/model/ExasolView.java @@ -32,7 +32,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCStructCache; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.struct.DBSEntityAssociation; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectState; @@ -178,7 +178,7 @@ public class ExasolView extends ExasolTableBase implements ExasolSourceObject, D @Property(hidden = true, editable = true, updatable = true, order = -1) public String getObjectDefinitionText(DBRProgressMonitor monitor, Map options) throws DBException { read(); - return SQLUtils.formatSQL(getDataSource(), this.text); + return SQLFormatUtils.formatSQL(getDataSource(), this.text); } diff --git a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/META-INF/MANIFEST.MF index 6e34bd4b39..c3f714a73f 100644 --- a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/META-INF/MANIFEST.MF @@ -8,8 +8,11 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.jkiss.dbeaver.core, org.jkiss.dbeaver.model, + org.jkiss.dbeaver.model.sql, org.jkiss.dbeaver.ui, + org.jkiss.dbeaver.ui.editors.sql, org.eclipse.core.resources +Export-Package: org.jkiss.dbeaver.ext.format.sqlworkbenchj Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/plugin.xml b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/plugin.xml index 6f5c5f9432..b207f0ab5e 100644 --- a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/plugin.xml @@ -6,9 +6,14 @@ + + + + + + diff --git a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJAdapterFactory.java b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJAdapterFactory.java new file mode 100644 index 0000000000..32e128e1ae --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJAdapterFactory.java @@ -0,0 +1,45 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ext.format.sqlworkbenchj; + +import org.eclipse.core.runtime.IAdapterFactory; +import org.jkiss.dbeaver.ui.editors.sql.preferences.format.SQLFormatterConfigurator; + +/** + * Adapts objects to their UI configurators + */ +public class SQLWorkbenchJAdapterFactory implements IAdapterFactory +{ + private static final Class[] ADAPTER_LIST = { + SQLFormatterConfigurator.class + }; + + @Override + public T getAdapter(Object adaptableObject, Class adapterType) + { + if (adapterType == SQLFormatterConfigurator.class && adaptableObject instanceof SQLWorkbenchJFormatter) { + return adapterType.cast(new SQLWorkbenchJFormatterSettingsPage()); + } + return null; + } + + @Override + public Class[] getAdapterList() + { + return ADAPTER_LIST; + } +} diff --git a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJFormatterSettingsPage.java b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJFormatterSettingsPage.java index d6554b6b04..36945aeb34 100644 --- a/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJFormatterSettingsPage.java +++ b/plugins/org.jkiss.dbeaver.ext.format.sqlworkbenchj/src/org/jkiss/dbeaver/ext/format/sqlworkbenchj/SQLWorkbenchJFormatterSettingsPage.java @@ -23,7 +23,7 @@ import org.eclipse.swt.widgets.Group; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.TextWithOpenFolder; -import org.jkiss.dbeaver.ui.editors.sql.format.BaseFormatterConfigurationPage; +import org.jkiss.dbeaver.ui.editors.sql.preferences.format.BaseFormatterConfigurationPage; import org.jkiss.utils.CommonUtils; /** diff --git a/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF index b9636c920f..de035eea1a 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF @@ -5,7 +5,8 @@ Bundle-SymbolicName: org.jkiss.dbeaver.ext.generic;singleton:=true Bundle-Version: 2.3.96.qualifier Bundle-Release-Date: 20190611 Require-Bundle: org.eclipse.core.runtime, - org.jkiss.dbeaver.model + org.jkiss.dbeaver.model;visibility:=reexport, + org.jkiss.dbeaver.model.sql;visibility:=reexport Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/plugins/org.jkiss.dbeaver.ext.hana/src/org/jkiss/dbeaver/ext/hana/model/HANAMetaModel.java b/plugins/org.jkiss.dbeaver.ext.hana/src/org/jkiss/dbeaver/ext/hana/model/HANAMetaModel.java index 4592ec127e..779cfe00b2 100644 --- a/plugins/org.jkiss.dbeaver.ext.hana/src/org/jkiss/dbeaver/ext/hana/model/HANAMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.hana/src/org/jkiss/dbeaver/ext/hana/model/HANAMetaModel.java @@ -29,7 +29,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import java.sql.SQLException; import java.util.Map; @@ -113,7 +113,7 @@ public class HANAMetaModel extends GenericMetaModel } if (ddl.length() > 0) { // Format DDL - return SQLUtils.formatSQL(sourceObject.getDataSource(), ddl.toString()); + return SQLFormatUtils.formatSQL(sourceObject.getDataSource(), ddl.toString()); } } } diff --git a/plugins/org.jkiss.dbeaver.ext.hive/src/org/jkiss/dbeaver/ext/hive/model/HiveMetaModel.java b/plugins/org.jkiss.dbeaver.ext.hive/src/org/jkiss/dbeaver/ext/hive/model/HiveMetaModel.java index 18ac3d0a9b..c2812555d9 100644 --- a/plugins/org.jkiss.dbeaver.ext.hive/src/org/jkiss/dbeaver/ext/hive/model/HiveMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.hive/src/org/jkiss/dbeaver/ext/hive/model/HiveMetaModel.java @@ -18,7 +18,6 @@ package org.jkiss.dbeaver.ext.hive.model; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.generic.model.GenericDataSource; -import org.jkiss.dbeaver.ext.generic.model.GenericProcedure; import org.jkiss.dbeaver.ext.generic.model.GenericTable; import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel; import org.jkiss.dbeaver.model.DBPDataSourceContainer; @@ -28,7 +27,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import java.sql.SQLException; import java.util.Map; @@ -65,7 +64,7 @@ public class HiveMetaModel extends GenericMetaModel } String ddl = sql.toString(); if (sourceObject.isView()) { - return SQLUtils.formatSQL(sourceObject.getDataSource(), ddl); + return SQLFormatUtils.formatSQL(sourceObject.getDataSource(), ddl); } return ddl; } diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java index a21f62b539..3e2beeaa17 100644 --- a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java @@ -29,7 +29,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureType; import java.sql.SQLException; @@ -121,7 +121,7 @@ public class HSQLMetaModel extends GenericMetaModel if (dbResult.nextRow()) { String definition = dbResult.getString(1); if (definition != null) { - definition = SQLUtils.formatSQL(dataSource, definition); + definition = SQLFormatUtils.formatSQL(dataSource, definition); } return definition; } diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLTrigger.java b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLTrigger.java index fce5540ca1..d7f87011f3 100644 --- a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLTrigger.java +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLTrigger.java @@ -22,7 +22,7 @@ import org.jkiss.dbeaver.ext.generic.model.GenericTrigger; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.meta.Property; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; /** * HSQLTrigger @@ -42,7 +42,7 @@ public class HSQLTrigger extends GenericTrigger { timing = JDBCUtils.safeGetString(dbResult, "ACTION_TIMING"); statement = JDBCUtils.safeGetString(dbResult, "ACTION_STATEMENT"); if (statement != null) { - statement = SQLUtils.formatSQL(getDataSource(), statement); + statement = SQLFormatUtils.formatSQL(getDataSource(), statement); } } diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF index 5a57fe7d0a..e7d081d516 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF @@ -6,6 +6,7 @@ Bundle-Version: 2.1.95.qualifier Bundle-Release-Date: 20190611 Require-Bundle: org.eclipse.core.runtime, org.jkiss.dbeaver.model, + org.jkiss.dbeaver.model.sql, org.jkiss.dbeaver.data.gis, com.google.gson Bundle-ActivationPolicy: lazy diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLView.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLView.java index 7e5df15da7..737a00f66d 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLView.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLView.java @@ -34,7 +34,7 @@ import org.jkiss.dbeaver.model.meta.LazyProperty; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.meta.PropertyGroup; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.struct.rdb.DBSTableConstraint; import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey; import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex; @@ -220,7 +220,7 @@ public class MySQLView extends MySQLTableBase implements DBSView } } additionalInfo.setDefinition( - SQLUtils.formatSQL(getDataSource(), definition)); + SQLFormatUtils.formatSQL(getDataSource(), definition)); } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF index 453380af08..fe47a785bd 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF @@ -5,6 +5,7 @@ Bundle-SymbolicName: org.jkiss.dbeaver.ext.postgresql;singleton:=true Bundle-Version: 2.1.83.qualifier Bundle-Release-Date: 20190611 Require-Bundle: org.jkiss.dbeaver.model, + org.jkiss.dbeaver.model.sql, org.jkiss.dbeaver.ext.generic, org.jkiss.dbeaver.data.gis;visibility:=reexport, org.jkiss.bundle.gis;visibility:=reexport, diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTrigger.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTrigger.java index b1a078ff2b..d162b9b6d0 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTrigger.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTrigger.java @@ -33,6 +33,7 @@ import org.jkiss.dbeaver.model.meta.IPropertyValueTransformer; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.struct.DBSActionTiming; import org.jkiss.dbeaver.model.struct.DBSObjectState; import org.jkiss.dbeaver.model.struct.rdb.DBSManipulationType; @@ -271,7 +272,7 @@ public class PostgreTrigger implements DBSTrigger, DBPQualifiedObject, PostgreOb try (JDBCSession session = DBUtils.openMetaSession(monitor, this, "Read trigger definition")) { String triggerSource = JDBCUtils.queryString(session, "SELECT pg_catalog.pg_get_triggerdef(?)", objectId); if (triggerSource != null) { - triggerSource = SQLUtils.formatSQL(getDataSource(), triggerSource); + triggerSource = SQLFormatUtils.formatSQL(getDataSource(), triggerSource); ddl.append(triggerSource).append(";"); } } catch (SQLException e) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/plan/PostgrePlanNodeBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/plan/PostgrePlanNodeBase.java index b23ca12097..ce3d139098 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/plan/PostgrePlanNodeBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/plan/PostgrePlanNodeBase.java @@ -26,8 +26,9 @@ import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; import org.jkiss.dbeaver.model.preferences.DBPPropertySource; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.utils.CommonUtils; + import java.util.*; /** @@ -159,7 +160,7 @@ public abstract class PostgrePlanNodeBase> e cond = attributes.get(ATTR_FILTER); } if (!CommonUtils.isEmpty(cond)) { - cond = SQLUtils.formatSQL(dataSource, cond); + cond = SQLFormatUtils.formatSQL(dataSource, cond); } return cond; } diff --git a/plugins/org.jkiss.dbeaver.model.sql/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.model.sql/META-INF/MANIFEST.MF index 1717912443..1e2e32e90d 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.model.sql/META-INF/MANIFEST.MF @@ -7,7 +7,11 @@ Bundle-Version: 1.0.0.qualifier Bundle-Release-Date: 20190611 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy -Export-Package: org.jkiss.dbeaver.model.sql +Export-Package: org.jkiss.dbeaver.model.sql, + org.jkiss.dbeaver.model.sql.format, + org.jkiss.dbeaver.model.sql.format.external, + org.jkiss.dbeaver.model.sql.format.tokenized, + org.jkiss.dbeaver.model.sql.registry Bundle-ClassPath: . Require-Bundle: org.eclipse.equinox.security, org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle.properties index f4d5267fee..f8b2f938c3 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle.properties @@ -1,2 +1,11 @@ Bundle-Vendor = JKISS Bundle-Name = DBeaver SQL Model + +extension-point.org.jkiss.dbeaver.sqlFormatter.name = SQL formatters + +sql.formatter.default.name = Default formatter +sql.formatter.default.tip = Default SQL formatter +sql.formatter.compact.name = Compact formatter +sql.formatter.compact.tip = Compact SQL formatter. Similar to default formatter but with more compact output +sql.formatter.external.name = External formatter +sql.formatter.external.tip = External formatter. Uses configurable command-line executable to format SQL queries diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_de.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_de.properties new file mode 100644 index 0000000000..b58f964af8 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_de.properties @@ -0,0 +1,2 @@ +extension-point.org.jkiss.dbeaver.sqlCommand.name = SQL-Skriptbefehle +extension-point.org.jkiss.dbeaver.sqlFormatter.name = SQL-Formatierer diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_fr.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_fr.properties new file mode 100644 index 0000000000..0a5ff8eceb --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_fr.properties @@ -0,0 +1,2 @@ +extension-point.org.jkiss.dbeaver.sqlCommand.name = Commandes de scripts SQL +extension-point.org.jkiss.dbeaver.sqlFormatter.name = Formateurs SQL diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ja.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ja.properties new file mode 100644 index 0000000000..4c11ab1749 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ja.properties @@ -0,0 +1,2 @@ +extension-point.org.jkiss.dbeaver.sqlCommand.name =SQL\u30B9\u30AF\u30EA\u30D7\u30C8\u30B3\u30DE\u30F3\u30C9 +extension-point.org.jkiss.dbeaver.sqlFormatter.name =SQL\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ko.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ko.properties new file mode 100644 index 0000000000..47215fd852 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ko.properties @@ -0,0 +1,9 @@ +extension-point.org.jkiss.dbeaver.sqlCommand.name = SQL \uC2A4\uD06C\uB9BD\uD2B8 \uBA85\uB839\uC5B4 +extension-point.org.jkiss.dbeaver.sqlFormatter.name = SQL \uD3EC\uB9F7\uD130 + +sql.formatter.default.name = \uC11C\uC2DD \uAE30\uBCF8\uAC12 +sql.formatter.default.tip = SQL \uC11C\uC2DD \uAE30\uBCF8\uAC12 +sql.formatter.compact.name = Compact \uC11C\uC2DD +sql.formatter.compact.tip = Compact SQL \uC11C\uC2DD. \uAE30\uBCF8 \uC11C\uC2DD\uACFC \uC720\uC0AC\uD558\uC9C0\uB9CC \uB354 compact\uD558\uAC8C +sql.formatter.external.name = External formatter +sql.formatter.external.tip = External formatter. Uses configurable command-line executable to format SQL queries diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ru.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ru.properties new file mode 100644 index 0000000000..16771be271 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_ru.properties @@ -0,0 +1,7 @@ + +sql.formatter.default.name = \u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 +sql.formatter.default.tip = SQL \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. +sql.formatter.compact.name = \u041A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u044B\u0439 +sql.formatter.compact.tip = \u041A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u043E\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435. \u0410\u043D\u0430\u043B\u043E\u0433\u0438\u0447\u043D\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E\u043C\u0443, \u043D\u043E \u0441 \u0431\u043E\u043B\u0435\u0435 \u043A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u044B\u043C \u0432\u044B\u0445\u043E\u0434\u043E\u043C. +sql.formatter.external.name = \u0412\u043D\u0435\u0448\u043D\u0438\u0439 +sql.formatter.external.tip = \u0412\u043D\u0435\u0448\u043D\u044F\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u044B\u0439 \u0438\u0441\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0439 \u0444\u0430\u0439\u043B \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 SQL. diff --git a/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_zh.properties b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_zh.properties new file mode 100644 index 0000000000..a30e878526 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/OSGI-INF/l10n/bundle_zh.properties @@ -0,0 +1,2 @@ +extension-point.org.jkiss.dbeaver.sqlCommand.name = SQL \u811A\u672C\u547D\u4EE4 +extension-point.org.jkiss.dbeaver.sqlFormatter.name = SQL \u683C\u5F0F\u5316 diff --git a/plugins/org.jkiss.dbeaver.model.sql/plugin.xml b/plugins/org.jkiss.dbeaver.model.sql/plugin.xml index ff83905d12..0b64b6756b 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.model.sql/plugin.xml @@ -2,5 +2,16 @@ + + + + + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/schema/org.jkiss.dbeaver.sqlFormatter.exsd b/plugins/org.jkiss.dbeaver.model.sql/schemas/org.jkiss.dbeaver.sqlFormatter.exsd similarity index 100% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/schema/org.jkiss.dbeaver.sqlFormatter.exsd rename to plugins/org.jkiss.dbeaver.model.sql/schemas/org.jkiss.dbeaver.sqlFormatter.exsd diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/SQLModelPreferences.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/SQLModelPreferences.java new file mode 100644 index 0000000000..367265878d --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/SQLModelPreferences.java @@ -0,0 +1,27 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jkiss.dbeaver.model.sql; + +/** + * Preferences constants + */ +public final class SQLModelPreferences { + + public final static String SQL_FORMAT_FORMATTER = "sql.format.formatter"; + +} diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatUtils.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatUtils.java new file mode 100644 index 0000000000..95459456c8 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatUtils.java @@ -0,0 +1,40 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.model.sql.format; + +import org.jkiss.dbeaver.model.sql.SQLDataSource; +import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; +import org.jkiss.dbeaver.model.sql.registry.SQLFormatterConfigurationRegistry; + +/** + * SQL Formatter + */ +public class SQLFormatUtils { + + public static String formatSQL(SQLDataSource dataSource, String query) + { + SQLSyntaxManager syntaxManager = new SQLSyntaxManager(); + syntaxManager.init(dataSource.getSQLDialect(), dataSource.getContainer().getPreferenceStore()); + SQLFormatterConfiguration configuration = new SQLFormatterConfiguration(dataSource, syntaxManager); + SQLFormatter formatter = SQLFormatterConfigurationRegistry.getInstance().createFormatter(configuration); + if (formatter == null) { + return query; + } + return formatter.format(query, configuration); + } + +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatter.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatter.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatter.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatter.java diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java similarity index 89% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java index e159dfeac4..8ecac83485 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterConfiguration.java @@ -1,138 +1,137 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jkiss.dbeaver.model.sql.format; - -import org.jkiss.code.NotNull; -import org.jkiss.dbeaver.ModelPreferences; -import org.jkiss.dbeaver.model.DBPDataSource; -import org.jkiss.dbeaver.model.DBPIdentifierCase; -import org.jkiss.dbeaver.model.DBPKeywordType; -import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; -import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; -import org.jkiss.dbeaver.utils.GeneralUtils; -import org.jkiss.utils.CommonUtils; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -/** - * SQLFormatterConfiguration - */ -public class SQLFormatterConfiguration { - - private String formatterId; - - private DBPDataSource dataSource; - @NotNull - private DBPIdentifierCase keywordCase; - private String indentString = " "; - private SQLSyntaxManager syntaxManager; - @NotNull - private String sourceEncoding = GeneralUtils.DEFAULT_ENCODING; - - private Map properties = new HashMap<>(); - - /** - * Create formatter config with default (set in properties) formatter - */ - public SQLFormatterConfiguration(DBPDataSource dataSource, SQLSyntaxManager syntaxManager) { - this(dataSource, syntaxManager, CommonUtils.notEmpty(syntaxManager.getPreferenceStore().getString(ModelPreferences.SQL_FORMAT_FORMATTER)).toUpperCase(Locale.ENGLISH)); - } - - public SQLFormatterConfiguration(DBPDataSource dataSource, SQLSyntaxManager syntaxManager, String formatterId) { - this.dataSource = dataSource; - this.syntaxManager = syntaxManager; - this.keywordCase = syntaxManager.getKeywordCase(); - - this.formatterId = formatterId; - } - - public DBPDataSource getDataSource() { - return dataSource; - } - - public SQLSyntaxManager getSyntaxManager() { - return syntaxManager; - } - - public String getFormatterId() { - return formatterId; - } - - public void setFormatterId(String formatterId) { - this.formatterId = formatterId; - syntaxManager.getPreferenceStore().setValue( - ModelPreferences.SQL_FORMAT_FORMATTER, formatterId.toUpperCase(Locale.ENGLISH)); - } - - public String getIndentString() { - return indentString; - } - - public void setIndentString(String indentString) { - this.indentString = indentString; - } - - @NotNull - public DBPIdentifierCase getKeywordCase() { - return keywordCase; - } - - public void setKeywordCase(@NotNull DBPIdentifierCase keyword) { - this.keywordCase = keyword; - } - - @NotNull - public String getSourceEncoding() { - return sourceEncoding; - } - - public void setSourceEncoding(@NotNull String sourceEncoding) { - this.sourceEncoding = sourceEncoding; - } - - public boolean isFunction(String name) { - return syntaxManager.getDialect().getFunctions(dataSource).contains(name.toUpperCase(Locale.ENGLISH)); - } - - public Object getProperty(String name) { - return properties.get(name); - } - - public void setProperty(String name, Object value) { - properties.put(name, value); - } - - public void setProperties(Map properties) { - this.properties = properties; - } - - public DBPPreferenceStore getPreferenceStore() { - return syntaxManager.getPreferenceStore(); - } - - public void loadSettings() { - - } - - public void saveSettings() { - - } - -} +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jkiss.dbeaver.model.sql.format; + +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBPIdentifierCase; +import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; +import org.jkiss.dbeaver.model.sql.SQLModelPreferences; +import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; +import org.jkiss.dbeaver.utils.GeneralUtils; +import org.jkiss.utils.CommonUtils; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * SQLFormatterConfiguration + */ +public class SQLFormatterConfiguration { + + private String formatterId; + + private DBPDataSource dataSource; + @NotNull + private DBPIdentifierCase keywordCase; + private String indentString = " "; + private SQLSyntaxManager syntaxManager; + @NotNull + private String sourceEncoding = GeneralUtils.DEFAULT_ENCODING; + + private Map properties = new HashMap<>(); + + /** + * Create formatter config with default (set in properties) formatter + */ + public SQLFormatterConfiguration(DBPDataSource dataSource, SQLSyntaxManager syntaxManager) { + this(dataSource, syntaxManager, CommonUtils.notEmpty(syntaxManager.getPreferenceStore().getString(SQLModelPreferences.SQL_FORMAT_FORMATTER)).toUpperCase(Locale.ENGLISH)); + } + + public SQLFormatterConfiguration(DBPDataSource dataSource, SQLSyntaxManager syntaxManager, String formatterId) { + this.dataSource = dataSource; + this.syntaxManager = syntaxManager; + this.keywordCase = syntaxManager.getKeywordCase(); + + this.formatterId = formatterId; + } + + public DBPDataSource getDataSource() { + return dataSource; + } + + public SQLSyntaxManager getSyntaxManager() { + return syntaxManager; + } + + public String getFormatterId() { + return formatterId; + } + + public void setFormatterId(String formatterId) { + this.formatterId = formatterId; + syntaxManager.getPreferenceStore().setValue( + SQLModelPreferences.SQL_FORMAT_FORMATTER, formatterId.toUpperCase(Locale.ENGLISH)); + } + + public String getIndentString() { + return indentString; + } + + public void setIndentString(String indentString) { + this.indentString = indentString; + } + + @NotNull + public DBPIdentifierCase getKeywordCase() { + return keywordCase; + } + + public void setKeywordCase(@NotNull DBPIdentifierCase keyword) { + this.keywordCase = keyword; + } + + @NotNull + public String getSourceEncoding() { + return sourceEncoding; + } + + public void setSourceEncoding(@NotNull String sourceEncoding) { + this.sourceEncoding = sourceEncoding; + } + + public boolean isFunction(String name) { + return syntaxManager.getDialect().getFunctions(dataSource).contains(name.toUpperCase(Locale.ENGLISH)); + } + + public Object getProperty(String name) { + return properties.get(name); + } + + public void setProperty(String name, Object value) { + properties.put(name, value); + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + public DBPPreferenceStore getPreferenceStore() { + return syntaxManager.getPreferenceStore(); + } + + public void loadSettings() { + + } + + public void saveSettings() { + + } + +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterRegistry.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterRegistry.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterRegistry.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/SQLFormatterRegistry.java diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/external/SQLFormatterExternal.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/external/SQLFormatterExternal.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/external/SQLFormatterExternal.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/external/SQLFormatterExternal.java diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java similarity index 95% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java index 0194848a41..916c17ea20 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/FormatterToken.java @@ -1,74 +1,74 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * FormatterToken - */ -package org.jkiss.dbeaver.model.sql.format.tokenized; - -class FormatterToken { - - private TokenType fType; - private String fString; - private int fPos = -1; - - public FormatterToken(final TokenType argType, final String argString, final int argPos) - { - fType = argType; - fString = argString; - fPos = argPos; - } - - public FormatterToken(final TokenType argType, final String argString) - { - this(argType, argString, -1); - } - - public void setType(final TokenType argType) - { - fType = argType; - } - - public TokenType getType() - { - return fType; - } - - public void setString(final String argString) - { - fString = argString; - } - - public String getString() - { - return fString; - } - - public void setPos(final int argPos) - { - fPos = argPos; - } - - public int getPos() - { - return fPos; - } - - public String toString() { - return fString + " [" + fType + "]"; - } -} +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * FormatterToken + */ +package org.jkiss.dbeaver.model.sql.format.tokenized; + +class FormatterToken { + + private TokenType fType; + private String fString; + private int fPos = -1; + + public FormatterToken(final TokenType argType, final String argString, final int argPos) + { + fType = argType; + fString = argString; + fPos = argPos; + } + + public FormatterToken(final TokenType argType, final String argString) + { + this(argType, argString, -1); + } + + public void setType(final TokenType argType) + { + fType = argType; + } + + public TokenType getType() + { + return fType; + } + + public void setString(final String argString) + { + fString = argString; + } + + public String getString() + { + return fString; + } + + public void setPos(final int argPos) + { + fPos = argPos; + } + + public int getPos() + { + return fPos; + } + + public String toString() { + return fString + " [" + fType + "]"; + } +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/IndentFormatter.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/IndentFormatter.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/IndentFormatter.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/IndentFormatter.java diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterCompact.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterCompact.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterCompact.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterCompact.java diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java similarity index 97% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java index 817dd93cf9..245fdc8a72 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLTokensParser.java @@ -1,302 +1,302 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jkiss.dbeaver.model.sql.format.tokenized; - -import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration; -import org.jkiss.utils.ArrayUtils; -import org.jkiss.utils.CommonUtils; - -import java.util.*; - -/** - * SQLTokensParser - * TODO: check comment characters from syntax manager, not constants - */ -class SQLTokensParser { - - private static final String[] twoCharacterSymbol = { "<>", "<=", ">=", "||", "()", "!=", ":=", ".*" }; - - private final SQLFormatterConfiguration configuration; - private final String[][] quoteStrings; - private String fBefore; - private int fPos; - private char structSeparator; - private String catalogSeparator; - private Set commands = new HashSet<>(); - private String[] singleLineComments; - private char[] singleLineCommentStart; - - public SQLTokensParser(SQLFormatterConfiguration configuration) { - this.configuration = configuration; - this.structSeparator = configuration.getSyntaxManager().getStructSeparator(); - this.catalogSeparator = configuration.getSyntaxManager().getCatalogSeparator(); - this.quoteStrings = configuration.getSyntaxManager().getQuoteStrings(); - this.singleLineComments = configuration.getSyntaxManager().getDialect().getSingleLineComments(); - this.singleLineCommentStart = new char[this.singleLineComments.length]; - for (int i = 0; i < singleLineComments.length; i++) { - if (singleLineComments[i].isEmpty()) singleLineCommentStart[i] = 0; - else singleLineCommentStart[i] = singleLineComments[i].charAt(0); - } - - String delimiterRedefiner = configuration.getSyntaxManager().getDialect().getScriptDelimiterRedefiner(); - if (!CommonUtils.isEmpty(delimiterRedefiner)) { - commands.add(delimiterRedefiner.toUpperCase(Locale.ENGLISH)); - } - } - - public static boolean isSpace(final char argChar) { - return Character.isWhitespace(argChar); - } - - public static boolean isLetter(final char argChar) { - return !isSpace(argChar) && !isDigit(argChar) && !isSymbol(argChar); - } - - public static boolean isDigit(final char argChar) { - return Character.isDigit(argChar); - } - - public static boolean isSymbol(final char argChar) { - switch (argChar) { - case '"': // double quote - case '?': // question mark - case '%': // percent - case '&': // ampersand - case '\'': // quote - case '(': // left paren - case ')': // right paren - case '|': // vertical bar - case '*': // asterisk - case '+': // plus sign - case ',': // comma - case '-': // minus sign - case '.': // period - case '/': // solidus - case ':': // colon - case ';': // semicolon - case '<': // less than operator - case '=': // equals operator - case '>': // greater than operator - case '!': // greater than operator - case '~': // greater than operator - case '`': // apos - case '[': // bracket open - case ']': // bracket close - case '#': // - return true; - default: - return false; - } - } - - FormatterToken nextToken() { - int start_pos = fPos; - if (fPos >= fBefore.length()) { - fPos++; - return new FormatterToken(TokenType.END, "", start_pos); - } - - char fChar = fBefore.charAt(fPos); - - if (isSpace(fChar)) { - StringBuilder workString = new StringBuilder(); - for (;;) { - workString.append(fChar); - fChar = fBefore.charAt(fPos); - if (!isSpace(fChar)) { - return new FormatterToken(TokenType.SPACE, workString.toString(), start_pos); - } - fPos++; - if (fPos >= fBefore.length()) { - return new FormatterToken(TokenType.SPACE, workString.toString(), start_pos); - } - } - } else if (fChar == ';') { - fPos++; - return new FormatterToken(TokenType.SYMBOL, ";", start_pos); - } else if (isDigit(fChar)) { - StringBuilder s = new StringBuilder(); - while (isDigit(fChar) || fChar == '.' || fChar == 'e' || fChar == 'E') { - // if (ch == '.') type = Token.REAL; - s.append(fChar); - fPos++; - - if (fPos >= fBefore.length()) { - break; - } - - fChar = fBefore.charAt(fPos); - } - return new FormatterToken(TokenType.VALUE, s.toString(), start_pos); - } - // single line comment - else if (ArrayUtils.contains(singleLineCommentStart, fChar)) { - fPos++; - String commentString = null; - for (String slc : singleLineComments) { - if (fBefore.length() >= start_pos + slc.length() && slc.equals(fBefore.substring(start_pos, start_pos + slc.length()))) { - commentString = slc; - break; - } - } - if (commentString == null) { - return new FormatterToken(TokenType.SYMBOL, String.valueOf(fChar), start_pos); - } - fPos += commentString.length() - 1; - while (fPos < fBefore.length()) { - fPos++; - if (fBefore.charAt(fPos - 1) == '\n') { - break; - } - } - commentString = fBefore.substring(start_pos, fPos); - return new FormatterToken(TokenType.COMMENT, commentString, start_pos); - } - else if (isLetter(fChar)) { - StringBuilder s = new StringBuilder(); - while (isLetter(fChar) || isDigit(fChar) || fChar == '*' || structSeparator == fChar || catalogSeparator.indexOf(fChar) != -1) { - s.append(fChar); - fPos++; - if (fPos >= fBefore.length()) { - break; - } - - fChar = fBefore.charAt(fPos); - } - String word = s.toString(); - if (commands.contains(word.toUpperCase(Locale.ENGLISH))) { - s.setLength(0); - for (; fPos < fBefore.length(); fPos++) { - fChar = fBefore.charAt(fPos); - if (fChar == '\n' || fChar == '\r') { - break; - } else { - s.append(fChar); - } - } - return new FormatterToken(TokenType.COMMAND, word + s.toString(), start_pos); - } - if (configuration.getSyntaxManager().getDialect().getKeywordType(word) != null) { - return new FormatterToken(TokenType.KEYWORD, word, start_pos); - } - return new FormatterToken(TokenType.NAME, word, start_pos); - } - else if (fChar == '/') { - fPos++; - char ch2 = fBefore.charAt(fPos); - if (ch2 != '*') { - return new FormatterToken(TokenType.SYMBOL, "/", start_pos); - } - - StringBuilder s = new StringBuilder("/*"); - fPos++; - for (;;) { - int ch0 = fChar; - fChar = fBefore.charAt(fPos); - s.append(fChar); - fPos++; - if (ch0 == '*' && fChar == '/') { - return new FormatterToken(TokenType.COMMENT, s.toString(), start_pos); - } - } - } else { - if (fChar == '\'' || isQuoteChar(fChar)) { - fPos++; - char endQuoteChar = fChar; - // Close quote char may differ - if (quoteStrings != null) { - for (String[] quoteString : quoteStrings) { - if (quoteString[0].charAt(0) == endQuoteChar) { - endQuoteChar = quoteString[1].charAt(0); - break; - } - } - } - - StringBuilder s = new StringBuilder(); - s.append(fChar); - int posMark = fPos; - while (fPos < fBefore.length()) { - fChar = fBefore.charAt(fPos); - s.append(fChar); - fPos++; - char fNextChar = fPos >= fBefore.length() - 1 ? 0 : fBefore.charAt(fPos); - if (fChar == endQuoteChar && fNextChar == endQuoteChar) { - // Escaped quote - s.append(fChar); - fPos++; - continue; - } - if (fChar == endQuoteChar) { - return new FormatterToken(TokenType.VALUE, s.toString(), start_pos); - } - } - // Bad quoting (no close quote) - fPos = posMark; - return new FormatterToken(TokenType.SYMBOL, String.valueOf(s.charAt(0)), start_pos); - } - - else if (isSymbol(fChar)) { - String s = String.valueOf(fChar); - fPos++; - if (fPos >= fBefore.length()) { - return new FormatterToken(TokenType.SYMBOL, s, start_pos); - } - char ch2 = fBefore.charAt(fPos); - for (int i = 0; i < twoCharacterSymbol.length; i++) { - if (twoCharacterSymbol[i].charAt(0) == fChar && twoCharacterSymbol[i].charAt(1) == ch2) { - fPos++; - s += ch2; - break; - } - } - return new FormatterToken(TokenType.SYMBOL, s, start_pos); - } else { - fPos++; - return new FormatterToken(TokenType.UNKNOWN, String.valueOf(fChar), start_pos); - } - } - } - - private boolean isQuoteChar(char fChar) { - if (quoteStrings != null) { - for (int i = 0; i < quoteStrings.length; i++) { - if (quoteStrings[i][0].charAt(0) == fChar) { - return true; - } - } - } - return false; - } - - public List parse(final String argSql) { - fPos = 0; - fBefore = argSql; - - final List list = new ArrayList<>(); - for (;;) { - final FormatterToken token = nextToken(); - if (token.getType() == TokenType.END) { - break; - } - - list.add(token); - } - return list; - } -} +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jkiss.dbeaver.model.sql.format.tokenized; + +import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration; +import org.jkiss.utils.ArrayUtils; +import org.jkiss.utils.CommonUtils; + +import java.util.*; + +/** + * SQLTokensParser + * TODO: check comment characters from syntax manager, not constants + */ +class SQLTokensParser { + + private static final String[] twoCharacterSymbol = { "<>", "<=", ">=", "||", "()", "!=", ":=", ".*" }; + + private final SQLFormatterConfiguration configuration; + private final String[][] quoteStrings; + private String fBefore; + private int fPos; + private char structSeparator; + private String catalogSeparator; + private Set commands = new HashSet<>(); + private String[] singleLineComments; + private char[] singleLineCommentStart; + + public SQLTokensParser(SQLFormatterConfiguration configuration) { + this.configuration = configuration; + this.structSeparator = configuration.getSyntaxManager().getStructSeparator(); + this.catalogSeparator = configuration.getSyntaxManager().getCatalogSeparator(); + this.quoteStrings = configuration.getSyntaxManager().getQuoteStrings(); + this.singleLineComments = configuration.getSyntaxManager().getDialect().getSingleLineComments(); + this.singleLineCommentStart = new char[this.singleLineComments.length]; + for (int i = 0; i < singleLineComments.length; i++) { + if (singleLineComments[i].isEmpty()) singleLineCommentStart[i] = 0; + else singleLineCommentStart[i] = singleLineComments[i].charAt(0); + } + + String delimiterRedefiner = configuration.getSyntaxManager().getDialect().getScriptDelimiterRedefiner(); + if (!CommonUtils.isEmpty(delimiterRedefiner)) { + commands.add(delimiterRedefiner.toUpperCase(Locale.ENGLISH)); + } + } + + public static boolean isSpace(final char argChar) { + return Character.isWhitespace(argChar); + } + + public static boolean isLetter(final char argChar) { + return !isSpace(argChar) && !isDigit(argChar) && !isSymbol(argChar); + } + + public static boolean isDigit(final char argChar) { + return Character.isDigit(argChar); + } + + public static boolean isSymbol(final char argChar) { + switch (argChar) { + case '"': // double quote + case '?': // question mark + case '%': // percent + case '&': // ampersand + case '\'': // quote + case '(': // left paren + case ')': // right paren + case '|': // vertical bar + case '*': // asterisk + case '+': // plus sign + case ',': // comma + case '-': // minus sign + case '.': // period + case '/': // solidus + case ':': // colon + case ';': // semicolon + case '<': // less than operator + case '=': // equals operator + case '>': // greater than operator + case '!': // greater than operator + case '~': // greater than operator + case '`': // apos + case '[': // bracket open + case ']': // bracket close + case '#': // + return true; + default: + return false; + } + } + + FormatterToken nextToken() { + int start_pos = fPos; + if (fPos >= fBefore.length()) { + fPos++; + return new FormatterToken(TokenType.END, "", start_pos); + } + + char fChar = fBefore.charAt(fPos); + + if (isSpace(fChar)) { + StringBuilder workString = new StringBuilder(); + for (;;) { + workString.append(fChar); + fChar = fBefore.charAt(fPos); + if (!isSpace(fChar)) { + return new FormatterToken(TokenType.SPACE, workString.toString(), start_pos); + } + fPos++; + if (fPos >= fBefore.length()) { + return new FormatterToken(TokenType.SPACE, workString.toString(), start_pos); + } + } + } else if (fChar == ';') { + fPos++; + return new FormatterToken(TokenType.SYMBOL, ";", start_pos); + } else if (isDigit(fChar)) { + StringBuilder s = new StringBuilder(); + while (isDigit(fChar) || fChar == '.' || fChar == 'e' || fChar == 'E') { + // if (ch == '.') type = Token.REAL; + s.append(fChar); + fPos++; + + if (fPos >= fBefore.length()) { + break; + } + + fChar = fBefore.charAt(fPos); + } + return new FormatterToken(TokenType.VALUE, s.toString(), start_pos); + } + // single line comment + else if (ArrayUtils.contains(singleLineCommentStart, fChar)) { + fPos++; + String commentString = null; + for (String slc : singleLineComments) { + if (fBefore.length() >= start_pos + slc.length() && slc.equals(fBefore.substring(start_pos, start_pos + slc.length()))) { + commentString = slc; + break; + } + } + if (commentString == null) { + return new FormatterToken(TokenType.SYMBOL, String.valueOf(fChar), start_pos); + } + fPos += commentString.length() - 1; + while (fPos < fBefore.length()) { + fPos++; + if (fBefore.charAt(fPos - 1) == '\n') { + break; + } + } + commentString = fBefore.substring(start_pos, fPos); + return new FormatterToken(TokenType.COMMENT, commentString, start_pos); + } + else if (isLetter(fChar)) { + StringBuilder s = new StringBuilder(); + while (isLetter(fChar) || isDigit(fChar) || fChar == '*' || structSeparator == fChar || catalogSeparator.indexOf(fChar) != -1) { + s.append(fChar); + fPos++; + if (fPos >= fBefore.length()) { + break; + } + + fChar = fBefore.charAt(fPos); + } + String word = s.toString(); + if (commands.contains(word.toUpperCase(Locale.ENGLISH))) { + s.setLength(0); + for (; fPos < fBefore.length(); fPos++) { + fChar = fBefore.charAt(fPos); + if (fChar == '\n' || fChar == '\r') { + break; + } else { + s.append(fChar); + } + } + return new FormatterToken(TokenType.COMMAND, word + s.toString(), start_pos); + } + if (configuration.getSyntaxManager().getDialect().getKeywordType(word) != null) { + return new FormatterToken(TokenType.KEYWORD, word, start_pos); + } + return new FormatterToken(TokenType.NAME, word, start_pos); + } + else if (fChar == '/') { + fPos++; + char ch2 = fBefore.charAt(fPos); + if (ch2 != '*') { + return new FormatterToken(TokenType.SYMBOL, "/", start_pos); + } + + StringBuilder s = new StringBuilder("/*"); + fPos++; + for (;;) { + int ch0 = fChar; + fChar = fBefore.charAt(fPos); + s.append(fChar); + fPos++; + if (ch0 == '*' && fChar == '/') { + return new FormatterToken(TokenType.COMMENT, s.toString(), start_pos); + } + } + } else { + if (fChar == '\'' || isQuoteChar(fChar)) { + fPos++; + char endQuoteChar = fChar; + // Close quote char may differ + if (quoteStrings != null) { + for (String[] quoteString : quoteStrings) { + if (quoteString[0].charAt(0) == endQuoteChar) { + endQuoteChar = quoteString[1].charAt(0); + break; + } + } + } + + StringBuilder s = new StringBuilder(); + s.append(fChar); + int posMark = fPos; + while (fPos < fBefore.length()) { + fChar = fBefore.charAt(fPos); + s.append(fChar); + fPos++; + char fNextChar = fPos >= fBefore.length() - 1 ? 0 : fBefore.charAt(fPos); + if (fChar == endQuoteChar && fNextChar == endQuoteChar) { + // Escaped quote + s.append(fChar); + fPos++; + continue; + } + if (fChar == endQuoteChar) { + return new FormatterToken(TokenType.VALUE, s.toString(), start_pos); + } + } + // Bad quoting (no close quote) + fPos = posMark; + return new FormatterToken(TokenType.SYMBOL, String.valueOf(s.charAt(0)), start_pos); + } + + else if (isSymbol(fChar)) { + String s = String.valueOf(fChar); + fPos++; + if (fPos >= fBefore.length()) { + return new FormatterToken(TokenType.SYMBOL, s, start_pos); + } + char ch2 = fBefore.charAt(fPos); + for (int i = 0; i < twoCharacterSymbol.length; i++) { + if (twoCharacterSymbol[i].charAt(0) == fChar && twoCharacterSymbol[i].charAt(1) == ch2) { + fPos++; + s += ch2; + break; + } + } + return new FormatterToken(TokenType.SYMBOL, s, start_pos); + } else { + fPos++; + return new FormatterToken(TokenType.UNKNOWN, String.valueOf(fChar), start_pos); + } + } + } + + private boolean isQuoteChar(char fChar) { + if (quoteStrings != null) { + for (int i = 0; i < quoteStrings.length; i++) { + if (quoteStrings[i][0].charAt(0) == fChar) { + return true; + } + } + } + return false; + } + + public List parse(final String argSql) { + fPos = 0; + fBefore = argSql; + + final List list = new ArrayList<>(); + for (;;) { + final FormatterToken token = nextToken(); + if (token.getType() == TokenType.END) { + break; + } + + list.add(token); + } + return list; + } +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/TokenType.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/TokenType.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/TokenType.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/format/tokenized/TokenType.java diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/internal/SQLModelPreferencesInitializer.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/internal/SQLModelPreferencesInitializer.java new file mode 100644 index 0000000000..a2eda0bf26 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/internal/SQLModelPreferencesInitializer.java @@ -0,0 +1,40 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.model.sql.internal; + +import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; +import org.jkiss.dbeaver.ModelPreferences; +import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; +import org.jkiss.dbeaver.model.sql.SQLModelPreferences; +import org.jkiss.dbeaver.model.sql.format.tokenized.SQLFormatterTokenized; +import org.jkiss.dbeaver.utils.PrefUtils; + +public class SQLModelPreferencesInitializer extends AbstractPreferenceInitializer { + + public SQLModelPreferencesInitializer() { + } + + @Override + public void initializeDefaultPreferences() { + // Init default preferences + DBPPreferenceStore store = ModelPreferences.getPreferences(); + + // Common + PrefUtils.setDefaultPreferenceValue(store, SQLModelPreferences.SQL_FORMAT_FORMATTER, SQLFormatterTokenized.FORMATTER_ID); + } + +} diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterConfigurationRegistry.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLFormatterConfigurationRegistry.java similarity index 83% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterConfigurationRegistry.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLFormatterConfigurationRegistry.java index 3263208a60..5e141a4eac 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterConfigurationRegistry.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLFormatterConfigurationRegistry.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.registry; +package org.jkiss.dbeaver.model.sql.registry; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; @@ -99,20 +99,4 @@ public class SQLFormatterConfigurationRegistry implements SQLFormatterRegistry } } - @Nullable - public SQLFormatterConfigurator createConfigurator(SQLFormatterConfiguration configuration) { - final String formatterId = configuration.getFormatterId(); - SQLFormatterDescriptor formatterDesc = getFormatter(formatterId); - if (formatterDesc == null) { - log.error("Formatter '" + formatterId + "' not found"); - return null; - } - try { - return formatterDesc.createConfigurer(); - } catch (DBException e) { - log.error("Error creating and configuring formatter", e); - return null; - } - } - } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterDescriptor.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLFormatterDescriptor.java similarity index 73% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterDescriptor.java rename to plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLFormatterDescriptor.java index 0718832f3d..017ab1cd5d 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterDescriptor.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLFormatterDescriptor.java @@ -15,16 +15,14 @@ * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.registry; +package org.jkiss.dbeaver.model.sql.registry; import org.eclipse.core.runtime.IConfigurationElement; -import org.jkiss.code.Nullable; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.impl.AbstractContextDescriptor; import org.jkiss.dbeaver.model.impl.AbstractDescriptor; import org.jkiss.dbeaver.model.sql.format.SQLFormatter; -import org.jkiss.dbeaver.model.impl.AbstractContextDescriptor; -import org.jkiss.utils.CommonUtils; /** * SQLFormatterDescriptor @@ -37,8 +35,6 @@ public class SQLFormatterDescriptor extends AbstractContextDescriptor { private final String label; private final String description; private final AbstractDescriptor.ObjectType formatterImplClass; - private final AbstractDescriptor.ObjectType configurerImplClass; - public SQLFormatterDescriptor(IConfigurationElement config) { super(config); @@ -46,11 +42,6 @@ public class SQLFormatterDescriptor extends AbstractContextDescriptor { this.label = config.getAttribute("label"); this.description = config.getAttribute("description"); this.formatterImplClass = new AbstractDescriptor.ObjectType(config.getAttribute("class")); - if (!CommonUtils.isEmpty(config.getAttribute("configurerClass"))) { - this.configurerImplClass = new AbstractDescriptor.ObjectType(config.getAttribute("configurerClass")); - } else { - this.configurerImplClass = null; - } } public String getId() { @@ -71,13 +62,4 @@ public class SQLFormatterDescriptor extends AbstractContextDescriptor { return formatterImplClass.createInstance(SQLFormatter.class); } - @Nullable - public SQLFormatterConfigurator createConfigurer() - throws DBException { - if (configurerImplClass == null) { - return null; - } - return configurerImplClass.createInstance(SQLFormatterConfigurator.class); - } - } diff --git a/plugins/org.jkiss.dbeaver.model/tests/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenizedTest.java b/plugins/org.jkiss.dbeaver.model.sql/tests/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenizedTest.java similarity index 100% rename from plugins/org.jkiss.dbeaver.model/tests/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenizedTest.java rename to plugins/org.jkiss.dbeaver.model.sql/tests/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenizedTest.java diff --git a/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF index 4ddea3a4b5..61cdfe0709 100644 --- a/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF @@ -59,9 +59,6 @@ Export-Package: org.jkiss.dbeaver, org.jkiss.dbeaver.model.runtime.load, org.jkiss.dbeaver.model.sql, org.jkiss.dbeaver.model.sql.eval, - org.jkiss.dbeaver.model.sql.format, - org.jkiss.dbeaver.model.sql.format.external, - org.jkiss.dbeaver.model.sql.format.tokenized, org.jkiss.dbeaver.model.sql.parser, org.jkiss.dbeaver.model.struct, org.jkiss.dbeaver.model.struct.rdb, diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/ModelPreferences.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/ModelPreferences.java index ed423febe6..65ff874735 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/ModelPreferences.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/ModelPreferences.java @@ -25,7 +25,6 @@ import org.jkiss.dbeaver.model.impl.preferences.BundlePreferenceStore; import org.jkiss.dbeaver.model.qm.QMConstants; import org.jkiss.dbeaver.model.qm.QMObjectType; import org.jkiss.dbeaver.model.sql.SQLConstants; -import org.jkiss.dbeaver.model.sql.format.tokenized.SQLFormatterTokenized; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.PrefUtils; import org.osgi.framework.Bundle; @@ -96,7 +95,6 @@ public final class ModelPreferences public static final String SQL_VARIABLES_ENABLED = "sql.variables.enabled"; //$NON-NLS-1$ public static final String SQL_FILTER_FORCE_SUBSELECT = "sql.query.filter.force.subselect"; //$NON-NLS-1$ - public final static String SQL_FORMAT_FORMATTER = "sql.format.formatter"; public final static String SQL_FORMAT_KEYWORD_CASE = "sql.format.keywordCase"; public final static String SQL_FORMAT_EXTERNAL_CMD = "sql.format.external.cmd"; public final static String SQL_FORMAT_EXTERNAL_FILE = "sql.format.external.file"; @@ -212,7 +210,6 @@ public final class ModelPreferences PrefUtils.setDefaultPreferenceValue(store, SQL_VARIABLES_ENABLED, true); PrefUtils.setDefaultPreferenceValue(store, SQL_FILTER_FORCE_SUBSELECT, false); - PrefUtils.setDefaultPreferenceValue(store, SQL_FORMAT_FORMATTER, SQLFormatterTokenized.FORMATTER_ID); PrefUtils.setDefaultPreferenceValue(store, SQL_FORMAT_KEYWORD_CASE, ""); PrefUtils.setDefaultPreferenceValue(store, SQL_FORMAT_LF_BEFORE_COMMA, false); PrefUtils.setDefaultPreferenceValue(store, SQL_FORMAT_EXTERNAL_CMD, ""); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPPlatform.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPPlatform.java index 42da2b0acc..87ead34b18 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPPlatform.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPPlatform.java @@ -28,7 +28,6 @@ import org.jkiss.dbeaver.model.navigator.DBNModel; import org.jkiss.dbeaver.model.qm.QMController; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.OSDescriptor; -import org.jkiss.dbeaver.model.sql.format.SQLFormatterRegistry; import java.io.File; import java.io.IOException; @@ -78,9 +77,6 @@ public interface DBPPlatform @NotNull DBPDataFormatterRegistry getDataFormatterRegistry(); - @NotNull - SQLFormatterRegistry getSQLFormatterRegistry(); - @NotNull DBPPreferenceStore getPreferenceStore(); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLUtils.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLUtils.java index 6897a7720f..cca117b176 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLUtils.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLUtils.java @@ -30,8 +30,6 @@ import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -import org.jkiss.dbeaver.model.sql.format.SQLFormatter; -import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration; import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey; import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKeyColumn; @@ -295,18 +293,6 @@ public final class SQLUtils { return result.toString(); } - public static String formatSQL(SQLDataSource dataSource, String query) - { - SQLSyntaxManager syntaxManager = new SQLSyntaxManager(); - syntaxManager.init(dataSource.getSQLDialect(), dataSource.getContainer().getPreferenceStore()); - SQLFormatterConfiguration configuration = new SQLFormatterConfiguration(dataSource, syntaxManager); - SQLFormatter formatter = dataSource.getDataSource().getContainer().getPlatform().getSQLFormatterRegistry().createFormatter(configuration); - if (formatter == null) { - return query; - } - return formatter.format(query, configuration); - } - public static void appendLikeCondition(StringBuilder sql, String value, boolean not) { value = makeSQLLike(value); diff --git a/plugins/org.jkiss.dbeaver.net.ssh.ui/src/org/jkiss/dbeaver/ui/net/ssh/SSHTunnelConfiguratorUI.java b/plugins/org.jkiss.dbeaver.net.ssh.ui/src/org/jkiss/dbeaver/ui/net/ssh/SSHTunnelConfiguratorUI.java index 8692904666..2c415210c1 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.ui/src/org/jkiss/dbeaver/ui/net/ssh/SSHTunnelConfiguratorUI.java +++ b/plugins/org.jkiss.dbeaver.net.ssh.ui/src/org/jkiss/dbeaver/ui/net/ssh/SSHTunnelConfiguratorUI.java @@ -269,6 +269,11 @@ public class SSHTunnelConfiguratorUI implements IObjectPropertyConfigurator - @@ -39,12 +38,6 @@ --> - - - - - - diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLFormat.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLFormat.java index 69122c94e1..2270960433 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLFormat.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLFormat.java @@ -17,6 +17,7 @@ */ package org.jkiss.dbeaver.ui.editors.sql.preferences; +import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; @@ -31,21 +32,26 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorSite; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.ModelPreferences; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBPIdentifierCase; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; +import org.jkiss.dbeaver.model.sql.SQLModelPreferences; +import org.jkiss.dbeaver.model.sql.format.SQLFormatter; +import org.jkiss.dbeaver.model.sql.format.external.SQLFormatterExternal; +import org.jkiss.dbeaver.model.sql.format.tokenized.SQLFormatterTokenized; +import org.jkiss.dbeaver.model.sql.registry.SQLFormatterConfigurationRegistry; +import org.jkiss.dbeaver.model.sql.registry.SQLFormatterDescriptor; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.editors.StringEditorInput; import org.jkiss.dbeaver.ui.editors.SubEditorSite; import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase; import org.jkiss.dbeaver.ui.editors.sql.SQLPreferenceConstants; +import org.jkiss.dbeaver.ui.editors.sql.preferences.format.SQLExternalFormatterConfigurationPage; +import org.jkiss.dbeaver.ui.editors.sql.preferences.format.SQLFormatterConfigurator; +import org.jkiss.dbeaver.ui.editors.sql.preferences.format.tokenized.SQLTokenizedFormatterConfigurationPage; import org.jkiss.dbeaver.ui.editors.sql.internal.SQLEditorMessages; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterConfigurationRegistry; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterConfigurator; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterDescriptor; import org.jkiss.dbeaver.ui.preferences.TargetPrefPage; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.GeneralUtils; @@ -91,7 +97,7 @@ public class PrefPageSQLFormat extends TargetPrefPage return store.contains(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS) || - store.contains(ModelPreferences.SQL_FORMAT_FORMATTER); + store.contains(SQLModelPreferences.SQL_FORMAT_FORMATTER); } @Override @@ -221,7 +227,7 @@ public class PrefPageSQLFormat extends TargetPrefPage { styleBoldKeywords.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS)); - String formatterId = store.getString(ModelPreferences.SQL_FORMAT_FORMATTER); + String formatterId = store.getString(SQLModelPreferences.SQL_FORMAT_FORMATTER); for (int i = 0; i < formatters.size(); i++) { if (formatters.get(i).getId().equalsIgnoreCase(formatterId)) { formatterSelector.select(i); @@ -242,7 +248,7 @@ public class PrefPageSQLFormat extends TargetPrefPage } store.setValue(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS, styleBoldKeywords.getSelection()); - store.setValue(ModelPreferences.SQL_FORMAT_FORMATTER, + store.setValue(SQLModelPreferences.SQL_FORMAT_FORMATTER, formatters.get(formatterSelector.getSelectionIndex()).getId().toUpperCase(Locale.ENGLISH)); PrefUtils.savePreferenceStore(store); @@ -253,7 +259,7 @@ public class PrefPageSQLFormat extends TargetPrefPage { store.setToDefault(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS); - store.setToDefault(ModelPreferences.SQL_FORMAT_FORMATTER); + store.setToDefault(SQLModelPreferences.SQL_FORMAT_FORMATTER); if (curConfigurator != null) { curConfigurator.resetSettings(store); } @@ -280,11 +286,19 @@ public class PrefPageSQLFormat extends TargetPrefPage SQLFormatterDescriptor selFormatter = formatters.get(formatterSelector.getSelectionIndex()); try { - curConfigurator = selFormatter.createConfigurer(); - if (curConfigurator != null) { + SQLFormatter sqlFormatter = selFormatter.createFormatter(); + // FIXME: this is a dirty hack because I'm too lazy to make proper registry/adapter for formatter UI configurators + // FIXME: for now we support only predefined list of formatters + if (sqlFormatter instanceof SQLFormatterTokenized) { + curConfigurator = new SQLTokenizedFormatterConfigurationPage(); + } else if (sqlFormatter instanceof SQLFormatterExternal) { + curConfigurator = new SQLExternalFormatterConfigurationPage(); + } else { + curConfigurator = GeneralUtils.adapt(sqlFormatter, SQLFormatterConfigurator.class); + } + if (curConfigurator instanceof IDialogPage) { curConfigurator.configure(selFormatter); - - curConfigurator.createControl(formatterConfigPlaceholder); + ((IDialogPage)curConfigurator).createControl(formatterConfigPlaceholder); curConfigurator.loadSettings(getTargetPreferenceStore()); } } catch (DBException e) { @@ -312,4 +326,4 @@ public class PrefPageSQLFormat extends TargetPrefPage sqlViewer.reloadSyntaxRules(); } -} \ No newline at end of file +} diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/BaseFormatterConfigurationPage.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/BaseFormatterConfigurationPage.java similarity index 92% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/BaseFormatterConfigurationPage.java rename to plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/BaseFormatterConfigurationPage.java index 2556117f5b..763cca6ba5 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/BaseFormatterConfigurationPage.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/BaseFormatterConfigurationPage.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.format; +package org.jkiss.dbeaver.ui.editors.sql.preferences.format; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.swt.widgets.Composite; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterConfigurator; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterDescriptor; +import org.jkiss.dbeaver.model.sql.registry.SQLFormatterDescriptor; public abstract class BaseFormatterConfigurationPage extends DialogPage implements SQLFormatterConfigurator { diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/SQLExternalFormatterConfigurationPage.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/SQLExternalFormatterConfigurationPage.java similarity index 98% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/SQLExternalFormatterConfigurationPage.java rename to plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/SQLExternalFormatterConfigurationPage.java index 066f9c0636..39f68d07aa 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/SQLExternalFormatterConfigurationPage.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/SQLExternalFormatterConfigurationPage.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.format; +package org.jkiss.dbeaver.ui.editors.sql.preferences.format; import org.eclipse.jface.fieldassist.SimpleContentProposalProvider; import org.eclipse.jface.fieldassist.TextContentAdapter; diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterConfigurator.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/SQLFormatterConfigurator.java similarity index 83% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterConfigurator.java rename to plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/SQLFormatterConfigurator.java index 09c1817051..2b9c484b04 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/registry/SQLFormatterConfigurator.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/SQLFormatterConfigurator.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.registry; +package org.jkiss.dbeaver.ui.editors.sql.preferences.format; -import org.eclipse.jface.dialogs.IDialogPage; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; +import org.jkiss.dbeaver.model.sql.registry.SQLFormatterDescriptor; /** - * SQL Formatter configurer + * SQL Formatter configurator */ -public interface SQLFormatterConfigurator extends IDialogPage { +public interface SQLFormatterConfigurator { /** * Sets configuration parameters diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/tokenized/SQLTokenizedFormatterConfigurationPage.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/tokenized/SQLTokenizedFormatterConfigurationPage.java similarity index 97% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/tokenized/SQLTokenizedFormatterConfigurationPage.java rename to plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/tokenized/SQLTokenizedFormatterConfigurationPage.java index 6eafeffcde..da2f1b2267 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/format/tokenized/SQLTokenizedFormatterConfigurationPage.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/format/tokenized/SQLTokenizedFormatterConfigurationPage.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.format.tokenized; +package org.jkiss.dbeaver.ui.editors.sql.preferences.format.tokenized; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; @@ -26,7 +26,7 @@ import org.jkiss.dbeaver.ModelPreferences; import org.jkiss.dbeaver.model.DBPIdentifierCase; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.editors.sql.format.BaseFormatterConfigurationPage; +import org.jkiss.dbeaver.ui.editors.sql.preferences.format.BaseFormatterConfigurationPage; import org.jkiss.dbeaver.ui.editors.sql.internal.SQLEditorMessages; import org.jkiss.utils.CommonUtils; diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLFormattingStrategy.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLFormattingStrategy.java index 8b51c84412..bd71be4bf7 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLFormattingStrategy.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLFormattingStrategy.java @@ -22,7 +22,7 @@ import org.eclipse.jface.text.source.ISourceViewer; import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; import org.jkiss.dbeaver.model.sql.format.SQLFormatter; import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration; -import org.jkiss.dbeaver.ui.editors.sql.registry.SQLFormatterConfigurationRegistry; +import org.jkiss.dbeaver.model.sql.registry.SQLFormatterConfigurationRegistry; import org.jkiss.dbeaver.ui.editors.sql.SQLEditorSourceViewerConfiguration; /** diff --git a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java index a78a93959e..be6e0eba01 100644 --- a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/IObjectPropertyConfigurator.java @@ -19,7 +19,7 @@ package org.jkiss.dbeaver.ui; import org.eclipse.swt.widgets.Composite; /** - * IDataSourceConnectionEditor + * IObjectPropertyConfigurator */ public interface IObjectPropertyConfigurator { @@ -29,6 +29,8 @@ public interface IObjectPropertyConfigurator void saveSettings(T configuration); + void resetSettings(T configuration); + boolean isComplete(); } -- GitLab