ModelDescription.xtend 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package be.uantwerpen.ansymo.semanticadaptation.cg.cpp.generation
  2. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SVCausality
  3. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SVType
  4. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SVVariability
  5. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.ScalarVariable
  6. import be.uantwerpen.ansymo.semanticadaptation.log.Log
  7. import java.io.File
  8. import java.util.Enumeration
  9. import java.util.LinkedHashMap
  10. import java.util.zip.ZipEntry
  11. import java.util.zip.ZipFile
  12. import javax.xml.parsers.DocumentBuilder
  13. import javax.xml.parsers.DocumentBuilderFactory
  14. import javax.xml.soap.Node
  15. import javax.xml.xpath.XPath
  16. import javax.xml.xpath.XPathConstants
  17. import javax.xml.xpath.XPathExpression
  18. import javax.xml.xpath.XPathFactory
  19. import org.w3c.dom.Document
  20. import org.w3c.dom.NodeList
  21. class ModelDescription {
  22. private final Document md;
  23. private final String name;
  24. private final String type;
  25. //Get rid of these. We need more information anyways.
  26. private var LinkedHashMap<String, Pair<String, Integer>> svDefs = newLinkedHashMap();
  27. private var LinkedHashMap<String, ScalarVariable> svs = newLinkedHashMap();
  28. private var String guid;
  29. new(String name, String type, File path) {
  30. Log.push("Loading model description for fmu " + name)
  31. this.name = name;
  32. this.type = type;
  33. Log.println("Source fmu absolute path: " + path.absolutePath)
  34. var ZipFile fmu = new ZipFile(path);
  35. var Enumeration<? extends ZipEntry> entries = fmu.entries();
  36. var boolean entryFound = false;
  37. var ZipEntry locatedEntry;
  38. while (!entryFound && entries.hasMoreElements()) {
  39. var ZipEntry entry = entries.nextElement();
  40. if (entry.name.equalsIgnoreCase("modelDescription.xml")) {
  41. locatedEntry = entry;
  42. entryFound = true;
  43. }
  44. }
  45. var DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
  46. var DocumentBuilder builder = fac.newDocumentBuilder();
  47. val is = fmu.getInputStream(locatedEntry)
  48. this.md = builder.parse(is);
  49. is.close();
  50. calcExtractInformation();
  51. Log.pop("Loading model description for fmu " + name)
  52. }
  53. private def calcExtractInformation() {
  54. val XPathFactory xPathfactory = XPathFactory.newInstance();
  55. val XPath xpath = xPathfactory.newXPath();
  56. val XPathExpression exprGuid = xpath.compile("/fmiModelDescription/@guid");
  57. this.guid = exprGuid.evaluate(this.md);
  58. val XPathExpression expr = xpath.compile("/fmiModelDescription/ModelVariables/ScalarVariable");
  59. val NodeList nl = expr.evaluate(this.md, XPathConstants.NODESET) as NodeList;
  60. for (var int i = 0; i < nl.length; i++) {
  61. val node = nl.item(i);
  62. val nodeName = node.attributes.getNamedItem("name").nodeValue;
  63. val valueRef = node.attributes.getNamedItem("valueReference").nodeValue;
  64. val name = this.name + nodeName;
  65. val define = name.toUpperCase;
  66. this.svDefs.put(name, define -> Integer.parseInt(valueRef));
  67. val sv = ScalarVariable.Create()
  68. .setCausality(SVCausality.valueOf(node.attributes.getNamedItem("causality").nodeValue))
  69. .setName(nodeName)
  70. .setOwner(this.name)
  71. .setValueReference(valueRef)
  72. .setIndex((i + 1).toString)
  73. .setVariability(SVVariability.valueOf(node.attributes.getNamedItem("variability").nodeValue));
  74. for (var j = 0; j < node.childNodes.length; j++) {
  75. val subNode = node.childNodes.item(j);
  76. if (subNode.nodeType == Node.ELEMENT_NODE) {
  77. val startAttribute = subNode.attributes.getNamedItem("start");
  78. if (startAttribute !== null) {
  79. sv.start = startAttribute.nodeValue;
  80. }
  81. sv.type = SVType.valueOf(subNode.nodeName);
  82. this.svs.put(nodeName, sv);
  83. }
  84. }
  85. }
  86. }
  87. public def getName() {
  88. return this.name;
  89. }
  90. public def getSvDef() {
  91. return this.svDefs;
  92. }
  93. public def getSv() { return this.svs; }
  94. public def getGuid() { return this.guid; }
  95. }