diff --git a/src/data/java/de/tudresden/inf/st/pnml/base/constants/PnmlConstants.java b/src/data/java/de/tudresden/inf/st/pnml/base/constants/PnmlConstants.java index b39aee967694c34488da386226f9679457bac465..510c863aebdcf016e57e5d893615fe55bac6a2b0 100644 --- a/src/data/java/de/tudresden/inf/st/pnml/base/constants/PnmlConstants.java +++ b/src/data/java/de/tudresden/inf/st/pnml/base/constants/PnmlConstants.java @@ -4,7 +4,6 @@ public final class PnmlConstants { // general transitions public static final String TRANSITION_TYPE_DISCRETE = "discreteTransitionType"; - public static final String TRANSITION_TYPE_CONTINUOUS = "continuousTransitionType"; // topic transitions public static final String TRANSITION_TYPE_TOPIC = "topicTransitionType"; @@ -15,9 +14,13 @@ public final class PnmlConstants { public static final String TRANSITION_TYPE_TOPIC_LIMITED_OUT = "limitedChannelOutType"; public static final String TRANSITION_TYPE_TOPIC_UNLIMITED_OUT = "unlimitedChannelOutType"; - // service transitions - public static final String TRANSITION_TYPE_SERVICE_REQUEST = "serviceTransitionTypeRequest"; - public static final String TRANSITION_TYPE_SERVICE_RESPONSE = "serviceTransitionTypeResponse"; + public static final String TRANSITION_TOPIC_PUBLISHERS_DEF_KEY = "publishers"; + public static final String TRANSITION_TOPIC_PUBLISHER_DEF_KEY = "publisher"; + public static final String TRANSITION_TOPIC_PORT_ID_DEF_KEY = "id"; + public static final String TRANSITION_TOPIC_PORT_LIMIT_DEF_KEY = "limit"; + + public static final String TRANSITION_TOPIC_SUBSCRIBERS_DEF_KEY = "subscribers"; + public static final String TRANSITION_TOPIC_SUBSCRIBER_DEF_KEY = "subscriber"; public static final String TRANSITION_TYPE_SERVICE_REQUEST_IN = "serviceTransitionRequestIn"; public static final String TRANSITION_TYPE_SERVICE_REQUEST_OUT = "serviceTransitionRequestOut"; @@ -25,17 +28,20 @@ public final class PnmlConstants { public static final String TRANSITION_TYPE_SERVICE_RESPONSE_IN = "serviceTransitionResponseIn"; public static final String TRANSITION_TYPE_SERVICE_RESPONSE_OUT = "serviceTransitionResponseOut"; - // place types - public static final String PLACE_TYPE_DISCRETE = "discretePlaceType"; - public static final String PLACE_TYPE_CONTINUOUS = "continuousPlaceType"; - // general properties public static final String NODE_KEY = "node"; public static final String TYPE_KEY = "type"; // service related keys + public static final String TRANSITION_TYPE_SERVICE = "serviceTransitionType"; public static final String SERVICE_NAME = "serviceName"; public static final String SERVICE_INSTANCE = "serviceInstance"; + public static final String TRANSITION_SERVICE_SERVER_IN_KEY = "serverInput"; + public static final String TRANSITION_SERVICE_SERVER_OUT_KEY = "serverOutput"; + public static final String TRANSITION_SERVICE_CHANNELS_KEY = "channels"; + public static final String TRANSITION_SERVICE_CHANNEL_KEY = "channel"; + public static final String TRANSITION_SERVICE_REQUEST_KEY = "request"; + public static final String TRANSITION_SERVICE_RESPONSE_KEY = "response"; // pub-sub related keys public static final String INPUT_LIMIT_KEY = "inputlimit"; @@ -53,15 +59,6 @@ public final class PnmlConstants { public static final String OUTPUT_SIGNAL_ID_KEY = "outputsignalID"; public static final String CURRENT_VALUE_KEY = "initialvalue"; - public static final String EQUAL_OS_KEY = "equal"; - public static final String RANGE_OS_KEY = "range"; - public static final String THRESHOLD_KEY = "threshold"; - - public static final String VALUE_KEY = "value"; - public static final String RESULT_KEY = "result"; - public static final String UPPER_BOUND_KEY = "upperbound"; - public static final String LOWER_BOUND_KEY = "lowerbound"; - public static final String CLAUSE_KEY = "inputsignalclause"; // structural keys @@ -75,11 +72,13 @@ public final class PnmlConstants { public static final String SERVICE_CLIENT = "serviceClient"; public static final String SERVICE_SERVER = "serviceServer"; + public static final String INPUT_SIGNALS_DEF = "inputsignals"; + public static final String INPUT_SIGNAL_DEF = "inputsignal"; + public static final String INPUT_SIGNAL_ID_DEF = "inputsignalID"; + public static final String INPUT_SIGNAL_INIT_VALUE_DEF = "initialvalue"; + // arc types public static final String ARC_TYPE_KEY = "type"; public static final String DEFAULT_ARC = "default"; public static final String INHIBITOR_ARC = "inhibitor"; - - - } diff --git a/src/main/jastadd/base/Navigation.jrag b/src/main/jastadd/base/Navigation.jrag index b2302e466dad06b9c351e612965deba82eedcd76..55d925a693cd688bb5d4ab1243b90b1663c3f720 100644 --- a/src/main/jastadd/base/Navigation.jrag +++ b/src/main/jastadd/base/Navigation.jrag @@ -99,6 +99,15 @@ aspect Navigation { syn boolean PlaceNode.isPlace() = false; eq Place.isPlace() = true; + syn PublisherPort Port.asPublisherPort() = null; + eq PublisherPort.asPublisherPort() = this; + + syn SubscriberPort Port.asSubscriberPort() = null; + eq SubscriberPort.asSubscriberPort() = this; + + syn ServiceChannel Port.asServiceChannel() = null; + eq ServiceChannel.asServiceChannel() = this; + syn RefTransition TransitionNode.asRefTransition() = null; eq RefTransition.asRefTransition() = this; diff --git a/src/main/jastadd/base/clauses/ExpressionParser.beaver b/src/main/jastadd/base/clauses/ExpressionParser.beaver index 0871d1c03fb2f0a13e8fb8af5d77ce6d23f7ebec..86cb1da18944b769aaacc4e964a09fdf7a849626 100644 --- a/src/main/jastadd/base/clauses/ExpressionParser.beaver +++ b/src/main/jastadd/base/clauses/ExpressionParser.beaver @@ -4,12 +4,14 @@ package de.tudresden.inf.st.pnml.jastadd.parser; %terminals AND; %terminals OR; %terminals NOT; +%terminals LP; +%terminals RP; %terminals VARIABLE; -%typeof goal = "expressions"; -%typeof exp = "Exp"; +%typeof goal = "conjunctions"; +%typeof conjunction = "Conjunction"; %goal goal; goal = - exp.exp {: return new Symbol(new InputSignalClause(exp)); :} + conjunction.conjunction {: return new Symbol(new InputSignalClause(conjunction)); :} ; exp = exp.a AND.AND exp.b {: return new Symbol(new AndExp(a, b)); :} @@ -18,5 +20,8 @@ exp = | NOT.NOT exp.exp {: return new Symbol(new NotExp(exp)); :} - | VARIABLE.v {: return new Symbol(new Var(((String)v.value))); :} + | NOT.NOT Literal.Literal {: return new Symbol(new NegativeLiteral(((String)v.value))); :} + + | Literal.Literal {: return new Symbol(new PositiveLiteral(((String)v.value))); :} ; + diff --git a/src/main/jastadd/base/clauses/expressions.flex b/src/main/jastadd/base/clauses/expressions.flex index e370a9ec182510da8f9559cde6235fd555e8d1de..32db549283eb6be57e00adf9941dcbdce5fd028e 100644 --- a/src/main/jastadd/base/clauses/expressions.flex +++ b/src/main/jastadd/base/clauses/expressions.flex @@ -32,8 +32,10 @@ Variable = [:jletter:][:jletterdigit:]* {WhiteSpace} { } // token definitions -"AND" { return sym(Terminals.AND); } -"OR" { return sym(Terminals.OR); } -"NOT" { return sym(Terminals.NOT); } -{Variable} { return sym(Terminals.VARIABLE); } +"AND" { return sym(Terminals.AND); } +"OR" { return sym(Terminals.OR); } +"NOT" { return sym(Terminals.NOT); } +"(" { return sym(Terminals.LP); } +")" { return sym(Terminals.RP); } +{Variable} { return sym(Terminals.VARIABLE); } <<EOF>> { return sym(Terminals.EOF); } diff --git a/src/main/jastadd/base/clauses/expressions.relast b/src/main/jastadd/base/clauses/expressions.relast index 99586c025b0639f5eee742262e0eacc4c34f853b..a1aa39b640f7d746c35723804d4d18e8ff81cb95 100644 --- a/src/main/jastadd/base/clauses/expressions.relast +++ b/src/main/jastadd/base/clauses/expressions.relast @@ -1,12 +1,8 @@ -// TODO: REWORK FOR CONJUNCTIVE NORMALFORM -InputSignalClause ::= Exp ; +InputSignalClause ::= Conjuction:Conjunction; -abstract Exp ; -abstract UnaryExp:Exp ::= Exp ; +Conjunction ::= Disjunction:Disjunction* ; +Disjunction ::= Literal:Literal*; -abstract BinExp:Exp ::= A:Exp B:Exp ; -AndExp:BinExp ; -OrExp:BinExp ; - -Var:Exp ::= <Name:String> ; -NotExp:UnaryExp ; +abstract Literal ::= <Name:String>; +PositiveLiteral : Literal; +NegativeLiteral : Literal; \ No newline at end of file diff --git a/src/main/jastadd/base/distribution/DistributedPN.jadd b/src/main/jastadd/base/distribution/DistributedPN.jadd index 19d5e8cd979f74fb668bf1a0a63f9973e6527661..ec3670335a08eea549c5b6114ba0bd72f814cb4c 100644 --- a/src/main/jastadd/base/distribution/DistributedPN.jadd +++ b/src/main/jastadd/base/distribution/DistributedPN.jadd @@ -16,7 +16,7 @@ aspect PnDistribution { syn PlaceInformation DinerosPlace.getStaticPlaceInformation() { if(!this.hasMutablePlaceInformation()){ - PlaceInformation tInfo = ToolSpecificsParser.getPlaceInformationInformation(this.getToolspecificList()); + PlaceInformation tInfo = ToolSpecificsParser.getPlaceInformation(this.getToolspecificList()); return tInfo; } @@ -47,6 +47,10 @@ aspect PnDistribution { return ToolSpecificsParser.getCommunicatorInformationFromToolSpecifics(this.getToolspecificList()); } + syn lazy Map<String, String> PetriNet.getInputSignalDefinition(){ + return ToolSpecificsParser.getInputSignalDefinitionsFromToolSpecifics(this.getToolspecificList()); + } + syn lazy CommunicatorInformation PetriNet.getCommunicatorInformation(Set<String> ignoredParts){ CommunicatorInformation cInfo = ToolSpecificsParser.getCommunicatorInformationFromToolSpecifics(this.getToolspecificList()); diff --git a/src/main/jastadd/base/export/PnmlExporter.jadd b/src/main/jastadd/base/export/PnmlExporter.jadd index e5f6747ab9f21a19abf410c6dcedb1c1b45b7e30..3d8e2aa2c6f0f6ce4e4a44f12433fe306b7d6eb0 100644 --- a/src/main/jastadd/base/export/PnmlExporter.jadd +++ b/src/main/jastadd/base/export/PnmlExporter.jadd @@ -199,7 +199,7 @@ aspect PnmlExporter{ Set<PlaceHLAPI> convertedPlaces = new HashSet<>(); for (Place p : petriNet.allPlaces()) { - PlaceHLAPI convertedPlace = PrimitiveElementsConverter.convertPlaceToPnmlObject(p.asOutputSignalPlace()); + PlaceHLAPI convertedPlace = PrimitiveElementsConverter.convertPlaceToPnmlObject(p.asDinerosPlace()); for (PageHLAPI pageHLAPI : convertedPages) { if (pageHLAPI.getId().equals(p.ContainingPage().getId())) { assert convertedPlace != null; @@ -217,7 +217,7 @@ aspect PnmlExporter{ Set<TransitionHLAPI> convertedTransitions = new HashSet<>(); for (Transition t : petriNet.allTransitions()) { - TransitionHLAPI convertedTransition = PrimitiveElementsConverter.convertTransitionToPnmlObject(t.asInputSignalTransition()); + TransitionHLAPI convertedTransition = PrimitiveElementsConverter.convertTransitionToPnmlObject(t.asDinerosTransition()); for (PageHLAPI pageHLAPI : convertedPages) { if (pageHLAPI.getId().equals(t.ContainingPage().getId())) { assert convertedTransition != null; diff --git a/src/main/jastadd/base/export/PrimitiveElementsConverter.jadd b/src/main/jastadd/base/export/PrimitiveElementsConverter.jadd index 2b618279e29f2d3435b5f834554aa30313883004..66565ef5bd0f9a13c2b56ab162e6d012e3b2a4d7 100644 --- a/src/main/jastadd/base/export/PrimitiveElementsConverter.jadd +++ b/src/main/jastadd/base/export/PrimitiveElementsConverter.jadd @@ -109,23 +109,23 @@ aspect PrimitiveElementsConverter{ return null; } - public static TransitionHLAPI convertTransitionToPnmlObject(InputSignalTransition inputSignalTransition) { + public static TransitionHLAPI convertTransitionToPnmlObject(DinerosTransition dinerosTransition) { try { - TransitionHLAPI t = new TransitionHLAPI(inputSignalTransition.getId()); + TransitionHLAPI t = new TransitionHLAPI(dinerosTransition.getId()); - t.setNameHLAPI(new NameHLAPI(inputSignalTransition.getName().getText())); + t.setNameHLAPI(new NameHLAPI(dinerosTransition.getName().getText())); - if (inputSignalTransition.getNodeGraphics() != null && inputSignalTransition.getNodeGraphics().getLine() != null - && inputSignalTransition.getNodeGraphics().getDimension() != null) { + if (dinerosTransition.getNodeGraphics() != null && dinerosTransition.getNodeGraphics().getLine() != null + && dinerosTransition.getNodeGraphics().getDimension() != null) { t.setNodegraphicsHLAPI(new NodeGraphicsHLAPI( new PositionHLAPI( - inputSignalTransition.getNodeGraphics().getPosition().getX(), inputSignalTransition.getNodeGraphics().getPosition().getY()), - new DimensionHLAPI(inputSignalTransition.getNodeGraphics().getDimension().getX(), inputSignalTransition.getNodeGraphics().getDimension().getY()), + dinerosTransition.getNodeGraphics().getPosition().getX(), dinerosTransition.getNodeGraphics().getPosition().getY()), + new DimensionHLAPI(dinerosTransition.getNodeGraphics().getDimension().getX(), dinerosTransition.getNodeGraphics().getDimension().getY()), null, null)); // TODO } - inputSignalTransition.getToolspecificList().forEach(toolInfo -> + dinerosTransition.getToolspecificList().forEach(toolInfo -> t.addToolspecificsHLAPI(new ToolInfoHLAPI(toolInfo.getTool(), toolInfo.getVersion(), clipToolSpecificsFormattedXmlBuffer(toolInfo.getTool(), toolInfo.getVersion(), toolInfo.getFormattedXMLBuffer()), toolInfo.getToolInfoGrammarURI(), null))); @@ -137,27 +137,27 @@ aspect PrimitiveElementsConverter{ return null; } - public static PlaceHLAPI convertPlaceToPnmlObject(OutputSignalPlace outputSignalPlace) { + public static PlaceHLAPI convertPlaceToPnmlObject(DinerosPlace dinerosPlace) { try { - PlaceHLAPI p = new PlaceHLAPI(outputSignalPlace.getId()); - p.setNameHLAPI(new NameHLAPI(outputSignalPlace.getName().getText())); + PlaceHLAPI p = new PlaceHLAPI(dinerosPlace.getId()); + p.setNameHLAPI(new NameHLAPI(dinerosPlace.getName().getText())); - if (outputSignalPlace.getNodeGraphics() != null && outputSignalPlace.getNodeGraphics().getLine() != null && outputSignalPlace.getNodeGraphics().getDimension() != null) { + if (dinerosPlace.getNodeGraphics() != null && dinerosPlace.getNodeGraphics().getLine() != null && dinerosPlace.getNodeGraphics().getDimension() != null) { p.setNodegraphicsHLAPI(new NodeGraphicsHLAPI( new PositionHLAPI( - outputSignalPlace.getNodeGraphics().getPosition().getX(), outputSignalPlace.getNodeGraphics().getPosition().getY()), - new DimensionHLAPI(outputSignalPlace.getNodeGraphics().getDimension().getX(), outputSignalPlace.getNodeGraphics().getDimension().getY()), + dinerosPlace.getNodeGraphics().getPosition().getX(), dinerosPlace.getNodeGraphics().getPosition().getY()), + new DimensionHLAPI(dinerosPlace.getNodeGraphics().getDimension().getX(), dinerosPlace.getNodeGraphics().getDimension().getY()), null, null)); // TODO } - outputSignalPlace.getToolspecificList().forEach(toolInfo -> + dinerosPlace.getToolspecificList().forEach(toolInfo -> p.addToolspecificsHLAPI(new ToolInfoHLAPI(toolInfo.getTool(), toolInfo.getVersion(), clipToolSpecificsFormattedXmlBuffer(toolInfo.getTool(), toolInfo.getVersion(), toolInfo.getFormattedXMLBuffer()), toolInfo.getToolInfoGrammarURI(), null))); // TODO tranfer graphics - if (outputSignalPlace.getInitialMarking() != null) { - p.setInitialMarkingHLAPI(new PTMarkingHLAPI(Long.valueOf(outputSignalPlace.getInitialMarking().getText()))); + if (dinerosPlace.getInitialMarking() != null) { + p.setInitialMarkingHLAPI(new PTMarkingHLAPI(Long.valueOf(dinerosPlace.getInitialMarking().getText()))); } else { p.setInitialMarkingHLAPI(new PTMarkingHLAPI(0L)); } diff --git a/src/main/jastadd/base/io/IoPN.relast b/src/main/jastadd/base/io/IoPN.relast index b81d10091d7d575ad042b731be6a85884ac63933..9587cc3cf7d5d9b9e33863fa2ea314e296e2da53 100644 --- a/src/main/jastadd/base/io/IoPN.relast +++ b/src/main/jastadd/base/io/IoPN.relast @@ -3,16 +3,17 @@ abstract PnObjectInformation ::= <Node:String> <SubNet:String> <Instance:String> PlaceInformation : PnObjectInformation; // Ports -TopicPort ::= <PlaceId:String> <Limit:int>; +abstract Port; +abstract TopicPort : Port ::= <PlaceId:String> <Limit:int>; SubscriberPort : TopicPort; PublisherPort : TopicPort; -ServiceChannel ::= <RequestPort:String> <ResponsePort:String>; +ServiceChannel : Port ::= <RequestPort:String> <ResponsePort:String>; // Transition Information InputSignalBinding ::= <InputSignalId:String>; abstract TransitionInformation : PnObjectInformation ::= <Type:String> InputSignal:InputSignalBinding*; -TopicTransitionInformation : TransitionInformation ::= <Topic:String> SubscriberPorts:SubscriberPort* PublisherPorts:PublisherPort*; -ServiceTransitionInformation : TransitionInformation ::= <ServiceName:String> <ServerInput:String> <ServerOutput:String> ServiceChannels:ServiceChannel*; +TopicTransitionInformation : TransitionInformation ::= <Topic:String> SubscriberPort:SubscriberPort* PublisherPort:PublisherPort*; +ServiceTransitionInformation : TransitionInformation ::= <ServiceName:String> <ServerInput:String> <ServerOutput:String> ServiceChannel:ServiceChannel*; DefaultTransitionInformation : TransitionInformation; // Elements diff --git a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd index fa83544c4c3a44db2daf7ee70354a0a4af0066f2..931d161549602888e1aba13fd46a69cdbce23503 100644 --- a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd +++ b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd @@ -1,8 +1,10 @@ import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.base.data.CommunicatorInformation; +import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.parser.ExpressionParser; import de.tudresden.inf.st.pnml.jastadd.scanner.ExpressionScanner; import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; @@ -12,6 +14,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; aspect ToolSpecificsParser{ @@ -42,6 +46,40 @@ aspect ToolSpecificsParser{ return new InputSignalClause(); } + public static Map<String, String> getInputSignalDefinitionsFromToolSpecifics(JastAddList<ToolInfo> toolInfos){ + + Map<String, String> inputSignalDefs = new HashMap<>(); + + try { + Document doc = parseToolSpecifics(toolInfos); + org.w3c.dom.NodeList sDefList = doc.getElementsByTagName(PnmlConstants.INPUT_SIGNALS_DEF); + + if (sDefList.getLength() > 0 && sDefList.item(0) != null) { + org.w3c.dom.Node sDefNode = sDefList.item(0); + + if (sDefNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { + + Element sDefsElement = (Element) sDefNode; + org.w3c.dom.NodeList sDefNodes = sDefsElement.getElementsByTagName(PnmlConstants.INPUT_SIGNAL_DEF); + + for (int i = 0; i < sDefNodes.getLength(); i++) { + + org.w3c.dom.Node isDefNode = sDefNodes.item(i); + Element isDefElement = (Element) isDefNode; + + String signalId = isDefElement.getElementsByTagName(PnmlConstants.INPUT_SIGNAL_ID_DEF).item(0).getTextContent(); + String initialValue = isDefElement.getElementsByTagName(PnmlConstants.INPUT_SIGNAL_INIT_VALUE_DEF).item(0).getTextContent(); + inputSignalDefs.put(signalId, initialValue); + } + } + } + } catch(ParserConfigurationException | SAXException | IOException e){ + logger.error(e.getMessage()); + } + + return inputSignalDefs; + } + public static CommunicatorInformation getCommunicatorInformationFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { CommunicatorInformation ci = new CommunicatorInformation(); @@ -85,15 +123,15 @@ aspect ToolSpecificsParser{ return ci; } - public static String getNodeFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { + private static String getElementByKeyFromToolSpecifics(JastAddList<ToolInfo> toolInfos, String key) { if (toolInfos.getNumChild() > 0) { try { Document doc = parseToolSpecifics(toolInfos); - org.w3c.dom.NodeList locationList = doc.getElementsByTagName(PnmlConstants.NODE_KEY); + org.w3c.dom.NodeList eList = doc.getElementsByTagName(key); - if (locationList.getLength() > 0 && locationList.item(0) != null) { - return locationList.item(0).getTextContent(); + if (eList.getLength() > 0 && eList.item(0) != null) { + return eList.item(0).getTextContent(); } } catch (ParserConfigurationException | SAXException | IOException e) { @@ -101,7 +139,23 @@ aspect ToolSpecificsParser{ } } - return ""; + return null; + } + + public static String getTransitionServiceNameFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { + return getElementByKeyFromToolSpecifics(toolInfos, PnmlConstants.SERVICE_NAME); + } + + public static String getNodeFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { + return getElementByKeyFromToolSpecifics(toolInfos, PnmlConstants.NODE_KEY); + } + + public static String getServerInputFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { + return getElementByKeyFromToolSpecifics(toolInfos, PnmlConstants.TRANSITION_SERVICE_SERVER_IN_KEY); + } + + public static String getServerOutputFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { + return getElementByKeyFromToolSpecifics(toolInfos, PnmlConstants.TRANSITION_SERVICE_SERVER_OUT_KEY); } public static String getArcTypeFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { @@ -136,9 +190,8 @@ aspect ToolSpecificsParser{ if (typeList.getLength() > 0 && typeList.item(0) != null) { String type = typeList.item(0).getTextContent(); - if (!type.equals(PnmlConstants.TRANSITION_TYPE_CONTINUOUS) || type.equals(PnmlConstants.TRANSITION_TYPE_DISCRETE) - || type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC) || !type.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST) - || !type.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE)) { + if (!type.equals(PnmlConstants.TRANSITION_TYPE_SERVICE) || type.equals(PnmlConstants.TRANSITION_TYPE_DISCRETE) + || type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC)) { return type; } else { logger.error("Error: Invalid transition type configured: " + type + "."); @@ -180,48 +233,6 @@ aspect ToolSpecificsParser{ return null; } - public static String getTransitionServiceNameFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { - - if (toolInfos.getNumChild() > 0) { - try { - Document doc = parseToolSpecifics(toolInfos); - org.w3c.dom.NodeList typeList = doc.getElementsByTagName(PnmlConstants.SERVICE_NAME); - - if (typeList.getLength() > 0 && typeList.item(0) != null) { - - String type = typeList.item(0).getTextContent(); - if (!type.equals("") && type != null) { - return type; - } - } - } catch (ParserConfigurationException | SAXException | IOException e) { - logger.error(e.getMessage()); - } - } - return null; - } - - private static String getPlaceTypeFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { - - if (toolInfos.getNumChild() > 0) { - try { - Document doc = parseToolSpecifics(toolInfos); - org.w3c.dom.NodeList typeList = doc.getElementsByTagName(PnmlConstants.TYPE_KEY); - - if (typeList.getLength() > 0 && typeList.item(0) != null) { - String type = typeList.item(0).getTextContent(); - if (type.equals(PnmlConstants.PLACE_TYPE_DISCRETE) || type.equals(PnmlConstants.PLACE_TYPE_CONTINUOUS)) { - return type; - } - } - - } catch (ParserConfigurationException | SAXException | IOException e) { - logger.error(e.getMessage()); - } - } - return null; - } - public static String getSubnetFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { return getSubnetInfoInternal(toolInfos); } @@ -231,21 +242,12 @@ aspect ToolSpecificsParser{ if (toolInfos.getNumChild() > 0) { try { Document doc = parseToolSpecifics(toolInfos); - // String typeTrans = getTransitionTypeFromToolSpecifics(toolInfos); - // String typePlace = getPlaceTypeFromToolSpecifics(toolInfos); - - // String type = typePlace == null ? typeTrans : typePlace; - - // if (type != null && (type.equals(PnmlConstants.TRANSITION_TYPE_DISCRETE) - // || type.equals(PnmlConstants.PLACE_TYPE_CONTINUOUS) || type.equals(PnmlConstants.PLACE_TYPE_CONTINUOUS) - // || type.equals(PnmlConstants.PLACE_TYPE_DISCRETE) || type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC))) { org.w3c.dom.NodeList snList = doc.getElementsByTagName(PnmlConstants.SUBNET_KEY); if (snList.getLength() > 0 && snList.item(0) != null) { return snList.item(0).getTextContent(); } - // } } catch (ParserConfigurationException | SAXException | IOException e) { logger.error(e.getMessage()); } @@ -294,62 +296,129 @@ aspect ToolSpecificsParser{ return getTransitionLimitsInternal(toolInfos, PnmlConstants.INPUT_LIMIT_KEY); } + private static JastAddList<Port> getPorts(JastAddList<ToolInfo> toolInfos, + String listKey, String elemKey, + String portField1Key, String portField2Key){ + + JastAddList<Port> ports = new JastAddList<>(); + + try { + Document doc = parseToolSpecifics(toolInfos); + + org.w3c.dom.NodeList pDefList = doc.getElementsByTagName(listKey); + + if (pDefList.getLength() > 0 && pDefList.item(0) != null) { + + org.w3c.dom.Node psDefNode = pDefList.item(0); + + if (psDefNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { + + Element pDefsElement = (Element) psDefNode; + + org.w3c.dom.NodeList pDefNodes = pDefsElement.getElementsByTagName(elemKey); + + for (int i = 0; i < pDefNodes.getLength(); i++) { + + org.w3c.dom.Node pDefNode = pDefNodes.item(i); + Element pDefElement = (Element) pDefNode; + + String portField1 = pDefElement.getElementsByTagName(portField1Key).item(0).getTextContent(); + String portField2 = pDefElement.getElementsByTagName(portField2Key).item(0).getTextContent(); + + if(listKey.equals(PnmlConstants.TRANSITION_TOPIC_PUBLISHERS_DEF_KEY)){ + PublisherPort pp = new PublisherPort(); + pp.setPlaceId(portField1); + pp.setLimit(Integer.parseInt(portField2)); + ports.add(pp); + } + if(listKey.equals(PnmlConstants.TRANSITION_TOPIC_SUBSCRIBERS_DEF_KEY)){ + SubscriberPort sp = new SubscriberPort(); + sp.setPlaceId(portField1); + sp.setLimit(Integer.parseInt(portField2)); + ports.add(sp); + } + if(listKey.equals(PnmlConstants.TRANSITION_SERVICE_CHANNELS_KEY)){ + ServiceChannel sc = new ServiceChannel(); + sc.setRequestPort(portField1); + sc.setRequestPort(portField2); + ports.add(sc); + } + } + } + } + } catch(ParserConfigurationException | SAXException | IOException e){ + logger.error(e.getMessage()); + } + + return ports; + } + public static TransitionInformation getTransitionInformation(JastAddList<ToolInfo> toolInfos) { if (getTransitionTopicFromToolSpecifics(toolInfos) != null) { TopicTransitionInformation topicTransition = new TopicTransitionInformation(); - topicTransition.setInputLimit(getTransitionInputLimit(toolInfos)); - topicTransition.setOutputLimit(getTransitionOutputLimit(toolInfos)); - topicTransition.setLocation(getLocationFromToolSpecifics(toolInfos)); + topicTransition.setNode(getNodeFromToolSpecifics(toolInfos)); topicTransition.setType(getTransitionTypeFromToolSpecifics(toolInfos)); topicTransition.setTopic(getTransitionTopicFromToolSpecifics(toolInfos)); topicTransition.setSubNet(getTransitionSubnetInfo(toolInfos)); + + JastAddList<Port> pubPorts = getPorts(toolInfos, + PnmlConstants.TRANSITION_TOPIC_PUBLISHERS_DEF_KEY, + PnmlConstants.TRANSITION_TOPIC_PUBLISHER_DEF_KEY, + PnmlConstants.TRANSITION_TOPIC_PORT_ID_DEF_KEY, + PnmlConstants.TRANSITION_TOPIC_PORT_LIMIT_DEF_KEY); + for(Port p : pubPorts){ + topicTransition.addPublisherPort(p.asPublisherPort()); + } + + JastAddList<Port> subPorts = getPorts(toolInfos, + PnmlConstants.TRANSITION_TOPIC_SUBSCRIBERS_DEF_KEY, + PnmlConstants.TRANSITION_TOPIC_SUBSCRIBER_DEF_KEY, + PnmlConstants.TRANSITION_TOPIC_PORT_ID_DEF_KEY, + PnmlConstants.TRANSITION_TOPIC_PORT_LIMIT_DEF_KEY); + for(Port s : subPorts){ + topicTransition.addSubscriberPort(s.asSubscriberPort()); + } + return topicTransition; } if (getTransitionServiceNameFromToolSpecifics(toolInfos) != null) { ServiceTransitionInformation serviceTransition = new ServiceTransitionInformation(); - serviceTransition.setInputLimit(getTransitionInputLimit(toolInfos)); - serviceTransition.setOutputLimit(getTransitionOutputLimit(toolInfos)); - serviceTransition.setLocation(getLocationFromToolSpecifics(toolInfos)); + serviceTransition.setNode(getNodeFromToolSpecifics(toolInfos)); serviceTransition.setType(getTransitionTypeFromToolSpecifics(toolInfos)); serviceTransition.setServiceName(getTransitionServiceNameFromToolSpecifics(toolInfos)); serviceTransition.setSubNet(getTransitionSubnetInfo(toolInfos)); + + JastAddList<Port> servicePorts = getPorts(toolInfos, + PnmlConstants.TRANSITION_SERVICE_CHANNELS_KEY, + PnmlConstants.TRANSITION_SERVICE_CHANNEL_KEY, + PnmlConstants.TRANSITION_SERVICE_REQUEST_KEY, + PnmlConstants.TRANSITION_SERVICE_RESPONSE_KEY); + for(Port s : servicePorts){ + serviceTransition.addServiceChannel(s.asServiceChannel()); + } + return serviceTransition; } DefaultTransitionInformation transitionInformation = new DefaultTransitionInformation(); - transitionInformation.setInputLimit(getTransitionInputLimit(toolInfos)); - transitionInformation.setOutputLimit(getTransitionOutputLimit(toolInfos)); - transitionInformation.setLocation(getLocationFromToolSpecifics(toolInfos)); + transitionInformation.setNode(getNodeFromToolSpecifics(toolInfos)); transitionInformation.setType(getTransitionTypeFromToolSpecifics(toolInfos)); transitionInformation.setSubNet(getTransitionSubnetInfo(toolInfos)); return transitionInformation; } - public static PlaceInformation getPlaceInformationInformation(JastAddList<ToolInfo> toolInfos) { + public static PlaceInformation getPlaceInformation(JastAddList<ToolInfo> toolInfos) { PlaceInformation placeInformation = new PlaceInformation(); - - placeInformation.setLocation(getLocationFromToolSpecifics(toolInfos)); - placeInformation.setType(getPlaceTypeFromToolSpecifics(toolInfos)); - String sn = getPlaceSubnetInfo(toolInfos); - placeInformation.setSubNet(sn); + placeInformation.setNode(getNodeFromToolSpecifics(toolInfos)); + placeInformation.setSubNet(getPlaceSubnetInfo(toolInfos)); return placeInformation; } - public static PlaceInformation getPlaceInformation(JastAddList<ToolInfo> toolInfos) { - - PlaceInformation pi = new PlaceInformation(); - pi.setLocation(getLocationFromToolSpecifics(toolInfos)); - pi.setSubNet(getPlaceSubnetInfo(toolInfos)); - pi.setType(getPlaceTypeFromToolSpecifics(toolInfos)); - - return pi; - } - private static Document parseToolSpecifics(JastAddList<ToolInfo> toolInfos) throws ParserConfigurationException, SAXException, IOException { ToolInfo ti = null; @@ -357,6 +426,7 @@ aspect ToolSpecificsParser{ for (ToolInfo toolInfo : toolInfos) { if (toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.SUBNET_KEY) > 0 || toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.COMMUNICATOR) > 0 || + toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.TYPE_KEY) > 0 || toolInfo.getFormattedXMLBuffer().indexOf(PnmlConstants.ARC_TYPE_KEY) > 0) { ti = toolInfo; break; diff --git a/src/main/java/de/tudresden/inf/st/pnml/base/Main.java b/src/main/java/de/tudresden/inf/st/pnml/base/Main.java index 38ba672e8bd747c68af8935d6fcdc4c4256d1897..23cccf20c741542b4804494ba33f503e1a382670 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/base/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/base/Main.java @@ -4,11 +4,8 @@ public class Main { public static void main(String[] args) { - // Nothing to to here + // Nothing to do here // TODO: update clauses - // TODO: fix parsing - // TODO: fix export - // TODO: read input signal defs (net level) } }