diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..e7f9026 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,20 @@ +version: "2.2" +services: + mongo: + image: mongo:5.0 + container_name: mongo + restart: unless-stopped + ports: + - "27017:27017" + + mongo-express: + image: mongo-express:latest + container_name: mongo-express + environment: + - ME_CONFIG_MONGODB_URL=mongodb://mongo:27017/?authSource=admin + - ME_CONFIG_BASICAUTH_USERNAME=admin + - ME_CONFIG_BASICAUTH_PASSWORD=pass + links: + - mongo + ports: + - "8081:8081" diff --git a/pom.xml b/pom.xml index 1d1ae9f..cd7beab 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.4.4 + 3.2.1 com.springbatch.excel @@ -14,8 +14,8 @@ tutorial Demo project for Spring Boot - 1.8 - 4.1.2 + 21 + 5.2.4 @@ -43,6 +43,8 @@ org.projectlombok lombok + 1.18.30 + provided true @@ -51,29 +53,16 @@ test - org.springframework.batch - spring-batch-test - test + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-data-jpa + - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - diff --git a/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java b/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java index 60266aa..dd18e4d 100644 --- a/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java +++ b/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java @@ -2,11 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +@SpringBootApplication public class TutorialApplication { public static void main(String[] args) { diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java b/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java index 4932ad7..a009015 100644 --- a/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java +++ b/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java @@ -4,14 +4,15 @@ import com.springbatch.excel.tutorial.batch.processors.EmployeeItemProcessor; import com.springbatch.excel.tutorial.batch.validators.EmployeeJobParametersValidator; import com.springbatch.excel.tutorial.domain.Employee; +import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParametersValidator; import org.springframework.batch.core.Step; -import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.job.CompositeJobParametersValidator; +import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.data.MongoItemWriter; @@ -19,24 +20,21 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.transaction.PlatformTransactionManager; import java.util.Collections; /** * Configuration for batch */ -@EnableBatchProcessing @Configuration +@RequiredArgsConstructor public class BatchConfiguration { - public final JobBuilderFactory jobBuilderFactory; + public final JobRepository jobRepository; + public final MongoTemplate mongoTemplate; + public final PlatformTransactionManager transactionManager; - public final StepBuilderFactory stepBuilderFactory; - - public BatchConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) { - this.jobBuilderFactory = jobBuilderFactory; - this.stepBuilderFactory = stepBuilderFactory; - } @Bean public JobParametersValidator jobParametersValidator() { @@ -61,39 +59,41 @@ public ItemReader itemReader() { } @Bean - public MongoItemWriter writer(MongoTemplate mongoTemplate) { - return new MongoItemWriterBuilder().template(mongoTemplate).collection("employee") + public MongoItemWriter writerMongo() { + return new MongoItemWriterBuilder() + .template(mongoTemplate) + .collection("employee") .build(); } - /** - * step declaration - * @return {@link Step} - */ @Bean - public Step employeeStep(MongoItemWriter itemWriter) { - return stepBuilderFactory.get("employeeStep") - .chunk(50) + public Step employeeStep() { + return new StepBuilder("employeeStep", jobRepository) + .chunk(50, transactionManager) .reader(itemReader()) .processor(itemProcessor()) - .writer(itemWriter) + .writer(writerMongo()) .build(); } + @Bean + public JobCompletionListener listener() { + return new JobCompletionListener(); + } /** * job declaration - * @param listener {@link JobCompletionListener} + * * @return {@link Job} */ @Bean - public Job employeeJob(JobCompletionListener listener, Step employeeStep) { - return jobBuilderFactory.get("employeeJob") + public Job employeeJob() { + return new JobBuilder("employeeJob", jobRepository) .incrementer(new RunIdIncrementer()) - .listener(listener) - .flow(employeeStep) + .listener(listener()) + .flow(employeeStep()) .end() .validator(compositeJobParametersValidator()) .build(); diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java index 8e7715c..350bc4e 100644 --- a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java +++ b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java @@ -3,9 +3,8 @@ import com.springbatch.excel.tutorial.batch.mappers.EmployeeItemRowMapper; import com.springbatch.excel.tutorial.domain.Employee; import com.springbatch.excel.tutorial.support.poi.AbstractExcelPoi; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.eval.NotImplementedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.StepExecutionListener; @@ -15,10 +14,9 @@ import java.util.List; +@Slf4j @Component -public class EmployeeItemReader extends AbstractExcelPoi implements ItemReader , StepExecutionListener { - - private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemReader.class); +public class EmployeeItemReader extends AbstractExcelPoi implements ItemReader, StepExecutionListener { private int employeeIndex = 0; @@ -40,7 +38,7 @@ public Employee read() { // read data in file employeeList = read(path, new EmployeeItemRowMapper()); - if(!employeeList.isEmpty()) { + if (!employeeList.isEmpty()) { if (employeeIndex < employeeList.size()) { employee = employeeList.get(employeeIndex); @@ -50,14 +48,14 @@ public Employee read() { } } } catch (Exception e) { - LOGGER.warn("Cannot read the excel file: {}", e.getMessage()); + log.warn("Cannot read the excel file: {}", e.getMessage()); } return employee; } @Override - public void write(String filePath , List aList) { + public void write(String filePath, List aList) { throw new NotImplementedException("No need to implement this method in the context"); } diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java index 7b118c5..4dd19f6 100644 --- a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java +++ b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java @@ -1,7 +1,7 @@ package com.springbatch.excel.tutorial.batch; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; @@ -19,11 +19,11 @@ /** * @author aek */ +@Slf4j @Component +@RequiredArgsConstructor public class EmployeeJobLauncher { - private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeJobLauncher.class); - private final Job job; private final JobLauncher jobLauncher; @@ -31,26 +31,21 @@ public class EmployeeJobLauncher { @Value("${employee.excel.processingfolder}") private String processingDir; - EmployeeJobLauncher(Job job, JobLauncher jobLauncher) { - this.job = job; - this.jobLauncher = jobLauncher; - } - // run every 2 min @Scheduled(fixedRate = 120000) void launchFileToJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException, JobRestartException { - LOGGER.info("Starting job"); + log.info("Starting job"); String excelFilePath = String.format("%s/employee.xlsx", processingDir); JobParameters params = new JobParametersBuilder() - .addLong("jobId",System.currentTimeMillis()) - .addDate("currentTime",new Date()) - .addString("excelPath",excelFilePath) + .addLong("jobId", System.currentTimeMillis()) + .addDate("currentTime", new Date()) + .addString("excelPath", excelFilePath) .toJobParameters(); jobLauncher.run(job, params); - LOGGER.info("Stopping job"); + log.info("Stopping job"); } } diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java b/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java index 6e0b779..5499a86 100644 --- a/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java +++ b/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java @@ -1,40 +1,38 @@ package com.springbatch.excel.tutorial.batch.listeners; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.listener.JobExecutionListenerSupport; import org.springframework.stereotype.Component; -import java.util.Date; +import java.time.LocalDateTime; +@Slf4j @Component public class JobCompletionListener extends JobExecutionListenerSupport { - private static final Logger LOGGER = LoggerFactory.getLogger(JobCompletionListener.class); - @Override public void afterJob(JobExecution jobExecution) { - String jobId = jobExecution.getJobParameters().getString("jobId"); + String jobId = jobExecution.getJobParameters().getParameter("jobId").toString(); String excelFilePath = jobExecution.getJobParameters().getString("excelPath"); - // get job's start time - Date start = jobExecution.getCreateTime(); + // get job's start time + LocalDateTime start = jobExecution.getCreateTime(); // get job's end time - Date end = jobExecution.getEndTime(); + LocalDateTime end = jobExecution.getEndTime(); - if(jobExecution.getStatus() == BatchStatus.COMPLETED) { + if (jobExecution.getStatus() == BatchStatus.COMPLETED) { - LOGGER.info("==========JOB FINISHED======="); - LOGGER.info("JobId : {}",jobId); - LOGGER.info("excel Path : {}",excelFilePath); - LOGGER.info("Start Date: {}", start); - LOGGER.info("End Date: {}", end); - LOGGER.info("=============================="); + log.info("==========JOB FINISHED======="); + log.info("JobId : {}", jobId); + log.info("excel Path : {}", excelFilePath); + log.info("Start Date: {}", start); + log.info("End Date: {}", end); + log.info("=============================="); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java b/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java index 85419c3..382f7bc 100644 --- a/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java +++ b/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java @@ -10,15 +10,12 @@ public class EmployeeItemRowMapper extends CellFactory implements RowMapper implements ItemProcessor, StepExecutionListener { - - private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemProcessor.class); +@Slf4j +public class EmployeeItemProcessor extends AbstractExcelPoi implements ItemProcessor, StepExecutionListener { private static final List existingEmployees = new ArrayList<>(); @@ -46,9 +43,8 @@ public class EmployeeItemProcessor extends AbstractExcelPoi implement @Override public Employee process(Employee item) { - if(repository.findByNumber(item.getNumber()).isPresent()){ + if (repository.findByNumber(item.number()).isPresent()) { existingEmployees.add(item); - return null; } @@ -60,25 +56,32 @@ public void beforeStep(StepExecution stepExecution) { /* Nothing to do before */ } - @SneakyThrows + // @SneakyThrows @Override public ExitStatus afterStep(StepExecution stepExecution) { - String jobId = stepExecution.getJobParameters().getString("jobId"); + String jobId = stepExecution.getJobParameters().getParameter("jobId").getValue().toString(); - if(stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) { + if (stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) { // create log file. if completed - String path = new ClassPathResource(resultsfolder).getFile().getPath(); - write(String.format("%s/employe-result-%s.xlsx", path, jobId),existingEmployees); + String path = null; + try { + path = new ClassPathResource(resultsfolder).getFile().getPath(); + } catch (IOException e) { + throw new RuntimeException(e); + } + write(String.format("%s/employe-result-%s.xlsx", path, jobId), existingEmployees); } return null; } + /** * Create and write results file. employee duplicate entries + * * @param filePath file path * @param aList list of employee */ @Override - public void write(String filePath , List aList) { + public void write(String filePath, List aList) { try (XSSFWorkbook workbook = new XSSFWorkbook()) { // Create a Sheet Sheet sheet = workbook.createSheet("RESULTS"); @@ -96,28 +99,27 @@ public void write(String filePath , List aList) { "Email", "Number" ); - createHeaderRow(sheet, headers,cellStyle); + createHeaderRow(sheet, headers, cellStyle); // Create Other rows and cells with BeneficiaryExtraction data int rowNum = 1; - for(Employee employee: aList) { + for (Employee employee : aList) { Row row = sheet.createRow(rowNum++); - createCell(row, 0, employee.getFirstName(), null); - createCell(row, 1, employee.getLastName(), null); - createCell(row, 2, employee.getEmail(), null); - createCell(row, 3, employee.getNumber(), null); + createCell(row, 0, employee.firstName(), null); + createCell(row, 1, employee.lastName(), null); + createCell(row, 2, employee.email(), null); + createCell(row, 3, employee.number(), null); } //lets write the excel data to file now try (FileOutputStream outputStream = new FileOutputStream(filePath)) { workbook.write(outputStream); - LOGGER.info("Results File written successfully"); + log.info("Results File written successfully"); } - } - catch (IOException e) { - LOGGER.warn("Cannot write results file: {}", e.getMessage()); - }finally { + } catch (IOException e) { + log.warn("Cannot write results file: {}", e.getMessage()); + } finally { existingEmployees.clear(); } } diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java b/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java index dc10653..aa781c5 100644 --- a/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java +++ b/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java @@ -6,13 +6,13 @@ public class EmployeeJobParametersValidator implements org.springframework.batch.core.JobParametersValidator { - @Override - public void validate(final JobParameters jobParameters) throws JobParametersInvalidException { - String fileName = jobParameters != null ? jobParameters.getString("excelPath") : null; + @Override + public void validate(final JobParameters jobParameters) throws JobParametersInvalidException { + String fileName = jobParameters != null ? jobParameters.getString("excelPath") : null; - if (fileName !=null && !StringUtils.endsWithIgnoreCase(fileName, "xlsx")) { - throw new JobParametersInvalidException("The file type must be in xlsx format"); - } - } + if (fileName != null && !StringUtils.endsWithIgnoreCase(fileName, "xlsx")) { + throw new JobParametersInvalidException("The file type must be in xlsx format"); + } + } } diff --git a/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java b/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java index 15f5ae2..ec88f9d 100644 --- a/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java +++ b/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java @@ -1,37 +1,21 @@ package com.springbatch.excel.tutorial.domain; -import com.sun.istack.internal.NotNull; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.IndexDirection; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; -@Data -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = true) @Document(collection = "employee") -public class Employee { - - @Id - private String id; - - private String firstName; - - private String lastName; - - @NotNull - @Indexed(unique = true, direction = IndexDirection.DESCENDING) - private String number; - - private String email; - - private String department; - - private double salary; -} \ No newline at end of file +public record Employee( + @Id + String id, + String firstName, + String lastName, + @Indexed(unique = true, direction = IndexDirection.DESCENDING) + String number, + String email, + String department, + double salary +) { +} diff --git a/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java b/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java index a36f647..6c17797 100644 --- a/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java +++ b/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java @@ -1,7 +1,6 @@ package com.springbatch.excel.tutorial.service; - import com.springbatch.excel.tutorial.domain.Employee; import java.util.Optional; @@ -13,4 +12,4 @@ public interface EmployeeService { * @return Optional employee */ Optional getByNumber(String number); -} \ No newline at end of file +} diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java index d871704..0489ab8 100644 --- a/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java +++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java @@ -1,5 +1,6 @@ package com.springbatch.excel.tutorial.support.poi; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -9,26 +10,23 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; /** * @param generic Class * @author aek */ +@Slf4j public abstract class AbstractExcelPoi { - private static final Logger LOGGER = Logger.getLogger(AbstractExcelPoi.class.getName()); - /** * @param filePath file path - * @param aList list of object + * @param aList list of object */ public abstract void write(String filePath, List aList); /** * @param filePathStr file path location - * @param rowMapper RowMapper object + * @param rowMapper RowMapper object * @return list of */ public List read(String filePathStr, final RowMapper rowMapper) { @@ -38,20 +36,20 @@ public List read(String filePathStr, final RowMapper rowMapper) { Sheet sheet = workbook.getSheetAt(0); - sheet.forEach(row -> { - // skip header - if (row.getRowNum() != 0){ - try { - bookList.add(rowMapper.transformerRow(row)); - } catch (ParseException exception) { - LOGGER.log(Level.WARNING, "RowMapper Parse exception"); - } + sheet.forEach(row -> { + // skip header + if (row.getRowNum() != 0) { + try { + bookList.add(rowMapper.transformerRow(row)); + } catch (ParseException exception) { + log.warn("RowMapper Parse exception"); } - }); + } + }); return bookList; } catch (IOException e) { - throw new ExcelFileException(String.format("Cannot read the file: %s",e.getMessage())); + throw new ExcelFileException(String.format("Cannot read the file: %s", e.getMessage())); } } @@ -62,7 +60,7 @@ public List read(String filePathStr, final RowMapper rowMapper) { private Workbook getWorkbook(String filePathStr) { Workbook workbook; - try{ + try { try (FileInputStream inputStream = new FileInputStream(new File(filePathStr))) { if (filePathStr.endsWith("xlsx")) { workbook = new XSSFWorkbook(inputStream); @@ -70,7 +68,7 @@ private Workbook getWorkbook(String filePathStr) { throw new ExcelFileException("The specified file is not Excel file"); } } - }catch(SecurityException | IOException e){ + } catch (SecurityException | IOException e) { throw new ExcelFileException("The specified file is not Excel file"); } @@ -78,17 +76,16 @@ private Workbook getWorkbook(String filePathStr) { } - - /** * Create header of file - * @param sheet excel sheet - * @param headers list string of header + * + * @param sheet excel sheet + * @param headers list string of header * @param rowStyle style of header row */ public void createHeaderRow(Sheet sheet, List headers, CellStyle rowStyle) { - if(!headers.isEmpty()){ + if (!headers.isEmpty()) { // Create a Row Row row = sheet.createRow(0); // Create cells @@ -101,10 +98,10 @@ public void createHeaderRow(Sheet sheet, List headers, CellStyle rowStyl } /** - * @param row file row + * @param row file row * @param columnCount index of column - * @param value the value to will set - * @param style cel row + * @param value the value to will set + * @param style cel row * @return Cell value */ public Cell createCell(Row row, int columnCount, Object value, CellStyle style) { @@ -113,14 +110,14 @@ public Cell createCell(Row row, int columnCount, Object value, CellStyle style) cell.setCellValue((Integer) value); } else if (value instanceof Boolean) { cell.setCellValue((Boolean) value); - }else if (value instanceof Double) { + } else if (value instanceof Double) { cell.setCellValue((Double) value); } else { cell.setCellValue((String) value); } - if(style != null){ + if (style != null) { cell.setCellStyle(style); } diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java index 584f69a..dc1d271 100644 --- a/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java +++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java @@ -9,11 +9,12 @@ /** * Extract cell value + * * @author aek */ public class CellFactory { - private static final EnumMap> + private static final EnumMap> EXCEL_CELL_VALUE = new EnumMap<>(CellType.class); static { @@ -37,13 +38,13 @@ public class CellFactory { * @return Object row */ public Object getCellValue(Cell cell) { - try{ - if(cell == null){ + try { + if (cell == null) { return null; } return EXCEL_CELL_VALUE.get(cell.getCellType()).apply(cell); - }catch (Exception e){ - throw new UnknownCellTypeException(String.format("Unknown cell type ( %s )",cell.getCellType())); + } catch (Exception e) { + throw new UnknownCellTypeException(String.format("Unknown cell type ( %s )", cell.getCellType())); } } diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java index 4e12456..1ac6d11 100644 --- a/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java +++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java @@ -1,5 +1,6 @@ /** * Core package for the Apache POI library. + * * @author aek */ -package com.springbatch.excel.tutorial.support.poi; \ No newline at end of file +package com.springbatch.excel.tutorial.support.poi; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7fe2c8b..a7b8a04 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,11 +1,23 @@ spring: + h2: + console: + enabled: true + datasource: + url: jdbc:h2:mem:batch-sample;MODE=Oracle;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1 + driverClassName: org.h2.Driver + username: sa + password: qaz@123 + jpa: + database-platform: org.hibernate.dialect.H2Dialect + data: mongodb: host: localhost port: 27017 - database: <> - username: <> - password: <> + database: spring_batch_excel_mongodb_db +# username: admin +# password: pass + auto-index-creation: true jackson: default-property-inclusion: NON_NULL @@ -13,6 +25,9 @@ spring: batch: job: enabled: false + initialize-schema: never + initializer: + enabled: false # Enable Logging mongo queries logging: @@ -23,3 +38,5 @@ employee: excel: processingfolder: data/processing/ resultsfolder: data/results/ +file: + input: countries.csv diff --git a/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java b/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java new file mode 100644 index 0000000..130a434 --- /dev/null +++ b/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java @@ -0,0 +1,61 @@ +package com.springbatch.excel.tutorial; +import com.springbatch.excel.tutorial.batch.BatchConfiguration; +import com.springbatch.excel.tutorial.batch.listeners.JobCompletionListener; +import com.springbatch.excel.tutorial.domain.Employee; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobParameter; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.*; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + + + +@ExtendWith(SpringExtension.class) +@EnableBatchProcessing +@ComponentScan(basePackages = "com.springbatch.excel.tutorial") +@SpringBootTest(classes = {BatchConfiguration.class, JobCompletionListener.class}) +class BatchIntegrationTest { + + @Autowired + private JobLauncher jobLauncher; + + @Autowired + private Job jsonFileProcessingJob; + + @Autowired + private MongoTemplate mongoTemplate; + + @Test + void testBatchJob() throws Exception { + String absolutePath = Objects.requireNonNull(getClass().getResource("/data/processing/employee.xlsx")).getPath(); + + // Créez les paramètres du job + Map jobParameters = new HashMap<>(); + jobParameters.put("filePath", new JobParameter(absolutePath)); + jobParameters.put("currentTime", new JobParameter(new Date())); + + // Lancez le job avec les paramètres + JobExecution jobExecution = jobLauncher.run(jsonFileProcessingJob,new JobParameters(jobParameters)); + + // Vérifiez que le job s'est terminé avec succès + assertThat(jobExecution.getExitStatus().getExitCode()).isEqualTo("COMPLETED"); + + List couponOffers = mongoTemplate.findAll(Employee.class); + assertThat(couponOffers.size()).isEqualTo(100); + + } +} + + diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..a0fd8c1 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,26 @@ +spring: + data: + mongodb: + host: localhost + port: 27017 + database: spring_batch_excel_mongodb_db +# username: admin +# password: pass + auto-index-creation: true + + jackson: + default-property-inclusion: NON_NULL +#disabled job run at startup + batch: + job: + enabled: false + +# Enable Logging mongo queries +logging: + level: + org.springframework.data.mongodb.core.MongoTemplate: DEBUG + +employee: + excel: + processingfolder: data/processing/ + resultsfolder: data/results/ diff --git a/src/test/resources/data/processing/employee.txt b/src/test/resources/data/processing/employee.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/data/processing/employee.xlsx b/src/test/resources/data/processing/employee.xlsx new file mode 100644 index 0000000..312ae9a Binary files /dev/null and b/src/test/resources/data/processing/employee.xlsx differ diff --git a/src/test/resources/data/results/readme.txt b/src/test/resources/data/results/readme.txt new file mode 100644 index 0000000..e69de29