148 String expectedUri =
template;
149 int patternStartIndex = expectedUri.indexOf(
"{");
151 if (expectedUri.endsWith(
"/*")) {
152 expectedUri = expectedUri.substring(0, expectedUri.length() - 2);
155 if (patternStartIndex == -1 || patternStartIndex >= targetUri.length()) {
159 if (expectedUri.split(
"/").length > targetUri.split(
"/").length) {
163 char[] expectedUriChars = expectedUri.toCharArray();
164 char[] matchingUri = Arrays.copyOfRange(expectedUriChars, 0, patternStartIndex);
165 int matchingUriLastIndex = matchingUri.length;
166 String targetUriParams = targetUri.substring(patternStartIndex);
168 if (Arrays.equals(matchingUri, Arrays.copyOf(targetUri.toCharArray(), matchingUri.length))) {
169 matchingUri = Arrays.copyOf(matchingUri, targetUri.length());
172 for (
int i = patternStartIndex; i < expectedUriChars.length; i++) {
173 if (matchingUriLastIndex >= matchingUri.length) {
177 char c = expectedUriChars[i];
179 if (c ==
'{' || c ==
'*') {
180 String[] params = targetUriParams.split(
"/");
182 for (
int k = paramIndex; k <= (c ==
'*' ? params.length : paramIndex); k++) {
183 if (k == params.length) {
187 int paramLength = params[k].length();
189 if (matchingUriLastIndex + paramLength > matchingUri.length) {
193 for (
int j = 0; j < paramLength; j++) {
194 matchingUri[matchingUriLastIndex++] = params[k].charAt(j);
197 if (c ==
'*' && matchingUriLastIndex < matchingUri.length) {
198 matchingUri[matchingUriLastIndex++] =
'/';
202 i = expectedUri.indexOf(
'}', i);
204 if (i == expectedUri.lastIndexOf(
'}') && onlyFirstParam) {
205 return String.valueOf(matchingUri).substring(0, matchingUriLastIndex);
211 matchingUri[matchingUriLastIndex++] = c;
215 if (matchingUri[matchingUri.length - 1] ==
'\u0000') {
216 if (
template.endsWith(
"*")) {
217 StringBuilder firstParam =
new StringBuilder(String.valueOf(matchingUri).substring(0, matchingUriLastIndex));
219 firstParam.append(targetUri.substring(firstParam.length()));
221 return firstParam.toString();
226 return String.valueOf(matchingUri);