Skip to content

Commit

Permalink
Merge pull request #245 from ScienJus/master
Browse files Browse the repository at this point in the history
Route Groups
  • Loading branch information
decebals committed Feb 10, 2016
2 parents 988c3c2 + c657b15 commit c3469e7
Show file tree
Hide file tree
Showing 6 changed files with 282 additions and 15 deletions.
5 changes: 5 additions & 0 deletions pippo-core/src/main/java/ro/pippo/core/Application.java
Expand Up @@ -25,6 +25,7 @@
import ro.pippo.core.route.Route;
import ro.pippo.core.route.RouteContext;
import ro.pippo.core.route.RouteDispatcher;
import ro.pippo.core.route.RouteGroup;
import ro.pippo.core.route.RouteHandler;
import ro.pippo.core.route.RoutePostDispatchListenerList;
import ro.pippo.core.route.RoutePreDispatchListenerList;
Expand Down Expand Up @@ -268,6 +269,10 @@ public void addRoute(Route route) {
getRouter().addRoute(route);
}

public void addRouteGroup(RouteGroup routeGroup) {
getRouter().addRouteGroup(routeGroup);
}

/**
* It's a shortcut for {@link #addPublicResourceRoute(String)} with parameter <code>"/public"</code>.
*/
Expand Down
12 changes: 12 additions & 0 deletions pippo-core/src/main/java/ro/pippo/core/route/DefaultRouter.java
Expand Up @@ -192,6 +192,18 @@ public void removeRoute(Route route) {
removeBinding(route);
}

@Override
public void addRouteGroup(RouteGroup routeGroup) {
routeGroup.getRoutes().forEach(this::addRoute);
routeGroup.getChildren().forEach(this::addRouteGroup);
}

@Override
public void removeRouteGroup(RouteGroup routeGroup) {
routeGroup.getRoutes().forEach(this::removeRoute);
routeGroup.getChildren().forEach(this::removeRouteGroup);
}

@Override
public String uriFor(String relativeUri) {
return prefixApplicationPath(relativeUri);
Expand Down
24 changes: 22 additions & 2 deletions pippo-core/src/main/java/ro/pippo/core/route/Route.java
Expand Up @@ -16,6 +16,7 @@
package ro.pippo.core.route;

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

/**
* @author Decebal Suiu
Expand All @@ -28,6 +29,7 @@ public class Route {

private boolean runAsFinally;
private String name;
private RouteGroup group;

public Route(String requestMethod, String uriPattern, RouteHandler routeHandler) {
this.requestMethod = requestMethod;
Expand Down Expand Up @@ -117,13 +119,24 @@ public String getRequestMethod() {
}

public String getUriPattern() {
return uriPattern;
return getFullUriPattern();
}

public RouteHandler getRouteHandler() {
return routeHandler;
}

// path with group
public String getFullUriPattern() {
RouteGroup group = this.group;
String path = this.uriPattern;
while (group != null) {
path = StringUtils.addStart(StringUtils.addStart(path, "/"), group.getUriPattern());
group = group.getParent();
}
return StringUtils.removeEnd(path, "/");
}

public boolean isRunAsFinally() {
return runAsFinally;
}
Expand All @@ -150,6 +163,13 @@ public void setName(String name) {
this.name = name;
}


public Route inGroup(RouteGroup group) {
this.group = group;
group.getRoutes().add(this);
return this;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand All @@ -158,7 +178,7 @@ public boolean equals(Object o) {
Route route = (Route) o;

if (!requestMethod.equals(route.requestMethod)) return false;
if (!uriPattern.equals(route.uriPattern)) return false;
if (!getUriPattern().equals(route.getUriPattern())) return false;

return true;
}
Expand Down
133 changes: 133 additions & 0 deletions pippo-core/src/main/java/ro/pippo/core/route/RouteGroup.java
@@ -0,0 +1,133 @@
/*
* Copyright (C) 2015 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 ro.pippo.core.PippoRuntimeException;

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

/**
* @author ScienJus
* @date 16/2/9.
*/
public class RouteGroup {

private String uriPattern;

private List<Route> routes;

private RouteGroup parent;

private List<RouteGroup> children;

public RouteGroup(String uriPattern) {
this.uriPattern = uriPattern;
this.routes = new ArrayList<>();
this.children = new ArrayList<>();
}

public String getUriPattern() {
return this.uriPattern;
}

public RouteGroup getParent() {
return parent;
}

public List<RouteGroup> getChildren() {
return children;
}

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

return Route.GET(uriPattern, routeHandler).inGroup(this);
}

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

public Route POST(String uriPattern, RouteHandler routeHandler) {
return Route.POST(uriPattern, routeHandler).inGroup(this);
}

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

public Route DELETE(String uriPattern, RouteHandler routeHandler) {
return Route.DELETE(uriPattern, routeHandler).inGroup(this);
}

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

public Route HEAD(String uriPattern, RouteHandler routeHandler) {
return Route.HEAD(uriPattern, routeHandler).inGroup(this);
}

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

public Route PUT(String uriPattern, RouteHandler routeHandler) {
return Route.PUT(uriPattern, routeHandler).inGroup(this);
}

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

public Route PATCH(String uriPattern, RouteHandler routeHandler) {
return Route.PATCH(uriPattern, routeHandler).inGroup(this);
}

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

public Route ALL(String uriPattern, RouteHandler routeHandler) {
return Route.ALL(uriPattern, routeHandler).inGroup(this);
}
public Route ALL(RouteHandler routeHandler) {
return ALL("", routeHandler);
}

public List<Route> getRoutes() {
return routes;
}

public RouteGroup addRoute(Route route) {
route.inGroup(this);
return this;
}

public RouteGroup addRouteGroup(RouteGroup routeGroup) {
routeGroup.inGroup(this);
return this;
}

public RouteGroup inGroup(RouteGroup routeGroup) {
this.parent = routeGroup;
routeGroup.getChildren().add(this);
return this;
}
}
30 changes: 17 additions & 13 deletions pippo-core/src/main/java/ro/pippo/core/route/Router.java
Expand Up @@ -33,44 +33,48 @@ public interface Router {
*
* @return the context path
*/
public String getContextPath();
String getContextPath();

/**
* Sets the context path for url generation.
*
* @param contextPath
*/
public void setContextPath(String contextPath);
void setContextPath(String contextPath);

public Set<String> getIgnorePaths();
Set<String> getIgnorePaths();

public void ignorePaths(String... paths);
void ignorePaths(String... paths);

public void addRoute(Route route);
void addRoute(Route route);

public void removeRoute(Route route);
void removeRoute(Route route);

public List<RouteMatch> findRoutes(String requestMethod, String requestUri);
void addRouteGroup(RouteGroup routeGroup);

public List<Route> getRoutes();
void removeRouteGroup(RouteGroup routeGroup);

List<RouteMatch> findRoutes(String requestMethod, String requestUri);

List<Route> getRoutes();

/**
* Get uri with context path.
*
* @param relativeUri
* @return
*/
public String uriFor(String relativeUri);
String uriFor(String relativeUri);

public String uriFor(String nameOrUriPattern, Map<String, Object> parameters);
String uriFor(String nameOrUriPattern, Map<String, Object> parameters);

public String uriPatternFor(Class<? extends ResourceHandler> resourceHandlerClass);
String uriPatternFor(Class<? extends ResourceHandler> resourceHandlerClass);

/**
* Returns the base path for the Pippo application.
*/
public String getApplicationPath();
String getApplicationPath();

public void setApplicationPath(String pippoPath);
void setApplicationPath(String pippoPath);

}

0 comments on commit c3469e7

Please sign in to comment.