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

import java.net.URI;

import javax.servlet.ServletException;

import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.transport.TransportAcceptListener;

/**
 * This servlet embeds an ActiveMQ broker inside a servlet engine which is ideal
 * for deploying ActiveMQ inside a WAR and using this servlet as a HTTP tunnel.
 * 
 * 
 */
public class HttpEmbeddedTunnelServlet extends HttpTunnelServlet {
    private static final long serialVersionUID = -3705734740251302361L;

    protected BrokerService broker;
    protected HttpTransportServer transportConnector;

    public synchronized void init() throws ServletException {
        // lets initialize the ActiveMQ broker
        try {
            if (broker == null) {
                broker = createBroker();

                // Add the servlet connector
                String url = getConnectorURL();
                HttpTransportFactory factory = new HttpTransportFactory();
                transportConnector = (HttpTransportServer) factory.doBind(new URI(url));
                broker.addConnector(transportConnector);

                String brokerURL = getServletContext().getInitParameter("org.apache.activemq.brokerURL");
                if (brokerURL != null) {
                    log("Listening for internal communication on: " + brokerURL);
                }
            }
            broker.start();
        } catch (Exception e) {
            throw new ServletException("Failed to start embedded broker: " + e, e);
        }
        // now lets register the listener
        TransportAcceptListener listener = transportConnector.getAcceptListener();
        getServletContext().setAttribute("transportChannelListener", listener);
        super.init();
    }

    /**
     * Factory method to create a new broker
     * 
     * @throws Exception
     */
    protected BrokerService createBroker() throws Exception {
        BrokerService answer = new BrokerService();
        return answer;
    }

    protected String getConnectorURL() {
        return "http://localhost/" + getServletContext().getServletContextName();
    }
}
