All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.safehaus.jettyjam.utils.ConnectorBuilder Maven / Gradle / Ivy

package org.safehaus.jettyjam.utils;


import java.lang.reflect.Field;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.SecureRequestCustomizer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.util.ssl.SslContextFactory;

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


/**
 * Builds Jetty connectors from configuration annotations.
 */
public class ConnectorBuilder {
    public static final Logger LOG = LoggerFactory.getLogger( ConnectorBuilder.class );


    public static ServerConnector setConnectors( Field jettyResource, Server server ) {

        if ( jettyResource == null ) {
            LOG.warn( "Null field provided ... setting up default connector." );
            ServerConnector connector = new ServerConnector( server );
            connector.setPort( 0 );
            server.setConnectors( new ServerConnector[] { connector } );
            return connector;
        }

        JettyConnectors connectorsAnnotation = jettyResource.getAnnotation( JettyConnectors.class );
        if ( connectorsAnnotation == null ) {
            LOG.warn( "There's no JettyConnectors annotation on JettyResource field of testClass {}" +
                    " - using default http connection", jettyResource.getDeclaringClass() );
            ServerConnector connector = new ServerConnector( server );
            connector.setPort( 0 );
            server.setConnectors( new ServerConnector[] { connector } );
            return connector;
        }

        return setConnectors( new ArrayList(), connectorsAnnotation, server );
    }


    public static ServerConnector setConnectors( String subClass, Server server ) {
        Class launcherClass;

        try {
            //noinspection unchecked
            launcherClass = ( Class ) Class.forName( subClass );
        }
        catch ( ClassNotFoundException e ) {
            throw new RuntimeException( e );
        }

        if ( ! launcherClass.isAnnotationPresent( JettyConnectors.class ) ) {
            LOG.warn( "No connector configuration defined for launchers. " +
                    "Defaulting to an HTTP connector based on an available port." );

            ServerConnector connector = new ServerConnector( server );
            connector.setPort( 0 );
            server.setConnectors( new ServerConnector[] { connector } );
            return connector;
        }

        JettyConnectors connectorsAnnotation = launcherClass.getAnnotation( JettyConnectors.class );
        return setConnectors( new ArrayList(), connectorsAnnotation, server );
    }


    static ServerConnector setConnectors( List connectors,
                                          JettyConnectors connectorsAnnotation, Server server ) {
        ServerConnector defaultConnector = null;

        for ( HttpConnector connectorAnnotation : connectorsAnnotation.httpConnectors() ) {
            ServerConnector connector = new ServerConnector( server );
            connector.setPort( connectorAnnotation.port() );
            connectors.add( connector );

            if ( connectorAnnotation.id().equalsIgnoreCase( connectorsAnnotation.defaultId() ) ) {
                defaultConnector = connector;
            }
        }

        for ( HttpsConnector connectorAnnotation : connectorsAnnotation.httpsConnectors() ) {
            HttpConfiguration https = new HttpConfiguration();
            https.addCustomizer( new SecureRequestCustomizer() );

            SslContextFactory sslContextFactory = new SslContextFactory();

            ClassLoader cl = Thread.currentThread().getContextClassLoader();
            URL ksPathUrl = cl.getResource( connectorAnnotation.keyStore() );
            String ksPath = ksPathUrl.toExternalForm();

            sslContextFactory.setKeyStorePath( ksPath );
            sslContextFactory.setKeyStorePassword( "123456" );
            sslContextFactory.setKeyManagerPassword( "123456" );

            ServerConnector sslConnector = new ServerConnector( server,
                    new SslConnectionFactory( sslContextFactory, "http/1.1" ),
                    new HttpConnectionFactory( https ) );
            sslConnector.setPort( connectorAnnotation.port() );
            connectors.add( sslConnector );

            if ( connectorAnnotation.id().equalsIgnoreCase( connectorsAnnotation.defaultId() ) ) {
                defaultConnector = sslConnector;
            }
        }

        // add a default http based connector if none has been defined
        if ( connectors.size() == 0 ) {
            ServerConnector connector = new ServerConnector( server );
            connector.setPort( 0 );
            connectors.add( connector );
            defaultConnector = connector;
        }

        ServerConnector[] connectorsArray = new ServerConnector[connectors.size()];
        server.setConnectors( connectors.toArray( connectorsArray ) );

        if ( defaultConnector == null ) {
            throw new RuntimeException( "The default connector id " + connectorsAnnotation.defaultId()
                    + " did not match a connector." );
        }

        return defaultConnector;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy