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..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 @@ -112,6 +112,22 @@ 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..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 @@ -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; + boolean hasFieldInfo = classInfo.hasFieldInfo(fieldName); + if (hasFieldInfo) { + 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")); }