Skip to content

Commit

Permalink
Improve the route group concept
Browse files Browse the repository at this point in the history
  • Loading branch information
decebals committed Sep 22, 2016
1 parent f143f31 commit 2c7db98
Show file tree
Hide file tree
Showing 9 changed files with 179 additions and 188 deletions.
3 changes: 2 additions & 1 deletion pippo-core/src/main/java/ro/pippo/core/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.pippo.core.route.DefaultRouter;
import ro.pippo.core.route.ResourceRouting;
import ro.pippo.core.route.Route;
import ro.pippo.core.route.Routing;
import ro.pippo.core.route.RouteContext;
Expand All @@ -42,7 +43,7 @@
*
* @author Decebal Suiu
*/
public class Application implements Routing {
public class Application implements ResourceRouting {

private static final Logger log = LoggerFactory.getLogger(Application.class);

Expand Down
4 changes: 2 additions & 2 deletions pippo-core/src/main/java/ro/pippo/core/Pippo.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.pippo.core.route.ResourceRouting;
import ro.pippo.core.route.Route;
import ro.pippo.core.route.RouteGroup;
import ro.pippo.core.route.Routing;
import ro.pippo.core.util.ServiceLocator;

/**
* @author Decebal Suiu
*/
public class Pippo implements Routing {
public class Pippo implements ResourceRouting {

private static final Logger log = LoggerFactory.getLogger(Pippo.class);

Expand Down
26 changes: 24 additions & 2 deletions pippo-core/src/main/java/ro/pippo/core/route/DefaultRouter.java
Original file line number Diff line number Diff line change
Expand Up @@ -196,13 +196,29 @@ public void removeRoute(Route route) {

@Override
public void addRouteGroup(RouteGroup routeGroup) {
routeGroup.getRoutes().forEach(this::addRoute);
// add routes of group
routeGroup.getRoutes().forEach(route -> {
String uriPattern = routeGroup.getUriPattern();
RouteGroup parent = routeGroup.getParent();
while (parent != null) {
uriPattern = concatUriPattern(parent.getUriPattern(), uriPattern);
parent = parent.getParent();
}
route.setAbsoluteUriPattern(concatUriPattern(uriPattern, route.getUriPattern()));

addRoute(route);
});

// add children of group
routeGroup.getChildren().forEach(this::addRouteGroup);
}

@Override
public void removeRouteGroup(RouteGroup routeGroup) {
// remove routes of group
routeGroup.getRoutes().forEach(this::removeRoute);

// remove children of group
routeGroup.getChildren().forEach(this::removeRouteGroup);
}

Expand Down Expand Up @@ -284,7 +300,7 @@ private void addBinding(Route route) {
PatternBinding binding = new PatternBinding(pattern, route, parameterNames);
String requestMethod = route.getRequestMethod();
if (!bindingsCache.containsKey(requestMethod)) {
bindingsCache.put(requestMethod, new ArrayList<PatternBinding>());
bindingsCache.put(requestMethod, new ArrayList<>());
}
bindingsCache.get(requestMethod).add(binding);
}
Expand Down Expand Up @@ -494,6 +510,12 @@ private String uriFor(PatternBinding binding, Map<String, Object> parameters) {
return uri;
}

private String concatUriPattern(String prefix, String uriPattern) {
uriPattern = StringUtils.addStart(StringUtils.addStart(uriPattern, "/"), prefix);

return "/".equals(uriPattern) ? uriPattern : StringUtils.removeEnd(uriPattern, "/");
}

private class PatternBinding {

private final Pattern pattern;
Expand Down
84 changes: 84 additions & 0 deletions pippo-core/src/main/java/ro/pippo/core/route/ResourceRouting.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* Copyright (C) 2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ro.pippo.core.route;

import java.io.File;

/**
* An extension of <@link>Routing</@link> that add support for <@code>Resource</@code>.
*
* @author Decebal Suiu
*/
public interface ResourceRouting extends Routing {

/**
* It's a shortcut for {@link #addPublicResourceRoute(String)} with parameter <code>"/public"</code>.
*/
default Route addPublicResourceRoute() {
return addPublicResourceRoute("/public");
}

/**
* Add a route that serves resources from the "public" directory within your classpath.
*/
default Route addPublicResourceRoute(String urlPath) {
return addResourceRoute(new PublicResourceHandler(urlPath));
}

/**
* Add a route that serves resources from a directory(file system).
*/
default Route addFileResourceRoute(String urlPath, File directory) {
return addResourceRoute(new FileResourceHandler(urlPath, directory));
}

default Route addFileResourceRoute(String urlPath, String directory) {
return addResourceRoute(new FileResourceHandler(urlPath, directory));
}

default Route addClasspathResourceRoute(String urlPath, Class<?> resourceClass) {
return addResourceRoute(new ClasspathResourceHandler(urlPath, resourceClass.getName().replace(".", "/")));
}

/**
* Add a route that serves resources from classpath.
*/
default Route addClasspathResourceRoute(String urlPath, String resourceBasePath) {
return addResourceRoute(new ClasspathResourceHandler(urlPath, resourceBasePath));
}

/**
* It's a shortcut for {@link #addWebjarsResourceRoute(String)} with parameter <code>"/webjars"</code>.
*/
default Route addWebjarsResourceRoute() {
return addWebjarsResourceRoute("/webjars");
}

/**
* Add a route that serves webjars (http://www.webjars.org/) resources.
*/
default Route addWebjarsResourceRoute(String urlPath) {
return addResourceRoute(new WebjarsResourceHandler(urlPath));
}

default Route addResourceRoute(ResourceHandler resourceHandler) {
Route route = Route.GET(resourceHandler.getUriPattern(), resourceHandler);
addRoute(route);

return route;
}

}
15 changes: 4 additions & 11 deletions pippo-core/src/main/java/ro/pippo/core/route/Route.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import ro.pippo.core.HttpConstants;
import ro.pippo.core.PippoRuntimeException;
import ro.pippo.core.util.StringUtils;

/**
* @author Decebal Suiu
Expand Down Expand Up @@ -153,13 +152,13 @@ public void setName(String name) {
this.name = name;
}

void setGroupUriPattern(String groupUriPattern) {
if (absoluteUriPattern != null) {
void setAbsoluteUriPattern(String absoluteUriPattern) {
if (this.absoluteUriPattern != null) {
// when group1.addRoute(route); group2.addRoute(route);
throw new PippoRuntimeException("This route is already in a group");
}

absoluteUriPattern = StringUtils.concatUriPattern(groupUriPattern, this.uriPattern);
this.absoluteUriPattern = absoluteUriPattern;
}

@Override
Expand All @@ -173,14 +172,8 @@ public boolean equals(Object o) {

Route route = (Route) o;

if (!requestMethod.equals(route.requestMethod)) {
return false;
}
if (!getUriPattern().equals(route.getUriPattern())) {
return false;
}
return requestMethod.equals(route.requestMethod) && getUriPattern().equals(route.getUriPattern());

return true;
}

@Override
Expand Down
108 changes: 14 additions & 94 deletions pippo-core/src/main/java/ro/pippo/core/route/RouteGroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@
*/
package ro.pippo.core.route;

import ro.pippo.core.PippoRuntimeException;
import ro.pippo.core.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

Expand All @@ -28,27 +25,27 @@
* Also you can add (route) filters for all routes of the group.
*
* @author ScienJus
* @author Decebal Suiu
*/
public class RouteGroup {
public class RouteGroup implements Routing {

private String uriPattern;
private List<Route> routes;
// private RouteGroup parent;
private RouteGroup parent;
private List<RouteGroup> children;

public RouteGroup(String uriPattern) {
this(null, uriPattern);
}

public RouteGroup(RouteGroup parent, String uriPattern) {
this.uriPattern = uriPattern;
this.parent = parent;

if (parent != null) {
this.uriPattern = StringUtils.concatUriPattern(parent.getUriPattern(), uriPattern);
parent.getChildren().add(this);
} else {
this.uriPattern = uriPattern;
parent.children.add(this);
}

// this.parent = parent;
this.routes = new ArrayList<>();
this.children = new ArrayList<>();
}
Expand All @@ -57,11 +54,9 @@ public String getUriPattern() {
return this.uriPattern;
}

/*
public RouteGroup getParent() {
return parent;
}
*/

public List<RouteGroup> getChildren() {
return children;
Expand All @@ -71,90 +66,15 @@ public List<Route> getRoutes() {
return routes;
}

public Route GET(String uriPattern, RouteHandler routeHandler) {
if (routeHandler instanceof ResourceHandler) {
throw new PippoRuntimeException("Please use 'addResourceRoute()'");
}

Route route = Route.GET(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route GET(RouteHandler routeHandler) {
return GET("", routeHandler);
}

public Route POST(String uriPattern, RouteHandler routeHandler) {
Route route = Route.POST(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route POST(RouteHandler routeHandler) {
return POST("", routeHandler);
}

public Route DELETE(String uriPattern, RouteHandler routeHandler) {
Route route = Route.DELETE(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route DELETE(RouteHandler routeHandler) {
return DELETE("", routeHandler);
}

public Route HEAD(String uriPattern, RouteHandler routeHandler) {
Route route = Route.HEAD(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route HEAD(RouteHandler routeHandler) {
return HEAD("", routeHandler);
}

public Route PUT(String uriPattern, RouteHandler routeHandler) {
Route route = Route.PUT(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route PUT(RouteHandler routeHandler) {
return PUT("", routeHandler);
}

public Route PATCH(String uriPattern, RouteHandler routeHandler) {
Route route = Route.PATCH(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route PATCH(RouteHandler routeHandler) {
return PATCH("", routeHandler);
}

public Route ALL(String uriPattern, RouteHandler routeHandler) {
Route route = Route.ALL(uriPattern, routeHandler);
addRoute(route);

return route;
}

public Route ALL(RouteHandler routeHandler) {
return ALL("", routeHandler);
}

@Override
public void addRoute(Route route) {
route.setGroupUriPattern(this.uriPattern);
routes.add(route);
}

@Override
public void addRouteGroup(RouteGroup routeGroup) {
routeGroup.parent = this;
children.add(routeGroup);
}

}
Loading

0 comments on commit 2c7db98

Please sign in to comment.