Skip to content

Commit e214b13

Browse files
authored
Allow encoder registration override. (#1039)
* Allow encoder registration override. Instead of throwing an error, we allow encoders to override previously registered ones.
1 parent f8d5779 commit e214b13

File tree

3 files changed

+55
-6
lines changed

3 files changed

+55
-6
lines changed

encoders/firebase-encoders-json/api.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ package com.google.firebase.encoders {
3737

3838
}
3939

40+
package com.google.firebase.encoders.annotations {
41+
42+
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Encodable {
43+
}
44+
45+
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface Encodable.Field {
46+
method public abstract String name() default "";
47+
}
48+
49+
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface Encodable.Ignore {
50+
}
51+
52+
}
53+
4054
package com.google.firebase.encoders.config {
4155

4256
public interface Configurator {

encoders/firebase-encoders-json/src/json/java/com/google/firebase/encoders/json/JsonDataEncoderBuilder.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,19 @@ public JsonDataEncoderBuilder() {
6868
@Override
6969
public <T> JsonDataEncoderBuilder registerEncoder(
7070
@NonNull Class<T> clazz, @NonNull ObjectEncoder<? super T> objectEncoder) {
71-
if (objectEncoders.containsKey(clazz)) {
72-
throw new IllegalArgumentException("Encoder already registered for " + clazz.getName());
73-
}
7471
objectEncoders.put(clazz, objectEncoder);
72+
// Remove it from the other map if present.
73+
valueEncoders.remove(clazz);
7574
return this;
7675
}
7776

7877
@NonNull
7978
@Override
8079
public <T> JsonDataEncoderBuilder registerEncoder(
8180
@NonNull Class<T> clazz, @NonNull ValueEncoder<? super T> encoder) {
82-
if (valueEncoders.containsKey(clazz)) {
83-
throw new IllegalArgumentException("Encoder already registered for " + clazz.getName());
84-
}
8581
valueEncoders.put(clazz, encoder);
82+
// Remove it from the other map if present.
83+
objectEncoders.remove(clazz);
8684
return this;
8785
}
8886

encoders/firebase-encoders-json/src/test/java/com/google/firebase/encoders/json/JsonValueObjectEncoderContextTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,43 @@ static class InnerDummyClass {
5757
static InnerDummyClass INSTANCE = new InnerDummyClass();
5858
}
5959

60+
@Test
61+
public void testRegisterOverride() throws IOException, EncodingException {
62+
ObjectEncoder<DummyClass> objectEncoder =
63+
(o, ctx) -> {
64+
ctx.add("Inner", InnerDummyClass.INSTANCE);
65+
};
66+
ObjectEncoder<InnerDummyClass> innerObjectEncoder =
67+
(o, ctx) -> {
68+
ctx.add("Name", "innerClass");
69+
};
70+
ValueEncoder<InnerDummyClass> innerValueEncoder =
71+
(o, ctx) -> {
72+
ctx.add(1234);
73+
};
74+
75+
String result =
76+
new JsonDataEncoderBuilder()
77+
.registerEncoder(DummyClass.class, objectEncoder)
78+
.registerEncoder(InnerDummyClass.class, innerObjectEncoder)
79+
.registerEncoder(InnerDummyClass.class, innerValueEncoder)
80+
.build()
81+
.encode(DummyClass.INSTANCE);
82+
83+
assertThat(result).isEqualTo("{\"Inner\":1234}");
84+
85+
// Invert the logic
86+
result =
87+
new JsonDataEncoderBuilder()
88+
.registerEncoder(DummyClass.class, objectEncoder)
89+
.registerEncoder(InnerDummyClass.class, innerValueEncoder)
90+
.registerEncoder(InnerDummyClass.class, innerObjectEncoder)
91+
.build()
92+
.encode(DummyClass.INSTANCE);
93+
94+
assertThat(result).isEqualTo("{\"Inner\":{\"Name\":\"innerClass\"}}");
95+
}
96+
6097
@Test
6198
public void testEncodingPrimitiveTypes() throws IOException, EncodingException {
6299
ObjectEncoder<DummyClass> objectEncoder =

0 commit comments

Comments
 (0)