33import com .fasterxml .jackson .core .JsonProcessingException ;
44import com .rawlabs .das .sdk .java .exceptions .DASSdkApiException ;
55import com .rawlabs .protocol .das .Row ;
6+ import org .joda .time .DateTime ;
7+ import org .joda .time .DateTimeZone ;
68
9+ import java .time .OffsetDateTime ;
10+ import java .time .ZoneId ;
11+ import java .time .format .DateTimeFormatter ;
712import java .util .*;
813
914@ SuppressWarnings ("unchecked" )
1015public abstract class DASJiraIssueTransformationTable extends DASJiraTable {
16+
17+ private final ZoneId localZoneId ;
18+ private final ZoneId remoteZoneId ;
19+ DateTimeFormatter offsetTimeFormatter = DateTimeFormatter .ofPattern ("yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
20+
1121 protected DASJiraIssueTransformationTable (
12- Map <String , String > options , String table , String description ) {
22+ Map <String , String > options , ZoneId remoteZoneId , String table , String description ) {
1323 super (options , table , description );
24+ localZoneId = ZoneId .of (options .get ("timezone" ));
25+ this .remoteZoneId = remoteZoneId ;
1426 }
1527
1628 protected void processFields (
@@ -52,11 +64,12 @@ protected void processFields(
5264 assignee .map (a -> a .get ("displayName" )).orElse (null ),
5365 columns );
5466
55- addToRow (
56- "created" ,
57- rowBuilder ,
58- maybeFields .map (f -> f .get (names .get ("Created" ))).orElse (null ),
59- columns );
67+ String created =
68+ maybeFields
69+ .map (f -> f .get (names .get ("Created" )))
70+ .map (c -> toLocal (c .toString ()).format (DateTimeFormatter .ISO_LOCAL_DATE_TIME ))
71+ .orElse (null );
72+ addToRow ("created" , rowBuilder , created , columns );
6073
6174 var creator =
6275 maybeFields .map (f -> f .get (names .get ("Creator" ))).map (p -> (Map <String , Object >) p );
@@ -87,11 +100,13 @@ protected void processFields(
87100 throw new DASSdkApiException ("error processing 'description'" , e );
88101 }
89102
90- addToRow (
91- "due_date" ,
92- rowBuilder ,
93- maybeFields .map (f -> f .get (names .get ("Due date" ))).orElse (null ),
94- columns );
103+ String due_date =
104+ maybeFields
105+ .flatMap (f -> Optional .ofNullable (f .get (names .get ("Due date" ))))
106+ .map (Object ::toString )
107+ .orElse (null );
108+
109+ addToRow ("due_date" , rowBuilder , due_date , columns );
95110
96111 var priority =
97112 maybeFields .map (f -> f .get (names .get ("Priority" ))).map (p -> (Map <String , Object >) p );
@@ -106,12 +121,20 @@ protected void processFields(
106121 rowBuilder ,
107122 reporter .map (r -> r .get ("accountId" )).orElse (null ),
108123 columns );
124+
109125 addToRow (
110126 "reporter_display_name" ,
111127 rowBuilder ,
112128 reporter .map (r -> r .get ("displayName" )).orElse (null ),
113129 columns );
114130
131+ String resolved =
132+ maybeFields
133+ .flatMap (f -> Optional .ofNullable (f .get (names .get ("Resolved" ))))
134+ .map (c -> toLocal (c .toString ()).format (DateTimeFormatter .ISO_LOCAL_DATE_TIME ))
135+ .orElse (null );
136+ addToRow ("resolution_date" , rowBuilder , resolved , columns );
137+
115138 addToRow (
116139 "summary" ,
117140 rowBuilder ,
@@ -129,7 +152,10 @@ protected void processFields(
129152 addToRow (
130153 "updated" ,
131154 rowBuilder ,
132- maybeFields .map (f -> f .get (names .get ("Updated" ))).orElse (null ),
155+ maybeFields
156+ .map (f -> f .get (names .get ("Updated" )))
157+ .map (c -> toLocal (c .toString ()).format (DateTimeFormatter .ISO_LOCAL_DATE_TIME ))
158+ .orElse (null ),
133159 columns );
134160
135161 var componentIds =
@@ -177,4 +203,10 @@ protected void processFields(
177203 throw new DASSdkApiException (e .getMessage ());
178204 }
179205 }
206+
207+ private OffsetDateTime toLocal (String remoteTime ) {
208+ return OffsetDateTime .parse (remoteTime , offsetTimeFormatter )
209+ .atZoneSameInstant (localZoneId )
210+ .toOffsetDateTime ();
211+ }
180212}
0 commit comments