From 00d4de3adb98bb74fa4d0e24c0268aa36ff06e4d Mon Sep 17 00:00:00 2001 From: Kirill Logachev Date: Fri, 20 Feb 2026 19:12:17 +0000 Subject: [PATCH 1/3] chore: add containsKey override for GenericData class --- .../com/google/api/client/util/ClassInfo.java | 17 +++++++++++++++++ .../com/google/api/client/util/GenericData.java | 16 ++++++++++++++++ .../google/api/client/util/ClassInfoTest.java | 9 +++++++++ .../google/api/client/util/GenericDataTest.java | 4 ++++ 4 files changed, 46 insertions(+) diff --git a/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java b/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java index f11f6ffb0..d6d26a37b 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java +++ b/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java @@ -112,6 +112,23 @@ public final boolean getIgnoreCase() { return ignoreCase; } + /** + * Returns whether information for the given {@link FieldInfo#getName()} + * is available. + * + * @param name {@link FieldInfo#getName()} or {@code null} + * @return true if field info is available. + */ + public boolean hasFieldInfo(String name) { + if (name != null) { + if (ignoreCase) { + name = name.toLowerCase(Locale.US); + } + name = name.intern(); + } + return nameToFieldInfoMap.containsKey(name); + } + /** * Returns the information for the given {@link FieldInfo#getName()}. * diff --git a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java index 5ba12fe47..f452346b1 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java +++ b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java @@ -74,6 +74,22 @@ public GenericData(EnumSet flags) { classInfo = ClassInfo.of(getClass(), flags.contains(Flags.IGNORE_CASE)); } + @Override + public final boolean containsKey(Object name) { + if (!(name instanceof String)) { + return false; + } + String fieldName = (String) name; + FieldInfo fieldInfo = classInfo.getFieldInfo(fieldName); + if (fieldInfo != null) { + return true; + } + if (classInfo.getIgnoreCase()) { + fieldName = fieldName.toLowerCase(Locale.US); + } + return unknownFields.containsKey(fieldName); + } + @Override public final Object get(Object name) { if (!(name instanceof String)) { diff --git a/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java b/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java index d5e51d120..62d9fbcf8 100644 --- a/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java +++ b/google-http-client/src/test/java/com/google/api/client/util/ClassInfoTest.java @@ -58,6 +58,15 @@ public void testGetFieldInfo_enum() throws Exception { assertEquals(E.class.getField("VALUE"), classInfo.getFieldInfo("VALUE").getField()); } + @Test + public void testHasFieldInfo_enum() throws Exception { + ClassInfo classInfo = ClassInfo.of(E.class); + assertFalse(classInfo.hasFieldInfo("wrong")); + assertTrue(classInfo.hasFieldInfo(null)); + assertTrue(classInfo.hasFieldInfo("other")); + assertTrue(classInfo.hasFieldInfo("VALUE")); + } + public class A { @Key String b; diff --git a/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java b/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java index 3b823d411..fd6547bb6 100644 --- a/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java +++ b/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java @@ -156,6 +156,7 @@ public void testPutIgnoreCase_class() { public void testGetIgnoreCase_class() { MyData data = new MyData(); data.fieldA = "someValue"; + assertTrue(data.containsKey("FIELDA")); assertEquals("someValue", data.get("FIELDA")); } @@ -187,11 +188,14 @@ public void testPutIgnoreCase_unknownKey() { public void testGetIgnoreCase_unknownKey() { GenericData data = new GenericData(EnumSet.of(Flags.IGNORE_CASE)); data.set("One", 1); + assertTrue(data.containsKey("ONE")); assertEquals(1, data.get("ONE")); data.set("one", 2); + assertTrue(data.containsKey("ONE")); assertEquals(2, data.get("ONE")); + assertFalse(data.containsKey("unknownKey")); assertEquals(null, data.get("unknownKey")); } From 03eff82fdffbf4fdd863560409be71f381f02f4f Mon Sep 17 00:00:00 2001 From: Kirill Logachev Date: Fri, 20 Feb 2026 19:32:36 +0000 Subject: [PATCH 2/3] lint --- .../src/main/java/com/google/api/client/util/ClassInfo.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java b/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java index d6d26a37b..90c50058f 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java +++ b/google-http-client/src/main/java/com/google/api/client/util/ClassInfo.java @@ -113,8 +113,7 @@ public final boolean getIgnoreCase() { } /** - * Returns whether information for the given {@link FieldInfo#getName()} - * is available. + * Returns whether information for the given {@link FieldInfo#getName()} is available. * * @param name {@link FieldInfo#getName()} or {@code null} * @return true if field info is available. @@ -128,7 +127,7 @@ public boolean hasFieldInfo(String name) { } return nameToFieldInfoMap.containsKey(name); } - + /** * Returns the information for the given {@link FieldInfo#getName()}. * From 25acd03cd0f78ba4f1d5d02bc73c5f04d25e614f Mon Sep 17 00:00:00 2001 From: Kirill Logachev Date: Fri, 20 Feb 2026 20:15:11 +0000 Subject: [PATCH 3/3] fix containsKey to use hasFieldInfo --- .../src/main/java/com/google/api/client/util/GenericData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java index f452346b1..c6635f89e 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java +++ b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java @@ -80,8 +80,8 @@ public final boolean containsKey(Object name) { return false; } String fieldName = (String) name; - FieldInfo fieldInfo = classInfo.getFieldInfo(fieldName); - if (fieldInfo != null) { + boolean hasFieldInfo = classInfo.hasFieldInfo(fieldName); + if (hasFieldInfo) { return true; } if (classInfo.getIgnoreCase()) {