Skip to content

Commit cb89423

Browse files
committed
address comments
1 parent c7d9508 commit cb89423

File tree

4 files changed

+49
-45
lines changed

4 files changed

+49
-45
lines changed

firebase-firestore/src/main/java/com/google/firebase/firestore/DocumentSnapshot.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public <T> T toObject(
202202
Map<String, Object> data = getData(serverTimestampBehavior);
203203
return data == null
204204
? null
205-
: CustomClassMapper.convertToCustomClass(data, valueType, key.getPath().getLastSegment());
205+
: CustomClassMapper.convertToCustomClass(data, valueType, getReference());
206206
}
207207

208208
/**
@@ -357,7 +357,7 @@ public <T> T get(
357357
Object data = get(fieldPath, serverTimestampBehavior);
358358
return data == null
359359
? null
360-
: CustomClassMapper.convertToCustomClass(data, valueType, key.getPath().getFirstSegment());
360+
: CustomClassMapper.convertToCustomClass(data, valueType, getReference());
361361
}
362362

363363
/**

firebase-firestore/src/main/java/com/google/firebase/firestore/util/CustomClassMapper.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@ public static Map<String, Object> convertToPlainJavaTypes(Map<?, Object> update)
9191
*
9292
* @param object The representation of the JSON data
9393
* @param clazz The class of the object to convert to
94-
* @param documentId The value to set to {@link com.google.firebase.firestore.DocumentId}
95-
* annotated fields in the custom class.
94+
* @param docRef The value to set to {@link DocumentId} annotated fields in the custom class.
9695
* @return The POJO object.
9796
*/
98-
public static <T> T convertToCustomClass(Object object, Class<T> clazz, String documentId) {
99-
// TODO: Use DeserializeContext to encapsulate ErrorPath and documentId.
97+
public static <T> T convertToCustomClass(
98+
Object object, Class<T> clazz, DocumentReference docRef) {
99+
// TODO: Use DeserializeContext to encapsulate ErrorPath and docRef.
100100
return deserializeToClass(object, clazz, ErrorPath.EMPTY);
101101
}
102102

firebase-firestore/src/main/java/com/google/firebase/firestore/DocumentId.java renamed to firebase-firestore/src/main/java/com/google/firebase/firestore/util/DocumentId.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
package com.google.firebase.firestore;
15+
package com.google.firebase.firestore.util;
1616

1717
import com.google.firebase.annotations.PublicApi;
18+
import com.google.firebase.firestore.DocumentReference;
19+
import com.google.firebase.firestore.DocumentSnapshot;
1820
import java.lang.annotation.ElementType;
1921
import java.lang.annotation.Retention;
2022
import java.lang.annotation.RetentionPolicy;
@@ -27,8 +29,8 @@
2729
* <p>This annotation can only be applied to fields of String or {@link DocumentReference},
2830
* otherwise a runtime exception will be thrown.
2931
*
30-
* <p>When writing a POJO to Firestore, the @DocumentId-annotated field must either be null or match
31-
* the document ID of the document being written to, else a runtime exception will be thrown.
32+
* <p>When writing a POJO to Firestore, the @DocumentId-annotated field will be ignored, to allow
33+
* writing to any documents that are not the origin of the POJO.
3234
*/
3335
@PublicApi
3436
@Retention(RetentionPolicy.RUNTIME)

firebase-firestore/src/test/java/com/google/firebase/firestore/util/MapperTest.java

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.junit.Assert.assertNull;
2222
import static org.junit.Assert.fail;
2323

24+
import com.google.firebase.firestore.DocumentReference;
2425
import com.google.firebase.firestore.Exclude;
2526
import com.google.firebase.firestore.PropertyName;
2627
import com.google.firebase.firestore.ThrowOnExtraProperties;
@@ -919,6 +920,15 @@ private static void assertExceptionContains(String partialMessage, Runnable run)
919920
}
920921
}
921922

