From b94ec86a554fc0173d35b3486bdd96834fdc24e4 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Wed, 9 May 2018 22:54:00 +0200 Subject: [PATCH] Updated rules system --- math-rules-cache.zip | Bin 61207 -> 92428 bytes .../picalculator/math/rules/RulesManager.java | 31 ++++++++++++++---- .../{rules.csv => default-rules.lst} | 1 - 3 files changed, 25 insertions(+), 7 deletions(-) rename src/main/resources/{rules.csv => default-rules.lst} (93%) diff --git a/math-rules-cache.zip b/math-rules-cache.zip index 1428591c49f5f3ac09e94c35268cfede34431e2e..83c7c1ccb6b6eb8854c18c8c2454d17def07bca4 100644 GIT binary patch delta 29959 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 RFLJ*lxSdltZXF~!?q8Qr2Mz!L diff --git a/src/main/java/org/warp/picalculator/math/rules/RulesManager.java b/src/main/java/org/warp/picalculator/math/rules/RulesManager.java index 85d14802..713a1b3b 100644 --- a/src/main/java/org/warp/picalculator/math/rules/RulesManager.java +++ b/src/main/java/org/warp/picalculator/math/rules/RulesManager.java @@ -12,7 +12,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; + import org.warp.picalculator.Error; import org.warp.picalculator.Utils; import org.warp.picalculator.math.Function; @@ -40,13 +43,29 @@ public class RulesManager { } try { boolean compiledSomething = false; - final Path rulesPath = Utils.getResource("/rules.csv"); - if (!Files.exists(rulesPath)) { - throw new FileNotFoundException("rules.csv not found!"); + final Path defaultRulesPath = Utils.getResource("/default-rules.lst"); + if (!Files.exists(defaultRulesPath)) { + throw new FileNotFoundException("default-rules.lst not found!"); } - List ruleLines = Files.readAllLines(rulesPath); - ruleLines.remove(0); //Remove the headers - + List ruleLines = new ArrayList(); + Path rulesPath = Paths.get("rules/"); + if (rulesPath.toFile().exists()) { + System.err.println("RULES EXISTS!!!!!!"); + try (Stream paths = Files.walk(rulesPath)) { + paths + .filter(Files::isRegularFile) + .forEach((Path p) -> { + if (p.toString().endsWith(".java")) { + String path = rulesPath.relativize(p).toString(); + path = path.substring(0, path.length() - ".java".length()); + ruleLines.add(path); + System.err.println(path); + } + }); + } + } + ruleLines.addAll(Files.readAllLines(defaultRulesPath)); + boolean useCache = false; Path tDir = Paths.get(System.getProperty("java.io.tmpdir"), "WarpPi-Calculator").resolve("rules-rt"); // try { diff --git a/src/main/resources/rules.csv b/src/main/resources/default-rules.lst similarity index 93% rename from src/main/resources/rules.csv rename to src/main/resources/default-rules.lst index b171febb..38c710a2 100644 --- a/src/main/resources/rules.csv +++ b/src/main/resources/default-rules.lst @@ -1,4 +1,3 @@ -Rule file functions/DivisionRule functions/EmptyNumberRule functions/ExpressionRule