Skip to content

Commit f24323a

Browse files
AS-3092: Implement ImportBPUServiceImpl.
1 parent 21377d2 commit f24323a

File tree

11 files changed

+479
-20
lines changed

11 files changed

+479
-20
lines changed

farms-api/farms-persistence/src/main/java/ca/bc/gov/farms/persistence/v1/dao/ImportBPUDao.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,20 @@
55

66
import ca.bc.gov.brmb.common.persistence.dao.DaoException;
77
import ca.bc.gov.farms.persistence.v1.dto.ImportBPUDto;
8-
import ca.bc.gov.farms.persistence.v1.dto.ImportLogDto;
98

109
public interface ImportBPUDao extends Serializable {
1110

12-
void insertStagingRow(ImportBPUDto dto, String userId) throws DaoException;
11+
void insertStagingRow(ImportBPUDto dto, String userId, int rowNum) throws DaoException;
1312

1413
void clearStaging() throws DaoException;
1514

1615
void deleteStagingErrors(Long importVersionId) throws DaoException;
1716

1817
void validateStaging(Long importVersionId) throws DaoException;
1918

20-
List<ImportLogDto> getStagingErrors(Long importVersionId) throws DaoException;
19+
List<String> getStagingErrors(Long importVersionId) throws DaoException;
2120

2221
void stagingToOperational(Long importVersionId, String userId) throws DaoException;
22+
23+
void performImport(Long importVersionId, String userId) throws DaoException;
2324
}

farms-api/farms-persistence/src/main/java/ca/bc/gov/farms/persistence/v1/dao/mybatis/ImportBPUDaoImpl.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import ca.bc.gov.brmb.common.persistence.dao.mybatis.BaseDao;
1414
import ca.bc.gov.farms.persistence.v1.dao.ImportBPUDao;
1515
import ca.bc.gov.farms.persistence.v1.dto.ImportBPUDto;
16-
import ca.bc.gov.farms.persistence.v1.dto.ImportLogDto;
1716

