@Override public String toString() { return "Route{" + "requestMethod='" + requestMethod + '\'' + ", uriPattern='" + getUriPattern() + '\'' + '}'; }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Route route = (Route) o; return requestMethod.equals(route.requestMethod) && getUriPattern().equals(route.getUriPattern()); }
@Override public String toString() { return "RouteMatch{" + "requestMethod='" + route.getRequestMethod() + '\'' + ", uriPattern='" + route.getUriPattern() + '\'' + '}'; }
@Override public String uriPatternFor(Class<? extends ResourceHandler> resourceHandlerClass) { Route route = getRoute(resourceHandlerClass); return (route != null) ? route.getUriPattern() : null; }
private Route getCompiledRoute(String nameOrUriPattern) { for (Route route : compiledRoutes) { if (nameOrUriPattern.equals(route.getName()) || nameOrUriPattern.equals(route.getUriPattern())) { return route; } } return null; }
@Override public void removeRoute(Route route) { log.debug("Removing route for {} '{}'", route.getRequestMethod(), route.getUriPattern()); boolean removed = routes.remove(route); if (removed) { // updates cache List<Route> cacheEntry = routesCache.get(route.getRequestMethod()); if (cacheEntry != null) { cacheEntry.remove(route); } removeCompiledRoute(route); } }
@Override public void addRoute(Route route) { log.debug("Add route for {} '{}'", route.getRequestMethod(), route.getUriPattern()); validateRoute(route); routes.add(route); // update cache List<Route> cacheEntry = routesCache.get(route.getRequestMethod()); if (cacheEntry == null) { cacheEntry = new ArrayList<>(); } cacheEntry.add(route); routesCache.put(route.getRequestMethod(), cacheEntry); }
private void removeCompiledRoute(Route route) { String nameOrUriPattern = StringUtils.isNullOrEmpty(route.getName()) ? route.getUriPattern() : route.getName(); Route compiledRoute = getCompiledRoute(nameOrUriPattern); if (compiledRoute == null) { // do nothing; probably the route was not yet compiled return; } compiledRoutes.remove(compiledRoute); // update cache List<Route> cacheEntry = compiledRoutesCache.get(route.getRequestMethod()); if (cacheEntry != null) { cacheEntry.remove(compiledRoute); } uriMatcher.removeUriPattern(compiledRoute.getUriPattern()); }
@Override public Route transform(Route route) { Method method = route.getAttribute("__controllerMethod"); if (method == null) { // it's not a controller route; do nothing return route; } if (method.isAnnotationPresent(Named.class)) { Named named = method.getAnnotation(Named.class); String name = named.value(); log.debug("Set name '{}' for route {} '{}'", name, route.getRequestMethod(), route.getUriPattern()); route.setName(name); } return route; }
@Override public List<RouteMatch> findRoutes(String requestMethod, String requestUri) { log.trace("Finding route matches for {} '{}'", requestMethod, requestUri); // force compile routes compileRoutes(); List<RouteMatch> routeMatches = new ArrayList<>(); for (Route route : compiledRoutes) { boolean methodMatches = route.getRequestMethod().equals(requestMethod) || route.getRequestMethod().equals(HttpConstants.Method.ANY); if (methodMatches) { String uriPattern = route.getUriPattern(); Map<String, String> parameters = uriMatcher.match(requestUri, uriPattern); if (parameters != null) { // complete matching => add route match ro returned list routeMatches.add(new RouteMatch(route, parameters)); } } } log.debug("Found {} route matches for {} '{}'", routeMatches.size(), requestMethod, requestUri); return routeMatches; }
@SuppressWarnings("unchecked") protected void handleRoute(Route route) { if (StringUtils.isNullOrEmpty(route.getName())) { log.debug("Executing handler for {} '{}'", route.getRequestMethod(), route.getUriPattern()); } else { log.debug("Executing '{}' for {} '{}'", route.getName(), route.getRequestMethod(), route.getUriPattern()); } this.route = route; route.getRouteHandler().handle(this); }
@Override protected String getPathParameterValue(String uriPattern, String parameterName, Object parameterValue) { String value = super.getPathParameterValue(uriPattern, parameterName, parameterValue); // retrieve the compiled route for uriPattern Route compiledRoute = compiledRoutes.stream() .filter(route -> uriPattern.equals(route.getUriPattern())) .findAny() .orElseThrow(() -> new PippoRuntimeException("Cannot find a compiled route for '{}'", uriPattern)); RouteHandler handler = compiledRoute.getRouteHandler(); boolean isResourceRoute = ResourceHandler.class.isAssignableFrom(handler.getClass()); // inject version for resource routes if (isResourceRoute && ResourceHandler.PATH_PARAMETER.equals(parameterName)) { ResourceHandler resourceHandler = (ResourceHandler) compiledRoute.getRouteHandler(); if (resourceHandler.isVersioned()) { value = resourceHandler.injectVersion(value); } } return value; }
/** * Execute all routes that are flagged to run as finally. */ @Override public void runFinallyRoutes() { while (iterator.hasNext()) { Route route = iterator.next().getRoute(); if (route.isRunAsFinally()) { try { handleRoute(route); } catch (Exception e) { log.error("Unexpected error in Finally Route", e); } } else if (log.isDebugEnabled()) { if (StringUtils.isNullOrEmpty(route.getName())) { log.debug("context.next() not called, skipping handler for {} '{}'", route.getRequestMethod(), route.getUriPattern()); } else { log.debug("context.next() not called, skipping '{}' for {} '{}'", route.getName(), route.getRequestMethod(), route.getUriPattern()); } } } }
content.append('\t').append(route.getRequestMethod()).append(' ').append(route.getUriPattern()); content.append('\n');
@Override public String uriFor(String nameOrUriPattern, Map<String, Object> parameters) { // force compile routes compileRoutes(); Route compiledRoute = getCompiledRoute(nameOrUriPattern); if (compiledRoute == null) { return null; } return prefixApplicationPath(uriMatcher.uriFor(compiledRoute.getUriPattern(), parameters)); }
protected void validateRoute(Route route) { // validate the request method if (StringUtils.isNullOrEmpty(route.getRequestMethod())) { throw new PippoRuntimeException("Unspecified request method!"); } // validate the uri pattern String uriPattern = route.getUriPattern(); if (StringUtils.isNullOrEmpty(uriPattern)) { throw new PippoRuntimeException("The uri pattern cannot be null or empty"); } }
private Route compileRoute(Route route) { String uriPattern = route.getUriPattern(); UriMatcher.UriPatternBinding binding = uriMatcher.addUriPattern(uriPattern); List<String> parameterNames = binding.getParameterNames(); Route compiledRoute = new Route(route); // add additional metadata as attributes compiledRoute.bind("__pattern", binding.getPattern()); compiledRoute.bind("__parameterNames", parameterNames); return compiledRoute; }
route.setAbsoluteUriPattern(concatUriPattern(uriPattern, route.getUriPattern()));
@Override public Route transform(Route route) { Method method = route.getAttribute("__controllerMethod"); if (method == null) { // it's not a controller route; do nothing return route; } if (method.isAnnotationPresent(Named.class)) { Named named = method.getAnnotation(Named.class); String name = named.value(); log.debug("Set name '{}' for route {} '{}'", name, route.getRequestMethod(), route.getUriPattern()); route.setName(name); } return route; }
route.getRequestMethod(), route.getUriPattern(), Util.toString(handler.getControllerMethod())); return false; if (produces.isEmpty()) { log.debug("Skip {} {}, {} does not declare @Produces", route.getRequestMethod(), route.getUriPattern(), Util.toString(handler.getControllerMethod())); return false; route.getRequestMethod(), route.getUriPattern(), Util.toString(handler.getControllerMethod())); return false; || handler.getControllerMethod().getDeclaringClass().isAnnotationPresent(Undocumented.class)) { log.debug("Skip {} {}, {} is annotated as @Undocumented", route.getRequestMethod(), route.getUriPattern(), Util.toString(handler.getControllerMethod())); return false; if (!route.getUriPattern().startsWith(relativeSwaggerBasePath)) { log.debug("Skip {} {}, {} route is not within Swagger basePath '{}'", route.getRequestMethod(), route.getUriPattern(), Util.toString(handler.getControllerMethod()), relativeSwaggerBasePath); return false;