/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed 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.onosproject.rabbitmq.impl;

import java.util.Map;
import java.util.concurrent.BlockingQueue;

import org.onosproject.rabbitmq.api.MQTransport;
import org.onosproject.rabbitmq.api.Manageable;

import static org.onosproject.rabbitmq.api.MQConstants.*;

/**
 * Provides handle to call MQSender for message delivery.
 */
public class MQTransportImpl implements MQTransport {

    @Override
    public Manageable registerProducer(BrokerHost host,
                                       Map<String, String> channelConf,
                                       BlockingQueue<MessageContext> queue) {
        String exchangeName = channelConf.get(EXCHANGE_NAME_PROPERTY);
        String routingKey = channelConf.get(ROUTING_KEY_PROPERTY);
        String queueName =  channelConf.get(QUEUE_NAME_PROPERTY);
        return new MQSender(queue, exchangeName, routingKey, queueName,
                            host.getUrl());
    }

}
