package org.huihoo.jfox.mx;

import java.util.Properties;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;

import org.jfox.ejb.Container;
import org.jfox.ejb.ContainerImpl;
import org.jfox.ejb.plugin.Interceptor;
import org.huihoo.jfox.system.State;

/**
 * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
 */

public class ContainerMX implements ServiceMX {
  private Container container;

  public ContainerMX() {
    container = ContainerImpl.getInstance();
  }

  public String mx_getRemoteProtocol() {
    return container.getRemoteProtocol();
  }

  public void mx_setRemoteProtocol(String remoteProtocol) {
    container.setRemoteProtocol(remoteProtocol);
  }

  public String mx_getLocalProtocol() {
    return container.getLocalProtocol();
  }

  public void mx_setLocalProtocol(String localProtocol) {
    container.setLocalProtocol(localProtocol);
  }

  public void mx_addInterceptor(String interceptorClass) throws Exception {
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    Object obj = cl.loadClass(interceptorClass).newInstance();
    if(obj instanceof Interceptor){
      container.addInterceptor((Interceptor)obj);
    }
  }

  public String[] mx_listInterceptors() {
    Iterator it = container.interceptors();
    List list = new ArrayList();
    while(it.hasNext()){
      list.add(it.next().toString());
    }
    return (String[])list.toArray(new String[]{});
  }

  public String[] mx_listBulks() {
    Iterator it = container.listBulks();
    List list = new ArrayList();
    while(it.hasNext()){
      list.add(it.next().toString());
    }
    return (String[])list.toArray(new String[]{});

  }


  public void mx_start() {
    try {
      container.init();
    }
    catch(Exception e){
      throw new RuntimeException(e);
    }
  }

  public void mx_stop() {
    try {
      container.destroy();
    }
    catch(Exception e){
      throw new RuntimeException(e);
    }
  }

  public Properties getOperationDescriptions() {
    return null;
  }

  public Object getSource() {
    return container;
  }

  public String getMxDescription() {
    return "Container Management";
  }

  public State mx_getStat(){
    return container.getState();
  }

  public static void main(String[] args) {

  }
}