Skip to content

Commit 1d603e9

Browse files
author
Emil
committed
added batchconfiguration for importing musician and music album details from dataset
1 parent adbab0d commit 1d603e9

20 files changed

+150641
-21
lines changed

pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
<artifactId>spring-boot-starter-web</artifactId>
2323
</dependency>
2424

25+
<dependency>
26+
<groupId>org.springframework.boot</groupId>
27+
<artifactId>spring-boot-starter-batch</artifactId>
28+
</dependency>
2529
<dependency>
2630
<groupId>org.springframework.boot</groupId>
2731
<artifactId>spring-boot-starter-test</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.innoventes.jukebox.batch;
2+
3+
public class AlbumInput {
4+
5+
private String id;
6+
private String artist_id;
7+
private String album_title;
8+
private String genre;
9+
private String year_of_pub;
10+
private String num_of_tracks;
11+
private String num_of_sales;
12+
private String rolling_stone_critic;
13+
private String mtv_critic;
14+
private String music_maniac_critic;
15+
16+
public String getId() {
17+
return id;
18+
}
19+
20+
public void setId(String id) {
21+
this.id = id;
22+
}
23+
24+
public String getArtist_id() {
25+
return artist_id;
26+
}
27+
28+
public void setArtist_id(String artist_id) {
29+
this.artist_id = artist_id;
30+
}
31+
32+
public String getAlbum_title() {
33+
return album_title;
34+
}
35+
36+
public void setAlbum_title(String album_title) {
37+
this.album_title = album_title;
38+
}
39+
40+
public String getGenre() {
41+
return genre;
42+
}
43+
44+
public void setGenre(String genre) {
45+
this.genre = genre;
46+
}
47+
48+
public String getYear_of_pub() {
49+
return year_of_pub;
50+
}
51+
52+
public void setYear_of_pub(String year_of_pub) {
53+
this.year_of_pub = year_of_pub;
54+
}
55+
56+
public String getNum_of_tracks() {
57+
return num_of_tracks;
58+
}
59+
60+
public void setNum_of_tracks(String num_of_tracks) {
61+
this.num_of_tracks = num_of_tracks;
62+
}
63+
64+
public String getNum_of_sales() {
65+
return num_of_sales;
66+
}
67+
68+
public void setNum_of_sales(String num_of_sales) {
69+
this.num_of_sales = num_of_sales;
70+
}
71+
72+
public String getRolling_stone_critic() {
73+
return rolling_stone_critic;
74+
}
75+
76+
public void setRolling_stone_critic(String rolling_stone_critic) {
77+
this.rolling_stone_critic = rolling_stone_critic;
78+
}
79+
80+
public String getMtv_critic() {
81+
return mtv_critic;
82+
}
83+
84+
public void setMtv_critic(String mtv_critic) {
85+
this.mtv_critic = mtv_critic;
86+
}
87+
88+
public String getMusic_maniac_critic() {
89+
return music_maniac_critic;
90+
}
91+
92+
public void setMusic_maniac_critic(String music_maniac_critic) {
93+
this.music_maniac_critic = music_maniac_critic;
94+
}
95+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.innoventes.jukebox.batch;
2+
3+
import com.innoventes.jukebox.models.entity.MusicAlbum;
4+
import org.springframework.batch.item.ItemWriter;
5+
import org.springframework.stereotype.Component;
6+
7+
import java.util.List;
8+
9+
@Component
10+
public class AlbumWriter implements ItemWriter<MusicAlbum> {
11+
@Override
12+
public void write(List<? extends MusicAlbum> list) throws Exception {
13+
for (MusicAlbum album : list){
14+
15+
}
16+
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package com.innoventes.jukebox.batch;
2+
3+
import com.innoventes.jukebox.models.entity.MusicAlbum;
4+
import com.innoventes.jukebox.models.entity.Musician;
5+
import org.springframework.batch.core.Job;
6+
import org.springframework.batch.core.Step;
7+
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
8+
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
9+
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
10+
import org.springframework.batch.core.launch.support.RunIdIncrementer;
11+
import org.springframework.batch.item.file.FlatFileItemReader;
12+
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
13+
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.context.annotation.Bean;
16+
import org.springframework.context.annotation.Configuration;
17+
import org.springframework.core.io.ClassPathResource;
18+
19+
@Configuration
20+
@EnableBatchProcessing
21+
public class BatchConfiguration {
22+
23+
private static String[] MUSICIAN_FIELDS = {"id", "real_name", "art_name", "role", "year_of_birth", "country", "city", "email", "zip_code"};
24+
private static String[] ALBUM_FIELDS = {"id","artist_id", "album_title", "genre", "year_of_pub", "num_of_tracks", "num_of_sales", "rolling_stone_critic", "mtv_critic", "music_maniac_critic"};
25+
26+
27+
@Autowired
28+
public JobBuilderFactory jobBuilderFactory;
29+
30+
@Autowired
31+
public StepBuilderFactory stepBuilderFactory;
32+
33+
@Bean
34+
public FlatFileItemReader<MusicianInput> musicianReader() {
35+
return new FlatFileItemReaderBuilder<MusicianInput>()
36+
.name("musicianItemReader")
37+
.resource(new ClassPathResource("dataset/artists.csv"))
38+
.delimited()
39+
.names(MUSICIAN_FIELDS)
40+
.fieldSetMapper(new BeanWrapperFieldSetMapper<MusicianInput>() {{
41+
setTargetType(MusicianInput.class);
42+
}})
43+
.build();
44+
}
45+
46+
@Bean
47+
public FlatFileItemReader<AlbumInput> albumReader() {
48+
return new FlatFileItemReaderBuilder<AlbumInput>()
49+
.name("albumReader")
50+
.resource(new ClassPathResource("dataset/albums.csv"))
51+
.delimited()
52+
.names(ALBUM_FIELDS)
53+
.fieldSetMapper(new BeanWrapperFieldSetMapper<AlbumInput>() {{
54+
setTargetType(AlbumInput.class);
55+
}})
56+
.build();
57+
}
58+
59+
@Bean
60+
public MusicianProcessor musicianProcessor() {
61+
return new MusicianProcessor();
62+
}
63+
64+
@Bean
65+
public MusicAlbumProcessor musicAlbumProcessor() {
66+
return new MusicAlbumProcessor();
67+
}
68+
69+
@Bean
70+
public MusicianWriter musicianWriter() {
71+
return new MusicianWriter();
72+
}
73+
74+
75+
@Bean
76+
public Step step1(MusicianWriter writer) {
77+
return stepBuilderFactory.get("step1")
78+
.<MusicianInput, Musician>chunk(10)
79+
.reader(musicianReader())
80+
.processor(musicianProcessor())
81+
.writer(writer)
82+
.build();
83+
}
84+
85+
@Bean
86+
public Step step2(MusicAlbumWriter writer) {
87+
return stepBuilderFactory.get("step2")
88+
.<AlbumInput, MusicAlbum>chunk(10)
89+
.reader(albumReader())
90+
.processor(musicAlbumProcessor())
91+
.writer(writer)
92+
.build();
93+
}
94+
95+
@Bean
96+
public Job importVehicleJob(JobCompletionNotificationListener listener, Step step1, Step step2) {
97+
return jobBuilderFactory.get("importMusicianJob")
98+
.incrementer(new RunIdIncrementer())
99+
.listener(listener)
100+
.start(step1)
101+
.next(step2)
102+
.build();
103+
}
104+
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.innoventes.jukebox.batch;
2+
3+
import com.innoventes.jukebox.repository.MusicianRepository;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.batch.core.BatchStatus;
7+
import org.springframework.batch.core.JobExecution;
8+
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.stereotype.Component;
11+
12+
@Component
13+
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
14+
15+
private final MusicianRepository musicianRepository;
16+
17+
public static final Logger LOGGER = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
18+
19+
@Autowired
20+
public JobCompletionNotificationListener(MusicianRepository musicianRepository){
21+
this.musicianRepository = musicianRepository;
22+
}
23+
24+
@Override
25+
public void afterJob(JobExecution jobExecution) {
26+
if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
27+
LOGGER.info("!!! JOB FINISHED! Time to verify the results");
28+
// repository.findAll().forEach(vehicle -> LOGGER.info(vehicle.getId()));
29+
}
30+
}
31+
}
32+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.innoventes.jukebox.batch;
2+
3+
import com.innoventes.jukebox.models.entity.MusicAlbum;
4+
import com.innoventes.jukebox.models.entity.Musician;
5+
import com.innoventes.jukebox.repository.MusicianRepository;
6+
import org.springframework.batch.item.ItemProcessor;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
9+
import java.util.HashSet;
10+
11+
public class MusicAlbumProcessor implements ItemProcessor<AlbumInput, MusicAlbum> {
12+
13+
@Autowired
14+
private MusicianRepository musicianRepository;
15+
16+
@Override
17+
public MusicAlbum process(AlbumInput albumInput) throws Exception {
18+
19+
MusicAlbum album = new MusicAlbum();
20+
if (albumInput.getId() != null)
21+
album.setId(Long.valueOf(albumInput.getId()));
22+
if (albumInput.getArtist_id() != null){
23+
Musician musician = musicianRepository.getOne(Long.valueOf(albumInput.getArtist_id()));
24+
HashSet<Musician> musicianHashSet = new HashSet<>();
25+
musicianHashSet.add(musician);
26+
album.setMusician(musicianHashSet);
27+
}
28+
if (albumInput.getAlbum_title() != null)
29+
album.setName(albumInput.getAlbum_title());
30+
if (albumInput.getGenre() != null)
31+
album.setGenre(albumInput.getGenre());
32+
if (albumInput.getYear_of_pub() != null)
33+
album.setDateOfRelease(albumInput.getYear_of_pub());
34+
if (albumInput.getNum_of_tracks() != null)
35+
album.setNumberOfTracks(albumInput.getNum_of_tracks());
36+
if (albumInput.getNum_of_sales() != null)
37+
album.setNumberOfSales(albumInput.getNum_of_sales());
38+
if (albumInput.getRolling_stone_critic() != null)
39+
album.setRollingStoneCritic(Float.valueOf(albumInput.getRolling_stone_critic()));
40+
if (albumInput.getMtv_critic() != null)
41+
album.setMtvCritic(Float.valueOf(albumInput.getMtv_critic()));
42+
if (albumInput.getMusic_maniac_critic() != null)
43+
album.setMusicManiacCritic(Float.valueOf(albumInput.getMusic_maniac_critic()));
44+
45+
return album;
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.innoventes.jukebox.batch;
2+
3+
import com.innoventes.jukebox.models.entity.MusicAlbum;
4+
import com.innoventes.jukebox.repository.AlbumRepository;
5+
import org.springframework.batch.item.ItemWriter;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.util.List;
10+
11+
@Component
12+
public class MusicAlbumWriter implements ItemWriter<MusicAlbum> {
13+
14+
@Autowired
15+
private AlbumRepository musicAlbumRepository;
16+
17+
@Override
18+
public void write(List<? extends MusicAlbum> list) throws Exception {
19+
musicAlbumRepository.saveAll(list);
20+
}
21+
}

0 commit comments

Comments
 (0)