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

io.github.filipowm.api.servlet.ServletApiVersioningPathStrategy Maven / Gradle / Ivy

package io.github.filipowm.api.servlet;

import io.github.filipowm.api.AbstractApiVersioningStrategy;
import io.github.filipowm.api.ApiBuilder;
import io.github.filipowm.api.ApiUtils;
import io.github.filipowm.api.ApiVersionNamingProvider;
import io.github.filipowm.api.VersionTarget;
import io.github.filipowm.api.servlet.ServletApiBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;

import java.util.Collection;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Component adding versioning on path, i.e. /api/v1..., /v1/...
 * If path already is versioned with this versioning schema (v1, v2, v99, ..)
 * then new pattern will added (current won't be replaced and will still exist)
 */
@Slf4j
public class ServletApiVersioningPathStrategy extends AbstractApiVersioningStrategy implements InitializingBean {

    private final String versionPrefix;

    public ServletApiVersioningPathStrategy(ApiVersionNamingProvider namingProvider, String versionPrefix) {
        super(namingProvider);
        this.versionPrefix = versionPrefix;
    }

    @Override
    public void afterPropertiesSet() {
        log.info("Enabled API versioning in request path (e.g. /{}1/resource", versionPrefix);
    }

    @Override
    public Set parseVersion(RequestMappingInfo requestMappingInfo) {
        return Optional.ofNullable(requestMappingInfo.getPatternsCondition())
                       .map(PatternsRequestCondition::getPatterns)
                       .stream()
                       .flatMap(Collection::stream)
                       .map(path -> ApiUtils.extractVersionFromPath(path, versionPrefix))
                       .collect(Collectors.toSet());
    }

    @Override
    protected VersionTarget getVersionTarget(ApiBuilder builder) {
        return builder.getPathHolders();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy