Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d53ea8a

Browse files
committed
fix: prevent resname tokens from matching subcomponents
1 parent e337c6a commit d53ea8a

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/main/java/com/google/api/generator/gapic/composer/ResourceNameTokenizer.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,21 @@
1515
package com.google.api.generator.gapic.composer;
1616

1717
import com.google.api.pathtemplate.PathTemplate;
18+
import com.google.common.base.Preconditions;
1819
import java.util.ArrayList;
1920
import java.util.Arrays;
2021
import java.util.List;
2122
import java.util.Set;
2223
import java.util.stream.Collectors;
2324

2425
public class ResourceNameTokenizer {
25-
private static final String SLASH = "/";
2626
private static final String LEFT_BRACE = "{";
2727
private static final String RIGHT_BRACE = "}";
28+
private static final String SLASH = "/";
29+
private static final String EMPTY = "";
30+
31+
private static final String EQUALS_WILDCARD = "=*";
32+
private static final String EQUALS_PATH_WILDCARD = "=**";
2833

2934
static List<List<String>> parseTokenHierarchy(List<String> patterns) {
3035
List<String> nonSlashSepStrings = Arrays.asList("}_{", "}-{", "}.{", "}~{");
@@ -36,22 +41,38 @@ static List<List<String>> parseTokenHierarchy(List<String> patterns) {
3641
String[] patternTokens = pattern.split(SLASH);
3742
for (String patternToken : patternTokens) {
3843
if (patternToken.startsWith(LEFT_BRACE) && patternToken.endsWith(RIGHT_BRACE)) {
39-
String processedPatternToken = patternToken;
44+
String processedPatternToken =
45+
// Replacement order matters - ensure the first is not a subcomponent of the second.
46+
patternToken.replace(EQUALS_PATH_WILDCARD, EMPTY).replace(EQUALS_WILDCARD, EMPTY);
4047

4148
// Handle non-slash separators.
4249
if (nonSlashSepStrings.stream().anyMatch(s -> patternToken.contains(s))) {
4350
for (String str : nonSlashSepStrings) {
4451
processedPatternToken = processedPatternToken.replace(str, "_");
4552
}
4653
} else {
54+
final int processedPatternTokenLength = processedPatternToken.length();
4755
// Handles wildcards.
48-
processedPatternToken =
56+
List<String> candidateVars =
4957
vars.stream()
50-
.filter(v -> patternToken.contains(v))
51-
.collect(Collectors.toList())
52-
.get(0);
58+
// Check that the token size is within ~3 of the var, to avoid mismatching on
59+
// variables with same-named subcomponents.
60+
// Otherwise, "customer_client_link" will match with "customer".
61+
.filter(
62+
v ->
63+
patternToken.contains(v)
64+
// Accounting for braces.
65+
&& processedPatternTokenLength - v.length() < 3)
66+
.collect(Collectors.toList());
67+
Preconditions.checkState(
68+
!candidateVars.isEmpty(),
69+
String.format(
70+
"No variable candidates found for token %s in pattern %s",
71+
processedPatternToken, pattern));
72+
processedPatternToken = candidateVars.get(0);
5373
}
54-
hierarchy.add(processedPatternToken.replace("{", "").replace("}", ""));
74+
hierarchy.add(
75+
processedPatternToken.replace(LEFT_BRACE, EMPTY).replace(RIGHT_BRACE, EMPTY));
5576
}
5677
}
5778
tokenHierachies.add(hierarchy);

src/test/java/com/google/api/generator/gapic/composer/ResourceNameTokenizerTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ public void parseTokenHierarchy_basic() {
5151
assertThat(tokenHierarchies.get(2)).containsExactly("project", "autoscaling_policy");
5252
}
5353

54+
@Test
55+
public void parseTokenHierarchy_substringsInPattern() {
56+
List<String> patterns =
57+
Arrays.asList(
58+
"customers/{customer}/customerExtensionSettings/{customer_extension_setting}");
59+
List<List<String>> tokenHierarchies = ResourceNameTokenizer.parseTokenHierarchy(patterns);
60+
assertEquals(1, tokenHierarchies.size());
61+
assertThat(tokenHierarchies.get(0)).containsExactly("customer", "customer_extension_setting");
62+
}
63+
5464
@Test
5565
public void parseTokenHierarchy_wildcards() {
5666
List<String> patterns =

0 commit comments

Comments
 (0)