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

minium.tools.fs.web.method.support.BaseURLHandlerMethodArgumentResolver Maven / Gradle / Ivy

There is a newer version: 1.4.1
Show newest version
package minium.tools.fs.web.method.support;

import static java.lang.String.format;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import javax.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.google.common.base.Throwables;

@Component
public class BaseURLHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
        try {
            // http://stackoverflow.com/questions/3686808/spring-3-requestmapping-get-path-value
            HttpServletRequest request = ((ServletWebRequest) webRequest).getRequest();
            String url = buildFullRequestUrl(request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath(), null);

            if (methodParameter.getParameterType() == String.class) return url;
            if (methodParameter.getParameterType() == URL.class) return new URL(url);
            if (methodParameter.getParameterType() == URI.class) return new URI(url);

            throw new IllegalArgumentException(format("Class %s is not supported", methodParameter.getParameterType()));
        } catch (MalformedURLException e) {
            throw Throwables.propagate(e);
        } catch (URISyntaxException e) {
            throw Throwables.propagate(e);
        }
    }

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        BaseURL baseURL = methodParameter.getParameterAnnotation(BaseURL.class);
        return baseURL != null;
    }

    // from org.springframework.security.web.util.UrlUtils#buildFullRequestUrl(String, String, int, String, String)
    /**
     * Obtains the full URL the client used to make the request.
     * 

* Note that the server port will not be shown if it is the default server port for HTTP or HTTPS * (80 and 443 respectively). * * @return the full URL, suitable for redirects (not decoded). */ protected static String buildFullRequestUrl(String scheme, String serverName, int serverPort, String requestURI, String queryString) { scheme = scheme.toLowerCase(); StringBuilder url = new StringBuilder(); url.append(scheme).append("://").append(serverName); // Only add port if not default if ("http".equals(scheme)) { if (serverPort != 80) { url.append(":").append(serverPort); } } else if ("https".equals(scheme)) { if (serverPort != 443) { url.append(":").append(serverPort); } } // Use the requestURI as it is encoded (RFC 3986) and hence suitable for redirects. url.append(requestURI); if (queryString != null) { url.append("?").append(queryString); } return url.toString(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy