package pluginbase.config.serializers;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import pluginbase.config.SerializableConfig;
import java.util.LinkedHashMap;
import java.util.Map;
class MapSerializer implements Serializer<Map<?, ?>> {
@Nullable
@Override
public Object serialize(@Nullable Map<?, ?> object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException {
if (object == null) {
return null;
}
Map<String, Object> result = new LinkedHashMap<>(object.size());
for (Map.Entry entry : object.entrySet()) {
Object key = entry.getKey();
Object value = entry.getValue();
if (key != null && value != null) {
result.put(key.toString(), SerializableConfig.serialize(entry.getValue(), serializerSet));
}
}
return result;
}
@Nullable
@Override
@SuppressWarnings("unchecked")
public Map<?, ?> deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException {
if (serialized == null) {
return null;
}
if (!(serialized instanceof Map)) {
throw new IllegalArgumentException("Serialized value must be a map to be deserialized as a map");
}
Map<?, ?> data = (Map<?, ?>) serialized;
Map map = createMap(wantedType, data.size());
for (Map.Entry entry : data.entrySet()) {
map.put(SerializableConfig.deserialize(entry.getKey(), serializerSet), SerializableConfig.deserialize(entry.getValue(), serializerSet));
}
return map;
}
@NotNull
protected static Map createMap(@NotNull Class<? extends Map> wantedType, int size) {
if (wantedType.isInterface()) {
return new LinkedHashMap(size);
} else {
try {
Object[] paramValues = new Object[] { size };
return InstanceUtil.createInstance(wantedType, InstanceUtil.SIZE_PARAM_TYPE_ARRAY, paramValues);
} catch (RuntimeException e) {
if (e.getCause() instanceof NoSuchMethodException) {
try {
return InstanceUtil.createInstance(wantedType);
} catch (RuntimeException e1) {
if (e1.getCause() instanceof NoSuchMethodException) {
return new LinkedHashMap(size);
} else {
throw e;
}
}
} else {
throw e;
}
}
}
}
}