Skip to content

Commit

Permalink
refactored tac cron with trdm util
Browse files Browse the repository at this point in the history
  • Loading branch information
cameroncaci committed Dec 11, 2023
1 parent eed31dd commit e1092d6
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 136 deletions.
Original file line number Diff line number Diff line change
@@ -1,69 +1,30 @@
package com.milmove.trdmlambda.milmove.handler;

import com.milmove.trdmlambda.milmove.service.LastTableUpdateService;
import com.milmove.trdmlambda.milmove.util.TransportationAccountingCodeParser;
import com.milmove.trdmlambda.milmove.util.Trdm;

import ch.qos.logback.classic.Logger;

import com.milmove.trdmlambda.milmove.service.DatabaseService;
import com.milmove.trdmlambda.milmove.service.GetTableService;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.milmove.trdmlambda.milmove.exceptions.TableRequestException;
import com.milmove.trdmlambda.milmove.model.TransportationAccountingCode;
import com.milmove.trdmlambda.milmove.model.gettable.GetTableRequest;
import com.milmove.trdmlambda.milmove.model.gettable.GetTableResponse;
import com.milmove.trdmlambda.milmove.model.lasttableupdate.LastTableUpdateRequest;
import com.milmove.trdmlambda.milmove.model.lasttableupdate.LastTableUpdateResponse;

