diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index c1e4d2da2..288e39489 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:a57d2ea6d1a77aa96c17ad0850b779ec6295f88b6c1da3d214b2095d140a2066 + digest: sha256:9de537d592b60e5eac73b374a28263969bae91ecdb29b445e894576fbf54851c diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg index a3f7fb9d4..e20330c3c 100644 --- a/.kokoro/presubmit/graalvm-native-17.cfg +++ b/.kokoro/presubmit/graalvm-native-17.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/graalvm17" + value: "gcr.io/cloud-devrel-kokoro-resources/graalvm17:22.3.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native.cfg b/.kokoro/presubmit/graalvm-native.cfg index 4c7225ec9..0fd6ba2fa 100644 --- a/.kokoro/presubmit/graalvm-native.cfg +++ b/.kokoro/presubmit/graalvm-native.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-kokoro-resources/graalvm" + value: "gcr.io/cloud-devrel-kokoro-resources/graalvm:22.3.0" } env_vars: { diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index 924f94ae6..a5010f77d 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -17,7 +17,7 @@ pycparser==2.21 pyperclip==1.8.2 python-dateutil==2.8.2 requests==2.27.1 -certifi==2022.9.24 +certifi==2022.12.7 importlib-metadata==4.8.3 zipp==3.6.0 google_api_core==2.8.2 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 71fcafc70..15c404aa5 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -16,9 +16,9 @@ cachetools==4.2.4 \ # via # -r requirements.in # google-auth -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via # -r requirements.in # requests diff --git a/CHANGELOG.md b/CHANGELOG.md index f58b8a828..d8965cc05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.1.2](https://github.com/googleapis/google-api-java-client/compare/v2.1.1...v2.1.2) (2023-01-03) + + +### Bug Fixes + +* Make Details field extends GenericJson so that GoogleJsonError should include any arbitrary error info from services ([#2210](https://github.com/googleapis/google-api-java-client/issues/2210)) ([60939b1](https://github.com/googleapis/google-api-java-client/commit/60939b19a8ab267846a7ec070e469d4b32c3c201)) + ## [2.1.1](https://github.com/googleapis/google-api-java-client/compare/v2.1.0...v2.1.1) (2022-12-02) diff --git a/google-api-client-android/pom.xml b/google-api-client-android/pom.xml index 71225227c..99fbe5f3f 100644 --- a/google-api-client-android/pom.xml +++ b/google-api-client-android/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-android diff --git a/google-api-client-appengine/pom.xml b/google-api-client-appengine/pom.xml index e4b7ba90f..ea6ec4215 100644 --- a/google-api-client-appengine/pom.xml +++ b/google-api-client-appengine/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-appengine diff --git a/google-api-client-assembly/pom.xml b/google-api-client-assembly/pom.xml index b2a7ecd29..327335e63 100644 --- a/google-api-client-assembly/pom.xml +++ b/google-api-client-assembly/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml com.google.api-client diff --git a/google-api-client-bom/pom.xml b/google-api-client-bom/pom.xml index 2e391841a..75e975003 100644 --- a/google-api-client-bom/pom.xml +++ b/google-api-client-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.api-client google-api-client-bom - 2.1.1 + 2.1.2 pom Google API Client Library for Java BOM @@ -63,53 +63,53 @@ com.google.api-client google-api-client - 2.1.1 + 2.1.2 com.google.api-client google-api-client-android - 2.1.1 + 2.1.2 com.google.api-client google-api-client-appengine - 2.1.1 + 2.1.2 com.google.api-client google-api-client-assembly - 2.1.1 + 2.1.2 pom com.google.api-client google-api-client-gson - 2.1.1 + 2.1.2 com.google.api-client google-api-client-jackson2 - 2.1.1 + 2.1.2 com.google.api-client google-api-client-java6 - 2.1.1 + 2.1.2 com.google.api-client google-api-client-protobuf - 2.1.1 + 2.1.2 com.google.api-client google-api-client-servlet - 2.1.1 + 2.1.2 com.google.api-client google-api-client-xml - 2.1.1 + 2.1.2 diff --git a/google-api-client-gson/pom.xml b/google-api-client-gson/pom.xml index fc354bfd5..8c8dd5c07 100644 --- a/google-api-client-gson/pom.xml +++ b/google-api-client-gson/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-gson diff --git a/google-api-client-jackson2/pom.xml b/google-api-client-jackson2/pom.xml index 5844cf486..a7a7c4b2c 100644 --- a/google-api-client-jackson2/pom.xml +++ b/google-api-client-jackson2/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-jackson2 diff --git a/google-api-client-java6/pom.xml b/google-api-client-java6/pom.xml index b4629835c..08dfa99cf 100644 --- a/google-api-client-java6/pom.xml +++ b/google-api-client-java6/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-java6 diff --git a/google-api-client-protobuf/pom.xml b/google-api-client-protobuf/pom.xml index cc0732f9c..1f10ce4c6 100644 --- a/google-api-client-protobuf/pom.xml +++ b/google-api-client-protobuf/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-protobuf diff --git a/google-api-client-servlet/pom.xml b/google-api-client-servlet/pom.xml index eba6916fc..5ad7b47f7 100644 --- a/google-api-client-servlet/pom.xml +++ b/google-api-client-servlet/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-servlet diff --git a/google-api-client-xml/pom.xml b/google-api-client-xml/pom.xml index 977bd7ec6..548cbb9e8 100644 --- a/google-api-client-xml/pom.xml +++ b/google-api-client-xml/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client-xml diff --git a/google-api-client/pom.xml b/google-api-client/pom.xml index 3d4a7d3c8..477e89299 100644 --- a/google-api-client/pom.xml +++ b/google-api-client/pom.xml @@ -4,7 +4,7 @@ com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 ../pom.xml google-api-client @@ -159,6 +159,11 @@ com.google.http-client google-http-client + + com.google.code.gson + gson + test + com.google.protobuf protobuf-java diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java b/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java index c0f0eb86b..dadd172fb 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java @@ -184,7 +184,7 @@ public ErrorInfo clone() { } } - public static class Details { + public static class Details extends GenericJson { @Key("@type") private String type; diff --git a/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java b/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java index c988804a6..380114aee 100644 --- a/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java +++ b/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java @@ -28,6 +28,7 @@ import com.google.api.client.testing.http.MockLowLevelHttpRequest; import com.google.api.client.testing.http.MockLowLevelHttpResponse; import java.io.InputStream; +import java.io.InputStreamReader; import junit.framework.TestCase; /** @@ -37,6 +38,7 @@ */ public class GoogleJsonErrorTest extends TestCase { + public static final com.google.gson.JsonParser JSON_PARSER = new com.google.gson.JsonParser(); static final JsonFactory FACTORY = new GsonFactory(); static final String ERROR = "{" @@ -93,6 +95,32 @@ public void testParse() throws Exception { assertEquals(ERROR, FACTORY.toString(errorResponse)); } + public void testParse_withMultipleErrorTypesInDetails() throws Exception { + InputStream errorResponseStream = + GoogleJsonErrorTest.class.getResourceAsStream( + "errorResponseWithMultipleTypesInDetails.json"); + + InputStream expectedParsedErrorResponse = + GoogleJsonErrorTest.class.getResourceAsStream( + "expectedParsedErrorWithMultipleTypesInDetails.json"); + + HttpTransport transport = + new ErrorTransport( + new MockLowLevelHttpResponse() + .setContent(errorResponseStream) + .setContentType(Json.MEDIA_TYPE) + .setStatusCode(HttpStatusCodes.STATUS_CODE_FORBIDDEN)); + HttpRequest request = + transport.createRequestFactory().buildGetRequest(HttpTesting.SIMPLE_GENERIC_URL); + request.setThrowExceptionOnExecuteError(false); + HttpResponse response = request.execute(); + com.google.api.client.googleapis.json.GoogleJsonError actualParsedErrorResponse = + com.google.api.client.googleapis.json.GoogleJsonError.parse(FACTORY, response); + assertEquals( + JSON_PARSER.parse(new InputStreamReader(expectedParsedErrorResponse)), + JSON_PARSER.parse(FACTORY.toString(actualParsedErrorResponse))); + } + public void testParse_withDetails() throws Exception { String DETAILS_ERROR = "{" @@ -122,7 +150,8 @@ public void testParse_withDetails() throws Exception { com.google.api.client.googleapis.json.GoogleJsonError errorResponse = com.google.api.client.googleapis.json.GoogleJsonError.parse(FACTORY, response); - assertEquals(DETAILS_ERROR, FACTORY.toString(errorResponse)); + assertEquals( + JSON_PARSER.parse(DETAILS_ERROR), JSON_PARSER.parse(FACTORY.toString(errorResponse))); assertNotNull(errorResponse.getDetails()); } @@ -166,7 +195,8 @@ public void testParse_withReasonInDetails() throws Exception { com.google.api.client.googleapis.json.GoogleJsonError errorResponse = com.google.api.client.googleapis.json.GoogleJsonError.parse(FACTORY, response); - assertEquals(DETAILS_ERROR, FACTORY.toString(errorResponse)); + assertEquals( + JSON_PARSER.parse(DETAILS_ERROR), JSON_PARSER.parse(FACTORY.toString(errorResponse))); assertNotNull(errorResponse.getDetails().get(2).getReason()); } } diff --git a/google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorResponseWithMultipleTypesInDetails.json b/google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorResponseWithMultipleTypesInDetails.json new file mode 100644 index 000000000..fc2826ac3 --- /dev/null +++ b/google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorResponseWithMultipleTypesInDetails.json @@ -0,0 +1,65 @@ +{ + "error": { + "code": 400, + "message": "The template parameters are invalid.", + "status": "INVALID_ARGUMENT", + "details": [ + { + "@type": "type.googleapis.com/google.dataflow.v1beta3.InvalidTemplateParameters", + "reason": "TEST REASON 1", + "parameterViolations": [ + { + "parameter": "safeBrowsingApiKey", + "description": "Parameter didn't match regex '^[0-9a-zA-Z_]+$'" + } + ] + }, + { + "@type": "type.googleapis.com/google.rpc.DebugInfo", + "detail": "test detail" + }, + { + "@type": "type.googleapis.com/google.rpc.DebugInfo", + "reason": "test reason 2" + }, + { + "@type": "type.googleapis.com/google.rpc.BadRequest", + "fieldViolations": [ + { + "field": "language_code", + "description": "Field is required" + } + ] + }, + { + "@type": "type.googleapis.com/google.chrome.policy.v1.PolicyModificationErrorDetails", + "modificationErrors": [ + { + "policyTargetKey": { + "targetResource": "orgunits/03ph8a2z19ryqq8" + }, + "policySchema": "chrome.users.BrowserThemeColor", + "fieldErrors": [ + { + "field": "browserThemeColor", + "error": "Field is an invalid hex color. Only the numbers 0-9 and letters A-F are permitted." + } + ] + } + ] + }, + { + "@type": "type.googleapis.com/google.mybusiness.v4.ValidationError", + "errorDetails": [ + { + "code": 3, + "field": "regular_hours.periods.close_time", + "message": "Time field must follow hh:mm format.", + "value": "25:00" + } + ] + } + ] + } +} + diff --git a/google-api-client/src/test/resources/com/google/api/client/googleapis/json/expectedParsedErrorWithMultipleTypesInDetails.json b/google-api-client/src/test/resources/com/google/api/client/googleapis/json/expectedParsedErrorWithMultipleTypesInDetails.json new file mode 100644 index 000000000..7cbf42e74 --- /dev/null +++ b/google-api-client/src/test/resources/com/google/api/client/googleapis/json/expectedParsedErrorWithMultipleTypesInDetails.json @@ -0,0 +1,63 @@ +{ + "code": 400, + "message": "The template parameters are invalid.", + "status": "INVALID_ARGUMENT", + "details": [ + { + "@type": "type.googleapis.com/google.dataflow.v1beta3.InvalidTemplateParameters", + "reason": "TEST REASON 1", + "parameterViolations": [ + { + "parameter": "safeBrowsingApiKey", + "description": "Parameter didn't match regex '^[0-9a-zA-Z_]+$'" + } + ] + }, + { + "@type": "type.googleapis.com/google.rpc.DebugInfo", + "detail": "test detail" + }, + { + "@type": "type.googleapis.com/google.rpc.DebugInfo", + "reason": "test reason 2" + }, + { + "@type": "type.googleapis.com/google.rpc.BadRequest", + "fieldViolations": [ + { + "field": "language_code", + "description": "Field is required" + } + ] + }, + { + "@type": "type.googleapis.com/google.chrome.policy.v1.PolicyModificationErrorDetails", + "modificationErrors": [ + { + "policyTargetKey": { + "targetResource": "orgunits/03ph8a2z19ryqq8" + }, + "policySchema": "chrome.users.BrowserThemeColor", + "fieldErrors": [ + { + "field": "browserThemeColor", + "error": "Field is an invalid hex color. Only the numbers 0-9 and letters A-F are permitted." + } + ] + } + ] + }, + { + "@type": "type.googleapis.com/google.mybusiness.v4.ValidationError", + "errorDetails": [ + { + "code": 3, + "field": "regular_hours.periods.close_time", + "message": "Time field must follow hh:mm format.", + "value": "25:00" + } + ] + } + ] +} + diff --git a/pom.xml b/pom.xml index c78da74f1..ecf8edabc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.google.api-client google-api-client-parent - 2.1.1 + 2.1.2 pom Parent for the Google API Client Library for Java The Google APIs Client Library for Java is a Java client library @@ -222,6 +222,12 @@ ${project.protobuf-java.version} test + + com.google.code.gson + gson + ${gson.version} + test + @@ -337,7 +343,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.3.0 + 3.4.0 @@ -515,6 +521,7 @@ 4.0.3 2.5 false + 2.10 diff --git a/versions.txt b/versions.txt index 1343bf64d..60034d20d 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -google-api-client:2.1.1:2.1.1 +google-api-client:2.1.2:2.1.2