package org.jwildfire.create.tina.variation.plot; import java.util.HashMap; import java.util.Map; import org.jwildfire.base.Tools; import org.jwildfire.base.mathparser.JEPWrapper; import org.nfunk.jep.Node; public abstract class WFFuncPresets<T extends WFFuncPreset> { private Map<Integer, T> presets; private final String presets_filename; private int minId, maxId; private final T dfltPreset = createDefaultPreset(); public WFFuncPresets(String presets_filename) { super(); this.presets_filename = presets_filename; } protected abstract T createDefaultPreset(); public T getPreset(int id) { if (presets == null) { presets = parsePresets(); } T res = presets.get(id); return res != null ? res : dfltPreset; } private Map<Integer, T> parsePresets() { minId = Integer.MAX_VALUE; maxId = Integer.MIN_VALUE; Map<Integer, T> res = new HashMap<>(); try { String presets_txt = Tools.getRessourceAsString(WFFuncPresets.class, presets_filename); int blockStart = -1; while (blockStart < presets_txt.length()) { blockStart = presets_txt.indexOf("##", blockStart + 1); if (blockStart < 0) { break; } int blockEnd = presets_txt.indexOf("##", blockStart + 2); if (blockEnd < 0) { blockEnd = presets_txt.length(); } try { T preset = parsePreset(presets_txt.substring(blockStart - 1, blockEnd)); if (res.get(preset.getId()) != null) { throw new Exception("Preset <" + preset.getId() + "> already exists"); } if (preset.getId() < minId) { minId = preset.getId(); } if (preset.getId() > maxId) { maxId = preset.getId(); } res.put(preset.getId(), preset); } catch (Exception ex) { ex.printStackTrace(); } } } catch (Exception ex) { ex.printStackTrace(); } return res; } protected abstract T parsePreset(String preset); protected int parseId(String preset) { int p1 = preset.indexOf("##"); if (p1 >= 0) { int p2 = preset.indexOf("\n", p1 + 1); if (p2 < 0) p2 = preset.length(); String token = preset.substring(p1 + 2, p2).trim(); return Integer.parseInt(token); } return -1; } protected String parseToken(String preset, String token) { int p1 = preset.indexOf("\n" + token); if (p1 >= 0) { int p2 = preset.indexOf("\n", p1 + 1); if (p2 < 0) p2 = preset.length(); String line = preset.substring(p1 + token.length(), p2).trim(); int p3 = line.indexOf("="); if (p3 >= 0) { line = line.substring(p3 + 1, line.length()); int p4 = line.indexOf("---"); if (p4 > 0) { line = line.substring(0, p4); } return line.trim(); } } return null; } protected String parseFormula(String preset, String token) { return parseToken(preset, token); } protected double parseParam(String preset, String token) { String value = parseToken(preset, token); if (value == null) { return 0.0; } JEPWrapper parser = new JEPWrapper(); Node node = parser.parse(value); return (Double) parser.evaluate(node); } public int getRandomPresetId() { return minId + (int) ((maxId - minId) * Math.random()); } }