diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd index 0df16394b46f04e0db5f6015536cf3d234382595..f160349ca553b8062d4e8e825a7d91f8ae93f9ce 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd @@ -1,293 +1,146 @@ -aspect BalloonExecution { +aspect BalloonExecution{ - public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { + syn FiringSelectionSuccess TransitionSelectionResult.asFiringSelectionSuccess()=null; + eq FiringSelectionSuccess.asFiringSelectionSuccess()=this; - if(!transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) return Optional.empty(); + syn FiringSelectionWait TransitionSelectionResult.asFiringSelectionWait()=null; + eq FiringSelectionWait.asFiringSelectionWait()=this; - // synchronize marking modification to prevent concurrent modifications - synchronized(this){ + syn FiringSelectionFail TransitionSelectionResult.asFiringSelectionFail()=null; + eq FiringSelectionFail.asFiringSelectionFail()=this; - if(!this.isBalloonEnabled(transition)) return Optional.empty(); + syn boolean TransitionSelectionResult.isFiringSelectionSuccess()=false; + eq FiringSelectionSuccess.isFiringSelectionSuccess()=true; - ClauseValuesDefinition clauseValuesDefinition = new ClauseValuesDefinition(); + syn boolean TransitionSelectionResult.isFiringSelectionWait()=false; + eq FiringSelectionWait.isFiringSelectionWait()=true; - for(InputSignalBinding inputSignalBinding : transition.asInputSignalTransition().getMutualInputSignalBindingList()){ + syn boolean TransitionSelectionResult.isFiringSelectionFail()=false; + eq FiringSelectionFail.isFiringSelectionFail()=true; - boolean inputVal = inputSignalBinding.getInputSignalValue() == 1 ? true : false; - clauseValuesDefinition.addDef(inputSignalBinding.getInputSignalID(), inputVal); - } + public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, + InputSignalConnector inputSignalConnector,de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode node, boolean requireFlush) { - if((clauseValuesDefinition.getDefs().size() > 0) && - (!transition.asInputSignalTransition().getInputSignalClause().getExp().eval(clauseValuesDefinition))){ - return Optional.of(this); - } + if(!transition.asDinerosTransition().getStaticTransitionInformation().isSignalTransitionInformation()) return Optional.empty(); - List<BalloonToken> inToken=new ArrayList<>(); + // synchronize marking modification to prevent concurrent modifications + synchronized(this){ - // build set of direct / indirect incoming places and remove from them - Set<Place> incomingPlaces = transition.resolveInputPlaces(); + if(!this.isBalloonEnabled(transition)) return Optional.empty(); - // take a token from each incoming place - for(Place place:incomingPlaces){ + ClauseValuesDefinition clauseValuesDefinition = new ClauseValuesDefinition(); - BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); + for(String signalId : transition.asDinerosTransition().getStaticTransitionInformation() + .asSignalTransitionInformation().getClause().signals()){ + for(SignalConnection sc : inputSignalConnector.getSignalConnections()){ + if(signalId.equals(sc.getId())){ + clauseValuesDefinition.addDef(sc.getId(), sc.getCurrentValue()); + break; + } + } + } - Random rand=new Random(); - int randVal=rand.nextInt(bmp.getNumBalloonMarking()); - BalloonToken bt=bmp.getBalloonMarking(randVal); + if((clauseValuesDefinition.getDefs().size() > 0) && + (!transition.asDinerosTransition().getStaticTransitionInformation(). + asSignalTransitionInformation().getClause().evalClause(clauseValuesDefinition))){ + return Optional.of(this); + } - inToken.add(bt); - bmp.getBalloonMarking(randVal).removeSelf(); - } + List<BalloonToken> inToken=new ArrayList<>(); - BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition); + // build set of direct / indirect incoming places and remove from them + Set<Place> incomingPlaces = transition.resolveInputPlaces(); - BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks()); + // take a token from each incoming place + for(Place place:incomingPlaces){ - // build set of direct / indirect outgoing places and remove from them - Set<Place> outgoingPlaces = transition.resolveOutputPlaces(); + BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); - // place a token in each outgoing place - for(Place place:outgoingPlaces){ - BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); - bmp.getBalloonMarkingList().add(result); - } + Random rand=new Random(); + int randVal=rand.nextInt(bmp.getNumBalloonMarking()); + BalloonToken bt=bmp.getBalloonMarking(randVal); - if(requireFlush){ - // flush the entire marking tree - this.flushTreeCache(); - } - } + inToken.add(bt); + bmp.getBalloonMarking(randVal).removeSelf(); + } - return Optional.of(this); - } + BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition); - public Optional<BalloonMarking> BalloonMarking.fireTopicSubscriberTransition(Transition transition, BalloonToken bt, boolean requireFlush) { + BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerExecutor.execute(inToken,balloonTransition.getBalloonCallbacks()); - synchronized(this){ + // build set of direct / indirect outgoing places and remove from them + Set<Place> outgoingPlaces = transition.resolveOutputPlaces(); - // build set of direct / indirect outgoing places and remove from them - Set<Place> outgoingPlaces = transition.resolveOutputPlaces(); + // place a token in each outgoing place + for(Place place:outgoingPlaces){ + BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); + bmp.getBalloonMarkingList().add(result); + } - // place a token in each outgoing place - for(Place place : outgoingPlaces){ - BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); - bmp.getBalloonMarkingList().add(bt); - } + if(requireFlush){ + // flush the entire marking tree + this.flushTreeCache(); + } - if(requireFlush){ - // flush the entire marking tree - this.flushTreeCache(); - } - } - - return Optional.of(this); - } - - public java.lang.String BalloonMarking.fireServiceClientInputTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { - - synchronized(this){ - - if(!isBalloonEnabled(transition)){ - System.out.println("Cannon fire service client input transition" + transition.getId() + " because it is not enabled."); - return null; - } + node.notify(node.NOTIFICATION_MARKING_CHANGE); + } - BalloonToken inToken = null; + return Optional.of(this); + } - // build set of direct / indirect outgoing places and remove from them - Set<Place> incomming = transition.resolveInputPlaces(); - for(Place place : incomming){ - BalloonMarkedPlace bmp = this.resolveBalloonPlace(place); + public BalloonCallbackStorage PetriNet.initializeCallbackStorage(){ - Random rand = new Random(); - int randVal = rand.nextInt(bmp.getNumBalloonMarking()); - inToken = bmp.getBalloonMarking(randVal); + BalloonCallbackStorage storage=new BalloonCallbackStorage(); + storage.setPetriNet(this); - bmp.getBalloonMarking(randVal).removeSelf(); - } - - if(requireFlush){ - // flush the entire marking tree - this.flushTreeCache(); - } - - return inToken.getValue(); - } - } - - public Optional<BalloonMarking> BalloonMarking.fireServiceClientOutputTransition(Transition transition, BalloonCallbackStorage callbackStorage, BalloonToken bt, boolean requireFlush) { - - synchronized(this){ - - // build set of direct / indirect outgoing places and remove from them - Set<Place> outgoingPlaces = transition.resolveOutputPlaces(); - - // place a token in each outgoing place - for(Place place : outgoingPlaces){ - BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); - bmp.getBalloonMarkingList().add(bt); + for(Transition transition:allTransitions()){ + if(transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){ + BalloonTransition balloonTransition=new BalloonTransition(); + balloonTransition.setTransition(transition); + storage.addTransition(balloonTransition); + } } - if(requireFlush){ - // flush the entire marking tree - this.flushTreeCache(); - } + return storage; } - return Optional.of(this); - } - - public java.lang.String BalloonMarking.fireTopicPublisherTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { - - synchronized(this){ - - if(!isBalloonEnabled(transition)){ - System.out.println("Cannon fire publisher transition" + transition.getId() + " because it is not enabled."); - return null; - } - - BalloonToken inToken = null; - - // build set of direct / indirect outgoing places and remove from them - Set<Place> incomming = transition.resolveInputPlaces(); - - for(Place place : incomming){ - - BalloonMarkedPlace bmp = this.resolveBalloonPlace(place); - - Random rand = new Random(); - int randVal = rand.nextInt(bmp.getNumBalloonMarking()); - inToken = bmp.getBalloonMarking(randVal); - - bmp.getBalloonMarking(randVal).removeSelf(); - } - - if(requireFlush){ - // flush the entire marking tree - this.flushTreeCache(); - } + public BalloonCallbackStorage BalloonCallbackStorage.initializeSubnetCallbackStorage(List<Transition> transitions,PetriNet petriNet,boolean requireFlush){ - return inToken.getValue(); - } - } - - public Optional<BalloonMarking> BalloonMarking.fireServiceServerInputTransition(Transition transition, BalloonToken bt, boolean requireFlush) { + for(Transition newT:transitions){ - synchronized(this){ + if(newT.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){ - // build set of direct / indirect outgoing places and remove from them - Set<Place> outgoingPlaces = transition.resolveOutputPlaces(); + BalloonTransition balloonTransition=new BalloonTransition(); + balloonTransition.setTransition(newT); + this.addTransition(balloonTransition); - // place a token in each outgoing place - for(Place place : outgoingPlaces){ - BalloonMarkedPlace bmp=this.resolveBalloonPlace(place); - bmp.getBalloonMarkingList().add(bt); + for(Transition t:petriNet.allTransitions()){ + int splitIdx=newT.getId().lastIndexOf("-"); + if(t.getId().equals(newT.getId().substring(0,splitIdx))){ + balloonTransition.setBalloonCallbacks(resolveBalloonTransition(t).getBalloonCallbacks()); + } + } + } } if(requireFlush){ - // flush the entire marking tree this.flushTreeCache(); } - } - - return Optional.of(this); - } - - public java.lang.String BalloonMarking.fireServiceServerOutputTransition(Transition transition, boolean requireFlush) { - - String output = null; - - synchronized(this){ - // build set of direct / indirect outgoing places and remove from them - Set<Place> incommingPlaces = transition.resolveInputPlaces(); - - if(incommingPlaces.size() != 1){ - System.out.println("Warning: Not exactly one input place for server output transition. Choosing first input."); - } - - - // place a token in each outgoing place - for(Place place : incommingPlaces){ - - BalloonMarkedPlace bmp = this.resolveBalloonPlace(place); - - Random rand = new Random(); - int randVal = rand.nextInt(bmp.getNumBalloonMarking()); - BalloonToken bt = bmp.getBalloonMarking(randVal); - - output = bt.getValue(); - bmp.getBalloonMarking(randVal).removeSelf(); - break; - } - - if(requireFlush){ - // flush the entire marking tree - this.flushTreeCache(); - } - } - - return output; + return this; } - public BalloonCallbackStorage PetriNet.initializeCallbackStorage() { - - BalloonCallbackStorage storage = new BalloonCallbackStorage(); - storage.setPetriNet(this); - - for (Transition transition : allTransitions()){ - - if(transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) { - - BalloonTransition balloonTransition = new BalloonTransition(); - balloonTransition.setTransition(transition); - storage.addTransition(balloonTransition); - } - } - - return storage; - } - - public BalloonCallbackStorage BalloonCallbackStorage.initializeSubnetCallbackStorage(List<Transition> transitions, PetriNet petriNet, boolean requireFlush) { - - for (Transition newT : transitions){ - - if(newT.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) { + syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition)=execMap().get(transition); - BalloonTransition balloonTransition = new BalloonTransition(); - balloonTransition.setTransition(newT); - this.addTransition(balloonTransition); + syn java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap(){ - for(Transition t : petriNet.allTransitions()){ + java.util.Map<Transition, BalloonTransition> map=new java.util.HashMap<>(); - int splitIdx = newT.getId().lastIndexOf("-"); - - if(t.getId().equals(newT.getId().substring(0, splitIdx))){ - balloonTransition.setBalloonCallbacks(resolveBalloonTransition(t).getBalloonCallbacks()); - } - } + for(BalloonTransition balloonTransition:getTransitionList()){ + map.put(balloonTransition.getTransition(),balloonTransition); } + return map; } - - if(requireFlush){ - this.flushTreeCache(); - } - - return this; - } - - syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition) = execMap().get(transition); - - syn java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap() { - - java.util.Map<Transition, BalloonTransition> map = new java.util.HashMap<>(); - - for (BalloonTransition balloonTransition : getTransitionList()) { - map.put(balloonTransition.getTransition(), balloonTransition); - } - return map; - } } \ No newline at end of file diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast index 43915b349ed48beeb0dada40e1891ff743fdf4b5..7d51582b9ac026e48897e8ba46f1b70228bbb1d3 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast @@ -1,4 +1,9 @@ BalloonCallbackStorage ::= PetriNet:PetriNet Transition:BalloonTransition*; -BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionCallback>>; +BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionHandler>>; -rel BalloonTransition.Transition -> Transition; \ No newline at end of file +rel BalloonTransition.Transition -> Transition; + +abstract TransitionSelectionResult; +FiringSelectionSuccess : TransitionSelectionResult ::= Transition:Transition; +FiringSelectionWait : TransitionSelectionResult ::= <WaitingTime:int>; +FiringSelectionFail : TransitionSelectionResult; \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java index f7377927a7beb0e4bd29446cea7b967fb5e18937..f87b465f16f628d60461f16d7c5e31a67a3f5030 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java @@ -1,29 +1,8 @@ package de.tudresden.inf.st.pnml.engine; -import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper; -import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback; -import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback; -import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultNode; -import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultServer; -import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultSubscriber; -import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; -import de.tudresden.inf.st.pnml.engine.testNodes.DinerosTestClientNode; -import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer; import org.ros.node.DefaultNodeMainExecutor; import org.ros.node.NodeConfiguration; import org.ros.node.NodeMainExecutor; -import org.ros.node.topic.Publisher; -import org.xml.sax.SAXException; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -import java.net.URI; -import java.util.Map; -import java.util.concurrent.TimeUnit; public class Main { diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java similarity index 77% rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionCallback.java rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java index a1d04143afc166af8d440e899bd0d5f7412753b1..672f1cd1be7a0e83a1f04eee162a57d236464097 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionCallback.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java @@ -5,9 +5,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import java.util.ArrayList; import java.util.List; -public class DefaultFinalTransitionCallback extends TransitionCallback{ +public class DefaultFinalTransitionHandler extends TransitionCallback{ - public DefaultFinalTransitionCallback(String id, int priority) { + public DefaultFinalTransitionHandler(String id, int priority) { super(id, priority); } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java similarity index 68% rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionCallback.java rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java index 0a321751e107967041f66849a8c60cf6bfa4d9c5..4288a2fd9d034813b0c085be80d60597ff434529 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionCallback.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java @@ -4,9 +4,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken; import java.util.List; -public class DefaultTransitionCallback extends TransitionCallback{ +public class DefaultTransitionHandler extends TransitionCallback{ - public DefaultTransitionCallback(String id, int priority) { + public DefaultTransitionHandler(String id, int priority) { super(id, priority); } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java similarity index 79% rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java index 55e1fcfc4f46cf06915b85068bfac8b09fadf3af..321f8e8349bf7a621b2f6c2185c1c57aec628eae 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java @@ -8,21 +8,21 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; -public abstract class TransitionCallback{ +public abstract class TransitionHandler{ - protected static final Logger logger = LoggerFactory.getLogger(TransitionCallback.class); + protected static final Logger logger = LoggerFactory.getLogger(TransitionHandler.class); private String id; private int priority; private List<String> params = new ArrayList<>(); - public TransitionCallback(String id, int priority, List<String> params) { + public TransitionHandler(String id, int priority, List<String> params) { this.id = id; this.priority = priority; this.params.addAll(params); } - public TransitionCallback(String id, int priority) { + public TransitionHandler(String id, int priority) { this.id = id; this.priority = priority; } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackExecutor.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java similarity index 84% rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackExecutor.java rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java index 79a026b5eb4081a4a3ead051cf5c47dd180915d3..4769836f0c53fd34df1d5f97fe93aa4affe1ca13 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackExecutor.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java @@ -12,18 +12,18 @@ import java.util.List; /** * Automatically sort and call the callbacks. */ -public class TransitionCallbackExecutor { +public class TransitionHandlerExecutor { - protected static final Logger logger = LoggerFactory.getLogger(TransitionCallbackExecutor.class); + protected static final Logger logger = LoggerFactory.getLogger(TransitionHandlerExecutor.class); - public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionCallback> callbacks){ + public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionHandler> callbacks){ - List<TransitionCallback> callbacksSorted = new ArrayList<>(); + List<TransitionHandler> callbacksSorted = new ArrayList<>(); List<BalloonToken> outTokens = new ArrayList<>(); outTokens.addAll(inTokens); callbacksSorted.addAll(callbacks); - Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionCallback::getPriority)); + Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionHandler::getPriority)); for(int i = 0; i < callbacksSorted.size(); i++){ if(i < callbacksSorted.size() - 1){ diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java similarity index 73% rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java index 74897fe4dc6ac9b0cbc3dd91de7f01f4c6ef4b81..ab4c5f5c1b07e7aaa17d570b444e3b48db22866c 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java @@ -3,23 +3,24 @@ package de.tudresden.inf.st.pnml.engine.execution; import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; import de.tudresden.inf.st.pnml.jastadd.model.BalloonTransition; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; +import fr.lip6.move.pnml.ptnet.hlapi.TransitionHLAPI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -public class TransitionCallbackService { +public class TransitionHandlerService { - public static TransitionCallbackService INSTANCE = null; + public static TransitionHandlerService INSTANCE = null; private Map<String, BalloonCallbackStorage> balloonCallbackStorages = new HashMap<>(); - private TransitionCallbackService() {} + private TransitionHandlerService() {} - public static TransitionCallbackService getInstance() { + public static TransitionHandlerService getInstance() { if(INSTANCE == null) { - INSTANCE = new TransitionCallbackService(); + INSTANCE = new TransitionHandlerService(); } return INSTANCE; @@ -29,19 +30,19 @@ public class TransitionCallbackService { balloonCallbackStorages.put(petriNetId, balloonCallbackStorage); } - public void registerCallback(PetriNet petriNet, String transitionId, TransitionCallback transitionCallback){ + public void registerCallback(PetriNet petriNet, String transitionId, TransitionHandler transitionCallback){ if(balloonCallbackStorages.get(petriNet.getId()) == null){ return; } - List<TransitionCallback> transitionCallbacks = new ArrayList<>(); + List<TransitionHandler> transitionCallbacks = new ArrayList<>(); transitionCallbacks.add(transitionCallback); registerCallback(petriNet, transitionId, transitionCallbacks); } - public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionCallback> transitionCallbacks){ + public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionHandler> transitionCallbacks){ if(balloonCallbackStorages.get(petriNet.getId()) == null){ return; 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 3143ae50ade7d51743cb28a86c673fbc20264c0b..0ec7efec19f8fb1cbb7a37b76bfe7c3c516be7c4 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 @@ -23,22 +23,20 @@ import std_msgs.String; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public abstract class DiNeRosNode extends AbstractNodeMain { + public static final java.lang.String NOTIFICATION_MARKING_CHANGE = "markingChange"; + public static final java.lang.String NOTIFICATION_SIGNAL_CHANGE = "signalChange"; + public static final java.lang.String NOTIFICATION_WAIT_ENDED = "waitEnded"; + public final java.lang.String nodeName; public final PetriNet petriNet; protected BalloonMarking marking; protected BalloonCallbackStorage callbackStorage; - private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>(); - private final Map<java.lang.String, DiNeRosServer> dinerosServiceServers = new HashMap<>(); - private final Map<DinerosTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>(); - private final Map<DinerosTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> dinerosServiceClients = new HashMap<>(); protected ConnectedNode connectedNode; + protected InputSignalConnector inputSignalConnector; private boolean stopNode = false; public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet) { @@ -52,11 +50,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain { } } - public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) { + public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking, + BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) { this.nodeName = nodeName; this.petriNet = petriNet; this.marking = marking; this.callbackStorage = callbackStorage; + this.inputSignalConnector = inputSignalConnector; } private final void internalNodeLoop() { @@ -79,6 +79,26 @@ public abstract class DiNeRosNode extends AbstractNodeMain { this.connectedNode.shutdown(); } + public void notify(java.lang.String notificationType){ + + if (notificationType.equals(NOTIFICATION_MARKING_CHANGE)) { + onMarkingChange(marking.enabledBalloonTransitions()); + } else if (notificationType.equals(NOTIFICATION_SIGNAL_CHANGE)) { + onSignalChange(marking.enabledBalloonTransitions()); + } else if (notificationType.equals(NOTIFICATION_WAIT_ENDED)) { + onWaitEnded(marking.enabledBalloonTransitions()); + } + + } + + protected abstract TransitionSelectionResult onMarkingChange(Set<Transition> enabledTransitions); + + protected abstract TransitionSelectionResult onSignalChange(Set<Transition> enabledTransitions); + + protected abstract TransitionSelectionResult onWaitEnded(Set<Transition> enabledTransitions); + + protected abstract TransitionSelectionResult onStartupEnded(Set<Transition> enabledTransitions); + @Override public GraphName getDefaultNodeName() { return GraphName.of(nodeName); @@ -91,158 +111,30 @@ public abstract class DiNeRosNode extends AbstractNodeMain { System.out.println("[INIT NODE] Initializing node: " + nodeName); - // setup publishers - for (Transition t : petriNet.allTransitions()) { - if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT) - || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)) { - - final Publisher<String> publisher = connectedNode.newPublisher(t.asInputSignalTransition(). - getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE); - - dinerosPublishers.put(t.asInputSignalTransition(), publisher); - - } - } - - // setup subscribers - for (Transition t : petriNet.allTransitions()) { - if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN) - || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)) { - - Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition() - .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE); - - subscriber.addMessageListener(message -> { + // init service clients + // TODO - System.out.println("Subscriber Input: \"" + message.getData() + "\""); + // init service servers (deep copies) + // TODO - for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) { - if (entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())) { + // init publishers + // TODO - // fire input - BalloonToken bt = new BalloonToken(); - bt.setValue(message.getData()); - System.out.println("Firing topic subscriber transition."); - marking.fireTopicSubscriberTransition(t, bt, true); + // init subscribers + // TODO - // execute - entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()); + System.out.println("[INIT NODE] Executing first marking query."); + TransitionSelectionResult firstFiringResult = onStartupEnded(marking.enabledBalloonTransitions()); - // flush - petriNet.flushTreeCache(); - marking.flushTreeCache(); - callbackStorage.flushTreeCache(); - - System.out.println(marking.print()); - break; - } - } - }, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit()); - } - } - - // setup service clients - for (Transition t : petriNet.allTransitions()) { - if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN)){ - - ServiceClient<StringServiceRequest, StringServiceResponse> serviceClient; - try { - serviceClient = connectedNode.newServiceClient(t.asInputSignalTransition(). - getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE); - } catch (ServiceNotFoundException e) { - throw new RosRuntimeException(e); - } - - System.out.println("Adding new service client to " + nodeName); - getDinerosServiceClients().put(t.asInputSignalTransition(), serviceClient); - } - } - - // setup service servers - int baseInCount = 0; - - for (Transition t : petriNet.allTransitions()) { - - if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT)) { - - int inCount = baseInCount; - - System.out.println("Adding new Service Server"); - - connectedNode.newServiceServer(t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE, - (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> { - - // clone base server net - List<java.lang.String> addedElementIds = new ArrayList<>(); - InputSignalTransition serverInstanceInputTransition = ServiceTransformer.includeServerInstance(petriNet, t.asInputSignalTransition() - .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(inCount), addedElementIds); - - // init marking and callback storage - try { - marking.initializeSubnetBalloonMarking(getSubnetPlacesByIds(addedElementIds, petriNet), true); - callbackStorage.initializeSubnetCallbackStorage(getSubnetTransitionsByIds(addedElementIds, petriNet), petriNet, true); - } catch (IOException | ParserConfigurationException | SAXException e) { - e.printStackTrace(); - } - - // call bound dineros server and clean up after execution - for (Map.Entry<java.lang.String, DiNeRosServer> entry : getDinerosServiceServers().entrySet()) { - if (entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())) { - - // fire input - BalloonToken bt = new BalloonToken(); - bt.setValue(request.getInput()); - System.out.println("Firing service server input transition: " + serverInstanceInputTransition.getId()); - marking.fireServiceServerInputTransition(serverInstanceInputTransition, bt, true); - - // execute - entry.getValue().execute(marking, callbackStorage, petriNet, serverInstanceInputTransition.getStaticTransitionInformation().getSubNet()); - - // server transitions - try { - // fire response transition - for(java.lang.String id : addedElementIds){ - for(Transition tById : petriNet.allTransitions()){ - if(id.equals(tById.getId()) && tById.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation() - && tById.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_IN)){ - System.out.println("Firing service server output transition: " + id); - response.setOutput(marking.fireServiceServerOutputTransition(tById, true)); - } - } - } - - System.out.println(" -- BEFORE DEINIT --"); - System.out.println(marking.print()); - - // deinit - marking.deinitializeSubnet(getSubnetPlacesByIds(addedElementIds, petriNet), getSubnetTransitionsByIds(addedElementIds, petriNet), callbackStorage); - ServiceTransformer.removeServiceServerInstance(petriNet, addedElementIds); - - } catch (IOException | ParserConfigurationException | SAXException e) { - e.printStackTrace(); - } - - // flush - petriNet.flushTreeCache(); - marking.flushTreeCache(); - callbackStorage.flushTreeCache(); - break; - } - } - - // send error if no subnet for service - if(response.getOutput().equals("") || response.getOutput() == null) { - System.out.println("Error: No returning transition."); - response.setOutput(null); - } - }); - baseInCount++; - } + if(firstFiringResult.isFiringSelectionSuccess()){ + marking.fireTransition(firstFiringResult.asFiringSelectionSuccess() + .getTransition(), callbackStorage, inputSignalConnector, this,false); } this.internalNodeLoop(); } + public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet) { List<Transition> transitions = new ArrayList<>(); @@ -258,22 +150,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain { return transitions; } - public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() { - return dinerosSubscribers; - } - - public Map<InputSignalTransition, Publisher<std_msgs.String>> getDinerosPublishers() { - return dinerosPublishers; - } - - public Map<java.lang.String, DiNeRosServer> getDinerosServiceServers() { - return dinerosServiceServers; - } - - public Map<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> getDinerosServiceClients() { - return dinerosServiceClients; - } - public List<Place> getSubnetPlacesByIds(List<java.lang.String> ids, PetriNet petriNet) { List<Place> places = new ArrayList<>(); @@ -288,88 +164,4 @@ public abstract class DiNeRosNode extends AbstractNodeMain { return places; } - - - public BalloonMarking firePublisherTransition(InputSignalTransition transition) { - - java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true); - - if(msgString == null){ - return this.marking; - } - - for (Map.Entry<InputSignalTransition, Publisher<std_msgs.String>> entry : getDinerosPublishers().entrySet()) { - - if (transition.getId().equals(entry.getKey().getId())) { - - std_msgs.String msg = entry.getValue().newMessage(); - msg.setData(msgString); - entry.getValue().publish(msg); - } - } - - return this.marking; - } - - public BalloonMarking fireServiceClientTransition(InputSignalTransition transition){ - - java.lang.String msgString = this.marking.fireServiceClientInputTransition(transition, this.callbackStorage, true); - - if(msgString == null){ - return this.marking; - } - - for (Map.Entry<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> entry : getDinerosServiceClients().entrySet()) { - - if (transition.getId().equals(entry.getKey().getId())) { - - final StringServiceRequest request = entry.getValue().newMessage(); - request.setInput(msgString); - - entry.getValue().call(request, new ServiceResponseListener<StringServiceResponse>() { - - @Override - public void onSuccess(StringServiceResponse response) { - - // get corresponding response transition - Page channelPage = null; - - for(Page p : petriNet.allPages()){ - for(PnObject po : p.getObjectList()){ - if(po.getId().equals(transition.getId())){ - channelPage = p; - break ; - } - } - - if(channelPage != null){ - break; - } - } - - for(PnObject po : channelPage.getObjectList()){ - Transition tr = petriNet.getTransitionById(po.getId()); - if(tr != null && tr.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT)){ - - // now we have the response transition, which ist the only other transition in the - // channel on client side - BalloonToken btOut = new BalloonToken(); - btOut.setValue(response.getOutput()); - System.out.println("Firing client service response transition: " + tr.getId()); - marking.fireServiceClientOutputTransition(tr, callbackStorage, btOut, true); - - } - } - } - - @Override - public void onFailure(RemoteException e) { - throw new RosRuntimeException(e); - } - }); - } - } - - return this.marking; - } -} +} \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java index fefdd606dadebff7d4293d2cdbe50587cd10646b..7542000fb166c60e6c8e51656b6d47e91f174bf9 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java @@ -3,7 +3,7 @@ package de.tudresden.inf.st.pnml.engine.testNodes; import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage; import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking; -import de.tudresden.inf.st.pnml.jastadd.model.InputSignalTransition; +import de.tudresden.inf.st.pnml.jastadd.model.DinerosTransition; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import org.ros.concurrent.CancellableLoop; import org.ros.node.service.ServiceClient; @@ -39,11 +39,11 @@ public class DinerosTestClientNode extends DiNeRosNode { System.out.println("----- BEFORE (C) -----"); System.out.println(marking.print()); - for (Map.Entry<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> + for (Map.Entry<DinerosTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> entry : getDinerosServiceClients().entrySet()) { System.out.println("Firing service client of:" + entry.getKey().getId()); - fireServiceClientTransition(entry.getKey()); + // fireServiceClientTransition(entry.getKey()); } execOnce = true;