package pluginbase.config.serializers; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import pluginbase.config.SerializableConfig; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; class CollectionSerializer implements Serializer<Collection> { @Nullable @Override public Object serialize(@Nullable Collection object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { if (object == null) { return null; } List<Object> serialized = new ArrayList<>(object.size()); for (Object o : object) { serialized.add(SerializableConfig.serialize(o, serializerSet)); } return new CopyOnWriteArrayList<Object>(serialized); } @Nullable @Override @SuppressWarnings("unchecked") public Collection deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException { if (serialized == null) { return null; } if (!(serialized instanceof Collection)) { throw new IllegalArgumentException("Serialized value must be a collection to be deserialized as a collection"); } Collection data = (Collection) serialized; Collection collection = createCollection(wantedType, data.size()); for (Object object : data) { collection.add(SerializableConfig.deserialize(object, serializerSet)); } return collection; } @NotNull protected static Collection createCollection(@NotNull Class<? extends Collection> wantedType, int size) { if (wantedType.isInterface()) { return new ArrayList(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 ArrayList(size); } else { throw e; } } } else { throw e; } } } } }