Skip to content

Commit

Permalink
Updated Springboot to 3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Zggis committed Feb 9, 2023
1 parent b5b5509 commit e8b0b9e
Show file tree
Hide file tree
Showing 18 changed files with 123 additions and 129 deletions.
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
plugins {
id 'org.springframework.boot' version '2.7.4'
id 'io.spring.dependency-management' version '1.0.14.RELEASE'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}

group = 'com.zggis'
version = '1.1.0'
sourceCompatibility = '11'
sourceCompatibility = '17'

repositories {
mavenCentral()
Expand Down
118 changes: 46 additions & 72 deletions src/main/java/com/zggis/dobby/batch/BatchConfiguration.java
Original file line number Diff line number Diff line change
@@ -1,53 +1,35 @@
package com.zggis.dobby.batch;

import javax.annotation.PreDestroy;

import com.zggis.dobby.batch.processors.*;
import com.zggis.dobby.batch.readers.*;
import com.zggis.dobby.batch.writers.CacheFileWriter;
import com.zggis.dobby.batch.writers.CacheMergeWriter;
import com.zggis.dobby.batch.writers.NoOperationWriter;
import com.zggis.dobby.dto.batch.*;
import com.zggis.dobby.services.DoviProcessBuilder;
import com.zggis.dobby.services.MediaService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.Job;
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.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.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.util.StringUtils;

import com.zggis.dobby.batch.processors.CleanupProcessor;
import com.zggis.dobby.batch.processors.ConvertToHevcProcessor;
import com.zggis.dobby.batch.processors.ExtractRpuProcessor;
import com.zggis.dobby.batch.processors.MKVActiveAreaProcessor;
import com.zggis.dobby.batch.processors.MediaInfoProcessor;
import com.zggis.dobby.batch.processors.MergeToMKVProcessor;
import com.zggis.dobby.batch.processors.MergeValidationProcessor;
import com.zggis.dobby.batch.processors.RPUBorderInfoProcessor;
import com.zggis.dobby.batch.processors.RPUInjectProcessor;
import com.zggis.dobby.batch.processors.ResultValidatorProcessor;
import com.zggis.dobby.batch.readers.CacheCleanupReader;
import com.zggis.dobby.batch.readers.CacheInjectorReader;
import com.zggis.dobby.batch.readers.CacheMergeReader;
import com.zggis.dobby.batch.readers.CacheReader;
import com.zggis.dobby.batch.readers.DiskTVShowReader;
import com.zggis.dobby.batch.writers.CacheFileWriter;
import com.zggis.dobby.batch.writers.CacheMergeWriter;
import com.zggis.dobby.batch.writers.NoOperationWriter;
import com.zggis.dobby.dto.batch.BLRPUHevcFileDTO;
import com.zggis.dobby.dto.batch.FileDTO;
import com.zggis.dobby.dto.batch.HevcFileDTO;
import com.zggis.dobby.dto.batch.RPUFileDTO;
import com.zggis.dobby.dto.batch.VideoFileDTO;
import com.zggis.dobby.dto.batch.VideoInjectionDTO;
import com.zggis.dobby.dto.batch.VideoMergeDTO;
import com.zggis.dobby.services.DoviProcessBuilder;
import com.zggis.dobby.services.MediaService;

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

private static final int CHUNK = 1;
Expand Down Expand Up @@ -87,25 +69,28 @@ public class BatchConfiguration {
private DoviProcessBuilder pbservice;

@Autowired
public JobBuilderFactory jobBuilderFactory;
private JobRepository jobRepository;

@Autowired
public StepBuilderFactory stepBuilderFactory;
private PlatformTransactionManager ptm;

public JobBuilder jobBuilderFactory;

@PostConstruct
public void init() {
ptm = new ResourcelessTransactionManager();
jobBuilderFactory = new JobBuilder(ConsoleColor.CYAN.value + "Merge TV Shows" + ConsoleColor.NONE.value, jobRepository);
}

@Bean
public Job mergeVideoFilesJob(MyJobCompletionHandler listener) {
return jobBuilderFactory.get(ConsoleColor.CYAN.value + "Merge TV Shows" + ConsoleColor.NONE.value)
.incrementer(new RunIdIncrementer()).listener(listener).flow(fetchMedia()).next(scanActiveArea())
.next(convertMediaToHEVC()).next(extractRPU()).next(getBorderInfo()).next(injectRPU())
.next(validateMerge()).next(mergeResult()).next(validateResult()).next(cleanupResult()).end().build();
return jobBuilderFactory.incrementer(new RunIdIncrementer()).listener(listener).flow(fetchMedia()).next(scanActiveArea()).next(convertMediaToHEVC()).next(extractRPU()).next(getBorderInfo()).next(injectRPU()).next(validateMerge()).next(mergeResult()).next(validateResult()).next(cleanupResult()).end().build();
}

// Step 0 - Fetch Media Info
@Bean
public Step fetchMedia() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "0/9 Scan Media" + ConsoleColor.NONE.value)
.<VideoFileDTO, VideoFileDTO>chunk(CHUNK).reader(tvShowReader()).processor(mediaInfoProcessor())
.writer(tvShowStagedWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "0/9 Scan Media" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoFileDTO, VideoFileDTO>chunk(CHUNK, ptm).reader(tvShowReader()).processor(mediaInfoProcessor()).writer(tvShowStagedWriter()).build();
}

@Bean
Expand All @@ -126,10 +111,8 @@ public ItemWriter<VideoFileDTO> tvShowStagedWriter() {
// step 1 - Populate active area
@Bean
public Step scanActiveArea() {
return stepBuilderFactory
.get(ConsoleColor.CYAN.value + "1/9 Analyze Active Area of HDR Files" + ConsoleColor.NONE.value)
.<VideoFileDTO, VideoFileDTO>chunk(CHUNK).reader(stdMkvReader()).processor(mkvActiveAreaProcessor())
.writer(conversionWriter2()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "1/9 Analyze Active Area of HDR Files" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoFileDTO, VideoFileDTO>chunk(CHUNK, ptm).reader(stdMkvReader()).processor(mkvActiveAreaProcessor()).writer(conversionWriter2()).build();
}

@Bean
Expand All @@ -154,9 +137,8 @@ public ItemWriter<VideoFileDTO> conversionWriter2() {
// Step 2 - Convert Mp4 and MKV to HEVC
@Bean
public Step convertMediaToHEVC() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "2/9 Convert media to HEVC" + ConsoleColor.NONE.value)
.<VideoFileDTO, HevcFileDTO>chunk(CHUNK).reader(tvShowCacheReader()).processor(mp4ToHevcProcessor())
.writer(tvShowHevcWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "2/9 Convert media to HEVC" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoFileDTO, HevcFileDTO>chunk(CHUNK, ptm).reader(tvShowCacheReader()).processor(mp4ToHevcProcessor()).writer(tvShowHevcWriter()).build();
}

@Bean
Expand All @@ -178,9 +160,8 @@ public ItemWriter<HevcFileDTO> tvShowHevcWriter() {

@Bean
public Step extractRPU() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "3/9 Extract RPUs" + ConsoleColor.NONE.value)
.<HevcFileDTO, RPUFileDTO>chunk(CHUNK).reader(dvHevcReader()).processor(extractRpuProcessor())
.writer(dvHevcWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "3/9 Extract RPUs" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<HevcFileDTO, RPUFileDTO>chunk(CHUNK, ptm).reader(dvHevcReader()).processor(extractRpuProcessor()).writer(dvHevcWriter()).build();
}

@Bean
Expand All @@ -201,9 +182,8 @@ public ItemWriter<RPUFileDTO> dvHevcWriter() {
// Step 4 - Populate Border info
@Bean
public Step getBorderInfo() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "4/9 Analyze RPUs" + ConsoleColor.NONE.value)
.<RPUFileDTO, RPUFileDTO>chunk(CHUNK).reader(rpuReader()).processor(rpuBorderInfoProcessor())
.writer(rpuWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "4/9 Analyze RPUs" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<RPUFileDTO, RPUFileDTO>chunk(CHUNK, ptm).reader(rpuReader()).processor(rpuBorderInfoProcessor()).writer(rpuWriter()).build();
}

@Bean
Expand All @@ -225,9 +205,8 @@ public ItemWriter<RPUFileDTO> rpuWriter() {

@Bean
public Step injectRPU() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "5/9 Inject RPUs into HEVCs" + ConsoleColor.NONE.value)
.<VideoInjectionDTO, BLRPUHevcFileDTO>chunk(CHUNK).reader(cacheInjectorReader())
.processor(rpuInjectProcessor()).writer(blRPUCacheFileWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "5/9 Inject RPUs into HEVCs" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoInjectionDTO, BLRPUHevcFileDTO>chunk(CHUNK, ptm).reader(cacheInjectorReader()).processor(rpuInjectProcessor()).writer(blRPUCacheFileWriter()).build();
}

@Bean
Expand All @@ -248,10 +227,8 @@ public ItemWriter<BLRPUHevcFileDTO> blRPUCacheFileWriter() {
// Step 6 - Validate merge
@Bean
public Step validateMerge() {
return stepBuilderFactory
.get(ConsoleColor.CYAN.value + "6/9 Validate Merge Compatibility" + ConsoleColor.NONE.value)
.<VideoMergeDTO, VideoMergeDTO>chunk(CHUNK).reader(cacheMergeValidationReader())
.processor(mergeValidationProcessor()).writer(cacheMergeValidationWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "6/9 Validate Merge Compatibility" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoMergeDTO, VideoMergeDTO>chunk(CHUNK, ptm).reader(cacheMergeValidationReader()).processor(mergeValidationProcessor()).writer(cacheMergeValidationWriter()).build();
}

@Bean
Expand All @@ -273,9 +250,8 @@ public ItemWriter<VideoMergeDTO> cacheMergeValidationWriter() {

@Bean
public Step mergeResult() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "7/9 Generate Results" + ConsoleColor.NONE.value)
.<VideoMergeDTO, VideoFileDTO>chunk(CHUNK).reader(cacheMergeReader()).processor(mergeToMkvProcessor())
.writer(blRPUMKVCacheFileWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "7/9 Generate Results" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoMergeDTO, VideoFileDTO>chunk(CHUNK, ptm).reader(cacheMergeReader()).processor(mergeToMkvProcessor()).writer(blRPUMKVCacheFileWriter()).build();
}

@Bean
Expand All @@ -297,9 +273,8 @@ public ItemWriter<VideoFileDTO> blRPUMKVCacheFileWriter() {

@Bean
public Step validateResult() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "8/9 Validate Results" + ConsoleColor.NONE.value)
.<VideoFileDTO, VideoFileDTO>chunk(CHUNK).reader(resultReader()).processor(resultValidatorProcessor())
.writer(resultWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "8/9 Validate Results" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<VideoFileDTO, VideoFileDTO>chunk(CHUNK, ptm).reader(resultReader()).processor(resultValidatorProcessor()).writer(resultWriter()).build();
}

@Bean
Expand All @@ -321,9 +296,8 @@ public ItemWriter<VideoFileDTO> resultWriter() {

@Bean
public Step cleanupResult() {
return stepBuilderFactory.get(ConsoleColor.CYAN.value + "9/9 Cleanup Temporary File" + ConsoleColor.NONE.value)
.<FileDTO, FileDTO>chunk(CHUNK).reader(hevcCleanupReader()).processor(cleanupProcessor())
.writer(cleanupWriter()).build();
StepBuilder stepBuilder = new StepBuilder(ConsoleColor.CYAN.value + "9/9 Cleanup Temporary File" + ConsoleColor.NONE.value, jobRepository);
return stepBuilder.<FileDTO, FileDTO>chunk(CHUNK, ptm).reader(hevcCleanupReader()).processor(cleanupProcessor()).writer(cleanupWriter()).build();
}

@Bean
Expand Down
19 changes: 9 additions & 10 deletions src/main/java/com/zggis/dobby/batch/writers/CacheFileWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;

import com.zggis.dobby.batch.ConsoleColor;
Expand All @@ -30,23 +31,14 @@ public CacheFileWriter(JobCacheKey fileType, boolean validate) {
this.validate = validate;
}

@Override
public void write(List<? extends T> files) {
for (T file : files) {
this.files.add(file);
logger.debug("Writing {} : {}", fileType.value, file.getName());
}

}

@Override
public void beforeStep(StepExecution stepExecution) {
}

@Override
public ExitStatus afterStep(StepExecution stepExecution) {
for (T file : files) {
if(validate && !StringUtils.hasText(file.getName())){
if (validate && !StringUtils.hasText(file.getName())) {
return ExitStatus.FAILED;
}
if (validate && !JobUtils.doesMediaFileExists(file.getName())) {
Expand All @@ -59,4 +51,11 @@ public ExitStatus afterStep(StepExecution stepExecution) {
return ExitStatus.COMPLETED;
}

@Override
public void write(Chunk<? extends T> chunk) throws Exception {
for (T file : chunk) {
this.files.add(file);
logger.debug("Writing {} : {}", fileType.value, file.getName());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;

import com.zggis.dobby.batch.ConsoleColor;
Expand All @@ -20,11 +21,6 @@ public class CacheMergeWriter implements ItemWriter<VideoMergeDTO>, StepExecutio

private final List<VideoMergeDTO> mergers = new ArrayList<>();

@Override
public void write(List<? extends VideoMergeDTO> items) {
mergers.addAll(items);
}

@Override
public void beforeStep(StepExecution stepExecution) {
}
Expand All @@ -45,4 +41,8 @@ public ExitStatus afterStep(StepExecution stepExecution) {
return ExitStatus.COMPLETED;
}

@Override
public void write(Chunk<? extends VideoMergeDTO> chunk) throws Exception {
mergers.addAll(chunk.getItems());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,11 @@
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;

public class NoOperationWriter<T> implements ItemWriter<T>, StepExecutionListener {

@Override
public void write(List<? extends T> files) {
}

@Override
public void beforeStep(StepExecution stepExecution) {
}
Expand All @@ -22,4 +19,8 @@ public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}

@Override
public void write(Chunk<? extends T> chunk) throws Exception {

}
}
3 changes: 2 additions & 1 deletion src/main/java/com/zggis/dobby/dto/ActiveAreaDTO.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.zggis.dobby.dto;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class ActiveAreaDTO {
public class ActiveAreaDTO implements Serializable {

private List<Integer> activeAreaHeights = new ArrayList<>();

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/zggis/dobby/dto/BorderInfoDTO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.zggis.dobby.dto;

public class BorderInfoDTO {
import java.io.Serializable;

public class BorderInfoDTO implements Serializable {

private int topOffset = 0;

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/zggis/dobby/dto/batch/FileDTO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.zggis.dobby.dto.batch;

public abstract class FileDTO implements IFile {
import java.io.Serializable;

public abstract class FileDTO implements IFile, Serializable {

protected String name;

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/zggis/dobby/dto/batch/VideoFileDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.zggis.dobby.dto.ActiveAreaDTO;
import com.zggis.dobby.dto.mediainfo.MediaInfoDTO;

import java.io.Serializable;

public class VideoFileDTO extends FileDTO {

private ActiveAreaDTO activeArea;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.zggis.dobby.dto.batch;

public class VideoInjectionDTO {
import java.io.Serializable;

public class VideoInjectionDTO implements Serializable {

private final HevcFileDTO standardHevcFile;

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/zggis/dobby/dto/batch/VideoMergeDTO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.zggis.dobby.dto.batch;

public class VideoMergeDTO {
import java.io.Serializable;

public class VideoMergeDTO implements Serializable {

private final VideoFileDTO standardFile;

Expand Down
Loading

0 comments on commit e8b0b9e

Please sign in to comment.