Skip to content

Commit e8d8396

Browse files
authored
Merge pull request #5 from anicetkeric/dev
complete code
2 parents 03c1f68 + 1c3485d commit e8d8396

File tree

10 files changed

+158
-49
lines changed

10 files changed

+158
-49
lines changed

src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public MongoItemWriter<Employee> writer(MongoTemplate mongoTemplate) {
6868

6969

7070
/**
71-
* Declaration step
71+
* step declaration
7272
* @return {@link Step}
7373
*/
7474
@Bean
@@ -84,7 +84,7 @@ public Step employeeStep(MongoItemWriter<Employee> itemWriter) {
8484

8585

8686
/**
87-
* Declaration job
87+
* job declaration
8888
* @param listener {@link JobCompletionListener}
8989
* @return {@link Job}
9090
*/

src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,19 @@ public class EmployeeJobLauncher {
2828

2929
private final JobLauncher jobLauncher;
3030

31-
@Value("${employee.excel.path}")
32-
private String excelFilePath;
31+
@Value("${employee.excel.processingfolder}")
32+
private String processingDir;
3333

3434
EmployeeJobLauncher(Job job, JobLauncher jobLauncher) {
3535
this.job = job;
3636
this.jobLauncher = jobLauncher;
3737
}
3838

39-
//@Scheduled(cron = "*/2 * * * *")
39+
// run every 2 min
4040
@Scheduled(fixedRate = 120000)
4141
void launchFileToJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException, JobRestartException {
4242
LOGGER.info("Starting job");
43+
String excelFilePath = String.format("%s/employee.xlsx", processingDir);
4344

4445
JobParameters params = new JobParametersBuilder()
4546
.addLong("jobId",System.currentTimeMillis())

src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class JobCompletionListener extends JobExecutionListenerSupport {
1818
public void afterJob(JobExecution jobExecution) {
1919

2020
String jobId = jobExecution.getJobParameters().getString("jobId");
21+
String excelFilePath = jobExecution.getJobParameters().getString("excelPath");
2122

2223
// get job's start time
2324
Date start = jobExecution.getCreateTime();
@@ -26,11 +27,12 @@ public void afterJob(JobExecution jobExecution) {
2627

2728
if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
2829

29-
LOGGER.info("===========================JOB FINISHED================================================");
30+
LOGGER.info("==========JOB FINISHED=======");
3031
LOGGER.info("JobId : {}",jobId);
32+
LOGGER.info("excel Path : {}",excelFilePath);
3133
LOGGER.info("Start Date: {}", start);
3234
LOGGER.info("End Date: {}", end);
33-
LOGGER.info("=======================================================================================");
35+
LOGGER.info("==============================");
3436
}
3537

3638
}
Lines changed: 97 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,124 @@
11
package com.springbatch.excel.tutorial.batch.processors;
22

33
import com.springbatch.excel.tutorial.domain.Employee;
4+
import com.springbatch.excel.tutorial.repository.EmployeeRepository;
5+
import com.springbatch.excel.tutorial.support.poi.AbstractExcelPoi;
6+
import lombok.SneakyThrows;
7+
import org.apache.poi.ss.usermodel.*;
8+
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
49
import org.slf4j.Logger;
510
import org.slf4j.LoggerFactory;
11+
import org.springframework.batch.core.BatchStatus;
12+
import org.springframework.batch.core.ExitStatus;
13+
import org.springframework.batch.core.StepExecution;
14+
import org.springframework.batch.core.StepExecutionListener;
615
import org.springframework.batch.item.ItemProcessor;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.beans.factory.annotation.Value;
18+
import org.springframework.core.io.ClassPathResource;
19+
import org.springframework.util.CollectionUtils;
20+
21+
import java.io.FileOutputStream;
22+
import java.io.IOException;
23+
import java.util.ArrayList;
24+
import java.util.Arrays;
25+
import java.util.List;
726

827

928
/**
1029
* @author Eric KOUAME
1130
*/
12-
public class EmployeeItemProcessor implements ItemProcessor<Employee, Employee> {
31+
public class EmployeeItemProcessor extends AbstractExcelPoi<Employee> implements ItemProcessor<Employee, Employee>, StepExecutionListener {
1332

1433
private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemProcessor.class);
1534

35+
private static final List<Employee> existingEmployees = new ArrayList<>();
1636

17-
public EmployeeItemProcessor() {
18-
super();
19-
}
37+
@Value("${employee.excel.resultsfolder}")
38+
private String resultsfolder;
39+
40+
@Autowired
41+
EmployeeRepository repository;
2042

2143
/**
2244
* {@inheritDoc}
2345
*/
2446
@Override
2547
public Employee process(Employee item) {
2648

49+
if(repository.findByNumber(item.getNumber()).isPresent()){
50+
existingEmployees.add(item);
51+
52+
return null;
53+
}
54+
2755
return item;
2856
}
2957

58+
@Override
59+
public void beforeStep(StepExecution stepExecution) {
60+
/* Nothing to do before */
61+
}
3062

63+
@SneakyThrows
64+
@Override
65+
public ExitStatus afterStep(StepExecution stepExecution) {
66+
String jobId = stepExecution.getJobParameters().getString("jobId");
67+
68+
if(stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) {
69+
// create log file. if completed
70+
String path = new ClassPathResource(resultsfolder).getFile().getPath();
71+
write(String.format("%s/employe-result-%s.xlsx", path, jobId),existingEmployees);
72+
}
73+
return null;
74+
}
75+
/**
76+
* Create and write results file. employee duplicate entries
77+
* @param filePath file path
78+
* @param aList list of employee
79+
*/
80+
@Override
81+
public void write(String filePath , List<Employee> aList) {
82+
try (XSSFWorkbook workbook = new XSSFWorkbook()) {
83+
// Create a Sheet
84+
Sheet sheet = workbook.createSheet("RESULTS");
85+
86+
// creation header
87+
CellStyle cellStyle = sheet.getWorkbook().createCellStyle();
88+
Font font = sheet.getWorkbook().createFont();
89+
font.setBold(true);
90+
font.setFontHeightInPoints((short) 12);
91+
cellStyle.setFont(font);
92+
93+
cellStyle.setAlignment(HorizontalAlignment.CENTER);
94+
List<String> headers = Arrays.asList("FirstName",
95+
"LastName",
96+
"Email",
97+
"Number"
98+
);
99+
createHeaderRow(sheet, headers,cellStyle);
100+
101+
// Create Other rows and cells with BeneficiaryExtraction data
102+
int rowNum = 1;
103+
for(Employee employee: aList) {
104+
Row row = sheet.createRow(rowNum++);
105+
106+
createCell(row, 0, employee.getFirstName(), null);
107+
createCell(row, 1, employee.getLastName(), null);
108+
createCell(row, 2, employee.getEmail(), null);
109+
createCell(row, 3, employee.getNumber(), null);
110+
}
111+
112+
//lets write the excel data to file now
113+
try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
114+
workbook.write(outputStream);
115+
LOGGER.info("Results File written successfully");
116+
}
117+
}
118+
catch (IOException e) {
119+
LOGGER.warn("Cannot write results file: {}", e.getMessage());
120+
}finally {
121+
existingEmployees.clear();
122+
}
123+
}
31124
}

src/main/java/com/springbatch/excel/tutorial/repository/EmployeeRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
import org.springframework.data.mongodb.repository.MongoRepository;
55
import org.springframework.stereotype.Repository;
66

7+
import java.util.Optional;
8+
79
@Repository
810
public interface EmployeeRepository extends MongoRepository<Employee, String> {
11+
12+
Optional<Employee> findByNumber(String number);
913
}

src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44

55
import com.springbatch.excel.tutorial.domain.Employee;
66

7-
import java.util.List;
87
import java.util.Optional;
98

109
public interface EmployeeService {
11-
List<Employee> getAll();
1210

13-
Employee save(Employee employee);
14-
15-
Optional<Employee> getById(String id);
16-
17-
void deleteById(String id);
11+
/**
12+
* @param number employee nuumber
13+
* @return Optional employee
14+
*/
15+
Optional<Employee> getByNumber(String number);
1816
}

src/main/java/com/springbatch/excel/tutorial/service/EmployeeServiceImpl.java

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,24 @@
22

33
import com.springbatch.excel.tutorial.domain.Employee;
44
import com.springbatch.excel.tutorial.repository.EmployeeRepository;
5-
import org.springframework.beans.factory.annotation.Autowired;
65
import org.springframework.stereotype.Service;
76

8-
import java.util.List;
97
import java.util.Optional;
108

119
@Service
1210
public class EmployeeServiceImpl implements EmployeeService {
1311

14-
@Autowired
15-
private EmployeeRepository employeeRepository;
12+
private final EmployeeRepository employeeRepository;
1613

17-
@Override
18-
public List<Employee> getAll() {
19-
return employeeRepository.findAll();
20-
}
21-
22-
@Override
23-
public Employee save(Employee employee) {
24-
return this.employeeRepository.save(employee);
25-
}
26-
27-
@Override
28-
public Optional<Employee> getById(String id) {
29-
return employeeRepository.findById(id);
14+
public EmployeeServiceImpl(EmployeeRepository employeeRepository) {
15+
this.employeeRepository = employeeRepository;
3016
}
3117

18+
/**
19+
* {@inheritDoc}
20+
*/
3221
@Override
33-
public void deleteById(String id) {
34-
this.employeeRepository.deleteById(id);
22+
public Optional<Employee> getByNumber(String number) {
23+
return employeeRepository.findByNumber(number);
3524
}
36-
37-
38-
3925
}

src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ private Workbook getWorkbook(String filePathStr) {
7878
}
7979

8080

81+
82+
8183
/**
8284
* Create header of file
8385
* @param sheet excel sheet
@@ -89,18 +91,41 @@ public void createHeaderRow(Sheet sheet, List<String> headers, CellStyle rowStyl
8991
if(!headers.isEmpty()){
9092
// Create a Row
9193
Row row = sheet.createRow(0);
92-
9394
// Create cells
9495
for (int i = 0; i < headers.size(); i++) {
95-
Cell cellId = row.createCell(i);
96-
if(rowStyle != null){
97-
cellId.setCellStyle(rowStyle);
98-
}
99-
cellId.setCellValue(headers.get(i));
100-
96+
createCell(row, i, headers.get(i), rowStyle);
10197
sheet.autoSizeColumn(i);
10298
}
10399
}
104100

105101
}
102+
103+
/**
104+
* @param row file row
105+
* @param columnCount index of column
106+
* @param value the value to will set
107+
* @param style cel row
108+
* @return Cell value
109+
*/
110+
public Cell createCell(Row row, int columnCount, Object value, CellStyle style) {
111+
Cell cell = row.createCell(columnCount);
112+
if (value instanceof Integer) {
113+
cell.setCellValue((Integer) value);
114+
} else if (value instanceof Boolean) {
115+
cell.setCellValue((Boolean) value);
116+
}else if (value instanceof Double) {
117+
cell.setCellValue((Double) value);
118+
} else {
119+
cell.setCellValue((String) value);
120+
}
121+
122+
123+
if(style != null){
124+
cell.setCellStyle(style);
125+
}
126+
127+
return cell;
128+
}
129+
130+
106131
}

src/main/resources/application.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ logging:
2121

2222
employee:
2323
excel:
24-
processing-dir: data/processing/
25-
results-dir: data/results/
24+
processingfolder: data/processing/
25+
resultsfolder: data/results/

src/main/resources/data/results/readme.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)