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);