package org.jboss.as.undertow;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.CanonicalPathHandler;
import io.undertow.server.handlers.CookieHandler;
import io.undertow.server.handlers.NameVirtualHostHandler;
import io.undertow.server.handlers.ResponseCodeHandler;
import io.undertow.server.handlers.error.SimpleErrorPageHandler;
import io.undertow.server.handlers.form.FormEncodedDataHandler;
import org.jboss.as.network.SocketBinding;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
/**
* @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> (c) 2013 Red Hat Inc.
*/
public class Server implements Service<Server> {
private final String defaultHost;
private final String name;
private final NameVirtualHostHandler virtualHostHandler = new NameVirtualHostHandler();
private final InjectedValue<ServletContainerService> servletContainer = new InjectedValue<>();
private final InjectedValue<UndertowService> undertowService = new InjectedValue<>();
private volatile HttpHandler root;
private List<AbstractListenerService<?>> listeners = new LinkedList<>();
private Set<Host> hosts = new CopyOnWriteArraySet<>();
protected Server(String name, String defaultHost) {
this.name = name;
this.defaultHost = defaultHost;
}
@Override
public void start(StartContext startContext) throws StartException {
root = virtualHostHandler;
root = new CookieHandler(root);
root = new FormEncodedDataHandler(root);
root = new SimpleErrorPageHandler(root);
root = new CanonicalPathHandler(root);
/*
if (cacheSize > 0) {
root = new CacheHandler(new DirectBufferCache<CachedHttpRequest>(1024, cacheSize * 1024 * 1024), root);
}*/
UndertowLogger.ROOT_LOGGER.infof("Starting server server service: %s", startContext.getController().getName());
undertowService.getValue().registerServer(this);
}
protected void registerListener(AbstractListenerService<?> listener) {
listeners.add(listener);
if (listener.isSecure()) {
SocketBinding binding = (SocketBinding) listener.getBinding().getValue();
servletContainer.getValue().registerSecurePort(listener.getName(), binding.getPort());
}
}
protected void unregisterListener(AbstractListenerService<?> listener) {
listeners.add(listener);
if (listener.isSecure()) {
servletContainer.getValue().unregisterSecurePort(listener.getName());
}
}
protected void registerHost(final Host host) {
hosts.add(host);
for (String hostName : host.getAllAliases()) {
virtualHostHandler.addHost(hostName, host.getRootHandler());
}
if (host.getName().equals(getDefaultHost())) {
virtualHostHandler.setDefaultHandler(host.getRootHandler());
}
}
protected void unregisterHost(Host host) {
for (String hostName : host.getAllAliases()) {
virtualHostHandler.removeHost(hostName);
hosts.remove(host);
}
if (host.getName().equals(getDefaultHost())) {
virtualHostHandler.setDefaultHandler(ResponseCodeHandler.HANDLE_404);
}
}
@Override
public void stop(StopContext stopContext) {
undertowService.getValue().unregisterServer(this);
}
@Override
public Server getValue() throws IllegalStateException, IllegalArgumentException {
return this;
}
protected InjectedValue<ServletContainerService> getServletContainer() {
return servletContainer;
}
protected HttpHandler getRoot() {
return root;
}
protected InjectedValue<UndertowService> getUndertowService() {
return undertowService;
}
public String getName() {
return name;
}
public String getDefaultHost() {
return defaultHost;
}
public Set<Host> getHosts() {
return Collections.unmodifiableSet(hosts);
}
public List<AbstractListenerService<?>> getListeners() {
return listeners;
}
}