VirtualHost(String defaultHostname, String hostnamePattern, @Nullable SslContext sslContext, Iterable<ServiceConfig> serviceConfigs, MediaTypeSet producibleMediaTypes, RejectedPathMappingHandler rejectionHandler, Function<VirtualHost, Logger> accessLoggerMapper) { defaultHostname = normalizeDefaultHostname(defaultHostname); hostnamePattern = normalizeHostnamePattern(hostnamePattern); ensureHostnamePatternMatchesDefaultHostname(hostnamePattern, defaultHostname); this.defaultHostname = defaultHostname; this.hostnamePattern = hostnamePattern; this.sslContext = validateSslContext(sslContext); this.producibleMediaTypes = producibleMediaTypes; requireNonNull(serviceConfigs, "serviceConfigs"); final List<ServiceConfig> servicesCopy = new ArrayList<>(); for (ServiceConfig c : serviceConfigs) { c = c.build(this); servicesCopy.add(c); } services = Collections.unmodifiableList(servicesCopy); router = Routers.ofVirtualHost(this, services, rejectionHandler); if (accessLoggerMapper != null) { accessLogger = accessLoggerMapper.apply(this); checkState(accessLogger != null, "accessLoggerMapper.apply() has returned null for virtual host: %s.", hostnamePattern); } }