Package org.qi4j.library.http

Source Code of org.qi4j.library.http.AbstractJettyMixin

/*
* Copyright (c) 2011, Paul Merlin. All Rights Reserved.
*
* 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.qi4j.library.http;

import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.management.MBeanServer;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletContextListener;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.security.SecurityHandler;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ErrorHandler;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.qi4j.api.service.ServiceReference;
import org.qi4j.functional.Iterables;
import org.qi4j.library.http.Interface.Protocol;

import static org.qi4j.library.http.JettyConfigurationHelper.addContextListeners;
import static org.qi4j.library.http.JettyConfigurationHelper.addFilters;
import static org.qi4j.library.http.JettyConfigurationHelper.addServlets;
import static org.qi4j.library.http.JettyConfigurationHelper.configureConnector;
import static org.qi4j.library.http.JettyConfigurationHelper.configureContext;
import static org.qi4j.library.http.JettyConfigurationHelper.configureHttp;
import static org.qi4j.library.http.JettyConfigurationHelper.configureServer;

public abstract class AbstractJettyMixin
    implements HttpService, JettyActivation
{

    private final String identity;

    private final Iterable<ServiceReference<ServletContextListener>> contextListeners;

    private final Iterable<ServiceReference<Servlet>> servlets;

    private final Iterable<ServiceReference<Filter>> filters;

    private final MBeanServer mBeanServer;

    private Server server;

    public AbstractJettyMixin( String identity, Server jettyServer,
                               Iterable<ServiceReference<ServletContextListener>> contextListeners,
                               Iterable<ServiceReference<Servlet>> servlets,
                               Iterable<ServiceReference<Filter>> filters,
                               MBeanServer mBeanServer )
    {
        this.identity = identity;
        this.server = jettyServer;
        this.contextListeners = Iterables.unique( contextListeners );
        this.servlets = Iterables.unique( servlets );
        this.filters = Iterables.unique( filters );
        this.mBeanServer = mBeanServer;
    }

    @Override
    public final void startJetty()
        throws Exception
    {
        // Configure Server
        configureServer( server, configuration() );

        // Set up HTTP
        HttpConfiguration httpConfig = new HttpConfiguration();
        configureHttp( httpConfig, configuration() );
        httpConfig = specializeHttp( httpConfig );

        // Set up connector
        ServerConnector connector = buildConnector( server, httpConfig );
        configureConnector( connector, configuration() );

        // Bind Connector to Server
        server.addConnector( connector );
        if( mBeanServer != null )
        {
            server.addEventListener( new MBeanContainer( mBeanServer ) );
        }

        // Prepare ServletContext
        ServletContextHandler root = new ServletContextHandler( server,
                                                                "/",
                                                                new SessionHandler(),
                                                                buildSecurityHandler(),
                                                                new ServletHandler(),
                                                                new ErrorHandler() );
        root.setDisplayName( identity );
        configureContext( root, configuration() );

        // Register ContextListeners, Servlets and Filters
        addContextListeners( root, contextListeners );
        addServlets( root, servlets );
        addFilters( root, filters );

        // Start
        server.start();
    }

    @Override
    public final void stopJetty()
        throws Exception
    {
        server.stop();
        for( Connector connector : server.getConnectors() )
        {
            connector.stop();
        }
        server = null;
    }

    @Override
    @SuppressWarnings( "ValueOfIncrementOrDecrementUsed" )
    public final Interface[] interfacesServed()
    {
        Connector[] connectors = server.getConnectors();
        Interface[] result = new Interface[ connectors.length ];
        int index = 0;
        for( Connector connector : connectors )
        {
            if( connector instanceof NetworkConnector )
            {
                NetworkConnector netConnector = (NetworkConnector) connector;
                String host = configuration().hostName().get();
                if( host == null )
                {
                    host = netConnector.getHost();
                    if( host == null ) // If serving all interfaces.
                    {
                        try
                        {
                            host = InetAddress.getLocalHost().getHostAddress();
                        }
                        catch( UnknownHostException e )
                        {
                            InternalError error = new InternalError( "UnknownHost for local interface." );
                            error.initCause( e );
                            throw error;
                        }
                    }
                }
                result[ index++] = new InterfaceImpl( host, netConnector.getPort(), servedProtocol() );
            }
        }
        return result;
    }

    protected abstract JettyConfiguration configuration();

    @SuppressWarnings( "NoopMethodInAbstractClass" )
    protected HttpConfiguration specializeHttp( HttpConfiguration httpConfig )
    {
        return httpConfig;
    }

    protected ServerConnector buildConnector( Server server, HttpConfiguration httpConfig )
    {
        return new ServerConnector( server, new HttpConnectionFactory( httpConfig ) );
    }

    protected SecurityHandler buildSecurityHandler()
    {
        return null;
    }

    protected abstract Protocol servedProtocol();

}
TOP

Related Classes of org.qi4j.library.http.AbstractJettyMixin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.