Skip to content

Commit ce58c18

Browse files
authored
feat: Add support for additional_bindings (#993)
This PR depends on the corresponding one in gax: googleapis/gax-java#1680
1 parent df7e08e commit ce58c18

File tree

9 files changed

+54
-9
lines changed

9 files changed

+54
-9
lines changed

src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java

+10
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,16 @@ private List<Expr> getRequestFormatterExpr(Method protoMethod) {
348348
"putPathParam")))
349349
.apply(expr);
350350

351+
if (!protoMethod.httpBindings().lowerCamelAdditionalPatterns().isEmpty()) {
352+
expr =
353+
methodMaker
354+
.apply(
355+
"setAdditionalPaths",
356+
protoMethod.httpBindings().lowerCamelAdditionalPatterns().stream()
357+
.map(a -> ValueExpr.withValue(StringObjectValue.withValue(a)))
358+
.collect(Collectors.toList()))
359+
.apply(expr);
360+
}
351361
TypeNode fieldsVarGenericType =
352362
TypeNode.withReference(
353363
ConcreteReference.builder()

src/main/java/com/google/api/generator/gapic/model/HttpBindings.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
import com.google.auto.value.AutoValue;
1919
import com.google.common.collect.ImmutableSet;
2020
import java.util.HashMap;
21+
import java.util.List;
2122
import java.util.Map;
2223
import java.util.Set;
24+
import java.util.stream.Collectors;
2325
import javax.annotation.Nullable;
2426

2527
@AutoValue
@@ -63,6 +65,8 @@ public int compareTo(HttpBinding o) {
6365

6466
public abstract String pattern();
6567

68+
public abstract List<String> additionalPatterns();
69+
6670
public abstract Set<HttpBinding> pathParameters();
6771

6872
public abstract Set<HttpBinding> queryParameters();
@@ -84,8 +88,18 @@ public static HttpBindings.Builder builder() {
8488
// in .proto file: "/global/instanceTemplates/{instance_template=*}"
8589
// in .java file: "/global/instanceTemplates/{instanceTemplate=*}"
8690
public String lowerCamelPattern() {
87-
String lowerCamelPattern = pattern();
88-
for (HttpBinding pathParam : pathParameters()) {
91+
return lowerCamelPattern(pattern(), pathParameters());
92+
}
93+
94+
public List<String> lowerCamelAdditionalPatterns() {
95+
return additionalPatterns().stream()
96+
.map(a -> lowerCamelPattern(a, pathParameters()))
97+
.collect(Collectors.toList());
98+
}
99+
100+
private static String lowerCamelPattern(String originalPattern, Set<HttpBinding> pathParameters) {
101+
String lowerCamelPattern = originalPattern;
102+
for (HttpBinding pathParam : pathParameters) {
89103
lowerCamelPattern =
90104
lowerCamelPattern.replaceAll(
91105
"\\{" + pathParam.name(), "{" + JavaStyle.toLowerCamelCase(pathParam.name()));
@@ -107,6 +121,8 @@ public abstract static class Builder {
107121

108122
public abstract HttpBindings.Builder setPattern(String pattern);
109123

124+
public abstract HttpBindings.Builder setAdditionalPatterns(List<String> additionalPatterns);
125+
110126
abstract String pattern();
111127

112128
public abstract HttpBindings.Builder setPathParameters(Set<HttpBinding> pathParameters);

src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.Set;
3737
import java.util.regex.Matcher;
3838
import java.util.regex.Pattern;
39+
import java.util.stream.Collectors;
3940

4041
public class HttpRuleParser {
4142
private static final String ASTERISK = "*";
@@ -68,11 +69,12 @@ private static HttpBindings parseHttpRuleHelper(
6869
// Get pattern.
6970
String pattern = getHttpVerbPattern(httpRule);
7071
ImmutableSet.Builder<String> bindingsBuilder = ImmutableSet.builder();
71-
bindingsBuilder.addAll(PatternParser.getPattenBindings(pattern));
72+
bindingsBuilder.addAll(PatternParser.getPatternBindings(pattern));
7273
if (httpRule.getAdditionalBindingsCount() > 0) {
7374
for (HttpRule additionalRule : httpRule.getAdditionalBindingsList()) {
7475
// TODO: save additional bindings path in HttpRuleBindings
75-
bindingsBuilder.addAll(PatternParser.getPattenBindings(getHttpVerbPattern(additionalRule)));
76+
bindingsBuilder.addAll(
77+
PatternParser.getPatternBindings(getHttpVerbPattern(additionalRule)));
7678
}
7779
}
7880

@@ -104,6 +106,10 @@ private static HttpBindings parseHttpRuleHelper(
104106
return HttpBindings.builder()
105107
.setHttpVerb(HttpBindings.HttpVerb.valueOf(httpRule.getPatternCase().toString()))
106108
.setPattern(pattern)
109+
.setAdditionalPatterns(
110+
httpRule.getAdditionalBindingsList().stream()
111+
.map(HttpRuleParser::getHttpVerbPattern)
112+
.collect(Collectors.toList()))
107113
.setPathParameters(
108114
validateAndConstructHttpBindings(
109115
pathParamNames, message, messageTypes, patternSampleValues))

src/main/java/com/google/api/generator/gapic/protoparser/PatternParser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class PatternParser {
2222

2323
// This method tries to parse all named segments from pattern and sort in natual order
2424
// e.g. /v1beta1/{table_name=tests/*}/{routing_id=instances/*}/** -> (routing_id, table_name)
25-
public static Set<String> getPattenBindings(String pattern) {
25+
public static Set<String> getPatternBindings(String pattern) {
2626
ImmutableSortedSet.Builder<String> bindings = ImmutableSortedSet.naturalOrder();
2727
if (pattern.isEmpty()) {
2828
return bindings.build();

src/main/java/com/google/api/generator/gapic/protoparser/RoutingRuleParser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public static RoutingHeaderRule parse(
4949
key = fieldName;
5050
pathTemplate = String.format("{%s=**}", key);
5151
} else {
52-
Set<String> namedSegments = PatternParser.getPattenBindings(pathTemplate);
52+
Set<String> namedSegments = PatternParser.getPatternBindings(pathTemplate);
5353
Preconditions.checkArgument(
5454
namedSegments.size() == 1,
5555
String.format(

src/test/java/com/google/api/generator/gapic/composer/grpcrest/goldens/HttpJsonEchoStub.golden

+3
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ public class HttpJsonEchoStub extends EchoStub {
302302
fields, "fooBar.name", request.getFooBar().getName());
303303
return fields;
304304
})
305+
.setAdditionalPaths(
306+
"/v1beta1/{fooBar.name=cats/*/dogs/*}/echo:foo",
307+
"/v1beta1/{fooBar.name=turtles/*/parrots/*}/echo:foo")
305308
.setQueryParamsExtractor(
306309
request -> {
307310
Map<String, List<String>> fields = new HashMap<>();

src/test/java/com/google/api/generator/gapic/model/MethodTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.api.generator.gapic.model.HttpBindings.HttpVerb;
2222
import com.google.api.generator.gapic.model.RoutingHeaderRule.RoutingHeaderParam;
2323
import com.google.common.collect.ImmutableSet;
24+
import java.util.Arrays;
2425
import org.junit.Test;
2526

2627
public class MethodTest {
@@ -35,6 +36,7 @@ public class MethodTest {
3536
HttpBindings.builder()
3637
.setPathParameters(ImmutableSet.of(HttpBinding.create("table", true, false, "")))
3738
.setPattern("/pattern/test")
39+
.setAdditionalPatterns(Arrays.asList("/extra_pattern/test", "/extra_pattern/hey"))
3840
.setIsAsteriskBody(false)
3941
.setHttpVerb(HttpVerb.GET)
4042
.build();

src/test/java/com/google/api/generator/gapic/protoparser/PatternParserTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@
2222
public class PatternParserTest {
2323
@Test
2424
public void getPattenBindings_shouldReturnEmptySetIfPatternIsEmpty() {
25-
assertThat(PatternParser.getPattenBindings("")).isEmpty();
25+
assertThat(PatternParser.getPatternBindings("")).isEmpty();
2626
}
2727

2828
@Test
2929
public void getPattenBindings_shouldFilterOutUnboundVariables() {
30-
Set<String> actual = PatternParser.getPattenBindings("{routing_id=projects/*}/**");
30+
Set<String> actual = PatternParser.getPatternBindings("{routing_id=projects/*}/**");
3131
assertThat(actual).hasSize(1);
3232
}
3333

3434
@Test
3535
public void getPattenBindings_shouldReturnBindingsInNatualOrder() {
3636
Set<String> actual =
37-
PatternParser.getPattenBindings("{routing_id=projects/*}/{name=instance/*}");
37+
PatternParser.getPatternBindings("{routing_id=projects/*}/{name=instance/*}");
3838
assertThat(actual).containsExactly("name", "routing_id").inOrder();
3939
}
4040
}

src/test/proto/echo_grpcrest.proto

+8
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,14 @@ service Echo {
125125
option (google.api.http) = {
126126
post: "/v1beta1/{foo_bar.name=projects/*/foobars/*}/echo:foo"
127127
body: "*"
128+
additional_bindings {
129+
post: "/v1beta1/{foo_bar.name=cats/*/dogs/*}/echo:foo"
130+
body: "*"
131+
}
132+
additional_bindings {
133+
post: "/v1beta1/{foo_bar.name=turtles/*/parrots/*}/echo:foo"
134+
body: "*"
135+
}
128136
};
129137
}
130138
}

0 commit comments

Comments
 (0)