All Downloads are FREE. Search and download functionalities are using the official Maven repository.

newcontroller.RouterHandlerMapping Maven / Gradle / Ivy

Go to download

Lambda based extensible "New Controller" for Spring MVC insipired by Spark Java, Siden (aka Sinatra like framework)

There is a newer version: 0.2.0
Show newest version
/*
*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