From d7cbe9cad59fece0a24728e3f7c3b115114358ee Mon Sep 17 00:00:00 2001 From: LO Kam Tao Leo Date: Thu, 3 Nov 2022 17:33:31 +0000 Subject: [PATCH] Parsing Schedule Associations --- .../leolo/nrdatad/model/ScheduleAssociation.java | 191 ++++++++++++++++++++- .../nrdatad/model/ScheduleAssociationTest.java | 56 ++++++ 2 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/leolo/nrdatad/model/ScheduleAssociationTest.java diff --git a/src/main/java/org/leolo/nrdatad/model/ScheduleAssociation.java b/src/main/java/org/leolo/nrdatad/model/ScheduleAssociation.java index a3c792b..795a333 100644 --- a/src/main/java/org/leolo/nrdatad/model/ScheduleAssociation.java +++ b/src/main/java/org/leolo/nrdatad/model/ScheduleAssociation.java @@ -1,2 +1,191 @@ -package org.leolo.nrdatad.model;public class ScheduleAssociation { +package org.leolo.nrdatad.model; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONException; +import org.json.JSONObject; +import org.leolo.nrdatad.util.TUIDDateFormat; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class ScheduleAssociation { + private static Logger log = LogManager.getLogger(); + + private String mainUid; + private String assoUid; + private Date startDate; + private Date endDate; + private String assoDays; + private AssociationCategory associationCategory; + private int associationDate; + private String associationLocation; + private String baseLocationSuffix; + private String assocLocationSuffix; + private ShortTermPlanningIndicator stpIndicator; + + private TUIDDateFormat tuidDateFormat = new TUIDDateFormat(); + + public String getAuid(){ + return mainUid+assoUid+associationLocation+tuidDateFormat.format(startDate)+tuidDateFormat.format(endDate); + } + + public String getMainUid() { + return mainUid; + } + + public void setMainUid(String mainUid) { + this.mainUid = mainUid; + } + + public String getAssoUid() { + return assoUid; + } + + public void setAssoUid(String assoUid) { + this.assoUid = assoUid; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getAssoDays() { + return assoDays; + } + + public void setAssoDays(String assoDays) { + this.assoDays = assoDays; + } + + public AssociationCategory getAssociationCategory() { + return associationCategory; + } + + public void setAssociationCategory(AssociationCategory associationCategory) { + this.associationCategory = associationCategory; + } + + public int getAssociationDate() { + return associationDate; + } + + public void setAssociationDate(int associationDate) { + this.associationDate = associationDate; + } + + public String getAssociationLocation() { + return associationLocation; + } + + public void setAssociationLocation(String associationLocation) { + this.associationLocation = associationLocation; + } + + public String getBaseLocationSuffix() { + return baseLocationSuffix; + } + + public void setBaseLocationSuffix(String baseLocationSuffix) { + this.baseLocationSuffix = baseLocationSuffix; + } + + public String getAssocLocationSuffix() { + return assocLocationSuffix; + } + + public void setAssocLocationSuffix(String assocLocationSuffix) { + this.assocLocationSuffix = assocLocationSuffix; + } + + public ShortTermPlanningIndicator getStpIndicator() { + return stpIndicator; + } + + public void setStpIndicator(ShortTermPlanningIndicator stpIndicator) { + this.stpIndicator = stpIndicator; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ScheduleAssociation that = (ScheduleAssociation) o; + + if (associationDate != that.associationDate) return false; + if (!mainUid.equals(that.mainUid)) return false; + if (!assoUid.equals(that.assoUid)) return false; + if (!startDate.equals(that.startDate)) return false; + if (!endDate.equals(that.endDate)) return false; + if (!assoDays.equals(that.assoDays)) return false; + if (associationCategory != that.associationCategory) return false; + if (!associationLocation.equals(that.associationLocation)) return false; + if (baseLocationSuffix != null ? !baseLocationSuffix.equals(that.baseLocationSuffix) : that.baseLocationSuffix != null) + return false; + if (assocLocationSuffix != null ? !assocLocationSuffix.equals(that.assocLocationSuffix) : that.assocLocationSuffix != null) + return false; + return stpIndicator == that.stpIndicator; + } + + @Override + public int hashCode() { + int result = mainUid.hashCode(); + result = 31 * result + assoUid.hashCode(); + result = 31 * result + startDate.hashCode(); + result = 31 * result + endDate.hashCode(); + result = 31 * result + assoDays.hashCode(); + result = 31 * result + associationCategory.hashCode(); + result = 31 * result + associationDate; + result = 31 * result + associationLocation.hashCode(); + result = 31 * result + (baseLocationSuffix != null ? baseLocationSuffix.hashCode() : 0); + result = 31 * result + (assocLocationSuffix != null ? assocLocationSuffix.hashCode() : 0); + return result; + } + + public static ScheduleAssociation parseJOSN(String obj) throws JSONException { + return parseJSON(new JSONObject(obj)); + } + + public static ScheduleAssociation parseJSON(JSONObject obj) throws JSONException { + ScheduleAssociation scheduleAssociation = new ScheduleAssociation(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + scheduleAssociation.mainUid=obj.optString("main_train_uid").strip(); + scheduleAssociation.assoUid=obj.optString("assoc_train_uid").strip(); + try { + scheduleAssociation.startDate=sdf.parse(obj.optString("assoc_start_date")); + scheduleAssociation.endDate=sdf.parse(obj.optString("assoc_end_date")); + } catch (ParseException e) { + log.atWarn().withThrowable(e).log("Unable to parse date"); + } + scheduleAssociation.assoDays=obj.optString("assoc_days"); + scheduleAssociation.associationCategory = AssociationCategory.parseCode(obj.optString("category")); + String dateIndicator = obj.optString("date_indicator"); + if("N".equals(dateIndicator)){ + scheduleAssociation.associationDate = 1; + } else if ("P".equals(dateIndicator)) { + scheduleAssociation.associationDate = -1; + }else { + scheduleAssociation.associationDate = 0; + } + scheduleAssociation.associationLocation = obj.optString("location").strip(); + scheduleAssociation.baseLocationSuffix = obj.optString("base_location_suffix"); + scheduleAssociation.assocLocationSuffix = obj.optString("assoc_location_suffix"); + scheduleAssociation.stpIndicator = ShortTermPlanningIndicator.parseCode(obj.optString("CIF_stp_indicator")); + return scheduleAssociation; + } + } diff --git a/src/test/java/org/leolo/nrdatad/model/ScheduleAssociationTest.java b/src/test/java/org/leolo/nrdatad/model/ScheduleAssociationTest.java new file mode 100644 index 0000000..1c2f74f --- /dev/null +++ b/src/test/java/org/leolo/nrdatad/model/ScheduleAssociationTest.java @@ -0,0 +1,56 @@ +package org.leolo.nrdatad.model; + +import org.junit.Test; + +import java.text.ParseException; +import java.text.SimpleDateFormat; + +import static org.junit.Assert.*; + +public class ScheduleAssociationTest { + + @Test public void basicCase() throws ParseException { + String json = "{\"diagram_type\":\"T\",\"assoc_end_date\":\"2022-12-05T00:00:00Z\",\"assoc_location_suffix\":null," + + "\"assoc_days\":\"1000000\",\"assoc_train_uid\":\"L77547\",\"transaction_type\":\"Create\"," + + "\"date_indicator\":\"S\",\"base_location_suffix\":null,\"main_train_uid\":\"L77935\"," + + "\"CIF_stp_indicator\":\"P\",\"assoc_start_date\":\"2022-05-16T00:00:00Z\"," + + "\"location\":\"KNGX\",\"category\":\"NP\"}"; + ScheduleAssociation sa = ScheduleAssociation.parseJOSN(json); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + assertEquals(sdf.parse("20221205"), sa.getEndDate()); + assertEquals("", sa.getAssocLocationSuffix()); + assertEquals("1000000", sa.getAssoDays()); + assertEquals("L77547", sa.getAssoUid()); + assertEquals(0, sa.getAssociationDate()); + assertEquals("", sa.getBaseLocationSuffix()); + assertEquals("L77935", sa.getMainUid()); + assertEquals(ShortTermPlanningIndicator.PERMANENT, sa.getStpIndicator()); + assertEquals(sdf.parse("20220516"), sa.getStartDate()); + assertEquals("KNGX", sa.getAssociationLocation()); + assertEquals(AssociationCategory.NEXT, sa.getAssociationCategory()); + assertEquals("L77935L77547KNGXPFE4", sa.getAuid()); + } + + @Test public void vstpAssoc() throws ParseException { + String json = "{\"diagram_type\":\"T\",\"assoc_end_date\":\"2022-12-05T00:00:00Z\",\"assoc_location_suffix\":null," + + "\"assoc_days\":\"1000000\",\"assoc_train_uid\":\" 77547\",\"transaction_type\":\"Create\"," + + "\"date_indicator\":\"S\",\"base_location_suffix\":null,\"main_train_uid\":\" 77935\"," + + "\"CIF_stp_indicator\":\"P\",\"assoc_start_date\":\"2022-05-16T00:00:00Z\"," + + "\"location\":\"KNGX\",\"category\":\"NP\"}"; + ScheduleAssociation sa = ScheduleAssociation.parseJOSN(json); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + assertEquals(sdf.parse("20221205"), sa.getEndDate()); + assertEquals("", sa.getAssocLocationSuffix()); + assertEquals("1000000", sa.getAssoDays()); + assertEquals("77547", sa.getAssoUid()); + assertEquals(0, sa.getAssociationDate()); + assertEquals("", sa.getBaseLocationSuffix()); + assertEquals("77935", sa.getMainUid()); + assertEquals(ShortTermPlanningIndicator.PERMANENT, sa.getStpIndicator()); + assertEquals(sdf.parse("20220516"), sa.getStartDate()); + assertEquals("KNGX", sa.getAssociationLocation()); + assertEquals(AssociationCategory.NEXT, sa.getAssociationCategory()); + assertEquals("7793577547KNGXPFE4", sa.getAuid()); + } + +} \ No newline at end of file