4646import javax .persistence .PersistenceException ;
4747import lombok .extern .slf4j .Slf4j ;
4848import org .json .simple .JSONObject ;
49+ import java .time .Instant ;
50+ import java .time .ZoneOffset ;
51+ import java .time .format .DateTimeFormatter ;
4952
5053import static com .linkedin .metadata .dao .EbeanLocalDAO .*;
5154import static com .linkedin .metadata .dao .utils .EBeanDAOUtils .*;
5962 */
6063@ Slf4j
6164public class EbeanLocalAccess <URN extends Urn > implements IEbeanLocalAccess <URN > {
65+ public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS" ;
6266 private final EbeanServer _server ;
6367 private final Class <URN > _urnClass ;
6468 private final String _entityType ;
@@ -127,8 +131,12 @@ public <ASPECT extends RecordTemplate> int addWithOptimisticLocking(
127131 } else {
128132 sqlUpdate = _server .createSqlUpdate (SQLStatementUtils .createAspectUpsertSql (urn , aspectClass , urnExtraction , isTestMode ));
129133 }
134+
135+ String utcTimestamp = Instant .ofEpochMilli (timestamp )
136+ .atZone (ZoneOffset .UTC )
137+ .format (DateTimeFormatter .ofPattern (DATE_TIME_FORMAT ));
130138 sqlUpdate .setParameter ("urn" , urn .toString ())
131- .setParameter ("lastmodifiedon" , new Timestamp ( timestamp ). toString () )
139+ .setParameter ("lastmodifiedon" , utcTimestamp )
132140 .setParameter ("lastmodifiedby" , actor );
133141
134142 // If a non-default UrnPathExtractor is provided, the user MUST specify in their schema generation scripts
@@ -146,7 +154,7 @@ public <ASPECT extends RecordTemplate> int addWithOptimisticLocking(
146154 .setAspect (RecordUtils .toJsonString (newValue ))
147155 .setCanonicalName (aspectClass .getCanonicalName ())
148156 .setLastmodifiedby (actor )
149- .setLastmodifiedon (new Timestamp ( timestamp ). toString () )
157+ .setLastmodifiedon (utcTimestamp )
150158 .setCreatedfor (impersonator , SetMode .IGNORE_NULL );
151159 if (ingestionTrackingContext != null ) {
152160 auditedAspect .setEmitTime (ingestionTrackingContext .getEmitTime (), SetMode .IGNORE_NULL );
@@ -248,13 +256,16 @@ public <ASPECT_UNION extends RecordTemplate> int create(
248256
249257 sqlUpdate = _server .createSqlUpdate (insertStatement );
250258
259+ String utcTimestamp = Instant .ofEpochMilli (timestamp )
260+ .atZone (ZoneOffset .UTC )
261+ .format (DateTimeFormatter .ofPattern (DATE_TIME_FORMAT ));
251262 // Set parameters for each aspect value
252263 for (int i = 0 ; i < aspectValues .size (); i ++) {
253264 AuditedAspect auditedAspect = new AuditedAspect ()
254265 .setAspect (RecordUtils .toJsonString (aspectValues .get (i )))
255266 .setCanonicalName (aspectCreateLambdas .get (i ).getAspectClass ().getCanonicalName ())
256267 .setLastmodifiedby (actor )
257- .setLastmodifiedon (new Timestamp ( timestamp ). toString () )
268+ .setLastmodifiedon (utcTimestamp )
258269 .setCreatedfor (impersonator , SetMode .IGNORE_NULL );
259270 if (ingestionTrackingContext != null ) {
260271 auditedAspect .setEmitTime (ingestionTrackingContext .getEmitTime (), SetMode .IGNORE_NULL );
@@ -270,7 +281,7 @@ public <ASPECT_UNION extends RecordTemplate> int create(
270281 sqlUpdate .setParameter ("a_urn" , toJsonString (urn ));
271282 }
272283 sqlUpdate .setParameter ("urn" , urn .toString ())
273- .setParameter ("lastmodifiedon" , new Timestamp ( timestamp ). toString () )
284+ .setParameter ("lastmodifiedon" , utcTimestamp )
274285 .setParameter ("lastmodifiedby" , actor );
275286
276287 return sqlUpdate .execute ();
@@ -399,9 +410,11 @@ public <ASPECT extends RecordTemplate> ListResult<ASPECT> list(@Nonnull Class<AS
399410 final ASPECT aspect = RecordUtils .toRecordTemplate (aspectClass ,
400411 extractAspectJsonString (sqlRow .getString (getAspectColumnName (urn .getEntityType (), aspectClass ))));
401412 final ListResultMetadata listResultMetadata = new ListResultMetadata ().setExtraInfos (new ExtraInfoArray ());
413+
414+ Timestamp utcTimeStamp = timeStampStringToTimeStamp (sqlRow .getString ("lastmodifiedon" ));
402415 final ExtraInfo extraInfo = new ExtraInfo ().setUrn (urn )
403416 .setVersion (LATEST_VERSION )
404- .setAudit (makeAuditStamp (sqlRow . getTimestamp ( "lastmodifiedon" ) , sqlRow .getString ("lastmodifiedby" ),
417+ .setAudit (makeAuditStamp (utcTimeStamp , sqlRow .getString ("lastmodifiedby" ),
405418 sqlRow .getString ("createdfor" )));
406419 listResultMetadata .getExtraInfos ().add (extraInfo );
407420 return toListResult (Collections .singletonList (aspect ), Collections .singletonList (sqlRow ), listResultMetadata ,
@@ -427,9 +440,10 @@ public <ASPECT extends RecordTemplate> ListResult<ASPECT> list(@Nonnull Class<AS
427440 }
428441 final ListResultMetadata listResultMetadata = new ListResultMetadata ().setExtraInfos (new ExtraInfoArray ());
429442 final List <ASPECT > aspectList = sqlRows .stream ().map (sqlRow -> {
443+ Timestamp utcTimeStamp = timeStampStringToTimeStamp (sqlRow .getString ("lastmodifiedon" ));
430444 final ExtraInfo extraInfo = new ExtraInfo ().setUrn (getUrn (sqlRow .getString ("urn" ), _urnClass ))
431445 .setVersion (LATEST_VERSION ).setAudit (
432- makeAuditStamp (sqlRow . getTimestamp ( "lastmodifiedon" ) , sqlRow .getString ("lastmodifiedby" ),
446+ makeAuditStamp (utcTimeStamp , sqlRow .getString ("lastmodifiedby" ),
433447 sqlRow .getString ("createdfor" )));
434448 listResultMetadata .getExtraInfos ().add (extraInfo );
435449 return RecordUtils .toRecordTemplate (aspectClass ,
@@ -664,6 +678,7 @@ private static <ASPECT extends RecordTemplate, URN> EbeanMetadataAspect findLate
664678 ebeanMetadataAspect .setMetadata (resultSet .getString ("metadata" ));
665679 ebeanMetadataAspect .setCreatedFor (resultSet .getString ("createdFor" ));
666680 ebeanMetadataAspect .setCreatedBy (resultSet .getString ("createdBy" ));
681+ // Not changing specifically to UTC because this method is specific to older schema
667682 ebeanMetadataAspect .setCreatedOn (resultSet .getTimestamp ("createdOn" ));
668683 return ebeanMetadataAspect ;
669684 } else {
0 commit comments