Skip to content

Commit

Permalink
feat: Auto create Quarkus run config while importing project
Browse files Browse the repository at this point in the history
Fixes #1233

Signed-off-by: azerr <[email protected]>
  • Loading branch information
angelozerr committed Nov 9, 2023
1 parent 95f8798 commit 72fe8bd
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
import com.intellij.openapi.startup.StartupActivity;
import com.redhat.devtools.intellij.lsp4mp4ij.classpath.ClasspathResourceChangedManager;
import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProjectManager;
import com.redhat.devtools.intellij.quarkus.run.QuarkusRunConfigurationManager;
import org.jetbrains.annotations.NotNull;

public class QuarkusPostStartupActivity implements StartupActivity, DumbAware {
@Override
public void runActivity(@NotNull Project project) {
QuarkusRunConfigurationManager.getInstance(project);
ClasspathResourceChangedManager.getInstance(project);
// Force the instantiation of the manager to be sure that classpath listener
// are registered before QuarkusLanguageClient classpath listener
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
/*******************************************************************************
* Copyright (c) 2023 Red Hat Inc. and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package com.redhat.devtools.intellij.quarkus.run;

import com.intellij.execution.RunManager;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.util.messages.MessageBusConnection;
import com.redhat.microprofile.psi.quarkus.PsiQuarkusUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.MavenDisposable;
import org.jetbrains.idea.maven.project.MavenImportListener;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;

import java.util.Collection;
import java.util.List;

/**
* Quarkus run configuration manager used to:
*
* <ul>
* <li>auto create Quarkus run configuration when a Quarkus Maven/Gradle is imported</li>
* <li>provides methods to find existing/ create Quarkus run configuration from a given module</li>
* </ul>
*/
public class QuarkusRunConfigurationManager implements Disposable {

public static QuarkusRunConfigurationManager getInstance(Project project) {
return ServiceManager.getService(project, QuarkusRunConfigurationManager.class);
}

private final Project project;
private final MessageBusConnection projectConnection;

public QuarkusRunConfigurationManager(Project project) {
this.project = project;
projectConnection = initializeAutoCreateRunConfigurationWhileImporting(project);
}

public @Nullable RunnerAndConfigurationSettings findExistingConfigurationFor(@NotNull Module module) {
List<RunnerAndConfigurationSettings> configurations = RunManager.getInstance(project).getConfigurationSettingsList(QuarkusRunConfigurationType.class);
if (!configurations.isEmpty()) {
for (RunnerAndConfigurationSettings settings : configurations) {
QuarkusRunConfiguration configuration = (QuarkusRunConfiguration) settings.getConfiguration();
if (module.equals(configuration.getModule())) {
return settings;
}
}
}
return null;
}

public @NotNull RunnerAndConfigurationSettings createConfiguration(@NotNull Module module, boolean save) {
var runManager = RunManager.getInstance(module.getProject());
RunnerAndConfigurationSettings quarkusSettings = runManager.createConfiguration(module.getName(), QuarkusRunConfigurationType.class);
((QuarkusRunConfiguration) quarkusSettings.getConfiguration()).setModule(module);
if (save) {
quarkusSettings.storeInLocalWorkspace();
// Save the configuration
runManager.addConfiguration(quarkusSettings);
}
return quarkusSettings;
}

@NotNull
private MessageBusConnection initializeAutoCreateRunConfigurationWhileImporting(Project project) {
MessageBusConnection projectConnection = project.getMessageBus().connect(MavenDisposable.getInstance(project));
autoCreateWithMaven(project, projectConnection);
autoCreateWithGradle(project, projectConnection);
return projectConnection;
}

private void autoCreateWithMaven(Project project, MessageBusConnection projectConnection) {
projectConnection.subscribe(MavenImportListener.TOPIC, new MavenImportListener() {
@Override
public void importFinished(@NotNull Collection<MavenProject> importedProjects, @NotNull List<Module> newModules) {
// TODO manage a settings to auto create Quarkus run config
for (MavenProject mavenProject : importedProjects) {
MavenProjectsManager projectsManager = MavenProjectsManager.getInstance(project);
Module module = projectsManager.findModule(mavenProject);
if (module != null) {
tryToCreateRunConfiguration(module);
}
}
}
});
}

private void autoCreateWithGradle(Project project, MessageBusConnection projectConnection) {
// TODO : track the Gradle import projects
}

private void tryToCreateRunConfiguration(Module module) {
if (!ReadAction.compute(()-> PsiQuarkusUtils.isQuarkusProject(module))) {
return;
}
// Find existing Quarkus run configuration
RunnerAndConfigurationSettings quarkusSettings = findExistingConfigurationFor(module);
if (quarkusSettings == null) {
// No Quarkus run configuration for the module, create it and save it in the .idea/workspace.xml file
createConfiguration(module, true);
}
}

@Override
public void dispose() {
projectConnection.disconnect();
}
}
1 change: 1 addition & 0 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@
<projectService serviceImplementation="com.redhat.devtools.intellij.lsp4mp4ij.classpath.ClasspathResourceChangedManager"/>
<projectService serviceImplementation="com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProjectManager"/>
<projectService serviceImplementation="com.redhat.devtools.intellij.quarkus.QuarkusDeploymentSupport"/>
<projectService serviceImplementation="com.redhat.devtools.intellij.quarkus.run.QuarkusRunConfigurationManager" />
<configurationType implementation="com.redhat.devtools.intellij.quarkus.run.QuarkusRunConfigurationType"/>
<consoleActionsPostProcessor implementation="com.redhat.devtools.intellij.quarkus.run.QuarkusRunConsolePostProcessor"/>

Expand Down

0 comments on commit 72fe8bd

Please sign in to comment.