package io.gitlab.jfronny.translater.transformer; import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder; import io.gitlab.jfronny.translater.Cfg; import io.gitlab.jfronny.translater.Translater; import net.fabricmc.loader.api.FabricLoader; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.util.Properties; public class CachingTransformer implements Transformer { private static final Path CACHE_FILE = FabricLoader.getInstance().getConfigDir().resolve(Translater.MOD_ID + ".cache"); private final Properties cache = new Properties(); private final Transformer transformer; @Override public String transform(String str) { if (str == null) return null; //Transform and cache if not present if (!cache.containsKey(str)) { String transformed = transformer.transform(str); if (transformed == null) { // The transformer failed return str; } cache.put(str, transformed); save(); } //Return cached result return (String) cache.get(str); } public CachingTransformer(Transformer baseTransformer) { transformer = baseTransformer; if (Cfg.forceRegenerate) { Cfg.forceRegenerate = false; ConfigHolder.getInstance().getRegistered().get(Translater.MOD_ID).write(); } else { //Load cache if (Files.exists(CACHE_FILE) && Files.isRegularFile(CACHE_FILE)) { Translater.LOGGER.info("Loading cache"); try (InputStream inS = Files.newInputStream(CACHE_FILE)) { cache.load(inS); } catch (IOException e) { Translater.LOGGER.error("Could not load translater cache", e); } } else { //Save default cache if parameters are default if (!Cfg.breakFully && Cfg.rounds == 5) { Translater.LOGGER.info("Initializing default cache"); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream inS = classLoader.getResourceAsStream("namecache.ini"); if (inS != null) { try { cache.load(inS); inS.close(); save(); } catch (IOException e) { Translater.LOGGER.error("Could not initialize default translater cache"); } } } } } save(); } private void save() { try (OutputStream outS = Files.newOutputStream(CACHE_FILE)) { cache.store(outS, "---Lang---"); } catch (IOException e) { Translater.LOGGER.error("Could not save translater cache"); } } }