From a86630a65793e01c2812c88e378e4c9da73e850b Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Fri, 10 Jan 2020 14:14:15 +0300 Subject: [PATCH] NPE fixes --- .../model/sql/parser/SQLParserContext.java | 22 +++++++++++++------ .../org/jkiss/dbeaver/model/sql/SQLUtils.java | 4 ++-- .../dbeaver/ui/editors/sql/SQLEditorBase.java | 19 +++++++++++++--- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLParserContext.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLParserContext.java index 05e73996cc..0584fed582 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLParserContext.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/parser/SQLParserContext.java @@ -19,12 +19,16 @@ package org.jkiss.dbeaver.model.sql.parser; import org.eclipse.jface.text.IDocument; import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.DBPContextProvider; import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.model.text.parser.TPRuleBasedScanner; +import org.jkiss.dbeaver.runtime.DBWorkbench; /** * Parser context @@ -32,7 +36,7 @@ import org.jkiss.dbeaver.model.text.parser.TPRuleBasedScanner; public class SQLParserContext { @NotNull - private final DBPDataSource dataSource; + private final DBPContextProvider contextProvider; @NotNull private final SQLSyntaxManager syntaxManager; @NotNull @@ -41,16 +45,17 @@ public class SQLParserContext { private final IDocument document; private TPRuleBasedScanner scanner; - public SQLParserContext(@NotNull DBPDataSource dataSource, @NotNull SQLSyntaxManager syntaxManager, @NotNull SQLRuleManager ruleManager, @NotNull IDocument document) { - this.dataSource = dataSource; + public SQLParserContext(@NotNull DBPContextProvider contextProvider, @NotNull SQLSyntaxManager syntaxManager, @NotNull SQLRuleManager ruleManager, @NotNull IDocument document) { + this.contextProvider = contextProvider; this.syntaxManager = syntaxManager; this.ruleManager = ruleManager; this.document = document; } - @NotNull + @Nullable public DBPDataSource getDataSource() { - return dataSource; + DBCExecutionContext executionContext = contextProvider.getExecutionContext(); + return executionContext == null ? null : executionContext.getDataSource(); } @NotNull @@ -69,7 +74,7 @@ public class SQLParserContext { } public SQLDialect getDialect() { - return SQLUtils.getDialectFromDataSource(dataSource); + return SQLUtils.getDialectFromDataSource(getDataSource()); } public TPRuleBasedScanner getScanner() { @@ -81,7 +86,10 @@ public class SQLParserContext { } public DBPPreferenceStore getPreferenceStore() { - return dataSource.getContainer().getPreferenceStore(); + DBPDataSource dataSource = getDataSource(); + return dataSource == null ? + DBWorkbench.getPlatform().getPreferenceStore() : + dataSource.getContainer().getPreferenceStore(); } void startScriptEvaluation() { 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 e3a16d32f7..765856f947 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 @@ -410,8 +410,8 @@ public final class SQLUtils { } @NotNull - public static SQLDialect getDialectFromDataSource(@NotNull DBPDataSource dataSource) { - return dataSource.getSQLDialect(); + public static SQLDialect getDialectFromDataSource(@Nullable DBPDataSource dataSource) { + return dataSource == null ? BasicSQLDialect.INSTANCE : dataSource.getSQLDialect(); } public static void appendConditionString( diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java index 0f1e73a6d2..1ce5923a8f 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java @@ -98,6 +98,7 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext private final SQLSyntaxManager syntaxManager; @NotNull private final SQLRuleScanner ruleScanner; + @Nullable private SQLParserContext parserContext; private ProjectionSupport projectionSupport; @@ -555,7 +556,7 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext ruleManager.loadRules(getDataSource(), SQLEditorBase.isBigScript(getEditorInput())); ruleScanner.refreshRules(getDataSource(), ruleManager); - parserContext = new SQLParserContext(getDataSource(), syntaxManager, ruleManager, document != null ? document : new Document()); + parserContext = new SQLParserContext(SQLEditorBase.this, syntaxManager, ruleManager, document != null ? document : new Document()); if (document instanceof IDocumentExtension3) { IDocumentPartitioner partitioner = new FastPartitioner( @@ -631,21 +632,30 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext @Nullable public SQLScriptElement extractActiveQuery() { + if (parserContext == null) { + return null; + } ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection(); return SQLScriptParser.extractActiveQuery(parserContext, selection.getOffset(), selection.getLength()); } public SQLScriptElement extractQueryAtPos(int currentPos) { - return SQLScriptParser.extractQueryAtPos(parserContext, currentPos); + return parserContext == null ? null : SQLScriptParser.extractQueryAtPos(parserContext, currentPos); } public SQLScriptElement extractNextQuery(boolean next) { + if (parserContext == null) { + return null; + } ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection(); int offset = selection.getOffset(); return SQLScriptParser.extractNextQuery(parserContext, offset, next); } public List extractScriptQueries(int startOffset, int length, boolean scriptMode, boolean keepDelimiters, boolean parseParameters) { + if (parserContext == null) { + return null; + } return SQLScriptParser.extractScriptQueries(parserContext, startOffset, length, scriptMode, keepDelimiters, parseParameters); } @@ -654,7 +664,10 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext } List parseQueryParameters(SQLQuery query) { - SQLParserContext context = new SQLParserContext(getDataSource(), parserContext.getSyntaxManager(), parserContext.getRuleManager(), new Document(query.getText())); + if (parserContext == null) { + return null; + } + SQLParserContext context = new SQLParserContext(SQLEditorBase.this, parserContext.getSyntaxManager(), parserContext.getRuleManager(), new Document(query.getText())); return SQLScriptParser.parseParameters(context, 0, query.getLength()); } -- GitLab