001package com.mrivanplays.annotationconfig.toml;
002
003import com.mrivanplays.annotationconfig.core.serialization.DataObject;
004import com.mrivanplays.annotationconfig.core.serialization.FieldTypeSerializer;
005import java.lang.reflect.Field;
006import java.text.DateFormat;
007import java.text.SimpleDateFormat;
008import java.util.Date;
009import java.util.TimeZone;
010
011/**
012 * Type serializer, which is serializing and deserializing the java 8+ obsolete class {@link Date}.
013 * <br>
014 * This is kept and maintained for backwards compatibility, everyone is encouraged to migrate to the
015 * new java time api.
016 *
017 * @since 1.0
018 */
019public class DateResolver implements FieldTypeSerializer<Date> {
020
021  private static final DateFormat formatter = getFormatter();
022
023  /** {@inheritDoc} */
024  @Override
025  public Date deserialize(DataObject data, Field field) {
026    System.err.println(
027        "WARNING: Stop using Date for dates. Heck, its 2021, we have java 17, and java 8 in 2014 implemented a new time api. USE THAT");
028    String input = data.getAsString();
029    if (input.indexOf('T') != -1) {
030      String[] dateTimePart = input.split("T");
031      String date = dateTimePart[0];
032      String time = dateTimePart[1];
033      if (!date.contains("-")) {
034        throw new IllegalArgumentException("Invalid date!");
035      }
036      String[] dateParts = date.split("-");
037      int year = Integer.parseInt(dateParts[0]);
038      int month = Integer.parseInt(dateParts[1]);
039      int day = Integer.parseInt(dateParts[2]);
040      if (!time.contains(":")) {
041        throw new IllegalArgumentException("Invalid time!");
042      }
043      String[] timeSplit = time.split(":");
044      int hour = Integer.parseInt(timeSplit[0]);
045      int minute = Integer.parseInt(timeSplit[1]);
046      int second = 0;
047      if (timeSplit.length >= 3) {
048        String secondPart = timeSplit[2];
049        if (secondPart.contains("+") || secondPart.contains("-")) {
050          // fuck timezones. DO NOT USE DATE FOR GOD'S SAKE
051          if (secondPart.indexOf('+') != -1) {
052            secondPart = secondPart.substring(0, secondPart.indexOf('+'));
053          }
054          if (secondPart.indexOf('-') != -1) {
055            secondPart = secondPart.substring(0, secondPart.indexOf('-'));
056          }
057        }
058        second = Integer.parseInt(secondPart);
059      }
060      return new Date(year, month, day, hour, minute, second);
061    } else {
062      // normal date
063      if (!input.contains("-")) {
064        throw new IllegalArgumentException("Invalid date!");
065      }
066      String[] dateParts = input.split("-");
067      int year = Integer.parseInt(dateParts[0]);
068      int month = Integer.parseInt(dateParts[1]);
069      int day = Integer.parseInt(dateParts[2]);
070      return new Date(year, month, day);
071    }
072  }
073
074  /** {@inheritDoc} */
075  @Override
076  public DataObject serialize(Date value, Field field) {
077    return new DataObject(formatter.format(value));
078  }
079
080  private static DateFormat getFormatter() {
081    TimeZone timeZone = TimeZone.getDefault();
082    String format;
083    if (timeZone.getID().contains("UTC")) {
084      format = "yyyy-MM-dd'T'HH:mm:ss'Z'";
085    } else {
086      format = "yyyy-MM-dd'T'HH:mm:ssXXX";
087    }
088    SimpleDateFormat formatter = new SimpleDateFormat(format);
089    formatter.setTimeZone(timeZone);
090    return formatter;
091  }
092}