@Component
public class TransportationAccountingCodesHandler {
private Logger logger = (Logger) LoggerFactory.getLogger(TransportationAccountingCodesHandler.class);

private final LastTableUpdateService lastTableUpdateService;
private final GetTableService getTableService;
private final DatabaseService databaseService;
private final TransportationAccountingCodeParser tacParser;
private final Connection rdsConnection;
// TODO: Static table names
private static final Set<String> allowedTableNames = Set.of("transportation_accounting_codes",
"lines_of_accounting"); // RDS
private static final Set<String> allowedTrdmTableNames = Set.of("TRNSPRTN_ACNT", "LN_OF_ACCT"); // TRDM
private static final int yearsToReturnIfOurTableIsEmpty = 3;

public TransportationAccountingCodesHandler(
LastTableUpdateService lastTableUpdateService,
GetTableService getTableService,
DatabaseService databaseService,
TransportationAccountingCodeParser tacParser) throws SQLException {
private Trdm trdmUtil;

this.lastTableUpdateService = lastTableUpdateService;
this.getTableService = getTableService;
this.databaseService = databaseService;
this.tacParser = tacParser;

rdsConnection = databaseService.getConnection();
public TransportationAccountingCodesHandler(Trdm trdmUtil) {
this.trdmUtil = trdmUtil;
}

// This cron job will handle the entirety of ensuring the RDS db
Expand All @@ -72,106 +33,18 @@ public void tacCron()
throws SQLException, DatatypeConfigurationException, TableRequestException, IOException, ParseException {
// Gather the last update from TRDM
logger.info("getting lastTableUpdate response with physical name TRNSPRTN_ACNT");
LastTableUpdateResponse response = lastTableUpdate("TRNSPRTN_ACNT");
LastTableUpdateResponse response = trdmUtil.LastTableUpdate("TRNSPRTN_ACNT");
logger.info("received LastTableUpdateResponse, getting our latest TGET update now");
XMLGregorianCalendar ourLastUpdate = getOurLastTGETUpdate("transportation_accounting_codes");
XMLGregorianCalendar ourLastUpdate = trdmUtil.GetOurLastTGETUpdate("transportation_accounting_codes");
logger.info("received out latest TGET update. Comparing the 2 values to see if our TGET data is out of date");
boolean tgetOutOfDate = isTGETDataOutOfDate(ourLastUpdate, response.getLastUpdate());
boolean tgetOutOfDate = trdmUtil.IsTGETDataOutOfDate(ourLastUpdate, response.getLastUpdate());
if (tgetOutOfDate) {
logger.info("TAC TGET data is out of date. Starting updateTGETData flow");
updateTGETData(ourLastUpdate, "TRNSPRTN_ACNT", "transportation_accounting_codes");
trdmUtil.UpdateTGETData(ourLastUpdate, "TRNSPRTN_ACNT", "transportation_accounting_codes");
logger.info("finished updating TAC TGET data");
} else {
// The data in RDS is up to date, no need to proceed
logger.info("Transportation Accounting Codes RDS Table TGET data already up to date");
}
}

private LastTableUpdateResponse lastTableUpdate(String physicalName) throws TableRequestException {
logger.info(" calling TRDM lastTableUpdate for table {}", physicalName);
LastTableUpdateRequest requestBody = new LastTableUpdateRequest();
requestBody.setPhysicalName(physicalName);
return lastTableUpdateService.lastTableUpdateRequest(requestBody);
}

private XMLGregorianCalendar getOurLastTGETUpdate(String tableName)
throws SQLException, DatatypeConfigurationException, ParseException {
if (!allowedTableNames.contains(tableName)) {
throw new IllegalArgumentException("Invalid table name");
}

String query = "SELECT MAX(updated_at) AS rds_last_updated FROM " + tableName;
PreparedStatement pstmt = rdsConnection.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();

if (rs.next()) {
Timestamp lastUpdatedTimestamp = rs.getTimestamp("rds_last_updated");

// Convert our last update pulled from the db into XML Gregorian Calendar
// friendly format ending in "Z" for Zulu.
SimpleDateFormat xmlUnfriendlyLastUpdateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
SimpleDateFormat xmlFriendlyLastUpdateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
xmlFriendlyLastUpdateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = xmlUnfriendlyLastUpdateFormat.parse(lastUpdatedTimestamp.toString());
String xmlGregorianCalendarString = xmlFriendlyLastUpdateFormat.format(date);

return DatatypeFactory.newInstance().newXMLGregorianCalendar(xmlGregorianCalendarString);
}

// If table was empty, return default years to retrieve as we have no TGET data
GregorianCalendar calendar = new GregorianCalendar();
calendar.add(Calendar.YEAR, -yearsToReturnIfOurTableIsEmpty);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
}

public static XMLGregorianCalendar addOneWeek(XMLGregorianCalendar originalDate) throws DatatypeConfigurationException {
GregorianCalendar calendar = originalDate.toGregorianCalendar();
calendar.add(GregorianCalendar.WEEK_OF_YEAR, 1);

SimpleDateFormat xmlFriendlyLastUpdateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
xmlFriendlyLastUpdateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String xmlGregorianCalendarString = xmlFriendlyLastUpdateFormat.format(calendar.getTime());

return DatatypeFactory.newInstance().newXMLGregorianCalendar(xmlGregorianCalendarString);
}

private boolean isTGETDataOutOfDate(XMLGregorianCalendar ourLastUpdate, XMLGregorianCalendar trdmLastUpdate) {
return ourLastUpdate.compare(trdmLastUpdate) < 0;
}

private void updateTGETData(XMLGregorianCalendar ourLastUpdate, String trdmTable, String rdsTable)
throws TableRequestException, DatatypeConfigurationException, IOException, SQLException {
logger.info("checking if trdm table name provided is allowed..");
if (!allowedTrdmTableNames.contains(trdmTable)) {
throw new IllegalArgumentException("Invalid table name");
}
logger.info("table {} is allowed, proceeding", trdmTable);

XMLGregorianCalendar oneWeekLater = addOneWeek(ourLastUpdate);

// Request all TGET data from TRDM since our last update
GetTableRequest getTableRequestBody = new GetTableRequest();
getTableRequestBody.setPhysicalName(trdmTable);
getTableRequestBody.setContentUpdatedSinceDateTime(ourLastUpdate.toString());
getTableRequestBody.setReturnContent(true);
getTableRequestBody.setContentUpdatedOnOrBeforeDateTime(oneWeekLater.toString());
logger.info("calling TRDM getTable with provided body {}", getTableRequestBody);
GetTableResponse getTableResponse = getTableService.getTableRequest(getTableRequestBody);
logger.info("received response back from TRDM getTable, beginning to parse..");
// Parse the response attachment to get the codes
List<TransportationAccountingCode> codes = tacParser.parse(getTableResponse.getAttachment());

// Insert the codes into RDS
logger.info("inserting TACs into DB");
switch (rdsTable) {
case "transportation_accounting_codes":
databaseService.insertTransportationAccountingCodes(codes);
logger.info("finished inserting TACs into DB");
break;
case "lines_of_accounting":
// TODO:
default:
throw new IllegalArgumentException("Invalid rds table name");
}
}
}
156 changes: 156 additions & 0 deletions src/main/java/com/milmove/trdmlambda/milmove/util/Trdm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package com.milmove.trdmlambda.milmove.util;

import com.milmove.trdmlambda.milmove.service.LastTableUpdateService;

import ch.qos.logback.classic.Logger;

import com.milmove.trdmlambda.milmove.service.DatabaseService;
import com.milmove.trdmlambda.milmove.service.GetTableService;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.milmove.trdmlambda.milmove.exceptions.TableRequestException;
import com.milmove.trdmlambda.milmove.model.TransportationAccountingCode;
import com.milmove.trdmlambda.milmove.model.gettable.GetTableRequest;
import com.milmove.trdmlambda.milmove.model.gettable.GetTableResponse;
import com.milmove.trdmlambda.milmove.model.lasttableupdate.LastTableUpdateRequest;
import com.milmove.trdmlambda.milmove.model.lasttableupdate.LastTableUpdateResponse;

@Component
public class Trdm {
private Logger logger = (Logger) LoggerFactory.getLogger(Trdm.class);

private final LastTableUpdateService lastTableUpdateService;
private final GetTableService getTableService;
private final DatabaseService databaseService;
private final TransportationAccountingCodeParser tacParser;
private final Connection rdsConnection;
private static final Set<String> allowedTableNames = Set.of("transportation_accounting_codes",
"lines_of_accounting"); // RDS
private static final Set<String> allowedTrdmTableNames = Set.of("TRNSPRTN_ACNT", "LN_OF_ACCT"); // TRDM
private static final int yearsToReturnIfOurTableIsEmpty = 3;

public Trdm(LastTableUpdateService lastTableUpdateService,
GetTableService getTableService,
DatabaseService databaseService,
TransportationAccountingCodeParser tacParser) throws SQLException {

this.lastTableUpdateService = lastTableUpdateService;
this.getTableService = getTableService;
this.databaseService = databaseService;
this.tacParser = tacParser;

rdsConnection = databaseService.getConnection();

}

public LastTableUpdateResponse LastTableUpdate(String physicalName) throws TableRequestException {
logger.info(" calling TRDM lastTableUpdate for table {}", physicalName);
LastTableUpdateRequest requestBody = new LastTableUpdateRequest();
requestBody.setPhysicalName(physicalName);
return lastTableUpdateService.lastTableUpdateRequest(requestBody);
}

public XMLGregorianCalendar GetOurLastTGETUpdate(String tableName)
throws SQLException, DatatypeConfigurationException, ParseException {
if (!allowedTableNames.contains(tableName)) {
throw new IllegalArgumentException("Invalid table name");
}

String query = "SELECT MAX(updated_at) AS rds_last_updated FROM " + tableName;
PreparedStatement pstmt = rdsConnection.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();

if (rs.next()) {
Timestamp lastUpdatedTimestamp = rs.getTimestamp("rds_last_updated");

// Convert our last update pulled from the db into XML Gregorian Calendar
// friendly format ending in "Z" for Zulu.
SimpleDateFormat xmlUnfriendlyLastUpdateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
SimpleDateFormat xmlFriendlyLastUpdateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
xmlFriendlyLastUpdateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = xmlUnfriendlyLastUpdateFormat.parse(lastUpdatedTimestamp.toString());
String xmlGregorianCalendarString = xmlFriendlyLastUpdateFormat.format(date);

return DatatypeFactory.newInstance().newXMLGregorianCalendar(xmlGregorianCalendarString);
}

// If table was empty, return default years to retrieve as we have no TGET data
GregorianCalendar calendar = new GregorianCalendar();
calendar.add(Calendar.YEAR, -yearsToReturnIfOurTableIsEmpty);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
}

public static XMLGregorianCalendar AddOneWeek(XMLGregorianCalendar originalDate)
throws DatatypeConfigurationException {
GregorianCalendar calendar = originalDate.toGregorianCalendar();
calendar.add(GregorianCalendar.WEEK_OF_YEAR, 1);

SimpleDateFormat xmlFriendlyLastUpdateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
xmlFriendlyLastUpdateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String xmlGregorianCalendarString = xmlFriendlyLastUpdateFormat.format(calendar.getTime());

return DatatypeFactory.newInstance().newXMLGregorianCalendar(xmlGregorianCalendarString);
}

public boolean IsTGETDataOutOfDate(XMLGregorianCalendar ourLastUpdate, XMLGregorianCalendar trdmLastUpdate) {
return ourLastUpdate.compare(trdmLastUpdate) < 0;
}

public void UpdateTGETData(XMLGregorianCalendar ourLastUpdate, String trdmTable, String rdsTable)
throws TableRequestException, DatatypeConfigurationException, IOException, SQLException {
logger.info("checking if trdm table name provided is allowed..");
if (!allowedTrdmTableNames.contains(trdmTable)) {
throw new IllegalArgumentException("Invalid table name");
}
logger.info("table {} is allowed, proceeding", trdmTable);

XMLGregorianCalendar oneWeekLater = AddOneWeek(ourLastUpdate);

// Request all TGET data from TRDM since our last update
GetTableRequest getTableRequestBody = new GetTableRequest();
getTableRequestBody.setPhysicalName(trdmTable);
getTableRequestBody.setContentUpdatedSinceDateTime(ourLastUpdate.toString());
getTableRequestBody.setReturnContent(true);
getTableRequestBody.setContentUpdatedOnOrBeforeDateTime(oneWeekLater.toString());
logger.info("calling TRDM getTable with provided body {}", getTableRequestBody);
GetTableResponse getTableResponse = getTableService.getTableRequest(getTableRequestBody);

// Insert the codes into RDS
switch (rdsTable) {
case "transportation_accounting_codes":
// Parse the response attachment to get the codes
logger.info("parsing response back from TRDM getTable");
List<TransportationAccountingCode> codes = tacParser.parse(getTableResponse.getAttachment());
logger.info("inserting TACs into DB");
databaseService.insertTransportationAccountingCodes(codes);
logger.info("finished inserting TACs into DB");
break;
case "lines_of_accounting":
// TODO:
default:
throw new IllegalArgumentException("Invalid rds table name");
}
}
}

0 comments on commit e1092d6

Please sign in to comment.