Listing 1: The SwitchBoard class in Java

package com.crosoft.iom;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import com.crosoft.iom.SwitchBoardListener;
import com.crosoft.iom.SubscriberHookup;



public class SwitchBoard
{
    private static SwitchBoard _instance = null; // singleton 
                                                 // handle
    private Hashtable          _subscriptions = new Hashtable();


    // -- singleton management ---------------------------------
    ////
    private SwitchBoard()
    {
        _instance = this;  // save the singleton handle
    }

    public static SwitchBoard instance()
    {
        if (_instance == null)
            _instance = new SwitchBoard();
        return(_instance);
    }


    // -- utilities --------------------------------------------
    ////
    protected Vector _getSubscriberHookups(String subscription)
    {
        Vector hookups = (Vector)_subscriptions.get(subscription);
        if (hookups == null)
        {
            // create a new entry for this subscription
            hookups = new Vector();
            _subscriptions.put(subscription, hookups);
        }
        return(hookups);
    }


    // -- subscription management ------------------------------
    ////
    public static SubscriberHookup 
    subscribeTo(String subscription, SwitchBoardListener listener)
    {
        SwitchBoard self = instance();
        Vector hookups = self._getSubscriberHookups(subscription);
        SubscriberHookup hookup = 
            new SubscriberHookup(subscription, listener);
        hookups.addElement(hookup);
        return(hookup);
    }

    public static void 
    unsubscribeFrom(String subscription, 
        SwitchBoardListener listener)
    {
        SwitchBoard self = instance();
        Vector hookups = self._getSubscriberHookups(subscription);
        for (Enumeration e = hookups.elements(); 
             e.hasMoreElements(); )
        {
            SubscriberHookup hookup = 
                (SubscriberHookup)e.nextElement();
            // find all the instances of a listener and remove 
            // them for this subscription
            if (hookup.getSubscriber() == listener)
                hookups.removeElement(hookup);
        }
    }

    public static void unsubscribe(SubscriberHookup hookup)
    {
        unsubscribeFrom(hookup.getSubscription(), 
            hookup.getSubscriber());
    }


    // -- notification (message deliver) -----------------------
    ////
    public static boolean notify(String subscription)
    {
        boolean delivered = false;
        SwitchBoard self = instance();
        Vector hookups = 
            (Vector)self._subscriptions.get(subscription);
        if (hookups != null)
          for (Enumeration e = hookups.elements(); 
             e.hasMoreElements(); )
        {
            ((SubscriberHookup)e.nextElement()).
                getSubscriber().deliver(subscription);
            delivered = true;
        }
        return(delivered);
    }

    public static boolean notify(String subscription, String msg)
    {
        boolean delivered = false;
        SwitchBoard self = instance();
        Vector hookups = 
            (Vector)self._subscriptions.get(subscription);
        if (hookups != null)
            for (Enumeration e = hookups.elements(); 
                 e.hasMoreElements(); )
            {
                ((SubscriberHookup)e.nextElement()).
                    getSubscriber().deliver(subscription, msg);
                delivered = true;
            }
        return(delivered);
    }

    public static boolean notify(String subscription, Object obj)
    {
        boolean delivered = false;
        SwitchBoard self = instance();
        Vector hookups = 
            (Vector)self._subscriptions.get(subscription);
        if (hookups != null)
            for (Enumeration e = hookups.elements(); 
                 e.hasMoreElements(); )
            {
                ((SubscriberHookup)e.nextElement()).
                    getSubscriber().deliver(subscription, obj);
                delivered = true;
            }
        return(delivered);
    }
}

// End of File