package pluginbase.config.serializers; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; class NumberSerializer<N extends Number> implements Serializer<N> { @Nullable @Override public Object serialize(@Nullable N object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { return object; } @Nullable @Override @SuppressWarnings("unchecked") public N deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { try { Method valueOf = wantedType.getMethod("valueOf", String.class); return (N) valueOf.invoke(null, String.valueOf(serialized)); } catch (Exception e) { throw new RuntimeException("There was a problem deserializing a primitive number: " + serialized, e); } } static class BigNumberSerializer<N extends Number> implements Serializer<N> { @Nullable @Override public Object serialize(@Nullable N object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { return object.toString(); } @Nullable @Override @SuppressWarnings("unchecked") public N deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { try { return (N) InstanceUtil.createInstance(wantedType, new Class[] {String.class}, new Object[] {String.valueOf(serialized)}); } catch (Exception e) { throw new RuntimeException("There was a problem deserializing a big number: " + serialized, e); } } } static class AtomicLongSerializer implements Serializer<AtomicLong> { @Nullable @Override public Object serialize(@Nullable AtomicLong object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { return object; } @Nullable @Override @SuppressWarnings("unchecked") public AtomicLong deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { try { return new AtomicLong(Long.valueOf(String.valueOf(serialized))); } catch (NumberFormatException e) { throw new RuntimeException("There was a problem deserializing an AtomicLong: " + serialized, e); } } } static class AtomicIntegerSerializer implements Serializer<AtomicInteger> { @Nullable @Override public Object serialize(@Nullable AtomicInteger object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { return object; } @Nullable @Override @SuppressWarnings("unchecked") public AtomicInteger deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { try { return new AtomicInteger(Integer.valueOf(String.valueOf(serialized))); } catch (NumberFormatException e) { throw new RuntimeException("There was a problem deserializing an AtomicLong: " + serialized, e); } } } }