From 64ed1823982052c1bfe7d023180dc3a32b421cb8 Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Fri, 9 Feb 2024 17:57:14 +0100
Subject: [PATCH] fixes on toolspec parser
---
.../base/distribution/DistributedPN.jadd | 4 +
.../base/parsing/ToolSpecificsParser.jadd | 100 ++++++++++++++----
2 files changed, 85 insertions(+), 19 deletions(-)
diff --git a/src/main/jastadd/base/distribution/DistributedPN.jadd b/src/main/jastadd/base/distribution/DistributedPN.jadd
index 24fc3c1..d643c9e 100644
--- a/src/main/jastadd/base/distribution/DistributedPN.jadd
+++ b/src/main/jastadd/base/distribution/DistributedPN.jadd
@@ -63,6 +63,10 @@ aspect PnDistribution {
return ToolSpecificsParser.getPortNameByPlaceId(this.getToolspecificList(), placeId);
}
+ syn String PetriNet.getPortNameByPlaceId(String placeId, String type){
+ return ToolSpecificsParser.getPortNameByPlaceId(this.getToolspecificList(), placeId, type);
+ }
+
syn String PetriNet.getServiceClientResponsePlaceId(String placeId){
return ToolSpecificsParser.getServiceClientResponsePlaceId(this.getToolspecificList(), placeId);
}
diff --git a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd
index 4b70cbf..c7cfd2d 100644
--- a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd
+++ b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd
@@ -23,6 +23,10 @@ aspect ToolSpecificsParser{
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ToolSpecificsParser.class);
+ private static String clean(String s){
+ return s.replace("\n", "").replace(" ", "");
+ }
+
public static InputSignalClause getClauseFromToolSpecifics(JastAddList<ToolInfo> toolInfos) {
if (toolInfos.getNumChild() > 0) {
@@ -82,7 +86,9 @@ aspect ToolSpecificsParser{
for(int i = 0; i < portDefList.getLength(); i++){
Element portElem = (Element) portDefList.item(i);
- if(portElem.getTextContent().equals(requestPlaceId)){
+ if(clean(portElem.getTextContent()).equals(requestPlaceId) &&
+ clean(portElem.getAttribute(PnmlConstants.CHANNEL_PLACE_TYPE_KEY))
+ .equals(PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_REQ_KEY)){
return portElem.getAttribute(PnmlConstants.PORTS_CRES_KEY);
}
@@ -107,9 +113,8 @@ aspect ToolSpecificsParser{
for(int i = 0; i < portDefList.getLength(); i++){
Element portElem = (Element) portDefList.item(i);
- if(portElem.getTextContent().equals(id)){
+ if(clean(portElem.getTextContent()).equals(id)){
return portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY);
-
}
}
@@ -120,6 +125,31 @@ aspect ToolSpecificsParser{
return null;
}
+ public static String getPortNameByPlaceId(JastAddList<ToolInfo> toolInfos, String id, String type){
+
+ if(id.contains("INSTANCE")){
+ id = id.split("-INSTANCE")[0];
+ }
+
+ try {
+ Document doc = parseToolSpecifics(toolInfos);
+ org.w3c.dom.NodeList portDefList = doc.getElementsByTagName(PnmlConstants.CHANNEL_PORT_KEY);
+
+ for(int i = 0; i < portDefList.getLength(); i++){
+ Element portElem = (Element) portDefList.item(i);
+ if(clean(portElem.getTextContent()).equals(id) &&
+ clean(portElem.getAttribute(PnmlConstants.CHANNEL_PLACE_TYPE_KEY)).equals(type)){
+ return portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY);
+ }
+ }
+
+ } catch(ParserConfigurationException | SAXException | IOException e){
+ logger.error(e.getMessage());
+ }
+
+ return null;
+ }
+
public static HashMap<String, ArrayList<String>> getChannelElemensByKey(JastAddList<ToolInfo> toolInfos, String channelTypeKey){
HashMap<String, ArrayList<String>> res = new HashMap<String, ArrayList<String>>();
@@ -132,14 +162,14 @@ aspect ToolSpecificsParser{
Element portElem = (Element) portDefList.item(i);
if(portElem.getAttribute(PnmlConstants.CHANNEL_PLACE_TYPE_KEY).equals(channelTypeKey)){
if(res.containsKey(portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY))){
- res.get(PnmlConstants.CHANNEL_NAME_KEY).add(portElem.getTextContent());
+ res.get(portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY)).add(portElem.getTextContent());
} else {
ArrayList<String> placeList = new ArrayList<>();
placeList.add(portElem.getTextContent());
res.put(portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY), placeList);
- System.out.println("[Parser] Creating mapping: " +
- portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY) +
- " >> " + portElem.getTextContent());
+ // System.out.println("[Parser] Creating mapping: " +
+ // portElem.getAttribute(PnmlConstants.CHANNEL_NAME_KEY) +
+ // " >> " + portElem.getTextContent());
}
}
}
@@ -156,7 +186,7 @@ aspect ToolSpecificsParser{
Map<String, String> inputSignalDefs = new HashMap<>();
try {
- Document doc = parseToolSpecifics(toolInfos);
+ Document doc = parseToolSpecifics(toolInfos, PnmlConstants.TOOL_SPEC_KEY);
if(doc == null){
return inputSignalDefs;
@@ -498,7 +528,14 @@ aspect ToolSpecificsParser{
return placeInformation;
}
- private static Document parseToolSpecifics(JastAddList<ToolInfo> toolInfos) throws ParserConfigurationException, SAXException, IOException {
+ private static Document parseToolSpecifics(JastAddList<ToolInfo> toolInfos)
+ throws ParserConfigurationException, SAXException, IOException {
+ return parseToolSpecifics(toolInfos, null);
+ }
+
+
+ private static Document parseToolSpecifics(JastAddList<ToolInfo> toolInfos, String tool)
+ throws ParserConfigurationException, SAXException, IOException {
if (toolInfos == null || toolInfos.getNumChild() == 0 || toolInfos.getChild(0).getFormattedXMLBuffer() == null) {
return null;
@@ -507,13 +544,20 @@ aspect ToolSpecificsParser{
ToolInfo ti = null;
for (ToolInfo toolInfo : toolInfos) {
- if (toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.SUBNET_KEY) > 0 ||
- toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.TYPE_KEY) > 0 ||
- toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.INPUT_SIGNALS_DEF) > 0 ||
- toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.CHANNEL_PORT_KEY) > 0 ||
- toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.ARC_TYPE_KEY) > 0) {
- ti = toolInfo;
- break;
+ if(tool == null) {
+ if (toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.SUBNET_KEY) > 0 ||
+ toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.TYPE_KEY) > 0 ||
+ toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.INPUT_SIGNALS_DEF) > 0 ||
+ toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.CHANNEL_PORT_KEY) > 0 ||
+ toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.ARC_TYPE_KEY) > 0) {
+ ti = toolInfo;
+ break;
+ }
+ } else {
+ if(toolInfo.getFormattedXMLBuffer().indexOf(tool) > 0){
+ ti = toolInfo;
+ break;
+ }
}
}
@@ -521,10 +565,28 @@ aspect ToolSpecificsParser{
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
-
Document doc = dBuilder.parse(fromStringBuffer(toolInfoStringBuffer));
- doc.getDocumentElement().normalize();
- return doc;
+
+ if(tool != null && tool.equals(PnmlConstants.TOOL_SPEC_KEY)){
+ // if (doc.getDocumentElement() == null) {
+ Document newDocument = dBuilder.newDocument();
+ Element rootElement = newDocument.createElement("root");
+ newDocument.appendChild(rootElement);
+
+ org.w3c.dom.NodeList childNodes = doc.getChildNodes();
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ org.w3c.dom.Node importedNode = newDocument.importNode(childNodes.item(i), true);
+ rootElement.appendChild(importedNode);
+ }
+
+ return newDocument;
+ // }
+ } else {
+ doc.getDocumentElement().normalize();
+ return doc;
+ }
+
+ // return null;
}
private static InputStream fromStringBuffer(StringBuffer buf) {
--
GitLab