From 3c3b812b11e6820986bed21a69337e15f70269e8 Mon Sep 17 00:00:00 2001 From: Phillip Kruger Date: Sat, 16 Mar 2024 17:57:40 +1100 Subject: [PATCH] Easy way to add deployment methods in Dev UI Signed-off-by: Phillip Kruger --- .../deployment/OpenshiftDevUIProcessor.java | 10 +-- .../OpenshiftDeploymentJsonRpcService.java | 21 ------ .../devui/KubernetesDevUIProcessor.java | 11 ++-- .../devui/KubernetesManifestService.java | 29 -------- .../deployment/BuildTimeContentProcessor.java | 20 ++++++ .../deployment/DeploymentMethodBuildItem.java | 25 +++++++ .../devui/deployment/DevUIProcessor.java | 16 +++-- ...va => JsonRPCRuntimeMethodsBuildItem.java} | 4 +- .../devui/deployment/ide/IdeProcessor.java | 20 ++++-- .../logstream/LogStreamProcessor.java | 41 ++++++------ .../menu/ConfigurationProcessor.java | 37 ++++++++--- .../menu/ContinuousTestingProcessor.java | 66 ++++++++++--------- .../dev-ui/qwc/qwc-configuration-editor.js | 2 + .../resources/dev-ui/qwc/qwc-configuration.js | 2 + .../devui/spi/buildtime/BuildTimeAction.java | 30 +++++++++ .../buildtime/BuildTimeActionBuildItem.java | 37 +++++++++++ .../quarkus/devui/runtime/DevUIRecorder.java | 6 +- .../devui/runtime/comms/JsonRpcRouter.java | 32 +++++++-- .../runtime/config/ConfigJsonRPCService.java | 40 ----------- .../ContinuousTestingJsonRPCService.java | 56 +--------------- .../devui/runtime/ide/IdeJsonRPCService.java | 28 -------- .../devui/runtime/jsonrpc/JsonRpcRequest.java | 2 +- .../logstream/LogStreamJsonRPCService.java | 47 ------------- 23 files changed, 273 insertions(+), 309 deletions(-) delete mode 100644 extensions/kubernetes/openshift/runtime/src/main/java/io/quarkus/openshift/runtime/devui/OpenshiftDeploymentJsonRpcService.java delete mode 100644 extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/devui/KubernetesManifestService.java create mode 100644 extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DeploymentMethodBuildItem.java rename extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/{JsonRPCMethodsBuildItem.java => JsonRPCRuntimeMethodsBuildItem.java} (74%) create mode 100644 extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeAction.java create mode 100644 extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeActionBuildItem.java delete mode 100644 extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/ide/IdeJsonRPCService.java diff --git a/extensions/kubernetes/openshift/deployment/src/main/java/io/quarkus/openshift/deployment/OpenshiftDevUIProcessor.java b/extensions/kubernetes/openshift/deployment/src/main/java/io/quarkus/openshift/deployment/OpenshiftDevUIProcessor.java index 520c756160abb..cf5309fc680da 100644 --- a/extensions/kubernetes/openshift/deployment/src/main/java/io/quarkus/openshift/deployment/OpenshiftDevUIProcessor.java +++ b/extensions/kubernetes/openshift/deployment/src/main/java/io/quarkus/openshift/deployment/OpenshiftDevUIProcessor.java @@ -11,10 +11,9 @@ import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.dev.console.DevConsoleManager; import io.quarkus.dev.console.TempSystemProperties; -import io.quarkus.devui.spi.JsonRPCProvidersBuildItem; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.devui.spi.page.CardPageBuildItem; import io.quarkus.devui.spi.page.Page; -import io.quarkus.openshift.runtime.devui.OpenshiftDeploymentJsonRpcService; import io.vertx.core.json.JsonArray; public class OpenshiftDevUIProcessor { @@ -35,9 +34,10 @@ CardPageBuildItem create(List extensi } @BuildStep(onlyIf = IsDevelopment.class) - JsonRPCProvidersBuildItem createJsonRPCServiceForContainerBuild() { - DevConsoleManager.register("openshift-deployment-action", build()); - return new JsonRPCProvidersBuildItem(OpenshiftDeploymentJsonRpcService.class); + BuildTimeActionBuildItem createBuildTimeActionsForContainerBuild() { + BuildTimeActionBuildItem deployActions = new BuildTimeActionBuildItem(); + deployActions.addAction("build", build()); + return deployActions; } private Function, String> build() { diff --git a/extensions/kubernetes/openshift/runtime/src/main/java/io/quarkus/openshift/runtime/devui/OpenshiftDeploymentJsonRpcService.java b/extensions/kubernetes/openshift/runtime/src/main/java/io/quarkus/openshift/runtime/devui/OpenshiftDeploymentJsonRpcService.java deleted file mode 100644 index 41acfa9524b45..0000000000000 --- a/extensions/kubernetes/openshift/runtime/src/main/java/io/quarkus/openshift/runtime/devui/OpenshiftDeploymentJsonRpcService.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.quarkus.openshift.runtime.devui; - -import java.util.Map; - -import jakarta.enterprise.context.ApplicationScoped; - -import io.quarkus.dev.console.DevConsoleManager; - -@ApplicationScoped -public class OpenshiftDeploymentJsonRpcService { - - public String build(String type, Boolean expose, Boolean untrusted) { - Map params = Map.of( - "quarkus.openshift.route.expose", expose.toString(), - "quarkus.kubernetes-client.trust-certs", untrusted.toString(), - "quarkus.build.package-type", type); - - return DevConsoleManager.invoke("openshift-deployment-action", params); - } - -} diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/devui/KubernetesDevUIProcessor.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/devui/KubernetesDevUIProcessor.java index 9ca45e477528d..451cd4b87a50b 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/devui/KubernetesDevUIProcessor.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/devui/KubernetesDevUIProcessor.java @@ -16,11 +16,10 @@ import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; import io.quarkus.dev.console.DevConsoleManager; -import io.quarkus.devui.spi.JsonRPCProvidersBuildItem; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.devui.spi.page.CardPageBuildItem; import io.quarkus.devui.spi.page.Page; import io.quarkus.kubernetes.deployment.SelectedKubernetesDeploymentTargetBuildItem; -import io.quarkus.kubernetes.runtime.devui.KubernetesManifestService; import io.quarkus.kubernetes.spi.GeneratedKubernetesResourceBuildItem; public class KubernetesDevUIProcessor { @@ -39,8 +38,9 @@ CardPageBuildItem create(CurateOutcomeBuildItem bi) { } @BuildStep(onlyIf = IsDevelopment.class) - JsonRPCProvidersBuildItem createJsonRPCServiceForCache() { - DevConsoleManager.register("kubernetes-generate-manifest", ignored -> { + BuildTimeActionBuildItem createBuildTimeActions() { + BuildTimeActionBuildItem generateManifestActions = new BuildTimeActionBuildItem(); + generateManifestActions.addAction("generateManifests", ignored -> { try { List manifests = holder.getManifests(); // Avoid relying on databind. @@ -53,7 +53,8 @@ JsonRPCProvidersBuildItem createJsonRPCServiceForCache() { throw new RuntimeException(e); } }); - return new JsonRPCProvidersBuildItem(KubernetesManifestService.class); + + return generateManifestActions; } public static final class Holder { diff --git a/extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/devui/KubernetesManifestService.java b/extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/devui/KubernetesManifestService.java deleted file mode 100644 index 7820d2c3ebcaa..0000000000000 --- a/extensions/kubernetes/vanilla/runtime/src/main/java/io/quarkus/kubernetes/runtime/devui/KubernetesManifestService.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.quarkus.kubernetes.runtime.devui; - -import java.util.Map; -import java.util.stream.Collectors; - -import jakarta.enterprise.context.ApplicationScoped; - -import io.quarkus.dev.console.DevConsoleManager; - -@ApplicationScoped -public class KubernetesManifestService { - - public String generateManifests() { - try { - Map map = DevConsoleManager.invoke("kubernetes-generate-manifest", Map.of()); - return toJson(map); - } catch (Exception e) { - e.printStackTrace(); - return "{}"; - } - } - - private static String toJson(Map map) { - var content = map.entrySet().stream() - .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue().replace("\n", "\\n") + "\"") - .collect(Collectors.joining(",")); - return "{" + content + "}"; - } -} diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/BuildTimeContentProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/BuildTimeContentProcessor.java index 4b3d9a182ddd6..e8560c2c8518d 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/BuildTimeContentProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/BuildTimeContentProcessor.java @@ -60,6 +60,8 @@ import io.quarkus.devui.deployment.extension.Extension; import io.quarkus.devui.spi.AbstractDevUIBuildItem; import io.quarkus.devui.spi.DevUIContent; +import io.quarkus.devui.spi.buildtime.BuildTimeAction; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.devui.spi.buildtime.QuteTemplateBuildItem; import io.quarkus.devui.spi.buildtime.StaticContentBuildItem; import io.quarkus.devui.spi.page.AbstractPageBuildItem; @@ -181,6 +183,24 @@ void mapPageBuildTimeData(List cards, } } + @BuildStep(onlyIf = IsDevelopment.class) + DeploymentMethodBuildItem mapDeploymentMethods( + List buildTimeActions, + CurateOutcomeBuildItem curateOutcomeBuildItem) { + + List methodNames = new ArrayList<>(); + for (BuildTimeActionBuildItem actions : buildTimeActions) { + String extensionPathName = actions.getExtensionPathName(curateOutcomeBuildItem); + for (BuildTimeAction bta : actions.getActions()) { + String fullName = extensionPathName + "." + bta.getMethodName(); + DevConsoleManager.register(fullName, bta.getAction()); + methodNames.add(fullName); + } + } + + return new DeploymentMethodBuildItem(methodNames); + } + private Map getBuildTimeDataForPage(AbstractPageBuildItem pageBuildItem) { Map m = new HashMap<>(); if (pageBuildItem.hasBuildTimeData()) { diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DeploymentMethodBuildItem.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DeploymentMethodBuildItem.java new file mode 100644 index 0000000000000..be146ba582f53 --- /dev/null +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DeploymentMethodBuildItem.java @@ -0,0 +1,25 @@ +package io.quarkus.devui.deployment; + +import java.util.List; + +import io.quarkus.builder.item.SimpleBuildItem; + +/** + * Hold add discovered build time methods that can be executed via json-rpc + */ +public final class DeploymentMethodBuildItem extends SimpleBuildItem { + + private final List methods; + + public DeploymentMethodBuildItem(List methods) { + this.methods = methods; + } + + public List getMethods() { + return this.methods; + } + + public boolean hasMethods() { + return this.methods != null && !this.methods.isEmpty(); + } +} diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java index 3c33a0386fb66..603c1af3d95e1 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/DevUIProcessor.java @@ -293,12 +293,13 @@ void additionalBean(BuildProducer additionalBeanProduce * This goes through all jsonRPC methods and discover the methods using Jandex */ @BuildStep(onlyIf = IsDevelopment.class) - void findAllJsonRPCMethods(BuildProducer jsonRPCMethodsProvider, + void findAllJsonRPCMethods(BuildProducer jsonRPCMethodsProvider, BuildProducer buildTimeConstProducer, LaunchModeBuildItem launchModeBuildItem, CombinedIndexBuildItem combinedIndexBuildItem, CurateOutcomeBuildItem curateOutcomeBuildItem, - List jsonRPCProvidersBuildItems) { + List jsonRPCProvidersBuildItems, + DeploymentMethodBuildItem deploymentMethodBuildItem) { if (launchModeBuildItem.isNotLocalDevModeType()) { return; @@ -369,8 +370,12 @@ void findAllJsonRPCMethods(BuildProducer jsonRPCMethods } } + if (deploymentMethodBuildItem.hasMethods()) { + requestResponseMethods.addAll(deploymentMethodBuildItem.getMethods()); + } + if (!extensionMethodsMap.isEmpty()) { - jsonRPCMethodsProvider.produce(new JsonRPCMethodsBuildItem(extensionMethodsMap)); + jsonRPCMethodsProvider.produce(new JsonRPCRuntimeMethodsBuildItem(extensionMethodsMap)); } BuildTimeConstBuildItem methodInfo = new BuildTimeConstBuildItem("devui-jsonrpc"); @@ -390,7 +395,8 @@ void findAllJsonRPCMethods(BuildProducer jsonRPCMethods @Record(ExecutionTime.STATIC_INIT) void createJsonRpcRouter(DevUIRecorder recorder, BeanContainerBuildItem beanContainer, - JsonRPCMethodsBuildItem jsonRPCMethodsBuildItem) { + JsonRPCRuntimeMethodsBuildItem jsonRPCMethodsBuildItem, + DeploymentMethodBuildItem deploymentMethodBuildItem) { if (jsonRPCMethodsBuildItem != null) { Map> extensionMethodsMap = jsonRPCMethodsBuildItem @@ -398,7 +404,7 @@ void createJsonRpcRouter(DevUIRecorder recorder, DevConsoleManager.setGlobal(DevUIRecorder.DEV_MANAGER_GLOBALS_JSON_MAPPER_FACTORY, JsonMapper.Factory.deploymentLinker().createLinkData(new DevUIDatabindCodec.Factory())); - recorder.createJsonRpcRouter(beanContainer.getValue(), extensionMethodsMap); + recorder.createJsonRpcRouter(beanContainer.getValue(), extensionMethodsMap, deploymentMethodBuildItem.getMethods()); } } diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/JsonRPCMethodsBuildItem.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/JsonRPCRuntimeMethodsBuildItem.java similarity index 74% rename from extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/JsonRPCMethodsBuildItem.java rename to extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/JsonRPCRuntimeMethodsBuildItem.java index 1cc0c40d7e0e3..5dad9ee1534aa 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/JsonRPCMethodsBuildItem.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/JsonRPCRuntimeMethodsBuildItem.java @@ -9,11 +9,11 @@ /** * Simple holder for all discovered Json RPC Methods */ -public final class JsonRPCMethodsBuildItem extends SimpleBuildItem { +public final class JsonRPCRuntimeMethodsBuildItem extends SimpleBuildItem { private final Map> extensionMethodsMap; - public JsonRPCMethodsBuildItem(Map> extensionMethodsMap) { + public JsonRPCRuntimeMethodsBuildItem(Map> extensionMethodsMap) { this.extensionMethodsMap = extensionMethodsMap; } diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/ide/IdeProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/ide/IdeProcessor.java index a957693941d38..0f772ff344f08 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/ide/IdeProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/ide/IdeProcessor.java @@ -17,9 +17,7 @@ import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.ide.EffectiveIdeBuildItem; import io.quarkus.deployment.ide.Ide; -import io.quarkus.dev.console.DevConsoleManager; -import io.quarkus.devui.runtime.ide.IdeJsonRPCService; -import io.quarkus.devui.spi.JsonRPCProvidersBuildItem; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.utilities.OS; import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem; import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem; @@ -32,20 +30,28 @@ public class IdeProcessor { private static final Map LANG_TO_EXT = Map.of("java", "java", "kotlin", "kt"); @BuildStep(onlyIf = IsDevelopment.class) - void createJsonRPCService(BuildProducer JsonRPCProvidersProducer, + void createJsonRPCService(BuildProducer buildTimeActionProducer, Optional effectiveIdeBuildItem) { if (effectiveIdeBuildItem.isPresent()) { Ide ide = effectiveIdeBuildItem.get().getIde(); if (ide != null) { - DevConsoleManager.register("dev-ui-ide-open", map -> { + BuildTimeActionBuildItem ideActions = new BuildTimeActionBuildItem(NAMESPACE); + + ideActions.addAction("open", map -> { String fileName = map.get("fileName"); String lang = map.get("lang"); String lineNumber = map.get("lineNumber"); + + if (isNullOrEmpty(fileName) || isNullOrEmpty(lang)) { + return false; + } + return typicalProcessLaunch(fileName, lang, lineNumber, ide); }); + + buildTimeActionProducer.produce(ideActions); } - JsonRPCProvidersProducer.produce(new JsonRPCProvidersBuildItem("devui-ide-interaction", IdeJsonRPCService.class)); } } @@ -145,4 +151,6 @@ public static void openBrowser(HttpRootPathBuildItem rp, NonApplicationRootPathB private boolean isNullOrEmpty(String arg) { return arg == null || arg.isBlank(); } + + private static final String NAMESPACE = "devui-ide-interaction"; } diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/logstream/LogStreamProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/logstream/LogStreamProcessor.java index dec094531cc70..0f8d232660a8d 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/logstream/LogStreamProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/logstream/LogStreamProcessor.java @@ -13,13 +13,13 @@ import io.quarkus.deployment.builditem.StreamingLogHandlerBuildItem; import io.quarkus.deployment.dev.RuntimeUpdatesProcessor; import io.quarkus.deployment.dev.testing.TestSupport; -import io.quarkus.dev.console.DevConsoleManager; import io.quarkus.dev.spi.DevModeType; import io.quarkus.devui.runtime.logstream.LogStreamBroadcaster; import io.quarkus.devui.runtime.logstream.LogStreamJsonRPCService; import io.quarkus.devui.runtime.logstream.LogStreamRecorder; import io.quarkus.devui.runtime.logstream.MutinyLogHandler; import io.quarkus.devui.spi.JsonRPCProvidersBuildItem; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.runtime.RuntimeValue; /** @@ -27,6 +27,8 @@ */ public class LogStreamProcessor { + private final String namespace = "devui-logstream"; + @BuildStep(onlyIf = IsDevelopment.class) void additionalBean(BuildProducer additionalBeanProducer) { additionalBeanProducer.produce(AdditionalBeanBuildItem.builder() @@ -44,15 +46,20 @@ public void handler(BuildProducer streamingLogHand } @BuildStep(onlyIf = IsDevelopment.class) - JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBuildItem) { + void createJsonRPCService(BuildProducer jsonRPCProvidersProducer, + BuildProducer buildTimeActionProducer, + LaunchModeBuildItem launchModeBuildItem) { + Optional ts = TestSupport.instance(); - DevConsoleManager.register("logstream-force-restart", ignored -> { + BuildTimeActionBuildItem keyStrokeActions = new BuildTimeActionBuildItem(namespace); + + keyStrokeActions.addAction("forceRestart", ignored -> { RuntimeUpdatesProcessor.INSTANCE.doScan(true, true); return Map.of(); }); - DevConsoleManager.register("logstream-rerun-all-tests", ignored -> { + keyStrokeActions.addAction("rerunAllTests", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -65,7 +72,7 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui } }); - DevConsoleManager.register("logstream-rerun-failed-tests", ignored -> { + keyStrokeActions.addAction("rerunFailedTests", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -73,7 +80,7 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui return Map.of(); }); - DevConsoleManager.register("logstream-toggle-broken-only", ignored -> { + keyStrokeActions.addAction("toggleBrokenOnly", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -81,7 +88,7 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui return Map.of("brokenOnlyMode", brokenOnlyMode); }); - DevConsoleManager.register("logstream-print-failures", ignored -> { + keyStrokeActions.addAction("printFailures", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -89,7 +96,7 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui return Map.of(); }); - DevConsoleManager.register("logstream-toggle-test-output", ignored -> { + keyStrokeActions.addAction("toggleTestOutput", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -97,12 +104,12 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui return Map.of("isTestOutput", isTestOutput); }); - DevConsoleManager.register("logstream-toggle-instrumentation-reload", ignored -> { + keyStrokeActions.addAction("toggleInstrumentationReload", ignored -> { boolean instrumentationEnabled = RuntimeUpdatesProcessor.INSTANCE.toggleInstrumentation(); return Map.of("instrumentationEnabled", instrumentationEnabled); }); - DevConsoleManager.register("logstream-pause-tests", ignored -> { + keyStrokeActions.addAction("pauseTests", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -113,16 +120,7 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui return Map.of(); }); - DevConsoleManager.register("logstream-toggle-live-reload", ignored -> { - if (testsDisabled(launchModeBuildItem, ts)) { - return Map.of(); - } - boolean liveReloadEnabled = ts.get().toggleLiveReloadEnabled(); - return Map.of("liveReloadEnabled", liveReloadEnabled); - }); - - DevConsoleManager.register("logstream-toggle-live-reload", ignored -> { - + keyStrokeActions.addAction("toggleLiveReload", ignored -> { if (testsDisabled(launchModeBuildItem, ts)) { return Map.of(); } @@ -130,7 +128,8 @@ JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBui return Map.of("liveReloadEnabled", liveReloadEnabled); }); - return new JsonRPCProvidersBuildItem("devui-logstream", LogStreamJsonRPCService.class); + buildTimeActionProducer.produce(keyStrokeActions); + jsonRPCProvidersProducer.produce(new JsonRPCProvidersBuildItem(namespace, LogStreamJsonRPCService.class)); } private boolean testsDisabled(LaunchModeBuildItem launchModeBuildItem, Optional ts) { diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ConfigurationProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ConfigurationProcessor.java index 2f2842e10d1b4..13e6273b17854 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ConfigurationProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ConfigurationProcessor.java @@ -2,6 +2,7 @@ import java.io.BufferedWriter; import java.io.IOException; +import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -11,6 +12,7 @@ import java.util.Locale; import java.util.Map; import java.util.Optional; +import java.util.Properties; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -34,6 +36,7 @@ import io.quarkus.devui.runtime.config.ConfigDevUIRecorder; import io.quarkus.devui.runtime.config.ConfigJsonRPCService; import io.quarkus.devui.spi.JsonRPCProvidersBuildItem; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.devui.spi.page.Page; /** @@ -49,13 +52,13 @@ InternalPageBuildItem createConfigurationPages( InternalPageBuildItem configurationPages = new InternalPageBuildItem("Configuration", 20); configurationPages.addPage(Page.webComponentPageBuilder() - .namespace("devui-configuration") + .namespace(NAMESPACE) .title("Form Editor") .icon("font-awesome-solid:sliders") .componentLink("qwc-configuration.js")); configurationPages.addPage(Page.webComponentPageBuilder() - .namespace("devui-configuration") + .namespace(NAMESPACE) .title("Source Editor") .icon("font-awesome-solid:code") .componentLink("qwc-configuration-editor.js")); @@ -95,20 +98,36 @@ void registerConfigs(List configDescriptionBuildItem @Record(ExecutionTime.RUNTIME_INIT) void registerJsonRpcService( BuildProducer jsonRPCProvidersProducer, + BuildProducer buildTimeActionProducer, BuildProducer syntheticBeanProducer, ConfigDevUIRecorder recorder, CuratedApplicationShutdownBuildItem shutdown) { - DevConsoleManager.register("config-update-property", map -> { + BuildTimeActionBuildItem configActions = new BuildTimeActionBuildItem(NAMESPACE); + + configActions.addAction("updateProperty", map -> { Map values = Collections.singletonMap(map.get("name"), map.get("value")); updateConfig(values); return null; }); - DevConsoleManager.register("config-set-properties", value -> { - String content = value.get("content"); - setConfig(content); - return null; + configActions.addAction("updateProperties", map -> { + String type = map.get("type"); + + if (type.equalsIgnoreCase("properties")) { + String content = map.get("content"); + + Properties p = new Properties(); + try (StringReader sr = new StringReader(content)) { + p.load(sr); // Validate + setConfig(content); + return true; + } catch (IOException ex) { + return false; + } + } + return false; }); + buildTimeActionProducer.produce(configActions); syntheticBeanProducer.produce( SyntheticBeanBuildItem.configure(ConfigDescriptionBean.class).unremovable() @@ -126,7 +145,7 @@ public void run() { } }, true); - jsonRPCProvidersProducer.produce(new JsonRPCProvidersBuildItem("devui-configuration", ConfigJsonRPCService.class)); + jsonRPCProvidersProducer.produce(new JsonRPCProvidersBuildItem(NAMESPACE, ConfigJsonRPCService.class)); } private static final Pattern codePattern = Pattern.compile("(\\{@code )([^}]+)(\\})"); @@ -238,4 +257,6 @@ private static Path getConfigPath() throws IOException { } return configPath; } + + private static final String NAMESPACE = "devui-configuration"; } diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ContinuousTestingProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ContinuousTestingProcessor.java index d9c4fd83d582a..69eaa535b3961 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ContinuousTestingProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ContinuousTestingProcessor.java @@ -7,6 +7,7 @@ import io.quarkus.arc.deployment.BeanContainerBuildItem; import io.quarkus.deployment.IsDevelopment; +import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.annotations.ExecutionTime; import io.quarkus.deployment.annotations.Record; @@ -14,12 +15,12 @@ import io.quarkus.deployment.builditem.ShutdownContextBuildItem; import io.quarkus.deployment.dev.testing.TestRunResults; import io.quarkus.deployment.dev.testing.TestSupport; -import io.quarkus.dev.console.DevConsoleManager; import io.quarkus.dev.spi.DevModeType; import io.quarkus.devui.deployment.InternalPageBuildItem; import io.quarkus.devui.runtime.continuoustesting.ContinuousTestingJsonRPCService; import io.quarkus.devui.runtime.continuoustesting.ContinuousTestingRecorder; import io.quarkus.devui.spi.JsonRPCProvidersBuildItem; +import io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem; import io.quarkus.devui.spi.page.Page; /** @@ -63,25 +64,31 @@ InternalPageBuildItem createContinuousTestingPages() { } @BuildStep(onlyIf = IsDevelopment.class) - JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBuildItem) { - - registerStartMethod(launchModeBuildItem); - registerStopMethod(launchModeBuildItem); - registerRunAllMethod(launchModeBuildItem); - registerRunFailedMethod(launchModeBuildItem); - registerToggleBrokenOnlyMethod(launchModeBuildItem); - registerToggleInstrumentationMethod(launchModeBuildItem); - registerGetResultsMethod(launchModeBuildItem); - registerGetStatusMethod(launchModeBuildItem); - return new JsonRPCProvidersBuildItem(NAMESPACE, ContinuousTestingJsonRPCService.class); + void createJsonRPCService(LaunchModeBuildItem launchModeBuildItem, + BuildProducer jsonRPCProvidersProducer, + BuildProducer buildTimeActionProducer) { + + BuildTimeActionBuildItem actions = new BuildTimeActionBuildItem(NAMESPACE); + + registerStartMethod(launchModeBuildItem, actions); + registerStopMethod(launchModeBuildItem, actions); + registerRunAllMethod(launchModeBuildItem, actions); + registerRunFailedMethod(launchModeBuildItem, actions); + registerToggleBrokenOnlyMethod(launchModeBuildItem, actions); + registerToggleInstrumentationMethod(launchModeBuildItem, actions); + registerGetResultsMethod(launchModeBuildItem, actions); + registerGetStatusMethod(launchModeBuildItem, actions); + buildTimeActionProducer.produce(actions); + + jsonRPCProvidersProducer.produce(new JsonRPCProvidersBuildItem(NAMESPACE, ContinuousTestingJsonRPCService.class)); } private boolean testsDisabled(LaunchModeBuildItem launchModeBuildItem, Optional ts) { return ts.isEmpty() || launchModeBuildItem.getDevModeType().orElse(null) != DevModeType.LOCAL; } - private void registerStartMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "start", ignored -> { + private void registerStartMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("start", ignored -> { try { Optional ts = TestSupport.instance(); @@ -102,8 +109,8 @@ private void registerStartMethod(LaunchModeBuildItem launchModeBuildItem) { }); } - private void registerStopMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "stop", ignored -> { + private void registerStopMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("stop", ignored -> { try { Optional ts = TestSupport.instance(); @@ -124,8 +131,8 @@ private void registerStopMethod(LaunchModeBuildItem launchModeBuildItem) { }); } - private void registerRunAllMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "runAll", ignored -> { + private void registerRunAllMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("runAll", ignored -> { try { Optional ts = TestSupport.instance(); @@ -141,8 +148,8 @@ private void registerRunAllMethod(LaunchModeBuildItem launchModeBuildItem) { }); } - private void registerRunFailedMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "runFailed", ignored -> { + private void registerRunFailedMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("runFailed", ignored -> { try { Optional ts = TestSupport.instance(); @@ -158,8 +165,8 @@ private void registerRunFailedMethod(LaunchModeBuildItem launchModeBuildItem) { }); } - private void registerToggleBrokenOnlyMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "toggleBrokenOnly", ignored -> { + private void registerToggleBrokenOnlyMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("toggleBrokenOnly", ignored -> { try { Optional ts = TestSupport.instance(); @@ -174,8 +181,9 @@ private void registerToggleBrokenOnlyMethod(LaunchModeBuildItem launchModeBuildI }); } - private void registerToggleInstrumentationMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "toggleInstrumentation", ignored -> { + private void registerToggleInstrumentationMethod(LaunchModeBuildItem launchModeBuildItem, + BuildTimeActionBuildItem actions) { + actions.addAction("toggleInstrumentation", ignored -> { try { Optional ts = TestSupport.instance(); @@ -190,8 +198,8 @@ private void registerToggleInstrumentationMethod(LaunchModeBuildItem launchModeB }); } - private void registerGetStatusMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "getStatus", ignored -> { + private void registerGetStatusMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("getStatus", ignored -> { try { Optional ts = TestSupport.instance(); if (testsDisabled(launchModeBuildItem, ts)) { @@ -228,8 +236,8 @@ private void registerGetStatusMethod(LaunchModeBuildItem launchModeBuildItem) { }); } - private void registerGetResultsMethod(LaunchModeBuildItem launchModeBuildItem) { - DevConsoleManager.register(NAMESPACE + DASH + "getResults", ignored -> { + private void registerGetResultsMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) { + actions.addAction("getResults", ignored -> { try { Optional ts = TestSupport.instance(); if (testsDisabled(launchModeBuildItem, ts)) { @@ -251,6 +259,4 @@ private void registerGetResultsMethod(LaunchModeBuildItem launchModeBuildItem) { } private static final String NAMESPACE = "devui-continuous-testing"; - private static final String DASH = "-"; - } diff --git a/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration-editor.js b/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration-editor.js index 343d3fabf6234..5915a124d2bc1 100644 --- a/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration-editor.js +++ b/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration-editor.js @@ -2,6 +2,7 @@ import { LitElement, html, css } from 'lit'; import { JsonRpc } from 'jsonrpc'; import { notifier } from 'notifier'; import { observeState } from 'lit-element-state'; +import { devuiState } from 'devui-state'; import { themeState } from 'theme-state'; import '@quarkus-webcomponents/codeblock'; import '@vaadin/button'; @@ -110,6 +111,7 @@ export class QwcConfigurationEditor extends observeState(LitElement) { if(jsonRpcResponse.result === false){ notifier.showErrorMessage("Configuration failed to update. See log file for details"); }else{ + fetch(devuiState.applicationInfo.contextRoot); notifier.showSuccessMessage("Configuration successfully updated"); } }); diff --git a/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration.js b/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration.js index 917c076e6e655..6aec4cc1aacd2 100644 --- a/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration.js +++ b/extensions/vertx-http/dev-ui-resources/src/main/resources/dev-ui/qwc/qwc-configuration.js @@ -19,6 +19,7 @@ import { unsafeHTML } from 'lit/directives/unsafe-html.js'; import { gridRowDetailsRenderer } from '@vaadin/grid/lit.js'; import { observeState } from 'lit-element-state'; import { connectionState } from 'connection-state'; +import { devuiState } from 'devui-state'; import 'qui-badge'; /** @@ -468,6 +469,7 @@ export class QwcConfiguration extends observeState(LitElement) { 'value': value }).then(e => { this._values[name] = value; + fetch(devuiState.applicationInfo.contextRoot); notifier.showInfoMessage("Property " + name + " updated"); this._busy = null; }); diff --git a/extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeAction.java b/extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeAction.java new file mode 100644 index 0000000000000..5f4e416ba90a6 --- /dev/null +++ b/extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeAction.java @@ -0,0 +1,30 @@ +package io.quarkus.devui.spi.buildtime; + +import java.util.Map; +import java.util.function.Function; + +/** + * Define a action that can be executed against the deployment classpath in runtime + * This means a call will still be make with Json-RPC to the backend, but fall through to this action + */ +public class BuildTimeAction { + + private final String methodName; + private final Function, ?> action; + + protected BuildTimeAction(String methodName, + Function, T> action) { + + this.methodName = methodName; + this.action = action; + + } + + public String getMethodName() { + return methodName; + } + + public Function, ?> getAction() { + return action; + } +} diff --git a/extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeActionBuildItem.java b/extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeActionBuildItem.java new file mode 100644 index 0000000000000..b505543895ff0 --- /dev/null +++ b/extensions/vertx-http/dev-ui-spi/src/main/java/io/quarkus/devui/spi/buildtime/BuildTimeActionBuildItem.java @@ -0,0 +1,37 @@ +package io.quarkus.devui.spi.buildtime; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import io.quarkus.devui.spi.AbstractDevUIBuildItem; + +/** + * Holds any Build time actions for Dev UI the extension has + */ +public final class BuildTimeActionBuildItem extends AbstractDevUIBuildItem { + + private final List actions = new ArrayList<>(); + + public BuildTimeActionBuildItem() { + super(); + } + + public BuildTimeActionBuildItem(String customIdentifier) { + super(customIdentifier); + } + + public void addAction(BuildTimeAction buildTimeAction) { + this.actions.add(buildTimeAction); + } + + public void addAction(String methodName, + Function, T> action) { + this.addAction(new BuildTimeAction(methodName, action)); + } + + public List getActions() { + return actions; + } +} diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java index ef09c40759eda..2d8a36de79d9c 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java @@ -45,9 +45,11 @@ public void shutdownTask(ShutdownContext shutdownContext, String devUIBasePath) } public void createJsonRpcRouter(BeanContainer beanContainer, - Map> extensionMethodsMap) { + Map> extensionMethodsMap, + List deploymentMethods) { JsonRpcRouter jsonRpcRouter = beanContainer.beanInstance(JsonRpcRouter.class); - jsonRpcRouter.populateJsonRPCMethods(extensionMethodsMap); + jsonRpcRouter.populateJsonRPCRuntimeMethods(extensionMethodsMap); + jsonRpcRouter.setJsonRPCDeploymentMethods(deploymentMethods); jsonRpcRouter.initializeCodec(createJsonMapper()); } diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/comms/JsonRpcRouter.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/comms/JsonRpcRouter.java index 97713c3f2ae89..bfcb43d40313a 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/comms/JsonRpcRouter.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/comms/JsonRpcRouter.java @@ -16,6 +16,7 @@ import org.jboss.logging.Logger; import io.quarkus.arc.Arc; +import io.quarkus.dev.console.DevConsoleManager; import io.quarkus.devui.runtime.jsonrpc.JsonRpcCodec; import io.quarkus.devui.runtime.jsonrpc.JsonRpcMethod; import io.quarkus.devui.runtime.jsonrpc.JsonRpcMethodName; @@ -36,8 +37,11 @@ public class JsonRpcRouter { private final Map subscriptions = new ConcurrentHashMap<>(); - // Map json-rpc method to java - private final Map jsonRpcToJava = new HashMap<>(); + // Map json-rpc method to java in runtime classpath + private final Map jsonRpcToRuntimeClassPathJava = new HashMap<>(); + + // Map json-rpc method to java in deployment classpath + private final List jsonRpcToDeploymentClassPathJava = new ArrayList<>(); private static final List SESSIONS = Collections.synchronizedList(new ArrayList<>()); private JsonRpcCodec codec; @@ -47,7 +51,7 @@ public class JsonRpcRouter { * * @param extensionMethodsMap */ - public void populateJsonRPCMethods(Map> extensionMethodsMap) { + public void populateJsonRPCRuntimeMethods(Map> extensionMethodsMap) { for (Map.Entry> extension : extensionMethodsMap.entrySet()) { String extensionName = extension.getKey(); Map jsonRpcMethods = extension.getValue(); @@ -71,7 +75,7 @@ public void populateJsonRPCMethods(Map methodNames) { + this.jsonRpcToDeploymentClassPathJava.clear(); + this.jsonRpcToDeploymentClassPathJava.addAll(methodNames); + } + public void initializeCodec(JsonMapper jsonMapper) { this.codec = new JsonRpcCodec(jsonMapper); } @@ -147,8 +156,8 @@ private void route(JsonRpcRequest jsonRpcRequest, ServerWebSocket s) { cancellable.cancel(); } codec.writeResponse(s, jsonRpcRequest.getId(), null, MessageType.Void); - } else if (this.jsonRpcToJava.containsKey(jsonRpcMethodName)) { // Route to extension - ReflectionInfo reflectionInfo = this.jsonRpcToJava.get(jsonRpcMethodName); + } else if (this.jsonRpcToRuntimeClassPathJava.containsKey(jsonRpcMethodName)) { // Route to extension (runtime) + ReflectionInfo reflectionInfo = this.jsonRpcToRuntimeClassPathJava.get(jsonRpcMethodName); Object target = Arc.container().select(reflectionInfo.bean).get(); if (reflectionInfo.isReturningMulti()) { @@ -222,6 +231,10 @@ private void route(JsonRpcRequest jsonRpcRequest, ServerWebSocket s) { codec.writeErrorResponse(s, jsonRpcRequest.getId(), jsonRpcMethodName, actualFailure); }); } + } else if (this.jsonRpcToDeploymentClassPathJava.contains(jsonRpcMethodName)) { // Route to extension (deployment) + Object item = DevConsoleManager.invoke(jsonRpcMethodName, getArgsAsMap(jsonRpcRequest)); + codec.writeResponse(s, jsonRpcRequest.getId(), item, + MessageType.Response); } else { // Method not found codec.writeMethodNotFoundResponse(s, jsonRpcRequest.getId(), jsonRpcMethodName); @@ -239,6 +252,13 @@ private Object[] getArgsAsObjects(Map params, JsonRpcRequest json return objects.toArray(Object[]::new); } + private Map getArgsAsMap(JsonRpcRequest jsonRpcRequest) { + if (jsonRpcRequest.hasParams()) { + return (Map) jsonRpcRequest.getParams(); + } + return Map.of(); + } + private static final String DOT = "."; private static final String UNSUBSCRIBE = "unsubscribe"; diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/config/ConfigJsonRPCService.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/config/ConfigJsonRPCService.java index e9f2e00d5c825..1b87e66558b94 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/config/ConfigJsonRPCService.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/config/ConfigJsonRPCService.java @@ -1,54 +1,22 @@ package io.quarkus.devui.runtime.config; -import java.io.IOException; -import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.stream.Collectors; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.jboss.logging.Logger; - import io.quarkus.dev.console.DevConsoleManager; -import io.quarkus.devui.runtime.comms.JsonRpcMessage; -import io.quarkus.devui.runtime.comms.MessageType; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; @ApplicationScoped public class ConfigJsonRPCService { - private static final Logger LOG = Logger.getLogger(ConfigJsonRPCService.class.getName()); @Inject ConfigDescriptionBean configDescriptionBean; - public JsonRpcMessage updateProperty(String name, String value) { - DevConsoleManager.invoke("config-update-property", Map.of("name", name, "value", value)); - return new JsonRpcMessage(true, MessageType.HotReload); - } - - public boolean updateProperties(String content, String type) { - if (type.equalsIgnoreCase("properties")) { - Properties p = new Properties(); - try (StringReader sr = new StringReader(content)) { - p.load(sr); // Validate - Map m = Map.of("content", content, "type", type); - DevConsoleManager.invoke("config-set-properties", m); - return true; - } catch (IOException ex) { - LOG.error("Could not update properties", ex); - return false; - } - } - return false; - } - public JsonArray getAllConfiguration() { return new JsonArray(configDescriptionBean.getAllConfig()); } @@ -88,12 +56,4 @@ public JsonObject getProjectProperties() { } return response; } - - private Map toMap(Properties prop) { - return prop.entrySet().stream().collect( - Collectors.toMap( - e -> String.valueOf(e.getKey()), - e -> String.valueOf(e.getValue()), - (prev, next) -> next, HashMap::new)); - } } diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingJsonRPCService.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingJsonRPCService.java index 1700e58105032..9a21cd15f126c 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingJsonRPCService.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingJsonRPCService.java @@ -1,13 +1,12 @@ package io.quarkus.devui.runtime.continuoustesting; -import java.util.Map; import java.util.function.Consumer; import jakarta.enterprise.context.ApplicationScoped; import io.quarkus.dev.console.DevConsoleManager; import io.quarkus.dev.testing.ContinuousTestingSharedStateManager; -import io.quarkus.vertx.http.runtime.devmode.*; +import io.quarkus.vertx.http.runtime.devmode.Json; import io.smallrye.common.annotation.NonBlocking; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.operators.multi.processors.BroadcastProcessor; @@ -36,7 +35,7 @@ public void accept(ContinuousTestingSharedStateManager.State state) { response.put("isLiveReload", state.isLiveReload); this.lastKnownState = response.build(); stateBroadcaster.onNext(this.lastKnownState); - this.lastKnownResults = this.getResults(); + this.lastKnownResults = DevConsoleManager.invoke("devui-continuous-testing.getResults"); if (this.lastKnownResults != null) { resultBroadcaster.onNext(this.lastKnownResults); } @@ -59,53 +58,4 @@ public String lastKnownState() { public Object lastKnownResults() { return this.lastKnownResults; } - - public boolean start() { - return invokeAction("start"); - } - - @NonBlocking - public boolean stop() { - return invokeAction("stop"); - } - - @NonBlocking - public boolean runAll() { - return invokeAction("runAll"); - } - - @NonBlocking - public boolean runFailed() { - return invokeAction("runFailed"); - } - - @NonBlocking - public boolean toggleBrokenOnly() { - return invokeAction("toggleBrokenOnly"); - } - - @NonBlocking - public boolean toggleInstrumentation() { - return invokeAction("toggleInstrumentation"); - } - - public Object getResults() { - return invokeAction("getResults"); - } - - public Map getStatus() { - Map map = invokeAction("getStatus"); - return map; - } - - private T invokeAction(String action) { - try { - return DevConsoleManager.invoke(NAMESPACE + DASH + action, Map.of()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private static final String NAMESPACE = "devui-continuous-testing"; - private static final String DASH = "-"; -} \ No newline at end of file +} diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/ide/IdeJsonRPCService.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/ide/IdeJsonRPCService.java deleted file mode 100644 index 912ee4459faf9..0000000000000 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/ide/IdeJsonRPCService.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.quarkus.devui.runtime.ide; - -import java.util.Map; - -import io.quarkus.dev.console.DevConsoleManager; - -/** - * This allows opening the IDE - */ -public class IdeJsonRPCService { - private static final org.jboss.logging.Logger LOG = org.jboss.logging.Logger.getLogger(IdeJsonRPCService.class); - - public boolean open(String fileName, String lang, int lineNumber) { - if (isNullOrEmpty(fileName) || isNullOrEmpty(lang)) { - return false; - } - - DevConsoleManager.invoke("dev-ui-ide-open", Map.of( - "fileName", fileName, - "lang", lang, - "lineNumber", String.valueOf(lineNumber))); - return true; - } - - private boolean isNullOrEmpty(String arg) { - return arg == null || arg.trim().isEmpty(); - } -} diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/jsonrpc/JsonRpcRequest.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/jsonrpc/JsonRpcRequest.java index bfcaf635d57bd..3be57a1afaae4 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/jsonrpc/JsonRpcRequest.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/jsonrpc/JsonRpcRequest.java @@ -41,7 +41,7 @@ public boolean hasParams() { return this.getParams() != null; } - private Map getParams() { + public Map getParams() { JsonObject paramsObject = jsonObject.getJsonObject(PARAMS); if (paramsObject != null && paramsObject.getMap() != null && !paramsObject.getMap().isEmpty()) { return paramsObject.getMap(); diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/logstream/LogStreamJsonRPCService.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/logstream/LogStreamJsonRPCService.java index 433d03a7d75b8..7f2f7e369e76d 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/logstream/LogStreamJsonRPCService.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/logstream/LogStreamJsonRPCService.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; -import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; @@ -11,7 +10,6 @@ import org.jboss.logmanager.Logger; import io.quarkus.arc.Arc; -import io.quarkus.dev.console.DevConsoleManager; import io.smallrye.common.annotation.NonBlocking; import io.smallrye.mutiny.Multi; import io.vertx.core.json.JsonObject; @@ -27,51 +25,6 @@ public String ping() { return "pong"; } - @NonBlocking - public Map forceRestart() { - return DevConsoleManager.invoke("logstream-force-restart"); - } - - @NonBlocking - public Map rerunAllTests() { - return DevConsoleManager.invoke("logstream-rerun-all-tests"); - } - - @NonBlocking - public Map rerunFailedTests() { - return DevConsoleManager.invoke("logstream-rerun-failed-tests"); - } - - @NonBlocking - public Map toggleBrokenOnly() { - return DevConsoleManager.invoke("logstream-toggle-broken-only"); - } - - @NonBlocking - public Map printFailures() { - return DevConsoleManager.invoke("logstream-print-failures"); - } - - @NonBlocking - public Map toggleTestOutput() { - return DevConsoleManager.invoke("logstream-toggle-test-output"); - } - - @NonBlocking - public Map toggleInstrumentationReload() { - return DevConsoleManager.invoke("logstream-toggle-instrumentation-reload"); - } - - @NonBlocking - public Map pauseTests() { - return DevConsoleManager.invoke("logstream-pause-tests"); - } - - @NonBlocking - public Map toggleLiveReload() { - return DevConsoleManager.invoke("logstream-toggle-live-reload"); - } - @NonBlocking public List history() { LogStreamBroadcaster logStreamBroadcaster = Arc.container().instance(LogStreamBroadcaster.class).get();