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

cc.shacocloud.mirage.restful.util.VertxPathMatcher Maven / Gradle / Ivy

package cc.shacocloud.mirage.restful.util;

import cc.shacocloud.mirage.utils.AntPathMatcher;
import cc.shacocloud.mirage.utils.PathMatcher;
import cc.shacocloud.mirage.utils.map.ConcurrentReferenceHashMap;
import org.jetbrains.annotations.NotNull;

import java.util.Comparator;
import java.util.Map;

/**
 * vertx 路径匹配器
 * 

* 内部使用 AntPathMatcher,匹配时将 Vertx 路径表达式替换为 ant 路径表达式进行替换 * * @author 思追(shaco) */ public class VertxPathMatcher implements PathMatcher { private static final AntPathMatcher antPathMatcher = new AntPathMatcher(); private final Map patternCache = new ConcurrentReferenceHashMap<>(256); @Override public boolean isPattern(String path) { return antPathMatcher.isPattern(patternReplace(path)); } @Override public boolean match(String pattern, String path) { return antPathMatcher.match(patternReplace(pattern), path); } @Override public boolean matchStart(String pattern, String path) { return antPathMatcher.matchStart(patternReplace(pattern), path); } @Override public String extractPathWithinPattern(String pattern, String path) { return antPathMatcher.extractPathWithinPattern(patternReplace(pattern), path); } @Override public Map extractUriTemplateVariables(String pattern, String path) { return antPathMatcher.extractUriTemplateVariables(patternReplace(pattern), path); } @Override public Comparator getPatternComparator(String path) { return antPathMatcher.getPatternComparator(patternReplace(path)); } /** * 将 vertx path 模式替换为 ant 路径模式 *

* 例如: * vertx path ==> /api/users/:id * ant path ==> /api/users/{id} */ private @NotNull String patternReplace(@NotNull String pattern) { return patternCache.computeIfAbsent(pattern, k -> { int length = k.length(); StringBuilder builder = new StringBuilder(); boolean varStart = false; for (int i = 0; i < length; i++) { char c = k.charAt(i); if (c == ':') { varStart = true; builder.append("{"); } else if (c == '/' && varStart) { builder.append("}/"); varStart = false; } else { builder.append(c); } } if (varStart) { builder.append("}"); } return builder.toString(); }); } @Override public String combine(String pattern1, String pattern2) { // TODO 暂不支持... throw new UnsupportedOperationException(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy