/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.objectweb.jtests.providers.admin;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.ObjectName;
import javax.naming.*;

import org.jboss.jmx.adaptor.rmi.RMIAdaptor;
import org.jboss.mx.util.MBeanProxy;
import org.objectweb.jtests.jms.admin.Admin;

import javax.jms.Queue;
import javax.jms.Topic;
import java.util.*;
import java.io.*;
import java.net.InetAddress;

public class JBossMQAdmin implements Admin {
  
    private String name = "JBossMQ";
    InitialContext ictx = null;
    RMIAdaptor server;

    public JBossMQAdmin() {
    try {
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
        props.setProperty("java.naming.provider.url", "localhost");
        ictx = new InitialContext (props);
        
               String serverName = System.getProperty("jbosstest.server.name");
               if (serverName == null) {
                  serverName = InetAddress.getLocalHost().getHostName();
               }
               server = (RMIAdaptor)ictx.lookup("jmx/invoker/RMIAdaptor");
               
    } catch (Exception e) {
        e.printStackTrace();
    }
    }


    public String getName() {
    return name;
    }

    public InitialContext createInitialContext() throws NamingException {
    return ictx;
    }
  
    public void createQueueConnectionFactory(String name) {
       try {
          
          String mbeanClass = "org.jboss.naming.NamingAlias";
          ObjectName objn = new ObjectName("testsuite:service=NamingAlias,fromName="+name);
          server.createMBean(mbeanClass, objn);
          server.setAttribute(objn, new Attribute("ToName", "ConnectionFactory"));
          server.setAttribute(objn, new Attribute("FromName", name));
          server.invoke(objn, "create", new Object[]{}, new String[]{});
          server.invoke(objn, "start", new Object[]{},new String[]{});
       } catch (Exception e ) {
          e.printStackTrace();
       }
    }


    public void deleteQueueConnectionFactory(String name) {
       try {
          ObjectName objn = new ObjectName("testsuite:service=NamingAlias,fromName="+name);
          if( server.isRegistered(objn) ) {
             server.invoke(objn, "stop", new Object[]{}, new String[]{});
             server.invoke(objn, "destroy", new Object[]{}, new String[]{});
             server.unregisterMBean(objn);
          }
       } catch (Exception e ) {
          e.printStackTrace();
       }
    }
    
    public void createTopicConnectionFactory(String name) {
       createQueueConnectionFactory(name);
    }
    
    public void deleteTopicConnectionFactory(String name) {
       deleteQueueConnectionFactory(name);
    }
 
    public void createQueue(String name) {
       
       try {
        ObjectName objn = new ObjectName("jboss.mq:service=DestinationManager");
        server.invoke(objn, "createQueue", new Object[]{"testsuite-"+name,name}, new String[] {String.class.getName(), String.class.getName()});
       } catch (Exception e ) {
          e.printStackTrace();
       }
    }
  
    public void createTopic(String name) {
       try {
        ObjectName objn = new ObjectName("jboss.mq:service=DestinationManager");
        server.invoke(objn, "createTopic", new Object[]{"testsuite-"+name,name}, new String[] {String.class.getName(), String.class.getName()});
       } catch (Exception e ) {
          e.printStackTrace();
       }
    }

    public void deleteQueue(String name) {
       try {
        ObjectName objn = new ObjectName("jboss.mq:service=DestinationManager");
        server.invoke(objn, "destroyQueue", new Object[]{"testsuite-"+name}, new String[] {String.class.getName()});
       } catch (Exception e ) {
          e.printStackTrace();
       }
    }
 
    public void deleteTopic(String name) {
       try {
        ObjectName objn = new ObjectName("jboss.mq:service=DestinationManager");
        server.invoke(objn, "destroyTopic", new Object[]{"testsuite-"+name}, new String[] {String.class.getName()});
       } catch (Exception e ) {
          e.printStackTrace();
       }
    }

}