-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXBaseSerializer.java
More file actions
50 lines (41 loc) · 1.72 KB
/
Copy pathXBaseSerializer.java
File metadata and controls
50 lines (41 loc) · 1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package gg.eventalerts.eventalertsintegration.config.serdes;
import com.cryptomorin.xseries.base.XBase;
import eu.okaeri.configs.schema.GenericsDeclaration;
import eu.okaeri.configs.serdes.DeserializationData;
import eu.okaeri.configs.serdes.ObjectSerializer;
import eu.okaeri.configs.serdes.SerializationData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class XBaseSerializer<T extends XBase<T, ?>> implements ObjectSerializer<T> {
@NotNull private static final Map<Class<?>, Method> CACHED_METHODS = new HashMap<>();
@Override
public boolean supports(@NotNull Class<?> type) {
return XBase.class.isAssignableFrom(type);
}
@Override
public void serialize(@NotNull T object, @NotNull SerializationData data, @NotNull GenericsDeclaration generics) {
data.setValue(object.name());
}
@Override @Nullable
public T deserialize(@NotNull DeserializationData data, @NotNull GenericsDeclaration generics) {
final String name = data.getValue(String.class);
if (name == null) return null;
final Class<?> type = generics.getType();
Method method = CACHED_METHODS.get(type);
try {
// Method not cached, get and cache
if (method == null) {
method = type.getMethod("of", String.class);
CACHED_METHODS.put(type, method);
}
// Invoke method
return ((Optional<T>) method.invoke(null, name)).orElse(null);
} catch (final IllegalArgumentException | ReflectiveOperationException e) {
return null;
}
}
}