package sample.context; import java.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.transaction.annotation.Transactional; import sample.context.orm.SystemRepository; /** * アプリケーション設定情報に対するアクセス手段を提供します。 */ public class AppSettingHandler { @Autowired @Lazy private SystemRepository rep; /** 設定時は固定のキー/値を返すモックモードとする */ private final Optional<Map<String, String>> mockMap; public AppSettingHandler() { this.mockMap = Optional.empty(); } public AppSettingHandler(Map<String, String> mockMap) { this.mockMap = Optional.of(mockMap); } /** アプリケーション設定情報を取得します。 */ @Cacheable(cacheNames = "AppSettingHandler.appSetting", key = "#id") @Transactional(value = SystemRepository.BeanNameTx) public AppSetting setting(String id) { if (mockMap.isPresent()) return mockSetting(id); AppSetting setting = AppSetting.load(rep, id); setting.hashCode(); // for loading return setting; } private AppSetting mockSetting(String id) { return new AppSetting(id, "category", "テスト用モック情報", mockMap.get().get(id)); } /** アプリケーション設定情報を変更します。 */ @CacheEvict(cacheNames = "AppSettingHandler.appSetting", key = "#id") @Transactional(value = SystemRepository.BeanNameTx) public AppSetting update(String id, String value) { return mockMap.isPresent() ? mockSetting(id) : AppSetting.load(rep, id).update(rep, value); } }