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/events/LspStatusUpdate.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/events/LspStatusUpdate.java new file mode 100644 index 00000000..ba957c6a --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/events/LspStatusUpdate.java @@ -0,0 +1,22 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.events; + +public record LspStatusUpdate(Status status) { + public enum Status { + INITIALIZING("Language Server Initializing"), READY("Language Server Ready"), ERROR("Language Server Error"), + STOPPED("Language Server Stopped"); + + private final String value; + + Status(final String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + +} 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 78a6556c..03088f8a 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 @@ -12,21 +12,23 @@ import java.util.Map; import software.amazon.awssdk.utils.StringUtils; +import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate; import software.aws.toolkits.eclipse.amazonq.lsp.encryption.DefaultLspEncryptionManager; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspManager; 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 { public QLspConnectionProvider() throws IOException { super(); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.INITIALIZING)); LanguageServerTelemetryProvider.setAllStartPoint(Instant.now()); LspManager lspManager = LspManagerProvider.getInstance(); var lspInstallResult = lspManager.getLspInstallation(); @@ -67,13 +69,14 @@ public final void start() throws IOException { try { DefaultLspEncryptionManager lspEncryption = DefaultLspEncryptionManager.getInstance(); OutputStream serverStdIn = getOutputStream(); - lspEncryption.initializeEncryptedCommunication(serverStdIn); } catch (Exception e) { + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); emitInitFailure(ExceptionMetadata.scrubException(e)); Activator.getLogger().error("Error occured while initializing communication with Amazon Q Lsp Server", e); } } catch (Exception e) { + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); emitInitFailure(ExceptionMetadata.scrubException(e)); throw e; } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/DefaultLspManager.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/DefaultLspManager.java index 33fd05a5..9d4fc6c7 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/DefaultLspManager.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/DefaultLspManager.java @@ -14,6 +14,7 @@ import java.util.HashSet; import java.util.Optional; +import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate; import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.ArtifactUtils; import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.LspFetcher; @@ -21,10 +22,10 @@ import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RemoteLspFetcher; import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.VersionManifestFetcher; import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Manifest; -import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture; import software.aws.toolkits.eclipse.amazonq.plugin.Activator; import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider; import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata; +import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture; import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform; import software.aws.toolkits.eclipse.amazonq.util.PluginUtils; import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils; @@ -123,6 +124,7 @@ private boolean hasValidResult(final LspInstallResult overrideResult) { validateLsp(overrideResult); } catch (Exception e) { Activator.getLogger().error(e.getMessage(), e); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); errorMessage = ExceptionMetadata.scrubException(e); } finally { emitValidate(overrideResult, errorMessage, start); @@ -192,6 +194,7 @@ private void validateAndConfigureLsp(final LspInstallResult result) throws IOExc makeExecutable(nodeExecutable); } catch (Exception e) { errorMessage = ExceptionMetadata.scrubException(e); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); throw e; } finally { emitValidate(result, errorMessage, start); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/RemoteLspFetcher.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/RemoteLspFetcher.java index 5a02a5f5..9601a67e 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/RemoteLspFetcher.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/RemoteLspFetcher.java @@ -26,19 +26,20 @@ import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.VersionRange; +import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate; import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.exception.LspError; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspConstants; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspFetchResult; -import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.ManifestArtifactVersion; import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Content; import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Manifest; +import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.ManifestArtifactVersion; import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Target; -import software.aws.toolkits.eclipse.amazonq.util.HttpClientFactory; -import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture; import software.aws.toolkits.eclipse.amazonq.plugin.Activator; import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider; import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata; +import software.aws.toolkits.eclipse.amazonq.util.HttpClientFactory; +import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture; import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform; import software.aws.toolkits.telemetry.TelemetryDefinitions.LanguageServerLocation; import software.aws.toolkits.telemetry.TelemetryDefinitions.Result; @@ -91,6 +92,7 @@ public LspFetchResult fetch(final PluginPlatform platform, final PluginArchitect versionRange.toString(), architecture, platform); setErrorReason(LspError.NO_COMPATIBLE_LSP.toString()); emitGetServer(Result.FAILED, null, LanguageServerLocation.UNKNOWN, start); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); throw new AmazonQPluginException(failureReason); } @@ -143,10 +145,12 @@ public LspFetchResult fetch(final PluginPlatform platform, final PluginArchitect String failureReason = "Unable to find a compatible version of Amazon Q Language Server."; setErrorReason(LspError.NO_VALID_SERVER_FALLBACK.toString()); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); emitGetServer(Result.FAILED, null, LanguageServerLocation.UNKNOWN, start); throw new AmazonQPluginException(failureReason); } + @Override public void cleanup(final Path destinationFolder) { if (manifest == null || manifest.versions().isEmpty()) { return; @@ -194,6 +198,7 @@ private Optional resolveVersion(final Manifest manifest String failureReason = "No valid manifest version data was received. An error could have caused this. Please check logs."; setErrorReason(LspError.INVALID_VERSION_MANIFEST.toString()); emitGetServer(Result.FAILED, null, LanguageServerLocation.UNKNOWN, start); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); throw new AmazonQPluginException(failureReason); } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/VersionManifestFetcher.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/VersionManifestFetcher.java index fc546669..f422987f 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/VersionManifestFetcher.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/manager/fetcher/VersionManifestFetcher.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate; import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.exception.LspError; import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspConstants; @@ -94,6 +95,7 @@ public Optional fetch() { } Activator.getLogger().error("Error fetching manifest from remote location", e); emitGetManifest(null, ManifestLocation.UNKNOWN, ExceptionMetadata.scrubException(LspError.MANIFEST_FETCH_ERROR.toString(), e)); + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR)); return cachedManifest; } } 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 3462a2d4..bce74403 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/providers/LspProviderImpl.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/providers/LspProviderImpl.java @@ -10,8 +10,10 @@ import org.eclipse.lsp4j.services.LanguageServer; +import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate; import software.aws.toolkits.eclipse.amazonq.lsp.AmazonQLspServer; import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RecordLspSetupArgs; +import software.aws.toolkits.eclipse.amazonq.plugin.Activator; import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider; import software.aws.toolkits.telemetry.TelemetryDefinitions.Result; @@ -51,6 +53,7 @@ public void setAmazonQServer(final LanguageServer server) { if (future != null) { future.complete(server); } + Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.READY)); emitInitializeMetric(); } }