diff --git a/build.gradle b/build.gradle index f1fccff554c855b567cf46df42bacd48c961f93b..e32107d9d22970405636c285cfc8b905fac5b899 100644 --- a/build.gradle +++ b/build.gradle @@ -57,6 +57,8 @@ sourceSets.main.java.srcDir "src/gen/java" dependencies { implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}" + implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1' + implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30' implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.13.2' diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd index 8d4ff3c44fbc71dfa5a869422434e9fc2a350769..32df0c72edf68516c8177e871f691bb7b8999f05 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd @@ -65,13 +65,21 @@ aspect BalloonExecution{ for(Place place:incomingPlaces){ BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); + long i = Long.MAX_VALUE; + int idx = 0; + int idxC = 0; + for(BalloonToken b : bmp.getBalloonMarkingList()){ + if(b.getCreationTime() < i){ + i = b.getCreationTime(); + idx = idxC; + } + idxC++; + } - Random rand=new Random(); - int randVal=rand.nextInt(bmp.getNumBalloonMarking()); - BalloonToken bt=bmp.getBalloonMarking(randVal); + BalloonToken bt=bmp.getBalloonMarking(idx); inToken.add(bt); - bmp.getBalloonMarking(randVal).removeSelf(); + bmp.getBalloonMarking(idx).removeSelf(); } BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition); @@ -125,6 +133,7 @@ aspect BalloonExecution{ msg.setData(result.getValue()); pub.publish(msg); } else { + result.setCreationTime(System.currentTimeMillis()); bmp.getBalloonMarkingList().add(result); } } @@ -167,7 +176,7 @@ aspect BalloonExecution{ return storage; } - syn PetriNet PetriNet.registerHandler(String transitionId, int priority, Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction){ + syn PetriNet PetriNet.registerHandler(String transitionId, int priority, Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction){ TransitionHandlerService ths = TransitionHandlerService.getInstance(); ths.registerHandler(this, transitionId, priority, processTokenFunction); diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast index fdc8b845207d88599f0dc680cbf4ad8287b453cf..bb8f5022fa42b4fa8ebbda10eba863b38fc9562c 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast @@ -6,6 +6,5 @@ rel BalloonTransition.Transition -> Transition; abstract TransitionSelectionResult; FiringSelectionSuccess : TransitionSelectionResult; rel FiringSelectionSuccess.Transition -> Transition; -// FiringSelectionWait : TransitionSelectionResult ::= <WaitingTime:int>; FiringSelectionFail : TransitionSelectionResult; FiringSelectionNone : TransitionSelectionResult; \ No newline at end of file diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag index 08a9619ab0bbb443f590f9705c3bc2a42de0e580..798b5c33227a81d9f47658b07c2eb4d112c17d4c 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag +++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag @@ -51,6 +51,7 @@ aspect BalloonMarking { BalloonToken token = new BalloonToken(); token.setValue(val); + token.setCreationTime(System.currentTimeMillis()); markedPlace.getBalloonMarkingList().add(token); } diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast index 19651c537cf9167ede18637bce62ab56dd0e69c6..769c695ad6df026ce8ff9fcada1bc85c4c67e70f 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast +++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast @@ -1,5 +1,5 @@ BalloonMarking ::= PetriNet:PetriNet Place:BalloonMarkedPlace*; BalloonMarkedPlace ::= BalloonMarking:BalloonToken*; -BalloonToken ::= <Value:String>; +BalloonToken ::= <Value:String> <CreationTime:long>; rel BalloonMarkedPlace.Place -> Place; \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java index 9a5e2db76f4dc91ebf064bb191dcffad11f2ba3b..32be668b7bd75adad9d9270b7a65ea72072fad58 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java @@ -5,7 +5,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import java.util.ArrayList; import java.util.List; -public class DefaultFinalTransitionHandler extends TransitionHandler{ +public class DefaultFinalTransitionHandler extends TransitionHandler { public DefaultFinalTransitionHandler(int priority) { super(priority, null); diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java index 72ff59065349a68a5e6682de2da62a3f648ff0be..00ecd1e51713c20cffa98edf8388910b66787c05 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java @@ -4,7 +4,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import java.util.List; -public class DefaultTransitionHandler extends TransitionHandler{ +public class DefaultTransitionHandler extends TransitionHandler { public DefaultTransitionHandler(int priority) { super(priority, null); diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java index 1b757765782f94ae61ef020e3b33871f20274c39..b7af8f682441889ed8fdd3f15af49017e76ca973 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java @@ -1,10 +1,16 @@ package de.tudresden.inf.st.pnml.engine.execution; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.function.Function; @@ -14,9 +20,9 @@ public class TransitionHandler { private final String id; private final int priority; - private Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction; + protected Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction; - public TransitionHandler(int priority, Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction) { + public TransitionHandler(int priority, Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction) { this.id = UUID.randomUUID().toString(); this.priority = priority; this.processTokenFunction = processTokenFunction; @@ -30,7 +36,32 @@ public class TransitionHandler { return priority; } - public List<BalloonToken> processToken(List<BalloonToken> tokens){ - return processTokenFunction.apply(tokens); + private Map<String, Object> parseToken(String s) { + + Gson gson = new GsonBuilder().create(); + Type mapType = new TypeToken<Map<Integer, Object>>(){}.getType(); + return gson.fromJson(s, mapType); + } + + public List<BalloonToken> processToken(List<BalloonToken> tokens) { + + List<Map<String, Object>> parsedTokens = new ArrayList<>(); + List<BalloonToken> resultBalloonTokens = new ArrayList<>(); + + for (BalloonToken bt : tokens) { + Map<String, Object> t = parseToken(bt.getValue()); + parsedTokens.add(t); + } + + List<Map<String, Object>> resultTokens = processTokenFunction.apply(parsedTokens); + + for (Map<String, Object> t : resultTokens) { + BalloonToken newBt = new BalloonToken(); + Gson gson = new GsonBuilder().create(); + newBt.setValue(gson.toJson(t)); + resultBalloonTokens.add(newBt); + } + + return resultBalloonTokens; } } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java index 4769836f0c53fd34df1d5f97fe93aa4affe1ca13..2884e36637be00ed286ff60830561b6725fb1e4b 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java @@ -29,7 +29,7 @@ public class TransitionHandlerExecutor { if(i < callbacksSorted.size() - 1){ outTokens = callbacksSorted.get(i).processToken(outTokens); } else { - BalloonToken tb = callbacksSorted.get(i).processToken(outTokens).get(0); + BalloonToken tb = (BalloonToken) callbacksSorted.get(i).processToken(outTokens).get(0); outTokens = new ArrayList<>(); outTokens.add(tb); } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java index 94de023ace0bfcb5da67ced9c6b0cd034160a21e..61c171562ebde3b6d8d16931a8d33eea85224e3d 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java @@ -30,7 +30,8 @@ public class TransitionHandlerService { balloonCallbackStorages.put(petriNetId, balloonCallbackStorage); } - public void registerHandler(PetriNet petriNet, String transitionId, int priority, Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction){ + public void registerHandler(PetriNet petriNet, String transitionId, int priority, + Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction){ TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction); diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java index 4c461504e3656c36b9b74bfdf367d28ac35a64c0..ef9086e940c94506c03d56c58735133c129f36b7 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java @@ -163,7 +163,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { @Override public void onSuccess(StringServiceResponse stringServiceResponse) { bmpSource.getBalloonMarking(0).removeSelf(); - bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput())); + bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput(), System.currentTimeMillis())); } @Override @@ -302,7 +302,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { activeServerInstances.add(instanceId); Place instanceEntryPlace = petriNet.getPlaceById(channelServerResElementMap. get(resKey).get(0) + "-INSTANCE-" + instanceId); - marking.resolveBalloonPlace(instanceEntryPlace).addBalloonMarking(new BalloonToken(request.getInput())); + marking.resolveBalloonPlace(instanceEntryPlace).addBalloonMarking(new BalloonToken(request.getInput(), System.currentTimeMillis())); this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); break; }