package org.infinispan.rest.embedded.netty4;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseFilter;
import org.infinispan.commons.api.Lifecycle;
import org.infinispan.commons.logging.LogFactory;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.rest.RestCacheManager;
import org.infinispan.rest.Server;
import org.infinispan.rest.configuration.RestServerConfiguration;
import org.infinispan.rest.embedded.netty4.security.Authenticator;
import org.infinispan.rest.logging.Log;
import org.infinispan.rest.logging.RestAccessLoggingHandler;
import org.infinispan.server.core.AbstractCacheIgnoreAware;
import org.infinispan.server.core.configuration.SslConfiguration;
import org.infinispan.server.core.utils.SslUtils;
import org.jboss.resteasy.spi.ResteasyDeployment;
import io.netty.handler.ssl.ClientAuth;
/**
* Temporary fork from RestEasy 3.1.0
*/
public final class NettyRestServer extends AbstractCacheIgnoreAware implements Lifecycle {
private final static Log log = LogFactory.getLog(NettyRestServer.class, Log.class);
private final EmbeddedCacheManager cacheManager;
private final RestServerConfiguration configuration;
private final Authenticator authenticator;
private NettyJaxrsServer netty;
private Server server;
private NettyRestServer(EmbeddedCacheManager cacheManager, RestServerConfiguration configuration, Authenticator authenticator) {
this.cacheManager = cacheManager;
this.configuration = configuration;
this.authenticator = authenticator;
}
public static NettyRestServer createServer(RestServerConfiguration configuration, EmbeddedCacheManager manager) {
return new NettyRestServer(manager, configuration, null);
}
public static NettyRestServer createServer(RestServerConfiguration configuration, EmbeddedCacheManager manager, Authenticator authenticator) {
return new NettyRestServer(manager, configuration, authenticator);
}
private static void addEncryption(RestServerConfiguration config, NettyJaxrsServer netty) {
if (config.ssl() != null && config.ssl().enabled()) {
SslConfiguration sslConfig = config.ssl();
ClientAuth clientAuth = sslConfig.requireClientAuth() ? ClientAuth.OPTIONAL : ClientAuth.NONE;
SniConfiguration nettySniConfiguration = new SniConfiguration(SslUtils.createJdkSslContext(sslConfig, sslConfig.sniDomainsConfiguration().get("*")), clientAuth);
sslConfig.sniDomainsConfiguration().forEach((domainName, domainConfiguration) -> {
nettySniConfiguration.addSniMapping(domainName, SslUtils.createJdkSslContext(sslConfig, domainConfiguration));
});
netty.setSSLContext(sslConfig.sslContext());
netty.setSniConfiguration(nettySniConfiguration);
netty.setClientAuth(clientAuth);
}
}
private static void startCaches(EmbeddedCacheManager cm) {
// Start defined caches to avoid issues with lazily started caches
cm.getCacheNames().forEach(name -> SecurityActions.getCache(cm, name));
// Finally, start default cache as well
cm.getCache();
}
private static EmbeddedCacheManager createCacheManager(String cfgFile) {
try {
return new DefaultCacheManager(cfgFile);
} catch (IOException e) {
log.errorReadingConfigurationFile(e, cfgFile);
return new DefaultCacheManager();
}
}
@Override
public void start() {
configuration.ignoredCaches().forEach(this::ignoreCache);
RestCacheManager restCacheManager = new RestCacheManager(cacheManager, this::isCacheIgnored);
server = new Server(configuration, restCacheManager);
if (configuration.startTransport()) {
NettyJaxrsServer nettyServer = createNetty();
addEncryption(configuration, nettyServer);
nettyServer.start();
ResteasyDeployment deployment = nettyServer.getDeployment();
deployment.getRegistry().addSingletonResource(server, configuration.contextPath());
deployment.getProviderFactory().register(new RestAccessLoggingHandler(), ContainerRequestFilter.class,
ContainerResponseFilter.class);
log.startRestServer(configuration.host(), configuration.port());
netty = nettyServer;
}
}
private NettyJaxrsServer createNetty() {
// Start caches first, if not started
startCaches(cacheManager);
NettyJaxrsServer netty = new NettyJaxrsServer();
ResteasyDeployment deployment = new ResteasyDeployment();
netty.setDeployment(deployment);
netty.setHostname(configuration.host());
netty.setPort(configuration.port());
netty.setRootResourcePath("");
if (authenticator != null) {
netty.setAuthenticator(authenticator);
}
return netty;
}
@Override
public void stop() {
if (netty != null) {
netty.stop();
}
netty = null;
server = null;
}
public Server getServer() {
return server;
}
public EmbeddedCacheManager getCacheManager() {
return cacheManager;
}
}