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

import javax.jms.IllegalStateException;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;

import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.util.JMSExceptionSupport;
import org.apache.camel.Consumer;
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.PollingConsumer;
import org.apache.camel.Processor;

/**
 * A JMS {@link javax.jms.MessageConsumer} which consumes message exchanges from
 * a Camel {@link Endpoint}
 * 
 * 
 */
public class CamelMessageConsumer implements MessageConsumer {
    private final CamelDestination destination;
    private final Endpoint endpoint;
    private final ActiveMQSession session;
    private final String messageSelector;
    private final boolean noLocal;
    private MessageListener messageListener;
    private Consumer consumer;
    private PollingConsumer pollingConsumer;
    private boolean closed;

    public CamelMessageConsumer(CamelDestination destination, Endpoint endpoint, ActiveMQSession session, String messageSelector, boolean noLocal) {
        this.destination = destination;
        this.endpoint = endpoint;
        this.session = session;
        this.messageSelector = messageSelector;
        this.noLocal = noLocal;
    }

    public void close() throws JMSException {
        if (!closed) {
            closed = true;
            try {
                if (consumer != null) {
                    consumer.stop();
                }
                if (pollingConsumer != null) {
                    pollingConsumer.stop();
                }
            } catch (JMSException e) {
                throw e;
            } catch (Exception e) {
                throw JMSExceptionSupport.create(e);
            }
        }
    }

    public MessageListener getMessageListener() throws JMSException {
        return messageListener;
    }

    public void setMessageListener(MessageListener messageListener) throws JMSException {
        this.messageListener = messageListener;
        if (messageListener != null && consumer == null) {
            consumer = createConsumer();
        }
    }

    public Message receive() throws JMSException {
        Exchange exchange = getPollingConsumer().receive();
        return createMessage(exchange);
    }

    public Message receive(long timeoutMillis) throws JMSException {
        Exchange exchange = getPollingConsumer().receive(timeoutMillis);
        return createMessage(exchange);
    }

    public Message receiveNoWait() throws JMSException {
        Exchange exchange = getPollingConsumer().receiveNoWait();
        return createMessage(exchange);
    }

    // Properties
    // -----------------------------------------------------------------------

    public CamelDestination getDestination() {
        return destination;
    }

    public Endpoint getEndpoint() {
        return endpoint;
    }

    public String getMessageSelector() {
        return messageSelector;
    }

    public boolean isNoLocal() {
        return noLocal;
    }

    public ActiveMQSession getSession() {
        return session;
    }

    // Implementation methods
    // -----------------------------------------------------------------------

    protected PollingConsumer getPollingConsumer() throws JMSException {
        try {
            if (pollingConsumer == null) {
                pollingConsumer = endpoint.createPollingConsumer();
                pollingConsumer.start();
            }
            return pollingConsumer;
        } catch (JMSException e) {
            throw e;
        } catch (Exception e) {
            throw JMSExceptionSupport.create(e);
        }
    }

    protected Message createMessage(Exchange exchange) throws JMSException {
        if (exchange != null) {
            Message message = destination.getBinding().makeJmsMessage(exchange, session);
            return message;
        } else {
            return null;
        }
    }

    protected Consumer createConsumer() throws JMSException {
        try {
            Consumer answer = endpoint.createConsumer(new Processor() {
                public void process(Exchange exchange) throws Exception {
                    Message message = createMessage(exchange);
                    getMessageListener().onMessage(message);
                }
            });
            answer.start();
            return answer;
        } catch (JMSException e) {
            throw e;
        } catch (Exception e) {
            throw JMSExceptionSupport.create(e);
        }
    }

    protected void checkClosed() throws javax.jms.IllegalStateException {
        if (closed) {
            throw new IllegalStateException("The producer is closed");
        }
    }
}
