package me.geso.routes; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class WebRouter<T> implements Serializable { private static final long serialVersionUID = 1L; @Override public String toString() { return "WebRouter [patterns=" + getPatterns() + "]"; } private final List<HttpRoute<T>> patterns; public WebRouter() { patterns = new ArrayList<>(); } public boolean isEmpty() { return getPatterns().isEmpty(); } /** * Get the path information destination. * * @param method HTTP method * @param path PATH_INFO * @return */ public RoutingResult<T> match(final String method, final String path) { RoutingResult<T> routingResult = null; for (HttpRoute<T> route : getPatterns()) { RoutingResult<T> result = route.match(method, path); if (result != null) { routingResult = result; if (routingResult.methodAllowed()) { return routingResult; } } } return routingResult; } /** * Register new route. It only matches GET/HEAD method. * * @param path * @param destination * @return */ public WebRouter<T> get(final String path, final T destination) { return addRoute(path, destination, Arrays.asList("GET", "HEAD")); } /** * Register new route. It only matches POST method. * * @param path * @param destination * @return */ public WebRouter<T> post(final String path, final T destination) { return addRoute(path, destination, Arrays.asList("POST")); } /** * Register new route. * * @param path PATH_INFO * @param destination Destination object * @param methods HTTP methods it should be match. * @return */ public WebRouter<T> addRoute(final String path, final T destination, final List<String> methods) { getPatterns().add(new HttpRoute<>(path, destination, methods)); return this; } public List<HttpRoute<T>> getPatterns() { return patterns; } }