package com.tivoli.jmx.tutorial.managedserver;

import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import java.util.TreeSet;
import java.util.SortedSet;

public static LogFile logfile;

public class Httpd {
  public static void main(java.lang.String[] args) throws Exception {
    MBeanServer mbs = MBeanServerFactory.createMBeanServer();

    SortedSet requestQueue = new TreeSet();
    HandlerPool handlers = new HandlerPool();
    Httpd.logfile = new LogFile("Httpd.log");

    ObjectName listenerObjectName = new ObjectName("tutorial:type=Listener, vendor=Tivoli");
    ObjectName handlersObjectName = new ObjectName("tutorial:type=HandlerPool");
    ObjectName requestQueueObjectName = new ObjectName("tutorial:type=RequestQueueMBean");
    ObjectName logfileObjectName = new ObjectName("tutorial:type=LogFile, name=Httpd.log");

    Object[] listenerParams = {requestQueue};
    String[] listenerSig = {"java.util.SortedSet"};
    mbs.createMBean("com.tivoli.jmx.tutorial.managedserver.Listener", 
      listenerObjectName,
      null,
      listenerParams,
      listenerSig);

    Object[] requestQueueParams = {requestQueue, new Integer(8)};
    String[] requestQueueSig = {"java.util.SortedSet", "int"};
    mbs.createMBean("com.tivoli.jmx.tutorial.managedserver.RequestQueueMBean",
      requestQueueObjectName,
      null,
      requestQueueParams,
      requestQueueSig);

    mbs.registerMBean(handlers, handlersObjectName);
    mbs.registerMBean(logfile, logfileObjectName);

    mbs.invoke(listenerObjectName, "startListening", null, null);

    while (((Boolean) mbs.getAttribute(listenerObjectName,"Listening")).booleanValue()) {
      Request r = null;
      synchronized (requestQueue) {
        while (requestQueue.isEmpty()) {
          try {
            requestQueue.wait();
          } catch (InterruptedException x) {}
        }
        r = (Request) requestQueue.first();
        requestQueue.remove(r);
      }  

      Handler h = null;
      synchronized (handlers) {
        while ((h = handlers.reserve()) == null) {
          try {
            handlers.wait();
          } catch (InterruptedException x) {
        }
      }
     }
     h.activate(r);
  }
}