/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2000-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

/*
 * @(#)ConnectionUtil.java	1.12 06/28/07
 */ 

package com.sun.messaging.jmq.jmsserver.management.util;

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

import com.sun.messaging.jmq.jmsserver.Globals;
import com.sun.messaging.jmq.jmsserver.config.BrokerConfig;
import com.sun.messaging.jmq.jmsserver.config.PropertyUpdateException;
import com.sun.messaging.jmq.util.admin.MessageType;

import com.sun.messaging.jmq.util.log.Logger;
import com.sun.messaging.jmq.jmsserver.resources.BrokerResources;
import com.sun.messaging.jmq.jmsserver.service.Connection;
import com.sun.messaging.jmq.jmsserver.service.ConnectionManager;
import com.sun.messaging.jmq.jmsserver.service.ConnectionUID;
import com.sun.messaging.jmq.jmsserver.service.imq.IMQConnection;
import com.sun.messaging.jmq.util.GoodbyeReason;
import com.sun.messaging.jmq.util.admin.ConnectionInfo;

import com.sun.messaging.jmq.jmsserver.service.Service;

public class ConnectionUtil {
    /**
     * Returns a List of IMQConnection
     */
    public static List getConnections()  {
	List connections = getConnections(null);

	return (connections);
    }

    /**
     * Returns a List of IMQConnection for a given service
     */
    public static List getConnections(String service)  {
	ConnectionManager cm = Globals.getConnectionManager();
	List connections = null;

	try  {
	    Service s = null;

	    if (service != null)  {
	        s = Globals.getServiceManager().getService(service);

		/*
		 * If service object is null, service may not exist or is inactive
		 */
		if (s == null)  {
		    return (connections);
		}
	    }

	    connections = cm.getConnectionList(s);
	} catch(Exception e)  {
            BrokerResources	rb = Globals.getBrokerResources();
	    Logger logger = Globals.getLogger();

            logger.log(Logger.WARNING, 
		rb.getString(rb.W_JMX_FAILED_TO_OBTAIN_CONNECTION_LIST),
		e);
	}

	return (connections);
    }

    /**
     * Returns a List of ConnectionInfo for the given service
     * or all services if the passed service is null.
     */
    public static List getConnectionInfoList(String service)  {
	ConnectionManager cm = Globals.getConnectionManager();
	List connections, connectionInfoList = new ArrayList();
	IMQConnection  cxn;
	ConnectionInfo cxnInfo;

	try  {
	    Service s = null;

	    if (service != null)  {
	        s = Globals.getServiceManager().getService(service);

		/*
		 * If service object is null, service may not exist or is inactive
		 */
		if (s == null)  {
		    return (connectionInfoList);
		}
	    }

	    connections = cm.getConnectionList(s);
	} catch(Exception e)  {
            BrokerResources	rb = Globals.getBrokerResources();
	    Logger logger = Globals.getLogger();

            logger.log(Logger.WARNING, 
		rb.getString(rb.W_JMX_FAILED_TO_OBTAIN_CONNECTION_LIST),
		e);

	    return (connectionInfoList);
	}

	if (connections.size() == 0)  {
	    return (connectionInfoList);
	}

        Iterator iter = connections.iterator();

        while (iter.hasNext()) {
	    cxn     = (IMQConnection)iter.next();
	    cxnInfo = cxn.getConnectionInfo();

	    connectionInfoList.add(cxnInfo);
        }

	return (connectionInfoList);
    }

    /**
     * Returns the ConnectionInfo for the passed connection ID.
     */
    public static ConnectionInfo getConnectionInfo(long id)  {
	ConnectionManager cm = Globals.getConnectionManager();
	ConnectionInfo cxnInfo = null;
	IMQConnection  cxn = null;

	cxn = (IMQConnection)cm.getConnection(new ConnectionUID(id));

	if (cxn == null)  {
	    return (null);
	}

	cxnInfo = cxn.getConnectionInfo();

	return (cxnInfo);
    }

    public static String getServiceOfConnection(long id)  {
	ConnectionInfo cxnInfo = getConnectionInfo(id);

	if (cxnInfo == null)  {
	    return (null);
	}

	return(cxnInfo.service);
    }

    public static Long getCreationTime(long cxnId)  {
	long currentTime = System.currentTimeMillis();
	ConnectionUID cxnUID = new ConnectionUID(cxnId);

	return (new Long(currentTime - cxnUID.age(currentTime)));
    }


    public static List getConsumerIDs(long cxnId)  {
	ConnectionManager	cm = Globals.getConnectionManager();
	ConnectionInfo		cxnInfo = null;
	IMQConnection		cxn = null;
	List			consumerIDs;

	cxn = (IMQConnection)cm.getConnection(new ConnectionUID(cxnId));
	consumerIDs = cxn.getConsumersIDs();

	return (consumerIDs);
    }

    public static List getProducerIDs(long cxnId)  {
	ConnectionManager	cm = Globals.getConnectionManager();
	ConnectionInfo		cxnInfo = null;
	IMQConnection		cxn = null;
	List			producerIDs;

	cxn = (IMQConnection)cm.getConnection(new ConnectionUID(cxnId));
	producerIDs = cxn.getProducerIDs();

	return (producerIDs);
    }

    public static void destroyConnection(long cxnId, String reasonString)  {
	ConnectionManager	cm = Globals.getConnectionManager();
	IMQConnection		cxn = null;

	cxn = (IMQConnection)cm.getConnection(new ConnectionUID(cxnId));

	if (cxn != null)  {
	    cxn.destroyConnection(true, GoodbyeReason.ADMIN_KILLED_CON,
				    reasonString);
	}
    }

    public static void destroyConnection(String serviceName, String reasonString)  {
	List			cxnList = getConnections(serviceName);
	IMQConnection		cxn = null;

	/*
	 * Return if no connections to destroy
	 */
	if ((cxnList == null) || (cxnList.size() == 0))  {
	    return;
	}

        Iterator iter = cxnList.iterator();

        while (iter.hasNext()) {
	    cxn     = (IMQConnection)iter.next();

	    if (cxn != null)  {
	        cxn.destroyConnection(true, GoodbyeReason.ADMIN_KILLED_CON,
				    reasonString);
	    }
        }
    }
}
