/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
package org.apache.qpid.management.wsdm;

import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.NotificationBroadcasterSupport;
import javax.management.ObjectName;

import org.apache.qpid.management.Names;
import org.apache.qpid.management.domain.handler.impl.QpidDomainObject;
import org.apache.qpid.management.domain.handler.impl.QpidDomainObjectMBean;
import org.apache.qpid.management.jmx.EntityLifecycleNotification;

/**
 * QEmu is basically an instance creator that is installed separately 
 * as part of QMan test cases & examples.
 * Reason for that is to emulate object creation (queues, exchanges, etc...) 
 * without having Qpid broker connected and therefore controlling the 
 * total number of the instances that are created.
 * 
 * @author Andrea Gazzarini
 */
public class QEmu extends NotificationBroadcasterSupport implements QEmuMBean, MBeanRegistration{
	 
	private MBeanServer _mxServer;
	private final static String PACKAGE_NAME= "org.apache.qpid";
	private final static String QUEUE = "queue";
	
	/**
	 * Unregisters a Queue MBean with MBeanServer.
	 * 
	 * @param objectName the name of the MBean that must unregistered.
	 * @throws Exception when the creation or the registration fails.
	 */
	public void unregister(ObjectName objectName) throws Exception 
	{
		_mxServer.unregisterMBean(objectName);
		
		sendNotification(
				EntityLifecycleNotification.INSTANCE_REMOVED_NOTIFICATION_TYPE,
				objectName);
	}

	/**
	 * Creates and registers a Queue MBean with MBeanServer.
	 * 
	 * @param objectName the name of the queue MBean.
	 * @throws Exception when the creation or the registration fails.
	 */
	public void createQueue(ObjectName objectName) throws Exception 
	{
		QpidDomainObjectMBean queue = new QpidDomainObject();
		_mxServer.registerMBean(queue, objectName);
		
		sendNotification(
				EntityLifecycleNotification.INSTANCE_ADDED_NOTIFICATION_TYPE,
				objectName);
	}

	/**
	 * Sends a notification about a lifecycle event of the mbean associated 
	 * with the given object.
	 * 
	 * @param type the event (notification) type.
	 * @param name the name of the event source.
	 */
	private void sendNotification(String type,ObjectName name)
	{
		sendNotification(
				new EntityLifecycleNotification(
						type,
						PACKAGE_NAME, 
						QUEUE, 
						Names.CLASS,
						name));
	}
	
	/**
	 * Not implemented for this class.
	 */
	public void postDeregister()
	{
		// N.A.
	}

	/**
	 * Not implemented for this class.
	 */
	public void postRegister(Boolean registrationDone)
	{
		// N.A.
	}

	/**
	 * Not implemented for this class.
	 */
	public void preDeregister()
	{
		// N.A.
	}

	/**
	 * MBean server callback.
	 * Stores the value of the owner MBeanServer.
	 */
	public ObjectName preRegister(MBeanServer server, ObjectName name) 
	{
		this._mxServer = server;
		return name;
	}
}