From 374e549a692005f03c2c79ef6349e9564e467d5b Mon Sep 17 00:00:00 2001 From: Ishan Taldekar Date: Mon, 27 Jan 2025 17:58:09 -0500 Subject: [PATCH] Integrate Event Broker in LspStatusManager --- plugin/META-INF/MANIFEST.MF | 2 +- .../AbstractQChatEditorActionsHandler.java | 2 +- .../handlers/QOpenLoginViewHandler.java | 3 +- .../connection/QLspConnectionProvider.java | 10 ++-- .../amazonq/lsp/manager/LspStatusManager.java | 29 +++++++++--- .../amazonq/providers/LspProviderImpl.java | 2 +- .../amazonq/views/AmazonQChatWebview.java | 2 +- .../amazonq/views/LspStartUpFailedView.java | 2 +- .../QLspConnectionProviderTest.java | 47 ++++++++++--------- 9 files changed, 59 insertions(+), 40 deletions(-) diff --git a/plugin/META-INF/MANIFEST.MF b/plugin/META-INF/MANIFEST.MF index bb80724d..47a22e50 100644 --- a/plugin/META-INF/MANIFEST.MF +++ b/plugin/META-INF/MANIFEST.MF @@ -28,7 +28,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.31.0", org.apache.commons.logging;bundle-version="1.2.0", slf4j.api;bundle-version="2.0.13", org.apache.commons.lang3;bundle-version="3.14.0" -Bundle-Classpath: target/classes/, +Bundle-Classpath: ., target/dependency/annotations-2.28.26.jar, target/dependency/apache-client-2.28.26.jar, target/dependency/auth-2.28.26.jar, diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/AbstractQChatEditorActionsHandler.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/AbstractQChatEditorActionsHandler.java index 7e4f3a62..af363a4f 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/AbstractQChatEditorActionsHandler.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/AbstractQChatEditorActionsHandler.java @@ -28,7 +28,7 @@ public abstract class AbstractQChatEditorActionsHandler extends AbstractHandler @Override public final boolean isEnabled() { try { - return Activator.getLoginService().getAuthState().isLoggedIn() && !LspStatusManager.lspFailed(); + return Activator.getLoginService().getAuthState().isLoggedIn() && !LspStatusManager.getInstance().lspFailed(); } catch (Exception e) { return false; } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/QOpenLoginViewHandler.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/QOpenLoginViewHandler.java index 69c4e4ad..d2741a31 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/QOpenLoginViewHandler.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/handlers/QOpenLoginViewHandler.java @@ -7,13 +7,12 @@ import org.eclipse.core.commands.ExecutionEvent; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspStatusManager; - import software.aws.toolkits.eclipse.amazonq.views.ViewVisibilityManager; public class QOpenLoginViewHandler extends AbstractHandler { @Override public final Object execute(final ExecutionEvent event) { - if (LspStatusManager.lspFailed()) { + if (LspStatusManager.getInstance().lspFailed()) { ViewVisibilityManager.showLspStartUpFailedView("statusBar"); } else { ViewVisibilityManager.showDefaultView("statusBar"); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProvider.java index 2c924c0e..9dbedf3b 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProvider.java @@ -16,13 +16,13 @@ import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspManager; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspStatusManager; import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RecordLspSetupArgs; +import software.aws.toolkits.eclipse.amazonq.plugin.Activator; +import software.aws.toolkits.eclipse.amazonq.preferences.AmazonQPreferencePage; import software.aws.toolkits.eclipse.amazonq.providers.LspManagerProvider; import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider; import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata; import software.aws.toolkits.eclipse.amazonq.util.ProxyUtil; import software.aws.toolkits.telemetry.TelemetryDefinitions.Result; -import software.aws.toolkits.eclipse.amazonq.plugin.Activator; -import software.aws.toolkits.eclipse.amazonq.preferences.AmazonQPreferencePage; public class QLspConnectionProvider extends AbstractLspConnectionProvider { @@ -43,7 +43,7 @@ public QLspConnectionProvider() throws IOException { commands.add("--set-credentials-encryption-key"); setCommands(commands); } catch (Exception e) { - LspStatusManager.setToFailed(); + LspStatusManager.getInstance().setToFailed(); throw(e); } @@ -77,12 +77,12 @@ public final void start() throws IOException { lspEncryption.initializeEncryptedCommunication(serverStdIn); } catch (Exception e) { - LspStatusManager.setToFailed(); + LspStatusManager.getInstance().setToFailed(); emitInitFailure(ExceptionMetadata.scrubException(e)); Activator.getLogger().error("Error occured while initializing communication with Amazon Q Lsp Server", e); } } catch (Exception e) { - LspStatusManager.setToFailed(); + LspStatusManager.getInstance().setToFailed(); emitInitFailure(ExceptionMetadata.scrubException(e)); throw e; } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/LspStatusManager.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/LspStatusManager.java index 28d5872f..fa8c6c80 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/LspStatusManager.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/LspStatusManager.java @@ -3,30 +3,47 @@ package software.aws.toolkits.eclipse.amazonq.lsp.manager; +import software.aws.toolkits.eclipse.amazonq.plugin.Activator; import software.aws.toolkits.eclipse.amazonq.views.ViewVisibilityManager; public final class LspStatusManager { + private static final LspStatusManager INSTANCE; + private LspState lspState; + + static { + INSTANCE = new LspStatusManager(); + } + private LspStatusManager() { - //prevent instantiation + lspState = LspState.PENDING; + Activator.getEventBroker().post(lspState); + } + + public static LspStatusManager getInstance() { + return INSTANCE; } - private static LspState lspState = LspState.PENDING; - public static boolean lspFailed() { + public boolean lspFailed() { return (lspState == LspState.FAILED); } - public static void setToActive() { + + public void setToActive() { lspState = LspState.ACTIVE; + Activator.getEventBroker().post(lspState); ViewVisibilityManager.showDefaultView("restart"); } - public static void setToFailed() { + + public void setToFailed() { if (lspState != LspState.FAILED) { ViewVisibilityManager.showLspStartUpFailedView("update"); lspState = LspState.FAILED; } + + Activator.getEventBroker().post(lspState); } - public static LspState getLspState() { + public LspState getLspState() { return lspState; } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/providers/LspProviderImpl.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/providers/LspProviderImpl.java index fc2d7f11..15afefa4 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/providers/LspProviderImpl.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/providers/LspProviderImpl.java @@ -53,7 +53,7 @@ public void setAmazonQServer(final LanguageServer server) { future.complete(server); } emitInitializeMetric(); - LspStatusManager.setToActive(); + LspStatusManager.getInstance().setToActive(); } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java index ff43b3d7..3e2b6642 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java @@ -142,7 +142,7 @@ public final void onEvent(final AuthState authState) { // chat view if (browser != null && !browser.isDisposed() && !chatStateManager.hasPreservedState()) { Optional content = getContent(); - if (!content.isPresent() && !LspStatusManager.lspFailed()) { + if (!content.isPresent() && !LspStatusManager.getInstance().lspFailed()) { canDisposeState = true; ViewVisibilityManager.showChatAssetMissingView("update"); } else { diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java index 05382877..db0e82b2 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java @@ -38,7 +38,7 @@ protected void showAlternateView() { @Override protected CompletableFuture isViewDisplayable() { - return CompletableFuture.completedFuture(LspStatusManager.lspFailed()); + return CompletableFuture.completedFuture(LspStatusManager.getInstance().lspFailed()); } } diff --git a/plugin/tst/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProviderTest.java b/plugin/tst/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProviderTest.java index fbada043..0ef41dd7 100644 --- a/plugin/tst/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProviderTest.java +++ b/plugin/tst/software/aws/toolkits/eclipse/amazonq/lsp/connection/QLspConnectionProviderTest.java @@ -3,6 +3,24 @@ package software.aws.toolkits.eclipse.amazonq.lsp.connection; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.verify; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -17,27 +35,9 @@ import software.aws.toolkits.eclipse.amazonq.lsp.encryption.LspEncryptionManager; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspInstallResult; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspStatusManager; - -import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import software.aws.toolkits.eclipse.amazonq.util.LoggingService; import software.aws.toolkits.eclipse.amazonq.util.ProxyUtil; -import java.io.IOException; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.verify; - public final class QLspConnectionProviderTest { @RegisterExtension @@ -54,16 +54,19 @@ public final class QLspConnectionProviderTest { @RegisterExtension private static ProxyUtilsStaticMockExtension proxyUtilsStaticMockExtension = new ProxyUtilsStaticMockExtension(); - private MockedStatic mockLspStatusManager; + private MockedStatic mockStaticLspStatusManager; + private LspStatusManager mockLspStatusManager; @BeforeEach void setupBeforeEach() { - mockLspStatusManager = mockStatic(LspStatusManager.class); + mockStaticLspStatusManager = mockStatic(LspStatusManager.class); + mockLspStatusManager = mock(LspStatusManager.class); + mockStaticLspStatusManager.when(LspStatusManager::getInstance).thenReturn(mockLspStatusManager); } @AfterEach void tearDown() { - mockLspStatusManager.close(); + mockStaticLspStatusManager.close(); } private static final class TestProcessConnectionProvider extends ProcessStreamConnectionProvider { @@ -107,7 +110,7 @@ void testConstructorInitializesCorrectly() throws IOException { "/test/dir" ); - assertTrue(((ProcessStreamConnectionProvider) testProcessConnectionProvider).equals(provider)); + assertTrue(testProcessConnectionProvider.equals(provider)); } @Test