diff --git a/build.gradle b/build.gradle index a93b679957abb184804226e8a8adb757fc2ba49e..4c1ac5edabe59b8118e9c9252bdb13137f901acd 100644 --- a/build.gradle +++ b/build.gradle @@ -56,7 +56,8 @@ dependencies { api group: 'fr.lip6.pnml', name: 'fr.lip6.pnml.framework.utils', version: '2.2.12' implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-api', version: '1.2.22' implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-impl', version: '1.2.22' - implementation group: 'com.thaiopensource', name: 'jing', version: '20091111' + implementation group: 'com.thaiopensourc' + + 'e', name: 'jing', version: '20091111' implementation 'org.jetbrains:annotations:19.0.0' // https://mvnrepository.com/artifact/xalan/xalan implementation group: 'xalan', name: 'xalan', version: '2.7.2' @@ -68,9 +69,9 @@ dependencies { implementation 'com.google.code.gson:gson:2.9.0' jastadd2 "org.jastadd:jastadd:2.3.4" - // relast group: 'org.jastadd', name: 'relast', version: "${relast_version}" + relast group: 'org.jastadd', name: 'relast', version: "${relast_version}" ecore files("libs/ecore2relast-0.1.jar") - relast files("libs/relast.jar") + // relast files("libs/relast.jar") testImplementation('org.junit.jupiter:junit-jupiter:5.8.2') @@ -107,7 +108,7 @@ def ecoreInputFiles = [ecoreFile] def ecoreOutputFiles = [ecoreRelastAspect, ecoreRelastGrammar] -def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast'] +def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/engine/balloonMarking/BalloonMarking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast'] def relastOutputFiles = ['src/gen/jastadd/pnml/placeTransition.ast', 'src/gen/jastadd/pnml/placeTransition.jadd'] task ecoreToRelast(type: JavaExec) { diff --git a/gradle.properties b/gradle.properties index 20d0d23d81035dbcbb94c5c4a4ce3ade419644ca..d51a5f5997f156fb8cd9c468e2804eed1477e5c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ jackson_version = 2.9.8 apache_httpcomponents_version = 4.5.8 -relast_version = 0.3.0-137 \ No newline at end of file +relast_version = 0.4.0 \ No newline at end of file diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd new file mode 100644 index 0000000000000000000000000000000000000000..a5659cabd5e7317dc27960dad697873b0b3e619a --- /dev/null +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd @@ -0,0 +1,3 @@ +aspect BalloonExecution { + +} \ No newline at end of file diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag new file mode 100644 index 0000000000000000000000000000000000000000..cee2ae35037c41356325d740308ea7674332391c --- /dev/null +++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag @@ -0,0 +1,75 @@ +aspect BalloonMarking { + + public BalloonMarking PetriNet.initialBalloonMarking(PetriNet pn) throws IOException, SAXException, ParserConfigurationException { + + BalloonMarking marking = new BalloonMarking(); + marking.setPetriNet(pn); + + for (Place place : allPlaces()) { + + BalloonMarkedPlace markedPlace = new BalloonMarkedPlace(); + markedPlace.setPlace(place); + + for(String val : de.tudresden.inf.st.pnml.engine.parsing.BalloonTokenParsing.parseBalloonPlaceMarkingToolSpecifics(place)){ + + BalloonToken token = new BalloonToken(); + token.setValue(val); + markedPlace.getBalloonMarkingList().add(token); + } + } + + return marking; + } + + syn BalloonMarkedPlace BalloonMarking.resolvePlace(Place place) = balloonPlaceMap().get(place); + + syn lazy java.util.Map<Place, BalloonMarkedPlace> BalloonMarking.balloonPlaceMap() { + + java.util.Map<Place, BalloonMarkedPlace> map = new java.util.HashMap<>(); + + for (BalloonMarkedPlace markedPlace : getPlaceList()) { + map.put(markedPlace.getPlace(), markedPlace); + } + return map; + } + + syn BalloonMarkedPlace BalloonMarking.resolvePlaceById(String placeID) { + + for (BalloonMarkedPlace markedPlace : getPlaceList()) { + if(markedPlace.getPlace().getId().equals(placeID)){ + return markedPlace; + } + } + return null; + } + + syn java.util.List<String> BalloonMarking.marking(Place place) { + + java.util.List<String> marking = new ArrayList<>(); + for(BalloonToken bt : resolvePlace(place).getBalloonMarkingList()){ + marking.add(bt.getValue()); + } + return marking; + } + + syn boolean BalloonMarking.isEnabled(Transition t) { + + for (Place place : t.incomingPlaces()) { + if (marking(place).size() == 0) return false; + } + return true; + } + + syn boolean BalloonMarking.isDead() { + + for (Transition transition : getPetriNet().allTransitions()) { + if (isEnabled(transition)) return false; + } + return true; + } + + syn java.util.Set<Transition> BalloonMarking.enabledTransitions() + = getPetriNet().allTransitions().stream() + .filter(t -> isEnabled(t)) + .collect(Collectors.toSet()); +} \ No newline at end of file diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast new file mode 100644 index 0000000000000000000000000000000000000000..19651c537cf9167ede18637bce62ab56dd0e69c6 --- /dev/null +++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast @@ -0,0 +1,5 @@ +BalloonMarking ::= PetriNet:PetriNet Place:BalloonMarkedPlace*; +BalloonMarkedPlace ::= BalloonMarking:BalloonToken*; +BalloonToken ::= <Value:String>; + +rel BalloonMarkedPlace.Place -> Place; \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonConstants.java b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..19e67db3abc04e854dee8cf4860117394b2e829a --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonConstants.java @@ -0,0 +1,9 @@ +package de.tudresden.inf.st.pnml.engine.parsing; + +public abstract class BalloonConstants { + + public static final String BALLOON_MARKING = "balloonMarking"; + public static final String BALLOON_PLACE_ID = "placeId"; + public static final String BALLOON_TOKENS = "tokens"; + public static final String BALLOON_TOKEN = "token"; +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonTokenParsing.java b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonTokenParsing.java new file mode 100644 index 0000000000000000000000000000000000000000..5bc590b7c0a3ce6815599772a12cf47a2205acba --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonTokenParsing.java @@ -0,0 +1,53 @@ +package de.tudresden.inf.st.pnml.engine.parsing; + +import de.tudresden.inf.st.pnml.jastadd.model.Place; +import de.tudresden.inf.st.pnml.jastadd.model.ToolInfo; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class BalloonTokenParsing { + + public static List<String> parseBalloonPlaceMarkingToolSpecifics(Place place) throws ParserConfigurationException, IOException, SAXException { + + List<String> marking = new ArrayList<>(); + + for (ToolInfo ti : place.getToolspecifics()) { + if (ti.getFormattedXMLBuffer().lastIndexOf(BalloonConstants.BALLOON_MARKING) == -1) { + + StringBuffer toolInfoStringBuffer = ti.getFormattedXMLBuffer(); + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + + Document doc = dBuilder.parse(fromStringBuffer(toolInfoStringBuffer)); + doc.getDocumentElement().normalize(); + + org.w3c.dom.NodeList tokensList = doc.getElementsByTagName(BalloonConstants.BALLOON_TOKENS); + + for (int i = 0; i < tokensList.getLength(); i++) { + + for (int j = 0; j < tokensList.item(i).getChildNodes().getLength(); j++) + + if (tokensList.item(i).getChildNodes().item(j).getNodeName().equals(BalloonConstants.BALLOON_TOKEN)) { + marking.add(tokensList.item(i).getChildNodes().item(j).getTextContent()); + } + } + break; + } + } + return marking; + } + + private static InputStream fromStringBuffer(StringBuffer buf) { + return new ByteArrayInputStream(buf.toString().getBytes()); + } +}