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

base generation example

parent f3d8d222
No related branches found
No related tags found
No related merge requests found
Showing
with 522 additions and 5 deletions
plugins {
id 'java'
// General configuration (plugins, settings, dependencies)
buildscript {
repositories.mavenCentral()
}
group 'org.example'
version '1.0-SNAPSHOT'
group 'de.tudresden.inf.st'
version '0.1'
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'application'
apply plugin: "idea"
java.toolchain.languageVersion.set(JavaLanguageVersion.of(11))
repositories {
jcenter()
mavenCentral()
}
dependencies {
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3'
compile fileTree(include: ['pnml-relast-engine-fatjar-0.1.jar'], dir: './libs')
testCompile group: 'junit', name: 'junit', version: '4.12'
}
jar {
manifest {
attributes "Main-Class": "de.tudresden.inf.st.sample.Main"
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveBaseName = 'pnml-pkg-sample'
}
task fatJar(type: Jar) {
dependsOn jar
group = "build"
archiveAppendix = "fatjar"
from sourceSets.main.output
from {
configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) }
}
manifest.attributes "Main-Class": "${mainClassName}"
}
No preview for this file type
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
File added
package de.tudresden.inf.st.sample;
import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
import de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackService;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer;
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.PetriNet;
import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser;
import de.tudresden.inf.st.sample.callback.AbstractNetCallback;
import de.tudresden.inf.st.sample.callback.CallbackMapper;
import de.tudresden.inf.st.sample.communication.Node2Subscriber1;
import de.tudresden.inf.st.sample.nodes.Node1;
import de.tudresden.inf.st.sample.nodes.Node2;
import org.ros.node.DefaultNodeMainExecutor;
import org.ros.node.NodeConfiguration;
import org.ros.node.NodeMainExecutor;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <Generated>
*/
public class Main {
// actual ros / mqtt host url is inserted based on configuration
private static final String ROS_HOST = "localhost";
private static final String ROS_MASTER_URI = "http://localhost:11311";
private static final String MQTT_HOST = "localhost";
private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST);
private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault();
public static void main(java.lang.String[] args) throws IOException, ParserConfigurationException, SAXException {
/*
* <Generated>
* Petri Net base data initialization
*/
// actual petri net paths are generated
String[] petriNetPaths = {"/src/main/resources/nets/publisher-net.pnml", "/src/main/resources/nets/subscriber-net.pnml"};
List<PetriNet> petriNets = new ArrayList<>();
Map<String, BalloonMarking> markings = new HashMap<>();
Map<String, BalloonCallbackStorage> callbackStorages = new HashMap<>();
for(String petriNetPath : petriNetPaths){
petriNets.add(PnmlParser.parsePnml(petriNetPath).get(0));
}
TransitionCallbackService transitionCallbackService = TransitionCallbackService.getInstance();
for(PetriNet petriNet : petriNets){
markings.put(petriNet.getId(), petriNet.initializeBalloonMarking());
BalloonCallbackStorage storage = petriNet.initializeCallbackStorage();
transitionCallbackService.init(petriNet.getId(), storage);
callbackStorages.put(petriNet.getId(), storage);
PetriNetInitializer.initInputSignalConnections(petriNet, MQTT_HOST, "mqtt");
PetriNetInitializer.initOutputSignalConnections(petriNet, MQTT_HOST, "mqtt");
}
/*
* <Generated>
* Callback and token integration
*/
Map<String, List<AbstractNetCallback>> callbackMap1 = CallbackMapper.initCallbacksForNode1(petriNets.get(0));
for (Map.Entry<String, List<AbstractNetCallback>> entry : callbackMap1.entrySet()) {
transitionCallbackService.registerCallback(petriNets.get(0), entry.getKey(), (TransitionCallback) entry.getValue());
}
Map<String, List<AbstractNetCallback>> callbackMap2 = CallbackMapper.initCallbacksForNode2(petriNets.get(1));
for (Map.Entry<String, List<AbstractNetCallback>> entry : callbackMap2.entrySet()) {
transitionCallbackService.registerCallback(petriNets.get(1), entry.getKey(), (TransitionCallback) entry.getValue());
}
/*
* <Generated>
* Start of the Dineros NodescallbackMap1
*/
nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI));
// generated
DiNeRosNode node1 = new Node1("node1", petriNets.get(0),
markings.get(petriNets.get(0).getId()), callbackStorages.get(petriNets.get(0).getId()));
DiNeRosNode node2 = new Node2("node2", petriNets.get(1),
markings.get(petriNets.get(1).getId()), callbackStorages.get(petriNets.get(1).getId()));
/*
DiNeRosNode diNeRosNode = new DiNeRosDefaultNode("TestNode", petriNets.get(0),
markings.get(petriNets.get(0).getId()), callbackStorages.get(petriNets.get(0).getId()));
diNeRosNode.getDinerosServiceServers().put("locB", new DiNeRosDefaultServer());
*/
node2.getDinerosSubscribers().put("locB", new Node2Subscriber1());
new Thread(() -> nodeMainExecutor.execute(node1, nodeConfiguration)) {{
start();
}};
new Thread(() -> nodeMainExecutor.execute(node2, nodeConfiguration)) {{
start();
}};
}
}
package de.tudresden.inf.st.sample.balloon;
import java.util.ArrayList;
import java.util.List;
// input file provide by user
public class Token {
private String field;
private List<String> fieldList = new ArrayList<>();
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public List<String> getFieldList() {
return fieldList;
}
public void setFieldList(List<String> fieldList) {
this.fieldList = fieldList;
}
}
package de.tudresden.inf.st.sample.callback;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import de.tudresden.inf.st.sample.balloon.Token;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
// only the token class is generated, this is a static class
// this class gets extended by the user for concrete callbacks
// this class hides (de-)serialisation of the tokens
public abstract class AbstractNetCallback extends TransitionCallback {
public AbstractNetCallback(String id, int priority, List<String> params) {
super(id, priority, params);
}
public AbstractNetCallback(String id, int priority) {
super(id, priority);
}
private Token parseToken(String s) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(s, Token.class);
}
public abstract void processTokenCallback(List<Token> tokens);
@Override
public final List<BalloonToken> processToken(List<BalloonToken> tokens) {
List<Token> resultTokens = new ArrayList<>();
List<BalloonToken> resultBalloonTokens = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
for(BalloonToken bt : tokens){
try {
Token t = parseToken(bt.getValue());
resultTokens.add(t);
} catch (IOException e) {
e.printStackTrace();
}
}
processTokenCallback(resultTokens);
for(Token t : resultTokens){
BalloonToken newBt = new BalloonToken();
try {
newBt.setValue(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(t));
resultBalloonTokens.add(newBt);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
return resultBalloonTokens;
}
}
package de.tudresden.inf.st.sample.callback;
import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <Generated>
*/
public class CallbackMapper {
// methods generated for each petri net
public static final Map<String, List<AbstractNetCallback>> initCallbacksForNode1(PetriNet petriNet){
Map<String, List<AbstractNetCallback>> callbackMap = new HashMap<>();
// TODO: implementation by user
return callbackMap;
}
// methods generated for each petri net
public static final Map<String, List<AbstractNetCallback>> initCallbacksForNode2(PetriNet petriNet){
Map<String, List<AbstractNetCallback>> callbackMap = new HashMap<>();
// TODO: implementation by user
return callbackMap;
}
}
package de.tudresden.inf.st.sample.communication;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNodeUtil;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosServer;
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.PetriNet;
public abstract class AbstractDinerosServer implements DiNeRosServer {
@Override
public final boolean execute(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String s) {
boolean success = false;
// this mechanism enforces the user to leave a server instance with a clean state (see server def)
while (DiNeRosNodeUtil.hasEnabledTransition(petriNet, s, balloonMarking)) {
success = serve(balloonMarking, balloonCallbackStorage, petriNet, s);
}
return success;
}
public abstract boolean serve(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet);
}
package de.tudresden.inf.st.sample.communication;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNodeUtil;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosSubscriber;
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.PetriNet;
public abstract class AbstractDinerosSubscriber implements DiNeRosSubscriber {
public final boolean execute(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet) {
boolean success = false;
// this mechanism enforces the user to leave a server instance with a clean state (see server def)
while (DiNeRosNodeUtil.hasEnabledTransition(petriNet, subnet, balloonMarking)) {
success = subscribe(balloonMarking, balloonCallbackStorage, petriNet, subnet);
}
return success;
}
public abstract boolean subscribe(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet);
}
package de.tudresden.inf.st.sample.communication;
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.PetriNet;
public class Node2Subscriber1 extends AbstractDinerosSubscriber {
@Override
public boolean subscribe(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet) {
// TODO: Implementation by user
return false;
}
}
package de.tudresden.inf.st.sample.nodes;
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.PetriNet;
import org.ros.concurrent.CancellableLoop;
/**
* <Generated>
*/
public class Node1 extends DiNeRosNode {
public Node1(String nodeName, PetriNet petriNet) {
super(nodeName, petriNet);
}
public Node1(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
super(nodeName, petriNet, marking, callbackStorage);
}
@Override
protected void nodeLoop() {
this.connectedNode.executeCancellableLoop(new CancellableLoop() {
@Override
protected void loop() throws InterruptedException {
// TODO: Implementation by user
}
});
}
}
\ No newline at end of file
package de.tudresden.inf.st.sample.nodes;
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.PetriNet;
/**
* <Generated>
*/
public class Node2 extends DiNeRosNode {
public Node2(String nodeName, PetriNet petriNet) {
super(nodeName, petriNet);
}
public Node2(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
super(nodeName, petriNet, marking, callbackStorage);
}
}
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet">
<page id="top">
<page id="channelPage">
<place id="channelInPlace">
<name>
<text>channelInPlace</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc2</location>
<subnet>locA</subnet>
</toolspecific>
<initialMarking>
<text>0</text>
</initialMarking>
</place>
<transition id="channelTransition-publisher-0">
<name>
<text>channelTransition-publisher-0</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>loc2</location>
<type>limitedChannelOutType</type>
<subnet>locA</subnet>
<topic>sampleTopic</topic>
<inputlimit>10</inputlimit>
<outputlimit>10</outputlimit>
<inputsignalbindings/>
</toolspecific>
</transition>
<arc id="a1" source="channelInPlace" target="channelTransition-publisher-0">
</arc>
</page>
<page id="sourcePage">
<referencePlace id="rp1" ref="channelInPlace">
<name>
<text>rp1</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc2</location>
<subnet>locA</subnet>
</toolspecific>
</referencePlace>
</page>
</page>
<name>
<text>topicTest1</text>
</name>
</net>
</pnml>
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet">
<page id="top">
<page id="targetPage">
<place id="outRefPlace">
<name>
<text>outRefPlace</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
<initialMarking>
<text>0</text>
</initialMarking>
</place>
</page>
<page id="channelPage">
<transition id="channelTransition-subscriber-0">
<name>
<text>channelTransition-subscriber-0</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>loc3</location>
<type>limitedChannelInType</type>
<subnet>locB</subnet>
<topic>sampleTopic</topic>
<inputlimit>10</inputlimit>
<outputlimit>10</outputlimit>
<inputsignalbindings/>
</toolspecific>
</transition>
<referencePlace id="rp2" ref="outRefPlace">
<name>
<text>rp2</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc3</location>
<subnet>locB</subnet>
</toolspecific>
</referencePlace>
<arc id="a2" source="channelTransition-subscriber-0" target="rp2">
</arc>
</page>
</page>
<name>
<text>topicTest1</text>
</name>
</net>
</pnml>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment