import java.util.stream.Collectors; import javax.annotation.Nullable; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.jboss.resteasy.util.GetRestful; import com.google.inject.Inject; import com.google.inject.Injector; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.wordnik.swagger.config.ScannerFactory; import com.wordnik.swagger.jaxrs.config.BeanConfig; /** * A context listener that scans for APIs and configures Swagger. * * @author ben.manes@gmail.com (Ben Manes) */ final class SwaggerServletContextListener implements ServletContextListener { private final Config config = ConfigFactory.load().getConfig(getClass().getPackage().getName()); private final Injector injector; @Inject SwaggerServletContextListener(Injector injector) { this.injector = injector; } @Override public void contextInitialized(ServletContextEvent event) { BeanConfig beanConfig = getBeanConfig(); event.getServletContext().setAttribute("reader", beanConfig); event.getServletContext().setAttribute("swagger", beanConfig.getSwagger()); event.getServletContext().setAttribute("scanner", ScannerFactory.getScanner()); } private BeanConfig getBeanConfig() { BeanConfig beanConfig = new ResourceConfig(); beanConfig.setHost(getConfigString("host")); beanConfig.setTitle(getConfigString("title")); beanConfig.setVersion(getConfigString("version")); beanConfig.setContact(getConfigString("contact")); beanConfig.setLicense(getConfigString("license")); beanConfig.setBasePath(getConfigString("base_path")); beanConfig.setLicenseUrl(getConfigString("licenseUrl")); beanConfig.setDescription(getConfigString("description")); beanConfig.setPrettyPrint(getConfigString("pretty_print")); beanConfig.setTermsOfServiceUrl(getConfigString("terms_of_service_url")); // Must be called last beanConfig.setResourcePackage(resourcePackages()); beanConfig.setScan(true); return beanConfig; } @Nullable private String getConfigString(String path) { return config.hasPath(path) ? config.getString(path) : null; } /** Returns a comma separated list of resource packages. */ private String resourcePackages() { return injector.getBindings().keySet().stream() .map(key -> key.getTypeLiteral().getRawType()) .filter(GetRestful::isRootResource) .map(clazz -> clazz.getPackage().getName()) .distinct() .collect(Collectors.joining(",")); } @Override public void contextDestroyed(ServletContextEvent event) {} }