net.sourceforge.hiveevents
Class ChannelImpl<T>

java.lang.Object
  extended by net.sourceforge.hiveevents.ChannelImpl<T>
All Implemented Interfaces:
Channel<T>, Consumer<T>
Direct Known Subclasses:
SyncChannelImpl

public class ChannelImpl<T>
extends java.lang.Object
implements Channel<T>

Thread-unsafe implementation of an Event Channel.

Author:
Jean-Francois Poilpret

Nested Class Summary
protected static class ChannelImpl.AbstractConsumerInfo<T>
           
protected static interface ChannelImpl.ConsumerInfo<T>
           
 
Constructor Summary
ChannelImpl(java.lang.String name, int pullConsumerPriority, java.lang.Class<T> clazz, boolean logEvents)
           
 
Method Summary
 void block()
          Temporarily block the Channel, ie any supplied event will be stored inside the Channel but not dispatched to consumers until the Channel is unblocked.
protected  ChannelImpl.ConsumerInfo<T> getConsumer(int idConsumer)
           
 java.lang.String getName()
          Get the name (unique identifier) of this Channel.
protected  void logEvent(java.lang.String message, T event)
           
 T[] pull(int idConsumer)
          Called by a registered pull-consumer to retrieve all events supplied to the Channel since the previous call to pull() (or since registration if this is the first call).
 T[] pull(int idConsumer, long timeout)
          Called by a registered pull-consumer to retrieve all events supplied to the Channel since the previous call to pull() (or since registration if this is the first call).
protected  void purgeConsumers()
           
 void push(T event)
          Called by an event supplier to trigger this Channel to notify all consumers about a new event.
protected  void registerConsumer(ChannelImpl.ConsumerInfo<T> info)
           
 int registerPullConsumer()
          Registers a pull-consumer to this Channel.
 int registerPullConsumer(Filter<T> filter)
          Registers a pull-consumer to this Channel.
 int registerPushConsumer(int priority, Consumer<T> consumer)
          Registers a push-consumer to this Channel.
 int registerPushConsumer(int priority, Filter<T> filter, Consumer<T> consumer)
          Registers a push-consumer to this Channel.
 void unblock()
          Unblocks a Channel that was blocked ie any event that was received during the blocking time is dispatched to all consumers and any new event received will be normally dispatched as well.
 void unblockPullConsumer(int idConsumer)
          Unblocks a pull consumer that is currently waiting for a timed pull call to return some events.
 void unregisterAllConsumers()
          Unregister all consumers from this Channel.
 void unregisterConsumer(int idConsumer)
          Unregister the identified consumer from this Channel.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ChannelImpl

public ChannelImpl(java.lang.String name,
                   int pullConsumerPriority,
                   java.lang.Class<T> clazz,
                   boolean logEvents)
Method Detail

getName

public java.lang.String getName()
Description copied from interface: Channel
Get the name (unique identifier) of this Channel.

Specified by:
getName in interface Channel<T>
Returns:
the name of the Channel

block

public void block()
Description copied from interface: Channel
Temporarily block the Channel, ie any supplied event will be stored inside the Channel but not dispatched to consumers until the Channel is unblocked.

If called n times, unblock() must also be called n times to unblock the Channel.

Specified by:
block in interface Channel<T>

unblock

public void unblock()
Description copied from interface: Channel
Unblocks a Channel that was blocked ie any event that was received during the blocking time is dispatched to all consumers and any new event received will be normally dispatched as well.

This method has no effect if the Channel is not currently blocked. It has no effect either if it has been called less times than block().

Specified by:
unblock in interface Channel<T>

unregisterConsumer

public void unregisterConsumer(int idConsumer)
Description copied from interface: Channel
Unregister the identified consumer from this Channel. That consumer will not be notified of any event any longer.

Specified by:
unregisterConsumer in interface Channel<T>
Parameters:
idConsumer - the unique id of the consumer to unregister. If this id does not exist, then the method does nothing.

unregisterAllConsumers

public void unregisterAllConsumers()
Description copied from interface: Channel
Unregister all consumers from this Channel.

Specified by:
unregisterAllConsumers in interface Channel<T>

registerPushConsumer

public int registerPushConsumer(int priority,
                                Consumer<T> consumer)
Description copied from interface: Channel
Registers a push-consumer to this Channel. From now on, this consumer will be notified of all events supplied to the Channel.

