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