From 22fdcbfcdabbbd405b93ff6050ef2e38cc942542 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Sun, 4 Sep 2022 18:44:13 +0200 Subject: [PATCH 01/11] Path handling --- .../docgen/graphviz/StateMachineToGraphviz.java | 16 ++++++++++++---- src/main/java/de/upb/docgen/utils/Utils.java | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java b/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java index d5932fc..6f757a8 100644 --- a/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java +++ b/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java @@ -13,6 +13,8 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -131,8 +133,11 @@ private static String getShortName(CrySLMethod label) { } public static void toPNG(String name) { - try { MutableGraph g = new Parser().read(new File("dotFSMs\\" + name +".dot")); - Graphviz.fromGraph(g).render(Format.SVG).toFile(new File("dotFSMs/" +name +".svg")); + try { + Path dot = Paths.get("dotFSMs", name + ".dot"); + MutableGraph g = new Parser().read(dot.toFile()); + Path svg = Paths.get("dotFSMs", name + ".svg"); + Graphviz.fromGraph(g).render(Format.SVG).toFile(svg.toFile()); } catch (IOException e) { e.printStackTrace(); @@ -140,8 +145,11 @@ public static void toPNG(String name) { } //reads the dot translation and creates a png file that is later used by the FTL template public static void toPNG(String name, String pathToRootpage) { - try { MutableGraph g = new Parser().read(new File(pathToRootpage+"\\"+"dotFSMs\\" + name +".dot")); - Graphviz.fromGraph(g).render(Format.SVG).toFile(new File(pathToRootpage+"/"+"dotFSMs/" +name +".svg")); + try { + Path dotPath = Paths.get(pathToRootpage, "dotFSMs", name + ".dot"); + MutableGraph g = new Parser().read(dotPath.toFile()); + Path svgPath = Paths.get(pathToRootpage, "dotFSMs", name + ".svg"); + Graphviz.fromGraph(g).render(Format.SVG).toFile(svgPath.toFile()); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/de/upb/docgen/utils/Utils.java b/src/main/java/de/upb/docgen/utils/Utils.java index 336d20b..aa8ee70 100644 --- a/src/main/java/de/upb/docgen/utils/Utils.java +++ b/src/main/java/de/upb/docgen/utils/Utils.java @@ -11,6 +11,8 @@ import java.io.*; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; /** @@ -143,7 +145,8 @@ public static Map>>> mapPredicates(Map Date: Sun, 4 Sep 2022 18:56:24 +0200 Subject: [PATCH 02/11] Fix template loader for unix systems --- .../upb/docgen/writer/FreeMarkerWriter.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java index 8ce4165..9906ead 100644 --- a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java +++ b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java @@ -9,6 +9,8 @@ import java.awt.*; import java.io.*; import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; import java.util.List; @@ -30,7 +32,8 @@ public static void createSidebar(List composedRuleList, Configurat Map input = new HashMap(); input.put("title", "Sidebar"); input.put("rules", composedRuleList); - Template template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "sidebar.ftl")); + Path sidebarFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"sidebar.ftl"); + Template template = cfg.getTemplate(sidebarFilePath.toFile().getName()); // 2.3. Generate the output try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"navbar.html"))) { template.process(input, fileWriter); @@ -71,7 +74,8 @@ public static void createSinglePage(List composedRuleList, Configu input.put("booleanF", f); // 2.2. Get the template - Template template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+"singleclass.ftl")); + File templateFile = new File(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "singleclass.ftl"); + Template template = cfg.getTemplate(templateFile.getName()); //create composedRules directory where single pages are stored new File(DocSettings.getInstance().getReportDirectory()+"/"+"composedRules/").mkdir(); @@ -88,7 +92,7 @@ public static void createSinglePage(List composedRuleList, Configu */ public static void setupFreeMarker(Configuration cfg) { // setup freemarker to load absolute paths - cfg.setTemplateLoader(new TemplateAbsolutePathLoader()); + //cfg.setTemplateLoader(new TemplateAbsolutePathLoader()); // Some other recommended settings: cfg.setDefaultEncoding("UTF-8"); cfg.setLocale(Locale.ENGLISH); @@ -103,18 +107,21 @@ public static void setupFreeMarker(Configuration cfg) { */ public static void createCogniCryptLayout(Configuration cfg) throws IOException, TemplateException { Map input = new HashMap(); - /* Not used anymore - Template headerTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "header.ftl")); - try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"header.html"))) { - headerTemplate.process(input, fileWriter); - } - */ - Template frontpageTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "frontpage.ftl")); + Path frontpageFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"frontpage.ftl"); + File frontpageFile = frontpageFilePath.toFile(); + File templateDir = frontpageFile.getParentFile(); + if ( null == templateDir ){ + templateDir = new File("./"); + } + cfg.setDirectoryForTemplateLoading(templateDir); + Template frontpageTemplate = cfg.getTemplate(frontpageFile.getName()); try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"frontpage.html"))) { frontpageTemplate.process(input, fileWriter); } - Template rootpageTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "rootpage.ftl")); + + Path rootpageFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"rootpage.ftl"); + Template rootpageTemplate = cfg.getTemplate(rootpageFilePath.toFile().getName()); try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"rootpage.html"))) { rootpageTemplate.process(input, fileWriter); } From fc8222e7f8bd2df86d3b4e63bb2145e96605314b Mon Sep 17 00:00:00 2001 From: svenfeld <76941845+svenfeld@users.noreply.github.com> Date: Sun, 4 Sep 2022 19:20:27 +0200 Subject: [PATCH 03/11] Rename ConstraintsVCClauseCon to ConstraintsVcClauseCon --- .../Templates/{ConstraintsVCClauseCon => ConstraintsVcClauseCon} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/Templates/{ConstraintsVCClauseCon => ConstraintsVcClauseCon} (100%) diff --git a/src/main/resources/Templates/ConstraintsVCClauseCon b/src/main/resources/Templates/ConstraintsVcClauseCon similarity index 100% rename from src/main/resources/Templates/ConstraintsVCClauseCon rename to src/main/resources/Templates/ConstraintsVcClauseCon From d421498518315c13f083d012b8886d2718a9c795 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Wed, 5 Oct 2022 16:36:44 +0200 Subject: [PATCH 04/11] Default ressource handling --- src/main/java/de/upb/docgen/DocSettings.java | 22 +++---- .../de/upb/docgen/DocumentGeneratorMain.java | 46 +++++++++---- src/main/java/de/upb/docgen/Order.java | 21 +++++- .../java/de/upb/docgen/crysl/CrySLReader.java | 61 +++++++++++++++-- .../graphviz/StateMachineToGraphviz.java | 11 +++- .../utils/FTLTemplateLoaderFromJar.java | 27 ++++++++ src/main/java/de/upb/docgen/utils/Utils.java | 50 ++++++++++++-- .../upb/docgen/writer/FreeMarkerWriter.java | 65 ++++++++++++++++--- .../resources/FTLTemplates/singleclass.ftl | 2 +- 9 files changed, 257 insertions(+), 48 deletions(-) create mode 100644 src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java diff --git a/src/main/java/de/upb/docgen/DocSettings.java b/src/main/java/de/upb/docgen/DocSettings.java index fe23176..c5f2eab 100644 --- a/src/main/java/de/upb/docgen/DocSettings.java +++ b/src/main/java/de/upb/docgen/DocSettings.java @@ -116,7 +116,6 @@ public void parseSettingsFromCLI(String[] settings) { case "--rulesdir": setRulesetPathDir(settings[i+1]); i++; - mandatorySettings++; break; case "--reportpath": setReportDirectory(settings[i+1]); @@ -126,12 +125,10 @@ public void parseSettingsFromCLI(String[] settings) { case "--ftltemplatespath": setFTLTemplatesPath(settings[i+1]); i++; - mandatorySettings++; break; case "--langtemplatespath": setLangTemplatesPath(settings[i+1]); i++; - mandatorySettings++; break; case "--booleana": setBooleanA(false); @@ -159,32 +156,31 @@ public void parseSettingsFromCLI(String[] settings) { System.exit(255); } } - if(mandatorySettings != 4) { + + if(mandatorySettings != 1) { showErrorMessage(); System.exit(255); } + } private static void showErrorMessage() { String errorMessage = "An error occurred while trying to parse the CLI arguments.\n" +"The default command for running CogniCryptDOC is: \n"+ "java -jar \\\r\n"+ - " --rulesDir \\\r\n" + - " --FTLtemplatesPath \\\r\n" + - " --LANGtemplatesPath \\\r\n" + " --reportPath \n"; System.out.println(errorMessage); } private static void showErrorMessage(String arg) { String errorMessage = "An error occurred while trying to parse the CLI argument: "+arg+".\n" - +"The default command for running CogniCryptDOC is: \n"+ - "java -jar \\\r\n"+ - " --rulesDir \\\r\n" + - " --templatesPath \\\r\n" + - " --LANGtemplatesPath \\\r\n" + - " --reportPath \n" + +"The default command for running CogniCryptDOC is: \n" + +"java -jar \\\r\n" + +" --reportPath \n" + "\nAdditional arguments that can be used are:\n" + + " --rulesDir \\\r\n" + + " --templatesPath \\\r\n" + + " --LANGtemplatesPath \\\r\n" + "--booleanA \n" + "--booleanB \n" + "--booleanC \n" diff --git a/src/main/java/de/upb/docgen/DocumentGeneratorMain.java b/src/main/java/de/upb/docgen/DocumentGeneratorMain.java index 9375c3b..fd34178 100644 --- a/src/main/java/de/upb/docgen/DocumentGeneratorMain.java +++ b/src/main/java/de/upb/docgen/DocumentGeneratorMain.java @@ -1,6 +1,9 @@ package de.upb.docgen; import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.*; import crypto.rules.CrySLPredicate; @@ -25,12 +28,28 @@ public class DocumentGeneratorMain { public static void main(String[] args) throws IOException, TemplateException { //create singleton to access parsed flags from other classes + System.out.println("Starting the documentation generation."); + Map rules; DocSettings docSettings = DocSettings.getInstance(); docSettings.parseSettingsFromCLI(args); - //generate Graphviz dot and pngs set --booleanC to turnOff generation - if(docSettings.isBooleanE()) StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getRulesetPathDir(),docSettings.getReportDirectory()); //read CryslRules from absolutePath provided by the user - Map rules = CrySLReader.readRulesFromSourceFiles(docSettings.getRulesetPathDir()); + if (docSettings.getRulesetPathDir() != null) { + rules = CrySLReader.readRulesFromSourceFiles(docSettings.getRulesetPathDir()); + //Generate dot files from given ruleset + if(docSettings.isBooleanE()) { + System.out.println("Generating the statemachine files from " + docSettings.getRulesetPathDir() + "."); + StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getRulesetPathDir(),docSettings.getReportDirectory()); + } + } else { + //read rules from jar resources + rules = CrySLReader.readRulesFromJar(); + //generate dot files from jar resources + if(docSettings.isBooleanE()) { + System.out.println("Generating the statemachine files from default resources."); + StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getReportDirectory()); + } + } + //read CryslRules from absolutePath provided by the user ClassEventForb cef = new ClassEventForb(); ConstraintsVc valueconstraint = new ConstraintsVc(); @@ -122,22 +141,23 @@ public static void main(String[] args) throws IOException, TemplateException { //Freemarker Setup and create cognicryptdoc html pages + System.out.println("Using FreeMarker to generate the html files of the documentation."); Configuration cfg = new Configuration(new Version(2, 3, 20)); FreeMarkerWriter.setupFreeMarker(cfg); FreeMarkerWriter.createCogniCryptLayout(cfg); FreeMarkerWriter.createSidebar(composedRuleList, cfg); FreeMarkerWriter.createSinglePage(composedRuleList, cfg, ensToReq, reqToEns, docSettings.isBooleanA(), docSettings.isBooleanB(), docSettings.isBooleanC() , docSettings.isBooleanD() , docSettings.isBooleanE() , docSettings.isBooleanF()); - //copy CryslRulesFolder into generated Cognicrypt folder - //specifify this flag to distribute the documentation - if (!docSettings.isBooleanF()) { - File source = new File(docSettings.getRulesetPathDir()); - File dest = new File(docSettings.getReportDirectory() + File.separator + "rules"); - try { - FileUtils.copyDirectory(source, dest); - } catch (IOException e) { - e.printStackTrace(); - } + new File(docSettings.getReportDirectory() + File.separator + "rules").mkdir(); + Map rulesDist; + if (DocSettings.getInstance().getFtlTemplatesPath() == null) { + rulesDist = CrySLReader.readRulesFromJar(); + } else { + rulesDist = CrySLReader.readRulesFromSourceFiles(docSettings.getRulesetPathDir()); + } + for (File f : rulesDist.keySet()) { + Files.copy(f.toPath(), Paths.get(docSettings.getReportDirectory() , "rules", f.getName()), StandardCopyOption.REPLACE_EXISTING); } + System.out.println("Generated the documentation to " + docSettings.getReportDirectory()); diff --git a/src/main/java/de/upb/docgen/Order.java b/src/main/java/de/upb/docgen/Order.java index 9514f4b..db5c6de 100644 --- a/src/main/java/de/upb/docgen/Order.java +++ b/src/main/java/de/upb/docgen/Order.java @@ -19,6 +19,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import de.upb.docgen.crysl.CrySLReader; +import de.upb.docgen.utils.Utils; import org.apache.commons.lang3.StringUtils; import crypto.rules.CrySLRule; @@ -52,6 +54,12 @@ private static List getCryslFiles(String folderPath) throws IOException { return fileNames; } + private static List getCryslFiles() throws IOException { + Map rules = CrySLReader.readRulesFromSourceFiles(DocSettings.getInstance().getRulesetPathDir()); + return new ArrayList<>(rules.keySet()); + + } + // reading the file and adding it to map(k,v), k- event , v- content inside it private static Map> readCryslFile(String filePath) throws IOException { Map> cryslFileContentMap = new LinkedHashMap<>(); @@ -84,7 +92,16 @@ private static Map getSymValues() throws IOException { Properties properties = new Properties(); try { - File fileone = new File(DocSettings.getInstance().getLangTemplatesPath()+"/symbol.properties"); + File fileone; + String pathToSymbolPropertiesFolder; + if (DocSettings.getInstance().getLangTemplatesPath() == null) { + pathToSymbolPropertiesFolder = Order.class.getResource("/Templates").getPath(); + String folderName = pathToSymbolPropertiesFolder.substring(pathToSymbolPropertiesFolder.lastIndexOf("/") + 1); + fileone = Utils.extract(folderName + "/symbol.properties"); + } else { + pathToSymbolPropertiesFolder = DocSettings.getInstance().getLangTemplatesPath(); + fileone = new File(pathToSymbolPropertiesFolder+"/symbol.properties"); + } FileInputStream fileInput = new FileInputStream(fileone); properties.load(fileInput); fileInput.close(); @@ -350,7 +367,7 @@ private static void getProcessedMap(List eventList) { public List runOrder(CrySLRule rule, File file) throws IOException { String cname = new String(rule.getClassName().replace(".", ",")); List strArray = Arrays.asList(cname.split(",")); - List fileNames = getCryslFiles(FOLDER_PATH); + //List fileNames = getCryslFiles(FOLDER_PATH); // for (File file : fileNames) diff --git a/src/main/java/de/upb/docgen/crysl/CrySLReader.java b/src/main/java/de/upb/docgen/crysl/CrySLReader.java index 2656d1e..68310d7 100644 --- a/src/main/java/de/upb/docgen/crysl/CrySLReader.java +++ b/src/main/java/de/upb/docgen/crysl/CrySLReader.java @@ -1,14 +1,21 @@ package de.upb.docgen.crysl; import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import crypto.cryslhandler.CrySLModelReader; import crypto.rules.CrySLRule; +import de.upb.docgen.utils.Utils; +import sun.misc.Launcher; /** * @author Ritika Singh @@ -43,4 +50,50 @@ public static Map readRulesFromSourceFiles(final String folderP return null; } + + public static Map readRulesFromJar() throws IOException { + + final String path = "CrySLRules"; + final File jarFile = new File(CrySLReader.class.getProtectionDomain().getCodeSource().getLocation().getPath()); + CrySLModelReader cryslmodelreader = new CrySLModelReader(); + + Map rules = new HashMap<>(); + if(jarFile.isFile()) { // Run with JAR file + final JarFile jar = new JarFile(jarFile); + final Enumeration entries = jar.entries(); //gives ALL entries in jar + while(entries.hasMoreElements()) { + final JarEntry name = entries.nextElement(); + if (name.getName().endsWith(".crysl")) { //only handle crysl files + File extractedRule = Utils.extract(name.getName()); //Create a temporary crysl file + String shortend = extractedRule.getName().substring(0,extractedRule.getName().indexOf("crysl")+"crysl".length()); //CrySL Rule name without temp file ending + Files.move(extractedRule.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); + File renamedTempFile = (Paths.get(shortend).toFile()); + CrySLRule rule = cryslmodelreader.readRule(renamedTempFile); //Renaming allows the file to be read by the CrySLModelReader + renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished + rules.put(renamedTempFile, rule); + + } + } + jar.close(); + } else { // Run with IDE + final URL url = Launcher.class.getResource("/" + path); + if (url != null) { + try { + final File apps = new File(url.toURI()); + for (File file : apps.listFiles()) { + rules.put(file, cryslmodelreader.readRule(file)); + + } + } catch (URISyntaxException ex) { + + } + } + } + return rules; + + + } + + + } \ No newline at end of file diff --git a/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java b/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java index 6f757a8..21e702e 100644 --- a/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java +++ b/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java @@ -37,7 +37,16 @@ public static void main(String[] args) throws IOException { //Runs the translation and generation of PNG for every rule public static void generateGraphvizStateMachines(String pathToCryslRules, String pathToRootpage) throws IOException { Map rules = CrySLReader.readRulesFromSourceFiles(pathToCryslRules); - new File(pathToRootpage+"/"+"dotFSMs/").mkdir(); + new File(pathToRootpage + "/" + "dotFSMs/").mkdir(); + for (Map.Entry ruleEntry : rules.entrySet()) { + rulesOrderSectionToDot(ruleEntry.getValue(), pathToRootpage); + toPNG(ruleEntry.getValue().getClassName(), pathToRootpage); + } + } + + public static void generateGraphvizStateMachines(String pathToRootpage) throws IOException { + Map rules = CrySLReader.readRulesFromJar(); + new File(pathToRootpage + "/" + "dotFSMs/").mkdir(); for (Map.Entry ruleEntry : rules.entrySet()) { rulesOrderSectionToDot(ruleEntry.getValue(), pathToRootpage); toPNG(ruleEntry.getValue().getClassName(), pathToRootpage); diff --git a/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java b/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java new file mode 100644 index 0000000..3050d13 --- /dev/null +++ b/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java @@ -0,0 +1,27 @@ +package de.upb.docgen.utils; + +import de.upb.docgen.Order; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +public class FTLTemplateLoaderFromJar { + public static File readFtlTemplateFromJar(String templateName) throws IOException { + String pathToLangTemplates = Order.class.getResource("/FTLTemplates").getPath(); + File template; + String folderName = pathToLangTemplates.substring(pathToLangTemplates.lastIndexOf("/") + 1); + template = Utils.extract(folderName + "/" + templateName); + return template; + /* + String shortend = template.getName().substring(0,template.getName().indexOf("ftl")+"ftl".length()); //CrySL Rule name without temp file ending + Files.move(template.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); + File renamedTempFile = (Paths.get(shortend).toFile()); + renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished + return renamedTempFile; + +*/ + } +} diff --git a/src/main/java/de/upb/docgen/utils/Utils.java b/src/main/java/de/upb/docgen/utils/Utils.java index aa8ee70..8f9087e 100644 --- a/src/main/java/de/upb/docgen/utils/Utils.java +++ b/src/main/java/de/upb/docgen/utils/Utils.java @@ -7,6 +7,8 @@ import crypto.rules.TransitionEdge; import de.upb.docgen.ComposedRule; import de.upb.docgen.DocSettings; +import de.upb.docgen.Order; +import de.upb.docgen.crysl.CrySLReader; import java.io.*; import java.net.URL; @@ -145,8 +147,16 @@ public static Map>>> mapPredicates(Map 0) { +//Write the bytes to the output stream + resourceOS.write(byteArray, 0, i); + } +//Close streams to prevent errors + classIS.close(); + resourceOS.close(); + return f; + } catch (Exception e) { + System.out.println("Error during the file creation process from jar: " + e.getMessage()); + return null; + } + } + + } diff --git a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java index 9906ead..001c054 100644 --- a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java +++ b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java @@ -1,6 +1,7 @@ package de.upb.docgen.writer; import de.upb.docgen.*; +import de.upb.docgen.utils.FTLTemplateLoaderFromJar; import de.upb.docgen.utils.TemplateAbsolutePathLoader; import de.upb.docgen.utils.TreeNode; import de.upb.docgen.utils.Utils; @@ -32,8 +33,23 @@ public static void createSidebar(List composedRuleList, Configurat Map input = new HashMap(); input.put("title", "Sidebar"); input.put("rules", composedRuleList); - Path sidebarFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"sidebar.ftl"); - Template template = cfg.getTemplate(sidebarFilePath.toFile().getName()); + File sidebarFile; + String pathToFTLTemplatesFolder; + if (DocSettings.getInstance().getLangTemplatesPath() == null) { + pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); + String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); + //sidebarFile = Utils.extract(folderName + "/sidebar.ftl"); + sidebarFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("sidebar.ftl"); + } else { + pathToFTLTemplatesFolder = DocSettings.getInstance().getLangTemplatesPath(); + sidebarFile = new File(pathToFTLTemplatesFolder+"/sidebar.ftl"); + } + //Template template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "sidebar.ftl")); + System.out.println(sidebarFile.getAbsolutePath()); + Template template = cfg.getTemplate(sidebarFile.getName()); + + //Path sidebarFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"sidebar.ftl"); + //Template template = cfg.getTemplate(sidebarFilePath.toFile().getName()); // 2.3. Generate the output try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"navbar.html"))) { template.process(input, fileWriter); @@ -64,7 +80,7 @@ public static void createSinglePage(List composedRuleList, Configu input.put("ensures", rootEns); //ensures tree parsed by the template //necessary input for the template to load abslote path from crysl rule which can be displayed - input.put("pathToRules", Utils.pathForTemplates("file://"+DocSettings.getInstance().getRulesetPathDir())); + input.put("pathToRules", Utils.pathForTemplates("file://"+DocSettings.getInstance().getReportDirectory()+"/rules")); //Set flags input.put("booleanA", a); //To show StateMachineGraph input.put("booleanB", b); //To show Help Button @@ -74,8 +90,18 @@ public static void createSinglePage(List composedRuleList, Configu input.put("booleanF", f); // 2.2. Get the template - File templateFile = new File(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "singleclass.ftl"); - Template template = cfg.getTemplate(templateFile.getName()); + //File templateFile = new File(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "singleclass.ftl"); + File singleclassFile; + String pathToFTLTemplatesFolder; + if (DocSettings.getInstance().getFtlTemplatesPath() == null) { + pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); + String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); + singleclassFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("singleclass.ftl"); + } else { + pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); + singleclassFile = new File(pathToFTLTemplatesFolder+"/singleclass.ftl"); + } + Template template = cfg.getTemplate(singleclassFile.getName()); //create composedRules directory where single pages are stored new File(DocSettings.getInstance().getReportDirectory()+"/"+"composedRules/").mkdir(); @@ -108,8 +134,20 @@ public static void setupFreeMarker(Configuration cfg) { public static void createCogniCryptLayout(Configuration cfg) throws IOException, TemplateException { Map input = new HashMap(); - Path frontpageFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"frontpage.ftl"); - File frontpageFile = frontpageFilePath.toFile(); + File frontpageFile; + String pathToFTLTemplatesFolder; + if (DocSettings.getInstance().getFtlTemplatesPath() == null) { + pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); + String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); + frontpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar( "frontpage.ftl"); + } else { + pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); + frontpageFile = new File(pathToFTLTemplatesFolder+"/frontpage.ftl"); + } + + //Path frontpageFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"frontpage.ftl"); + //Path frontpageFilePath = frontpageFile.toPath(); + //File frontpage = frontpageFilePath.toFile(); File templateDir = frontpageFile.getParentFile(); if ( null == templateDir ){ templateDir = new File("./"); @@ -119,9 +157,16 @@ public static void createCogniCryptLayout(Configuration cfg) throws IOException, try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"frontpage.html"))) { frontpageTemplate.process(input, fileWriter); } - - Path rootpageFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"rootpage.ftl"); - Template rootpageTemplate = cfg.getTemplate(rootpageFilePath.toFile().getName()); + File rootpageFile; + if (DocSettings.getInstance().getFtlTemplatesPath() == null) { + pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); + String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); + rootpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("rootpage.ftl"); + } else { + pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); + rootpageFile = new File(pathToFTLTemplatesFolder+"/rootpage.ftl"); + } + Template rootpageTemplate = cfg.getTemplate(rootpageFile.getName()); try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"rootpage.html"))) { rootpageTemplate.process(input, fileWriter); } diff --git a/src/main/resources/FTLTemplates/singleclass.ftl b/src/main/resources/FTLTemplates/singleclass.ftl index 1b8f1fa..97cf52d 100644 --- a/src/main/resources/FTLTemplates/singleclass.ftl +++ b/src/main/resources/FTLTemplates/singleclass.ftl @@ -414,7 +414,7 @@

The CrySL rule on Github.

- From 0b2387fafe736336a7434fc3a560ecba2e36cd9b Mon Sep 17 00:00:00 2001 From: svenfeld Date: Wed, 19 Oct 2022 18:22:45 +0200 Subject: [PATCH 05/11] Cleanup --- .../java/de/upb/docgen/ClassEventForb.java | 10 +++---- .../upb/docgen/ConstraintCrySLInstanceof.java | 10 +++---- .../java/de/upb/docgen/ConstraintCrySLVC.java | 10 +++---- .../upb/docgen/ConstraintCrySLandencmode.java | 16 +++++------ .../upb/docgen/ConstraintCryslnocallto.java | 10 +++---- .../de/upb/docgen/ConstraintsComparison.java | 12 ++++---- .../java/de/upb/docgen/ConstraintsPred.java | 6 ++-- .../java/de/upb/docgen/ConstraintsVc.java | 6 ++-- .../de/upb/docgen/DocumentGeneratorMain.java | 6 ++-- src/main/java/de/upb/docgen/Ensures.java | 6 ++-- .../java/de/upb/docgen/EnsuresCaseTwo.java | 14 +++++----- src/main/java/de/upb/docgen/Negates.java | 4 +-- src/main/java/de/upb/docgen/Order.java | 12 ++++---- .../java/de/upb/docgen/crysl/CrySLReader.java | 7 +---- .../graphviz/StateMachineToGraphviz.java | 12 ++++---- .../utils/FTLTemplateLoaderFromJar.java | 15 ++-------- .../java/de/upb/docgen/utils/TreeNode.java | 2 +- src/main/java/de/upb/docgen/utils/Utils.java | 13 +-------- .../upb/docgen/writer/FreeMarkerWriter.java | 28 +------------------ .../resources/FTLTemplates/singleclass.ftl | 2 +- 20 files changed, 73 insertions(+), 128 deletions(-) diff --git a/src/main/java/de/upb/docgen/ClassEventForb.java b/src/main/java/de/upb/docgen/ClassEventForb.java index 4e8e8c4..3b72ddd 100644 --- a/src/main/java/de/upb/docgen/ClassEventForb.java +++ b/src/main/java/de/upb/docgen/ClassEventForb.java @@ -116,7 +116,7 @@ public String getFullClassName(CrySLRule rule) throws IOException { */ - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -153,7 +153,7 @@ public String getEventNumbers(CrySLRule rule) throws IOException { } reader.close(); */ - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); @@ -268,7 +268,7 @@ private String resolveMethod(CrySLMethod forMethod) { while(entryIterator.hasNext()) { Entry par = (Entry)entryIterator.next(); - sb.append((String)par.getValue()); + sb.append(par.getValue()); if (entryIterator.hasNext()) { sb.append(", "); } @@ -302,7 +302,7 @@ public List getForbiddenMethods(CrySLRule rule) throws IOException { reader.close(); readerCon.close(); */ - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -347,7 +347,7 @@ public List getForbiddenMethods(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!forbMap.containsKey(extractParamStr)) { } else { - String value = forbMap.get(extractParamStr).toString(); + String value = forbMap.get(extractParamStr); fStr = fStr.replace(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/ConstraintCrySLInstanceof.java b/src/main/java/de/upb/docgen/ConstraintCrySLInstanceof.java index 26d8e9d..0b0bd57 100644 --- a/src/main/java/de/upb/docgen/ConstraintCrySLInstanceof.java +++ b/src/main/java/de/upb/docgen/ConstraintCrySLInstanceof.java @@ -70,7 +70,7 @@ private static String getTemplateinstanceofRHS() throws IOException { public ArrayList getInstanceof(CrySLRule rule) throws IOException { ArrayList composedInstaceOf = new ArrayList<>(); - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); /* String classnamecheck = strArray.get((strArray.size()) - 1); @@ -79,7 +79,7 @@ public ArrayList getInstanceof(CrySLRule rule) throws IOException { */ List constraintConList = rule.getConstraints().stream() - .filter(e -> e.getClass().getSimpleName().toString().contains("CrySLConstraint")) + .filter(e -> e.getClass().getSimpleName().contains("CrySLConstraint")) .collect(Collectors.toList()); if (constraintConList.size() > 0) { @@ -153,7 +153,7 @@ public ArrayList getInstanceof(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -237,7 +237,7 @@ public ArrayList getInstanceof(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -311,7 +311,7 @@ public ArrayList getInstanceof(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/ConstraintCrySLVC.java b/src/main/java/de/upb/docgen/ConstraintCrySLVC.java index 44a7397..887ef82 100644 --- a/src/main/java/de/upb/docgen/ConstraintCrySLVC.java +++ b/src/main/java/de/upb/docgen/ConstraintCrySLVC.java @@ -69,7 +69,7 @@ private static String getTemplateVCRHS() throws IOException { public ArrayList getConCryslVC(CrySLRule rule) throws IOException { ArrayList composedConsraintsValueConstraints = new ArrayList<>(); - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -78,7 +78,7 @@ public ArrayList getConCryslVC(CrySLRule rule) throws IOException { */ List constraintConList = rule.getConstraints().stream() - .filter(e -> e.getClass().getSimpleName().toString().contains("CrySLConstraint") + .filter(e -> e.getClass().getSimpleName().contains("CrySLConstraint") && !e.toString().contains("enc")) .collect(Collectors.toList()); @@ -151,7 +151,7 @@ public ArrayList getConCryslVC(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -230,7 +230,7 @@ public ArrayList getConCryslVC(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -306,7 +306,7 @@ public ArrayList getConCryslVC(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/ConstraintCrySLandencmode.java b/src/main/java/de/upb/docgen/ConstraintCrySLandencmode.java index 3d70588..3993b28 100644 --- a/src/main/java/de/upb/docgen/ConstraintCrySLandencmode.java +++ b/src/main/java/de/upb/docgen/ConstraintCrySLandencmode.java @@ -131,7 +131,7 @@ private static Map getwordMap(CrySLRule rule) { public ArrayList getConCryslandenc(CrySLRule rule) throws IOException { ArrayList composedConAndEnc = new ArrayList<>(); - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -141,7 +141,7 @@ public ArrayList getConCryslandenc(CrySLRule rule) throws IOException { */ List constraintConencmodeList = rule.getConstraints().stream() - .filter(e -> e.getClass().getSimpleName().toString().contains("CrySLConstraint") + .filter(e -> e.getClass().getSimpleName().contains("CrySLConstraint") && e.toString().contains("andencmode")) .collect(Collectors.toList()); @@ -217,7 +217,7 @@ public ArrayList getConCryslandenc(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -302,7 +302,7 @@ public ArrayList getConCryslandenc(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -372,7 +372,7 @@ else if (resLHSlistsecond.contains("=")) { for (String RHSStr : RHSList) { if (RHSStr.startsWith("noCall")) { - List NCList = Arrays.asList(RHSStr.split(",")); + String[] NCList = RHSStr.split(","); String nocall = ""; String finalnocallstring = ""; @@ -404,7 +404,7 @@ else if (resLHSlistsecond.contains("=")) { } for (String extractParamStr : extractParamList) { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); tempStr = tempStr.replace(extractParamStr, value); } fList.add(tempStr.replaceAll("\\[", "").replaceAll("\\]", "")); @@ -423,7 +423,7 @@ else if (resLHSlistsecond.contains("=")) { } else if (RHSStr.startsWith("call")) { - List CList = Arrays.asList(RHSStr.split(",")); + String[] CList = RHSStr.split(","); String call = ""; String finalcallstring = ""; @@ -456,7 +456,7 @@ else if (resLHSlistsecond.contains("=")) { for (String extractParamStr : extractParamList) { if (!extractParamStr.isEmpty()) { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); tempStr = tempStr.replace(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/ConstraintCryslnocallto.java b/src/main/java/de/upb/docgen/ConstraintCryslnocallto.java index b0fe31c..5bef14f 100644 --- a/src/main/java/de/upb/docgen/ConstraintCryslnocallto.java +++ b/src/main/java/de/upb/docgen/ConstraintCryslnocallto.java @@ -53,7 +53,7 @@ private static char[] getTemplatenocallto() throws IOException { public ArrayList getnoCalltoConstraint(CrySLRule rule) throws IOException { ArrayList composedNocallToConstraints = new ArrayList<>(); - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -62,7 +62,7 @@ public ArrayList getnoCalltoConstraint(CrySLRule rule) throws IOExceptio */ List constraintConList = rule.getConstraints().stream() - .filter(e -> e.getClass().getSimpleName().toString().contains("CrySLConstraint")) + .filter(e -> e.getClass().getSimpleName().contains("CrySLConstraint")) .collect(Collectors.toList()); if (constraintConList.size() > 0) { @@ -79,7 +79,7 @@ public ArrayList getnoCalltoConstraint(CrySLRule rule) throws IOExceptio if (conCryslStr.contains("implies")) { List impSplitList = Arrays.asList(conCryslStr.split("implies")); - List LHSList = Arrays.asList(impSplitList.get(0).split(",")); + String[] LHSList = impSplitList.get(0).split(","); List RHSList = Arrays.asList(impSplitList.get(1)); List methods = FunctionUtils.getEventNames(rule); Map posInWordsMap = FunctionUtils.getPosWordMap(rule); @@ -118,7 +118,7 @@ public ArrayList getnoCalltoConstraint(CrySLRule rule) throws IOExceptio } for (String extractParamStr : extractParamList) { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); tempStr = tempStr.replace(extractParamStr, value); } fLHSList.add(tempStr.replaceAll("\\[", "").replaceAll("\\]", "")); @@ -173,7 +173,7 @@ public ArrayList getnoCalltoConstraint(CrySLRule rule) throws IOExceptio for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/ConstraintsComparison.java b/src/main/java/de/upb/docgen/ConstraintsComparison.java index b502753..d1ffa59 100644 --- a/src/main/java/de/upb/docgen/ConstraintsComparison.java +++ b/src/main/java/de/upb/docgen/ConstraintsComparison.java @@ -184,7 +184,7 @@ private static char[] getTemplateCompCons2() throws IOException { public ArrayList getConstriantsComp(CrySLRule rule) throws IOException { ArrayList composedComparsionConstraint = new ArrayList<>(); List constraintCompConList = rule.getConstraints().stream() - .filter(e -> e.getClass().getSimpleName().toString().contains("CrySLComparisonConstraint")) + .filter(e -> e.getClass().getSimpleName().contains("CrySLComparisonConstraint")) .collect(Collectors.toList()); List> dataTypes = rule.getObjects(); Map DTMap = new LinkedHashMap<>(); @@ -193,7 +193,7 @@ public ArrayList getConstriantsComp(CrySLRule rule) throws IOException { DTMap.put(dt.getValue(), FunctionUtils.getDataType(rule, dt.getValue())); } - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -228,7 +228,7 @@ public ArrayList getConstriantsComp(CrySLRule rule) throws IOException { for (String methodStr : methods) { String result = StringUtils.substringBetween(methodStr, "(", ")"); - List resList = Arrays.asList(result.split(",")); + String[] resList = result.split(","); for (String r : resList) { @@ -253,7 +253,7 @@ public ArrayList getConstriantsComp(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replaceFirst(extractParamStr, value); } } @@ -529,7 +529,7 @@ public ArrayList getConstriantsComp(CrySLRule rule) throws IOException { for (String methodStr : methods) { String result = StringUtils.substringBetween(methodStr, "(", ")"); - List resList = Arrays.asList(result.split(",")); // params + String[] resList = result.split(","); // params for (String r : resList) { @@ -563,7 +563,7 @@ public ArrayList getConstriantsComp(CrySLRule rule) throws IOException { } else { int startInd = 0; int endInd = 0; - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); Pattern word = Pattern.compile(extractParamStr); Matcher match = word.matcher(m); diff --git a/src/main/java/de/upb/docgen/ConstraintsPred.java b/src/main/java/de/upb/docgen/ConstraintsPred.java index 545374c..5e1ad7a 100644 --- a/src/main/java/de/upb/docgen/ConstraintsPred.java +++ b/src/main/java/de/upb/docgen/ConstraintsPred.java @@ -170,7 +170,7 @@ public ArrayList getConstraintsPred(CrySLRule rule, Set ensuresF DTMap.put(dt.getValue(), FunctionUtils.getDataType(rule, dt.getValue())); } - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -180,7 +180,7 @@ public ArrayList getConstraintsPred(CrySLRule rule, Set ensuresF */ List constraintPredList = rule.getConstraints().stream().filter( - e -> e.getClass().getSimpleName().toString().contains("CrySLPredicate") && !e.toString().contains("!")) + e -> e.getClass().getSimpleName().contains("CrySLPredicate") && !e.toString().contains("!")) .collect(Collectors.toList()); if (constraintPredList.size() > 0) { @@ -243,7 +243,7 @@ public ArrayList getConstraintsPred(CrySLRule rule, Set ensuresF for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replace(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/ConstraintsVc.java b/src/main/java/de/upb/docgen/ConstraintsVc.java index 0f176c2..99273ba 100644 --- a/src/main/java/de/upb/docgen/ConstraintsVc.java +++ b/src/main/java/de/upb/docgen/ConstraintsVc.java @@ -81,7 +81,7 @@ public ArrayList getConstraintsVc(CrySLRule rule) throws IOException { DTMap.put(dt.getValue(), FunctionUtils.getDataType(rule, dt.getValue())); } - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -94,7 +94,7 @@ public ArrayList getConstraintsVc(CrySLRule rule) throws IOException { String paraPosInWordValStr = null; List constraintVCList = rule.getConstraints().stream() - .filter(e -> e.getClass().getSimpleName().toString().contains("CrySLValueConstraint")) + .filter(e -> e.getClass().getSimpleName().contains("CrySLValueConstraint")) .collect(Collectors.toList()); if (constraintVCList.size() > 0) { @@ -147,7 +147,7 @@ public ArrayList getConstraintsVc(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!DTMap.containsKey(extractParamStr)) { } else { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); m = m.replace(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/DocumentGeneratorMain.java b/src/main/java/de/upb/docgen/DocumentGeneratorMain.java index fd34178..86d36f2 100644 --- a/src/main/java/de/upb/docgen/DocumentGeneratorMain.java +++ b/src/main/java/de/upb/docgen/DocumentGeneratorMain.java @@ -11,12 +11,10 @@ import de.upb.docgen.crysl.CrySLReader; import de.upb.docgen.graphviz.StateMachineToGraphviz; import de.upb.docgen.utils.PredicateTreeGenerator; -import de.upb.docgen.utils.TemplateAbsolutePathLoader; import de.upb.docgen.utils.TreeNode; import de.upb.docgen.utils.Utils; import de.upb.docgen.writer.FreeMarkerWriter; import freemarker.template.*; -import org.apache.commons.io.FileUtils; /** * @author Ritika Singh @@ -34,7 +32,7 @@ public static void main(String[] args) throws IOException, TemplateException { docSettings.parseSettingsFromCLI(args); //read CryslRules from absolutePath provided by the user if (docSettings.getRulesetPathDir() != null) { - rules = CrySLReader.readRulesFromSourceFiles(docSettings.getRulesetPathDir()); + rules = CrySLReader.readCrySLRuleFromSourceFiles(docSettings.getRulesetPathDir()); //Generate dot files from given ruleset if(docSettings.isBooleanE()) { System.out.println("Generating the statemachine files from " + docSettings.getRulesetPathDir() + "."); @@ -152,7 +150,7 @@ public static void main(String[] args) throws IOException, TemplateException { if (DocSettings.getInstance().getFtlTemplatesPath() == null) { rulesDist = CrySLReader.readRulesFromJar(); } else { - rulesDist = CrySLReader.readRulesFromSourceFiles(docSettings.getRulesetPathDir()); + rulesDist = CrySLReader.readCrySLRuleFromSourceFiles(docSettings.getRulesetPathDir()); } for (File f : rulesDist.keySet()) { Files.copy(f.toPath(), Paths.get(docSettings.getReportDirectory() , "rules", f.getName()), StandardCopyOption.REPLACE_EXISTING); diff --git a/src/main/java/de/upb/docgen/Ensures.java b/src/main/java/de/upb/docgen/Ensures.java index 3358151..d3b74c3 100644 --- a/src/main/java/de/upb/docgen/Ensures.java +++ b/src/main/java/de/upb/docgen/Ensures.java @@ -116,7 +116,7 @@ public ArrayList getEnsuresThis(CrySLRule rule, Map strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -135,7 +135,7 @@ public ArrayList getEnsuresThis(CrySLRule rule, Map verbOrNounList = Arrays.asList(str.split("\\s")); String verb; @@ -177,7 +177,7 @@ public ArrayList getEnsuresThis(CrySLRule rule, Map getEnsures(CrySLRule rule, Map>>> stringListMap) throws IOException { ArrayList composedEnsures = new ArrayList<>(); - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -247,7 +247,7 @@ public ArrayList getEnsures(CrySLRule rule, Map verbOrNounList = Arrays.asList(str.split("\\s")); String verb; @@ -294,7 +294,7 @@ public ArrayList getEnsures(CrySLRule rule, Map getEnsures(CrySLRule rule, Map resList = Arrays.asList(result.split(",")); + String[] resList = result.split(","); for (String rl : resList) { if (rl.equals(paramStr)) { @@ -425,7 +425,7 @@ public ArrayList getEnsures(CrySLRule rule, Map getEnsures(CrySLRule rule, Map verbOrNounList = Arrays.asList(str.split("\\s")); String verb; @@ -506,7 +506,7 @@ public ArrayList getEnsures(CrySLRule rule, Map getNegates(CrySLRule rule) throws IOException { ArrayList composedNegates = new ArrayList<>(); - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); String classnamecheck = strArray.get((strArray.size()) - 1); /* @@ -115,7 +115,7 @@ public ArrayList getNegates(CrySLRule rule) throws IOException { for (String extractParamStr : extractParamList) { if (!extractParamStr.isEmpty()) { - String value = DTMap.get(extractParamStr).toString(); + String value = DTMap.get(extractParamStr); tempStr = tempStr.replace(extractParamStr, value); } } diff --git a/src/main/java/de/upb/docgen/Order.java b/src/main/java/de/upb/docgen/Order.java index db5c6de..7f11abe 100644 --- a/src/main/java/de/upb/docgen/Order.java +++ b/src/main/java/de/upb/docgen/Order.java @@ -55,7 +55,7 @@ private static List getCryslFiles(String folderPath) throws IOException { } private static List getCryslFiles() throws IOException { - Map rules = CrySLReader.readRulesFromSourceFiles(DocSettings.getInstance().getRulesetPathDir()); + Map rules = CrySLReader.readCrySLRuleFromSourceFiles(DocSettings.getInstance().getRulesetPathDir()); return new ArrayList<>(rules.keySet()); } @@ -219,7 +219,7 @@ private static List processEvents(List lines) { if (!objectMap.containsKey(extractParamList.get(y))) { } else { - dataTypevalue = objectMap.get(extractParamList.get(y)).toString(); + dataTypevalue = objectMap.get(extractParamList.get(y)); Pattern word = Pattern.compile(extractParamList.get(y)); Matcher match = word.matcher(methodLabelStr); @@ -240,7 +240,7 @@ private static List processEvents(List lines) { if (!objectMap.containsKey(extractParamList.get(y))) { } else { - dataTypevalue = objectMap.get(extractParamList.get(y)).toString(); + dataTypevalue = objectMap.get(extractParamList.get(y)); Pattern word = Pattern.compile(extractParamList.get(y)); Matcher match = word.matcher(methodLabelStr); @@ -303,7 +303,7 @@ private static List processEvents(List lines) { if (!objectMap.containsKey(extractParamList.get(y))) { } else { - dataTypevalue = objectMap.get(extractParamList.get(y)).toString(); + dataTypevalue = objectMap.get(extractParamList.get(y)); Pattern word = Pattern.compile(extractParamList.get(y)); Matcher match = word.matcher(methodLabelStr); @@ -324,7 +324,7 @@ private static List processEvents(List lines) { if (!objectMap.containsKey(extractParamList.get(y))) { } else { - dataTypevalue = objectMap.get(extractParamList.get(y)).toString(); + dataTypevalue = objectMap.get(extractParamList.get(y)); Pattern word = Pattern.compile(extractParamList.get(y)); Matcher match = word.matcher(methodLabelStr); @@ -365,7 +365,7 @@ private static void getProcessedMap(List eventList) { } public List runOrder(CrySLRule rule, File file) throws IOException { - String cname = new String(rule.getClassName().replace(".", ",")); + String cname = rule.getClassName().replace(".", ","); List strArray = Arrays.asList(cname.split(",")); //List fileNames = getCryslFiles(FOLDER_PATH); diff --git a/src/main/java/de/upb/docgen/crysl/CrySLReader.java b/src/main/java/de/upb/docgen/crysl/CrySLReader.java index 68310d7..cd42727 100644 --- a/src/main/java/de/upb/docgen/crysl/CrySLReader.java +++ b/src/main/java/de/upb/docgen/crysl/CrySLReader.java @@ -23,16 +23,12 @@ public class CrySLReader { - public static List readRulesFromSourceFilesWithoutFiles(final String folderPath) { - return new ArrayList<>(readRulesFromSourceFiles(folderPath).values()); - } - public static Map readRulesFromSourceFiles(final String folderPath) { + public static Map readCrySLRuleFromSourceFiles(String folderPath) { File f = null; try { CrySLModelReader cryslmodelreader = new CrySLModelReader(); - Map rules = new HashMap<>(); File[] files = new File(folderPath).listFiles(); for (File file : files) { @@ -41,7 +37,6 @@ public static Map readRulesFromSourceFiles(final String folderP rules.put(file, cryslmodelreader.readRule(file)); } } - // System.out.println(rules); return rules; } catch (MalformedURLException e) { diff --git a/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java b/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java index 21e702e..19e1ff0 100644 --- a/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java +++ b/src/main/java/de/upb/docgen/graphviz/StateMachineToGraphviz.java @@ -12,7 +12,6 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Iterator; @@ -28,7 +27,7 @@ public class StateMachineToGraphviz { //To run this process on his own not used in the actual generation process public static void main(String[] args) throws IOException { - Map rules = CrySLReader.readRulesFromSourceFiles(Constant.rulePath); + Map rules = CrySLReader.readCrySLRuleFromSourceFiles(Constant.rulePath); for (Map.Entry ruleEntry : rules.entrySet()) { rulesOrderSectionToDot(ruleEntry.getValue()); toPNG(ruleEntry.getValue().getClassName()); @@ -36,7 +35,7 @@ public static void main(String[] args) throws IOException { } //Runs the translation and generation of PNG for every rule public static void generateGraphvizStateMachines(String pathToCryslRules, String pathToRootpage) throws IOException { - Map rules = CrySLReader.readRulesFromSourceFiles(pathToCryslRules); + Map rules = CrySLReader.readCrySLRuleFromSourceFiles(pathToCryslRules); new File(pathToRootpage + "/" + "dotFSMs/").mkdir(); for (Map.Entry ruleEntry : rules.entrySet()) { rulesOrderSectionToDot(ruleEntry.getValue(), pathToRootpage); @@ -93,7 +92,7 @@ public static String toGraphviz(StateMachineGraph smg) { else acceptingStates.append(" ").append(node.getName()); } } - stringBuilderToFile.append(acceptingStates.toString()).append(";\n"); + stringBuilderToFile.append(acceptingStates).append(";\n"); stringBuilderToFile.append(States); for (TransitionEdge edge : edges) { @@ -121,7 +120,7 @@ public static String toGraphviz(StateMachineGraph smg) { private static String getShortName(CrySLMethod label) { StringBuilder stmntBuilder = new StringBuilder(); - String returnValue = (String)label.getRetObject().getKey(); + String returnValue = label.getRetObject().getKey(); if (!"_".equals(returnValue)) { stmntBuilder.append(returnValue); stmntBuilder.append(" = "); @@ -133,7 +132,7 @@ private static String getShortName(CrySLMethod label) { while(paramIter.hasNext()) { Map.Entry par = (Map.Entry)paramIter.next(); - stmntBuilder.append((String)par.getKey()); + stmntBuilder.append(par.getKey()); if (paramIter.hasNext()) stmntBuilder.append(", "); } @@ -141,6 +140,7 @@ private static String getShortName(CrySLMethod label) { return stmntBuilder.toString(); } + //For running this class alone. PNGs are created in the current directory. public static void toPNG(String name) { try { Path dot = Paths.get("dotFSMs", name + ".dot"); diff --git a/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java b/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java index 3050d13..c8c0d4d 100644 --- a/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java +++ b/src/main/java/de/upb/docgen/utils/FTLTemplateLoaderFromJar.java @@ -4,24 +4,13 @@ import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; + public class FTLTemplateLoaderFromJar { public static File readFtlTemplateFromJar(String templateName) throws IOException { String pathToLangTemplates = Order.class.getResource("/FTLTemplates").getPath(); - File template; String folderName = pathToLangTemplates.substring(pathToLangTemplates.lastIndexOf("/") + 1); - template = Utils.extract(folderName + "/" + templateName); + File template = Utils.extract(folderName + "/" + templateName); return template; - /* - String shortend = template.getName().substring(0,template.getName().indexOf("ftl")+"ftl".length()); //CrySL Rule name without temp file ending - Files.move(template.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); - File renamedTempFile = (Paths.get(shortend).toFile()); - renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished - return renamedTempFile; - -*/ } } diff --git a/src/main/java/de/upb/docgen/utils/TreeNode.java b/src/main/java/de/upb/docgen/utils/TreeNode.java index 6dfef39..3b57943 100644 --- a/src/main/java/de/upb/docgen/utils/TreeNode.java +++ b/src/main/java/de/upb/docgen/utils/TreeNode.java @@ -8,7 +8,7 @@ public class TreeNode{ private T data = null; - private List children = new ArrayList<>(); + private final List children = new ArrayList<>(); private TreeNode parent = null; public TreeNode(T data) { diff --git a/src/main/java/de/upb/docgen/utils/Utils.java b/src/main/java/de/upb/docgen/utils/Utils.java index 8f9087e..1db3648 100644 --- a/src/main/java/de/upb/docgen/utils/Utils.java +++ b/src/main/java/de/upb/docgen/utils/Utils.java @@ -22,14 +22,7 @@ */ public class Utils { - public static File getFileFromResources(String fileName) { - URL resource = Utils.class.getResource(fileName); - if (resource == null) { - throw new IllegalArgumentException("File could not be found!"); - } else { - return new File(resource.getFile()); - } - } + public static String replaceLast(String string, String toReplace, String replacement) { int pos = string.lastIndexOf(toReplace); @@ -191,10 +184,6 @@ public static String getTemplatesTextString(String templateName) throws IOExcept return strD + "\n"; } - public static String pathForTemplates(String path) { - return path.replaceAll("\\\\","/"); - } - public static File extract(String filePath) { diff --git a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java index 001c054..79a75b7 100644 --- a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java +++ b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java @@ -36,21 +36,12 @@ public static void createSidebar(List composedRuleList, Configurat File sidebarFile; String pathToFTLTemplatesFolder; if (DocSettings.getInstance().getLangTemplatesPath() == null) { - pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); - String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); - //sidebarFile = Utils.extract(folderName + "/sidebar.ftl"); sidebarFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("sidebar.ftl"); } else { pathToFTLTemplatesFolder = DocSettings.getInstance().getLangTemplatesPath(); sidebarFile = new File(pathToFTLTemplatesFolder+"/sidebar.ftl"); } - //Template template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "sidebar.ftl")); - System.out.println(sidebarFile.getAbsolutePath()); Template template = cfg.getTemplate(sidebarFile.getName()); - - //Path sidebarFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"sidebar.ftl"); - //Template template = cfg.getTemplate(sidebarFilePath.toFile().getName()); - // 2.3. Generate the output try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"navbar.html"))) { template.process(input, fileWriter); } @@ -78,9 +69,6 @@ public static void createSinglePage(List composedRuleList, Configu input.put("requires", rootReq); //requires tree parsed by the template TreeNode rootEns = ensToReq.get(rule.getComposedClassName()); input.put("ensures", rootEns); //ensures tree parsed by the template - - //necessary input for the template to load abslote path from crysl rule which can be displayed - input.put("pathToRules", Utils.pathForTemplates("file://"+DocSettings.getInstance().getReportDirectory()+"/rules")); //Set flags input.put("booleanA", a); //To show StateMachineGraph input.put("booleanB", b); //To show Help Button @@ -89,13 +77,9 @@ public static void createSinglePage(List composedRuleList, Configu input.put("booleanE", e); input.put("booleanF", f); - // 2.2. Get the template - //File templateFile = new File(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "singleclass.ftl"); File singleclassFile; String pathToFTLTemplatesFolder; if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); - String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); singleclassFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("singleclass.ftl"); } else { pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); @@ -117,9 +101,7 @@ public static void createSinglePage(List composedRuleList, Configu * @param cfg */ public static void setupFreeMarker(Configuration cfg) { - // setup freemarker to load absolute paths - //cfg.setTemplateLoader(new TemplateAbsolutePathLoader()); - // Some other recommended settings: + // Recommended settings: cfg.setDefaultEncoding("UTF-8"); cfg.setLocale(Locale.ENGLISH); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); @@ -137,17 +119,11 @@ public static void createCogniCryptLayout(Configuration cfg) throws IOException, File frontpageFile; String pathToFTLTemplatesFolder; if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); - String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); frontpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar( "frontpage.ftl"); } else { pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); frontpageFile = new File(pathToFTLTemplatesFolder+"/frontpage.ftl"); } - - //Path frontpageFilePath = Paths.get(DocSettings.getInstance().getFtlTemplatesPath(),"frontpage.ftl"); - //Path frontpageFilePath = frontpageFile.toPath(); - //File frontpage = frontpageFilePath.toFile(); File templateDir = frontpageFile.getParentFile(); if ( null == templateDir ){ templateDir = new File("./"); @@ -159,8 +135,6 @@ public static void createCogniCryptLayout(Configuration cfg) throws IOException, } File rootpageFile; if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - pathToFTLTemplatesFolder = Order.class.getResource("/FTLTemplates").getPath(); - String folderName = pathToFTLTemplatesFolder.substring(pathToFTLTemplatesFolder.lastIndexOf("/") + 1); rootpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("rootpage.ftl"); } else { pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); diff --git a/src/main/resources/FTLTemplates/singleclass.ftl b/src/main/resources/FTLTemplates/singleclass.ftl index 97cf52d..0d82e9e 100644 --- a/src/main/resources/FTLTemplates/singleclass.ftl +++ b/src/main/resources/FTLTemplates/singleclass.ftl @@ -415,7 +415,7 @@ href=https://github.com/CROSSINGTUD/Crypto-API-Rules/blob/master/JavaCryptographicArchitecture/src/${rule.onlyRuleName}.crysl>Github.

From f6203010aec6a57b2ac690c52c6d629bfe62b746 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Wed, 19 Oct 2022 18:40:40 +0200 Subject: [PATCH 06/11] Refactor --- .../upb/docgen/writer/FreeMarkerWriter.java | 56 +++++++------------ 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java index 79a75b7..08c6c41 100644 --- a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java +++ b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java @@ -33,18 +33,9 @@ public static void createSidebar(List composedRuleList, Configurat Map input = new HashMap(); input.put("title", "Sidebar"); input.put("rules", composedRuleList); - File sidebarFile; - String pathToFTLTemplatesFolder; - if (DocSettings.getInstance().getLangTemplatesPath() == null) { - sidebarFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("sidebar.ftl"); - } else { - pathToFTLTemplatesFolder = DocSettings.getInstance().getLangTemplatesPath(); - sidebarFile = new File(pathToFTLTemplatesFolder+"/sidebar.ftl"); - } + File sidebarFile = getTemplateFile("sidebar.ftl"); Template template = cfg.getTemplate(sidebarFile.getName()); - try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"navbar.html"))) { - template.process(input, fileWriter); - } + processTemplate(input, template, "navbar.html"); } /** @@ -77,14 +68,7 @@ public static void createSinglePage(List composedRuleList, Configu input.put("booleanE", e); input.put("booleanF", f); - File singleclassFile; - String pathToFTLTemplatesFolder; - if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - singleclassFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("singleclass.ftl"); - } else { - pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); - singleclassFile = new File(pathToFTLTemplatesFolder+"/singleclass.ftl"); - } + File singleclassFile = getTemplateFile("singleclass.ftl"); Template template = cfg.getTemplate(singleclassFile.getName()); //create composedRules directory where single pages are stored @@ -117,33 +101,35 @@ public static void createCogniCryptLayout(Configuration cfg) throws IOException, Map input = new HashMap(); File frontpageFile; - String pathToFTLTemplatesFolder; - if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - frontpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar( "frontpage.ftl"); - } else { - pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); - frontpageFile = new File(pathToFTLTemplatesFolder+"/frontpage.ftl"); - } + frontpageFile = getTemplateFile("frontpage.ftl"); File templateDir = frontpageFile.getParentFile(); if ( null == templateDir ){ templateDir = new File("./"); } cfg.setDirectoryForTemplateLoading(templateDir); Template frontpageTemplate = cfg.getTemplate(frontpageFile.getName()); - try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"frontpage.html"))) { - frontpageTemplate.process(input, fileWriter); + processTemplate(input, frontpageTemplate, "frontpage.html"); + File rootpageFile = getTemplateFile("rootpage.ftl"); + Template rootpageTemplate = cfg.getTemplate(rootpageFile.getName()); + processTemplate(input, rootpageTemplate, "rootpage.html"); + } + + private static void processTemplate(Map input, Template rootpageTemplate, String htmlName) throws IOException, TemplateException { + try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+ htmlName))) { + rootpageTemplate.process(input, fileWriter); } - File rootpageFile; + } + + private static File getTemplateFile(String templateName) throws IOException { + File frontpageFile; + String pathToFTLTemplatesFolder; if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - rootpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar("rootpage.ftl"); + frontpageFile = FTLTemplateLoaderFromJar.readFtlTemplateFromJar( templateName); } else { pathToFTLTemplatesFolder = DocSettings.getInstance().getFtlTemplatesPath(); - rootpageFile = new File(pathToFTLTemplatesFolder+"/rootpage.ftl"); - } - Template rootpageTemplate = cfg.getTemplate(rootpageFile.getName()); - try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"rootpage.html"))) { - rootpageTemplate.process(input, fileWriter); + frontpageFile = new File(pathToFTLTemplatesFolder + "/" + templateName); } + return frontpageFile; } } From aa521091581df09f9c2855fa9b64609f7419d2c9 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Fri, 19 Jul 2024 11:07:16 +0200 Subject: [PATCH 07/11] default resource loading for java11 --- src/main/java/de/upb/docgen/DocSettings.java | 8 +- .../de/upb/docgen/DocumentGeneratorMain.java | 100 +++++---- src/main/java/de/upb/docgen/Order.java | 38 +++- .../java/de/upb/docgen/crysl/CrySLReader.java | 192 +++++++++++++++--- src/main/java/de/upb/docgen/utils/Utils.java | 17 +- .../upb/docgen/writer/FreeMarkerWriter.java | 62 ++++-- 6 files changed, 316 insertions(+), 101 deletions(-) diff --git a/src/main/java/de/upb/docgen/DocSettings.java b/src/main/java/de/upb/docgen/DocSettings.java index 959484f..f2bdf79 100644 --- a/src/main/java/de/upb/docgen/DocSettings.java +++ b/src/main/java/de/upb/docgen/DocSettings.java @@ -118,7 +118,7 @@ public void parseSettingsFromCLI(String[] settings) { case "--rulesdir": setRulesetPathDir(settings[i + 1]); i++; - mandatorySettings++; + // mandatorySettings++; break; case "--reportpath": setReportDirectory(settings[i + 1]); @@ -128,12 +128,12 @@ public void parseSettingsFromCLI(String[] settings) { case "--ftltemplatespath": setFTLTemplatesPath(settings[i + 1]); i++; - mandatorySettings++; + // mandatorySettings++; break; case "--langtemplatespath": setLangTemplatesPath(settings[i + 1]); i++; - mandatorySettings++; + // mandatorySettings++; break; case "--booleana": setBooleanA(false); @@ -161,7 +161,7 @@ public void parseSettingsFromCLI(String[] settings) { System.exit(255); } } - if (mandatorySettings != 4) { + if (mandatorySettings != 1) { showErrorMessage(); System.exit(255); } diff --git a/src/main/java/de/upb/docgen/DocumentGeneratorMain.java b/src/main/java/de/upb/docgen/DocumentGeneratorMain.java index 0dde0b3..1fe12b6 100644 --- a/src/main/java/de/upb/docgen/DocumentGeneratorMain.java +++ b/src/main/java/de/upb/docgen/DocumentGeneratorMain.java @@ -1,22 +1,24 @@ package de.upb.docgen; -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.*; - import crypto.exceptions.CryptoAnalysisException; import crypto.rules.CrySLPredicate; import crypto.rules.CrySLRule; import crypto.rules.CrySLRuleReader; +import de.upb.docgen.crysl.CrySLReader; import de.upb.docgen.utils.PredicateTreeGenerator; import de.upb.docgen.utils.TreeNode; import de.upb.docgen.utils.Utils; import de.upb.docgen.writer.FreeMarkerWriter; -import freemarker.template.*; +import freemarker.template.Configuration; +import freemarker.template.TemplateException; +import freemarker.template.Version; +import org.apache.commons.io.FileUtils; -import javax.print.Doc; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.*; /** * @author Ritika Singh @@ -32,28 +34,17 @@ public static void main(String[] args) throws IOException, TemplateException, Cr DocSettings docSettings = DocSettings.getInstance(); System.out.println("Parsing CLI Flags"); docSettings.parseSettingsFromCLI(args); - //read CryslRules from absolutePath provided by the user + + // read CryslRules from absolutePath provided by the user + System.out.println("Reading CrySL Rules"); + + + List rules = null; if (docSettings.getRulesetPathDir() != null) { - rules = CrySLReader.readCrySLRuleFromSourceFiles(docSettings.getRulesetPathDir()); - //Generate dot files from given ruleset - if(docSettings.isBooleanE()) { - System.out.println("Generating the statemachine files from " + docSettings.getRulesetPathDir() + "."); - StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getRulesetPathDir(),docSettings.getReportDirectory()); - } + rules = ruleReader.readFromDirectory(new File(docSettings.getRulesetPathDir())); } else { - //read rules from jar resources rules = CrySLReader.readRulesFromJar(); - //generate dot files from jar resources - if(docSettings.isBooleanE()) { - System.out.println("Generating the statemachine files from default resources."); - StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getReportDirectory()); - } } - //read CryslRules from absolutePath provided by the user - - // read CryslRules from absolutePath provided by the user - System.out.println("Reading CrySL Rules"); - List rules = ruleReader.readFromDirectory(new File(docSettings.getRulesetPathDir())); @@ -159,18 +150,53 @@ public static void main(String[] args) throws IOException, TemplateException, Cr FreeMarkerWriter.setupFreeMarker(cfg); FreeMarkerWriter.createCogniCryptLayout(cfg); FreeMarkerWriter.createSidebar(composedRuleList, cfg); - FreeMarkerWriter.createSinglePage(composedRuleList, cfg, ensToReq, reqToEns, docSettings.isBooleanA(), docSettings.isBooleanB(), docSettings.isBooleanC() , docSettings.isBooleanD() , docSettings.isBooleanE() , docSettings.isBooleanF()); - new File(docSettings.getReportDirectory() + File.separator + "rules").mkdir(); - Map rulesDist; - if (DocSettings.getInstance().getFtlTemplatesPath() == null) { - rulesDist = CrySLReader.readRulesFromJar(); - } else { - rulesDist = CrySLReader.readCrySLRuleFromSourceFiles(docSettings.getRulesetPathDir()); - } - for (File f : rulesDist.keySet()) { - Files.copy(f.toPath(), Paths.get(docSettings.getReportDirectory() , "rules", f.getName()), StandardCopyOption.REPLACE_EXISTING); + FreeMarkerWriter.createSinglePage(composedRuleList, cfg, ensToReq, reqToEns, docSettings.isBooleanA(), + docSettings.isBooleanB(), docSettings.isBooleanC(), docSettings.isBooleanD(), docSettings.isBooleanE(), + docSettings.isBooleanF(), cryslRuleList); + // copy CryslRulesFolder into generated Cognicrypt folder + // specifify this flag to distribute the documentation + System.out.println("CogniCryptDOC generated to: " + DocSettings.getInstance().getReportDirectory()); + if (!docSettings.isBooleanF()) { + boolean readFromJar = false; + File source = null; + if (DocSettings.getInstance().getRulesetPathDir() != null) { + source = new File(docSettings.getRulesetPathDir()); + } else { + readFromJar = true; + source = new File("tempRulesDir"); + if (!source.exists()) { + source.mkdir(); + } + + // Read each rule and save it in the temporary directory + for (CrySLRule rule : rules) { + File ruleFile = CrySLReader.readRuleFromJarFile(rule.getClassName().substring(rule.getClassName().lastIndexOf(".") + 1)); + if (ruleFile != null && ruleFile.exists()) { + try { + // Copy each rule file into the temporary directory + Files.copy(ruleFile.toPath(), new File(source, ruleFile.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + File dest = new File(docSettings.getReportDirectory() + File.separator + "rules"); + try { + FileUtils.copyDirectory(source, dest); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // Cleanup the temporary directory + if (readFromJar) { + try { + FileUtils.deleteDirectory(source); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } - System.out.println("Generated the documentation to " + docSettings.getReportDirectory()); } diff --git a/src/main/java/de/upb/docgen/Order.java b/src/main/java/de/upb/docgen/Order.java index 8c6378c..0dfa4a3 100644 --- a/src/main/java/de/upb/docgen/Order.java +++ b/src/main/java/de/upb/docgen/Order.java @@ -17,6 +17,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import crypto.exceptions.CryptoAnalysisException; +import de.upb.docgen.crysl.CrySLReader; import org.apache.commons.lang3.StringUtils; import crypto.rules.CrySLRule; @@ -66,7 +68,19 @@ private static Map getSymValues() throws IOException { Properties properties = new Properties(); try { - File fileone = new File(DocSettings.getInstance().getLangTemplatesPath() + "/symbol.properties"); + File fileone = null; + + if (DocSettings.getInstance().getRulesetPathDir() != null) { + fileone = new File(DocSettings.getInstance().getLangTemplatesPath() + "/symbol.properties"); + + } else { + fileone = CrySLReader.readSymbolPropertiesFromJar(); + } + + + + + FileInputStream fileInput = new FileInputStream(fileone); properties.load(fileInput); fileInput.close(); @@ -314,10 +328,24 @@ private static void getProcessedMap(List eventList) { } - public List runOrder(CrySLRule file) throws IOException { - String filePath = DocSettings.getInstance().getRulesetPathDir(); - filePath += File.separator + file.getClassName().substring(file.getClassName().lastIndexOf(".") + 1) + ".crysl"; - Map> fileContent = readCryslFile(filePath); + public List runOrder(CrySLRule file) throws IOException, CryptoAnalysisException { + + + File rule = null; + Map> fileContent = null; + + if (DocSettings.getInstance().getRulesetPathDir() != null) { + String filePath = DocSettings.getInstance().getRulesetPathDir(); + filePath += File.separator + file.getClassName().substring(file.getClassName().lastIndexOf(".") + 1) + ".crysl"; + fileContent = readCryslFile(filePath); + + } else { + rule = CrySLReader.readRuleFromJarFile(file.getClassName().substring(file.getClassName().lastIndexOf(".") + 1)); + fileContent = readCryslFile(rule.getPath()); + } + //String filePath = DocSettings.getInstance().getRulesetPathDir(); + //filePath += File.separator + file.getClassName().substring(file.getClassName().lastIndexOf(".") + 1) + ".crysl"; + //Map> fileContent = readCryslFile(filePath); List objectList = fileContent.get("OBJECTS"); for (String pair : objectList) { diff --git a/src/main/java/de/upb/docgen/crysl/CrySLReader.java b/src/main/java/de/upb/docgen/crysl/CrySLReader.java index cd42727..f7d2dde 100644 --- a/src/main/java/de/upb/docgen/crysl/CrySLReader.java +++ b/src/main/java/de/upb/docgen/crysl/CrySLReader.java @@ -8,14 +8,17 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.security.CodeSource; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; import crypto.cryslhandler.CrySLModelReader; +import crypto.exceptions.CryptoAnalysisException; import crypto.rules.CrySLRule; +import crypto.rules.CrySLRuleReader; +import de.upb.docgen.DocSettings; import de.upb.docgen.utils.Utils; -import sun.misc.Launcher; /** * @author Ritika Singh @@ -23,72 +26,197 @@ public class CrySLReader { +/* +if (docSettings.getRulesetPathDir() != null) { + rules = ruleReader.readFromDirectory(new File(docSettings.getRulesetPathDir())); + //Generate dot files from given ruleset + if(docSettings.isBooleanE()) { + System.out.println("Generating the statemachine files from " + docSettings.getRulesetPathDir() + "."); + StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getRulesetPathDir(),docSettings.getReportDirectory()); + } + } else { + //read rules from jar resources + rules = CrySLReader.readRulesFromJar(); + //generate dot files from jar resources + if(docSettings.isBooleanE()) { + System.out.println("Generating the statemachine files from default resources."); + StateMachineToGraphviz.generateGraphvizStateMachines(docSettings.getReportDirectory()); + } + } + */ + - public static Map readCrySLRuleFromSourceFiles(String folderPath) { + public static List readRulesFromJar() throws IOException, CryptoAnalysisException { - File f = null; - try { - CrySLModelReader cryslmodelreader = new CrySLModelReader(); - Map rules = new HashMap<>(); - File[] files = new File(folderPath).listFiles(); - for (File file : files) { - if (file != null && file.getName().endsWith(".crysl")) { - f = file; - rules.put(file, cryslmodelreader.readRule(file)); + final String path = "CrySLRules"; + final File jarFile = new File(CrySLReader.class.getProtectionDomain().getCodeSource().getLocation().getPath()); + CrySLRuleReader cryslmodelreader = new CrySLRuleReader(); + + List rules = new ArrayList<>(); + + if(jarFile.isFile()) { // Run with JAR file + final JarFile jar = new JarFile(jarFile); + final Enumeration entries = jar.entries(); //gives ALL entries in jar + try { + while (entries.hasMoreElements()) { + final JarEntry name = entries.nextElement(); + if (name.getName().endsWith(".crysl")) { //only handle crysl files + File extractedRule = Utils.extract(name.getName()); //Create a temporary crysl file + String shortend = extractedRule.getName().substring(0, extractedRule.getName().indexOf("crysl") + "crysl".length()); //CrySL Rule name without temp file ending + Files.move(extractedRule.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); + File renamedTempFile = (Paths.get(shortend).toFile()); + System.out.println(renamedTempFile.getPath()); + CrySLRule rule = cryslmodelreader.readFromSourceFile(renamedTempFile); //Renaming allows the file to be read by the CrySLModelReader + renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished + rules.add(rule); + + } } + } catch (CryptoAnalysisException ex) { + } - return rules; + jar.close(); + + + } else { // Run with IDE + final URL url = CrySLReader.class.getResource("/" + path); + if (url != null) { + try { + final File apps = new File(url.toURI()); + for (File file : apps.listFiles()) { + rules.add(cryslmodelreader.readFromSourceFile(file)); + + } + } catch (URISyntaxException | CryptoAnalysisException ex) { - } catch (MalformedURLException e) { - e.printStackTrace(); + } + } } - return null; + return rules; + + } - public static Map readRulesFromJar() throws IOException { + public static File readRuleFromJarFile(String ruleName) throws IOException, CryptoAnalysisException { final String path = "CrySLRules"; + final CodeSource codeSource = CrySLReader.class.getProtectionDomain().getCodeSource(); + final File jarFile = new File(codeSource.getLocation().getPath()); + CrySLRuleReader cryslModelReader = new CrySLRuleReader(); + + if (jarFile.isFile()) { // Run with JAR file + try (JarFile jar = new JarFile(jarFile)) { + final Enumeration entries = jar.entries(); // gives ALL entries in jar + while (entries.hasMoreElements()) { + final JarEntry entry = entries.nextElement(); + if (entry.getName().endsWith(".crysl") && entry.getName().contains(ruleName)) { // only handle crysl files + File extractedRule = Utils.extract(entry.getName()); // Create a temporary crysl file + String shortName = extractedRule.getName().substring(0, extractedRule.getName().indexOf("crysl") + "crysl".length()); // CrySL Rule name without temp file ending + Files.move(extractedRule.toPath(), Paths.get(shortName), StandardCopyOption.REPLACE_EXISTING); + File renamedTempFile = (Paths.get(shortName).toFile()); + CrySLRule rule = cryslModelReader.readFromSourceFile(renamedTempFile); // Renaming allows the file to be read by the CrySLModelReader + renamedTempFile.deleteOnExit(); // Removes the temp CrySL file after JVM is finished + return renamedTempFile; + } + } + } + } else { // Run with IDE + final URL url = CrySLReader.class.getResource("/" + path); + if (url != null) { + try { + final File apps = new File(url.toURI()); + for (File file : apps.listFiles()) { + if (file.getName().contains(ruleName)) { + return file; + } + } + } catch (URISyntaxException ex) { + // Handle exception + } + } + } + return null; + } + + + public static File readSymbolPropertiesFromJar() { + final String path = "Templates" + "/" + "symbol.properties"; + final CodeSource codeSource = CrySLReader.class.getProtectionDomain().getCodeSource(); + final File jarFile = new File(codeSource.getLocation().getPath()); + + if (jarFile.isFile()) { // Run with JAR file + try (JarFile jar = new JarFile(jarFile)) { + final Enumeration entries = jar.entries(); // gives ALL entries in jar + while (entries.hasMoreElements()) { + final JarEntry entry = entries.nextElement(); + if (entry.getName().endsWith(".properties")) { // only handle crysl files + File extractedRule = Utils.extract(entry.getName()); // Create a temporary crysl file + String shortName = extractedRule.getName().substring(0, extractedRule.getName().indexOf("properties") + "properties".length()); // CrySL Rule name without temp file ending + Files.move(extractedRule.toPath(), Paths.get(shortName), StandardCopyOption.REPLACE_EXISTING); + File renamedTempFile = (Paths.get(shortName).toFile()); + //CrySLRule rule = cryslModelReader.readFromSourceFile(renamedTempFile); // Renaming allows the file to be read by the CrySLModelReader + renamedTempFile.deleteOnExit(); // Removes the temp CrySL file after JVM is finished + return renamedTempFile; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } else { // Run with IDE + final URL url = CrySLReader.class.getResource("/" + path); + if (url != null) { + try { + final File apps = new File(url.toURI()); + return apps; + } catch (URISyntaxException ex) { + // Handle exception + } + } + } + return null; + } + + + + public static File readFTLFromJar(String FTLname) throws IOException { + + final String path = "FTLTemplates" + "/" + FTLname; final File jarFile = new File(CrySLReader.class.getProtectionDomain().getCodeSource().getLocation().getPath()); - CrySLModelReader cryslmodelreader = new CrySLModelReader(); - Map rules = new HashMap<>(); + + if(jarFile.isFile()) { // Run with JAR file final JarFile jar = new JarFile(jarFile); final Enumeration entries = jar.entries(); //gives ALL entries in jar while(entries.hasMoreElements()) { final JarEntry name = entries.nextElement(); - if (name.getName().endsWith(".crysl")) { //only handle crysl files + if (name.getName().contains(FTLname)) { //only handle crysl files File extractedRule = Utils.extract(name.getName()); //Create a temporary crysl file - String shortend = extractedRule.getName().substring(0,extractedRule.getName().indexOf("crysl")+"crysl".length()); //CrySL Rule name without temp file ending + String shortend = extractedRule.getName().substring(0,extractedRule.getName().indexOf("ftl")+"ftl".length()); //CrySL Rule name without temp file ending Files.move(extractedRule.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); File renamedTempFile = (Paths.get(shortend).toFile()); - CrySLRule rule = cryslmodelreader.readRule(renamedTempFile); //Renaming allows the file to be read by the CrySLModelReader + //CrySLRule rule = cryslmodelreader.readFromSourceFile(renamedTempFile); //Renaming allows the file to be read by the CrySLModelReader renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished - rules.put(renamedTempFile, rule); + return renamedTempFile; } } jar.close(); + } else { // Run with IDE - final URL url = Launcher.class.getResource("/" + path); + final URL url = CrySLReader.class.getResource("/" + path); if (url != null) { try { final File apps = new File(url.toURI()); - for (File file : apps.listFiles()) { - rules.put(file, cryslmodelreader.readRule(file)); - - } + return apps; } catch (URISyntaxException ex) { - + // Handle exception } } } - return rules; + return null; } - - - } \ No newline at end of file diff --git a/src/main/java/de/upb/docgen/utils/Utils.java b/src/main/java/de/upb/docgen/utils/Utils.java index 1db3648..085d5b3 100644 --- a/src/main/java/de/upb/docgen/utils/Utils.java +++ b/src/main/java/de/upb/docgen/utils/Utils.java @@ -8,13 +8,10 @@ import de.upb.docgen.ComposedRule; import de.upb.docgen.DocSettings; import de.upb.docgen.Order; -import de.upb.docgen.crysl.CrySLReader; import java.io.*; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; /** @@ -22,7 +19,14 @@ */ public class Utils { - + public static File getFileFromResources(String fileName) { + URL resource = Utils.class.getResource(fileName); + if (resource == null) { + throw new IllegalArgumentException("File could not be found!"); + } else { + return new File(resource.getFile()); + } + } public static String replaceLast(String string, String toReplace, String replacement) { int pos = string.lastIndexOf(toReplace); @@ -184,7 +188,9 @@ public static String getTemplatesTextString(String templateName) throws IOExcept return strD + "\n"; } - + public static String pathForTemplates(String path) { + return path.replaceAll("\\\\","/"); + } public static File extract(String filePath) { try { @@ -210,5 +216,4 @@ public static File extract(String filePath) { } - } diff --git a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java index 9f44d14..c8c3b0e 100644 --- a/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java +++ b/src/main/java/de/upb/docgen/writer/FreeMarkerWriter.java @@ -1,7 +1,9 @@ package de.upb.docgen.writer; +import crypto.exceptions.CryptoAnalysisException; import crypto.rules.CrySLRule; import de.upb.docgen.*; +import de.upb.docgen.crysl.CrySLReader; import de.upb.docgen.graphviz.StateMachineToGraphviz; import de.upb.docgen.utils.TemplateAbsolutePathLoader; import de.upb.docgen.utils.TreeNode; @@ -32,7 +34,13 @@ public static void createSidebar(List composedRuleList, Configurat Map input = new HashMap(); input.put("title", "Sidebar"); input.put("rules", composedRuleList); - Template template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "sidebar.ftl")); + Template template = null; + if (DocSettings.getInstance().getRulesetPathDir() != null) { + template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/" + "sidebar.ftl")); + } else { + template = cfg.getTemplate(CrySLReader.readFTLFromJar("sidebar.ftl").getPath()); + + } // 2.3. Generate the output try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"navbar.html"))) { template.process(input, fileWriter); @@ -52,7 +60,7 @@ public static void createSidebar(List composedRuleList, Configurat * @throws IOException * @throws TemplateException */ - public static void createSinglePage(List composedRuleList, Configuration cfg, Map> reqToEns, Map> ensToReq, boolean a, boolean b, boolean c, boolean d, boolean e, boolean f, List crySLRules) throws IOException, TemplateException { + public static void createSinglePage(List composedRuleList, Configuration cfg, Map> reqToEns, Map> ensToReq, boolean a, boolean b, boolean c, boolean d, boolean e, boolean f, List crySLRules) throws IOException, TemplateException, CryptoAnalysisException { for (int i = 0; i < composedRuleList.size(); i++) { ComposedRule rule = composedRuleList.get(i); Map input = new HashMap(); @@ -64,8 +72,12 @@ public static void createSinglePage(List composedRuleList, Configu input.put("ensures", rootEns); // ensures tree parsed by the template // necessary input for the template to load absolute path from crysl rule which can be displayed - input.put("pathToRules", Utils.pathForTemplates("file://" + DocSettings.getInstance().getRulesetPathDir())); - // Set flags + if (DocSettings.getInstance().getRulesetPathDir() != null) { + input.put("pathToRules", Utils.pathForTemplates("file://" + DocSettings.getInstance().getRulesetPathDir())); + } else { + input.put("pathToRules", Utils.pathForTemplates("file://" + CrySLReader.readRuleFromJarFile(composedRuleList.get(i).getOnlyRuleName()).getPath())); + } + // Set flags input.put("booleanA", a); // To show StateMachineGraph input.put("booleanB", b); // To show Help Button input.put("booleanC", c); @@ -76,7 +88,12 @@ public static void createSinglePage(List composedRuleList, Configu input.put("stateMachine", StateMachineToGraphviz.toGraphviz(crySLRules.get(i).getUsagePattern())); // 2.2. Get the template - Template template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/" + "singleclass.ftl")); + Template template = null; + if (DocSettings.getInstance().getRulesetPathDir() != null) { + template = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/" + "singleclass.ftl")); + } else { + template = cfg.getTemplate(CrySLReader.readFTLFromJar("singleclass.ftl").getPath()); + } // create composedRules directory where single pages are stored new File(DocSettings.getInstance().getReportDirectory() + "/" + "composedRules/").mkdir(); @@ -88,10 +105,10 @@ public static void createSinglePage(List composedRuleList, Configu } - /** - * sets freemarker settings - * @param cfg - */ + /** + * sets freemarker settings + * @param cfg + */ public static void setupFreeMarker(Configuration cfg) { // setup freemarker to load absolute paths cfg.setTemplateLoader(new TemplateAbsolutePathLoader()); @@ -109,7 +126,7 @@ public static void setupFreeMarker(Configuration cfg) { */ public static void createCogniCryptLayout(Configuration cfg) throws IOException, TemplateException { Map input = new HashMap(); - + if (!Files.exists(Paths.get(DocSettings.getInstance().getReportDirectory()))) { try { // Attempt to create the directory @@ -121,13 +138,24 @@ public static void createCogniCryptLayout(Configuration cfg) throws IOException, } else { System.out.println("Directory already exists."); } - Template frontpageTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "frontpage.ftl")); - try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"frontpage.html"))) { - frontpageTemplate.process(input, fileWriter); - } - Template rootpageTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "rootpage.ftl")); - try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"rootpage.html"))) { - rootpageTemplate.process(input, fileWriter); + if (DocSettings.getInstance().getRulesetPathDir() != null) { + Template frontpageTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "frontpage.ftl")); + try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"frontpage.html"))) { + frontpageTemplate.process(input, fileWriter); + } + Template rootpageTemplate = cfg.getTemplate(Utils.pathForTemplates(DocSettings.getInstance().getFtlTemplatesPath() + "/"+ "rootpage.ftl")); + try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"rootpage.html"))) { + rootpageTemplate.process(input, fileWriter); + } + } else { + Template frontpageTemplate = cfg.getTemplate(CrySLReader.readFTLFromJar("frontpage.ftl").getPath()); + try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"frontpage.html"))) { + frontpageTemplate.process(input, fileWriter); + } + Template rootpageTemplate = cfg.getTemplate(CrySLReader.readFTLFromJar("rootpage.ftl").getPath()); + try (Writer fileWriter = new FileWriter(new File(DocSettings.getInstance().getReportDirectory() + File.separator+"rootpage.html"))) { + rootpageTemplate.process(input, fileWriter); + } } } } From cd4710a13c8e5617723fed2c0b969935c005090c Mon Sep 17 00:00:00 2001 From: svenfeld Date: Fri, 9 Aug 2024 10:50:06 +0200 Subject: [PATCH 08/11] Include newest JCA ruleset as default --- pom.xml | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index be93181..ad056be 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ UTF-8 + src/main/java @@ -40,6 +41,7 @@ org.apache.maven.plugins maven-dependency-plugin + copy-dependencies prepare-package @@ -53,11 +55,61 @@ true + + + + unpack-ruleset + process-resources + + unpack + + + + + de.darmstadt.tu.crossing + JavaCryptographicArchitecture + 3.1.1 + zip + ruleset + true + ${project.build.directory}/generated-resources + + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + + copy-ruleset-to-resources + process-resources + + copy-resources + + + src/main/resources/CrySLRules + + + ${project.build.directory}/generated-resources + + **/* + + + + + + + @@ -72,7 +124,6 @@ 3.1.1 - junit junit From 86ff9df7b33032b2c7078cc0dd94c58793c79669 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Fri, 9 Aug 2024 11:12:25 +0200 Subject: [PATCH 09/11] Include folder in jar --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index ad056be..3620d37 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ unpack-ruleset - process-resources + generate-resources unpack @@ -69,7 +69,7 @@ de.darmstadt.tu.crossing JavaCryptographicArchitecture 3.1.1 - zip + zip ruleset true ${project.build.directory}/generated-resources @@ -87,7 +87,7 @@ copy-ruleset-to-resources - process-resources + generate-resources copy-resources @@ -97,7 +97,7 @@ ${project.build.directory}/generated-resources - **/* + **/*.crysl From 7596d3839afc25d5fe00fb6b40d51e793b537092 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Fri, 9 Aug 2024 11:18:25 +0200 Subject: [PATCH 10/11] Don't create subfolder --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3620d37..27d2014 100644 --- a/pom.xml +++ b/pom.xml @@ -95,7 +95,7 @@ src/main/resources/CrySLRules - ${project.build.directory}/generated-resources + ${project.build.directory}/generated-resources/JavaCryptographicArchitecture **/*.crysl From fdc4286d669eb0de3e21b3eaa9378a97173e48a8 Mon Sep 17 00:00:00 2001 From: svenfeld Date: Thu, 22 Aug 2024 12:32:25 +0200 Subject: [PATCH 11/11] Move error handling while reading rules into loop --- .../java/de/upb/docgen/crysl/CrySLReader.java | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/upb/docgen/crysl/CrySLReader.java b/src/main/java/de/upb/docgen/crysl/CrySLReader.java index f7d2dde..ea44d78 100644 --- a/src/main/java/de/upb/docgen/crysl/CrySLReader.java +++ b/src/main/java/de/upb/docgen/crysl/CrySLReader.java @@ -13,11 +13,9 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; -import crypto.cryslhandler.CrySLModelReader; import crypto.exceptions.CryptoAnalysisException; import crypto.rules.CrySLRule; import crypto.rules.CrySLRuleReader; -import de.upb.docgen.DocSettings; import de.upb.docgen.utils.Utils; /** @@ -57,23 +55,23 @@ public static List readRulesFromJar() throws IOException, CryptoAnaly if(jarFile.isFile()) { // Run with JAR file final JarFile jar = new JarFile(jarFile); final Enumeration entries = jar.entries(); //gives ALL entries in jar - try { - while (entries.hasMoreElements()) { + while (entries.hasMoreElements()) { + try { final JarEntry name = entries.nextElement(); if (name.getName().endsWith(".crysl")) { //only handle crysl files File extractedRule = Utils.extract(name.getName()); //Create a temporary crysl file String shortend = extractedRule.getName().substring(0, extractedRule.getName().indexOf("crysl") + "crysl".length()); //CrySL Rule name without temp file ending Files.move(extractedRule.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); File renamedTempFile = (Paths.get(shortend).toFile()); - System.out.println(renamedTempFile.getPath()); CrySLRule rule = cryslmodelreader.readFromSourceFile(renamedTempFile); //Renaming allows the file to be read by the CrySLModelReader renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished rules.add(rule); } + } catch (CryptoAnalysisException ex ) { + System.err.println("Error processing: " + " - " + ex.getMessage()); } - } catch (CryptoAnalysisException ex) { - + } jar.close(); @@ -84,15 +82,18 @@ public static List readRulesFromJar() throws IOException, CryptoAnaly try { final File apps = new File(url.toURI()); for (File file : apps.listFiles()) { - rules.add(cryslmodelreader.readFromSourceFile(file)); - + try { + rules.add(cryslmodelreader.readFromSourceFile(file)); + } catch (CryptoAnalysisException ex) { + System.err.println("Error processing file: " + file.getName() + " - " + ex.getMessage()); + } } - } catch (URISyntaxException | CryptoAnalysisException ex) { - + } catch (URISyntaxException ex) { + System.err.println("URI syntax error: " + ex.getMessage()); } } } - return rules; + return rules; } @@ -103,8 +104,6 @@ public static File readRuleFromJarFile(String ruleName) throws IOException, Cryp final String path = "CrySLRules"; final CodeSource codeSource = CrySLReader.class.getProtectionDomain().getCodeSource(); final File jarFile = new File(codeSource.getLocation().getPath()); - CrySLRuleReader cryslModelReader = new CrySLRuleReader(); - if (jarFile.isFile()) { // Run with JAR file try (JarFile jar = new JarFile(jarFile)) { final Enumeration entries = jar.entries(); // gives ALL entries in jar @@ -115,7 +114,6 @@ public static File readRuleFromJarFile(String ruleName) throws IOException, Cryp String shortName = extractedRule.getName().substring(0, extractedRule.getName().indexOf("crysl") + "crysl".length()); // CrySL Rule name without temp file ending Files.move(extractedRule.toPath(), Paths.get(shortName), StandardCopyOption.REPLACE_EXISTING); File renamedTempFile = (Paths.get(shortName).toFile()); - CrySLRule rule = cryslModelReader.readFromSourceFile(renamedTempFile); // Renaming allows the file to be read by the CrySLModelReader renamedTempFile.deleteOnExit(); // Removes the temp CrySL file after JVM is finished return renamedTempFile; } @@ -155,7 +153,6 @@ public static File readSymbolPropertiesFromJar() { String shortName = extractedRule.getName().substring(0, extractedRule.getName().indexOf("properties") + "properties".length()); // CrySL Rule name without temp file ending Files.move(extractedRule.toPath(), Paths.get(shortName), StandardCopyOption.REPLACE_EXISTING); File renamedTempFile = (Paths.get(shortName).toFile()); - //CrySLRule rule = cryslModelReader.readFromSourceFile(renamedTempFile); // Renaming allows the file to be read by the CrySLModelReader renamedTempFile.deleteOnExit(); // Removes the temp CrySL file after JVM is finished return renamedTempFile; } @@ -196,7 +193,6 @@ public static File readFTLFromJar(String FTLname) throws IOException { String shortend = extractedRule.getName().substring(0,extractedRule.getName().indexOf("ftl")+"ftl".length()); //CrySL Rule name without temp file ending Files.move(extractedRule.toPath(), Paths.get(shortend), StandardCopyOption.REPLACE_EXISTING); File renamedTempFile = (Paths.get(shortend).toFile()); - //CrySLRule rule = cryslmodelreader.readFromSourceFile(renamedTempFile); //Renaming allows the file to be read by the CrySLModelReader renamedTempFile.deleteOnExit(); //Removes the temp CrySL file after jvm is finished return renamedTempFile;