/**
 * AddHandlerMessageHandler is a class that adds new MessageHandler
 * subtypes to the MessageBroker.  The message must be in the following
 * format:
 * <br>
 * CONTROL.ADD_HANDLER handler-name
 * <br>
 * This source code is copyright 2005 by Patrick May.  All
 * rights reserved.
 *
 * @author Patrick May (patrick@softwarematters.org)
 * @author &copy; 2005 Patrick May.  All rights reserved.
 * @version 1
 */

package org.softwarematters.example.MessageBroker;

import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class AddHandlerMessageHandler extends MessageHandler
{
  private static Logger logger_ = Logger.getLogger(
    AddHandlerMessageHandler.class.getName());
  private static Pattern pattern_
    = Pattern.compile("CONTROL\\.ADD_HANDLER (\\S+)$");

  String handlerName_ = null;

  /**
   * The full constructor for the AddHandlerMessageHandler class.
   *
   * @param message The message to use to attempt to construct an
   *                AddHandlerMessageHandler instance.
   */
  public AddHandlerMessageHandler(String message)
    throws UnknownMessageFormatException
    {
    super(message);

    Matcher matcher = pattern_.matcher(message);
    if (matcher.matches())
      {
      handlerName_ = matcher.group(1);
      logger_.info("Parsed handler name:  " + handlerName_);
      }
    else
      throw new UnknownMessageFormatException(message);
    }


  /**
   * Handle the message.
   *
   * @param context The context in which the handler has been invoked.
   */
  public void handleMessage(MessageHandlerContext context)
    {
    try
      {
      context.messageBroker().addHandler(handlerName_);
      }
    catch (ClassNotFoundException e)
      {
      logger_.severe("Unable to add handler:  " + e.toString());
      }
    }


  /**
   * A test harness for the AddHandlerMessageHandler class.
   *
   * @param args The command line arguments passed in.
   */
  public static void main(String args[])
    {
    if (args.length == 1)
      {
      try
        {
        AddHandlerMessageHandler handler
          = new AddHandlerMessageHandler(args[0]);
        }
      catch (UnknownMessageFormatException e)
        {
        System.out.println("Bad format:  " + e.toString());
        }
      }
    else
      System.out.println(
        "usage:  java "
        + AddHandlerMessageHandler.class.getName()
        + " <handler-name>");
    }  // end AddHandlerMessageHandler::main(String[])
}  // end AddHandlerMessageHandler