923+
private static <T> T convertToCustomClass(
924+
Object object, Class<T> clazz, DocumentReference docRef) {
925+
return CustomClassMapper.convertToCustomClass(object, clazz, docRef);
926+
}
927+
928+
private static <T> T convertToCustomClass(Object object, Class<T> clazz) {
929+
return CustomClassMapper.convertToCustomClass(object, clazz, null);
930+
}
931+
922932
@Test
923933
public void primitiveDeserializeString() {
924934
StringBean bean = deserialize("{'value': 'foo'}", StringBean.class);
@@ -1339,8 +1349,7 @@ public void beansCanContainMaps() {
13391349
public void beansCanContainUpperBoundedMaps() {
13401350
Date date = new Date(1491847082123L);
13411351
Map<String, Object> source = map("values", map("foo", date));
1342-
UpperBoundedMapBean bean =
1343-
CustomClassMapper.convertToCustomClass(source, UpperBoundedMapBean.class, null);
1352+
UpperBoundedMapBean bean = convertToCustomClass(source, UpperBoundedMapBean.class);
13441353
Map<String, Object> expected = map("foo", date);
13451354
assertEquals(expected, bean.values);
13461355
}
@@ -1349,8 +1358,7 @@ public void beansCanContainUpperBoundedMaps() {
13491358
public void beansCanContainMultiBoundedMaps() {
13501359
Date date = new Date(1491847082123L);
13511360
Map<String, Object> source = map("map", map("values", map("foo", date)));
1352-
MultiBoundedMapHolderBean bean =
1353-
CustomClassMapper.convertToCustomClass(source, MultiBoundedMapHolderBean.class, null);
1361+
MultiBoundedMapHolderBean bean = convertToCustomClass(source, MultiBoundedMapHolderBean.class);
13541362

13551363
Map<String, Object> expected = map("foo", date);
13561364
assertEquals(expected, bean.map.values);
@@ -1367,8 +1375,7 @@ public void beansCanContainUnboundedMaps() {
13671375
public void beansCanContainUnboundedTypeVariableMaps() {
13681376
Map<String, Object> source = map("map", map("values", map("foo", "bar")));
13691377
UnboundedTypeVariableMapHolderBean bean =
1370-
CustomClassMapper.convertToCustomClass(
1371-
source, UnboundedTypeVariableMapHolderBean.class, null);
1378+
convertToCustomClass(source, UnboundedTypeVariableMapHolderBean.class);
13721379

13731380
Map<String, Object> expected = map("foo", "bar");
13741381
assertEquals(expected, bean.map.values);
@@ -1824,65 +1831,60 @@ public void objectAcceptsAnyObject() {
18241831

18251832
@Test
18261833
public void objectClassCanBePassedInAtTopLevel() {
1827-
assertEquals("foo", CustomClassMapper.convertToCustomClass("foo", Object.class, null));
1828-
assertEquals(1, CustomClassMapper.convertToCustomClass(1, Object.class, null));
1829-
assertEquals(1L, CustomClassMapper.convertToCustomClass(1L, Object.class, null));
1830-
assertEquals(true, CustomClassMapper.convertToCustomClass(true, Object.class, null));
1831-
assertEquals(1.1, CustomClassMapper.convertToCustomClass(1.1, Object.class, null));
1834+
assertEquals("foo", convertToCustomClass("foo", Object.class));
1835+
assertEquals(1, convertToCustomClass(1, Object.class));
1836+
assertEquals(1L, convertToCustomClass(1L, Object.class));
1837+
assertEquals(true, convertToCustomClass(true, Object.class));
1838+
assertEquals(1.1, convertToCustomClass(1.1, Object.class));
18321839
List<String> fooList = Collections.singletonList("foo");
1833-
assertEquals(fooList, CustomClassMapper.convertToCustomClass(fooList, Object.class, null));
1840+
assertEquals(fooList, convertToCustomClass(fooList, Object.class));
18341841
Map<String, String> fooMap = Collections.singletonMap("foo", "bar");
1835-
assertEquals(fooMap, CustomClassMapper.convertToCustomClass(fooMap, Object.class, null));
1842+
assertEquals(fooMap, convertToCustomClass(fooMap, Object.class));
18361843
}
18371844

18381845
@Test
18391846
public void primitiveClassesCanBePassedInTopLevel() {
1840-
assertEquals("foo", CustomClassMapper.convertToCustomClass("foo", String.class, null));
1841-
assertEquals((Integer) 1, CustomClassMapper.convertToCustomClass(1, Integer.class, null));
1842-
assertEquals((Long) 1L, CustomClassMapper.convertToCustomClass(1L, Long.class, null));
1843-
assertEquals(true, CustomClassMapper.convertToCustomClass(true, Boolean.class, null));
1844-
assertEquals((Double) 1.1, CustomClassMapper.convertToCustomClass(1.1, Double.class, null));
1847+
assertEquals("foo", convertToCustomClass("foo", String.class));
1848+
assertEquals((Integer) 1, convertToCustomClass(1, Integer.class));
1849+
assertEquals((Long) 1L, convertToCustomClass(1L, Long.class));
1850+
assertEquals(true, convertToCustomClass(true, Boolean.class));
1851+
assertEquals((Double) 1.1, convertToCustomClass(1.1, Double.class));
18451852
}
18461853

18471854
@Test
18481855
public void passingInListTopLevelThrows() {
18491856
assertExceptionContains(
18501857
"Class java.util.List has generic type parameters, please use GenericTypeIndicator "
18511858
+ "instead",
1852-
() ->
1853-
CustomClassMapper.convertToCustomClass(
1854-
Collections.singletonList("foo"), List.class, null));
1859+
() -> convertToCustomClass(Collections.singletonList("foo"), List.class));
18551860
}
18561861

18571862
@Test
18581863
public void passingInMapTopLevelThrows() {
18591864
assertExceptionContains(
18601865
"Class java.util.Map has generic type parameters, please use GenericTypeIndicator "
18611866
+ "instead",
1862-
() ->
1863-
CustomClassMapper.convertToCustomClass(
1864-
Collections.singletonMap("foo", "bar"), Map.class, null));
1867+
() -> convertToCustomClass(Collections.singletonMap("foo", "bar"), Map.class));
18651868
}
18661869

18671870
@Test
18681871
public void passingInCharacterTopLevelThrows() {
18691872
assertExceptionContains(
18701873
"Deserializing values to Character is not supported",
1871-
() -> CustomClassMapper.convertToCustomClass('1', Character.class, null));
1874+
() -> convertToCustomClass('1', Character.class));
18721875
}
18731876

18741877
@Test
18751878
public void passingInShortTopLevelThrows() {
18761879
assertExceptionContains(
18771880
"Deserializing values to Short is not supported",
1878-
() -> CustomClassMapper.convertToCustomClass(1, Short.class, null));
1881+
() -> convertToCustomClass(1, Short.class));
18791882
}
18801883

18811884
@Test
18821885
public void passingInByteTopLevelThrows() {
18831886
assertExceptionContains(
1884-
"Deserializing values to Byte is not supported",
1885-
() -> CustomClassMapper.convertToCustomClass(1, Byte.class, null));
1887+
"Deserializing values to Byte is not supported", () -> convertToCustomClass(1, Byte.class));
18861888
}
18871889

18881890
@Test
@@ -1919,13 +1921,13 @@ public void collectionsCantBeDeserialized() {
19191921

19201922
@Test
19211923
public void allowNullEverywhere() {
1922-
assertNull(CustomClassMapper.convertToCustomClass(null, Integer.class, null));
1923-
assertNull(CustomClassMapper.convertToCustomClass(null, String.class, null));
1924-
assertNull(CustomClassMapper.convertToCustomClass(null, Double.class, null));
1925-
assertNull(CustomClassMapper.convertToCustomClass(null, Long.class, null));
1926-
assertNull(CustomClassMapper.convertToCustomClass(null, Boolean.class, null));
1927-
assertNull(CustomClassMapper.convertToCustomClass(null, StringBean.class, null));
1928-
assertNull(CustomClassMapper.convertToCustomClass(null, Object.class, null));
1924+
assertNull(convertToCustomClass(null, Integer.class));
1925+
assertNull(convertToCustomClass(null, String.class));
1926+
assertNull(convertToCustomClass(null, Double.class));
1927+
assertNull(convertToCustomClass(null, Long.class));
1928+
assertNull(convertToCustomClass(null, Boolean.class));
1929+
assertNull(convertToCustomClass(null, StringBean.class));
1930+
assertNull(convertToCustomClass(null, Object.class));
19291931
}
19301932

19311933
@Test
@@ -2236,7 +2238,7 @@ public void deserializationFailureIncludesPath() {
22362238
Object serialized = Collections.singletonMap("value", (short) 1);
22372239

22382240
try {
2239-
CustomClassMapper.convertToCustomClass(serialized, ShortBean.class, null);
2241+
convertToCustomClass(serialized, ShortBean.class);
22402242
fail("should have thrown");
22412243
} catch (RuntimeException e) {
22422244
assertEquals(

0 commit comments

Comments
 (0)