diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java index 551028f9..a58f52c0 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java @@ -29,9 +29,9 @@ public void accept(final T event) { } }; - return eventBus.ofType(eventType).distinct() + return eventBus.ofType(eventType) .observeOn(Schedulers.computation()) .subscribe(consumer); - } + } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/auth/DefaultAuthStateManager.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/auth/DefaultAuthStateManager.java index 1ae5a1d3..9f34ee44 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/auth/DefaultAuthStateManager.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/auth/DefaultAuthStateManager.java @@ -41,6 +41,7 @@ public final class DefaultAuthStateManager implements AuthStateManager { private LoginParams loginParams; // used in login's getSsoToken params private String issuerUrl; // used in AmazonQLspClientImpl.getConnectionMetadata() private String ssoTokenId; // used in logout's invalidateSsoToken params + private AuthState previousAuthState = null; public DefaultAuthStateManager(final PluginStore pluginStore) { this.authPluginStore = new AuthPluginStore(pluginStore); @@ -82,7 +83,6 @@ public void toExpired() { toLoggedOut(); return; } - updateState(AuthStateType.EXPIRED, loginType, loginParams, ssoTokenId); } @@ -119,7 +119,11 @@ private void updateState(final AuthStateType authStatusType, final LoginType log * This notification is critical for ensuring all plugin components reflect the current * authentication state. */ - Activator.getEventBroker().post(getAuthState()); + AuthState newAuthState = getAuthState(); + if (previousAuthState == null || newAuthState.authStateType() != previousAuthState.authStateType()) { + Activator.getEventBroker().post(newAuthState); + } + previousAuthState = newAuthState; } private void syncAuthStateWithPluginStore() { diff --git a/plugin/tst/software/aws/toolkits/eclipse/amazonq/broker/EventBrokerTest.java b/plugin/tst/software/aws/toolkits/eclipse/amazonq/broker/EventBrokerTest.java index 1f7b7240..2fe0995a 100644 --- a/plugin/tst/software/aws/toolkits/eclipse/amazonq/broker/EventBrokerTest.java +++ b/plugin/tst/software/aws/toolkits/eclipse/amazonq/broker/EventBrokerTest.java @@ -10,8 +10,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import java.util.Objects; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,37 +18,7 @@ public final class EventBrokerTest { - private final class TestEvent { - - private final String message; - private final int id; - - TestEvent(final String message, final int id) { - this.message = message; - this.id = id; - } - - public int getId() { - return id; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - TestEvent other = (TestEvent) obj; - return this.id == other.getId(); - } - - @Override - public int hashCode() { - return Objects.hash(id); - } - + private record TestEvent(String message, int id) { } private EventBroker eventBroker; @@ -73,24 +41,6 @@ void testEventDelivery() { subscription.dispose(); } - @Test - void testDistinctEventsOnly() { - TestEvent testEvent = new TestEvent("a message", 1); - TestEvent duplicateEvent = new TestEvent("another message", 1); - TestEvent uniqueEvent = new TestEvent("a message", 2); - - EventObserver mockObserver = mock(EventObserver.class); - - Disposable subscription = eventBroker.subscribe(TestEvent.class, mockObserver); - eventBroker.post(testEvent); - eventBroker.post(duplicateEvent); - eventBroker.post(uniqueEvent); - - verify(mockObserver, timeout(100).times(2)).onEvent(any(TestEvent.class)); - - subscription.dispose(); - } - @Test void testNullEventsIgnored() { EventObserver mockObserver = mock(EventObserver.class);