728x90
> 추상클래스 로 클래스를 변경하여 xml , Csv 모두 기능이 동작 하도록 한다.
@Profile(MovieBuddyProfile.CSV_MODE)
@Repository
public class CsvMovieReader extends AbstractFileSystemMovieReader implements MovieReader {
/**
* 영화 메타데이터를 읽어 저장된 영화 목록을 불러온다.
* @return 불러온 영화 목록
*/
@Override
public List<Movie> loadMovies() {
try {
final URI resourceUri = ClassLoader.getSystemResource(getMetadata()).toURI();
final Path data = Path.of(FileSystemUtils.checkFileSystem(resourceUri));
final Function<String, Movie> mapCsv = csv -> {
try {
// split with comma
String[] values = csv.split(",");
String title = values[0];
List<String> genres = Arrays.asList(values[1].split("\\|"));
String language = values[2].trim();
String country = values[3].trim();
int releaseYear = Integer.valueOf(values[4].trim());
String director = values[5].trim();
List<String> actors = Arrays.asList(values[6].split("\\|"));
URL imdbLink = new URL(values[7].trim());
String watchedDate = values[8];
return Movie.of(title, genres, language, country, releaseYear, director, actors, imdbLink, watchedDate);
} catch (IOException error) {
throw new ApplicationException("mapping csv to object failed.", error);
}
};
return Files.readAllLines(data, StandardCharsets.UTF_8)
.stream()
.skip(1)
.map(mapCsv)
.collect(Collectors.toList());
} catch (IOException | URISyntaxException error) {
throw new ApplicationException("failed to load movies data.", error);
}
}
}
public abstract class AbstractFileSystemMovieReader {
private final Logger log = LoggerFactory.getLogger(getClass());
private String metadata;
public String getMetadata() {
return metadata;
}
public void setMetadata(String metadata) {
this.metadata = Objects.requireNonNull(metadata , "metadata is required value"); // not null
}
@PostConstruct
public void afterPropertiesSet() throws Exception {
// 존재하는 파일인지 검증코드 추가
URL metadataUrl = ClassLoader.getSystemResource(metadata);
if(Objects.isNull(metadataUrl)) {
throw new FileNotFoundException();
}
// 읽어 들일수 있는 파일인지 검증
if( Files.isReadable(Path.of(metadataUrl.toURI())) == false ) {
throw new ApplicationException(String.format("cannot read to metadata. [%s]", metadata));
}
}
@PreDestroy
public void destroy() throws Exception {
log.info("Destoryed bean");
}
}
728x90