Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.logstream/src/org/osgi/util/pushstream/SimplePushEventSource.java')
-rw-r--r--bundles/org.eclipse.equinox.logstream/src/org/osgi/util/pushstream/SimplePushEventSource.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.logstream/src/org/osgi/util/pushstream/SimplePushEventSource.java b/bundles/org.eclipse.equinox.logstream/src/org/osgi/util/pushstream/SimplePushEventSource.java
new file mode 100644
index 000000000..747b4530d
--- /dev/null
+++ b/bundles/org.eclipse.equinox.logstream/src/org/osgi/util/pushstream/SimplePushEventSource.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) OSGi Alliance (2015, 2016). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.osgi.util.pushstream;
+
+import org.osgi.annotation.versioning.ProviderType;
+import org.osgi.util.promise.Promise;
+
+/**
+ * A {@link SimplePushEventSource} is a helper that makes it simpler to write a
+ * {@link PushEventSource}. Users do not need to manage multiple registrations
+ * to the stream, nor do they have to be concerned with back pressure.
+ *
+ * @param <T> The type of the events produced by this source
+ */
+@ProviderType
+public interface SimplePushEventSource<T>
+ extends PushEventSource<T>, AutoCloseable {
+ /**
+ * Close this source. Calling this method indicates that there will never be
+ * any more events published by it. Calling this method sends a close event
+ * to all connected consumers. After calling this method any
+ * {@link PushEventConsumer} that tries to {@link #open(PushEventConsumer)}
+ * this source will immediately receive a close event.
+ */
+ @Override
+ void close();
+
+ /**
+ * Asynchronously publish an event to this stream and all connected
+ * {@link PushEventConsumer} instances. When this method returns there is no
+ * guarantee that all consumers have been notified. Events published by a
+ * single thread will maintain their relative ordering, however they may be
+ * interleaved with events from other threads.
+ *
+ * @param t
+ * @throws IllegalStateException if the source is closed
+ */
+ void publish(T t);
+
+ /**
+ * Close this source for now, but potentially reopen it later. Calling this
+ * method asynchronously sends a close event to all connected consumers.
+ * After calling this method any {@link PushEventConsumer} that wishes may
+ * {@link #open(PushEventConsumer)} this source, and will receive subsequent
+ * events.
+ */
+ void endOfStream();
+
+ /**
+ * Close this source for now, but potentially reopen it later. Calling this
+ * method asynchronously sends an error event to all connected consumers.
+ * After calling this method any {@link PushEventConsumer} that wishes may
+ * {@link #open(PushEventConsumer)} this source, and will receive subsequent
+ * events.
+ *
+ * @param e the error
+ */
+ void error(Exception e);
+
+ /**
+ * Determine whether there are any {@link PushEventConsumer}s for this
+ * {@link PushEventSource}. This can be used to skip expensive event
+ * creation logic when there are no listeners.
+ *
+ * @return true if any consumers are currently connected
+ */
+ boolean isConnected();
+
+ /**
+ * This method can be used to delay event generation until an event source
+ * has connected. The returned promise will resolve as soon as one or more
+ * {@link PushEventConsumer} instances have opened the
+ * SimplePushEventSource.
+ * <p>
+ * The returned promise may already be resolved if this
+ * {@link SimplePushEventSource} already has connected consumers. If the
+ * {@link SimplePushEventSource} is closed before the returned Promise
+ * resolves then it will be failed with an {@link IllegalStateException}.
+ * <p>
+ * Note that the connected consumers are able to asynchronously close their
+ * connections to this {@link SimplePushEventSource}, and therefore it is
+ * possible that once the promise resolves this
+ * {@link SimplePushEventSource} may no longer be connected to any
+ * consumers.
+ *
+ * @return A promise representing the connection state of this EventSource
+ */
+ Promise<Void> connectPromise();
+
+}

Back to the top