
newcontroller.RouterHandlerMapping Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of new-controller Show documentation
Show all versions of new-controller Show documentation
Lambda based extensible "New Controller" for Spring MVC insipired by Spark Java, Siden (aka Sinatra
like framework)
/*
*Copyright (C) 2015 Toshiaki Maki
*
*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 newcontroller;
import newcontroller.support.CapturedHttpServletRequest;
import newcontroller.support.CapturedHttpServletRequestAdopter;
import me.geso.routes.RoutingResult;
import me.geso.routes.WebRouter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Optional;
public class RouterHandlerMapping extends AbstractHandlerMapping {
@Autowired
Optional>> routerDefinitions;
private final static Logger log = LoggerFactory.getLogger(RouterHandlerMapping.class);
private final WebRouter router = new WebRouter<>();
private final HandlerApplier handlerApplier;
public RouterHandlerMapping(HandlerApplier handlerApplier) {
this.handlerApplier = handlerApplier;
}
@FunctionalInterface
public static interface HandlerApplier {
ModelAndView apply(T handler, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
@Override
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
if (request.getRequestURI().equalsIgnoreCase("favicon.ico")) {
return null;
}
String method = request.getMethod();
String path = request.getRequestURI();
return this.router.match(method, path);
}
@PostConstruct
public void init() {
this.routerDefinitions.ifPresent(defs -> {
for (RouterDefinition def : defs) {
def.define(this.router);
}
});
this.router.getPatterns().forEach(x -> log.info("Router(path={}, method={})\t->\t{}",
x.getPath(), x.getMethods(), x.getDestination()));
}
public HandlerAdapter handlerAdapter() {
return new HandlerAdapter() {
@Override
public boolean supports(Object handler) {
return RoutingResult.class.isAssignableFrom(handler.getClass());
}
@Override
@SuppressWarnings("unchecked")
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
RoutingResult routingResult = (RoutingResult) handler;
CapturedHttpServletRequest req = new CapturedHttpServletRequestAdopter(routingResult.getCaptured(), request);
return RouterHandlerMapping.this.handlerApplier.apply(routingResult.getDestination(), req, response);
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
};
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy