diff --git a/src/main/jastadd/gen/Package.jadd b/src/main/jastadd/gen/Package.jadd index 25c6841c07db435a4f6ea113c0eb932d09926843..d67a552c8c5d5d474f775a59d50c24f278f1dd7b 100644 --- a/src/main/jastadd/gen/Package.jadd +++ b/src/main/jastadd/gen/Package.jadd @@ -2,37 +2,51 @@ aspect PackageGen { syn String GradleFile.generateSettingsGradle(String rootProjectName){ - return de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateGradleSettings(rootProjectName); + String res = de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateGradleSettings(rootProjectName); + this.setFileContent(res); + return res; } syn String GradleFile.generateBuildGradle(String mainClass, String archiveBaseName, String version, String pnmlRelastersion){ - return de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateBuildGradle(mainClass, archiveBaseName, version, pnmlRelastersion); + String res = de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateBuildGradle(mainClass, archiveBaseName, version, pnmlRelastersion); + this.setFileContent(res); + return res; } syn String MainFile.generate(List<PetriNet> petriNetList, List<String> petriNetFiles, String rosHost, String rosMasterUri, String mqttHost){ - return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMain(petriNetList, petriNetFiles, rosHost, rosMasterUri, mqttHost, dinerosPackage().getNamespace()); + String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMain(petriNetList, petriNetFiles, rosHost, rosMasterUri, mqttHost, dinerosPackage().getNamespace()); + this.setFileContent(res); + return res; } syn String SubscriberFile.generate(){ - return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateSubscriberClass(dinerosPackage().getNamespace(), getName()); + String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateSubscriberClass(dinerosPackage().getNamespace(), getName()); + this.setFileContent(res); + return res; } syn String NodeFile.generate(){ - return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateNodeClass(dinerosPackage().getNamespace(), getName()); + String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateNodeClass(dinerosPackage().getNamespace(), getName()); + this.setFileContent(res); + return res; } syn String ServerFile.generate(){ - return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateServerClass(dinerosPackage().getNamespace(), getName()); + String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateServerClass(dinerosPackage().getNamespace(), getName()); + this.setFileContent(res); + return res; } syn String MapperFile.generate(List<PetriNet> petriNets){ - return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMapperClass(dinerosPackage().getNamespace(), petriNets); + String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMapperClass(dinerosPackage().getNamespace(), petriNets); + this.setFileContent(res); + return res; } syn String DinerosPackage.generateTokenClass(){ diff --git a/src/main/jastadd/gen/Package.relast b/src/main/jastadd/gen/Package.relast index 8f04aff91d9052601cdaf8172f09a09efb6b2f68..824b85cf43ef192b6d9986bf86a71010cf7bc387 100644 --- a/src/main/jastadd/gen/Package.relast +++ b/src/main/jastadd/gen/Package.relast @@ -4,8 +4,9 @@ abstract PackageElement; abstract PackageFile:PackageElement ::= <Name:String> <FileID:String> ; StaticFile:PackageFile ; +PnmlFile:StaticFile; -abstract TemplateFile:PackageFile ; +abstract TemplateFile:PackageFile ::= <FileContent:String> ; GradleFile:TemplateFile ; abstract JavaFile:TemplateFile ; diff --git a/src/main/jastadd/gen/PackageNav.jadd b/src/main/jastadd/gen/PackageNav.jadd index 7fadba9f2b31f7ce57a48f2218fe9e56dfad8268..7df5ef1b52b75237474e8e6fb2ba5aa414d0b30d 100644 --- a/src/main/jastadd/gen/PackageNav.jadd +++ b/src/main/jastadd/gen/PackageNav.jadd @@ -11,6 +11,15 @@ aspect PackageNav { // ----- + syn boolean PackageFile.isPnmlFile() = false; + eq PnmlFile.isPnmlFile() = true; + + syn boolean PackageFile.isTemplateFile() = false; + eq TemplateFile.isTemplateFile() = true; + + syn TemplateFile PackageFile.asTemplateFile() = null; + eq TemplateFile.asTemplateFile() = this; + syn boolean PackageFile.isNodeFile() = false; eq NodeFile.isNodeFile() = true; diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java b/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java index fc87537452a89cbd7637ff1383d319d70216f14e..7887153754029648b7aca7a75c1e9a4a2623f0fc 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java @@ -10,7 +10,6 @@ import de.tudresden.inf.st.pnml.jastadd.model.PackageDirectory; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; @@ -18,6 +17,8 @@ public class Main { public static void main(java.lang.String[] args) throws IOException { + // TODO: Configuration + // PackageStructureBuilder.build("/home/sebastian/Desktop", "test", "test", null); // GradleFile gf = new GradleFile(); // gf.setName("TestFile"); @@ -43,7 +44,6 @@ public class Main { String engineVersion = "0.1"; String configFile = "/home/sebastian/Desktop/EngineConfig.json"; - DinerosPackage dp = new DinerosPackage(); dp.setName(packageName); dp.setRootName(rootName); @@ -55,7 +55,8 @@ public class Main { ObjectMapper objectMapper = new ObjectMapper(); List<NetInfo> petriNetFilePaths = objectMapper.readValue(configString, new TypeReference<List<NetInfo>>(){}); - PackageStructureBuilder.build("/home/sebastian/Desktop", dp, "sample-pkg", petriNetFilePaths, engineVersion); + PackageStructureBuilder.build("/home/sebastian/Desktop", dp, petriNetFilePaths, engineVersion + , "localhost", "http://localhost:11311", "localhost"); } } diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java b/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java index a1cb13846ff8e2c7dad5d120e3f6c43073f07ddf..1b2d8d860cffa8edbc76b91324fd5d3116c01b55 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java +++ b/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java @@ -4,7 +4,8 @@ import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.gen.json.NetInfo; import de.tudresden.inf.st.pnml.jastadd.model.*; -import java.io.IOException; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -15,7 +16,8 @@ public class PackageStructureBuilder { private static final String FILE_PATH = "../pnml-relast-pkg-gen/src/main/resources/static/"; - public static boolean build(String targetPath, DinerosPackage dinerosPackage, String javaBasePackageName, List<NetInfo> petriNetFilePaths, String engineVersion) { + public static boolean build(String targetPath, DinerosPackage dinerosPackage, List<NetInfo> petriNetFilePaths, String engineVersion + , String rosHost, String rosMasterUri, String mqttHost) { String packagePath = targetPath + "/" + dinerosPackage.getRootName(); @@ -25,6 +27,12 @@ public class PackageStructureBuilder { nets.add(PnmlParser.parsePnml(n.getNet()).get(0)); } + List<String> stringNetPaths = new ArrayList<>(); + + for(NetInfo n : petriNetFilePaths){ + stringNetPaths.add(n.getNet()); + } + try { Files.createDirectories(Paths.get(packagePath)); @@ -33,18 +41,46 @@ public class PackageStructureBuilder { buildStaticFilesIntoDinerosPackage(dinerosPackage, engineVersion); includeDirectoriesRecursive(dinerosPackage.getDir(0), packagePath); - includeTemplateFiles(dinerosPackage, nets, javaBasePackageName, engineVersion); + includeTemplateFiles(dinerosPackage, nets, engineVersion, stringNetPaths, rosHost, rosMasterUri, mqttHost); includeFilesInPackageRecursive(dinerosPackage.getDir(0), packagePath); + includePnmlFiles(dinerosPackage, petriNetFilePaths, packagePath); + includeTokenClass(dinerosPackage, packagePath); - // TODO: include pnml files - - // TODO: include token class + insertStringsAsFilesRecursive(dinerosPackage.getDir(0), packagePath); } catch (IOException e) { System.out.println(e.getMessage() + " caused by: " + e.getCause()); + return false; + } + + return true; + } + + ///////////////////////////////////// + // STRING TO FILE /////////////////// + ///////////////////////////////////// + + private static void insertStringsAsFilesRecursive(PackageDirectory packageDirectory, String packagePath) { + + for (PackageFile pf : packageDirectory.getFileList()){ + if(pf.isTemplateFile()) { + writeToFile(packagePath + "/" + pf.getName(), pf.asTemplateFile().getFileContent()); + } + } + + for (PackageDirectory d : packageDirectory.getDirList()) { + insertStringsAsFilesRecursive(d, packagePath + "/" + packageDirectory.getName()); } + } + + private static void writeToFile(String path, String content){ - return false; + try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8))) { + writer.write(content); + } + catch (IOException ex) { + System.out.println("ERROR: " + ex.getMessage()); + } } ///////////////////////////////////// @@ -122,6 +158,15 @@ public class PackageStructureBuilder { tokenFile.setFileID(UUID.randomUUID().toString()); pd.addFile(tokenFile); } + + if(pd.getName().equals("nets")){ + for(int i = 0; i < nets.size(); i++){ + PnmlFile pnmlFile = new PnmlFile(); + pnmlFile.setName("PetriNet-" + i + ".pnml"); + pnmlFile.setFileID(UUID.randomUUID().toString()); + pd.addFile(pnmlFile); + } + } } } @@ -259,8 +304,44 @@ public class PackageStructureBuilder { // TREE TO FILE TREE //////////////// ///////////////////////////////////// - // TODO: javaBasePackageName - private static void includeTemplateFiles(DinerosPackage dinerosPackage, List<PetriNet> nets, String javaBasePackageName, String engineVersion) { + private static void includeTokenClass(DinerosPackage dinerosPackage, String packagePath){ + + for (PackageFile pf : dinerosPackage.allPackageFiles()) { + if(pf.isTokenFile()){ + String tokenClass = dinerosPackage.generateTokenClass(); + + try (Writer writer = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(packagePath + "/src/main/java/tudresden/inf/st/pnml/" + + dinerosPackage.getNamespace()), StandardCharsets.UTF_8))) { + writer.write(tokenClass); + } + catch (IOException ex) { + System.out.println("ERROR: " + ex.getMessage()); + } + } + } + } + + private static void includePnmlFiles(DinerosPackage dinerosPackage, List<NetInfo>netPaths, String packagePath) throws IOException { + + Set<String> visitedPackageFileIDs = new HashSet<>(); + + for (int i = 0; i < netPaths.size(); i++) { + for (PackageFile pf : dinerosPackage.allPackageFiles()) { + if (pf.isPnmlFile() && !visitedPackageFileIDs.contains(pf.getFileID())) { + visitedPackageFileIDs.add(pf.getFileID()); + pf.setName("PetriNet-" + i + ".pnml"); + Path copied = Paths.get(packagePath + "/src/main/resources/nets/" + pf.getName()); + Path originalPath = Paths.get(netPaths.get(i).getNet()); + Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING); + System.out.println("Copy PNML:" + originalPath + " --> " + copied); + } + } + } + } + + private static void includeTemplateFiles(DinerosPackage dinerosPackage, List<PetriNet> nets, String engineVersion, + List<String> petriNetFiles, String rosHost, String rosMasterUri, String mqttHost) { Set<String> visitedPackageFileIDs = new HashSet<>(); Map<String, Integer> subscriberCountMap = initSubscriberCountMap(nets); @@ -270,6 +351,10 @@ public class PackageStructureBuilder { if (pf.isMapperFile()) { pf.asMapperFile().generate(nets); } + + if(pf.isMainFile()){ + pf.asMainFile().generate(nets, petriNetFiles, rosHost, rosMasterUri, mqttHost); + } } for (int i = 0; i < nets.size(); i++) { @@ -329,13 +414,13 @@ public class PackageStructureBuilder { Map<String, Integer> countMap = new HashMap<>(); - for (int i = 0; i < nets.size(); i++) { - for (Transition t : nets.get(i).allTransitions()) { + for (PetriNet net : nets) { + for (Transition t : net.allTransitions()) { String transitionType = t.asInputSignalTransition().getStaticTransitionInformation().getType(); if (transitionType.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT)) { - countMap.put(nets.get(i).getId(), 1); + countMap.put(net.getId(), 1); } } } @@ -346,14 +431,14 @@ public class PackageStructureBuilder { Map<String, Integer> countMap = new HashMap<>(); - for (int i = 0; i < nets.size(); i++) { - for (Transition t : nets.get(i).allTransitions()) { + for (PetriNet net : nets) { + for (Transition t : net.allTransitions()) { String transitionType = t.asInputSignalTransition().getStaticTransitionInformation().getType(); if (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN) || transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)) { - countMap.put(nets.get(i).getId(), 1); + countMap.put(net.getId(), 1); } } } @@ -368,7 +453,6 @@ public class PackageStructureBuilder { if (packageDirectory.getNumDir() == 0) { Files.createDirectories(Paths.get(packagePath + "/" + packageDirectory.getName())); - return; } } @@ -383,7 +467,7 @@ public class PackageStructureBuilder { if (pf.isStaticFile()) { Path copied = Paths.get(packagePath + "/" + packageDirectory.getName() + "/" + pf.getName()); - Path originalPath = null; + Path originalPath; if (pf.getName().contains(".java")) { originalPath = Paths.get(FILE_PATH + "/" + pf.getName().split("\\.")[0]); @@ -395,7 +479,6 @@ public class PackageStructureBuilder { System.out.println("Copy:" + originalPath + " --> " + copied); } } - return; } } }