diff --git a/plugin/META-INF/MANIFEST.MF b/plugin/META-INF/MANIFEST.MF index d403e8a3..3c2e5736 100644 --- a/plugin/META-INF/MANIFEST.MF +++ b/plugin/META-INF/MANIFEST.MF @@ -59,6 +59,7 @@ Bundle-Classpath: target/classes/, target/dependency/regions-2.28.26.jar, target/dependency/retries-2.28.26.jar, target/dependency/retries-spi-2.28.26.jar, + target/dependency/rxjava-1.3.8.jar, target/dependency/sdk-core-2.28.26.jar, target/dependency/third-party-jackson-core-2.28.26.jar, target/dependency/utils-2.28.26.jar diff --git a/plugin/pom.xml b/plugin/pom.xml index 16f296c7..bc641592 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -71,6 +71,11 @@ cognitoidentity ${aws.java.sdk.version} + + io.reactivex + rxjava + 1.3.8 + software.amazon.awssdk auth @@ -134,7 +139,7 @@ ${project.build.directory}/dependency - software.amazon.awssdk,com.fasterxml.jackson,com.nimbusds,jakarta.inject,commons-codec,org.apache.httpcomponents,org.reactivestreams + io.reactivex,software.amazon.awssdk,com.fasterxml.jackson,com.nimbusds,jakarta.inject,commons-codec,org.apache.httpcomponents,org.reactivestreams diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java new file mode 100644 index 00000000..d0d4fa45 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java @@ -0,0 +1,35 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.broker; + +import rx.Observable; +import rx.Observer; +import rx.subjects.PublishSubject; + +public final class EventBroker { + + private static final EventBroker INSTANCE; + private final PublishSubject eventBus = PublishSubject.create(); + + static { + INSTANCE = new EventBroker(); + } + + public static EventBroker getInstance() { + return INSTANCE; + } + + public void postEvent(final Object event) { + eventBus.onNext(event); + } + + public void subscribe(final Class eventType, final Observer observer) { + eventBus.ofType(eventType).subscribe(observer); + } + + public Observable ofObservable(final Class eventType) { + return eventBus.ofType(eventType); + } + +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/events/TestEvent.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/events/TestEvent.java new file mode 100644 index 00000000..3f29daac --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/events/TestEvent.java @@ -0,0 +1,18 @@ +// 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 final class TestEvent { + + private final String message; + + public TestEvent(final String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/publishers/TestPublisher.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/publishers/TestPublisher.java new file mode 100644 index 00000000..989bbed0 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/publishers/TestPublisher.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.publishers; + +import software.aws.toolkits.eclipse.amazonq.broker.EventBroker; +import software.aws.toolkits.eclipse.amazonq.events.TestEvent; + +public final class TestPublisher { + + private final EventBroker eventBroker; + + public TestPublisher() { + eventBroker = EventBroker.getInstance(); + + for (int i = 0; i < 10; i++) { + String message = "Test message " + i; + eventBroker.postEvent(new TestEvent(message)); + } + } + +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/subscribers/TestSubscribers.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/subscribers/TestSubscribers.java new file mode 100644 index 00000000..ad7a4e57 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/subscribers/TestSubscribers.java @@ -0,0 +1,48 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.subscribers; + +import rx.Observer; +import software.aws.toolkits.eclipse.amazonq.broker.EventBroker; +import software.aws.toolkits.eclipse.amazonq.events.TestEvent; + +public final class TestSubscribers { + + public TestSubscribers() { + fromObserver(); + fromObservable(); + } + + public void fromObserver() { + Observer observer = new Observer<>() { + @Override + public void onNext(final TestEvent event) { + System.out.println(event.getMessage()); + } + + @Override + public void onError(final Throwable error) { + System.out.println(error.getMessage()); + } + + @Override + public void onCompleted() { + System.out.println("Completed"); + } + }; + + // Direct subscription + EventBroker.getInstance().subscribe(TestEvent.class, observer); + + // Subscribe using observable + EventBroker.getInstance().ofObservable(TestEvent.class).subscribe(observer); + } + + public void fromObservable() { + EventBroker.getInstance().ofObservable(TestEvent.class).subscribe( + event -> System.out.println(event.getMessage()), + throwable -> System.out.println(throwable.getMessage()), () -> System.out.println("Complete")); + } + +} 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 0fe1fe9f..12bb2e7d 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import rx.observers.TestSubscriber; import software.aws.toolkits.eclipse.amazonq.chat.ChatCommunicationManager; import software.aws.toolkits.eclipse.amazonq.chat.ChatStateManager; import software.aws.toolkits.eclipse.amazonq.chat.ChatTheme; @@ -24,6 +25,7 @@ import software.aws.toolkits.eclipse.amazonq.lsp.model.QuickActions; import software.aws.toolkits.eclipse.amazonq.lsp.model.QuickActionsCommandGroup; import software.aws.toolkits.eclipse.amazonq.plugin.Activator; +import software.aws.toolkits.eclipse.amazonq.publishers.TestPublisher; import software.aws.toolkits.eclipse.amazonq.util.ObjectMapperFactory; import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils; import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQCommonActions; @@ -40,6 +42,7 @@ public class AmazonQChatWebview extends AmazonQView implements ChatUiRequestList private final ChatTheme chatTheme; private Browser browser; private volatile boolean canDisposeState = false; + private final TestSubscriber testSubscriber; public AmazonQChatWebview() { super(); @@ -48,6 +51,7 @@ public AmazonQChatWebview() { this.chatCommunicationManager = ChatCommunicationManager.getInstance(); this.actionHandler = new AmazonQChatViewActionHandler(chatCommunicationManager); this.chatTheme = new ChatTheme(); + testSubscriber = new TestSubscriber(); } @Override @@ -117,6 +121,8 @@ public void completed(final ProgressEvent event) { // Check if user is authenticated and build view accordingly onAuthStatusChanged(authState); + + new TestPublisher(); } private Browser getAndUpdateStateManager() { diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java index d154c9d7..79cbbbc3 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java @@ -9,7 +9,10 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.ui.part.ViewPart; +import rx.Observer; +import software.aws.toolkits.eclipse.amazonq.broker.EventBroker; import software.aws.toolkits.eclipse.amazonq.controllers.AmazonQViewController; +import software.aws.toolkits.eclipse.amazonq.events.TestEvent; import software.aws.toolkits.eclipse.amazonq.lsp.auth.AuthStatusChangedListener; import software.aws.toolkits.eclipse.amazonq.lsp.auth.AuthStatusProvider; import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthState; @@ -17,7 +20,8 @@ import software.aws.toolkits.eclipse.amazonq.util.ThemeDetector; import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQCommonActions; -public abstract class AmazonQView extends ViewPart implements AuthStatusChangedListener { +public abstract class AmazonQView extends ViewPart implements AuthStatusChangedListener, + Observer { private AmazonQViewController viewController; private AmazonQCommonActions amazonQCommonActions; @@ -25,6 +29,7 @@ public abstract class AmazonQView extends ViewPart implements AuthStatusChangedL protected AmazonQView() { this.viewController = new AmazonQViewController(); + EventBroker.getInstance().subscribe(TestEvent.class, this); } public final Browser getBrowser() { @@ -127,4 +132,19 @@ public void dispose() { super.dispose(); } + @Override + public final void onNext(final TestEvent event) { + System.out.println(event.getMessage()); + } + + @Override + public final void onError(final Throwable throwable) { + System.out.println(throwable.getMessage()); + } + + @Override + public final void onCompleted() { + System.out.println("Completed"); + } + }