Skip to content

Commit 40961e4

Browse files
committed
Add support for shortcut properties
1 parent 133612b commit 40961e4

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

java-client/src/main/java/co/elastic/clients/json/DelegatingDeserializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public void ignore(String name) {
6161
throw new UnsupportedOperationException();
6262
}
6363

64+
/** Used for structures that can also be serialized as a single string when all others properties are undefined */
65+
public void shortcutProperty(String name) {
66+
throw new UnsupportedOperationException();
67+
}
68+
6469
public void setUnknownFieldHandler(QuadConsumer<ObjectType, String, JsonParser, JsonpMapper> unknownFieldHandler) {
6570
throw new UnsupportedOperationException();
6671
}

java-client/src/main/java/co/elastic/clients/json/ObjectDeserializer.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.EnumSet;
2828
import java.util.HashMap;
2929
import java.util.Map;
30+
import java.util.NoSuchElementException;
3031
import java.util.function.BiConsumer;
3132
import java.util.function.ObjIntConsumer;
3233
import java.util.function.Supplier;
@@ -70,7 +71,7 @@ public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName,
7071
}
7172
}
7273

73-
private static final FieldDeserializer<Object> IGNORED_FIELD = new FieldDeserializer<Object>("-", null) {
74+
private static final FieldDeserializer<?> IGNORED_FIELD = new FieldDeserializer<Object>("-", null) {
7475
@Override
7576
public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName, Object object) {
7677
JsonpUtils.skipValue(parser);
@@ -80,9 +81,10 @@ public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName,
8081
//---------------------------------------------------------------------------------------------
8182

8283
private final Supplier<ObjectType> constructor;
83-
protected final Map<String, FieldDeserializer<?>> fieldDeserializers;
84+
protected final Map<String, FieldDeserializer<ObjectType>> fieldDeserializers;
8485
private BiConsumer<ObjectType, String> keySetter;
8586
private String typeProperty;
87+
private FieldDeserializer<ObjectType> shortcutProperty;
8688
private QuadConsumer<ObjectType, String, JsonParser, JsonpMapper> unknownFieldHandler;
8789

8890
public ObjectDeserializer(Supplier<ObjectType> constructor) {
@@ -101,6 +103,10 @@ public ObjectType deserialize(ObjectType value, JsonParser parser, JsonpMapper m
101103
return null;
102104
}
103105

106+
if (event != Event.START_OBJECT && shortcutProperty != null) {
107+
shortcutProperty.deserialize(parser, mapper, shortcutProperty.name, value);
108+
}
109+
104110
if (keySetter != null) {
105111
String key = JsonpUtils.expectKeyName(parser, parser.next());
106112
keySetter.accept(value, key);
@@ -114,8 +120,7 @@ public ObjectType deserialize(ObjectType value, JsonParser parser, JsonpMapper m
114120
JsonpUtils.expectEvent(parser, Event.KEY_NAME, event);
115121
String fieldName = parser.getString();
116122

117-
@SuppressWarnings("unchecked")
118-
FieldDeserializer<ObjectType> fieldDeserializer = (FieldDeserializer<ObjectType>) fieldDeserializers.get(fieldName);
123+
FieldDeserializer<ObjectType> fieldDeserializer = fieldDeserializers.get(fieldName);
119124
if (fieldDeserializer == null) {
120125
parseUnknownField(parser, mapper, fieldName, value);
121126
} else {
@@ -129,8 +134,7 @@ public ObjectType deserialize(ObjectType value, JsonParser parser, JsonpMapper m
129134
String variant = unionInfo.getKey();
130135
JsonParser innerParser = unionInfo.getValue();
131136

132-
@SuppressWarnings("unchecked")
133-
FieldDeserializer<ObjectType> fieldDeserializer = (FieldDeserializer<ObjectType>) fieldDeserializers.get(variant);
137+
FieldDeserializer<ObjectType> fieldDeserializer = fieldDeserializers.get(variant);
134138
if (fieldDeserializer == null) {
135139
parseUnknownField(parser, mapper, variant, value);
136140
} else {
@@ -164,8 +168,17 @@ public void setUnknownFieldHandler(QuadConsumer<ObjectType, String, JsonParser,
164168
this.unknownFieldHandler = unknownFieldHandler;
165169
}
166170

171+
@SuppressWarnings("unchecked")
167172
public void ignore(String name) {
168-
this.fieldDeserializers.put(name, IGNORED_FIELD);
173+
this.fieldDeserializers.put(name, (FieldDeserializer<ObjectType>) IGNORED_FIELD);
174+
}
175+
176+
@Override
177+
public void shortcutProperty(String name) {
178+
this.shortcutProperty = this.fieldDeserializers.get(name);
179+
if (this.shortcutProperty == null) {
180+
throw new NoSuchElementException("No deserializer was setup for '" + name + "'");
181+
}
169182
}
170183

171184
//----- Object types

0 commit comments

Comments
 (0)