/*
 *
 * 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.client;

import java.net.URISyntaxException;

import javax.jms.Queue;

import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.messaging.Address;
import org.apache.qpid.url.BindingURL;

public class AMQQueue extends AMQDestination implements Queue
{

    private static final long serialVersionUID = -6683926136231720218L;

    public AMQQueue()
    {
        super();
    }

    public AMQQueue(Address address)
    {
        super(address);
    }

    public AMQQueue(String address) throws URISyntaxException
    {
        super(address);
    }

    /**
     * Create a reference to a non temporary queue using a BindingURL object.
     * Note this does not actually imply the queue exists.
     * @param binding a BindingURL object
     */
    public AMQQueue(BindingURL binding)
    {
         super(binding);
    }


    /**
     * Create a reference to a non temporary queue. Note this does not actually imply the queue exists.
     * @param name the name of the queue
     */
    public AMQQueue(String exchangeName, String name)
    {
        this(exchangeName, name, false);
    }

    public AMQQueue(String exchangeName, String routingKey, String queueName)
    {
        super(exchangeName, ExchangeDefaults.DIRECT_EXCHANGE_CLASS, routingKey, false,
              false, queueName, false);
    }

    public AMQQueue(String exchangeName, String routingKey, String queueName, String[] bindingKeys)
    {
        super(exchangeName, ExchangeDefaults.DIRECT_EXCHANGE_CLASS, routingKey, false,
              false, queueName, false, bindingKeys);
    }

    public AMQQueue(AMQConnection connection, String name)
    {
        this(connection.getDefaultQueueExchangeName(),name);
    }

    public AMQQueue(AMQConnection connection, String name, boolean temporary)
    {
        this(connection.getDefaultQueueExchangeName(), name,temporary);
    }



    /**
     * Create a queue with a specified name.
     *
     * @param name the destination name (used in the routing key)
     * @param temporary if true the broker will generate a queue name, also if true then the queue is autodeleted
     * and exclusive
     */
    public AMQQueue(String exchangeName, String name, boolean temporary)
    {
        // queue name is set to null indicating that the broker assigns a name in the case of temporary queues
        // temporary queues are typically used as response queues
        this(exchangeName, name, temporary ? null : name, temporary, temporary, !temporary);

    }

    /**
     * Create a reference to a queue. Note this does not actually imply the queue exists.
     * @param exchangeName the exchange name we want to send the message to
     * @param routingKey the routing key
     * @param queueName the queue name
     * @param exclusive true if the queue should only permit a single consumer
     * @param autoDelete true if the queue should be deleted automatically when the last consumers detaches
     */
    public AMQQueue(String exchangeName, String routingKey, String queueName, boolean exclusive, boolean autoDelete)
    {
        this(exchangeName, routingKey, queueName, exclusive, autoDelete, false);
    }

    public AMQQueue(String exchangeName, String routingKey, String queueName, boolean exclusive, boolean autoDelete, boolean durable)
    {
        this(exchangeName, routingKey, queueName, exclusive, autoDelete, durable, null);
    }

    public AMQQueue(String exchangeName, String routingKey, String queueName, boolean exclusive, boolean autoDelete, boolean durable, String[] bindingKeys)
    {
        super(exchangeName, ExchangeDefaults.DIRECT_EXCHANGE_CLASS, routingKey, exclusive,
              autoDelete, queueName, durable, bindingKeys);
    }

    public String getRoutingKey()
    {
        if (getAMQQueueName() != null && getAMQQueueName().equals(super.getRoutingKey()))
        {
            return getAMQQueueName();
        }
        else
        {
            return super.getRoutingKey();
        }
    }

    public boolean isNameRequired()
    {
        String queueName = getAMQQueueName();
        return queueName == null || "".equals(queueName);
    }

    @Override
    public boolean equals(Object o)
    {
        return super.equals(o) && o instanceof Queue;
    }
}
