Skip to content
Snippets Groups Projects
Commit 9d742013 authored by Sebastian Ebert's avatar Sebastian Ebert
Browse files

changed to gson, added time-based semantics

parent ebae2f8c
No related branches found
No related tags found
No related merge requests found
Showing
with 60 additions and 17 deletions
...@@ -57,6 +57,8 @@ sourceSets.main.java.srcDir "src/gen/java" ...@@ -57,6 +57,8 @@ sourceSets.main.java.srcDir "src/gen/java"
dependencies { dependencies {
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}" 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: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30' 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' implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.13.2'
......
...@@ -65,13 +65,21 @@ aspect BalloonExecution{ ...@@ -65,13 +65,21 @@ aspect BalloonExecution{
for(Place place:incomingPlaces){ for(Place place:incomingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); 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(); BalloonToken bt=bmp.getBalloonMarking(idx);
int randVal=rand.nextInt(bmp.getNumBalloonMarking());
BalloonToken bt=bmp.getBalloonMarking(randVal);
inToken.add(bt); inToken.add(bt);
bmp.getBalloonMarking(randVal).removeSelf(); bmp.getBalloonMarking(idx).removeSelf();
} }
BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition); BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
...@@ -125,6 +133,7 @@ aspect BalloonExecution{ ...@@ -125,6 +133,7 @@ aspect BalloonExecution{
msg.setData(result.getValue()); msg.setData(result.getValue());
pub.publish(msg); pub.publish(msg);
} else { } else {
result.setCreationTime(System.currentTimeMillis());
bmp.getBalloonMarkingList().add(result); bmp.getBalloonMarkingList().add(result);
} }
} }
...@@ -167,7 +176,7 @@ aspect BalloonExecution{ ...@@ -167,7 +176,7 @@ aspect BalloonExecution{
return storage; 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(); TransitionHandlerService ths = TransitionHandlerService.getInstance();
ths.registerHandler(this, transitionId, priority, processTokenFunction); ths.registerHandler(this, transitionId, priority, processTokenFunction);
......
...@@ -6,6 +6,5 @@ rel BalloonTransition.Transition -> Transition; ...@@ -6,6 +6,5 @@ rel BalloonTransition.Transition -> Transition;
abstract TransitionSelectionResult; abstract TransitionSelectionResult;
FiringSelectionSuccess : TransitionSelectionResult; FiringSelectionSuccess : TransitionSelectionResult;
rel FiringSelectionSuccess.Transition -> Transition; rel FiringSelectionSuccess.Transition -> Transition;
// FiringSelectionWait : TransitionSelectionResult ::= <WaitingTime:int>;
FiringSelectionFail : TransitionSelectionResult; FiringSelectionFail : TransitionSelectionResult;
FiringSelectionNone : TransitionSelectionResult; FiringSelectionNone : TransitionSelectionResult;
\ No newline at end of file
...@@ -51,6 +51,7 @@ aspect BalloonMarking { ...@@ -51,6 +51,7 @@ aspect BalloonMarking {
BalloonToken token = new BalloonToken(); BalloonToken token = new BalloonToken();
token.setValue(val); token.setValue(val);
token.setCreationTime(System.currentTimeMillis());
markedPlace.getBalloonMarkingList().add(token); markedPlace.getBalloonMarkingList().add(token);
} }
......
BalloonMarking ::= PetriNet:PetriNet Place:BalloonMarkedPlace*; BalloonMarking ::= PetriNet:PetriNet Place:BalloonMarkedPlace*;
BalloonMarkedPlace ::= BalloonMarking:BalloonToken*; BalloonMarkedPlace ::= BalloonMarking:BalloonToken*;
BalloonToken ::= <Value:String>; BalloonToken ::= <Value:String> <CreationTime:long>;
rel BalloonMarkedPlace.Place -> Place; rel BalloonMarkedPlace.Place -> Place;
\ No newline at end of file
package de.tudresden.inf.st.pnml.engine.execution; 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 de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.function.Function; import java.util.function.Function;
...@@ -14,9 +20,9 @@ public class TransitionHandler { ...@@ -14,9 +20,9 @@ public class TransitionHandler {
private final String id; private final String id;
private final int priority; 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.id = UUID.randomUUID().toString();
this.priority = priority; this.priority = priority;
this.processTokenFunction = processTokenFunction; this.processTokenFunction = processTokenFunction;
...@@ -30,7 +36,32 @@ public class TransitionHandler { ...@@ -30,7 +36,32 @@ public class TransitionHandler {
return priority; return priority;
} }
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) { public List<BalloonToken> processToken(List<BalloonToken> tokens) {
return processTokenFunction.apply(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;
} }
} }
...@@ -29,7 +29,7 @@ public class TransitionHandlerExecutor { ...@@ -29,7 +29,7 @@ public class TransitionHandlerExecutor {
if(i < callbacksSorted.size() - 1){ if(i < callbacksSorted.size() - 1){
outTokens = callbacksSorted.get(i).processToken(outTokens); outTokens = callbacksSorted.get(i).processToken(outTokens);
} else { } else {
BalloonToken tb = callbacksSorted.get(i).processToken(outTokens).get(0); BalloonToken tb = (BalloonToken) callbacksSorted.get(i).processToken(outTokens).get(0);
outTokens = new ArrayList<>(); outTokens = new ArrayList<>();
outTokens.add(tb); outTokens.add(tb);
} }
......
...@@ -30,7 +30,8 @@ public class TransitionHandlerService { ...@@ -30,7 +30,8 @@ public class TransitionHandlerService {
balloonCallbackStorages.put(petriNetId, balloonCallbackStorage); 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); TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction);
......
...@@ -163,7 +163,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -163,7 +163,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
@Override @Override
public void onSuccess(StringServiceResponse stringServiceResponse) { public void onSuccess(StringServiceResponse stringServiceResponse) {
bmpSource.getBalloonMarking(0).removeSelf(); bmpSource.getBalloonMarking(0).removeSelf();
bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput())); bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput(), System.currentTimeMillis()));
} }
@Override @Override
...@@ -302,7 +302,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -302,7 +302,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
activeServerInstances.add(instanceId); activeServerInstances.add(instanceId);
Place instanceEntryPlace = petriNet.getPlaceById(channelServerResElementMap. Place instanceEntryPlace = petriNet.getPlaceById(channelServerResElementMap.
get(resKey).get(0) + "-INSTANCE-" + instanceId); 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)); this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
break; break;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment