Skip to content

Commit

Permalink
correctly handle ISO_OFFSET zoned date times
Browse files Browse the repository at this point in the history
  • Loading branch information
tnaskali committed Feb 3, 2025
1 parent 94a81cc commit 3c4bbe0
Show file tree
Hide file tree
Showing 12 changed files with 60 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package li.naska.bgg.util;

import jakarta.xml.bind.annotation.adapters.XmlAdapter;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class RfcStringToZonedDateTimeAdapter extends XmlAdapter<String, ZonedDateTime> {

/** Example : Wed, 01 Apr 2020 19:50:39 +0000 */
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z");

@Override
public String marshal(ZonedDateTime zonedDateTime) {
return zonedDateTime.format(FORMATTER);
}

@Override
public ZonedDateTime unmarshal(String string) {
return ZonedDateTime.from(FORMATTER.parse(string));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public class StringToLocalDateAdapter extends XmlAdapter<String, LocalDate> {
/**
* Example : 2020-01-11
*/
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE;

@Override
public String marshal(LocalDate localDate) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@

public class StringToZonedDateTimeAdapter extends XmlAdapter<String, ZonedDateTime> {

/** Example : Wed, 01 Apr 2020 19:50:39 +0000 */
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z");
/** Example : 2020-01-11T11:15:53+00:00 */
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

@Override
public String marshal(ZonedDateTime zonedDateTime) {
Expand Down
3 changes: 3 additions & 0 deletions src/main/xjb/global.xjb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
<xjc:javaType name="java.time.ZonedDateTime"
xmlType="common:zonedDateTime"
adapter="li.naska.bgg.util.StringToZonedDateTimeAdapter"/>
<xjc:javaType name="java.time.ZonedDateTime"
xmlType="common:rfcZonedDateTime"
adapter="li.naska.bgg.util.RfcStringToZonedDateTimeAdapter"/>
</jaxb:globalBindings>

</jaxb:bindings>
19 changes: 16 additions & 3 deletions src/main/xsd/common.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<xs:simpleType name="localDate">
<xs:restriction base="xs:string">
<!-- 2020-01-11 -->
<xs:pattern value="[1-9][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])"/>
<xs:pattern value="[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])"/>
<xs:length value="10"/>
</xs:restriction>
</xs:simpleType>
Expand All @@ -15,16 +15,25 @@
<xs:restriction base="xs:string">
<!-- 2020-01-11 11:15:53 -->
<xs:pattern
value="[1-9][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)"/>
value="[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01]\d|2[0-3]):[0-5]\d:[0-5]\d"/>
<xs:length value="19"/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="zonedDateTime">
<xs:restriction base="xs:string">
<!-- 2020-01-11T11:15:53+00:00 -->
<xs:pattern
value="[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])T([01]\d|2[0-3]):[0-5]\d:[0-5]\d([+-]([01]\d|2[0-3]):[0-5]\d|Z)"/>
<xs:length value="25"/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="rfcZonedDateTime">
<xs:restriction base="xs:string">
<!-- Wed, 01 Apr 2020 19:50:39 +0000 -->
<xs:pattern
value="(Mon|Tue|Wed|Thu|Fri|Sat|Sun),(0[1-9]|[1-2][0-9]|3[0-1]) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [1-9][0-9]{3} ([0-1][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60) [+|-]([0-1][0-9]|2[0-3])[0-5][0-9]"/>
value="(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (0[1-9]|[12]\d|3[01]) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [1-9]\d{3} ([01]\d|2[0-3]):[0-5]\d:[0-5]\d [+-]([01]\d|2[0-3])[0-5]\d"/>
<xs:length value="31"/>
</xs:restriction>
</xs:simpleType>
Expand Down Expand Up @@ -53,4 +62,8 @@
<xs:attribute name="value" type="common:zonedDateTime" use="required"/>
</xs:complexType>

<xs:complexType name="rfcZonedDateTimeValue">
<xs:attribute name="value" type="common:rfcZonedDateTime" use="required"/>
</xs:complexType>

</xs:schema>
2 changes: 1 addition & 1 deletion src/main/xsd/v1/collection.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@
</xs:sequence>
<xs:attribute name="totalitems" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="termsofuse" type="xs:anyURI" use="required"/>
<xs:attribute name="pubdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="pubdate" type="common:rfcZonedDateTime" use="required"/>
</xs:complexType>

<xs:element name="items" type="collection:collection"/>
Expand Down
14 changes: 7 additions & 7 deletions src/main/xsd/v1/geeklist.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="username" type="xs:string" use="required"/>
<xs:attribute name="date" type="common:zonedDateTime" use="required"/>
<xs:attribute name="postdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="editdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="date" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="postdate" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="editdate" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="thumbs" type="xs:nonNegativeInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
Expand All @@ -28,17 +28,17 @@
<xs:attribute name="objectid" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="objectname" type="xs:string" use="required"/>
<xs:attribute name="username" type="xs:string" use="required"/>
<xs:attribute name="postdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="editdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="postdate" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="editdate" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="thumbs" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="imageid" type="xs:nonNegativeInteger" use="required"/>
</xs:complexType>

<xs:complexType name="geeklist">
<xs:sequence>
<xs:element name="postdate" type="common:zonedDateTime"/>
<xs:element name="postdate" type="common:rfcZonedDateTime"/>
<xs:element name="postdate_timestamp" type="xs:nonNegativeInteger"/>
<xs:element name="editdate" type="common:zonedDateTime"/>
<xs:element name="editdate" type="common:rfcZonedDateTime"/>
<xs:element name="editdate_timestamp" type="xs:nonNegativeInteger"/>
<xs:element name="thumbs" type="xs:nonNegativeInteger"/>
<xs:element name="numitems" type="xs:nonNegativeInteger"/>
Expand Down
2 changes: 1 addition & 1 deletion src/main/xsd/v2/collection.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@
</xs:sequence>
<xs:attribute name="totalitems" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="termsofuse" type="xs:anyURI" use="required"/>
<xs:attribute name="pubdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="pubdate" type="common:rfcZonedDateTime" use="required"/>
</xs:complexType>

<xs:element name="items" type="collection:collection"/>
Expand Down
6 changes: 3 additions & 3 deletions src/main/xsd/v2/forum.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
<xs:attribute name="subject" type="xs:string" use="required"/>
<xs:attribute name="author" type="xs:string" use="required"/>
<xs:attribute name="numarticles" type="xs:integer" use="required"/>
<xs:attribute name="postdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="lastpostdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="postdate" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="lastpostdate" type="common:rfcZonedDateTime" use="required"/>
</xs:complexType>

<xs:complexType name="threads">
Expand All @@ -28,7 +28,7 @@
<xs:attribute name="title" type="xs:string" use="required"/>
<xs:attribute name="numthreads" type="xs:integer" use="required"/>
<xs:attribute name="numposts" type="xs:integer" use="required"/>
<xs:attribute name="lastpostdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="lastpostdate" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="noposting" type="xs:boolean" use="required"/>
<xs:attribute name="termsofuse" type="xs:anyURI" use="required"/>
</xs:complexType>
Expand Down
2 changes: 1 addition & 1 deletion src/main/xsd/v2/forumlist.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<xs:attribute name="description" type="xs:string" use="required"/>
<xs:attribute name="numthreads" type="xs:integer" use="required"/>
<xs:attribute name="numposts" type="xs:integer" use="required"/>
<xs:attribute name="lastpostdate" type="common:zonedDateTime" use="required"/>
<xs:attribute name="lastpostdate" type="common:rfcZonedDateTime" use="required"/>
</xs:complexType>

<xs:complexType name="forums">
Expand Down
4 changes: 2 additions & 2 deletions src/main/xsd/v2/guild.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<xs:complexType name="member">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="date" type="common:zonedDateTime" use="required"/>
<xs:attribute name="date" type="common:rfcZonedDateTime" use="required"/>
</xs:complexType>

<xs:complexType name="members">
Expand All @@ -40,7 +40,7 @@
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="created" type="common:zonedDateTime" use="required"/>
<xs:attribute name="created" type="common:rfcZonedDateTime" use="required"/>
<xs:attribute name="termsofuse" type="xs:anyURI" use="required"/>
</xs:complexType>

Expand Down
2 changes: 1 addition & 1 deletion src/main/xsd/v2/thing.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@

<xs:complexType name="listing">
<xs:sequence>
<xs:element name="listdate" type="common:zonedDateTimeValue"/>
<xs:element name="listdate" type="common:rfcZonedDateTimeValue"/>
<xs:element name="price" type="thing:listingPrice"/>
<xs:element name="condition" type="common:stringValue"/>
<xs:element name="notes" type="common:stringValue"/>
Expand Down

0 comments on commit 3c4bbe0

Please sign in to comment.