FileRepositoryInitializeProducers.java
package io.extact.rms.application.persistence.file;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Map;
import jakarta.enterprise.context.Dependent;
import jakarta.enterprise.inject.Produces;
import jakarta.enterprise.inject.spi.InjectionPoint;
import jakarta.inject.Inject;
import org.eclipse.microprofile.config.Config;
import io.extact.rms.application.domain.RentalItem;
import io.extact.rms.application.domain.Reservation;
import io.extact.rms.application.domain.UserAccount;
import io.extact.rms.application.persistence.file.converter.EntityArrayConverter;
import io.extact.rms.application.persistence.file.converter.RentalItemArrayConverter;
import io.extact.rms.application.persistence.file.converter.ReservationArrayConverter;
import io.extact.rms.application.persistence.file.converter.UserAccountArrayConverter;
import io.extact.rms.application.persistence.file.io.FileAccessor;
import io.extact.rms.application.persistence.file.io.PathResolver;
import lombok.extern.slf4j.Slf4j;
@Dependent
@Slf4j
public class FileRepositoryInitializeProducers {
// config value is "permanent" or "temporary"
private static final String FILE_TYPE_CONFIG_KEY = "csv.type";
// samaple key is "csv-file.permanent.file_name.reservation = reservation.csv"
private static final String FILE_NAME_CONFIG_KEY_FORMAT = "csv.%s.fileName.%s";
private static final Map<Class<?>, String> FILE_NAME_TYPE_CONFIG_KEY_MAP = Map.of(
RentalItemFileRepository.class, "rentalitem",
ReservationFileRepository.class, "reservation",
UserAccountFileRepository.class, "useraccount"
);
@Inject
private Config config;
@Produces
public FileAccessor creteFileAccessor(InjectionPoint injectionPoint) throws IOException {
// 1%sの文字列取得
var fileType = config.getValue(FILE_TYPE_CONFIG_KEY, String.class);
// 2%sの文字列取得
Class<?> beanClass = injectionPoint.getBean().getBeanClass();
var fileNameTypeConfigKey = FILE_NAME_TYPE_CONFIG_KEY_MAP.get(beanClass);
// ファイル名のConfigKeyの決定
var fileNameConfigKey = String.format(FILE_NAME_CONFIG_KEY_FORMAT, fileType, fileNameTypeConfigKey);
var fileName = config.getValue(fileNameConfigKey, String.class);
// フィルパスの取得
Path filePath = switch (fileType) {
case "permanent" -> new PathResolver.FixedDirPathResolver().resolve(fileName);
case "temporary" -> FileAccessor.copyResourceToRealPath(fileName, new PathResolver.TempDirPathResolver());
default -> throw new IllegalArgumentException("unknown fileType -> " + fileType);
};
log.info("[{}]モードでファイルをオープンしました。PATH={}", fileType, filePath);
return new FileAccessor(filePath);
}
@Produces
public EntityArrayConverter<RentalItem> createRentalItemConverter(InjectionPoint injectionPoint) {
return RentalItemArrayConverter.INSTANCE;
}
@Produces
public EntityArrayConverter<Reservation> createReservationConverter(InjectionPoint injectionPoint) {
return ReservationArrayConverter.INSTANCE;
}
@Produces
public EntityArrayConverter<UserAccount> createUserAccoutConverter(InjectionPoint injectionPoint) {
return UserAccountArrayConverter.INSTANCE;
}
}