/*
* class: ChainableRecordListener
*
* Version $Id: ChainableRecordAdapter.java 8584 2006-08-10 23:06:37Z duns $
*
* Date: February 19 2003
*
* (c) 2003 LBNL
*/
package org.freehep.record.loop.event;
import java.util.TooManyListenersException;
/**
This class implements the <code>ChainableRecordListener</code> interface
so that the methods of another <code>RecordListener</code> object are
correctly executed in succession to its own processing, thus creating a
chain of listeners. To function correctly any standard
<code>RecordListener</code> event method which is overridden should, as
its last step, call this classes implementation of that method. For
example:
<pre>
public void recordSupplied(RecordSuppliedEvent event)
{
// Do this objects processing here.
super.recordSupplied(event);
}
</pre>
*
* @version $Id: ChainableRecordAdapter.java 8584 2006-08-10 23:06:37Z duns $
* @author patton
*/
class ChainableRecordAdapter
implements ChainableRecordListener
{
// public static final member data
// protected static final member data
// static final member data
// private static final member data
/** Listener to use if no other has been added. */
private static final RecordListener NULL_LISTENER =
new RecordAdapter();
// private static member data
// private instance member data
/** The RecordListener which should be called after this object. */
private RecordListener listener = NULL_LISTENER;
/** True if the listener has not yet been supplied with a record. */
private boolean newListener;
/** Standard RecordEvent for this object to send out. */
private final RecordEvent recordEvent;
// constructors
/**
* Create an instance of this class.
*/
protected ChainableRecordAdapter()
{
recordEvent = new RecordEvent(this);
}
// instance member function (alphabetic)
public void addRecordListener(RecordListener listener)
throws TooManyListenersException
{
if (NULL_LISTENER != this.listener) {
throw new TooManyListenersException("An RecordListener is" +
" already registered with this ChainableRecordListener");
}
if (null == listener) {
listener = NULL_LISTENER;
} else {
this.listener = listener;
}
newListener = true;
}
public void configure(ConfigurationEvent event)
{
listener.configure(event);
newListener = false;
}
public void finish(RecordEvent event)
{
listener.finish(event);
}
/**
* Returns the RecordListener which is executed after this object. null
* is returned if no listener succeeds this object
* listener.
*
* @return the RecordListener which succeeds this object.
*/
public RecordListener getRecordListener()
{
if (NULL_LISTENER == listener) {
return null;
}
return listener;
}
public void recordSupplied(RecordSuppliedEvent event)
{
listener.recordSupplied(event);
}
public void reconfigure(ConfigurationEvent event)
{
if (newListener) {
listener.configure(event);
newListener = false;
} else {
listener.reconfigure(event);
}
}
public void removeRecordListener(RecordListener listener)
{
if (this.listener == listener) {
if (!newListener) {
listener.finish(recordEvent);
}
this.listener = NULL_LISTENER;
}
}
/**
* Tells this object to prepare for a new set of {@link #recordSupplied}
* calls using the its existing configuration.
*
* @param event the RecordEvent for this event.
* @throws IllegalStateException if the listener is new and has not been
* handed at least one record already.
*/
public void resume(RecordEvent event)
{
if (newListener) {
throw new IllegalStateException("Chained Listener was changed" +
" but SequentialRecordLoop configuration was not reset");
}
listener.resume(event);
}
public void suspend(RecordEvent event)
{
listener.suspend(event);
}
// static member functions (alphabetic)
// Description of this object.
// public String toString() {}
// public static void main(String args[]) {}
}