/*
 * 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 com.addthis.hydra.mq;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

import java.util.HashSet;
import java.util.Set;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RabbitMessageConsumer extends DefaultConsumer implements MessageConsumer {

    private static Logger log = LoggerFactory.getLogger(RabbitMessageConsumer.class);

    private String exchange;
    private String[] routingKeys;
    private String queueName;
    private final Set<MessageListener> messageListeners = new HashSet<MessageListener>();

    public RabbitMessageConsumer(Channel channel, String exchange, String queueName, MessageListener messageListener, String... routingKey) {
        super(channel);
        this.exchange = exchange;
        this.queueName = queueName;
        this.routingKeys = routingKey;
        addMessageListener(messageListener);
        try {
            open();
        } catch (IOException e) {
            log.warn("[rabit.consumer] error starting consumer" + e, e);
        }

    }

    public void open() throws IOException {
        getChannel().exchangeDeclare(exchange, "direct");
        getChannel().queueDeclare(queueName, true, false, false, null);
        for (String routingKey : routingKeys) {
            getChannel().queueBind(queueName, exchange, routingKey);
        }
        getChannel().basicConsume(queueName, true, this);

    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(body));
        try {
            Serializable message = (Serializable) ois.readObject();
            if (messageListeners.size() > 0) {
                for (MessageListener messageListener : messageListeners) {
                    messageListener.onMessage(message);
                }
            }
        } catch (ClassNotFoundException e) {
            log.warn("[rabbitConsumer] error reading message", e);
            }

    }

    public boolean addMessageListener(MessageListener hostMessageListener) {
        return messageListeners.add(hostMessageListener);
    }

    public boolean removeMessageListener(MessageListener hostMessageListener) {
        return messageListeners.remove(hostMessageListener);
    }

    public void close() throws IOException {
        Channel channel = getChannel();
        if (channel != null) {
            channel.close();
        }
    }
}


@@ -1955,19 +1955,20 @@
 ueName, 
-tru
+fals
 e, false

create non-durable rabbitmq queues