package grails.plugin.lightweightdeploy.connector;
import com.codahale.metrics.Clock;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jetty8.InstrumentedSelectChannelConnector;
import com.codahale.metrics.jetty8.InstrumentedSslSocketConnector;
import org.eclipse.jetty.server.AbstractConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.Set;
public class ExternalConnectorFactory extends AbstractConnectorFactory {
public static final String EXTERNAL_HTTP_CONNECTOR_NAME = "external";
public static final String EXTERNAL_HTTPS_CONNECTOR_NAME = "external-ssl";
private static final Logger logger = LoggerFactory.getLogger(ExternalConnectorFactory.class);
private MetricRegistry metricRegistry;
public ExternalConnectorFactory(HttpConfiguration configuration, MetricRegistry metricRegistry) {
super(configuration);
this.metricRegistry = metricRegistry;
}
@Override
public Set<? extends AbstractConnector> build() {
final Set<AbstractConnector> connectors = new HashSet<AbstractConnector>();
if (getConfiguration().isMixedMode()) {
connectors.add(configureExternalHttpsConnector());
connectors.add(configureExternalHttpConnector());
} else if (getConfiguration().isSsl()) {
connectors.add(configureExternalHttpsConnector());
} else {
connectors.add(configureExternalHttpConnector());
}
// apply the configured values to each connector
for (AbstractConnector connector : connectors) {
applyConfiguration(connector);
}
return connectors;
}
private AbstractConnector configureExternalHttpConnector() {
logger.info("Creating http connector");
final InstrumentedSelectChannelConnector connector = new InstrumentedSelectChannelConnector(
this.metricRegistry,
getConfiguration().getPort(),
Clock.defaultClock());
connector.setName(EXTERNAL_HTTP_CONNECTOR_NAME);
connector.setUseDirectBuffers(true);
return connector;
}
private AbstractConnector configureExternalHttpsConnector() {
logger.info("Creating https connector");
final SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setCertAlias(getConfiguration().getSslConfiguration().getKeyStoreAlias());
sslContextFactory.setKeyStorePath(getConfiguration().getSslConfiguration().getKeyStorePath());
sslContextFactory.setKeyStorePassword(getConfiguration().getSslConfiguration().getKeyStorePassword());
final Integer port = getConfiguration().getSslConfiguration().getPort() != null ?
getConfiguration().getSslConfiguration().getPort() :
getConfiguration().getPort();
final InstrumentedSslSocketConnector connector = new InstrumentedSslSocketConnector(
this.metricRegistry,
port,
sslContextFactory,
Clock.defaultClock());
connector.setName(EXTERNAL_HTTPS_CONNECTOR_NAME);
return connector;
}
}