diff --git a/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java b/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java index 77a1bab18..96b2bb82a 100644 --- a/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java +++ b/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java @@ -22,6 +22,7 @@ import com.redhat.devtools.intellij.lsp4mp4ij.classpath.ClasspathResourceChangedManager; import com.redhat.devtools.intellij.quarkus.QuarkusPluginDisposable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -61,7 +62,7 @@ public void sourceFilesChanged(Set> sources) { if (isConfigSource(file)) { // A microprofile config file properties file source has been updated, evict the cache of the properties Module javaProject = pair.getSecond(); - PsiMicroProfileProject mpProject = getMicroProfileProject(javaProject); + PsiMicroProfileProject mpProject = getMicroProfileProject(javaProject, false); if (mpProject != null) { mpProject.evictConfigSourcesCache(file); } @@ -90,11 +91,13 @@ private PsiMicroProfileProjectManager(Project project) { connection.subscribe(ProjectTopics.MODULES, microprofileProjectListener); } - public PsiMicroProfileProject getMicroProfileProject(Module project) { + @NotNull + public PsiMicroProfileProject getMicroProfileProject(@NotNull Module project) { return getMicroProfileProject(project, true); } - private PsiMicroProfileProject getMicroProfileProject(Module javaProject, boolean create) { + @Nullable + private PsiMicroProfileProject getMicroProfileProject(@NotNull Module javaProject, boolean create) { PsiMicroProfileProject mpProject = javaProject.getUserData(KEY); if (mpProject == null) { if (!create) { diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusConstants.java b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusConstants.java index cd902c15e..7f14ddda3 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusConstants.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusConstants.java @@ -131,5 +131,5 @@ public class QuarkusConstants { public static final String QUARKUS_RUNTIME_CLASS_NAME = "io.quarkus.runtime.LaunchMode"; public static final String QUARKUS_BUILD_ITEM_CLASS_NAME = "io.quarkus.builder.item.BuildItem"; - public static final String QUARKUS_RUN_CONTEXT_KEY = QuarkusConstants.class.getName() + ".quarkusContext"; + } diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusModuleUtil.java b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusModuleUtil.java index 38b9f9a3c..735bb4725 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusModuleUtil.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusModuleUtil.java @@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProject; import com.redhat.devtools.lsp4ij.LSPIJUtils; import com.redhat.devtools.intellij.lsp4mp4ij.psi.internal.core.ls.PsiUtilsLSImpl; import com.redhat.devtools.intellij.quarkus.facet.QuarkusFacet; @@ -37,6 +38,7 @@ import java.util.regex.Pattern; public class QuarkusModuleUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(QuarkusModuleUtil.class); private static final Pattern QUARKUS_CORE_PATTERN = Pattern.compile("quarkus-core-(\\d[a-zA-Z\\d-.]+?).jar"); @@ -180,4 +182,36 @@ public static void sortRoot(List roots) { public static void sortRoot(VirtualFile[] roots) { Arrays.sort(roots, ROOT_COMPARATOR); // put root with smallest path first (eliminates generated sources roots) } + + public static String getApplicationUrl(@NotNull PsiMicroProfileProject mpProject) { + int port = getPort(mpProject); + String path = mpProject.getProperty("quarkus.http.root-path", "/"); + return "http://localhost:" + port + normalize(path); + } + + public static String getDevUIUrl(@NotNull PsiMicroProfileProject mpProject) { + int port = getPort(mpProject); + String path = mpProject.getProperty("quarkus.http.non-application-root-path", "q"); + if (!path.startsWith("/")) { + String rootPath = mpProject.getProperty("quarkus.http.root-path", "/"); + path = normalize(rootPath) + path; + } + return "http://localhost:" + port + normalize(path) + "dev"; + } + + private static String normalize(String path) { + StringBuilder builder = new StringBuilder(path); + if (builder.isEmpty() || builder.charAt(0) != '/') { + builder.insert(0, '/'); + } + if (builder.charAt(builder.length() - 1) != '/') { + builder.append('/'); + } + return builder.toString(); + } + + private static int getPort(@NotNull PsiMicroProfileProject mpProject) { + int port = mpProject.getPropertyAsInteger("quarkus.http.port", 8080); + return mpProject.getPropertyAsInteger("%dev.quarkus.http.port", port); + } } diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusDevAction.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusDevAction.java deleted file mode 100644 index 62c7a5e95..000000000 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusDevAction.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 Red Hat, Inc. - * Distributed under license by Red Hat, Inc. All rights reserved. - * This program is made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v20.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - ******************************************************************************/ -package com.redhat.devtools.intellij.quarkus.run; - -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import org.jetbrains.annotations.NotNull; - -import javax.swing.Icon; - -public abstract class QuarkusDevAction extends AnAction { - public QuarkusDevAction(String text, String description, Icon icon) { - super(text, description, icon); - } - - @Override - public void update(@NotNull AnActionEvent e) { - Object context = QuarkusRunContext.getContext(e); - e.getPresentation().setEnabledAndVisible(context != null); - } -} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusDevActionGroup.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusDevActionGroup.java deleted file mode 100644 index 0bb47647a..000000000 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusDevActionGroup.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 Red Hat, Inc. - * Distributed under license by Red Hat, Inc. All rights reserved. - * This program is made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v20.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - ******************************************************************************/ -package com.redhat.devtools.intellij.quarkus.run; - -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.ActionUpdateThread; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.util.IconLoader; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class QuarkusDevActionGroup extends ActionGroup { - private static final AnAction OPEN_DEV_UI_ACTION = new QuarkusOpenDevUIAction(); - private static final AnAction OPEN_APP_ACTION = new QuarkusOpenAppInBrowserAction(); - - public QuarkusDevActionGroup() { - super("Quarkus", "", IconLoader.getIcon("/quarkus_icon_rgb_16px_default.png", - QuarkusDevActionGroup.class)); - setPopup(true); - } - - @Override - public void update(@NotNull AnActionEvent e) { - Object context = QuarkusRunContext.getContext(e); - e.getPresentation().setEnabledAndVisible(context != null); - } - - @Override - public AnAction[] getChildren(@Nullable AnActionEvent e) { - return new AnAction[] { OPEN_DEV_UI_ACTION, OPEN_APP_ACTION}; - } - - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.BGT; - } - -} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusOpenAppInBrowserAction.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusOpenAppInBrowserAction.java deleted file mode 100644 index db81ce3b4..000000000 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusOpenAppInBrowserAction.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 Red Hat, Inc. - * Distributed under license by Red Hat, Inc. All rights reserved. - * This program is made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v20.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - ******************************************************************************/ -package com.redhat.devtools.intellij.quarkus.run; - -import com.intellij.ide.BrowserUtil; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.util.IconLoader; -import com.redhat.devtools.intellij.quarkus.TelemetryService; -import org.jetbrains.annotations.NotNull; - -public class QuarkusOpenAppInBrowserAction extends QuarkusDevAction { - public QuarkusOpenAppInBrowserAction() { - super("Open application","Launches the application in a browser", IconLoader.getIcon("/quarkus_icon_rgb_16px_default.png", QuarkusOpenAppInBrowserAction.class)); - } - - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - TelemetryService.instance().action(TelemetryService.UI_PREFIX + "openApplication").send(); - BrowserUtil.browse(QuarkusRunContext.getContext(e).getApplicationURL(), PlatformDataKeys.PROJECT.getData(e.getDataContext())); - } -} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusOpenDevUIAction.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusOpenDevUIAction.java deleted file mode 100644 index 209501c22..000000000 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusOpenDevUIAction.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 Red Hat, Inc. - * Distributed under license by Red Hat, Inc. All rights reserved. - * This program is made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v20.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - ******************************************************************************/ -package com.redhat.devtools.intellij.quarkus.run; - -import com.intellij.ide.BrowserUtil; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.util.IconLoader; -import com.redhat.devtools.intellij.quarkus.TelemetryService; -import org.jetbrains.annotations.NotNull; - -public class QuarkusOpenDevUIAction extends QuarkusDevAction { - public QuarkusOpenDevUIAction() { - super("Open DevUI","Launches the DevUI in a browser", IconLoader.getIcon("/quarkus_icon_rgb_16px_default.png", QuarkusOpenDevUIAction.class)); - } - - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - TelemetryService.instance().action(TelemetryService.UI_PREFIX + "openDevUI").send(); - BrowserUtil.browse(QuarkusRunContext.getContext(e).getDevUIURL(), PlatformDataKeys.PROJECT.getData(e.getDataContext())); - } -} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConsolePostProcessor.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConsolePostProcessor.java deleted file mode 100644 index fc891d681..000000000 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConsolePostProcessor.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 Red Hat, Inc. - * Distributed under license by Red Hat, Inc. All rights reserved. - * This program is made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v20.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - ******************************************************************************/ -package com.redhat.devtools.intellij.quarkus.run; - -import com.intellij.execution.actions.ConsoleActionsPostProcessor; -import com.intellij.execution.ui.ConsoleView; -import com.intellij.openapi.actionSystem.AnAction; -import org.jetbrains.annotations.NotNull; - -public class QuarkusRunConsolePostProcessor extends ConsoleActionsPostProcessor { - @Override - public AnAction[] postProcess(@NotNull ConsoleView console, AnAction[] actions) { - AnAction[] newActions = new AnAction[actions.length + 1]; - System.arraycopy(actions, 0, newActions, 0, actions.length); - newActions[actions.length] = new QuarkusDevActionGroup(); - return newActions; - } - - @Override - public AnAction[] postProcessPopupActions(@NotNull ConsoleView console, AnAction[] actions) { - return postProcess(console, actions); - } -} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunContext.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunContext.java deleted file mode 100644 index af87f28cf..000000000 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunContext.java +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2022 Red Hat, Inc. - * Distributed under license by Red Hat, Inc. All rights reserved. - * This program is made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v20.html - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - ******************************************************************************/ -package com.redhat.devtools.intellij.quarkus.run; - -import com.intellij.execution.ui.RunContentDescriptor; -import com.intellij.execution.ui.RunContentManager; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProject; -import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProjectManager; -import com.redhat.devtools.intellij.quarkus.QuarkusConstants; - -import javax.swing.JComponent; - -public class QuarkusRunContext { - private final PsiMicroProfileProject project; - - public QuarkusRunContext(Module module) { - this.project = PsiMicroProfileProjectManager.getInstance(module.getProject()).getMicroProfileProject(module); - } - - protected static QuarkusRunContext getContext(AnActionEvent e) { - Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext()); - RunContentManager contentManager = RunContentManager.getInstance(project); - RunContentDescriptor selectedContent = contentManager.getSelectedContent(); - JComponent component = selectedContent == null ? null : selectedContent.getComponent(); - return (component == null) ? null : (QuarkusRunContext) component.getClientProperty(QuarkusConstants.QUARKUS_RUN_CONTEXT_KEY); - } - - private String getProperty(String name, String defaultValue) { - String val = project.getProperty(name, defaultValue); - return project.getProperty("%dev." + name, val); - } - - private String normalize(String path) { - StringBuilder builder = new StringBuilder(path); - if (builder.length() == 0 || builder.charAt(0) != '/') { - builder.insert(0, '/'); - } - if (builder.charAt(builder.length() - 1) != '/') { - builder.append('/'); - } - return builder.toString(); - } - - private int getPort() { - int port = project.getPropertyAsInteger("quarkus.http.port", 8080); - port = project.getPropertyAsInteger("%dev.quarkus.http.port", port); - return port; - } - - public String getDevUIURL() { - int port = getPort(); - String path = getProperty("quarkus.http.non-application-root-path", "q"); - if (!path.startsWith("/")) { - String rootPath = getProperty("quarkus.http.root-path", "/"); - path = normalize(rootPath) + path; - } - path = normalize(path); - return "http://localhost:" + port + path + "dev"; - } - - public String getApplicationURL() { - int port = getPort(); - String path = getProperty("quarkus.http.root-path", "/"); - path = normalize(path); - return "http://localhost:" + port + path; - } -} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/dashboard/QuarkusRunDashboardCustomizer.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/dashboard/QuarkusRunDashboardCustomizer.java index 42d2ad8df..0042db922 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/dashboard/QuarkusRunDashboardCustomizer.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/run/dashboard/QuarkusRunDashboardCustomizer.java @@ -16,11 +16,14 @@ import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.ide.projectView.PresentationData; +import com.intellij.openapi.module.Module; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; +import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProject; +import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProjectManager; import com.redhat.devtools.intellij.quarkus.QuarkusModuleUtil; +import com.redhat.devtools.intellij.quarkus.TelemetryService; import com.redhat.devtools.intellij.quarkus.run.QuarkusRunConfiguration; -import com.redhat.devtools.intellij.quarkus.run.QuarkusRunContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -50,30 +53,47 @@ public boolean updatePresentation(@NotNull PresentationData presentation, @NotNu node.putUserData(RunDashboardCustomizer.NODE_LINKS, null); RunContentDescriptor descriptor = node.getDescriptor(); if (descriptor != null) { - ProcessHandler processHandler = descriptor.getProcessHandler(); + ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null && !processHandler.isProcessTerminated()) { // The Quarkus run configuration is running QuarkusRunConfiguration quarkusRunConfiguration = (QuarkusRunConfiguration) node.getConfigurationSettings().getConfiguration(); - if (QuarkusModuleUtil.isQuarkusWebAppModule(quarkusRunConfiguration.getModule())) { + Module module = quarkusRunConfiguration.getModule(); + if (QuarkusModuleUtil.isQuarkusWebAppModule(module)) { + PsiMicroProfileProject mpProject = PsiMicroProfileProjectManager.getInstance(module.getProject()).getMicroProfileProject(module); + // It is a Web application, add links for: // - Opening quarkus application in a browser // - Opening DevUI in a browser - QuarkusRunContext runContext = new QuarkusRunContext(quarkusRunConfiguration.getModule()); // Add application Url as hyperlink - String applicationUrl = runContext.getApplicationURL(); - String applicationLabel = applicationUrl; + String applicationUrl = QuarkusModuleUtil.getApplicationUrl(mpProject); presentation.addText(" ", SimpleTextAttributes.REGULAR_ATTRIBUTES); - presentation.addText(applicationLabel, SimpleTextAttributes.LINK_ATTRIBUTES); + presentation.addText(applicationUrl, SimpleTextAttributes.LINK_ATTRIBUTES); // Add DevUI Url as hyperlink - String devUIUrl = runContext.getDevUIURL(); + String devUIUrl = QuarkusModuleUtil.getDevUIUrl(mpProject); String devUILabel = "Dev UI"; presentation.addText(" - ", SimpleTextAttributes.REGULAR_ATTRIBUTES); presentation.addText(devUILabel, SimpleTextAttributes.LINK_ATTRIBUTES); Map links = new HashMap<>(); - links.put(applicationLabel, new SimpleColoredComponent.BrowserLauncherTag(applicationUrl)); - links.put(devUILabel, new SimpleColoredComponent.BrowserLauncherTag(devUIUrl)); + links.put(applicationUrl, new SimpleColoredComponent.BrowserLauncherTag(applicationUrl) { + @Override + public void run() { + // Open Quarkus application in a Web Browser + super.run(); + // Send event with telemetry + TelemetryService.instance().action(TelemetryService.UI_PREFIX + "openApplication").send(); + } + }); + links.put(devUILabel, new SimpleColoredComponent.BrowserLauncherTag(devUIUrl) { + @Override + public void run() { + // Open DevUI in a Web Browser + super.run(); + // Send event with telemetry + TelemetryService.instance().action(TelemetryService.UI_PREFIX + "openDevUI").send(); + } + }); node.putUserData(RunDashboardCustomizer.NODE_LINKS, links); } } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 35c11a0ae..df9026641 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -376,8 +376,6 @@ -