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

+ Recent posts