diff --git a/gedcomx-date/src/test/java/org/gedcomx/date/UtilTest.java b/gedcomx-date/src/test/java/org/gedcomx/date/UtilTest.java index 0789bd4fa..15c170dc2 100644 --- a/gedcomx-date/src/test/java/org/gedcomx/date/UtilTest.java +++ b/gedcomx-date/src/test/java/org/gedcomx/date/UtilTest.java @@ -121,11 +121,11 @@ void shouldOverflowSeconds() { new GedcomxDateSimple("+0999-12-31T23:59:59"), new GedcomxDateSimple("+1000-01-01T00:00:00")); - assertThat(duration.getYears()).isEqualTo(null); - assertThat(duration.getMonths()).isEqualTo(null); - assertThat(duration.getDays()).isEqualTo(null); - assertThat(duration.getHours()).isEqualTo(null); - assertThat(duration.getMinutes()).isEqualTo(null); + assertThat(duration.getYears()).isNull(); + assertThat(duration.getMonths()).isNull(); + assertThat(duration.getDays()).isNull(); + assertThat(duration.getHours()).isNull(); + assertThat(duration.getMinutes()).isNull(); assertThat(duration.getSeconds()).isEqualTo(1); } @@ -135,12 +135,12 @@ void shouldOverflowMinutes() { new GedcomxDateSimple("+0999-12-31T23:59:00"), new GedcomxDateSimple("+1000-01-01T00:00:00")); - assertThat(duration.getYears()).isEqualTo(null); - assertThat(duration.getMonths()).isEqualTo(null); - assertThat(duration.getDays()).isEqualTo(null); - assertThat(duration.getHours()).isEqualTo(null); + assertThat(duration.getYears()).isNull(); + assertThat(duration.getMonths()).isNull(); + assertThat(duration.getDays()).isNull(); + assertThat(duration.getHours()).isNull(); assertThat(duration.getMinutes()).isEqualTo(1); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getSeconds()).isNull(); } @Test @@ -149,12 +149,12 @@ void shouldOverflowHours() { new GedcomxDateSimple("+0999-12-31T23:00:00"), new GedcomxDateSimple("+1000-01-01T00:00:00")); - assertThat(duration.getYears()).isEqualTo(null); - assertThat(duration.getMonths()).isEqualTo(null); - assertThat(duration.getDays()).isEqualTo(null); + assertThat(duration.getYears()).isNull(); + assertThat(duration.getMonths()).isNull(); + assertThat(duration.getDays()).isNull(); assertThat(duration.getHours()).isEqualTo(1); - assertThat(duration.getMinutes()).isEqualTo(null); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getMinutes()).isNull(); + assertThat(duration.getSeconds()).isNull(); } @Test @@ -163,12 +163,12 @@ void shouldOverflowDays() { new GedcomxDateSimple("+0999-12-31T00:00:00"), new GedcomxDateSimple("+1000-01-01T00:00:00")); - assertThat(duration.getYears()).isEqualTo(null); - assertThat(duration.getMonths()).isEqualTo(null); + assertThat(duration.getYears()).isNull(); + assertThat(duration.getMonths()).isNull(); assertThat(duration.getDays()).isEqualTo(1); - assertThat(duration.getHours()).isEqualTo(null); - assertThat(duration.getMinutes()).isEqualTo(null); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getHours()).isNull(); + assertThat(duration.getMinutes()).isNull(); + assertThat(duration.getSeconds()).isNull(); } @Test @@ -177,12 +177,12 @@ void shouldOverflowMonths() { new GedcomxDateSimple("+0999-12-01T00:00:00"), new GedcomxDateSimple("+1000-01-01T00:00:00")); - assertThat(duration.getYears()).isEqualTo(null); + assertThat(duration.getYears()).isNull(); assertThat(duration.getMonths()).isEqualTo(1); - assertThat(duration.getDays()).isEqualTo(null); - assertThat(duration.getHours()).isEqualTo(null); - assertThat(duration.getMinutes()).isEqualTo(null); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getDays()).isNull(); + assertThat(duration.getHours()).isNull(); + assertThat(duration.getMinutes()).isNull(); + assertThat(duration.getSeconds()).isNull(); } @Test @@ -192,11 +192,11 @@ void shouldOverflowYears() { new GedcomxDateSimple("+1000-01-01T00:00:00")); assertThat(duration.getYears()).isEqualTo(1); - assertThat(duration.getMonths()).isEqualTo(null); - assertThat(duration.getDays()).isEqualTo(null); - assertThat(duration.getHours()).isEqualTo(null); - assertThat(duration.getMinutes()).isEqualTo(null); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getMonths()).isNull(); + assertThat(duration.getDays()).isNull(); + assertThat(duration.getHours()).isNull(); + assertThat(duration.getMinutes()).isNull(); + assertThat(duration.getSeconds()).isNull(); } @Test @@ -260,12 +260,12 @@ void shouldCalcTrickyDuration() { new GedcomxDateSimple("+1973-02-01")); assertThat(duration.getYears()).isEqualTo(3); - assertThat(duration.getMonths()).isEqualTo(null); + assertThat(duration.getMonths()).isNull(); // All of the 31st and all of the 1st. assertThat(duration.getDays()).isEqualTo(2); - assertThat(duration.getHours()).isEqualTo(null); - assertThat(duration.getMinutes()).isEqualTo(null); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getHours()).isNull(); + assertThat(duration.getMinutes()).isNull(); + assertThat(duration.getSeconds()).isNull(); } @Test @@ -275,12 +275,12 @@ void shouldCalcSimpleDuration() { GedcomxDateDuration duration = ((GedcomxDateRange)date).getDuration(); - assertThat(duration.getYears()).isEqualTo(null); - assertThat(duration.getMonths()).isEqualTo(null); + assertThat(duration.getYears()).isNull(); + assertThat(duration.getMonths()).isNull(); assertThat(duration.getDays()).isEqualTo(1); - assertThat(duration.getHours()).isEqualTo(null); - assertThat(duration.getMinutes()).isEqualTo(null); - assertThat(duration.getSeconds()).isEqualTo(null); + assertThat(duration.getHours()).isNull(); + assertThat(duration.getMinutes()).isNull(); + assertThat(duration.getSeconds()).isNull(); GedcomxDateSimple endDate = ((GedcomxDateRange)date).getEnd(); assertThat(endDate.getYear()).isEqualTo(1970); @@ -363,7 +363,7 @@ void shouldAddMinutes() { assertThat(simple.getDay()).isEqualTo(1); assertThat(simple.getHours()).isEqualTo(1); assertThat(simple.getMinutes()).isEqualTo(30); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -376,8 +376,8 @@ void shouldAddHours() { assertThat(simple.getMonth()).isEqualTo(1); assertThat(simple.getDay()).isEqualTo(3); assertThat(simple.getHours()).isEqualTo(2); - assertThat(simple.getMinutes()).isEqualTo(null); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getMinutes()).isNull(); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -389,9 +389,9 @@ void shouldAddDays() { assertThat(simple.getYear()).isEqualTo(2004); assertThat(simple.getMonth()).isEqualTo(3); assertThat(simple.getDay()).isEqualTo(3); - assertThat(simple.getHours()).isEqualTo(null); - assertThat(simple.getMinutes()).isEqualTo(null); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getHours()).isNull(); + assertThat(simple.getMinutes()).isNull(); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -403,9 +403,9 @@ void shouldAddYearsWorthOfDays() { assertThat(simple.getYear()).isEqualTo(2002); assertThat(simple.getMonth()).isEqualTo(1); assertThat(simple.getDay()).isEqualTo(2); - assertThat(simple.getHours()).isEqualTo(null); - assertThat(simple.getMinutes()).isEqualTo(null); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getHours()).isNull(); + assertThat(simple.getMinutes()).isNull(); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -416,10 +416,10 @@ void shouldAddMonths() { assertThat(simple.getYear()).isEqualTo(1002); assertThat(simple.getMonth()).isEqualTo(2); - assertThat(simple.getDay()).isEqualTo(null); - assertThat(simple.getHours()).isEqualTo(null); - assertThat(simple.getMinutes()).isEqualTo(null); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getDay()).isNull(); + assertThat(simple.getHours()).isNull(); + assertThat(simple.getMinutes()).isNull(); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -429,11 +429,11 @@ void shouldAddYears() { new GedcomxDateDuration("P20Y")); assertThat(simple.getYear()).isEqualTo(19); - assertThat(simple.getMonth()).isEqualTo(null); - assertThat(simple.getDay()).isEqualTo(null); - assertThat(simple.getHours()).isEqualTo(null); - assertThat(simple.getMinutes()).isEqualTo(null); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getMonth()).isNull(); + assertThat(simple.getDay()).isNull(); + assertThat(simple.getHours()).isNull(); + assertThat(simple.getMinutes()).isNull(); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -443,11 +443,11 @@ void shouldAddNegativeYears() { new GedcomxDateDuration("P200Y")); assertThat(simple.getYear()).isEqualTo(-800); - assertThat(simple.getMonth()).isEqualTo(null); - assertThat(simple.getDay()).isEqualTo(null); - assertThat(simple.getHours()).isEqualTo(null); - assertThat(simple.getMinutes()).isEqualTo(null); - assertThat(simple.getSeconds()).isEqualTo(null); + assertThat(simple.getMonth()).isNull(); + assertThat(simple.getDay()).isNull(); + assertThat(simple.getHours()).isNull(); + assertThat(simple.getMinutes()).isNull(); + assertThat(simple.getSeconds()).isNull(); } @Test @@ -497,9 +497,9 @@ void successOnValidDurations() { @Test void errorOnInvalidMonth() { try { - GedcomxDateUtil.daysInMonth(13, 2000); + YearMonth.of(2000, 13).lengthOfMonth(); fail("GedcomxDateException expected because 13 is not a month"); - } catch(GedcomxDateException e) { + } catch(DateTimeException e) { assertThat(e.getMessage()).isEqualTo("Invalid value for MonthOfYear (valid values 1 - 12): 13"); } } diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/AlternateCalendarDate.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/AlternateCalendarDate.java new file mode 100644 index 000000000..d2e54dd47 --- /dev/null +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/AlternateCalendarDate.java @@ -0,0 +1,87 @@ +/** + * Copyright Intellectual Reserve, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.gedcomx.conclusion; + +import org.gedcomx.types.CalendarType; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.webcohesion.enunciate.metadata.qname.XmlQNameEnumRef; + +/** + * Represents a date expressed in an alternate calendar system. + *
+ * An {@code AlternateCalendarDate} is included within a {@link Date} object's alternateCalendars list to express the + * same date in a calendar other than the proleptic Gregorian calendar. The main {@code Date} should always be + * in the proleptic Gregorian calendar, and any alternate representations (e.g., Hebrew, Rumi, Julian) + * should be provided as {@code AlternateCalendarDate} instances. + *
+ */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AlternateCalendarDate extends Date { + public AlternateCalendarDate() { + // Default constructor + } + + /** + * The calendar system used to interpret this date (e.g., Hebrew, Rumi, Julian). + * This value indicates which calendar should be used to interpret the date values in this object. + */ + private CalendarType calendar; + + public AlternateCalendarDate(CalendarType calendar) { + this.calendar = calendar; + } + + public AlternateCalendarDate(AlternateCalendarDate copy) { + super(copy); + this.calendar = copy.calendar; + } + + /** + * Gets the calendar system used to interpret this date. + * + * @return The calendar system for this alternate date. + */ + @XmlQNameEnumRef(CalendarType.class) + public CalendarType getCalendar() { + return calendar; + } + + /** + * Sets the calendar system used to interpret this date. + * + * @param calendar The calendar system for this alternate date. + */ + public void setCalendar(CalendarType calendar) { + this.calendar = calendar; + } + + /** + * Build up the AlternateCalendarDate with the calendar system. + * + * @param calendar The calendar system for this alternate date. + * @return this. + */ + public AlternateCalendarDate calendar(CalendarType calendar) { + setCalendar(calendar); + return this; + } + + @Override + public String toString() { + return "Date{" + "original='" + getOriginal() + '\'' + ", formal=" + getFormal() + ", calendar=" + calendar + '}'; + } +} diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Date.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Date.java index bbbcf2bcc..9f86a08fb 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Date.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Date.java @@ -37,16 +37,16 @@ import jakarta.xml.bind.annotation.XmlTransient; import jakarta.xml.bind.annotation.XmlType; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; /** * A concluded genealogical date. */ @ClientName ("DateInfo") -@XmlType ( name = "Date", propOrder = { "original", "formal", "normalizedExtensions", "fields"}) +@XmlType ( name = "Date", propOrder = { "original", "formal", "alternateCalendars", "normalizedExtensions", "fields"}) @JsonInclude ( JsonInclude.Include.NON_NULL ) @Schema(description = "A concluded genealogical date.") public class Date extends ExtensibleData implements HasFields { @@ -63,6 +63,7 @@ public class Date extends ExtensibleData implements HasFields { @Schema(description = "The list of normalized values for the date, provided for display purposes by the application. Normalized values are not specified by " + "GEDCOM X core, but as extension elements by GEDCOM X RS.") private List