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}