blob: 43713528988b21390ec4376974c6c3f0a36860c3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.dubbo.metadata.extension.rest.api;
import org.apache.dubbo.metadata.MetadataConstants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* is used to parse url pathVariable
* <p>
* String[] splits= url.split("/")
* List<String> strings = Arrays.asList(split);
* strings.set(UrlSplitIndex, (String) args.get(argIndex));
*/
public class PathUtil {
private static final String SEPARATOR = MetadataConstants.PATH_SEPARATOR;
/**
* generate real path from rawPath according to argInfo and method args
*
* @param rawPath
* @param argInfos
* @param args
* @return
*/
public static String resolvePathVariable(String rawPath, List<ArgInfo> argInfos, List<Object> args) {
String[] split = rawPath.split(SEPARATOR);
List<String> strings = Arrays.asList(split);
List<ArgInfo> pathArgInfos = new ArrayList<>();
for (ArgInfo argInfo : argInfos) {
if (ParamType.PATH.supportAnno(argInfo.getParamAnnotationType())) {
pathArgInfos.add(argInfo);
}
}
for (ArgInfo pathArgInfo : pathArgInfos) {
strings.set(pathArgInfo.getUrlSplitIndex(), String.valueOf(args.get(pathArgInfo.getIndex())));
}
String pat = SEPARATOR;
for (String string : strings) {
if (string.length() == 0) {
continue;
}
pat = pat + string + SEPARATOR;
}
if (pat.endsWith(SEPARATOR)) {
pat = pat.substring(0, pat.lastIndexOf(SEPARATOR));
}
return pat;
}
/**
* parse pathVariable index from url by annotation info
*
* @param rawPath
* @param argInfos
*/
public static void setArgInfoSplitIndex(String rawPath, List<ArgInfo> argInfos) {
String[] split = rawPath.split(SEPARATOR);
List<PathPair> pathPairs = new ArrayList<>();
for (ArgInfo argInfo : argInfos) {
if (ParamType.PATH.supportAnno(argInfo.getParamAnnotationType())) {
pathPairs.add(new PathPair(argInfo));
}
}
for (int i = 0; i < split.length; i++) {
String s = split[i];
for (PathPair pathPair : pathPairs) {
boolean match = pathPair.match(s);
if (match) {
pathPair.setArgInfoSplitIndex(i);
}
}
}
}
public static class PathPair {
String value;
ArgInfo argInfo;
public PathPair(ArgInfo argInfo) {
this.argInfo = argInfo;
this.value = argInfo.getAnnotationNameAttribute();
}
public String getPatten() {
return "{" + value + "}";
}
public String getLeftPatten() {
return "{" + value;
}
public String getRightPatten() {
return "}";
}
public boolean match(String value) {
return getPatten().equals(value) // for : {id}
|| (value.startsWith(getLeftPatten()) && value.endsWith(getRightPatten())); // for : {id: \d+}
}
public String getValue() {
return value;
}
public void setArgInfo(ArgInfo argInfo) {
this.argInfo = argInfo;
}
public void setArgInfoSplitIndex(int urlSplitIndex) {
this.argInfo.setUrlSplitIndex(urlSplitIndex);
}
}
}