Normally, the Channel only keeps a weak reference to every push consumer (until it is unregistered or until it has no strong references left). However, for convenience reasons when using consumer instances which we do not want to (or cannot) keep a strong reference, consumers can implement the PersistentConsumer marker interface, for these, the Channel keeps a strong reference so that they are not garbage collected until they are explicitly unregistered.

Specified by:
registerPushConsumer in interface Channel<T>
Parameters:
priority - the priority (order) with which the new consumer should be notified of new events, the lower the sooner.
consumer - the actual instance that will be notified (push()) when events are supplied to the Channel
Returns:
the unique id of the new consumer for this Channel

registerPushConsumer

public int registerPushConsumer(int priority,
                                Filter<T> filter,
                                Consumer<T> consumer)
Description copied from interface: Channel
Registers a push-consumer to this Channel. From now on, this consumer will be notified of all events (if they are validated by the supplied Filter) supplied to the Channel.

Specified by:
registerPushConsumer in interface Channel<T>
Parameters:
priority - the priority (order) with which the new consumer should be notified of new events, the lower the sooner.
filter - a filter instance that will be called for each event received by the Channel in order to decide whether the new consumer must be notified of this event or not
consumer - the actual instance that will be notified (push()) when events are supplied to the Channel
Returns:
the unique id of the new consumer for this Channel

registerPullConsumer

public int registerPullConsumer()
Description copied from interface: Channel
Registers a pull-consumer to this Channel. From now on, this consumer will be notified of all events supplied to the Channel (provided that a thread periodically calls pull() on this Channel on behalf of that consumer).

Specified by:
registerPullConsumer in interface Channel<T>
Returns:
the unique id of the new consumer for this Channel (to be used in the invocation of pull())

registerPullConsumer

public int registerPullConsumer(Filter<T> filter)
Description copied from interface: Channel
Registers a pull-consumer to this Channel. From now on, this consumer will be notified of all events (if they are validated by the supplied Filter) supplied to the Channel (provided that a thread periodically calls pull() on this Channel on behalf of that consumer).

Specified by:
registerPullConsumer in interface Channel<T>
Parameters:
filter - a filter instance that will be called for each event received by the Channel in order to decide whether the new consumer must be notified of this event or not
Returns:
the unique id of the new consumer for this Channel (to be used in the invocation of pull())

purgeConsumers

protected void purgeConsumers()

registerConsumer

protected void registerConsumer(ChannelImpl.ConsumerInfo<T> info)

push

public void push(T event)
Description copied from interface: Channel
Called by an event supplier to trigger this Channel to notify all consumers about a new event.

Specified by:
push in interface Channel<T>
Specified by:
push in interface Consumer<T>
Parameters:
event - the event notified (can be anything)

logEvent

protected void logEvent(java.lang.String message,
                        T event)

pull

public T[] pull(int idConsumer)
Description copied from interface: Channel
Called by a registered pull-consumer to retrieve all events supplied to the Channel since the previous call to pull() (or since registration if this is the first call).

This method is blocking for the calling thread until there are events to return.

Specified by:
pull in interface Channel<T>
Parameters:
idConsumer - the unique id of the consumer that pulls data. If this id does not exist, then the method returns null.
Returns:
the list of events that have occurred since previous call (events that did not pass the filter are not part of that list).

pull

public T[] pull(int idConsumer,
                long timeout)
Description copied from interface: Channel
Called by a registered pull-consumer to retrieve all events supplied to the Channel since the previous call to pull() (or since registration if this is the first call).

This method is blocking for the calling thread until there are events to return or the specified timeout is elapsed.

Specified by:
pull in interface Channel<T>
Parameters:
idConsumer - the unique id of the consumer to unregister. If this id does not exist, then the method returns null.
timeout - maximum time (in ms) to wait for events to come; if 0, then the method returns immediately whether there are events or not.
Returns:
the list of events that have occurred since previous call (events that did not pass the filter are not part of that list).

unblockPullConsumer

public void unblockPullConsumer(int idConsumer)
Description copied from interface: Channel
Unblocks a pull consumer that is currently waiting for a timed pull call to return some events. Has no effect if the given consumer does not exist, is not a pull consumer, or is not currently waiting in a blocking pull() call.

Specified by:
unblockPullConsumer in interface Channel<T>
Parameters:
idConsumer - the unique id of the consumer to unblock.

getConsumer

protected ChannelImpl.ConsumerInfo<T> getConsumer(int idConsumer)