1817
public class ImportBPUDaoImpl extends BaseDao implements ImportBPUDao {
1918

@@ -28,13 +27,13 @@ public ImportBPUDaoImpl(Connection c) {
2827
}
2928

3029
@Override
31-
public void insertStagingRow(ImportBPUDto dto, String userId) throws DaoException {
30+
public void insertStagingRow(ImportBPUDto dto, String userId, int rowNum) throws DaoException {
3231
logger.debug("<insertStagingRow");
3332

3433
try (CallableStatement callableStatement = this.conn
3534
.prepareCall(
3635
"{ call farms_bpu_pkg.insert_staging_row(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) }")) {
37-
callableStatement.setInt(1, dto.getLineNumber());
36+
callableStatement.setInt(1, rowNum);
3837
callableStatement.setInt(2, dto.getProgramYear());
3938
callableStatement.setString(3, dto.getMunicipalityCode());
4039
callableStatement.setString(4, dto.getInventoryItemCode());
@@ -105,10 +104,10 @@ public void validateStaging(Long importVersionId) throws DaoException {
105104
}
106105

107106
@Override
108-
public List<ImportLogDto> getStagingErrors(Long importVersionId) throws DaoException {
107+
public List<String> getStagingErrors(Long importVersionId) throws DaoException {
109108
logger.debug("<getStagingErrors");
110109

111-
List<ImportLogDto> importLogDtoList = new ArrayList<>();
110+
List<String> importLogDtoList = new ArrayList<>();
112111

113112
try (CallableStatement callableStatement = this.conn
114113
.prepareCall("{ ? = call farms_bpu_pkg.get_staging_errors(?) }")) {
@@ -119,9 +118,8 @@ public List<ImportLogDto> getStagingErrors(Long importVersionId) throws DaoExcep
119118

120119
ResultSet resultSet = callableStatement.getObject(1, ResultSet.class);
121120
while (resultSet.next()) {
122-
ImportLogDto importLogDto = new ImportLogDto();
123-
importLogDto.setLogMessage(resultSet.getString("log_message"));
124-
importLogDtoList.add(importLogDto);
121+
String logMessage = resultSet.getString("log_message");
122+
importLogDtoList.add(logMessage);
125123
}
126124
resultSet.close();
127125

@@ -149,4 +147,20 @@ public void stagingToOperational(Long importVersionId, String userId) throws Dao
149147
logger.debug(">stagingToOperational");
150148
}
151149

150+
@Override
151+
public void performImport(Long importVersionId, String userId) throws DaoException {
152+
logger.debug("<performImport");
153+
154+
try (CallableStatement callableStatement = this.conn
155+
.prepareCall("{ call farms_bpu_pkg.perform_import(?, ?) }")) {
156+
callableStatement.setLong(1, importVersionId);
157+
callableStatement.setString(2, userId);
158+
callableStatement.execute();
159+
} catch (RuntimeException | SQLException e) {
160+
handleException(e);
161+
}
162+
163+
logger.debug(">performImport");
164+
}
165+
152166
}

farms-api/farms-persistence/src/main/java/ca/bc/gov/farms/persistence/v1/dto/ImportBPUDto.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ public class ImportBPUDto implements Serializable {
77

88
private static final long serialVersionUID = 1L;
99

10-
private Integer lineNumber;
1110
private Integer programYear;
1211
private String municipalityCode;
1312
private String inventoryItemCode;
@@ -25,14 +24,6 @@ public class ImportBPUDto implements Serializable {
2524
private BigDecimal yearMinus2Expense;
2625
private BigDecimal yearMinus1Expense;
2726

28-
public Integer getLineNumber() {
29-
return lineNumber;
30-
}
31-
32-
public void setLineNumber(Integer lineNumber) {
33-
this.lineNumber = lineNumber;
34-
}
35-
3627
public Integer getProgramYear() {
3728
return programYear;
3829
}

farms-api/farms-service-api/pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@
4242
<groupId>org.slf4j</groupId>
4343
<artifactId>slf4j-api</artifactId>
4444
</dependency>
45+
<dependency>
46+
<groupId>org.apache.commons</groupId>
47+
<artifactId>commons-text</artifactId>
48+
</dependency>
49+
<dependency>
50+
<groupId>com.opencsv</groupId>
51+
<artifactId>opencsv</artifactId>
52+
</dependency>
4553
</dependencies>
4654

4755
</project>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package ca.bc.gov.farms.csv;
2+
3+
import java.io.InputStream;
4+
import java.math.BigDecimal;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import ca.bc.gov.farms.persistence.v1.dto.ImportBPUDto;
9+
10+
public class BpuFileHandle extends FileHandle<ImportBPUDto> {
11+
12+
public BpuFileHandle(InputStream inputStream) {
13+
super(inputStream);
14+
}
15+
16+
@Override
17+
protected ImportBPUDto parseLine(String[] line) {
18+
int index = 0;
19+
20+
ImportBPUDto dto = new ImportBPUDto();
21+
dto.setProgramYear(Integer.parseInt(line[index++].trim()));
22+
dto.setMunicipalityCode(line[index++].trim());
23+
dto.setInventoryItemCode(line[index++].trim());
24+
dto.setUnitComment(line[index++].trim());
25+
dto.setYearMinus6Margin(new BigDecimal(line[index++].trim()));
26+
dto.setYearMinus5Margin(new BigDecimal(line[index++].trim()));
27+
dto.setYearMinus4Margin(new BigDecimal(line[index++].trim()));
28+
dto.setYearMinus3Margin(new BigDecimal(line[index++].trim()));
29+
dto.setYearMinus2Margin(new BigDecimal(line[index++].trim()));
30+
dto.setYearMinus1Margin(new BigDecimal(line[index++].trim()));
31+
dto.setYearMinus6Expense(new BigDecimal(line[index++].trim()));
32+
dto.setYearMinus5Expense(new BigDecimal(line[index++].trim()));
33+
dto.setYearMinus4Expense(new BigDecimal(line[index++].trim()));
34+
dto.setYearMinus3Expense(new BigDecimal(line[index++].trim()));
35+
dto.setYearMinus2Expense(new BigDecimal(line[index++].trim()));
36+
dto.setYearMinus1Expense(new BigDecimal(line[index++].trim()));
37+
38+
return dto;
39+
}
40+
41+
@Override
42+
protected List<String> getExpectedHeaders() {
43+
return new ArrayList<String>() {
44+
{
45+
add("YEAR");
46+
add("MUNICIPALITY");
47+
add("INVENTORY_CODE");
48+
add("UNIT_DESCRIPTION");
49+
add("YEAR_MINUS_6_MARGIN");
50+
add("YEAR_MINUS_5_MARGIN");
51+
add("YEAR_MINUS_4_MARGIN");
52+
add("YEAR_MINUS_3_MARGIN");
53+
add("YEAR_MINUS_2_MARGIN");
54+
add("YEAR_MINUS_1_MARGIN");
55+
add("YEAR_MINUS_6_EXPENSE");
56+
add("YEAR_MINUS_5_EXPENSE");
57+
add("YEAR_MINUS_4_EXPENSE");
58+
add("YEAR_MINUS_3_EXPENSE");
59+
add("YEAR_MINUS_2_EXPENSE");
60+
add("YEAR_MINUS_1_EXPENSE");
61+
}
62+
};
63+
}
64+
65+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ca.bc.gov.farms.csv;
2+
3+
public class CSVParserException extends Exception {
4+
5+
private static final long serialVersionUID = 1L;
6+
7+
private int row;
8+
9+
private int fileNum;
10+
11+
public CSVParserException(int r, int f, Exception e) {
12+
super(e);
13+
this.row = r;
14+
this.fileNum = f;
15+
}
16+
17+
public CSVParserException(int r, int f, String s) {
18+
super(s);
19+
this.row = r;
20+
this.fileNum = f;
21+
}
22+
23+
public int getRowNumber() {
24+
return row;
25+
}
26+
27+
public int getFileNumber() {
28+
return fileNum;
29+
}
30+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package ca.bc.gov.farms.csv;
2+
3+
import java.io.InputStream;
4+
import java.io.InputStreamReader;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import com.opencsv.CSVReader;
9+
10+
public abstract class FileHandle<T> {
11+
12+
private String[] actualHeaders = {};
13+
14+
private List<T> records = new ArrayList<>();
15+
16+
protected FileHandle(InputStream inputStream) {
17+
try (InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
18+
CSVReader csvReader = new CSVReader(inputStreamReader)) {
19+
String[] line = null;
20+
while ((line = csvReader.readNext()) != null) {
21+
if (actualHeaders == null) {
22+
actualHeaders = line; // First line is the header
23+
} else {
24+
T record = parseLine(line);
25+
records.add(record);
26+
}
27+
}
28+
} catch (Exception e) {
29+
e.printStackTrace();
30+
throw new RuntimeException("Error processing CSV file", e);
31+
}
32+
}
33+
34+
protected abstract T parseLine(String[] line);
35+
36+
protected abstract List<String> getExpectedHeaders();
37+
38+
public String[] validate() {
39+
List<String> fileErrors = new ArrayList<>();
40+
List<String> expectedHeaders = getExpectedHeaders();
41+
42+
// compare header
43+
for (int i = 0; i < actualHeaders.length; i++) {
44+
if (actualHeaders[i] != null && !"".equals(actualHeaders[i].trim())
45+
&& !expectedHeaders.remove(actualHeaders[i].trim())) {
46+
fileErrors.add("Extra Header found: " + actualHeaders[i]);
47+
}
48+
}
49+
50+
for (String expectedHeader : expectedHeaders) {
51+
fileErrors.add("Header not found: " + expectedHeader);
52+
}
53+
54+
if (fileErrors.size() <= 0) {
55+
return null;
56+
}
57+
58+
return fileErrors.toArray(new String[fileErrors.size()]);
59+
}
60+
61+
public List<T> getRecords() {
62+
return records;
63+
}
64+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ca.bc.gov.farms.service.api.v1;
2+
3+
import java.io.InputStream;
4+
import java.util.List;
5+
6+
public interface ImportBPUService {
7+
8+
List<Object> getStagingErrors();
9+
10+
void importCSV(Long importVersionId, InputStream inputStream, String userId);
11+
12+
void processImport(Long importVersionId, String userId);
13+
}

0 commit comments

Comments
 (0)