package org.jboss.as.undertow; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import io.undertow.Version; import io.undertow.servlet.api.DeploymentInfo; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; import org.jboss.msc.service.StopContext; /** * @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> (c) 2013 Red Hat Inc. * @author Stuart Douglas */ public class UndertowService implements Service<UndertowService> { public static final ServiceName UNDERTOW = ServiceName.JBOSS.append("undertow"); public static final ServiceName WORKER = UNDERTOW.append("worker"); public static final ServiceName SERVLET_CONTAINER = UNDERTOW.append(Constants.SERVLET_CONTAINER); public static final ServiceName SERVER = UNDERTOW.append(Constants.SERVER); /** * The base name for jboss.web connector services. */ public static final ServiceName AJP_LISTENER = UNDERTOW.append("ajp-listener"); public static final ServiceName HTTP_LISTENER = UNDERTOW.append("http-listener"); public static final ServiceName HTTPS_LISTENER = UNDERTOW.append("https-listener"); public static final ServiceName BUFFER_POOL = UNDERTOW.append("buffer-pool"); /** * The base name for jboss.web deployments. */ static final ServiceName WEB_DEPLOYMENT_BASE = UNDERTOW.append("deployment"); private final String defaultContainer; private final String defaultServer; private final String defaultVirtualHost; private String instanceId; private Set<Server> registeredServers = new CopyOnWriteArraySet<>(); private List<UndertowEventListener> listeners = new CopyOnWriteArrayList<>(); protected UndertowService(String defaultContainer, String defaultServer, String defaultVirtualHost, String instanceId) { this.defaultContainer = defaultContainer; this.defaultServer = defaultServer; this.defaultVirtualHost = defaultVirtualHost; this.instanceId = instanceId; } public static ServiceName deploymentServiceName(final String virtualHost, final String contextPath) { return WEB_DEPLOYMENT_BASE.append(virtualHost).append("".equals(contextPath) ? "/" : contextPath); } public static ServiceName virtualHostName(final String server, final String virtualHost) { return SERVER.append(server).append(Constants.HOST).append(virtualHost); } public static ServiceName locationServiceName(final String server, final String virtualHost, final String locationName) { return virtualHostName(server, virtualHost).append(Constants.LOCATION, locationName); } @Override public void start(StartContext context) throws StartException { UndertowLogger.ROOT_LOGGER.serverStarting(Version.getVersionString()); } @Override public void stop(StopContext context) { UndertowLogger.ROOT_LOGGER.serverStopping(Version.getVersionString()); fireEvent(EventType.SHUTDOWN, null); } @Override public UndertowService getValue() throws IllegalStateException, IllegalArgumentException { return this; } protected void registerServer(Server server) { registeredServers.add(server); fireEvent(EventType.SERVER_START, server); } protected void unregisterServer(Server server) { registeredServers.remove(server); fireEvent(EventType.SERVER_STOP, server); } public String getDefaultContainer() { return defaultContainer; } public String getDefaultServer() { return defaultServer; } public String getDefaultVirtualHost() { return defaultVirtualHost; } public Set<Server> getServers() { return Collections.unmodifiableSet(registeredServers); } public String getInstanceId() { return instanceId; } public void setInstanceId(String instanceId) { this.instanceId = instanceId; } /** * Registers custom Event listener to server * * @param listener event listener to register */ public void registerListener(UndertowEventListener listener) { this.listeners.add(listener); } protected void fireEvent(EventType type, Object eventData) { for (UndertowEventListener listener : listeners) { switch (type) { case HOST_START: listener.onHostStart((Host) eventData); break; case HOST_STOP: listener.onHostStop((Host) eventData); break; case DEPLOYMENT_START: listener.onDeploymentStart((DeploymentInfo) eventData); break; case DEPLOYMENT_STOP: listener.onDeploymentStop((DeploymentInfo) eventData); break; case SERVER_START: listener.onServerStart((Server) eventData); break; case SERVER_STOP: listener.onServerStop((Server) eventData); break; case SHUTDOWN: listener.onShutdown(); break; default: throw new IllegalArgumentException("not supported yet"); } } } }