Advertisement
richieriviere

ExportMasterListCsvJobConfig

Aug 10th, 2016
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.52 KB | None | 0 0
  1. package com.my.pricing.onlinestore.export.job;
  2.  
  3. import java.io.File;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. import java.text.DateFormat;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.List;
  11.  
  12. import org.apache.commons.io.FileUtils;
  13. import org.apache.commons.io.filefilter.TrueFileFilter;
  14. import org.springframework.batch.core.Job;
  15. import org.springframework.batch.core.Step;
  16. import org.springframework.batch.core.StepContribution;
  17. import org.springframework.batch.core.configuration.annotation.JobScope;
  18. import org.springframework.batch.core.configuration.annotation.StepScope;
  19. import org.springframework.batch.core.launch.support.RunIdIncrementer;
  20. import org.springframework.batch.core.scope.context.ChunkContext;
  21. import org.springframework.batch.core.step.tasklet.Tasklet;
  22. import org.springframework.batch.item.ItemProcessor;
  23. import org.springframework.batch.item.ItemWriter;
  24. import org.springframework.batch.item.database.JdbcCursorItemReader;
  25. import org.springframework.batch.item.file.FlatFileItemWriter;
  26. import org.springframework.batch.repeat.RepeatStatus;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Qualifier;
  29. import org.springframework.beans.factory.annotation.Value;
  30. import org.springframework.classify.BackToBackPatternClassifier;
  31. import org.springframework.context.annotation.Bean;
  32. import org.springframework.context.annotation.Configuration;
  33. import org.springframework.context.annotation.Import;
  34. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  35. import org.springframework.jdbc.core.JdbcTemplate;
  36. import org.springframework.jdbc.core.PreparedStatementSetter;
  37.  
  38. import com.myer.pricing.onlinestore.export.DivisionClassifier;
  39. import com.myer.pricing.onlinestore.export.constants.ExecutionContextConstants;
  40. import com.myer.pricing.onlinestore.export.constants.FlatFileConstants;
  41. import com.myer.pricing.onlinestore.export.constants.JobParamConstants;
  42. import com.myer.pricing.onlinestore.export.job.common.CommonExportFromStagingDbJobConfig;
  43. import com.myer.pricing.onlinestore.export.job.writer.MasterListClassifierCompositeItemWriter;
  44. import com.myer.pricing.onlinestore.export.listener.CustomStepExecutionListener;
  45. import com.myer.pricing.onlinestore.export.model.MasterList;
  46. import com.myer.pricing.onlinestore.export.model.PromotionStartDateEndDateGrouping;
  47.  
  48.  
  49. /**
  50.  * Master List export job from the online pricing staging db.
  51.  * http://stackoverflow.com/questions/29286699/repeating-a-step-x-times-in-spring-batch
  52.  *
  53.  * @author Richard Riviere
  54.  *
  55.  */
  56. @Configuration
  57. @Import(CommonExportFromStagingDbJobConfig.class)
  58. public class ExportMasterListCsvJobConfig {
  59.    
  60.     public static final String JOB_NAME = "exportMasterListCsv";
  61.  
  62.     @Autowired
  63.     private CommonExportFromStagingDbJobConfig commonJobConfig;
  64.  
  65.     @Bean
  66.     public Job exportMasterListCsvJob(
  67.             @Qualifier("createJobDatesStep") Step createJobDatesStep,
  68.             @Qualifier("readStgDbAndExportMasterListStep") Step readStgDbAndExportMasterListStep,
  69.             @Qualifier("renameFilesStep") Step renameFilesStep) {
  70.  
  71.         return commonJobConfig.jobBuilderFactory.get(JOB_NAME)
  72.                 .incrementer(new RunIdIncrementer())
  73.                 .start(createJobDatesStep)
  74.                 .next(readStgDbAndExportMasterListStep)
  75.                     .on("CONTINUE").
  76.                         to(readStgDbAndExportMasterListStep).
  77.                     on("FINISHED").end()
  78.                 .end()
  79.                 .build();
  80.        
  81.     }  
  82.    
  83.     @Bean
  84.     public Step createJobDatesStep(
  85.             @Qualifier("createJobDatesTasklet")  Tasklet createJobDatesTasklet) {
  86.         return  commonJobConfig.stepBuilderFactory
  87.                     .get("createJobDatesStep")
  88.                     .tasklet(createJobDatesTasklet)
  89.                     .build();              
  90.     }  
  91.    
  92.    
  93.     @Bean
  94.     @JobScope
  95.     public Tasklet createJobDatesTasklet(
  96.             @Value("${exportMasterListCsv.generatePromoStartDateEndDateGroupings.promoStartDateEndDateSql}") String promoStartDateEndDateSql,
  97.             @Value("#{jobParameters['" + JobParamConstants.PARAM_FROM_DATE + "']}") Date jobFromDate,
  98.             @Value("#{jobParameters['" + JobParamConstants.PARAM_TO_DATE + "']}") Date jobToDate) {
  99.        
  100.         return new Tasklet() {
  101.            
  102.             @Override
  103.             public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
  104.                 JdbcTemplate jdbcTemplate = new JdbcTemplate(commonJobConfig.onlineStagingDb);
  105.                
  106.                 List<PromotionStartDateEndDateGrouping> promotionStartDateEndDateGroupings =
  107.                         jdbcTemplate.query(
  108.                                 promoStartDateEndDateSql,
  109.                                 new PreparedStatementSetter() {
  110.                                     public void setValues(PreparedStatement preparedStatement) throws SQLException {
  111.                                         preparedStatement.setDate(1, new java.sql.Date(jobFromDate.getTime()));  
  112.                                     }
  113.                                 },
  114.                                 BeanPropertyRowMapper.newInstance(PromotionStartDateEndDateGrouping.class));
  115.                
  116.                 System.err.println("createJobDatesTasklet: " + promotionStartDateEndDateGroupings);
  117.                
  118.                 chunkContext
  119.                 .getStepContext()
  120.                 .getStepExecution()
  121.                 .getJobExecution()
  122.                 .getExecutionContext()
  123.                 .put(ExecutionContextConstants.JOB_EXPORT_STAGING_PROMOTION_START_DATE_END_DATE_GROUPINGS, promotionStartDateEndDateGroupings);
  124.                 return RepeatStatus.FINISHED;
  125.             }
  126.         };
  127.     }
  128.    
  129.    
  130.     @Bean
  131.     public Step readStgDbAndExportMasterListStep (
  132.             @Qualifier("queryStagingDbReader") JdbcCursorItemReader<MasterList> queryStagingDbReader,
  133.             @Qualifier("masterListOutputProcessor") ItemProcessor<MasterList,MasterList> masterListOutputProcessor,
  134.             @Qualifier("masterListFileWriter") ItemWriter<MasterList> masterListFileWriter,
  135.             @Qualifier("division10MasterListFileWriter") FlatFileItemWriter<MasterList> division10MasterListFileWriter,
  136.             @Qualifier("division15MasterListFileWriter") FlatFileItemWriter<MasterList> division15MasterListFileWriter,
  137.             @Qualifier("division20MasterListFileWriter") FlatFileItemWriter<MasterList> division20MasterListFileWriter,
  138.             @Qualifier("division25MasterListFileWriter") FlatFileItemWriter<MasterList> division25MasterListFileWriter,
  139.             @Qualifier("division30MasterListFileWriter") FlatFileItemWriter<MasterList> division30MasterListFileWriter,
  140.             @Qualifier("division35MasterListFileWriter") FlatFileItemWriter<MasterList> division35MasterListFileWriter,
  141.             @Qualifier("division40MasterListFileWriter") FlatFileItemWriter<MasterList> division40MasterListFileWriter,
  142.             @Qualifier("division45MasterListFileWriter") FlatFileItemWriter<MasterList> division45MasterListFileWriter,
  143.             @Qualifier("division50MasterListFileWriter") FlatFileItemWriter<MasterList> division50MasterListFileWriter,
  144.             @Qualifier("division55MasterListFileWriter") FlatFileItemWriter<MasterList> division55MasterListFileWriter,
  145.             @Qualifier("division60MasterListFileWriter") FlatFileItemWriter<MasterList> division60MasterListFileWriter,
  146.             @Qualifier("division65MasterListFileWriter") FlatFileItemWriter<MasterList> division65MasterListFileWriter,
  147.             @Qualifier("division70MasterListFileWriter") FlatFileItemWriter<MasterList> division70MasterListFileWriter,
  148.             @Qualifier("division75MasterListFileWriter") FlatFileItemWriter<MasterList> division75MasterListFileWriter,
  149.             @Qualifier("division80MasterListFileWriter") FlatFileItemWriter<MasterList> division80MasterListFileWriter,
  150.             @Qualifier("division85MasterListFileWriter") FlatFileItemWriter<MasterList> division85MasterListFileWriter,
  151.             @Qualifier("division90MasterListFileWriter") FlatFileItemWriter<MasterList> division90MasterListFileWriter,
  152.             @Qualifier("division95MasterListFileWriter") FlatFileItemWriter<MasterList> division95MasterListFileWriter,
  153.             @Qualifier("stepListener") CustomStepExecutionListener stepListener) {
  154.        
  155.         return  commonJobConfig.stepBuilderFactory
  156.                     .get("readStgDbAndExportMasterListStep")
  157.                     .<MasterList,MasterList>chunk(commonJobConfig.chunkSize)
  158.                     .reader(queryStagingDbReader)
  159.                     .processor(masterListOutputProcessor)
  160.                     .writer(masterListFileWriter)
  161.                     .stream(division10MasterListFileWriter)
  162.                     .stream(division15MasterListFileWriter)
  163.                     .stream(division20MasterListFileWriter)
  164.                     .stream(division25MasterListFileWriter)
  165.                     .stream(division30MasterListFileWriter)
  166.                     .stream(division35MasterListFileWriter)
  167.                     .stream(division40MasterListFileWriter)
  168.                     .stream(division45MasterListFileWriter)
  169.                     .stream(division50MasterListFileWriter)
  170.                     .stream(division55MasterListFileWriter)
  171.                     .stream(division60MasterListFileWriter)
  172.                     .stream(division65MasterListFileWriter)
  173.                     .stream(division70MasterListFileWriter)
  174.                     .stream(division75MasterListFileWriter)
  175.                     .stream(division80MasterListFileWriter)
  176.                     .stream(division85MasterListFileWriter)
  177.                     .stream(division90MasterListFileWriter)
  178.                     .stream(division95MasterListFileWriter)
  179.                     .listener(stepListener)
  180.                     .build();              
  181.     }  
  182.  
  183.    
  184.     /**
  185.      * Do some extra processing on master list rows.
  186.      *
  187.      * @return master list row with transformations applied.
  188.      */
  189.     @Bean
  190.     public ItemProcessor<MasterList,MasterList> masterListOutputProcessor() {
  191.  
  192.         return new ItemProcessor<MasterList, MasterList>() {
  193.            
  194.             @Override
  195.             public MasterList process(MasterList masterList) throws Exception {
  196.                 masterList.setPromoIdPromoCompId(masterList.getPromoId() + " / " + masterList.getPromoCompId());
  197.                 return masterList;
  198.             }
  199.         };
  200.     }
  201.    
  202.     /**
  203.      * Write out the the masterlist.csv
  204.      *
  205.      * @param masterListFile
  206.      * @param executionContext
  207.      * @return
  208.      */
  209.     @Bean
  210.     @StepScope
  211.     public ItemWriter<MasterList> masterListFileWriter(
  212.             @Qualifier("masterListClassifierCompositeItemWriter") MasterListClassifierCompositeItemWriter masterListClassifierCompositeItemWriter,
  213.             @Qualifier("division10MasterListFileWriter") FlatFileItemWriter<MasterList> division10MasterListFileWriter,
  214.             @Qualifier("division15MasterListFileWriter") FlatFileItemWriter<MasterList> division15MasterListFileWriter,
  215.             @Qualifier("division20MasterListFileWriter") FlatFileItemWriter<MasterList> division20MasterListFileWriter,
  216.             @Qualifier("division25MasterListFileWriter") FlatFileItemWriter<MasterList> division25MasterListFileWriter,
  217.             @Qualifier("division30MasterListFileWriter") FlatFileItemWriter<MasterList> division30MasterListFileWriter,
  218.             @Qualifier("division35MasterListFileWriter") FlatFileItemWriter<MasterList> division35MasterListFileWriter,
  219.             @Qualifier("division40MasterListFileWriter") FlatFileItemWriter<MasterList> division40MasterListFileWriter,
  220.             @Qualifier("division45MasterListFileWriter") FlatFileItemWriter<MasterList> division45MasterListFileWriter,
  221.             @Qualifier("division50MasterListFileWriter") FlatFileItemWriter<MasterList> division50MasterListFileWriter,
  222.             @Qualifier("division55MasterListFileWriter") FlatFileItemWriter<MasterList> division55MasterListFileWriter,
  223.             @Qualifier("division60MasterListFileWriter") FlatFileItemWriter<MasterList> division60MasterListFileWriter,
  224.             @Qualifier("division65MasterListFileWriter") FlatFileItemWriter<MasterList> division65MasterListFileWriter,
  225.             @Qualifier("division70MasterListFileWriter") FlatFileItemWriter<MasterList> division70MasterListFileWriter,
  226.             @Qualifier("division75MasterListFileWriter") FlatFileItemWriter<MasterList> division75MasterListFileWriter,
  227.             @Qualifier("division80MasterListFileWriter") FlatFileItemWriter<MasterList> division80MasterListFileWriter,
  228.             @Qualifier("division85MasterListFileWriter") FlatFileItemWriter<MasterList> division85MasterListFileWriter,
  229.             @Qualifier("division90MasterListFileWriter") FlatFileItemWriter<MasterList> division90MasterListFileWriter,
  230.             @Qualifier("division95MasterListFileWriter") FlatFileItemWriter<MasterList> division95MasterListFileWriter) {
  231.        
  232.         System.err.println("masterListFileWriter:");
  233.        
  234.         BackToBackPatternClassifier classifier = new BackToBackPatternClassifier();
  235.         classifier.setRouterDelegate(new DivisionClassifier());
  236.         classifier.setMatcherMap(new HashMap<String, ItemWriter<? extends MasterList>>() {{
  237.             put("10", division10MasterListFileWriter);
  238.             put("15", division15MasterListFileWriter);
  239.             put("20", division20MasterListFileWriter);
  240.             put("25", division25MasterListFileWriter);
  241.             put("30", division30MasterListFileWriter);
  242.             put("35", division35MasterListFileWriter);
  243.             put("40", division40MasterListFileWriter);
  244.             put("45", division45MasterListFileWriter);
  245.             put("50", division50MasterListFileWriter);
  246.             put("55", division55MasterListFileWriter);
  247.             put("60", division60MasterListFileWriter);
  248.             put("65", division65MasterListFileWriter);
  249.             put("70", division70MasterListFileWriter);
  250.             put("75", division75MasterListFileWriter);
  251.             put("80", division80MasterListFileWriter);
  252.             put("85", division85MasterListFileWriter);
  253.             put("90", division90MasterListFileWriter);
  254.             put("95", division95MasterListFileWriter);
  255.         }});
  256.        
  257.         /*ClassifierCompositeItemWriter<MasterList> writer = new ClassifierCompositeItemWriter<MasterList>();
  258.         writer.setClassifier(classifier);*/
  259.         masterListClassifierCompositeItemWriter.setClassifier(classifier);
  260.         return masterListClassifierCompositeItemWriter;
  261.     }  
  262.  
  263.    
  264.     @Bean
  265.     public Step renameFilesStep(
  266.             @Qualifier("renameFilesTasklet")  Tasklet renameFilesTasklet) {
  267.         return  commonJobConfig.stepBuilderFactory
  268.                     .get("renameFilesStep")
  269.                     .tasklet(renameFilesTasklet)
  270.                     .build();              
  271.     }  
  272.    
  273.     @Bean
  274.     @JobScope
  275.     public Tasklet renameFilesTasklet(
  276.             @Value("#{jobExecutionContext['" + ExecutionContextConstants.JOB_EXPORT_STAGING_WORKING_PROMOTION_START_DATE_END_DATE +"']}")
  277.             PromotionStartDateEndDateGrouping promotionStartDateEndDateGrouping) {
  278.         return new Tasklet() {
  279.            
  280.             @Override
  281.             public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
  282.                 System.err.println("commonJobConfig.outDir: " + commonJobConfig.outDir);
  283.                
  284.                 File dir = new File(commonJobConfig.outDir);
  285.                 List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
  286.                
  287.                
  288.                 String sep = System.getProperty("file.separator");
  289.                
  290.                 final String dateTimeFormatPattern = "ddMMyyyy";  
  291.                 final DateFormat format = new SimpleDateFormat(dateTimeFormatPattern);  
  292.                 String promoCompDetailStartDateStr = format.format(promotionStartDateEndDateGrouping.getRpmPromoCompDetailStartDate());
  293.                 String promoCompDetailEndDateStr = format.format(promotionStartDateEndDateGrouping.getRpmPromoCompDetailEndDate());
  294.                
  295.                 for (File file : files) {
  296.                    
  297.                     String absolutePath = file.getAbsolutePath();
  298.                     String filePath = absolutePath.substring(0,absolutePath.lastIndexOf(File.separator));
  299.                    
  300.                     System.err.println("file: " + filePath + sep + file.getName());
  301.                     File destinationFile = new File(
  302.                             filePath
  303.                             + sep
  304.                             + file.getName()
  305.                             + FlatFileConstants.FILENAME_WORD_SEPERATOR
  306.                             + FlatFileConstants.UPLOAD_KEYWORD
  307.                             + FlatFileConstants.FILENAME_WORD_SEPERATOR
  308.                             + promoCompDetailStartDateStr
  309.                             + "-"
  310.                             + promoCompDetailEndDateStr
  311.                             + FlatFileConstants.FILENAME_WORD_SEPERATOR
  312.                             + FlatFileConstants.FILENAME_MSTRLST
  313.                             + FlatFileConstants.EXTENSION_CSV );
  314.                     file.renameTo(destinationFile);
  315.                    
  316.                 }
  317.                 return RepeatStatus.FINISHED;
  318.             }
  319.         };
  320.     }
  321.    
  322.     @Bean
  323.     @StepScope
  324.     public MasterListClassifierCompositeItemWriter masterListClassifierCompositeItemWriter(){
  325.            return new MasterListClassifierCompositeItemWriter();
  326.     }
  327.    
  328.     @Bean
  329.     @JobScope
  330.     public CustomStepExecutionListener stepListener(){
  331.            return new CustomStepExecutionListener();
  332.     }
  333.  
  334.  
  335.    
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement