All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.airlift.http.server.WebServerBuilder Maven / Gradle / Ivy

There is a newer version: 0.0.6
Show newest version
package io.airlift.http.server;

import static com.google.inject.matcher.Matchers.annotatedWith;

import java.io.File;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.http.HttpServlet;
import javax.ws.rs.Path;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import io.airlift.http.server.model.WebServerDefinitionBuilder;

public class WebServerBuilder {

  private WebServerDefinitionBuilder webServerDefinitionBuilder;

  public WebServerBuilder() {
    webServerDefinitionBuilder = new WebServerDefinitionBuilder();
  }

  public WebServerBuilder port(int port) {
    webServerDefinitionBuilder.port(port);
    return this;
  }

  public WebServerBuilder filter(String pattern) {
    webServerDefinitionBuilder.filter(pattern);
    return this;
  }

  public WebServerBuilder through(Class filterClass) {
    webServerDefinitionBuilder.through(filterClass);
    return this;
  }

  public WebServerBuilder serve(String pattern) {
    return serve(pattern, Lists.newArrayList());
  }

  public WebServerBuilder serve(String pattern, List welcomeFiles) {
    webServerDefinitionBuilder.serve(pattern, welcomeFiles);
    return this;
  }

  public WebServerBuilder with(Class servletClass) {
    return with(servletClass, Maps.newHashMap());
  }

  public WebServerBuilder with(Class servletClass, Map parameters) {
    webServerDefinitionBuilder.with(servletClass, parameters);
    return this;
  }

  public WebServerBuilder with(HttpServlet servlet) {
    webServerDefinitionBuilder.with(servlet);
    return this;
  }

  public WebServerBuilder with(File war) {
    webServerDefinitionBuilder.with(war);
    return this;
  }  
  
  public WebServerBuilder at(String path) {
    webServerDefinitionBuilder.at(path);
    return this;
  }

  public WebServerBuilder resource(String resource) {
    return resource(resource, Lists.newArrayList(), false);
  }

  public WebServerBuilder resourceWithListing(String resource) {
    return resource(resource, Lists.newArrayList(), true);
  }
  
  
  public WebServerBuilder resource(String resource, List welcomeFiles) {
    return resource(resource, welcomeFiles, false);
  }

  public WebServerBuilder resource(String resource, List welcomeFiles, boolean listing) {
    webServerDefinitionBuilder.resource(resource, welcomeFiles, listing);
    return this;
  }
  
  
  public WebServer build() {
    return new JettyWebServer(webServerDefinitionBuilder.build());
  }

  public WebServerBuilder withJaxRs() {
    String callingClassName = Thread.currentThread().getStackTrace()[2].getClassName();
    try {
      Class callingClass = Thread.currentThread().getContextClassLoader().loadClass(callingClassName);
      
      String providers = getClassNames(callingClass, Provider.class, GsonMessageBodyHandler.class);
      String resources = getClassNames(callingClass, Path.class);
      
      with(HttpServletDispatcher.class,
          ImmutableMap.of( //
              "resteasy.providers", providers,
              "resteasy.resources", resources, //
              "resteasy.servlet.mapping.prefix", "/api"));
    } catch (ClassNotFoundException e) {
      throw new RuntimeException("Cannot determine package for JAXRS resource scanning.", e);
    }
    return this;
  }

  private String getClassNames(Class callingClass, Class annotationClass, Class ...additional) {
    Set> resourceClasses = Classes.matching(annotatedWith(annotationClass)).in(callingClass.getPackage());
    Set resourceClassNames = Sets.newHashSet();
    for (Class clazz : resourceClasses) {
      resourceClassNames.add(clazz.getName());
    }
    if(additional != null) {
      for (Class clazz : additional) {
        resourceClassNames.add(clazz.getName());
      }
    }
    return Joiner.on(",").join(resourceClassNames);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy