Skip to content

Commit

Permalink
fix: Allow custom HttpRules for REST LROs (#1288)
Browse files Browse the repository at this point in the history
* fix: Allow custom http bindings for LROs

* fix: Update generator and GAX to support custom HTTP Bindings for operations

* fix: Use static Map for custom Operation  REST Http Bindings

* chore: Update golden test cases

* chore: Update showcase tests

* chore: Update golden ITs

* chore: Add back origin HttpJsonOperationStub.create() methods

* fix(deps): update dependency com.google.auth:google-auth-library-bom to v1.15.0 (#1278)

* doc: Update DEVELOPMENT.md for local development. (#1237)

* chore: Create a default mapping in OperationStub

* chore: Do not generate custom bindings if there are none

* chore: Update golden units

* chore: Update all test cases

* chore: Fix format issues

* fix: remove constant operation binding field

* chore: Clean up code

* chore: Resolve sonar comments

* chore: DEVELOPMENT.md formatting fix (#1289)

* ci: use java-shared-dependencies in google-cloud-java repository for downstream test (#1291)

* ci: use java-shared-dependencies in google-cloud-java

* No need to modify google-cloud-jar-parent

* fix(java): initialize netty-shaded at run-time and add reflection configurations for netty classes (#1290)

* fix(java): initialize netty-shaded at run-time and add reflection configurations for netty classes

* ci(showcase): disable rest_numeric_enum for showcase testing (#1284)

* ci(showcase): disable rest_numeric_enum feature in showcase tests

* chore(main): release 2.15.0 (#1269)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* chore(main): release 2.15.1-SNAPSHOT (#1292)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* chore: Pin Bazel version to 5.2.0 (#1304)

Pin Bazel version to 5.2.0 as googleapis already updated to 5.2.0

* build(deps): bump cryptography from 38.0.3 to 39.0.1 in /.kokoro (#1297)

Bumps [cryptography](https://github.com/pyca/cryptography) from 38.0.3 to 39.0.1.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@38.0.3...39.0.1)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Mridula <66699525+mpeddada1@users.noreply.github.com>

* chore: (cleanup) removing unused files (#1265)

* chore: (cleanup) removing unused files

* chore: working on comments

* chore: removing unused Gradle files in api-common-java, gax-java, java-common-protos, and java-iam (#1305)

The build is Maven or Bazel. The Gradle files in the recently migrated repositories (api-common-java, gax-java, java-common-protos, and java-iam) are not used.

Note that this pull request is not touching rules_java_gapic/resources/gradle which is still used to generate Gradle files for self-service client libraries.

* chore: updated gax-java contribution doc (#1334)

Removing unnecessary files

* fix: use pkg_tar from rules_pkg (#1303)

* chore: Fix pre-commit. (#1294)

* chore: update CONTRIBUTING.md (#1346)

* fix(deps): update dependency io.grpc:grpc-bom to v1.53.0 (#1345)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) | `1.52.1` -> `1.53.0` | [![age](https://badges.renovateapi.com/packages/maven/io.grpc:grpc-bom/1.53.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/io.grpc:grpc-bom/1.53.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/io.grpc:grpc-bom/1.53.0/compatibility-slim/1.52.1)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/io.grpc:grpc-bom/1.53.0/confidence-slim/1.52.1)](https://docs.renovatebot.com/merge-confidence/) |

---

### ⚠ Dependency Lookup Warnings ⚠

Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.

---

### Release Notes

<details>
<summary>grpc/grpc-java</summary>

### [`v1.53.0`](https://github.com/grpc/grpc-java/releases/tag/v1.53.0)

[Compare Source](https://github.com/grpc/grpc-java/compare/v1.52.1...v1.53.0)

##### New Features

-   googleapis: Allow user set c2p bootstrap config ([#&#8203;9856](https://github.com/grpc/grpc-java/issues/9856))
-   xds: Add contain and stringMatcher in `RouteConfiguration` ([#&#8203;9845](https://github.com/grpc/grpc-java/issues/9845))
-   core: Add `grpc-previous-rpc-attempts` to the initial response metadata ([#&#8203;9686](https://github.com/grpc/grpc-java/issues/9686))
-   servlet: Implement gRPC server as a Servlet ([#&#8203;8596](https://github.com/grpc/grpc-java/issues/8596))
-   authz: Implement static authorization server interceptor ([#&#8203;8934](https://github.com/grpc/grpc-java/issues/8934))

##### Examples

-   servlet: Add servlet example ([#&#8203;8596](https://github.com/grpc/grpc-java/issues/8596))

##### Bug Fixes

-   xds: Update xds error handling logic.  Specifically:
    -   When the ads stream is closed only send errors to subscribers that haven't yet gotten results
    -   Timers to detect missing resources don’t start until the adsStream is ready ([#&#8203;9745](https://github.com/grpc/grpc-java/issues/9745))
    -   Call subscriber onError callback when xds client fails to connect to server ([#&#8203;9827](https://github.com/grpc/grpc-java/issues/9827))
-   core: Delay retriable stream master listener close until all sub streams are closed. This fixes the call executor lifecycle and prevents potential `RejectedExecutionException`. ([#&#8203;9754](https://github.com/grpc/grpc-java/issues/9754))
-   core: Free unused `MessageProducer` in `RetriableStream` ([#&#8203;9853](https://github.com/grpc/grpc-java/issues/9853)), fixing a Netty buffer memory leak for cancelled RPCs
-   api: Fail with `NullPointerException` when a Metadata.Marshaller returns null bytes ([#&#8203;9781](https://github.com/grpc/grpc-java/issues/9781)). This would previously cause a `NullPointerException` later during the RPC. Now the return value of the Marshaller is checked immediately, to help find the broken Marshaller

##### Behavior Changes

-   xds: Disallow duplicate addresses in the RingHashLB. ([#&#8203;9776](https://github.com/grpc/grpc-java/issues/9776))
-   xds: EDS weight sums are allowed up to max unsigned int (was max signed int) ([#&#8203;9765](https://github.com/grpc/grpc-java/issues/9765))
-   xds: Drop xds v2 support ([#&#8203;9760](https://github.com/grpc/grpc-java/issues/9760))

##### Dependencies

-   JUnit upgraded to 4.13.2
-   bazel: Dropped support for Bazel 4. We track the two most recent major versions of Bazel, Bazel 5 and 6. Bazel 4 may still work, but we are no longer testing it
-   bazel: Include Tomcat annotations dependency for `@Generated` as used by autovalue ([#&#8203;9762](https://github.com/grpc/grpc-java/issues/9762)). Necessary for building xds and rls on Java 9+
-   bazel: Export deps from Maven Central-specific stand-in targets ([#&#8203;9780](https://github.com/grpc/grpc-java/issues/9780)). Some Maven Central artifacts are a combination of multiple Bazel targets, like grpc-core is composed of //core:inprocess, //core:internal, //core:util, //api. There is a “//core:core_maven” target used by maven_install that uses the other targets. Previously the target used `runtime_deps` to discourage their use by Bazel users, but that could cause compilation failures from lack of hjars. These targets now use `exports`

##### Acknowledgement

[@&#8203;cpovirk](https://github.com/cpovirk)
[@&#8203;niloc132](https://github.com/niloc132)
[@&#8203;stephenh](https://github.com/stephenh)
[@&#8203;olderwei](https://github.com/olderwei)
[@&#8203;pandaapo](https://github.com/pandaapo)
[@&#8203;panxuefeng](https://github.com/panxuefeng)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMTQuMCIsInVwZGF0ZWRJblZlciI6IjM0LjEyNS4xIn0=-->

* chore(deps): update dependency org.apache.maven.plugins:maven-deploy-plugin to v3.1.0 (#1340)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [org.apache.maven.plugins:maven-deploy-plugin](https://maven.apache.org/plugins/) | `3.0.0` -> `3.1.0` | [![age](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-deploy-plugin/3.1.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-deploy-plugin/3.1.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-deploy-plugin/3.1.0/compatibility-slim/3.0.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-deploy-plugin/3.1.0/confidence-slim/3.0.0)](https://docs.renovatebot.com/merge-confidence/) |

---

### ⚠ Dependency Lookup Warnings ⚠

Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMTQuMCIsInVwZGF0ZWRJblZlciI6IjM0LjEyNS4xIn0=-->

* chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.0.0-m9 (#1350)

[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [org.apache.maven.plugins:maven-surefire-plugin](https://maven.apache.org/surefire/) | `3.0.0-M8` -> `3.0.0-M9` | [![age](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-surefire-plugin/3.0.0-M9/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-surefire-plugin/3.0.0-M9/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-surefire-plugin/3.0.0-M9/compatibility-slim/3.0.0-M8)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-surefire-plugin/3.0.0-M9/confidence-slim/3.0.0-M8)](https://docs.renovatebot.com/merge-confidence/) |

---

### ⚠ Dependency Lookup Warnings ⚠

Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/gapic-generator-java).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjM0LjEyNS4xIn0=-->

* chore: add rules_pkg to renovate bot ignoreDeps (#1349)

Following up on https://github.com/googleapis/gapic-generator-java/pull/1338, suppressing renovate PRs for the `rules_pkg` dependency since it will need to align with version used in googleapis.

* chore: fix renovate bot ignoreDeps (#1353)

Fixes #1352, from missed separator in #1349's changes.

* fix(batcher): exceptions in unaryCaller bubble up (#1166)

Co-authored-by: Blake Li <blakeli@google.com>

* fix(deps): update dependency com.google.auth:google-auth-library-bom to v1.16.0 (#1355)

* chore(deps): update dependency org.apache.maven.plugins:maven-javadoc-plugin to v3.5.0 (#1356)

[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [org.apache.maven.plugins:maven-javadoc-plugin](https://maven.apache.org/plugins/) | `3.4.1` -> `3.5.0` | [![age](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-javadoc-plugin/3.5.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-javadoc-plugin/3.5.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-javadoc-plugin/3.5.0/compatibility-slim/3.4.1)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/maven/org.apache.maven.plugins:maven-javadoc-plugin/3.5.0/confidence-slim/3.4.1)](https://docs.renovatebot.com/merge-confidence/) |

---

### ⚠ Dependency Lookup Warnings ⚠

Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/gapic-generator-java).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjM0LjEyNS4xIn0=-->

* chore(main): release 2.15.1 (#1339)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Emily Wang <emmwang@google.com>

* chore: refactoring README and DEVELOPMENT.md (#1351)

Thank you for opening a Pull Request! For general contributing guidelines, please refer to [contributing guide](https://github.com/googleapis/gapic-generator-java/blob/main/CONTRIBUTING.md)


- The old file https://github.com/googleapis/gapic-generator-java/blob/main/gapic-generator-java/DEVELOPMENT.md was last touched in mid December. I'm replacing the content with the latest at the root.
- Removing the root DEVELOPMENT.md in favor of the file above.
- Adding index of the modules at the root README.md
- Moving showcase testing guide to showcase/README.md.

* chore(main): release 2.15.2-SNAPSHOT (#1358)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* chore: renovate to group Protobuf artifacts (#1362)

Copying packageGroup configuration from https://github.com/googleapis/synthtool/blob/master/synthtool/gcp/templates/java_library/renovate.json

This should avoid separate pull requests for Protobuf: https://github.com/googleapis/gapic-generator-java/pull/1155 and https://github.com/googleapis/gapic-generator-java/pull/1154

* chore: README.md to explain service_config.proto (#1361)

* chore: README.md to explain service_config.proto

* add link

* chore: Telling owlbot to ignore these files & it's a monorepo (#1372)

* chore: Telling owlbot to ignore these files & it's a monorepo

* fix: Change the default scope of gax from implementation to api in auto-generated gradle files for self-service client libraries. (#1374)

* chore: Update variable name

* chore: Fix format issues

* fix: Use HttpRule as Value for Custom Bindings

* fix: Use HttpRule as Value for Custom Bindings

* chore: Add comments

* chore: Update tests

* fix(deps): update dependency com.google.auth:google-auth-library-bom to v1.15.0 (#1278)

* doc: Update DEVELOPMENT.md for local development. (#1237)

* chore: Add tests

* chore: Cleanup files

* chore: Format the files

* chore: Add NoCredentialsProvider

* chore: Fix sonar comments

* chore: Add serviceyaml file for parsing for rest showcase tests

* chore: Use service yaml file in test

* chore: Fix Echo showcase test

* chore: Clean up tests

* chore: Sort the map entry to get a consistent ordering for the test

* chore: Update showcase and integration tests

* chore: Resolve sonar comments

* chore: Update comments

* chore: Remove a few public constructors

* chore: test ci

* chore: Remove the cache for java 8

* chore: Update from PR feedback

* chore: Update comments

* chore: Fix sonar issue

* chore: Fix comment

* chore: Update to have multiple additional_bindings

* chore: Update grpcrest golden test to include httprule

* chore: HttpJsonOperationsStub's MethodDescriptors are not static

* chore: Add unit tests for HttpJson Operations logic

* chore: Resolve lint issues

* chore: Clean up test code

* chore: Resolve pr comments

* chore: Add VisibleForTesting annotation

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Mend Renovate <bot@renovateapp.com>
Co-authored-by: Blake Li <blakeli@google.com>
Co-authored-by: Mike Eltsufin <meltsufin@google.com>
Co-authored-by: Tomo Suzuki <suztomo@gmail.com>
Co-authored-by: Mridula <66699525+mpeddada1@users.noreply.github.com>
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Deepankar Dixit <90280028+ddixit14@users.noreply.github.com>
Co-authored-by: Anthonios Partheniou <partheniou@google.com>
Co-authored-by: Joe Wang <106995533+JoeWang1127@users.noreply.github.com>
Co-authored-by: Emily Wang <emmwang@google.com>
Co-authored-by: Diego Alonso Marquez Palacios <diegomarquezp@google.com>
  • Loading branch information
13 people authored Mar 10, 2023
1 parent 84036c7 commit f8ccd2a
Show file tree
Hide file tree
Showing 17 changed files with 1,528 additions and 139 deletions.
1 change: 0 additions & 1 deletion .github/workflows/ci-maven.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ jobs:
with:
java-version: 8
distribution: temurin
cache: maven
- run: java -version
- name: Run tests in Java 8 with the source compiled in Java 11 for gapic-generator-java
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ for gapic-generator-java's Bazel build.

```sh
mvn fmt:format
```
```
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,7 @@ protected List<MethodDefinition> createConstructorMethods(
if (generateOperationsStubLogic(service)) {
secondCtorExprs.addAll(
createOperationsStubInitExpr(
context,
service,
thisExpr,
operationsStubClassVarExpr,
Expand Down Expand Up @@ -758,6 +759,7 @@ protected List<MethodDefinition> createConstructorMethods(
}

protected List<Expr> createOperationsStubInitExpr(
GapicContext context,
Service service,
Expr thisExpr,
VariableExpr operationsStubClassVarExpr,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.api.generator.gapic.composer.rest;

import com.google.api.HttpRule;
import com.google.api.core.InternalApi;
import com.google.api.gax.httpjson.ApiMethodDescriptor;
import com.google.api.gax.httpjson.ApiMethodDescriptor.MethodType;
Expand Down Expand Up @@ -63,6 +64,7 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.protobuf.TypeRegistry;
import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -73,10 +75,10 @@
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class HttpJsonServiceStubClassComposer extends AbstractTransportServiceStubClassComposer {

private static final HttpJsonServiceStubClassComposer INSTANCE =
new HttpJsonServiceStubClassComposer();

Expand All @@ -89,6 +91,7 @@ public class HttpJsonServiceStubClassComposer extends AbstractTransportServiceSt
.setType(FIXED_REST_TYPESTORE.get(TypeRegistry.class.getSimpleName()))
.build())
.build();
private static final String LRO_NAME_PREFIX = "google.longrunning.Operations";

protected HttpJsonServiceStubClassComposer() {
super(RestContext.instance());
Expand All @@ -109,7 +112,9 @@ private static TypeStore createStaticTypes() {
HttpJsonCallSettings.class,
HttpJsonOperationSnapshot.class,
HttpJsonStubCallableFactory.class,
HttpRule.class,
Map.class,
ImmutableMap.class,
ProtoMessageRequestFormatter.class,
ProtoMessageResponseParser.class,
ProtoRestSerializer.class,
Expand Down Expand Up @@ -1075,6 +1080,7 @@ private List<Expr> getMethodTypeExpr(Method protoMethod) {

@Override
protected List<Expr> createOperationsStubInitExpr(
GapicContext context,
Service service,
Expr thisExpr,
VariableExpr operationsStubClassVarExpr,
Expand All @@ -1089,6 +1095,47 @@ protected List<Expr> createOperationsStubInitExpr(
arguments.add(TYPE_REGISTRY_VAR_EXPR);
}

// If the Service contains custom HttpRules for Operations, we pass a map of the custom rules to
// the Operations Client
Map<String, HttpRule> operationCustomHttpRules = parseOperationsCustomHttpRules(context);
if (operationCustomHttpRules.size() > 0) {
Expr operationCustomHttpBindingsBuilderExpr =
MethodInvocationExpr.builder()
.setStaticReferenceType(FIXED_REST_TYPESTORE.get(ImmutableMap.class.getSimpleName()))
.setMethodName("builder")
.setGenerics(
Arrays.asList(
TypeNode.STRING.reference(),
FIXED_REST_TYPESTORE.get(HttpRule.class.getSimpleName()).reference()))
.build();

// Sorting is done to ensure consistent ordering of the entries in the Custom HttpRule Map
for (String selector :
operationCustomHttpRules.keySet().stream().sorted().collect(Collectors.toList())) {
HttpRule httpRule = operationCustomHttpRules.get(selector);
Expr httpRuleBuilderExpr = createHttpRuleExpr(httpRule, true);

operationCustomHttpBindingsBuilderExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(operationCustomHttpBindingsBuilderExpr)
.setMethodName("put")
.setArguments(
Arrays.asList(
ValueExpr.withValue(StringObjectValue.withValue(selector)),
httpRuleBuilderExpr))
.build();
}

operationCustomHttpBindingsBuilderExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(operationCustomHttpBindingsBuilderExpr)
.setMethodName("build")
.setReturnType(FIXED_REST_TYPESTORE.get(ImmutableMap.class.getSimpleName()))
.build();

arguments.add(operationCustomHttpBindingsBuilderExpr);
}

return Collections.singletonList(
AssignmentExpr.builder()
.setVariableExpr(
Expand All @@ -1103,6 +1150,73 @@ protected List<Expr> createOperationsStubInitExpr(
.build());
}

/* Build an Expr that creates an HttpRule. Creates a builder and adds the http verb, custom path, and any additional bindings. `additional_bindings` can only be nested one layer deep, so we only check once */
private Expr createHttpRuleExpr(HttpRule httpRule, boolean checkAdditionalBindings) {
Expr httpRuleBuilderExpr =
MethodInvocationExpr.builder()
.setStaticReferenceType(FIXED_REST_TYPESTORE.get(HttpRule.class.getSimpleName()))
.setMethodName("newBuilder")
.build();

httpRuleBuilderExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(httpRuleBuilderExpr)
// toLowerCase as the PatternCase result is all uppercase
.setMethodName(setMethodFormat(httpRule.getPatternCase().toString().toLowerCase()))
.setArguments(
ValueExpr.withValue(
StringObjectValue.withValue(getOperationsURIValueFromHttpRule(httpRule))))
.setReturnType(FIXED_REST_TYPESTORE.get(HttpRule.class.getSimpleName()))
.build();

if (checkAdditionalBindings) {
for (HttpRule additionalBindings : httpRule.getAdditionalBindingsList()) {
httpRuleBuilderExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(httpRuleBuilderExpr)
.setMethodName("addAdditionalBindings")
.setArguments(Arrays.asList(createHttpRuleExpr(additionalBindings, false)))
.build();
}
}

httpRuleBuilderExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(httpRuleBuilderExpr)
.setMethodName("build")
.setReturnType(FIXED_REST_TYPESTORE.get(HttpRule.class.getSimpleName()))
.build();
return httpRuleBuilderExpr;
}

/* Parses the Service Yaml file's for custom HttpRules. Filter the HttpRules for ones that match Operations */
Map<String, HttpRule> parseOperationsCustomHttpRules(GapicContext context) {
Predicate<HttpRule> predicate = x -> x.getSelector().contains(LRO_NAME_PREFIX);
com.google.api.Service service = context.serviceYamlProto();
if (service == null || service.getHttp() == null) {
return ImmutableMap.of();
}
return service.getHttp().getRulesList().stream()
.filter(predicate)
.collect(Collectors.toMap(HttpRule::getSelector, x -> x));
}

/* This is meant to be used for the OperationsClient Mixin OperationsClient's RPCs are mapped to GET/POST/DELETE and this function only expects those HttpVerbs to be used */
String getOperationsURIValueFromHttpRule(HttpRule httpRule) {
switch (httpRule.getPatternCase().getNumber()) {
case 2:
return httpRule.getGet();
case 4:
return httpRule.getPost();
case 5:
return httpRule.getDelete();
default:
throw new IllegalArgumentException(
"Operations HttpRule should only contain GET/POST/DELETE. Invalid: "
+ httpRule.getSelector());
}
}

@Override
protected List<Statement> createLongRunningClient(Service service, TypeStore typeStore) {
Method pollingMethod = service.operationPollingMethod();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.api.generator.gapic.composer.grpcrest;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

Expand All @@ -26,6 +27,7 @@
import com.google.api.generator.gapic.model.Transport;
import com.google.api.generator.gapic.protoparser.Parser;
import com.google.api.generator.gapic.protoparser.ServiceConfigParser;
import com.google.api.generator.gapic.protoparser.ServiceYamlParser;
import com.google.longrunning.OperationsProto;
import com.google.protobuf.Descriptors.FileDescriptor;
import com.google.protobuf.Descriptors.ServiceDescriptor;
Expand Down Expand Up @@ -58,6 +60,13 @@ public GapicContext parseShowcaseEcho() {
ServiceDescriptor echoServiceDescriptor = echoFileDescriptor.getServices().get(0);
assertEquals("Echo", echoServiceDescriptor.getName());

String serviceYamlFileName = "echo_v1beta1.yaml";
Path serviceYamlPath = Paths.get(getTestFilesDirectory(), serviceYamlFileName);
Optional<com.google.api.Service> serviceYamlOpt =
ServiceYamlParser.parse(serviceYamlPath.toString());
assertThat(serviceYamlOpt.isPresent()).isTrue();
com.google.api.Service service = serviceYamlOpt.get();

Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
messageTypes.putAll(Parser.parseMessages(OperationsProto.getDescriptor()));
messageTypes.putAll(Parser.parseMessages(StructProto.getDescriptor()));
Expand All @@ -66,7 +75,7 @@ public GapicContext parseShowcaseEcho() {
Set<ResourceName> outputResourceNames = new HashSet<>();
List<Service> services =
Parser.parseService(
echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames);
echoFileDescriptor, messageTypes, resourceNames, serviceYamlOpt, outputResourceNames);

String jsonFilename = "showcase_grpc_service_config.json";
Path jsonPath = Paths.get(getTestFilesDirectory(), jsonFilename);
Expand All @@ -79,6 +88,7 @@ public GapicContext parseShowcaseEcho() {
.setResourceNames(resourceNames)
.setServices(services)
.setServiceConfig(config)
.setServiceYamlProto(service)
.setHelperResourceNames(outputResourceNames)
.setTransport(getTransport())
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.google.showcase.grpcrest.v1beta1.stub;
import static com.google.showcase.grpcrest.v1beta1.EchoClient.PagedExpandPagedResponse;
import static com.google.showcase.grpcrest.v1beta1.EchoClient.SimplePagedExpandPagedResponse;

import com.google.api.HttpRule;
import com.google.api.core.BetaApi;
import com.google.api.core.InternalApi;
import com.google.api.gax.core.BackgroundResource;
Expand All @@ -21,6 +22,7 @@ import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.OperationCallable;
import com.google.api.gax.rpc.ServerStreamingCallable;
import com.google.api.gax.rpc.UnaryCallable;
import com.google.common.collect.ImmutableMap;
import com.google.longrunning.Operation;
import com.google.protobuf.TypeRegistry;
import com.google.showcase.grpcrest.v1beta1.BlockRequest;
Expand Down Expand Up @@ -382,7 +384,56 @@ public class HttpJsonEchoStub extends EchoStub {
throws IOException {
this.callableFactory = callableFactory;
this.httpJsonOperationsStub =
HttpJsonOperationsStub.create(clientContext, callableFactory, typeRegistry);
HttpJsonOperationsStub.create(
clientContext,
callableFactory,
typeRegistry,
ImmutableMap.<String, HttpRule>builder()
.put(
"google.longrunning.Operations.CancelOperation",
HttpRule.newBuilder()
.setPost("/v1beta1/{name=operations/**}:cancel")
.addAdditionalBindings(
HttpRule.newBuilder()
.setPost("/v1beta2/{name=operations/**}:cancel")
.build())
.addAdditionalBindings(
HttpRule.newBuilder()
.setPost("/v1beta3/{name=operations/**}:cancel")
.build())
.build())
.put(
"google.longrunning.Operations.DeleteOperation",
HttpRule.newBuilder()
.setDelete("/v1beta1/{name=operations/**}")
.addAdditionalBindings(
HttpRule.newBuilder()
.setDelete("/v1beta2/{name=operations/**}")
.build())
.addAdditionalBindings(
HttpRule.newBuilder()
.setDelete("/v1beta3/{name=operations/**}")
.build())
.build())
.put(
"google.longrunning.Operations.GetOperation",
HttpRule.newBuilder()
.setGet("/v1beta1/{name=operations/**}")
.addAdditionalBindings(
HttpRule.newBuilder().setGet("/v1beta2/{name=operations/**}").build())
.addAdditionalBindings(
HttpRule.newBuilder().setGet("/v1beta3/{name=operations/**}").build())
.build())
.put(
"google.longrunning.Operations.ListOperations",
HttpRule.newBuilder()
.setGet("/v1beta1/operations")
.addAdditionalBindings(
HttpRule.newBuilder().setGet("/v1beta2/operations").build())
.addAdditionalBindings(
HttpRule.newBuilder().setGet("/v1beta3/operations").build())
.build())
.build());

HttpJsonCallSettings<EchoRequest, EchoResponse> echoTransportSettings =
HttpJsonCallSettings.<EchoRequest, EchoResponse>newBuilder()
Expand Down
Loading

0 comments on commit f8ccd2a

Please sign in to comment.