Main.xtend 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package ua.ansymo.hintco
  2. import java.io.File
  3. import java.io.FileWriter
  4. import org.apache.commons.cli.CommandLine
  5. import org.apache.commons.cli.DefaultParser
  6. import org.apache.commons.cli.HelpFormatter
  7. import org.apache.commons.cli.Option
  8. import org.apache.commons.cli.Options
  9. import org.apache.commons.cli.ParseException
  10. import org.eclipse.core.runtime.Assert
  11. import org.eclipse.equinox.app.IApplication
  12. import org.eclipse.equinox.app.IApplicationContext
  13. import org.intocps.fmi.jnifmuapi.Factory
  14. import ua.ansymo.hintco.RootCandidateScenario
  15. class Main implements IApplication {
  16. def static showHelp(Options options)
  17. {
  18. val formatter = new HelpFormatter();
  19. formatter.printHelp("app", options);
  20. }
  21. def static void main(String[] args) {
  22. val helpOpt = Option.builder("h").longOpt("help").desc("Show this description").build();
  23. val scenarioOpt = Option.builder("s").longOpt("scenario").desc("Path to scenario file").hasArg().numberOfArgs(1).argName("path").build();
  24. val contractOpt = Option.builder("c").longOpt("contract").desc("Path to contracts file").hasArg().numberOfArgs(1).argName("path").build();
  25. val genDefAdaptations = Option.builder("d").longOpt("default").desc("Generate default adaptations").build();
  26. val genTrace = Option.builder("t").longOpt("trace").desc("Generate debug trace.").hasArg().numberOfArgs(1).build();
  27. val outDirOpt = Option.builder("o").longOpt("output").desc("Path to output directory").hasArg().numberOfArgs(1).argName("path").build();
  28. val nVarsOpt = Option.builder("n").longOpt("variants").desc("Number of variants to run").hasArg().numberOfArgs(1).argName("int").build();
  29. val options = new Options()
  30. options.addOption(helpOpt)
  31. options.addOption(scenarioOpt)
  32. options.addOption(contractOpt)
  33. options.addOption(genDefAdaptations)
  34. options.addOption(genTrace)
  35. options.addOption(outDirOpt)
  36. options.addOption(nVarsOpt)
  37. val parser = new DefaultParser();
  38. var CommandLine cmd;
  39. try
  40. {
  41. cmd = parser.parse(options, args);
  42. } catch (ParseException e)
  43. {
  44. System.err.println("Parsing failed. Reason: " + e.getMessage());
  45. showHelp(options);
  46. return
  47. }
  48. if(cmd.hasOption(helpOpt.getOpt()))
  49. {
  50. showHelp(options);
  51. return
  52. }
  53. if (cmd.hasOption(genTrace.getOpt())) {
  54. System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug")
  55. val logFile = getOptString(genTrace, cmd, null);
  56. if (logFile === null){
  57. System.setProperty("org.slf4j.simpleLogger.logFile", "trace.log")
  58. } else {
  59. System.setProperty("org.slf4j.simpleLogger.logFile", logFile)
  60. }
  61. }
  62. run_diagnostics()
  63. val scenarioFile = getString(scenarioOpt, cmd);
  64. var outDir = getOptString(outDirOpt, cmd, "output");
  65. val loader = new ModelStorage()
  66. val src = loader.loadCandidates(scenarioFile)
  67. val spaceGenerator = new CandidateSpaceGenerator()
  68. val hintsPath = getOptString(contractOpt, cmd, null);
  69. if (cmd.hasOption(genDefAdaptations.getOpt())){
  70. spaceGenerator.createDefaultCandidateSpace(src)
  71. } else if (hintsPath !== null) {
  72. val hints = loader.loadContractSet(hintsPath)
  73. spaceGenerator.createCandidateSpace(hints, src)
  74. }
  75. val runner = new AdaptiveCosimRunner(new OutputProcessor(outDir), new FmuLoader, false)
  76. val generator = new CandidatesGenerator(new ConstraintChecker,new VariantValidator, new VariantProcessor(runner))
  77. generator.createVariantTree(src)
  78. generator.processAdaptations(src)
  79. if (cmd.hasOption(nVarsOpt.getOpt())){
  80. val nVars = Integer.parseInt(cmd.getOptionValue(nVarsOpt.getOpt()))
  81. generator.generateVariants(src, nVars)
  82. } else {
  83. generator.generateVariants(src)
  84. }
  85. runner.close()
  86. }
  87. override start(IApplicationContext context) throws Exception {
  88. val args = context.getArguments().get("application.args") as String[]
  89. main(args)
  90. return IApplication.EXIT_OK
  91. }
  92. def private static String getString(Option opt, CommandLine cmd)
  93. {
  94. if (cmd.hasOption(opt.getOpt()))
  95. {
  96. return cmd.getOptionValue(opt.getOpt());
  97. } else
  98. {
  99. throw new IllegalArgumentException("Missing option --" + opt.getLongOpt())
  100. }
  101. }
  102. def private static String getOptString(Option opt, CommandLine cmd, String d)
  103. {
  104. if (cmd.hasOption(opt.getOpt()))
  105. {
  106. return cmd.getOptionValue(opt.getOpt())
  107. } else
  108. {
  109. return d
  110. }
  111. }
  112. def static run_diagnostics(){
  113. val ms = new ModelStorage()
  114. val f = new FileWriter("storage_test.xmi")
  115. f.write('''
  116. <?xml version="1.0" encoding="ASCII"?>
  117. <hintco:HintConfiguration xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:hintco="ua.ansymo.hintco">
  118. <candidates identifier="c1"/>
  119. </hintco:HintConfiguration>
  120. ''')
  121. f.close
  122. val candidates = ms.loadCandidates("storage_test.xmi")
  123. Assert.isTrue(candidates.eAllContents.filter(RootCandidateScenario).head.identifier == "c1")
  124. Factory.checkApi()
  125. Assert.isTrue(new File("storage_test.xmi").delete())
  126. }
  127. override stop() {}
  128. }