package io.gitlab.jfronny.translater.transformer; import io.gitlab.jfronny.libjf.config.api.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 ITransformer { private static final Path cacheFile = FabricLoader.getInstance().getConfigDir().resolve(Translater.MOD_ID + ".cache"); Properties cache; private final ITransformer 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) { Translater.LOGGER.warn("Very concerning, got null for non-null key " + str); return null; } cache.put(str, transformed); Save(); } //Return cached result return (String) cache.get(str); } public CachingTransformer(ITransformer baseTransformer) { transformer = baseTransformer; cache = new Properties(); if (Cfg.forceRegenerate) { Cfg.forceRegenerate = false; ConfigHolder.getInstance().getRegistered().get(Translater.MOD_ID).write(); } else { //Load cache if (Files.exists(cacheFile) && Files.isRegularFile(cacheFile)) { Translater.LOGGER.info("Loading cache"); try (InputStream inS = Files.newInputStream(cacheFile)) { cache.load(inS); } catch (IOException e) { e.printStackTrace(); } } 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) { e.printStackTrace(); } } } } } Save(); } private void Save() { try (OutputStream outS = Files.newOutputStream(cacheFile)) { cache.store(outS, "---Lang---"); } catch (IOException e) { e.printStackTrace(); } } }