package songbook.server; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.util.PathTemplateMatcher; import java.util.Map; /** Simple Path template handler with a fallthrough. */ public class PathTemplateHandler implements HttpHandler { private final PathTemplateMatcher<HttpHandler> pathTemplateMatcher = new PathTemplateMatcher<>(); private final HttpHandler otherHandler; public PathTemplateHandler(HttpHandler otherHandler) { this.otherHandler = otherHandler; } @Override public void handleRequest(HttpServerExchange exchange) throws Exception { // Uses request URI to match path to avoid decoding. PathTemplateMatcher.PathMatchResult<HttpHandler> match = pathTemplateMatcher.match(exchange.getRequestURI()); if (match != null) { for (Map.Entry<String, String> entry : match.getParameters().entrySet()) { exchange.addQueryParam(entry.getKey(), entry.getValue()); } match.getValue().handleRequest(exchange); } else { otherHandler.handleRequest(exchange); } } public void add(String uriTemplate, HttpHandler handler) { pathTemplateMatcher.add(uriTemplate, handler); } public void remove(String uriTemplate) { pathTemplateMatcher.remove(uriTemplate); } }