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 000000000..11f82615a --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/broker/EventBroker.java @@ -0,0 +1,39 @@ +// 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 java.lang.reflect.ParameterizedType; + +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); + } + + @SuppressWarnings("unchecked") + public void subscribe(final Observer observer) { + eventBus.ofType((Class) ((ParameterizedType) observer.getClass() + .getGenericInterfaces()[0]).getActualTypeArguments()[0]).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 000000000..3f29daac3 --- /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 000000000..989bbed0d --- /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 000000000..e1597ae6a --- /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(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/AmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java index d154c9d7e..832836127 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(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"); + } + }