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

com.github.tonivade.zeromock.HttpService Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2018, Antonio Gabriel Muñoz Conejo 
 * Distributed under the terms of the MIT License
 */
package com.github.tonivade.zeromock;

import static com.github.tonivade.zeromock.Handlers.delegate;
import static com.github.tonivade.zeromock.Mappings.mapping;
import static com.github.tonivade.zeromock.Predicates.startsWith;
import static java.util.Objects.requireNonNull;

import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;

import com.github.tonivade.zeromock.Mappings.Mapping;

public class HttpService {
  
  private final String name;
  private final List mappings;
  
  public HttpService(String name) {
    this(name, new LinkedList<>());
  }
  
  private HttpService(String name, List mappings) {
    this.name = requireNonNull(name);
    this.mappings = requireNonNull(mappings);
  }
  
  public String name() {
    return name;
  }

  public HttpService mount(String path, HttpService service) {
    return when(startsWith(path), delegate(service));
  }
  
  public HttpService when(Predicate matcher, Function handler) {
    return when(mapping(matcher).then(handler));
  }
  
  public HttpService when(Mapping mapping) {
    addMapping(mapping);
    return this;
  }
  
  public Optional execute(HttpRequest request) {
    return findMapping(request).map(mapping -> mapping.execute(request));
  }
  
  public HttpService combine(HttpService other) {
    List merge = new LinkedList<>();
    merge.addAll(this.mappings);
    merge.addAll(other.mappings);
    return new HttpService(this.name + "+" + other.name, merge);
  }
  
  @Override
  public String toString() {
    return "HttpService(" + name + ")";
  }

  protected void clear() {
    mappings.clear();
  }
  
  private void addMapping(Mapping mapping) {
    mappings.add(mapping);
  }

  private Optional findMapping(HttpRequest request) {
    return mappings.stream()
        .filter(mapping -> mapping.test(request))
        .findFirst();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy