From 55a3d49f5632ab14f143effb53860217ec0ab2cf Mon Sep 17 00:00:00 2001 From: kit Date: Wed, 2 Jan 2019 18:13:58 +0200 Subject: [PATCH 01/16] left-margin badge now executes queries with params --- .../actions/execute/ExecuteQueryAction.java | 27 ++++++++++--------- .../linemarker/CypherLineMarkerProvider.java | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/ExecuteQueryAction.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/ExecuteQueryAction.java index d20c01d1..85dca6b3 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/ExecuteQueryAction.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/ExecuteQueryAction.java @@ -51,9 +51,9 @@ public class ExecuteQueryAction extends AnAction { public ExecuteQueryAction() { } - private String preSetQuery; + private PsiElement preSetQuery; - public ExecuteQueryAction(String element) { + public ExecuteQueryAction(PsiElement element) { preSetQuery = element; } @@ -104,21 +104,14 @@ public void actionPerformed(AnActionEvent e) { PsiElement cypherStatement = getCypherStatementAtOffset(psiFile, caret.getOffset()); if (nonNull(cypherStatement)) { query = cypherStatement.getText(); - try { // support parameters for PsiElement only - ParametersService service = ServiceManager.getService(project, ParametersService.class); - parameters = service.getParameters(cypherStatement); - } catch (Exception exception) { - sendParametersRetrievalErrorEvent(messageBus, exception, editor); - return; - } + parameters = getParametersFromQuery(cypherStatement, project, editor); } } } - - } else { - query = preSetQuery; analyticsEvent = CONTENT_FROM_LINE_MARKER_ACTION; + query = preSetQuery.getText(); + parameters = getParametersFromQuery(preSetQuery, project, editor); } Analytics.event("query-content", analyticsEvent); @@ -161,6 +154,16 @@ public void actionPerformed(AnActionEvent e) { } } + private Map getParametersFromQuery(PsiElement query, Project project, Editor editor) { + try { // support parameters for PsiElement only + ParametersService service = ServiceManager.getService(project, ParametersService.class); + return service.getParameters(query); + } catch (Exception exception) { + sendParametersRetrievalErrorEvent(project.getMessageBus(), exception, editor); + return Collections.emptyMap(); + } + } + private String getQueryExecutionAction(AnActionEvent e) { return e.getInputEvent() instanceof KeyEvent ? EXECUTE_WITH_SHORTCUT_ACTION : EXECUTE_WITH_MOUSE_ACTION; } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/linemarker/CypherLineMarkerProvider.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/linemarker/CypherLineMarkerProvider.java index 21d6f8ef..55a20258 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/linemarker/CypherLineMarkerProvider.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/linemarker/CypherLineMarkerProvider.java @@ -47,7 +47,7 @@ public GutterIconRenderer createGutterRenderer() { return new LineMarkerGutterIconRenderer(this) { @Override public AnAction getClickAction() { - return new ExecuteQueryAction(queryElement.getText()); + return new ExecuteQueryAction(queryElement); } @Override From 80f8cd734f28ded6113c900b6861b0c7e82088dc Mon Sep 17 00:00:00 2001 From: kit Date: Fri, 4 Jan 2019 17:35:55 +0200 Subject: [PATCH 02/16] Editor for file-specific query params. Some refactoring --- .../cypher/file/CypherFileTypeFactory.java | 3 +- .../cypher/util/FileTypeExtensionUtil.java | 18 ++++++ .../analytics/listener/AnalyticsListener.java | 14 +---- .../ui/console/GraphConsoleView.form | 33 +++++++++- .../ui/console/GraphConsoleView.java | 11 ++++ .../ui/console/params/ParametersPanel.java | 62 +++++++++++++++++-- .../ui/console/params/ParametersProvider.java | 2 + .../ui/console/params/ParametersService.java | 30 ++++++--- 8 files changed, 147 insertions(+), 26 deletions(-) create mode 100644 language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java diff --git a/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/file/CypherFileTypeFactory.java b/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/file/CypherFileTypeFactory.java index 47be4e5d..05ab451c 100644 --- a/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/file/CypherFileTypeFactory.java +++ b/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/file/CypherFileTypeFactory.java @@ -2,6 +2,7 @@ import com.intellij.openapi.fileTypes.FileTypeConsumer; import com.intellij.openapi.fileTypes.FileTypeFactory; +import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.FileTypeExtensionUtil; import org.jetbrains.annotations.NotNull; /** @@ -13,6 +14,6 @@ public class CypherFileTypeFactory extends FileTypeFactory { @Override public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) { - fileTypeConsumer.consume(CypherFileType.INSTANCE, "cyp;cypher;cql"); + fileTypeConsumer.consume(CypherFileType.INSTANCE, String.join(";", FileTypeExtensionUtil.EXTENSIONS)); } } diff --git a/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java b/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java new file mode 100644 index 00000000..360b95f2 --- /dev/null +++ b/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java @@ -0,0 +1,18 @@ +package com.neueda.jetbrains.plugin.graphdb.language.cypher.util; + +import java.util.ArrayList; +import java.util.List; + +public class FileTypeExtensionUtil { + + public static final List EXTENSIONS = new ArrayList() {{ + add("cyp"); + add("cql"); + add("cypher"); + }}; + + public static boolean isCypherFileTypeExtension(String extension) { + return extension != null && EXTENSIONS.contains(extension); + } + +} diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/analytics/listener/AnalyticsListener.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/analytics/listener/AnalyticsListener.java index b17fa2fd..8f09d90c 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/analytics/listener/AnalyticsListener.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/analytics/listener/AnalyticsListener.java @@ -7,19 +7,11 @@ import com.intellij.openapi.project.ProjectManagerListener; import com.intellij.openapi.vfs.VirtualFile; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.analytics.Analytics; +import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.FileTypeExtensionUtil; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; - public class AnalyticsListener { - private static final List EXTENSIONS = new ArrayList() {{ - add("cyp"); - add("cql"); - add("cypher"); - }}; - public static void init() { projectManagerListener(); } @@ -31,14 +23,14 @@ public void projectOpened(Project project) { project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() { @Override public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - if (EXTENSIONS.contains(file.getExtension())) { + if (FileTypeExtensionUtil.EXTENSIONS.contains(file.getExtension())) { Analytics.event("file[" + file.getExtension() + "]", "opened"); } } @Override public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - if (EXTENSIONS.contains(file.getExtension())) { + if (FileTypeExtensionUtil.EXTENSIONS.contains(file.getExtension())) { Analytics.event("file[" + file.getExtension() + "]", "closed"); } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form index dbb41f25..6d2fd358 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form @@ -92,13 +92,42 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java index 919d65e9..33c9f555 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java @@ -76,6 +76,9 @@ public class GraphConsoleView implements Disposable { private JPanel parametersTab; private JBTabbedPane defaultTabContainer; private JBSplitter graphSplitter; + private JPanel globalParametersTab; + private JPanel localParametersTab; + private JBSplitter paramSplitter; private LookAndFeelService lookAndFeelService; @@ -251,4 +254,12 @@ public JPanel getParametersTab() { @Override public void dispose() { } + + public JPanel getGlobalParametersTab() { + return globalParametersTab; + } + + public JPanel getLocalParametersTab() { + return localParametersTab; + } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index fd6a1b7f..8be5d5ac 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -8,41 +8,53 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.messages.MessageBus; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.GraphConsoleView; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.util.FileUtil; +import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.FileTypeExtensionUtil; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; -import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent.*; +import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent.PARAMS_ERROR_COMMON_MSG; public class ParametersPanel implements ParametersProvider { private static final FileDocumentManager FILE_DOCUMENT_MANAGER = FileDocumentManager.getInstance(); - private Editor editor; + private Editor editor, localParamsEditor; private GraphConsoleView graphConsoleView; private MessageBus messageBus; private ParametersService service; + private Project project; public void initialize(GraphConsoleView graphConsoleView, Project project) { this.graphConsoleView = graphConsoleView; this.messageBus = project.getMessageBus(); this.service = ServiceManager.getService(project, ParametersService.class); + this.project = project; setupEditor(project); + FileEditor selectedEditor = FileEditorManager.getInstance(project).getSelectedEditor(); + if (selectedEditor != null) { + setupLocalParamEditor(project, selectedEditor.getFile()); + } } public String getParametersJson() { return editor.getDocument().getText(); } + public String getLocalParametersJson() { + return localParamsEditor != null? localParamsEditor.getDocument().getText() : null; + } + private void initializeUi() { - graphConsoleView.getParametersTab().add(editor.getComponent(), BorderLayout.CENTER); + graphConsoleView.getGlobalParametersTab().add(editor.getComponent(), BorderLayout.CENTER); service.registerParametersProvider(this); messageBus.connect().subscribe(QueryParametersRetrievalErrorEvent.QUERY_PARAMETERS_RETRIEVAL_ERROR_EVENT_TOPIC, @@ -58,6 +70,18 @@ private void initializeUi() { } HintManager.getInstance().showErrorHint(editor, errorMessage); }); + + messageBus.connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() { + // If file opened, fileOpenedSync->selectionChanged->fileOpened are called + @Override + public void selectionChanged(@NotNull FileEditorManagerEvent event) { + releaseLocalEditor(); + VirtualFile newFile = event.getNewFile(); + if (newFile != null && FileTypeExtensionUtil.isCypherFileTypeExtension(newFile.getExtension())) { + setupLocalParamEditor(project, newFile); + } + } + }); } private void setupEditor(Project project) { @@ -68,6 +92,7 @@ private void setupEditor(Project project) { editor = createEditor(project, document); editor.setHeaderComponent(new JLabel("Provide query parameters in JSON format here:")); setInitialContent(document); + initializeUi(); } catch (Throwable e) { Throwables.throwIfUnchecked(e); @@ -76,6 +101,35 @@ private void setupEditor(Project project) { }); } + private void releaseLocalEditor() { + if (localParamsEditor != null) { + graphConsoleView.getLocalParametersTab().remove(localParamsEditor.getComponent()); + if (!localParamsEditor.isDisposed()) { + EditorFactory.getInstance().releaseEditor(localParamsEditor); + } + } + localParamsEditor = null; + } + + private void setupLocalParamEditor(Project project, VirtualFile file) { + if (project == null || file == null) return; + // TODO: create temp file for each cql file, handle changes/file closing +// ApplicationManager.getApplication().runWriteAction(() -> { // TODO: remove runWriteAction? + // https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000129030-ApplicationManager-getApplication-runWriteAction-vs-WriteCommandAction-runWriteCommandAction- + try { + VirtualFile localParamFile = FileUtil.getScratchFile(project, file.getPresentableName() + ".json"); + Document localParamDocument = FILE_DOCUMENT_MANAGER.getDocument(localParamFile); + localParamsEditor = createEditor(project, localParamDocument); + localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + file.getPresentableName() + " in JSON format here:")); + setInitialContent(localParamDocument); + graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); + } catch (Throwable e) { + Throwables.throwIfUnchecked(e); + throw new RuntimeException(e); + } +// }); + } + private void setInitialContent(Document document) { if (document.getText().isEmpty()) { final Runnable setTextRunner = () -> document.setText("{}"); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java index 5cc0b5b2..c6de4d7b 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java @@ -4,4 +4,6 @@ public interface ParametersProvider { String getParametersJson(); + String getLocalParametersJson(); + } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index 66a87f31..4d072212 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -43,14 +43,19 @@ public void registerParametersProvider(final ParametersProvider parametersProvid } public Map getParameters(PsiElement element) throws Exception { - if (!isValidParametersMap(parametersProvider.getParametersJson())) { - return Collections.emptyMap(); + if (isEmptyParametersMap(parametersProvider.getLocalParametersJson())) { + if (isValidParametersMap(parametersProvider.getParametersJson())) { + Map allParameters = MAPPER + .readValue(parametersProvider.getParametersJson(), new TypeReference>() { }); + return extractQueryParameters(element, allParameters); + } else { + return Collections.emptyMap(); + } + } else { + Map allParameters = MAPPER + .readValue(parametersProvider.getLocalParametersJson(), new TypeReference>() { }); + return extractQueryParameters(element, allParameters); } - - Map allParameters = MAPPER - .readValue(parametersProvider.getParametersJson(), new TypeReference>() { }); - - return extractQueryParameters(element, allParameters); } private Map extractQueryParameters(PsiElement element, Map allParameters) { @@ -61,7 +66,7 @@ private Map extractQueryParameters(PsiElement element, Map parameterNames.contains(entry.getKey())) - .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } private Set extractParameterNames(PsiElement element) { @@ -72,6 +77,15 @@ private Set extractParameterNames(PsiElement element) { .collect(Collectors.toSet()); } + private static boolean isEmptyParametersMap(String parametersJson) { + try { + return parametersJson == null || StringUtils.isBlank(parametersJson); // TODO: check if equals "{}"? + } catch (Exception e) { + Throwables.throwIfUnchecked(e); + throw new RuntimeException(e); + } + } + private static boolean isValidParametersMap(String parametersJson) { try { if (parametersJson == null || StringUtils.isBlank(parametersJson)) { From b0eab2a03c213602454c5d208858952eea2c789b Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 7 Jan 2019 14:25:38 +0200 Subject: [PATCH 03/16] Short scratch name in local Parameters editor --- .../jetbrains/ui/console/params/ParametersPanel.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 8be5d5ac..7cd5555c 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -9,8 +9,12 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.fileEditor.*; +import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; +import com.intellij.openapi.fileEditor.impl.EditorTabPresentationUtil; +import com.intellij.openapi.fileEditor.impl.EditorWindow; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.util.messages.MessageBus; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.GraphConsoleView; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent; @@ -120,7 +124,10 @@ private void setupLocalParamEditor(Project project, VirtualFile file) { VirtualFile localParamFile = FileUtil.getScratchFile(project, file.getPresentableName() + ".json"); Document localParamDocument = FILE_DOCUMENT_MANAGER.getDocument(localParamFile); localParamsEditor = createEditor(project, localParamDocument); - localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + file.getPresentableName() + " in JSON format here:")); + Window window = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); + EditorWindow editorWindow = FileEditorManagerEx.getInstanceEx(project).getSplittersFor(window).getCurrentWindow(); + String tabTitle = EditorTabPresentationUtil.getEditorTabTitle(project, file, editorWindow); + localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " in JSON format here:")); setInitialContent(localParamDocument); graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { From 5405b5b04023be993311593e864bdb16c577633d Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 7 Jan 2019 18:28:11 +0200 Subject: [PATCH 04/16] Global/local param toggle --- .../src/main/resources/META-INF/plugin.xml | 6 ++++ .../SwitchParametersTypeUsedAction.java | 28 +++++++++++++++++++ .../component/settings/SettingsComponent.java | 4 +++ .../settings/SettingsComponentImpl.java | 11 ++++++++ .../GraphDatabaseSupportConfiguration.java | 11 +++++++- .../ui/console/params/ParametersPanel.java | 5 ++-- .../ui/console/params/ParametersService.java | 26 +++++++++++++---- 7 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/SwitchParametersTypeUsedAction.java diff --git a/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml b/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml index 80e6fee5..8dd8d1ab 100644 --- a/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml +++ b/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml @@ -217,6 +217,12 @@ icon="/actions/refresh.png" description="Clean canvas"> + + isModified = true); + rootPane.add(globalParametersCheckbox); + return rootPane; } @@ -53,12 +59,15 @@ public boolean isModified() { @Override public void apply() throws ConfigurationException { SettingsComponent.getInstance().enableAnalytics(analyticsCheckBox.isSelected()); + SettingsComponent.getInstance().enableFileSpecificParams(globalParametersCheckbox.isSelected()); + isModified = false; } @Override public void reset() { analyticsCheckBox.setSelected(SettingsComponent.getInstance().isAnalyticEnabled()); + globalParametersCheckbox.setSelected(SettingsComponent.getInstance().areFileSpecificParamsUsed()); isModified = false; } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 7cd5555c..92d9b438 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -94,7 +94,7 @@ private void setupEditor(Project project) { VirtualFile file = FileUtil.getScratchFile(project, "Neo4jGraphDbConsoleParametersPanel.json"); Document document = FILE_DOCUMENT_MANAGER.getDocument(file); editor = createEditor(project, document); - editor.setHeaderComponent(new JLabel("Provide query parameters in JSON format here:")); + editor.setHeaderComponent(new JLabel("Provide global query parameters in JSON format here:")); setInitialContent(document); initializeUi(); @@ -117,7 +117,6 @@ private void releaseLocalEditor() { private void setupLocalParamEditor(Project project, VirtualFile file) { if (project == null || file == null) return; - // TODO: create temp file for each cql file, handle changes/file closing // ApplicationManager.getApplication().runWriteAction(() -> { // TODO: remove runWriteAction? // https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000129030-ApplicationManager-getApplication-runWriteAction-vs-WriteCommandAction-runWriteCommandAction- try { @@ -127,7 +126,7 @@ private void setupLocalParamEditor(Project project, VirtualFile file) { Window window = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); EditorWindow editorWindow = FileEditorManagerEx.getInstanceEx(project).getSplittersFor(window).getCurrentWindow(); String tabTitle = EditorTabPresentationUtil.getEditorTabTitle(project, file, editorWindow); - localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " in JSON format here:")); + localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " file in JSON format here:")); setInitialContent(localParamDocument); graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index 4d072212..a099343f 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Throwables; import com.intellij.psi.PsiElement; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import com.neueda.jetbrains.plugin.graphdb.language.cypher.psi.CypherParameter; import com.neueda.jetbrains.plugin.graphdb.language.cypher.psi.CypherTypes; import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.TraverseUtil; @@ -43,18 +44,31 @@ public void registerParametersProvider(final ParametersProvider parametersProvid } public Map getParameters(PsiElement element) throws Exception { - if (isEmptyParametersMap(parametersProvider.getLocalParametersJson())) { + if (SettingsComponent.getInstance().areFileSpecificParamsUsed()) { + if (isEmptyParametersMap(parametersProvider.getLocalParametersJson())) { + if (isValidParametersMap(parametersProvider.getParametersJson())) { + Map allParameters = MAPPER + .readValue(parametersProvider.getParametersJson(), new TypeReference>() { + }); + return extractQueryParameters(element, allParameters); + } else { + return Collections.emptyMap(); + } + } else { + Map allParameters = MAPPER + .readValue(parametersProvider.getLocalParametersJson(), new TypeReference>() { + }); + return extractQueryParameters(element, allParameters); + } + } else { if (isValidParametersMap(parametersProvider.getParametersJson())) { Map allParameters = MAPPER - .readValue(parametersProvider.getParametersJson(), new TypeReference>() { }); + .readValue(parametersProvider.getParametersJson(), new TypeReference>() { + }); return extractQueryParameters(element, allParameters); } else { return Collections.emptyMap(); } - } else { - Map allParameters = MAPPER - .readValue(parametersProvider.getLocalParametersJson(), new TypeReference>() { }); - return extractQueryParameters(element, allParameters); } } From 1cd4e60ffa3a4e8daf4067661b0233fcba6d1dbd Mon Sep 17 00:00:00 2001 From: kit Date: Tue, 8 Jan 2019 15:06:47 +0200 Subject: [PATCH 05/16] File-specific param editor is disabled when not needed. Some refactoring and bugfixing --- .../src/main/resources/META-INF/plugin.xml | 4 ++-- .../ToggleFileSpecificParametersEvent.java | 13 +++++++++++++ ...oggleFileSpecificParametersUsedAction.java} | 17 ++++++++++++++--- .../settings/SettingsComponentImpl.java | 2 +- .../GraphDatabaseSupportConfiguration.java | 9 +++++---- .../ui/console/params/ParametersPanel.java | 18 ++++++++++++------ .../ui/console/params/ParametersService.java | 2 +- 7 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersEvent.java rename ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/{execute/SwitchParametersTypeUsedAction.java => ui/console/ToggleFileSpecificParametersUsedAction.java} (55%) diff --git a/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml b/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml index 8dd8d1ab..962528a9 100644 --- a/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml +++ b/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml @@ -217,8 +217,8 @@ icon="/actions/refresh.png" description="Clean canvas"> - diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersEvent.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersEvent.java new file mode 100644 index 00000000..b94f9eea --- /dev/null +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersEvent.java @@ -0,0 +1,13 @@ +package com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console; + +import com.intellij.util.messages.Topic; + +public interface ToggleFileSpecificParametersEvent { + + Topic TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC = + Topic.create("GraphDatabaseConsole.ToggleFileSpecificParametersTopic", + ToggleFileSpecificParametersEvent.class); + + void toggle(boolean setToUseFileSpecificParams); + +} diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/SwitchParametersTypeUsedAction.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java similarity index 55% rename from ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/SwitchParametersTypeUsedAction.java rename to ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java index 88ffe346..c9a50809 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/execute/SwitchParametersTypeUsedAction.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java @@ -1,28 +1,39 @@ -package com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.execute; +package com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import org.jetbrains.annotations.NotNull; -public class SwitchParametersTypeUsedAction extends AnAction { +public class ToggleFileSpecificParametersUsedAction extends AnAction { - public SwitchParametersTypeUsedAction() { + public ToggleFileSpecificParametersUsedAction() { } @Override public void actionPerformed(@NotNull AnActionEvent e) { SettingsComponent settings = SettingsComponent.getInstance(); + boolean setToUseFileSpecificParams; if (settings.areFileSpecificParamsUsed()) { settings.enableFileSpecificParams(false); e.getPresentation().setIcon(AllIcons.Actions.Edit); e.getPresentation().setText("Using global parameters"); + setToUseFileSpecificParams = false; } else { settings.enableFileSpecificParams(true); e.getPresentation().setIcon(AllIcons.Actions.EditSource); e.getPresentation().setText("Using file-specific parameters"); + setToUseFileSpecificParams = true; + } + Project project = getEventProject(e); + if (project != null) { + ToggleFileSpecificParametersEvent publisher = project.getMessageBus().syncPublisher( + ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC + ); + publisher.toggle(setToUseFileSpecificParams); } } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java index d54013ca..997e86e2 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java @@ -54,7 +54,7 @@ public void enableAnalytics(boolean state) { @Override public void enableFileSpecificParams(boolean isFileSpecific) { - properties().setValue(USE_FILE_SPECIFIC_PARAMS_KEY, isFileSpecific, true); + properties().setValue(USE_FILE_SPECIFIC_PARAMS_KEY, isFileSpecific, false); } @Override diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java index 5e282429..3ee59192 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java @@ -43,10 +43,11 @@ public JComponent createComponent() { JPanel rootPane = new JPanel(new FlowLayout(FlowLayout.LEFT)); rootPane.add(analyticsCheckBox); - globalParametersCheckbox = new JBCheckBox("Use custom parameters for each Cypher file separately", - SettingsComponent.getInstance().areFileSpecificParamsUsed()); - globalParametersCheckbox.addActionListener(e -> isModified = true); - rootPane.add(globalParametersCheckbox); + // Enable when changes in Settings will automatically affect the button state in Graph Database Console +// globalParametersCheckbox = new JBCheckBox("Use custom parameters for each Cypher file separately", +// SettingsComponent.getInstance().areFileSpecificParamsUsed()); +// globalParametersCheckbox.addActionListener(e -> isModified = true); +// rootPane.add(globalParametersCheckbox); return rootPane; } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 92d9b438..9b73a4ea 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -16,6 +16,9 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.util.messages.MessageBus; +import com.intellij.util.messages.MessageBusConnection; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console.ToggleFileSpecificParametersEvent; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.GraphConsoleView; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.util.FileUtil; @@ -60,8 +63,8 @@ public String getLocalParametersJson() { private void initializeUi() { graphConsoleView.getGlobalParametersTab().add(editor.getComponent(), BorderLayout.CENTER); service.registerParametersProvider(this); - - messageBus.connect().subscribe(QueryParametersRetrievalErrorEvent.QUERY_PARAMETERS_RETRIEVAL_ERROR_EVENT_TOPIC, + MessageBusConnection mbConnection = messageBus.connect(); + mbConnection.subscribe(QueryParametersRetrievalErrorEvent.QUERY_PARAMETERS_RETRIEVAL_ERROR_EVENT_TOPIC, (exception, editor) -> { if (editor == null) { return; @@ -75,7 +78,7 @@ private void initializeUi() { HintManager.getInstance().showErrorHint(editor, errorMessage); }); - messageBus.connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() { + mbConnection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() { // If file opened, fileOpenedSync->selectionChanged->fileOpened are called @Override public void selectionChanged(@NotNull FileEditorManagerEvent event) { @@ -86,6 +89,11 @@ public void selectionChanged(@NotNull FileEditorManagerEvent event) { } } }); + mbConnection.subscribe(ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC, + (setToUseFileSpecificParams) -> { + editor.getContentComponent().setEnabled(!setToUseFileSpecificParams); + if (localParamsEditor != null) localParamsEditor.getContentComponent().setEnabled(setToUseFileSpecificParams); + }); } private void setupEditor(Project project) { @@ -117,8 +125,6 @@ private void releaseLocalEditor() { private void setupLocalParamEditor(Project project, VirtualFile file) { if (project == null || file == null) return; -// ApplicationManager.getApplication().runWriteAction(() -> { // TODO: remove runWriteAction? - // https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000129030-ApplicationManager-getApplication-runWriteAction-vs-WriteCommandAction-runWriteCommandAction- try { VirtualFile localParamFile = FileUtil.getScratchFile(project, file.getPresentableName() + ".json"); Document localParamDocument = FILE_DOCUMENT_MANAGER.getDocument(localParamFile); @@ -129,11 +135,11 @@ private void setupLocalParamEditor(Project project, VirtualFile file) { localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " file in JSON format here:")); setInitialContent(localParamDocument); graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); + localParamsEditor.getContentComponent().setEnabled(SettingsComponent.getInstance().areFileSpecificParamsUsed()); } catch (Throwable e) { Throwables.throwIfUnchecked(e); throw new RuntimeException(e); } -// }); } private void setInitialContent(Document document) { diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index a099343f..cb48510f 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -93,7 +93,7 @@ private Set extractParameterNames(PsiElement element) { private static boolean isEmptyParametersMap(String parametersJson) { try { - return parametersJson == null || StringUtils.isBlank(parametersJson); // TODO: check if equals "{}"? + return parametersJson == null || StringUtils.isBlank(parametersJson); } catch (Exception e) { Throwables.throwIfUnchecked(e); throw new RuntimeException(e); From da8819eed6359ae923bd858f07aa5bf32e30f266 Mon Sep 17 00:00:00 2001 From: kit Date: Tue, 8 Jan 2019 18:18:45 +0200 Subject: [PATCH 06/16] Tests fixed --- .../CypherParametersProviderTest.java | 66 +++++++++++++- .../jetbrains/StatementCollectorTest.java | 85 +++++++++++++++++-- .../settings/SettingsComponentImpl.java | 5 +- .../ui/console/params/ParametersService.java | 21 ++--- 4 files changed, 151 insertions(+), 26 deletions(-) diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java index 7e6de945..29740370 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java @@ -2,28 +2,38 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.intellij.psi.PsiElement; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParametersProvider; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParametersService; import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.util.base.BaseIntegrationTest; import java.util.Map; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; public class CypherParametersProviderTest extends BaseIntegrationTest { private class TestParametersProvider implements ParametersProvider { - private String parametersJson; + private String parametersJson, localParametersJson; @Override public String getParametersJson() { return parametersJson; } + @Override + public String getLocalParametersJson() { + return localParametersJson; + } + public void setParametersJson(String parametersJson) { this.parametersJson = parametersJson; } + + public void setLocalParametersJson(String localParametersJson) { + this.localParametersJson = localParametersJson; + } } private ParametersService parametersService; @@ -38,19 +48,40 @@ public void setUp() throws Exception { } public void testParsingEmptyJsonObject() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{}"); + parametersProvider.setLocalParametersJson("{\"param\": \"non-empty\"}"); + Map parameters = parametersService.getParameters(getPsiFile("RETURN $param")); + assertThat(parameters).isEmpty(); + } + + public void testParsingEmptyJsonObjectInLocalParams() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(true); + parametersProvider.setLocalParametersJson("{}"); + parametersProvider.setParametersJson("{\"param\": \"non-empty\"}"); + // local (file-specific) parameters are returned from getParameters() here, and they must be empty Map parameters = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(parameters).isEmpty(); } public void testParsingEmptyParameters() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson(""); + parametersProvider.setLocalParametersJson("{\"param\": \"non-empty\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); + assertThat(result).isEmpty(); + } + public void testParsingEmptyLocalParameters() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(true); + parametersProvider.setLocalParametersJson(""); + parametersProvider.setParametersJson("{\"param\": \"non-empty\"}"); + Map result = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(result).isEmpty(); } public void testParsingStringParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"name\": \"Anna\"}"); Map result = parametersService .getParameters(getPsiFile("match (p:Person) where p.name = $name return *")); @@ -59,6 +90,7 @@ public void testParsingStringParameter() throws Exception { } public void testParsingIntegerParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"p1\": 17}"); Map result = parametersService .getParameters(getPsiFile("match (p:Person) where p.age = $p1 return *")); @@ -67,6 +99,7 @@ public void testParsingIntegerParameter() throws Exception { } public void testParsingBooleanParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"p2\": false}"); Map result = parametersService. getParameters(getPsiFile("match (p:Person) where p.is_citizen = $p2 return *")); @@ -75,6 +108,7 @@ public void testParsingBooleanParameter() throws Exception { } public void testParsingJsonObjectParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"p3\": {\"name\":\"Alex\"}}"); Map result = parametersService. getParameters(getPsiFile("match (p:Person) where p.father = $p3 return *")); @@ -85,18 +119,34 @@ public void testParsingJsonObjectParameter() throws Exception { public void testParsingMultipleParameters() throws Exception { parametersProvider.setParametersJson("{\"firstName\": \"Kaleb\", \"lastName\": \"Johnson\"}"); + parametersProvider.setLocalParametersJson( + "{\"country\": \"France\", \"city\": \"Paris\", \"age\": 90, \"lastName\": \"Green\"}" + ); + + SettingsComponent.getInstance().enableFileSpecificParams(false); Map result = parametersService .getParameters(getPsiFile("match (p:Person)\n" + "where p.first_name = $firstName " + " and p.last_name = $lastName return *")); - assertThat(result) .hasSize(2) .containsEntry("firstName", "Kaleb") .containsEntry("lastName", "Johnson"); + + SettingsComponent.getInstance().enableFileSpecificParams(true); + result = parametersService + .getParameters(getPsiFile("match (p:Person)\n" + + "where p.city = $city and p.age = $age " + + " and p.last_name = $lastName return *")); + assertThat(result) + .hasSize(3) + .containsEntry("city", "Paris") + .containsEntry("age", 90) + .containsEntry("lastName", "Green"); } public void testParsingCommentOnly() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("// Provide query parameters in JSON format here:"); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); @@ -104,6 +154,7 @@ public void testParsingCommentOnly() throws Exception { } public void testParsingCommentWithParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("// Provide query parameters in JSON format here:\n{\"name\": \"Eva\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $name")); @@ -111,6 +162,7 @@ public void testParsingCommentWithParameter() throws Exception { } public void testParsingNumericParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"0\": \"Tom\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $0")); @@ -118,6 +170,7 @@ public void testParsingNumericParameter() throws Exception { } public void testParsingOldStyleStringParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"name\": \"Ethan\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN {name}")); @@ -125,6 +178,7 @@ public void testParsingOldStyleStringParameter() throws Exception { } public void testParsingOldStyleNumericParameter() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"0\": \"Simon\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN {0}")); @@ -132,6 +186,7 @@ public void testParsingOldStyleNumericParameter() throws Exception { } public void testFilteringUsedParameters() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $lastName")); @@ -142,6 +197,7 @@ public void testFilteringUsedParameters() throws Exception { public void testParsingJsonArray() throws Exception { try { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("// Provide query parameters in JSON format here:\n[\"item1\",\"item2\"]"); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of array in parameters json expected"); @@ -152,6 +208,7 @@ public void testParsingJsonArray() throws Exception { public void testParsingNumber() throws Exception { try { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("1"); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of number provided instead of parameters map"); @@ -162,6 +219,7 @@ public void testParsingNumber() throws Exception { public void testParsingString() throws Exception { try { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("\"abc\""); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of string provided instead of parameters map"); @@ -172,6 +230,7 @@ public void testParsingString() throws Exception { public void testParsingUnwrappedParameter() throws Exception { try { + SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("\"param1\":\"val1\""); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of parameter not wrapped in curly braces"); @@ -181,6 +240,7 @@ public void testParsingUnwrappedParameter() throws Exception { } public void testParametersRetrievalWithNoPsiElement() throws Exception { + SettingsComponent.getInstance().enableFileSpecificParams(false); Map result = parametersService.getParameters(null); assertThat(result).isEmpty(); } diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java index fb619ca9..01131038 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java @@ -4,6 +4,7 @@ import com.intellij.util.messages.MessageBus; import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.execute.StatementCollector; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParametersProvider; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParametersService; import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.util.BaseGenericTest; import org.mockito.Mockito; @@ -33,7 +34,17 @@ public void setUp() throws Exception { } public void testSingleQuery() { - parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return EMPTY_PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return EMPTY_PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN n;"); psiFile.accept(statementCollector); @@ -48,7 +59,17 @@ public void testSingleQuery() { } public void testMultipleQueriesInOneLine() { - parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return EMPTY_PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return EMPTY_PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN n;MATCH (m) RETURN m;"); psiFile.acceptChildren(statementCollector); @@ -63,7 +84,17 @@ public void testMultipleQueriesInOneLine() { } public void testOneQueryWithError() { - parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return EMPTY_PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return EMPTY_PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH () ETURN n;"); psiFile.accept(statementCollector); @@ -78,7 +109,17 @@ public void testOneQueryWithError() { } public void testMultipleQueriesInDifferentLinesWithError() { - parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return EMPTY_PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return EMPTY_PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN *;\nMATCH () ETURN n;"); psiFile.accept(statementCollector); @@ -93,7 +134,17 @@ public void testMultipleQueriesInDifferentLinesWithError() { } public void testMultipleCorrectQueriesInDifferentLines() { - parametersService.registerParametersProvider(() -> EMPTY_PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return EMPTY_PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return EMPTY_PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN *;\nMATCH (m) RETURN m;"); psiFile.accept(statementCollector); @@ -108,7 +159,17 @@ public void testMultipleCorrectQueriesInDifferentLines() { } public void testMultipleCorrectQueriesInDifferentLinesWithParameters() { - parametersService.registerParametersProvider(() -> PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "CREATE (n {name: $name});\nMATCH (m) RETURN m;"); psiFile.accept(statementCollector); @@ -123,7 +184,17 @@ public void testMultipleCorrectQueriesInDifferentLinesWithParameters() { } public void testParameterExtractionErrorOccurs() { - parametersService.registerParametersProvider(() -> WRONG_PARAMETERS); + parametersService.registerParametersProvider(new ParametersProvider() { + @Override + public String getParametersJson() { + return WRONG_PARAMETERS; + } + + @Override + public String getLocalParametersJson() { + return WRONG_PARAMETERS; + } + }); PsiFile psiFile = myFixture.configureByText("test.cyp", "CREATE (n {name: $name});\nMATCH (m) RETURN m;"); psiFile.accept(statementCollector); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java index 997e86e2..ade99b7e 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java @@ -12,6 +12,7 @@ public class SettingsComponentImpl implements SettingsComponent { private static final String USE_FILE_SPECIFIC_PARAMS_KEY = "GraphDbSupport.UseFileSpecificParams"; private static final String USER_ID = "GraphDbSupport.UserId"; private static final String KNOWN_PLUGIN_VERSION = "GraphDbSupport.KnownPluginVersion"; + public static final boolean USE_FILE_SPECIFIC_PARAMS_DEFAULT = false; @NotNull @Override @@ -43,7 +44,7 @@ public boolean isAnalyticEnabled() { @Override public boolean areFileSpecificParamsUsed() { - return properties().getBoolean(USE_FILE_SPECIFIC_PARAMS_KEY, false); + return properties().getBoolean(USE_FILE_SPECIFIC_PARAMS_KEY, USE_FILE_SPECIFIC_PARAMS_DEFAULT); } @Override @@ -54,7 +55,7 @@ public void enableAnalytics(boolean state) { @Override public void enableFileSpecificParams(boolean isFileSpecific) { - properties().setValue(USE_FILE_SPECIFIC_PARAMS_KEY, isFileSpecific, false); + properties().setValue(USE_FILE_SPECIFIC_PARAMS_KEY, isFileSpecific, USE_FILE_SPECIFIC_PARAMS_DEFAULT); } @Override diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index cb48510f..27b725ab 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -45,26 +45,19 @@ public void registerParametersProvider(final ParametersProvider parametersProvid public Map getParameters(PsiElement element) throws Exception { if (SettingsComponent.getInstance().areFileSpecificParamsUsed()) { - if (isEmptyParametersMap(parametersProvider.getLocalParametersJson())) { - if (isValidParametersMap(parametersProvider.getParametersJson())) { - Map allParameters = MAPPER - .readValue(parametersProvider.getParametersJson(), new TypeReference>() { - }); - return extractQueryParameters(element, allParameters); - } else { - return Collections.emptyMap(); - } - } else { + if (isValidParametersMap(parametersProvider.getLocalParametersJson())) { Map allParameters = MAPPER - .readValue(parametersProvider.getLocalParametersJson(), new TypeReference>() { - }); + .readValue(parametersProvider.getLocalParametersJson(), new TypeReference>() { + }); return extractQueryParameters(element, allParameters); + } else { + return Collections.emptyMap(); } } else { if (isValidParametersMap(parametersProvider.getParametersJson())) { Map allParameters = MAPPER - .readValue(parametersProvider.getParametersJson(), new TypeReference>() { - }); + .readValue(parametersProvider.getParametersJson(), new TypeReference>() { + }); return extractQueryParameters(element, allParameters); } else { return Collections.emptyMap(); From 630a516d56b9c5099a30a34a449307c0496b408a Mon Sep 17 00:00:00 2001 From: kit Date: Wed, 9 Jan 2019 15:06:05 +0200 Subject: [PATCH 07/16] Correct icons and labels in all cases --- ...oggleFileSpecificParametersUsedAction.java | 33 ++++++++++--------- .../ui/console/GraphConsoleView.java | 15 +++++---- .../ui/console/params/ParametersPanel.java | 24 ++++++++++---- 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java index c9a50809..8dc23be0 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java @@ -3,7 +3,7 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.project.Project; +import com.intellij.openapi.actionSystem.Presentation; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import org.jetbrains.annotations.NotNull; @@ -16,24 +16,25 @@ public ToggleFileSpecificParametersUsedAction() { @Override public void actionPerformed(@NotNull AnActionEvent e) { SettingsComponent settings = SettingsComponent.getInstance(); - boolean setToUseFileSpecificParams; - if (settings.areFileSpecificParamsUsed()) { - settings.enableFileSpecificParams(false); - e.getPresentation().setIcon(AllIcons.Actions.Edit); - e.getPresentation().setText("Using global parameters"); - setToUseFileSpecificParams = false; - } else { - settings.enableFileSpecificParams(true); - e.getPresentation().setIcon(AllIcons.Actions.EditSource); - e.getPresentation().setText("Using file-specific parameters"); - setToUseFileSpecificParams = true; - } - Project project = getEventProject(e); - if (project != null) { - ToggleFileSpecificParametersEvent publisher = project.getMessageBus().syncPublisher( + boolean setToUseFileSpecificParams = !settings.areFileSpecificParamsUsed(); + settings.enableFileSpecificParams(setToUseFileSpecificParams); + syncIconAndText(setToUseFileSpecificParams, e.getPresentation()); + + if (e.getProject() != null) { + ToggleFileSpecificParametersEvent publisher = e.getProject().getMessageBus().syncPublisher( ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC ); publisher.toggle(setToUseFileSpecificParams); } } + + public void syncIconAndText(boolean fileSpecificParams, Presentation presentation) { + if (fileSpecificParams) { + presentation.setIcon(AllIcons.Actions.EditSource); + presentation.setText("Using file-specific parameters"); + } else { + presentation.setIcon(AllIcons.Actions.Edit); + presentation.setText("Using global parameters"); + } + } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java index 33c9f555..25354ff3 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java @@ -2,12 +2,7 @@ import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.ActionPlaces; -import com.intellij.openapi.actionSystem.ActionToolbar; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.ActionCallback; @@ -28,7 +23,9 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import com.neueda.jetbrains.plugin.graphdb.database.api.query.GraphQueryResult; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console.ToggleFileSpecificParametersUsedAction; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.analytics.Analytics; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryPlanEvent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.graph.GraphPanel; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.log.LogPanel; @@ -148,7 +145,11 @@ public void initToolWindow(Project project, ToolWindow toolWindow) { consoleToolbarPanel.add(consoleToolbar.getComponent(), BorderLayout.CENTER); consoleToolbarPanel.setBorder(new CustomLineBorder(0, 0, 0, 1)); consoleToolbarPanel.validate(); - + ToggleFileSpecificParametersUsedAction fileSpecificParamToggleButton = + (ToggleFileSpecificParametersUsedAction) ActionManager.getInstance().getAction( + "GraphDatabaseConsoleToolWindowActions.ToggleFileSpecificParametersUsed"); + fileSpecificParamToggleButton.syncIconAndText(SettingsComponent.getInstance().areFileSpecificParamsUsed(), + fileSpecificParamToggleButton.getTemplatePresentation()); initialized = true; } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 9b73a4ea..8759e351 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -47,8 +47,12 @@ public void initialize(GraphConsoleView graphConsoleView, Project project) { this.project = project; setupEditor(project); FileEditor selectedEditor = FileEditorManager.getInstance(project).getSelectedEditor(); - if (selectedEditor != null) { + if (selectedEditor != null && selectedEditor.getFile() != null && + FileTypeExtensionUtil.isCypherFileTypeExtension(selectedEditor.getFile().getExtension())) { setupLocalParamEditor(project, selectedEditor.getFile()); + reEnableEditors(SettingsComponent.getInstance().areFileSpecificParamsUsed()); + } else { + editor.getContentComponent().setEnabled(true); } } @@ -86,14 +90,14 @@ public void selectionChanged(@NotNull FileEditorManagerEvent event) { VirtualFile newFile = event.getNewFile(); if (newFile != null && FileTypeExtensionUtil.isCypherFileTypeExtension(newFile.getExtension())) { setupLocalParamEditor(project, newFile); + reEnableEditors(SettingsComponent.getInstance().areFileSpecificParamsUsed()); + } else { + editor.getContentComponent().setEnabled(true); } } }); mbConnection.subscribe(ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC, - (setToUseFileSpecificParams) -> { - editor.getContentComponent().setEnabled(!setToUseFileSpecificParams); - if (localParamsEditor != null) localParamsEditor.getContentComponent().setEnabled(setToUseFileSpecificParams); - }); + this::reEnableEditors); } private void setupEditor(Project project) { @@ -123,6 +127,15 @@ private void releaseLocalEditor() { localParamsEditor = null; } + private void reEnableEditors(boolean setToUseFileSpecificParams) { + if (localParamsEditor != null) { + localParamsEditor.getContentComponent().setEnabled(setToUseFileSpecificParams); + editor.getContentComponent().setEnabled(!setToUseFileSpecificParams); + } else { + editor.getContentComponent().setEnabled(true); + } + } + private void setupLocalParamEditor(Project project, VirtualFile file) { if (project == null || file == null) return; try { @@ -135,7 +148,6 @@ private void setupLocalParamEditor(Project project, VirtualFile file) { localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " file in JSON format here:")); setInitialContent(localParamDocument); graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); - localParamsEditor.getContentComponent().setEnabled(SettingsComponent.getInstance().areFileSpecificParamsUsed()); } catch (Throwable e) { Throwables.throwIfUnchecked(e); throw new RuntimeException(e); From 0dd1aa2cce6422d435b0887e80684dceeb06d937 Mon Sep 17 00:00:00 2001 From: kit Date: Wed, 9 Jan 2019 17:27:39 +0200 Subject: [PATCH 08/16] Support params for equal filenames in different directories --- .../jetbrains/ui/console/params/ParametersPanel.java | 6 ++++-- .../jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 8759e351..ec9516c0 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -27,6 +27,7 @@ import javax.swing.*; import java.awt.*; +import java.util.UUID; import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent.PARAMS_ERROR_COMMON_MSG; @@ -139,13 +140,14 @@ private void reEnableEditors(boolean setToUseFileSpecificParams) { private void setupLocalParamEditor(Project project, VirtualFile file) { if (project == null || file == null) return; try { - VirtualFile localParamFile = FileUtil.getScratchFile(project, file.getPresentableName() + ".json"); + VirtualFile localParamFile = FileUtil.getScratchFile(project, UUID.nameUUIDFromBytes(file.getPath().getBytes()).toString() + ".json"); Document localParamDocument = FILE_DOCUMENT_MANAGER.getDocument(localParamFile); localParamsEditor = createEditor(project, localParamDocument); Window window = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); EditorWindow editorWindow = FileEditorManagerEx.getInstanceEx(project).getSplittersFor(window).getCurrentWindow(); String tabTitle = EditorTabPresentationUtil.getEditorTabTitle(project, file, editorWindow); - localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " file in JSON format here:")); + localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + + tabTitle + " file in JSON format here:")); setInitialContent(localParamDocument); graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java index 03e00c63..e18eb436 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java @@ -24,7 +24,7 @@ public static VirtualFile getDataSourceFile(Project project, DataSourceApi dataS public static VirtualFile getScratchFile(Project project, String fileName) throws IOException { return ScratchFileService.getInstance().findFile( ParameterRootType.getInstance(), - project.getName() + fileName, + project.getName() + "_" + fileName, ScratchFileService.Option.create_if_missing ); } From d787900e73bc18d48e9b0ac186e839f178cb809b Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 14 Jan 2019 11:59:04 +0200 Subject: [PATCH 09/16] Code fixes --- .../cypher/util/FileTypeExtensionUtil.java | 8 +- .../CypherParametersProviderTest.java | 22 ++-- .../jetbrains/StatementCollectorTest.java | 112 ++++++------------ ...oggleFileSpecificParametersUsedAction.java | 8 +- .../ui/console/GraphConsoleView.form | 2 +- .../ui/console/GraphConsoleView.java | 6 +- .../ui/console/params/ParametersPanel.java | 6 +- .../ui/console/params/ParametersProvider.java | 2 +- .../ui/console/params/ParametersService.java | 4 +- 9 files changed, 65 insertions(+), 105 deletions(-) diff --git a/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java b/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java index 360b95f2..53595954 100644 --- a/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java +++ b/language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/util/FileTypeExtensionUtil.java @@ -1,15 +1,11 @@ package com.neueda.jetbrains.plugin.graphdb.language.cypher.util; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class FileTypeExtensionUtil { - public static final List EXTENSIONS = new ArrayList() {{ - add("cyp"); - add("cql"); - add("cypher"); - }}; + public static final List EXTENSIONS = Arrays.asList("cyp", "cql", "cypher"); public static boolean isCypherFileTypeExtension(String extension) { return extension != null && EXTENSIONS.contains(extension); diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java index 29740370..0a5d6d66 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java @@ -15,7 +15,7 @@ public class CypherParametersProviderTest extends BaseIntegrationTest { private class TestParametersProvider implements ParametersProvider { - private String parametersJson, localParametersJson; + private String parametersJson, fileSpecificParametersJson; @Override public String getParametersJson() { @@ -23,16 +23,16 @@ public String getParametersJson() { } @Override - public String getLocalParametersJson() { - return localParametersJson; + public String getFileSpecificParametersJson() { + return fileSpecificParametersJson; } public void setParametersJson(String parametersJson) { this.parametersJson = parametersJson; } - public void setLocalParametersJson(String localParametersJson) { - this.localParametersJson = localParametersJson; + public void setFileSpecificParametersJson(String fileSpecificParametersJson) { + this.fileSpecificParametersJson = fileSpecificParametersJson; } } @@ -50,15 +50,15 @@ public void setUp() throws Exception { public void testParsingEmptyJsonObject() throws Exception { SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson("{}"); - parametersProvider.setLocalParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}"); Map parameters = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(parameters).isEmpty(); } public void testParsingEmptyJsonObjectInLocalParams() throws Exception { SettingsComponent.getInstance().enableFileSpecificParams(true); - parametersProvider.setLocalParametersJson("{}"); parametersProvider.setParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setFileSpecificParametersJson("{}"); // local (file-specific) parameters are returned from getParameters() here, and they must be empty Map parameters = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(parameters).isEmpty(); @@ -67,15 +67,15 @@ public void testParsingEmptyJsonObjectInLocalParams() throws Exception { public void testParsingEmptyParameters() throws Exception { SettingsComponent.getInstance().enableFileSpecificParams(false); parametersProvider.setParametersJson(""); - parametersProvider.setLocalParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(result).isEmpty(); } - public void testParsingEmptyLocalParameters() throws Exception { + public void testParsingEmptyFileSpecificParameters() throws Exception { SettingsComponent.getInstance().enableFileSpecificParams(true); - parametersProvider.setLocalParametersJson(""); parametersProvider.setParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setFileSpecificParametersJson(""); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(result).isEmpty(); } @@ -119,7 +119,7 @@ public void testParsingJsonObjectParameter() throws Exception { public void testParsingMultipleParameters() throws Exception { parametersProvider.setParametersJson("{\"firstName\": \"Kaleb\", \"lastName\": \"Johnson\"}"); - parametersProvider.setLocalParametersJson( + parametersProvider.setFileSpecificParametersJson( "{\"country\": \"France\", \"city\": \"Paris\", \"age\": 90, \"lastName\": \"Green\"}" ); diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java index 01131038..5de07272 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java @@ -15,10 +15,11 @@ public class StatementCollectorTest extends BaseGenericTest { private static final String EMPTY_PARAMETERS = "{}"; - private static final String PARAMETERS = "{\"name\": \"Andrew\"}"; + private static final String VALID_PARAMETERS = "{\"name\": \"Andrew\"}"; private static final String WRONG_PARAMETERS = "{wrong json}"; private StatementCollector statementCollector; private ParametersService parametersService; + private ParametersProvider emptyParametersProvider, validParametersProvider, wrongParametersProvider; private MessageBus messageBusMock; private QueryParametersRetrievalErrorEvent eventMock; @@ -30,21 +31,44 @@ public void setUp() throws Exception { when(messageBusMock.syncPublisher(any())).thenReturn(eventMock); parametersService = new ParametersService(); - statementCollector = new StatementCollector(messageBusMock, parametersService); - } - - public void testSingleQuery() { - parametersService.registerParametersProvider(new ParametersProvider() { + emptyParametersProvider = new ParametersProvider() { @Override public String getParametersJson() { return EMPTY_PARAMETERS; } @Override - public String getLocalParametersJson() { + public String getFileSpecificParametersJson() { return EMPTY_PARAMETERS; } - }); + }; + validParametersProvider = new ParametersProvider() { + @Override + public String getParametersJson() { + return VALID_PARAMETERS; + } + + @Override + public String getFileSpecificParametersJson() { + return VALID_PARAMETERS; + } + }; + wrongParametersProvider = new ParametersProvider() { + @Override + public String getParametersJson() { + return WRONG_PARAMETERS; + } + + @Override + public String getFileSpecificParametersJson() { + return WRONG_PARAMETERS; + } + }; + statementCollector = new StatementCollector(messageBusMock, parametersService); + } + + public void testSingleQuery() { + parametersService.registerParametersProvider(emptyParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN n;"); psiFile.accept(statementCollector); @@ -59,17 +83,7 @@ public String getLocalParametersJson() { } public void testMultipleQueriesInOneLine() { - parametersService.registerParametersProvider(new ParametersProvider() { - @Override - public String getParametersJson() { - return EMPTY_PARAMETERS; - } - - @Override - public String getLocalParametersJson() { - return EMPTY_PARAMETERS; - } - }); + parametersService.registerParametersProvider(emptyParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN n;MATCH (m) RETURN m;"); psiFile.acceptChildren(statementCollector); @@ -84,17 +98,7 @@ public String getLocalParametersJson() { } public void testOneQueryWithError() { - parametersService.registerParametersProvider(new ParametersProvider() { - @Override - public String getParametersJson() { - return EMPTY_PARAMETERS; - } - - @Override - public String getLocalParametersJson() { - return EMPTY_PARAMETERS; - } - }); + parametersService.registerParametersProvider(emptyParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH () ETURN n;"); psiFile.accept(statementCollector); @@ -109,17 +113,7 @@ public String getLocalParametersJson() { } public void testMultipleQueriesInDifferentLinesWithError() { - parametersService.registerParametersProvider(new ParametersProvider() { - @Override - public String getParametersJson() { - return EMPTY_PARAMETERS; - } - - @Override - public String getLocalParametersJson() { - return EMPTY_PARAMETERS; - } - }); + parametersService.registerParametersProvider(emptyParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN *;\nMATCH () ETURN n;"); psiFile.accept(statementCollector); @@ -134,17 +128,7 @@ public String getLocalParametersJson() { } public void testMultipleCorrectQueriesInDifferentLines() { - parametersService.registerParametersProvider(new ParametersProvider() { - @Override - public String getParametersJson() { - return EMPTY_PARAMETERS; - } - - @Override - public String getLocalParametersJson() { - return EMPTY_PARAMETERS; - } - }); + parametersService.registerParametersProvider(emptyParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "MATCH (n) RETURN *;\nMATCH (m) RETURN m;"); psiFile.accept(statementCollector); @@ -159,17 +143,7 @@ public String getLocalParametersJson() { } public void testMultipleCorrectQueriesInDifferentLinesWithParameters() { - parametersService.registerParametersProvider(new ParametersProvider() { - @Override - public String getParametersJson() { - return PARAMETERS; - } - - @Override - public String getLocalParametersJson() { - return PARAMETERS; - } - }); + parametersService.registerParametersProvider(validParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "CREATE (n {name: $name});\nMATCH (m) RETURN m;"); psiFile.accept(statementCollector); @@ -184,17 +158,7 @@ public String getLocalParametersJson() { } public void testParameterExtractionErrorOccurs() { - parametersService.registerParametersProvider(new ParametersProvider() { - @Override - public String getParametersJson() { - return WRONG_PARAMETERS; - } - - @Override - public String getLocalParametersJson() { - return WRONG_PARAMETERS; - } - }); + parametersService.registerParametersProvider(wrongParametersProvider); PsiFile psiFile = myFixture.configureByText("test.cyp", "CREATE (n {name: $name});\nMATCH (m) RETURN m;"); psiFile.accept(statementCollector); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java index 8dc23be0..f85868de 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java @@ -16,15 +16,15 @@ public ToggleFileSpecificParametersUsedAction() { @Override public void actionPerformed(@NotNull AnActionEvent e) { SettingsComponent settings = SettingsComponent.getInstance(); - boolean setToUseFileSpecificParams = !settings.areFileSpecificParamsUsed(); - settings.enableFileSpecificParams(setToUseFileSpecificParams); - syncIconAndText(setToUseFileSpecificParams, e.getPresentation()); + boolean areFileSpecificParamsUsed = settings.areFileSpecificParamsUsed(); + settings.enableFileSpecificParams(!areFileSpecificParamsUsed); + syncIconAndText(!areFileSpecificParamsUsed, e.getPresentation()); if (e.getProject() != null) { ToggleFileSpecificParametersEvent publisher = e.getProject().getMessageBus().syncPublisher( ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC ); - publisher.toggle(setToUseFileSpecificParams); + publisher.toggle(!areFileSpecificParamsUsed); } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form index 6d2fd358..9cab520d 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.form @@ -119,7 +119,7 @@ - + diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java index 25354ff3..ba45af0e 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java @@ -74,7 +74,7 @@ public class GraphConsoleView implements Disposable { private JBTabbedPane defaultTabContainer; private JBSplitter graphSplitter; private JPanel globalParametersTab; - private JPanel localParametersTab; + private JPanel fileSpecificParametersTab; private JBSplitter paramSplitter; private LookAndFeelService lookAndFeelService; @@ -260,7 +260,7 @@ public JPanel getGlobalParametersTab() { return globalParametersTab; } - public JPanel getLocalParametersTab() { - return localParametersTab; + public JPanel getFileSpecificParametersTab() { + return fileSpecificParametersTab; } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index ec9516c0..651c7ee3 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -61,7 +61,7 @@ public String getParametersJson() { return editor.getDocument().getText(); } - public String getLocalParametersJson() { + public String getFileSpecificParametersJson() { return localParamsEditor != null? localParamsEditor.getDocument().getText() : null; } @@ -120,7 +120,7 @@ private void setupEditor(Project project) { private void releaseLocalEditor() { if (localParamsEditor != null) { - graphConsoleView.getLocalParametersTab().remove(localParamsEditor.getComponent()); + graphConsoleView.getFileSpecificParametersTab().remove(localParamsEditor.getComponent()); if (!localParamsEditor.isDisposed()) { EditorFactory.getInstance().releaseEditor(localParamsEditor); } @@ -149,7 +149,7 @@ private void setupLocalParamEditor(Project project, VirtualFile file) { localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + tabTitle + " file in JSON format here:")); setInitialContent(localParamDocument); - graphConsoleView.getLocalParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); + graphConsoleView.getFileSpecificParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { Throwables.throwIfUnchecked(e); throw new RuntimeException(e); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java index c6de4d7b..e916d45a 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java @@ -4,6 +4,6 @@ public interface ParametersProvider { String getParametersJson(); - String getLocalParametersJson(); + String getFileSpecificParametersJson(); } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index 27b725ab..01000e00 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -45,9 +45,9 @@ public void registerParametersProvider(final ParametersProvider parametersProvid public Map getParameters(PsiElement element) throws Exception { if (SettingsComponent.getInstance().areFileSpecificParamsUsed()) { - if (isValidParametersMap(parametersProvider.getLocalParametersJson())) { + if (isValidParametersMap(parametersProvider.getFileSpecificParametersJson())) { Map allParameters = MAPPER - .readValue(parametersProvider.getLocalParametersJson(), new TypeReference>() { + .readValue(parametersProvider.getFileSpecificParametersJson(), new TypeReference>() { }); return extractQueryParameters(element, allParameters); } else { From d046696da0fcc19371ba3ae9e63bb709478e8c50 Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 14 Jan 2019 18:45:42 +0200 Subject: [PATCH 10/16] Removed toggle button. FileSpecific parameters now merge with global instead of replacing them --- .../src/main/resources/META-INF/plugin.xml | 6 - .../CypherParametersProviderTest.java | 111 +++++++----------- .../jetbrains/StatementCollectorTest.java | 6 +- ...oggleFileSpecificParametersUsedAction.java | 40 ------- .../component/settings/SettingsComponent.java | 4 - .../settings/SettingsComponentImpl.java | 11 -- .../GraphDatabaseSupportConfiguration.java | 9 -- .../ui/console/GraphConsoleView.java | 7 -- .../ui/console/params/ParametersPanel.java | 19 +-- .../ui/console/params/ParametersProvider.java | 2 +- .../ui/console/params/ParametersService.java | 36 ++---- 11 files changed, 60 insertions(+), 191 deletions(-) delete mode 100644 ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java diff --git a/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml b/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml index 962528a9..80e6fee5 100644 --- a/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml +++ b/graph-database-support-plugin/src/main/resources/META-INF/plugin.xml @@ -217,12 +217,6 @@ icon="/actions/refresh.png" description="Clean canvas"> - - parameters = parametersService.getParameters(getPsiFile("RETURN $param")); - assertThat(parameters).isEmpty(); - } - - public void testParsingEmptyJsonObjectInLocalParams() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(true); - parametersProvider.setParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setGlobalParametersJson("{}"); parametersProvider.setFileSpecificParametersJson("{}"); - // local (file-specific) parameters are returned from getParameters() here, and they must be empty Map parameters = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(parameters).isEmpty(); } public void testParsingEmptyParameters() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson(""); - parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setGlobalParametersJson(""); + parametersProvider.setFileSpecificParametersJson(""); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(result).isEmpty(); } + public void testParsingEmptyGlobalParameters() throws Exception { + parametersProvider.setGlobalParametersJson(""); + parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}"); + Map result = parametersService.getParameters(getPsiFile("RETURN $param")); + assertThat(result).containsEntry("param", "non-empty"); + } + public void testParsingEmptyFileSpecificParameters() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(true); - parametersProvider.setParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setGlobalParametersJson("{\"param\": \"non-empty\"}"); parametersProvider.setFileSpecificParametersJson(""); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); - assertThat(result).isEmpty(); + assertThat(result).containsEntry("param", "non-empty"); } public void testParsingStringParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"name\": \"Anna\"}"); + parametersProvider.setGlobalParametersJson("{\"name\": \"Anna\"}"); Map result = parametersService .getParameters(getPsiFile("match (p:Person) where p.name = $name return *")); @@ -90,8 +83,7 @@ public void testParsingStringParameter() throws Exception { } public void testParsingIntegerParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"p1\": 17}"); + parametersProvider.setGlobalParametersJson("{\"p1\": 17}"); Map result = parametersService .getParameters(getPsiFile("match (p:Person) where p.age = $p1 return *")); @@ -99,8 +91,7 @@ public void testParsingIntegerParameter() throws Exception { } public void testParsingBooleanParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"p2\": false}"); + parametersProvider.setGlobalParametersJson("{\"p2\": false}"); Map result = parametersService. getParameters(getPsiFile("match (p:Person) where p.is_citizen = $p2 return *")); @@ -108,8 +99,7 @@ public void testParsingBooleanParameter() throws Exception { } public void testParsingJsonObjectParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"p3\": {\"name\":\"Alex\"}}"); + parametersProvider.setGlobalParametersJson("{\"p3\": {\"name\":\"Alex\"}}"); Map result = parametersService. getParameters(getPsiFile("match (p:Person) where p.father = $p3 return *")); @@ -118,76 +108,64 @@ public void testParsingJsonObjectParameter() throws Exception { } public void testParsingMultipleParameters() throws Exception { - parametersProvider.setParametersJson("{\"firstName\": \"Kaleb\", \"lastName\": \"Johnson\"}"); + parametersProvider.setGlobalParametersJson( + "{\"firstName\": \"Kaleb\", \'age\': 35, \"city\": \"Paris\", \"country\": \"France\"}" + ); parametersProvider.setFileSpecificParametersJson( - "{\"country\": \"France\", \"city\": \"Paris\", \"age\": 90, \"lastName\": \"Green\"}" + "{\"lastName\": \"Green\", \"age\": 90}" ); - SettingsComponent.getInstance().enableFileSpecificParams(false); Map result = parametersService .getParameters(getPsiFile("match (p:Person)\n" + "where p.first_name = $firstName " + - " and p.last_name = $lastName return *")); + " and p.last_name = $lastName " + + " and p.age = $age " + + " and p.city = $city return *")); assertThat(result) - .hasSize(2) + .hasSize(4) .containsEntry("firstName", "Kaleb") - .containsEntry("lastName", "Johnson"); - - SettingsComponent.getInstance().enableFileSpecificParams(true); - result = parametersService - .getParameters(getPsiFile("match (p:Person)\n" + - "where p.city = $city and p.age = $age " + - " and p.last_name = $lastName return *")); - assertThat(result) - .hasSize(3) - .containsEntry("city", "Paris") + .containsEntry("lastName", "Green") .containsEntry("age", 90) - .containsEntry("lastName", "Green"); + .containsEntry("city", "Paris"); } - + public void testParsingCommentOnly() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("// Provide query parameters in JSON format here:"); + parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:"); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); assertThat(result).isEmpty(); } public void testParsingCommentWithParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("// Provide query parameters in JSON format here:\n{\"name\": \"Eva\"}"); + parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:\n{\"name\": \"Eva\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $name")); assertThat(result).hasSize(1); } public void testParsingNumericParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"0\": \"Tom\"}"); + parametersProvider.setGlobalParametersJson("{\"0\": \"Tom\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $0")); assertThat(result).containsEntry("0", "Tom"); } public void testParsingOldStyleStringParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"name\": \"Ethan\"}"); + parametersProvider.setGlobalParametersJson("{\"name\": \"Ethan\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN {name}")); assertThat(result).containsEntry("name", "Ethan"); } public void testParsingOldStyleNumericParameter() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"0\": \"Simon\"}"); + parametersProvider.setGlobalParametersJson("{\"0\": \"Simon\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN {0}")); assertThat(result).containsEntry("0", "Simon"); } public void testFilteringUsedParameters() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}"); + parametersProvider.setGlobalParametersJson("{\"firstName\": \"Frodo\", \"lastName\": \"Baggins\"}"); Map result = parametersService.getParameters(getPsiFile("RETURN $lastName")); assertThat(result) @@ -197,8 +175,7 @@ public void testFilteringUsedParameters() throws Exception { public void testParsingJsonArray() throws Exception { try { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("// Provide query parameters in JSON format here:\n[\"item1\",\"item2\"]"); + parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:\n[\"item1\",\"item2\"]"); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of array in parameters json expected"); } catch (JsonMappingException e) { @@ -208,8 +185,7 @@ public void testParsingJsonArray() throws Exception { public void testParsingNumber() throws Exception { try { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("1"); + parametersProvider.setGlobalParametersJson("1"); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of number provided instead of parameters map"); } catch (JsonMappingException e) { @@ -219,8 +195,7 @@ public void testParsingNumber() throws Exception { public void testParsingString() throws Exception { try { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("\"abc\""); + parametersProvider.setGlobalParametersJson("\"abc\""); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of string provided instead of parameters map"); } catch (JsonMappingException e) { @@ -230,8 +205,7 @@ public void testParsingString() throws Exception { public void testParsingUnwrappedParameter() throws Exception { try { - SettingsComponent.getInstance().enableFileSpecificParams(false); - parametersProvider.setParametersJson("\"param1\":\"val1\""); + parametersProvider.setGlobalParametersJson("\"param1\":\"val1\""); parametersService.getParameters(getPsiFile("return 1")); fail("JsonMappingException expected because of parameter not wrapped in curly braces"); } catch (JsonMappingException e) { @@ -240,7 +214,6 @@ public void testParsingUnwrappedParameter() throws Exception { } public void testParametersRetrievalWithNoPsiElement() throws Exception { - SettingsComponent.getInstance().enableFileSpecificParams(false); Map result = parametersService.getParameters(null); assertThat(result).isEmpty(); } diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java index 5de07272..95e60e36 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/jetbrains/StatementCollectorTest.java @@ -33,7 +33,7 @@ public void setUp() throws Exception { parametersService = new ParametersService(); emptyParametersProvider = new ParametersProvider() { @Override - public String getParametersJson() { + public String getGlobalParametersJson() { return EMPTY_PARAMETERS; } @@ -44,7 +44,7 @@ public String getFileSpecificParametersJson() { }; validParametersProvider = new ParametersProvider() { @Override - public String getParametersJson() { + public String getGlobalParametersJson() { return VALID_PARAMETERS; } @@ -55,7 +55,7 @@ public String getFileSpecificParametersJson() { }; wrongParametersProvider = new ParametersProvider() { @Override - public String getParametersJson() { + public String getGlobalParametersJson() { return WRONG_PARAMETERS; } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java deleted file mode 100644 index f85868de..00000000 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/actions/ui/console/ToggleFileSpecificParametersUsedAction.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console; - -import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.Presentation; -import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; -import org.jetbrains.annotations.NotNull; - -public class ToggleFileSpecificParametersUsedAction extends AnAction { - - public ToggleFileSpecificParametersUsedAction() { - - } - - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - SettingsComponent settings = SettingsComponent.getInstance(); - boolean areFileSpecificParamsUsed = settings.areFileSpecificParamsUsed(); - settings.enableFileSpecificParams(!areFileSpecificParamsUsed); - syncIconAndText(!areFileSpecificParamsUsed, e.getPresentation()); - - if (e.getProject() != null) { - ToggleFileSpecificParametersEvent publisher = e.getProject().getMessageBus().syncPublisher( - ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC - ); - publisher.toggle(!areFileSpecificParamsUsed); - } - } - - public void syncIconAndText(boolean fileSpecificParams, Presentation presentation) { - if (fileSpecificParams) { - presentation.setIcon(AllIcons.Actions.EditSource); - presentation.setText("Using file-specific parameters"); - } else { - presentation.setIcon(AllIcons.Actions.Edit); - presentation.setText("Using global parameters"); - } - } -} diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponent.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponent.java index a9548e1a..1e88aba8 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponent.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponent.java @@ -13,12 +13,8 @@ static SettingsComponent getInstance() { boolean isAnalyticEnabled(); - boolean areFileSpecificParamsUsed(); - void enableAnalytics(boolean state); - void enableFileSpecificParams(boolean isFileSpecific); - String getKnownPluginVersion(); void setKnownPluginVersion(String version); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java index ade99b7e..d7819578 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/settings/SettingsComponentImpl.java @@ -12,7 +12,6 @@ public class SettingsComponentImpl implements SettingsComponent { private static final String USE_FILE_SPECIFIC_PARAMS_KEY = "GraphDbSupport.UseFileSpecificParams"; private static final String USER_ID = "GraphDbSupport.UserId"; private static final String KNOWN_PLUGIN_VERSION = "GraphDbSupport.KnownPluginVersion"; - public static final boolean USE_FILE_SPECIFIC_PARAMS_DEFAULT = false; @NotNull @Override @@ -42,22 +41,12 @@ public boolean isAnalyticEnabled() { return properties().getBoolean(ANALYTICS_ENABLED_KEY, true); } - @Override - public boolean areFileSpecificParamsUsed() { - return properties().getBoolean(USE_FILE_SPECIFIC_PARAMS_KEY, USE_FILE_SPECIFIC_PARAMS_DEFAULT); - } - @Override public void enableAnalytics(boolean state) { Analytics.forceEvent("settings", state ? "enableAnalytics" : "disableAnalytics"); properties().setValue(ANALYTICS_ENABLED_KEY, state, true); } - @Override - public void enableFileSpecificParams(boolean isFileSpecific) { - properties().setValue(USE_FILE_SPECIFIC_PARAMS_KEY, isFileSpecific, USE_FILE_SPECIFIC_PARAMS_DEFAULT); - } - @Override public String getKnownPluginVersion() { return properties().getValue(KNOWN_PLUGIN_VERSION, "unknown"); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java index 3ee59192..7315f6ad 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/configuration/GraphDatabaseSupportConfiguration.java @@ -43,12 +43,6 @@ public JComponent createComponent() { JPanel rootPane = new JPanel(new FlowLayout(FlowLayout.LEFT)); rootPane.add(analyticsCheckBox); - // Enable when changes in Settings will automatically affect the button state in Graph Database Console -// globalParametersCheckbox = new JBCheckBox("Use custom parameters for each Cypher file separately", -// SettingsComponent.getInstance().areFileSpecificParamsUsed()); -// globalParametersCheckbox.addActionListener(e -> isModified = true); -// rootPane.add(globalParametersCheckbox); - return rootPane; } @@ -60,15 +54,12 @@ public boolean isModified() { @Override public void apply() throws ConfigurationException { SettingsComponent.getInstance().enableAnalytics(analyticsCheckBox.isSelected()); - SettingsComponent.getInstance().enableFileSpecificParams(globalParametersCheckbox.isSelected()); - isModified = false; } @Override public void reset() { analyticsCheckBox.setSelected(SettingsComponent.getInstance().isAnalyticEnabled()); - globalParametersCheckbox.setSelected(SettingsComponent.getInstance().areFileSpecificParamsUsed()); isModified = false; } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java index ba45af0e..3da80b39 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/GraphConsoleView.java @@ -23,9 +23,7 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import com.neueda.jetbrains.plugin.graphdb.database.api.query.GraphQueryResult; -import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console.ToggleFileSpecificParametersUsedAction; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.analytics.Analytics; -import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryPlanEvent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.graph.GraphPanel; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.log.LogPanel; @@ -145,11 +143,6 @@ public void initToolWindow(Project project, ToolWindow toolWindow) { consoleToolbarPanel.add(consoleToolbar.getComponent(), BorderLayout.CENTER); consoleToolbarPanel.setBorder(new CustomLineBorder(0, 0, 0, 1)); consoleToolbarPanel.validate(); - ToggleFileSpecificParametersUsedAction fileSpecificParamToggleButton = - (ToggleFileSpecificParametersUsedAction) ActionManager.getInstance().getAction( - "GraphDatabaseConsoleToolWindowActions.ToggleFileSpecificParametersUsed"); - fileSpecificParamToggleButton.syncIconAndText(SettingsComponent.getInstance().areFileSpecificParamsUsed(), - fileSpecificParamToggleButton.getTemplatePresentation()); initialized = true; } } diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 651c7ee3..62ace3a9 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -51,13 +51,10 @@ public void initialize(GraphConsoleView graphConsoleView, Project project) { if (selectedEditor != null && selectedEditor.getFile() != null && FileTypeExtensionUtil.isCypherFileTypeExtension(selectedEditor.getFile().getExtension())) { setupLocalParamEditor(project, selectedEditor.getFile()); - reEnableEditors(SettingsComponent.getInstance().areFileSpecificParamsUsed()); - } else { - editor.getContentComponent().setEnabled(true); } } - public String getParametersJson() { + public String getGlobalParametersJson() { return editor.getDocument().getText(); } @@ -91,14 +88,9 @@ public void selectionChanged(@NotNull FileEditorManagerEvent event) { VirtualFile newFile = event.getNewFile(); if (newFile != null && FileTypeExtensionUtil.isCypherFileTypeExtension(newFile.getExtension())) { setupLocalParamEditor(project, newFile); - reEnableEditors(SettingsComponent.getInstance().areFileSpecificParamsUsed()); - } else { - editor.getContentComponent().setEnabled(true); } } }); - mbConnection.subscribe(ToggleFileSpecificParametersEvent.TOGGLE_FILE_SPECIFIC_PARAMETERS_EVENT_TOPIC, - this::reEnableEditors); } private void setupEditor(Project project) { @@ -128,15 +120,6 @@ private void releaseLocalEditor() { localParamsEditor = null; } - private void reEnableEditors(boolean setToUseFileSpecificParams) { - if (localParamsEditor != null) { - localParamsEditor.getContentComponent().setEnabled(setToUseFileSpecificParams); - editor.getContentComponent().setEnabled(!setToUseFileSpecificParams); - } else { - editor.getContentComponent().setEnabled(true); - } - } - private void setupLocalParamEditor(Project project, VirtualFile file) { if (project == null || file == null) return; try { diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java index e916d45a..812ec5ec 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersProvider.java @@ -2,7 +2,7 @@ public interface ParametersProvider { - String getParametersJson(); + String getGlobalParametersJson(); String getFileSpecificParametersJson(); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index 01000e00..6cc51fbd 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -7,16 +7,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Throwables; import com.intellij.psi.PsiElement; -import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; import com.neueda.jetbrains.plugin.graphdb.language.cypher.psi.CypherParameter; import com.neueda.jetbrains.plugin.graphdb.language.cypher.psi.CypherTypes; import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.TraverseUtil; import org.apache.commons.lang.StringUtils; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public class ParametersService { @@ -44,25 +40,19 @@ public void registerParametersProvider(final ParametersProvider parametersProvid } public Map getParameters(PsiElement element) throws Exception { - if (SettingsComponent.getInstance().areFileSpecificParamsUsed()) { - if (isValidParametersMap(parametersProvider.getFileSpecificParametersJson())) { - Map allParameters = MAPPER - .readValue(parametersProvider.getFileSpecificParametersJson(), new TypeReference>() { - }); - return extractQueryParameters(element, allParameters); - } else { - return Collections.emptyMap(); - } - } else { - if (isValidParametersMap(parametersProvider.getParametersJson())) { - Map allParameters = MAPPER - .readValue(parametersProvider.getParametersJson(), new TypeReference>() { - }); - return extractQueryParameters(element, allParameters); - } else { - return Collections.emptyMap(); - } + if (element == null) return Collections.emptyMap(); + Map allParameters = new HashMap<>(); + if (isValidParametersMap(parametersProvider.getFileSpecificParametersJson())) { + Map parsedFileSpecific = MAPPER.readValue(parametersProvider.getFileSpecificParametersJson(), + new TypeReference>() {}); + parsedFileSpecific.forEach(allParameters::putIfAbsent); + } + if (isValidParametersMap(parametersProvider.getGlobalParametersJson())) { + Map parsedGlobal = MAPPER.readValue(parametersProvider.getGlobalParametersJson(), + new TypeReference>() {}); + parsedGlobal.forEach(allParameters::putIfAbsent); } + return extractQueryParameters(element, allParameters); } private Map extractQueryParameters(PsiElement element, Map allParameters) { From 94d73c1f383df81e8f6466754dd4a314e2a58344 Mon Sep 17 00:00:00 2001 From: kit Date: Thu, 17 Jan 2019 17:39:53 +0200 Subject: [PATCH 11/16] Storing parameters in datasource attributes instead of files --- .../CypherParametersProviderTest.java | 17 +++- .../ui/console/params/ParametersPanel.java | 93 ++++++++++++------- .../graphdb/jetbrains/util/FileUtil.java | 55 +++++++++++ 3 files changed, 129 insertions(+), 36 deletions(-) diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java index 033ca739..0c96d26b 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java @@ -74,6 +74,21 @@ public void testParsingEmptyFileSpecificParameters() throws Exception { assertThat(result).containsEntry("param", "non-empty"); } + + public void testParsingEmptyJsonInGlobalParameters() throws Exception { + parametersProvider.setGlobalParametersJson("{}"); + parametersProvider.setFileSpecificParametersJson("{\"param\": \"non-empty\"}"); + Map result = parametersService.getParameters(getPsiFile("RETURN $param")); + assertThat(result).containsEntry("param", "non-empty"); + } + + public void testParsingEmptyJsonInFileSpecificParameters() throws Exception { + parametersProvider.setGlobalParametersJson("{\"param\": \"non-empty\"}"); + parametersProvider.setFileSpecificParametersJson("{}"); + Map result = parametersService.getParameters(getPsiFile("RETURN $param")); + assertThat(result).containsEntry("param", "non-empty"); + } + public void testParsingStringParameter() throws Exception { parametersProvider.setGlobalParametersJson("{\"name\": \"Anna\"}"); Map result = parametersService @@ -128,7 +143,7 @@ public void testParsingMultipleParameters() throws Exception { .containsEntry("age", 90) .containsEntry("city", "Paris"); } - + public void testParsingCommentOnly() throws Exception { parametersProvider.setGlobalParametersJson("// Provide query parameters in JSON format here:"); Map result = parametersService.getParameters(getPsiFile("RETURN $param")); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 62ace3a9..7ce6d10e 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -8,17 +8,20 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; +import com.intellij.openapi.editor.impl.DocumentImpl; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.impl.EditorTabPresentationUtil; import com.intellij.openapi.fileEditor.impl.EditorWindow; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileEvent; +import com.intellij.openapi.vfs.VirtualFileListener; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; -import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.ui.console.ToggleFileSpecificParametersEvent; -import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.settings.SettingsComponent; +import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.DataSourcesComponent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.GraphConsoleView; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent; import com.neueda.jetbrains.plugin.graphdb.jetbrains.util.FileUtil; @@ -27,7 +30,6 @@ import javax.swing.*; import java.awt.*; -import java.util.UUID; import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryParametersRetrievalErrorEvent.PARAMS_ERROR_COMMON_MSG; @@ -35,7 +37,7 @@ public class ParametersPanel implements ParametersProvider { private static final FileDocumentManager FILE_DOCUMENT_MANAGER = FileDocumentManager.getInstance(); - private Editor editor, localParamsEditor; + private Editor globalParamEditor, fileSpecificParamEditor; private GraphConsoleView graphConsoleView; private MessageBus messageBus; private ParametersService service; @@ -50,20 +52,20 @@ public void initialize(GraphConsoleView graphConsoleView, Project project) { FileEditor selectedEditor = FileEditorManager.getInstance(project).getSelectedEditor(); if (selectedEditor != null && selectedEditor.getFile() != null && FileTypeExtensionUtil.isCypherFileTypeExtension(selectedEditor.getFile().getExtension())) { - setupLocalParamEditor(project, selectedEditor.getFile()); + setupFileSpecificEditor(project, selectedEditor.getFile()); } } public String getGlobalParametersJson() { - return editor.getDocument().getText(); + return globalParamEditor.getDocument().getText(); } public String getFileSpecificParametersJson() { - return localParamsEditor != null? localParamsEditor.getDocument().getText() : null; + return fileSpecificParamEditor != null? fileSpecificParamEditor.getDocument().getText() : null; } private void initializeUi() { - graphConsoleView.getGlobalParametersTab().add(editor.getComponent(), BorderLayout.CENTER); + graphConsoleView.getGlobalParametersTab().add(globalParamEditor.getComponent(), BorderLayout.CENTER); service.registerParametersProvider(this); MessageBusConnection mbConnection = messageBus.connect(); mbConnection.subscribe(QueryParametersRetrievalErrorEvent.QUERY_PARAMETERS_RETRIEVAL_ERROR_EVENT_TOPIC, @@ -84,10 +86,11 @@ private void initializeUi() { // If file opened, fileOpenedSync->selectionChanged->fileOpened are called @Override public void selectionChanged(@NotNull FileEditorManagerEvent event) { - releaseLocalEditor(); + releaseFileSpecificEditor(event.getOldFile()); VirtualFile newFile = event.getNewFile(); - if (newFile != null && FileTypeExtensionUtil.isCypherFileTypeExtension(newFile.getExtension())) { - setupLocalParamEditor(project, newFile); + if (newFile != null && FileTypeExtensionUtil.isCypherFileTypeExtension(newFile.getExtension()) && + project.getComponent(DataSourcesComponent.class).getDataSourceContainer().isDataSourceExists(getTabTitle(newFile))) { + setupFileSpecificEditor(project, newFile); } } }); @@ -98,8 +101,8 @@ private void setupEditor(Project project) { try { VirtualFile file = FileUtil.getScratchFile(project, "Neo4jGraphDbConsoleParametersPanel.json"); Document document = FILE_DOCUMENT_MANAGER.getDocument(file); - editor = createEditor(project, document); - editor.setHeaderComponent(new JLabel("Provide global query parameters in JSON format here:")); + globalParamEditor = createEditor(project, document); + globalParamEditor.setHeaderComponent(new JLabel("Provide global query parameters in JSON format here:")); setInitialContent(document); initializeUi(); @@ -110,35 +113,55 @@ private void setupEditor(Project project) { }); } - private void releaseLocalEditor() { - if (localParamsEditor != null) { - graphConsoleView.getFileSpecificParametersTab().remove(localParamsEditor.getComponent()); - if (!localParamsEditor.isDisposed()) { - EditorFactory.getInstance().releaseEditor(localParamsEditor); - } - } - localParamsEditor = null; - } - - private void setupLocalParamEditor(Project project, VirtualFile file) { - if (project == null || file == null) return; + private void setupFileSpecificEditor(Project project, VirtualFile cypherFile) { + if (project == null || cypherFile == null) return; try { - VirtualFile localParamFile = FileUtil.getScratchFile(project, UUID.nameUUIDFromBytes(file.getPath().getBytes()).toString() + ".json"); - Document localParamDocument = FILE_DOCUMENT_MANAGER.getDocument(localParamFile); - localParamsEditor = createEditor(project, localParamDocument); - Window window = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); - EditorWindow editorWindow = FileEditorManagerEx.getInstanceEx(project).getSplittersFor(window).getCurrentWindow(); - String tabTitle = EditorTabPresentationUtil.getEditorTabTitle(project, file, editorWindow); - localParamsEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + - tabTitle + " file in JSON format here:")); - setInitialContent(localParamDocument); - graphConsoleView.getFileSpecificParametersTab().add(localParamsEditor.getComponent(), BorderLayout.CENTER); + String params = FileUtil.getParams(cypherFile); + Document fileSpecificParamDocument = new DocumentImpl(params); + fileSpecificParamEditor = createEditor(project, fileSpecificParamDocument); + VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileListener() { + @Override + public void contentsChanged(@NotNull VirtualFileEvent event) { + if (event.getFile().equals(cypherFile)) + FileUtil.setParams(cypherFile, fileSpecificParamDocument.getText()); + } + + @Override + public void fileDeleted(@NotNull VirtualFileEvent event) { + if (event.getFile().equals(cypherFile)) + FileUtil.setParams(cypherFile, "{}"); + } + }); + + fileSpecificParamEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + + "connection " + getTabTitle(cypherFile) + " in JSON format here:")); + setInitialContent(fileSpecificParamDocument); + graphConsoleView.getFileSpecificParametersTab().add(fileSpecificParamEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { Throwables.throwIfUnchecked(e); throw new RuntimeException(e); } } + private void releaseFileSpecificEditor(VirtualFile oldFile) { + if (fileSpecificParamEditor != null) { + // set params in fileSpecificParamDocument.addDocumentListener() listener is a more universal but worse solution: + // gets triggered immediately, debounce required + FileUtil.setParams(oldFile, fileSpecificParamEditor.getDocument().getText()); + graphConsoleView.getFileSpecificParametersTab().remove(fileSpecificParamEditor.getComponent()); + if (!fileSpecificParamEditor.isDisposed()) { + EditorFactory.getInstance().releaseEditor(fileSpecificParamEditor); + } + } + fileSpecificParamEditor = null; + } + + private String getTabTitle(VirtualFile file) { + Window window = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); + EditorWindow editorWindow = FileEditorManagerEx.getInstanceEx(project).getSplittersFor(window).getCurrentWindow(); + return EditorTabPresentationUtil.getEditorTabTitle(project, file, editorWindow); + } + private void setInitialContent(Document document) { if (document.getText().isEmpty()) { final Runnable setTextRunner = () -> document.setText("{}"); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java index e18eb436..4325cb09 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java @@ -4,15 +4,25 @@ import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.newvfs.FileAttribute; +import com.intellij.openapi.vfs.newvfs.NewVirtualFile; +import com.intellij.util.io.IOUtil; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.params.ParameterRootType; import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.interactions.GraphDbEditorsConsoleRootType; +import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class FileUtil { + private static final Key MY_KEY = Key.create("file specific params"); + private static final FileAttribute QUERY_PARAMS_FILE_ATTRIBUTE = new FileAttribute("queryParamsFileAttribute"); + public static VirtualFile getDataSourceFile(Project project, DataSourceApi dataSource) throws IOException { return ScratchFileService.getInstance().findFile( GraphDbEditorsConsoleRootType.getInstance(), @@ -29,6 +39,51 @@ public static VirtualFile getScratchFile(Project project, String fileName) throw ); } + public static String getParams(VirtualFile file) { + String userData = file.getUserData(MY_KEY); + if(userData == null) { + String attributeData = ""; + if (file instanceof NewVirtualFile) { + final DataInputStream is = QUERY_PARAMS_FILE_ATTRIBUTE.readAttribute(file); + if (is != null) { + try { + try { + if (is.available() > 0) { + attributeData = IOUtil.readString(is); + if (attributeData != null) { + file.putUserData(MY_KEY, attributeData); + } + } + } finally { + is.close(); + } + } catch (IOException e) { + return "{}"; + } + } + } + return attributeData; + } + return userData; + } + + public static void setParams(VirtualFile file, String params) { + file.putUserData(MY_KEY, params); + if (file instanceof NewVirtualFile) { + DataOutputStream os = QUERY_PARAMS_FILE_ATTRIBUTE.writeAttribute(file); + try { + try { + IOUtil.writeString(StringUtil.notNullize(params), os); +// + } finally { + os.close(); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } + } + public static FileEditor[] openFile(Project project, VirtualFile file) { return FileEditorManager.getInstance(project).openFile(file, true); } From 8c3718b687ff8063c7ef2cbd52177237dd21c500 Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 21 Jan 2019 12:12:38 +0200 Subject: [PATCH 12/16] JSON syntax highlighting fixed in fileSpecificParam editor --- .../ui/console/params/ParametersPanel.java | 20 ++++------ .../graphdb/jetbrains/util/FileUtil.java | 39 ++++++------------- 2 files changed, 20 insertions(+), 39 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 7ce6d10e..b9142786 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -19,6 +19,7 @@ import com.intellij.openapi.vfs.VirtualFileListener; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.wm.ex.WindowManagerEx; +import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.DataSourcesComponent; @@ -117,25 +118,20 @@ private void setupFileSpecificEditor(Project project, VirtualFile cypherFile) { if (project == null || cypherFile == null) return; try { String params = FileUtil.getParams(cypherFile); - Document fileSpecificParamDocument = new DocumentImpl(params); - fileSpecificParamEditor = createEditor(project, fileSpecificParamDocument); + LightVirtualFile lightVirtualFile = new LightVirtualFile("fileSpecificQueryParam", new JsonFileType(), params); + Document document = FileDocumentManager.getInstance().getDocument(lightVirtualFile); + fileSpecificParamEditor = createEditor(project, document); VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileListener() { @Override public void contentsChanged(@NotNull VirtualFileEvent event) { - if (event.getFile().equals(cypherFile)) - FileUtil.setParams(cypherFile, fileSpecificParamDocument.getText()); - } - - @Override - public void fileDeleted(@NotNull VirtualFileEvent event) { - if (event.getFile().equals(cypherFile)) - FileUtil.setParams(cypherFile, "{}"); + if (event.getFile().equals(cypherFile) && document != null) + FileUtil.setParams(cypherFile, document.getText()); } }); fileSpecificParamEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + "connection " + getTabTitle(cypherFile) + " in JSON format here:")); - setInitialContent(fileSpecificParamDocument); + if (document != null) setInitialContent(document); graphConsoleView.getFileSpecificParametersTab().add(fileSpecificParamEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { Throwables.throwIfUnchecked(e); @@ -163,7 +159,7 @@ private String getTabTitle(VirtualFile file) { } private void setInitialContent(Document document) { - if (document.getText().isEmpty()) { + if (document != null && document.getText().isEmpty()) { final Runnable setTextRunner = () -> document.setText("{}"); ApplicationManager.getApplication() .invokeLater(() -> ApplicationManager.getApplication().runWriteAction(setTextRunner)); diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java index 4325cb09..c1eaae80 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java @@ -34,32 +34,25 @@ public static VirtualFile getDataSourceFile(Project project, DataSourceApi dataS public static VirtualFile getScratchFile(Project project, String fileName) throws IOException { return ScratchFileService.getInstance().findFile( ParameterRootType.getInstance(), - project.getName() + "_" + fileName, + project.getName() + "_" + fileName, ScratchFileService.Option.create_if_missing ); } public static String getParams(VirtualFile file) { String userData = file.getUserData(MY_KEY); - if(userData == null) { + if (userData == null) { String attributeData = ""; if (file instanceof NewVirtualFile) { - final DataInputStream is = QUERY_PARAMS_FILE_ATTRIBUTE.readAttribute(file); - if (is != null) { - try { - try { - if (is.available() > 0) { - attributeData = IOUtil.readString(is); - if (attributeData != null) { - file.putUserData(MY_KEY, attributeData); - } - } - } finally { - is.close(); + try (DataInputStream is = QUERY_PARAMS_FILE_ATTRIBUTE.readAttribute(file)) { + if (is != null && is.available() > 0) { + attributeData = IOUtil.readString(is); + if (attributeData != null) { + file.putUserData(MY_KEY, attributeData); } - } catch (IOException e) { - return "{}"; } + } catch (IOException e) { + return "{}"; } } return attributeData; @@ -70,17 +63,9 @@ public static String getParams(VirtualFile file) { public static void setParams(VirtualFile file, String params) { file.putUserData(MY_KEY, params); if (file instanceof NewVirtualFile) { - DataOutputStream os = QUERY_PARAMS_FILE_ATTRIBUTE.writeAttribute(file); - try { - try { - IOUtil.writeString(StringUtil.notNullize(params), os); -// - } finally { - os.close(); - } - } catch (IOException e) { - System.out.println(e.getMessage()); - } + try (DataOutputStream os = QUERY_PARAMS_FILE_ATTRIBUTE.writeAttribute(file)) { + IOUtil.writeString(StringUtil.notNullize(params), os); + } catch (IOException e) {} } } From d73da4fbcf568b62a717e720f496c6c6dea996dd Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 21 Jan 2019 14:18:42 +0200 Subject: [PATCH 13/16] Text fixes --- .../jetbrains/ui/console/params/ParametersPanel.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index b9142786..dbba98df 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -8,7 +8,6 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.editor.impl.DocumentImpl; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.impl.EditorTabPresentationUtil; @@ -118,7 +117,7 @@ private void setupFileSpecificEditor(Project project, VirtualFile cypherFile) { if (project == null || cypherFile == null) return; try { String params = FileUtil.getParams(cypherFile); - LightVirtualFile lightVirtualFile = new LightVirtualFile("fileSpecificQueryParam", new JsonFileType(), params); + LightVirtualFile lightVirtualFile = new LightVirtualFile("", new JsonFileType(), params); Document document = FileDocumentManager.getInstance().getDocument(lightVirtualFile); fileSpecificParamEditor = createEditor(project, document); VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileListener() { @@ -130,7 +129,8 @@ public void contentsChanged(@NotNull VirtualFileEvent event) { }); fileSpecificParamEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + - "connection " + getTabTitle(cypherFile) + " in JSON format here:")); + "connection " + getTabTitle(cypherFile) + " in JSON format here" + + "(these have a higher priority than global):")); if (document != null) setInitialContent(document); graphConsoleView.getFileSpecificParametersTab().add(fileSpecificParamEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) { From 8ab3dd6f1a305470648dea14e755aa75fde83182 Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 21 Jan 2019 14:28:47 +0200 Subject: [PATCH 14/16] JsonFileType optimization --- .../graphdb/jetbrains/ui/console/params/ParametersPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index dbba98df..d9b5a353 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -117,7 +117,7 @@ private void setupFileSpecificEditor(Project project, VirtualFile cypherFile) { if (project == null || cypherFile == null) return; try { String params = FileUtil.getParams(cypherFile); - LightVirtualFile lightVirtualFile = new LightVirtualFile("", new JsonFileType(), params); + LightVirtualFile lightVirtualFile = new LightVirtualFile("", JsonFileType.INSTANCE, params); Document document = FileDocumentManager.getInstance().getDocument(lightVirtualFile); fileSpecificParamEditor = createEditor(project, document); VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileListener() { @@ -167,7 +167,7 @@ private void setInitialContent(Document document) { } private static Editor createEditor(Project project, Document document) { - return EditorFactory.getInstance().createEditor(document, project, new JsonFileType(), false); + return EditorFactory.getInstance().createEditor(document, project, JsonFileType.INSTANCE, false); } } From b481123a4b4a9620b825b946d8ac783aa1d0c49f Mon Sep 17 00:00:00 2001 From: kit Date: Mon, 21 Jan 2019 16:56:30 +0200 Subject: [PATCH 15/16] Code refactoring --- .../CypherParametersProviderTest.java | 3 +- .../ui/console/params/ParametersPanel.java | 49 ++++++++++--------- .../ui/console/params/ParametersService.java | 4 +- .../graphdb/jetbrains/util/FileUtil.java | 38 ++++++++------ 4 files changed, 52 insertions(+), 42 deletions(-) diff --git a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java index 0c96d26b..62959568 100644 --- a/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java +++ b/testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/parameters/CypherParametersProviderTest.java @@ -14,7 +14,8 @@ public class CypherParametersProviderTest extends BaseIntegrationTest { private class TestParametersProvider implements ParametersProvider { - private String globalParametersJson, fileSpecificParametersJson; + private String globalParametersJson; + private String fileSpecificParametersJson; @Override public String getGlobalParametersJson() { diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index d9b5a353..04a47736 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -37,7 +37,8 @@ public class ParametersPanel implements ParametersProvider { private static final FileDocumentManager FILE_DOCUMENT_MANAGER = FileDocumentManager.getInstance(); - private Editor globalParamEditor, fileSpecificParamEditor; + private Editor globalParamEditor; + private Editor fileSpecificParamEditor; private GraphConsoleView graphConsoleView; private MessageBus messageBus; private ParametersService service; @@ -61,7 +62,7 @@ public String getGlobalParametersJson() { } public String getFileSpecificParametersJson() { - return fileSpecificParamEditor != null? fileSpecificParamEditor.getDocument().getText() : null; + return fileSpecificParamEditor != null ? fileSpecificParamEditor.getDocument().getText() : null; } private void initializeUi() { @@ -115,28 +116,28 @@ private void setupEditor(Project project) { private void setupFileSpecificEditor(Project project, VirtualFile cypherFile) { if (project == null || cypherFile == null) return; - try { - String params = FileUtil.getParams(cypherFile); - LightVirtualFile lightVirtualFile = new LightVirtualFile("", JsonFileType.INSTANCE, params); - Document document = FileDocumentManager.getInstance().getDocument(lightVirtualFile); - fileSpecificParamEditor = createEditor(project, document); - VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileListener() { - @Override - public void contentsChanged(@NotNull VirtualFileEvent event) { - if (event.getFile().equals(cypherFile) && document != null) - FileUtil.setParams(cypherFile, document.getText()); - } - }); - - fileSpecificParamEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + - "connection " + getTabTitle(cypherFile) + " in JSON format here" + - "(these have a higher priority than global):")); - if (document != null) setInitialContent(document); - graphConsoleView.getFileSpecificParametersTab().add(fileSpecificParamEditor.getComponent(), BorderLayout.CENTER); - } catch (Throwable e) { - Throwables.throwIfUnchecked(e); - throw new RuntimeException(e); - } + try { + String params = FileUtil.getParams(cypherFile); + LightVirtualFile lightVirtualFile = new LightVirtualFile("", JsonFileType.INSTANCE, params); + Document document = FileDocumentManager.getInstance().getDocument(lightVirtualFile); + fileSpecificParamEditor = createEditor(project, document); + VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileListener() { + @Override + public void contentsChanged(@NotNull VirtualFileEvent event) { + if (event.getFile().equals(cypherFile) && document != null) + FileUtil.setParams(cypherFile, document.getText()); + } + }); + + fileSpecificParamEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + + "connection " + getTabTitle(cypherFile) + " in JSON format here" + + "(these have a higher priority than global):")); + if (document != null) setInitialContent(document); + graphConsoleView.getFileSpecificParametersTab().add(fileSpecificParamEditor.getComponent(), BorderLayout.CENTER); + } catch (Throwable e) { + Throwables.throwIfUnchecked(e); + throw new RuntimeException(e); + } } private void releaseFileSpecificEditor(VirtualFile oldFile) { diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java index 6cc51fbd..d472bc5b 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersService.java @@ -40,7 +40,9 @@ public void registerParametersProvider(final ParametersProvider parametersProvid } public Map getParameters(PsiElement element) throws Exception { - if (element == null) return Collections.emptyMap(); + if (element == null) { + return Collections.emptyMap(); + } Map allParameters = new HashMap<>(); if (isValidParametersMap(parametersProvider.getFileSpecificParametersJson())) { Map parsedFileSpecific = MAPPER.readValue(parametersProvider.getFileSpecificParametersJson(), diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java index c1eaae80..c8554cb9 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/util/FileUtil.java @@ -34,30 +34,36 @@ public static VirtualFile getDataSourceFile(Project project, DataSourceApi dataS public static VirtualFile getScratchFile(Project project, String fileName) throws IOException { return ScratchFileService.getInstance().findFile( ParameterRootType.getInstance(), - project.getName() + "_" + fileName, + project.getName() + fileName, ScratchFileService.Option.create_if_missing ); } public static String getParams(VirtualFile file) { String userData = file.getUserData(MY_KEY); - if (userData == null) { - String attributeData = ""; - if (file instanceof NewVirtualFile) { - try (DataInputStream is = QUERY_PARAMS_FILE_ATTRIBUTE.readAttribute(file)) { - if (is != null && is.available() > 0) { - attributeData = IOUtil.readString(is); - if (attributeData != null) { - file.putUserData(MY_KEY, attributeData); - } - } - } catch (IOException e) { - return "{}"; - } + if (userData != null) { + return userData; + } + + if (!(file instanceof NewVirtualFile)) { + return "{}"; + } + + try (DataInputStream is = QUERY_PARAMS_FILE_ATTRIBUTE.readAttribute(file)) { + if (is == null || is.available() <= 0) { + return "{}"; + } + + String attributeData = IOUtil.readString(is); + if (attributeData == null) { + return "{}"; + } else { + file.putUserData(MY_KEY, attributeData); + return attributeData; } - return attributeData; + } catch (IOException e) { + return "{}"; } - return userData; } public static void setParams(VirtualFile file, String params) { From 3d000130675a9efc6f9cb4cb28d60a451784443b Mon Sep 17 00:00:00 2001 From: kit Date: Tue, 22 Jan 2019 11:11:02 +0200 Subject: [PATCH 16/16] Compact text. Tooltip. Help icon (parameters) --- .../ui/console/params/ParametersPanel.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java index 04a47736..e832e3ad 100644 --- a/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java +++ b/ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/params/ParametersPanel.java @@ -2,6 +2,7 @@ import com.google.common.base.Throwables; import com.intellij.codeInsight.hint.HintManager; +import com.intellij.icons.AllIcons; import com.intellij.json.JsonFileType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; @@ -36,6 +37,7 @@ public class ParametersPanel implements ParametersProvider { private static final FileDocumentManager FILE_DOCUMENT_MANAGER = FileDocumentManager.getInstance(); + public static final Icon ICON_HELP = AllIcons.Actions.Help; private Editor globalParamEditor; private Editor fileSpecificParamEditor; @@ -103,7 +105,10 @@ private void setupEditor(Project project) { VirtualFile file = FileUtil.getScratchFile(project, "Neo4jGraphDbConsoleParametersPanel.json"); Document document = FILE_DOCUMENT_MANAGER.getDocument(file); globalParamEditor = createEditor(project, document); - globalParamEditor.setHeaderComponent(new JLabel("Provide global query parameters in JSON format here:")); + JLabel jLabel = new JLabel("Global parameters:"); + jLabel.setIcon(ICON_HELP); + jLabel.setToolTipText("Enter parameters in JSON format. Will be applied to any data source when executed"); + globalParamEditor.setHeaderComponent(jLabel); setInitialContent(document); initializeUi(); @@ -128,10 +133,12 @@ public void contentsChanged(@NotNull VirtualFileEvent event) { FileUtil.setParams(cypherFile, document.getText()); } }); - - fileSpecificParamEditor.setHeaderComponent(new JLabel("Provide query parameters specific to " + - "connection " + getTabTitle(cypherFile) + " in JSON format here" + - "(these have a higher priority than global):")); + JLabel jLabel = new JLabel("Parameters for data source " + + getTabTitle(cypherFile) + ":"); + jLabel.setIcon(ICON_HELP); + jLabel.setToolTipText("Enter parameters in JSON format. Will be applied to " + getTabTitle(cypherFile) + + " data source when executed"); + fileSpecificParamEditor.setHeaderComponent(jLabel); if (document != null) setInitialContent(document); graphConsoleView.getFileSpecificParametersTab().add(fileSpecificParamEditor.getComponent(), BorderLayout.CENTER); } catch (Throwable e) {