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

implemented service instance and topic channel flattening based on new transforms-pattern

parent 6ad97da6
No related branches found
No related tags found
No related merge requests found
Showing
with 223 additions and 141 deletions
...@@ -17,8 +17,15 @@ apply plugin: "idea" ...@@ -17,8 +17,15 @@ apply plugin: "idea"
apply from: 'beaver.gradle' apply from: 'beaver.gradle'
sourceCompatibility = 1.8 //sourceCompatibility = 1.8
targetCompatibility = 1.8 //targetCompatibility = 1.8
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
}
}
repositories { repositories {
jcenter() jcenter()
...@@ -77,6 +84,7 @@ dependencies { ...@@ -77,6 +84,7 @@ dependencies {
testImplementation('org.junit.jupiter:junit-jupiter:5.8.2') testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: '3.0.1'
} }
run { run {
...@@ -202,7 +210,7 @@ jastadd { ...@@ -202,7 +210,7 @@ jastadd {
parser.genDir = "src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser" parser.genDir = "src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser"
// default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false' // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
extraJastAddOptions = ['--List=JastAddList'] // '--incremental=param' extraJastAddOptions = ['--List=JastAddList', '--rewrite=cnta', '--visitCheck=true', '--safeLazy'] // '--incremental=param'
} }
// Workflow configuration for phases // Workflow configuration for phases
......
aspect ServiceRewrites {
syn boolean PetriNet.hasServerPrototypePages() {
for(Page p : this.allPages()){
if(p.getType().equals(PnmlConstants.PAGE_TYPE_SERVER)){
return false;
}
}
return true;
}
rewrite Page {
when ( getType() != null && getType().equals(PnmlConstants.PAGE_TYPE_SERVER) && !getId().endsWith(PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX) )
to Page {
int serverCapacity = 0;
String serviceName = this.getServiceName();
DinerosTransition serviceTransition = null;
for(DinerosTransition dt : petriNet().allDinerosTransitions()){
if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
serverCapacity = dt.getStaticTransitionInformation().asServiceTransitionInformation().getServerChannel().getCapacity();
}
if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
if(dt.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName().equals(serviceName)){
serviceTransition = dt;
}
}
if(serverCapacity != 0 && serviceTransition != null){
break;
}
}
de.tudresden.inf.st.pnml.flatter.transform.ToolspecificsTransformer
.updateTransitionToolspecifics(petriNet(), serverCapacity, this);
Page containerPage = new Page();
containerPage.setId(this.getId() + "-" + PnmlConstants.PAGE_SERVER_CONTAINER_SUFFIX);
for( int i = 0; i < serverCapacity; i++){
Page serverInstancePage = this.treeCopyNoTransform();
serverInstancePage.setId(serverInstancePage.getId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX);
for(PnObject pnObject : serverInstancePage.getObjectList()){
pnObject.setId(pnObject.getId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX);
pnObject.getName().setText(pnObject.getId());
}
containerPage.addObject(serverInstancePage);
}
return containerPage;
}
}
}
\ No newline at end of file
aspect SignalRewrites {
}
\ No newline at end of file
import de.tudresden.inf.st.pnml.flatter.transform.*;
aspect ServicePrototypeTransforms {
syn boolean Page.canTransformPrototypePage(){
return (( getType() !=null )
&& (getType().equals(PnmlConstants.PAGE_TYPE_SERVER))
&& (!getId().endsWith(PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX)));
}
syn Page Page.transformPrototypePage() {
int serverCapacity = 0;
String serviceName = this.getServiceName();
DinerosTransition serviceTransition = null;
for(DinerosTransition dt : petriNet().allDinerosTransitions()){
if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
serverCapacity = dt.getStaticTransitionInformation().asServiceTransitionInformation().getServerChannel().getCapacity();
}
if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
if(dt.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName().equals(serviceName)){
serviceTransition = dt;
}
}
if(serverCapacity != 0 && serviceTransition != null){
break;
}
}
ToolspecificsTransformer.updateTransitionToolspecifics(petriNet(), serverCapacity, this);
Page containerPage = new Page();
containerPage.setId(this.getId() + "-" + PnmlConstants.PAGE_SERVER_CONTAINER_SUFFIX);
for( int i = 0; i < serverCapacity; i++){
Page serverInstancePage = this.treeCopyNoTransform();
serverInstancePage.setId(serverInstancePage.getId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX);
for(PnObject pnObject : serverInstancePage.getObjectList()){
pnObject.setId(pnObject.getId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX);
pnObject.getName().setText(pnObject.getId());
}
containerPage.addObject(serverInstancePage);
}
return containerPage;
}
}
\ No newline at end of file
import de.tudresden.inf.st.pnml.flatter.template.*; import de.tudresden.inf.st.pnml.flatter.template.*;
import de.tudresden.inf.st.pnml.flatter.transform.*; import de.tudresden.inf.st.pnml.flatter.transform.*;
aspect TopicRewrites { aspect TopicTransforms {
rewrite DinerosTransition { syn boolean DinerosTransition.canTransformTopicTransition() {
when ( !petriNet().hasServerPrototypePages() && getStaticTransitionInformation().isTopicTransitionInformation() ) return this.getStaticTransitionInformation().isTopicTransitionInformation();
to Page { }
Page res = new Page(); syn Page DinerosTransition.transformTopicElement() {
System.out.println("Transforming topic transition: " + this.getId());
TopicTransitionInformation tti = this.getStaticTransitionInformation().asTopicTransitionInformation(); TopicTransitionInformation tti = this.getStaticTransitionInformation().asTopicTransitionInformation();
Page res = new Page();
res.setId(TemplateConstants.CHANNEL_TOPIC_PAGE_PREFIX + "-" + tti.getTopic());
// apply rule T1 // apply rule T1
DinerosPlace pTopic = PrimitiveTemplates.getDinerosPlace(); DinerosPlace pTopic = PrimitiveTemplates.getDinerosPlace();
pTopic.setId(TemplateConstants.CHANNEL_TOPIC_PLACE + "-" + tti.getTopic()); pTopic.setId(TemplateConstants.CHANNEL_TOPIC_PLACE + "-" + tti.getTopic());
...@@ -43,7 +48,7 @@ aspect TopicRewrites { ...@@ -43,7 +48,7 @@ aspect TopicRewrites {
Map<String, Node> pubMap = new HashMap<>(); Map<String, Node> pubMap = new HashMap<>();
pubMap.put(TemplateConstants.PLACE_TOPIC_PUBLISHER_REF + "-" + tti.getTopic() + "-" + i, petriNet().getPlaceById(pp.getPlaceId())); pubMap.put(TemplateConstants.PLACE_TOPIC_PUBLISHER_REF + "-" + tti.getTopic() + "-" + i, petriNet().getPlaceById(pp.getPlaceId()));
pubMap.put(TemplateConstants.PLACE_TOPIC_PUBLISHER_CHANNEL_REF + "-" + tti.getTopic() + "-" + i, pTopic); pubMap.put(TemplateConstants.PLACE_TOPIC_PUBLISHER_CHANNEL_REF + "-" + tti.getTopic() + "-" + i, pTopic);
PetriNet pubNet = TopicTemplates.getTopicPublisherPetriNet("-" + tti.getTopic() + "-" + i, pp.getLimit()); PetriNet pubNet = TopicTemplates.getTopicPublisherPetriNet(tti.getTopic() + "-" + i, pp.getLimit());
TransformationUtils.includeTemplateInstance(res, petriNet(), pubNet, "channel", "channel", pubMap); TransformationUtils.includeTemplateInstance(res, petriNet(), pubNet, "channel", "channel", pubMap);
i++; i++;
} }
...@@ -68,7 +73,7 @@ aspect TopicRewrites { ...@@ -68,7 +73,7 @@ aspect TopicRewrites {
dispatchMap.put(TemplateConstants.TRANSITION_TOPIC_DISPATCHER_CHANNEL_REF + "-" + tti.getTopic() + "-" + j, tTopic); dispatchMap.put(TemplateConstants.TRANSITION_TOPIC_DISPATCHER_CHANNEL_REF + "-" + tti.getTopic() + "-" + j, tTopic);
// TODO: make capacity configurable // TODO: make capacity configurable
PetriNet dispatchNet = TopicTemplates.getTopicDispatcherPetriNet(tti.getTopic() + "-" + j, 16); PetriNet dispatchNet = TopicTemplates.getTopicDispatcherPetriNet(tti.getTopic() + "-" + j, 16);
TransformationUtils.includeTemplateInstance(res, petriNet(), dispatchNet, "channel", "channel", dispatchMap); Map<String, PnObject> addedObjects = TransformationUtils.includeTemplateInstance(res, petriNet(), dispatchNet, "channel", "channel", dispatchMap);
// apply rule T4 // apply rule T4
int k = 0; int k = 0;
...@@ -76,7 +81,7 @@ aspect TopicRewrites { ...@@ -76,7 +81,7 @@ aspect TopicRewrites {
Map<String, Node> subMap = new HashMap<>(); Map<String, Node> subMap = new HashMap<>();
subMap.put(TemplateConstants.PLACE_TOPIC_CALLBACK_REF + "-" + tti.getTopic() + "-" + j + "-" + k, petriNet().getPlaceById(sp.getPlaceId())); subMap.put(TemplateConstants.PLACE_TOPIC_CALLBACK_REF + "-" + tti.getTopic() + "-" + j + "-" + k, petriNet().getPlaceById(sp.getPlaceId()));
subMap.put(TemplateConstants.TRANSITION_TOPIC_CALLBACK_INPUT_REF + "-" + tti.getTopic() + "-" + j + "-" + k, subMap.put(TemplateConstants.TRANSITION_TOPIC_CALLBACK_INPUT_REF + "-" + tti.getTopic() + "-" + j + "-" + k,
petriNet().getPlaceById(TemplateConstants.DISPATCHER_OUTPUT_TRANSITION + "-" + tti.getTopic() + "-" + j)); addedObjects.get(TemplateConstants.DISPATCHER_OUTPUT_TRANSITION + "-" + tti.getTopic() + "-" + j).asNode());
PetriNet callbackNet = TopicTemplates.getTopicCallbackQueuePetriNet(tti.getTopic() + "-" + j + "-" + k, sp.getLimit()); PetriNet callbackNet = TopicTemplates.getTopicCallbackQueuePetriNet(tti.getTopic() + "-" + j + "-" + k, sp.getLimit());
TransformationUtils.includeTemplateInstance(res, petriNet(), callbackNet, "channel", "channel", subMap); TransformationUtils.includeTemplateInstance(res, petriNet(), callbackNet, "channel", "channel", subMap);
k++; k++;
...@@ -86,4 +91,3 @@ aspect TopicRewrites { ...@@ -86,4 +91,3 @@ aspect TopicRewrites {
return res; return res;
} }
} }
\ No newline at end of file
}
\ No newline at end of file
package de.tudresden.inf.st.pnml.flatter; package de.tudresden.inf.st.pnml.flatter;
import de.tudresden.inf.st.jastadd.dumpAst.ast.DumpBuilder;
import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
import de.tudresden.inf.st.jastadd.dumpAst.ast.SkinParamBooleanSetting;
import de.tudresden.inf.st.jastadd.dumpAst.ast.TransformationException;
import de.tudresden.inf.st.pnml.flatter.config.ConfigReader; import de.tudresden.inf.st.pnml.flatter.config.ConfigReader;
import de.tudresden.inf.st.pnml.flatter.tina.KtzioProxy; import de.tudresden.inf.st.pnml.flatter.tina.KtzioProxy;
import de.tudresden.inf.st.pnml.flatter.tina.SiftProxy; import de.tudresden.inf.st.pnml.flatter.tina.SiftProxy;
import de.tudresden.inf.st.pnml.flatter.tina.TinaProxy; import de.tudresden.inf.st.pnml.flatter.tina.TinaProxy;
import de.tudresden.inf.st.pnml.flatter.transform.TransformationUtils;
import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.model.*;
import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser;
import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
...@@ -11,26 +16,57 @@ import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; ...@@ -11,26 +16,57 @@ import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy; import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy;
import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
import java.awt.*;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.UUID; import java.util.UUID;
public class Main { public class Main {
public static void main(String[] args) throws IOException, InvalidIDException, InterruptedException { public static void main(String[] args) throws IOException, InvalidIDException, TransformationException {
/* String configPath = (args.length > 1) ? args[1] : null; String configPath = (args.length > 1) ? args[1] : null;
String pnmlPath = (args.length > 0) ? args[0] : null; String pnmlPath = (args.length > 0) ? args[0] : null;
/*
if (pnmlPath == null || configPath == null) { if (pnmlPath == null || configPath == null) {
System.out.println("No model found on given input path."); System.out.println("No model found on given input path.");
return; return;
}*/ }*/
// parse the global not flatted petri net // parse the global not flatted petri net
String pnmlPath = "/home/sebastian/git/dineros/dineros-v2/dineros/pnml-relast-base/src/main/resources/nets/TestNet2.pnml"; pnmlPath = "/home/sebastian/git/dineros/dineros-v2/dineros/pnml-relast-base/src/main/resources/nets/TestNet1.pnml";
// configPath = "src/main/config/siftConfig.json"; configPath = "src/main/config/siftConfig.json";
PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
// [STAGE 1] Resolve service prototype pages
TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, petriNet);
petriNet.flushTreeCache();
// [STAGE 2] Transform topic transitions
for(DinerosTransition dt : petriNet.allDinerosTransitions()){
if(dt.canTransformTopicTransition()){
Page topicTransformedPage = dt.transformTopicElement();
for ( int i = 0; i < dt.ContainingPage().getNumObject(); i++ ){
if(dt.ContainingPage().getObject(i).getId().equals(dt.getId())){
dt.ContainingPage().setObject(topicTransformedPage, i);
}
}
petriNet.flushTreeCache();
}
}
// [STAGE 3] Transform service transitions
// TODO
// [STAGE 4] Transform signals
// TODO
// DumpBuilder builder = Dumper.read(petriNet).skinParam(SkinParamBooleanSetting.Shadowing, false);
// builder.dumpAsPNG(Paths.get("net.png"));
// builder.dumpAsSVG(Paths.get("net.svg"));
// read config for analyzer from file // read config for analyzer from file
/* ConfigReader cr = new ConfigReader(configPath); /* ConfigReader cr = new ConfigReader(configPath);
String[] tinaConfig = cr.getTinaConfigParams(); String[] tinaConfig = cr.getTinaConfigParams();
...@@ -51,20 +87,7 @@ public class Main { ...@@ -51,20 +87,7 @@ public class Main {
// remove references / pages // remove references / pages
System.out.println("[FLATTER] Breaking references and pages."); System.out.println("[FLATTER] Breaking references and pages.");
ReferenceFlatter.flatReferencesAndPages(petriNet); ReferenceFlatter.flatReferencesAndPages(petriNet);
*/
// flat topic publishers / subscribers to instance based semantics
System.out.println("[FLATTER] Breaking down topic channels.");
PetriNet topicFlattedPetriNet = ChannelFlatter.flatTopicChannels(petriNet);
// flat service clients / servers to instance based semantics
System.out.println("[FLATTER] Breaking down service channels.");
PetriNet serviceFlattedPetriNet = ChannelFlatter.flatServiceChannels(topicFlattedPetriNet);
// flat input signals
System.out.println("[FLATTER] Breaking down signals.");
PetriNet signalFlattedPetriNet = SignalFlatter.flatSignals(serviceFlattedPetriNet);
printNet(signalFlattedPetriNet);*/
// export flatted net to pnml // export flatted net to pnml
printNet(petriNet, true, false); printNet(petriNet, true, false);
System.out.println("[FLATTER] Exporting to pnml."); System.out.println("[FLATTER] Exporting to pnml.");
...@@ -105,15 +128,6 @@ public class Main { ...@@ -105,15 +128,6 @@ public class Main {
ktzioProxy.convertBinaryToText(siftTargetPath, ktzioPath); ktzioProxy.convertBinaryToText(siftTargetPath, ktzioPath);
}*/ }*/
// insert into struct
// TODO in v2
// insert into pathto
// TODO in v2
// combine results and generate report in html/md/xml/json? format
// TODO for v2
System.out.println("Finished."); System.out.println("Finished.");
} }
......
...@@ -37,6 +37,7 @@ public final class TemplateConstants { ...@@ -37,6 +37,7 @@ public final class TemplateConstants {
// channel elements // channel elements
public static final String CHANNEL_TOPIC_PLACE = "ChannelConnectorPlace"; public static final String CHANNEL_TOPIC_PLACE = "ChannelConnectorPlace";
public static final String CHANNEL_TOPIC_TRANSITION = "ChannelConnectorTransition"; public static final String CHANNEL_TOPIC_TRANSITION = "ChannelConnectorTransition";
public static final String CHANNEL_TOPIC_PAGE_PREFIX = "ChannelTopicPage";
// signal elements // signal elements
public static final String INPUT_SIGNAL_TEMPLATE_PAGE = "InputSignalTemplatePage"; public static final String INPUT_SIGNAL_TEMPLATE_PAGE = "InputSignalTemplatePage";
......
...@@ -2,7 +2,10 @@ package de.tudresden.inf.st.pnml.flatter.transform; ...@@ -2,7 +2,10 @@ package de.tudresden.inf.st.pnml.flatter.transform;
import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.model.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
public class TransformationUtils { public class TransformationUtils {
...@@ -37,14 +40,16 @@ public class TransformationUtils { ...@@ -37,14 +40,16 @@ public class TransformationUtils {
return a; return a;
} }
public static void includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, String subnet, String node, Map<String, Node> refs) { public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, String subnet, String node, Map<String, Node> refs) {
Map<String, PnObject> addedObjects = new HashMap<>();
for(RefTransition rt : templateInstance.allRefTransitions()){ for(RefTransition rt : templateInstance.allRefTransitions()){
if(refs.containsKey(rt.getId())){ if(refs.containsKey(rt.getId())){
rt.setRef(refs.get(rt.getId()).asTransitionNode()); rt.setRef(refs.get(rt.getId()).asTransitionNode());
} }
page.addObject(rt); page.addObject(rt);
addedObjects.put(rt.getId(), rt);
} }
for(RefPlace rp : templateInstance.allRefPlaces()){ for(RefPlace rp : templateInstance.allRefPlaces()){
...@@ -52,6 +57,7 @@ public class TransformationUtils { ...@@ -52,6 +57,7 @@ public class TransformationUtils {
rp.setRef(refs.get(rp.getId()).asPlaceNode()); rp.setRef(refs.get(rp.getId()).asPlaceNode());
} }
page.addObject(rp); page.addObject(rp);
addedObjects.put(rp.getId(), rp);
} }
// include places, transitions // include places, transitions
...@@ -62,7 +68,9 @@ public class TransformationUtils { ...@@ -62,7 +68,9 @@ public class TransformationUtils {
newTi.setSubNet(subnet); newTi.setSubNet(subnet);
t.asDinerosTransition().setMutableTransitionInformation(newTi); t.asDinerosTransition().setMutableTransitionInformation(newTi);
//System.out.println("Adding T: " + t.getId());
page.addObject(t); page.addObject(t);
addedObjects.put(t.getId(), t);
} }
for (Place p : templateInstance.allPlaces()) { for (Place p : templateInstance.allPlaces()) {
...@@ -72,17 +80,20 @@ public class TransformationUtils { ...@@ -72,17 +80,20 @@ public class TransformationUtils {
newPi.setSubNet(subnet); newPi.setSubNet(subnet);
p.asDinerosPlace().setMutablePlaceInformation(newPi); p.asDinerosPlace().setMutablePlaceInformation(newPi);
//System.out.println("Adding P: " + p.getId());
page.addObject(p); page.addObject(p);
addedObjects.put(p.getId(), p);
} }
petriNet.flushTreeCache(); petriNet.flushTreeCache();
petriNet.flushCollectionCache();
// connect elements by arcs // connect elements by arcs
for (Arc a : templateInstance.allArcs()) { for (Arc a : templateInstance.allArcs()) {
Arc newArc = new Arc(); Arc newArc = new Arc();
newArc.setId("arc-" + a.getSource().getId() + "-" + a.getTarget().getId()); newArc.setId("arc-" + a.getSource().getId() + "-" + a.getTarget().getId());
newArc.setTarget((Node) getPnObjectByID(petriNet, a.getTarget().getId())); newArc.setTarget((Node) getPnObjectByID(templateInstance, a.getTarget().getId()));
newArc.setSource((Node) getPnObjectByID(petriNet, a.getSource().getId())); newArc.setSource((Node) getPnObjectByID(templateInstance, a.getSource().getId()));
if (a.getNumToolspecific() > 0) { if (a.getNumToolspecific() > 0) {
ToolInfo ti = new ToolInfo(); ToolInfo ti = new ToolInfo();
...@@ -93,20 +104,73 @@ public class TransformationUtils { ...@@ -93,20 +104,73 @@ public class TransformationUtils {
} }
page.addObject(newArc); page.addObject(newArc);
addedObjects.put(newArc.getId(), newArc);
} }
petriNet.flushTreeCache(); petriNet.flushAttrAndCollectionCache();
return addedObjects;
} }
public static Place getPlaceByID(PetriNet petriNet, String Id) { /**
* @param page starting point
* @param pages the filled set
* @return
*/
public static void getPagesRecursive(Page page, Set<Page> pages){
pages.add(page);
Set<Page> subPages = new HashSet<>();
for (Place p : petriNet.allPlaces()) { for(PnObject po : page.getObjectsNoTransform()){
if (p.getId().equals(Id)) { if(po.isPageNode()){
return p; subPages.add(po.asPage());
} }
} }
return null; if(subPages.size() == 0){
return;
}
for(Page iterPage : subPages){
getPagesRecursive(iterPage, pages);
}
}
public static void transformPrototypePagesRecursive(Page page, Page parentPage, PetriNet petriNet){
if(page.canTransformPrototypePage()){
System.out.println("Transforming page: " + page.getId());
Page transformedPage = page.transformPrototypePage();
if(parentPage == null){
for(int i = 0; i < petriNet.getNumPage(); i++){
if(petriNet.getPage(i).getId().equals(page.getId())){
petriNet.setPage(transformedPage, i);
}
}
} else {
for(int i = 0; i < parentPage.getNumObject(); i++){
if(parentPage.getObject(i).getId().equals(page.getId())){
parentPage.setObject(transformedPage, i);
}
}
}
}
Set<Page> subPages = new HashSet<>();
for(PnObject po : page.getObjectsNoTransform()){
if(po.isPageNode()){
subPages.add(po.asPage());
}
}
if(subPages.size() == 0){
return;
}
for(Page iterPage : subPages){
transformPrototypePagesRecursive(iterPage, page, petriNet);
}
} }
public static Transition getTransitionByID(PetriNet petriNet, String Id) { public static Transition getTransitionByID(PetriNet petriNet, String Id) {
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>OutputSignalPlaceNet</text> <text>DinerosTemplate</text>
</name> </name>
<page id="DinerosPlacePage"> <page id="DinerosPlacePage">
<place id="DinerosPlace"> <place id="DinerosPlace">
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>InputSignalTransitionNet</text> <text>DinerosTemplate</text>
</name> </name>
<page id="DinerosTransitionPage"> <page id="DinerosTransitionPage">
<transition id="DinerosTransition"> <transition id="DinerosTransition">
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>InputSignalTemplate</text> <text>DinerosTemplate</text>
</name> </name>
<page id="InputSignalTemplatePage"> <page id="InputSignalTemplatePage">
<place id="InputSignalActivePlace"> <place id="InputSignalActivePlace">
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>ServiceConnectionTemplate</text> <text>DinerosTemplate</text>
</name> </name>
<page id="ServiceTemplatePage"> <page id="ServiceTemplatePage">
<place id="ServiceTogglePlace"> <place id="ServiceTogglePlace">
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>ServiceQueueConnectionTemplate</text> <text>DinerosTemplate</text>
</name> </name>
<page id="ServiceQueueTemplatePage"> <page id="ServiceQueueTemplatePage">
<place id="ServiceQueueCapacityPlace"> <place id="ServiceQueueCapacityPlace">
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>TopicPublisherTemplate</text> <text>DinerosTemplate</text>
</name> </name>
<page id="DinerosTemplatePage">
<!-- the reference target is just used here, because pnml does not allow dangling refs --> <!-- the reference target is just used here, because pnml does not allow dangling refs -->
<referencePlace id="PublisherPlaceRef" ref="PublisherCapacityPlace"> <referencePlace id="PublisherPlaceRef" ref="PublisherCapacityPlace">
...@@ -45,7 +46,6 @@ ...@@ -45,7 +46,6 @@
<arc id="arc-8" source="PublisherOutputTransition" target="PublisherChannelPlaceRef"> <arc id="arc-8" source="PublisherOutputTransition" target="PublisherChannelPlaceRef">
</arc> </arc>
<page id="PublisherTemplatePage">
<place id="PublisherCapacityPlace"> <place id="PublisherCapacityPlace">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>none</location> <location>none</location>
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>TopicSubCallbackTemplate</text> <text>DinerosTemplate</text>
</name> </name>
<page id="TopicSubCallbackTemplatePage"> <page id="DinerosTemplatePage">
<!-- the reference target is just used here, because pnml does not allow dangling refs --> <!-- the reference target is just used here, because pnml does not allow dangling refs -->
<referenceTransition id="CallbackInputRefTransition" ref="CallbackInputTransition"> <referenceTransition id="CallbackInputRefTransition" ref="CallbackInputTransition">
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name> <name>
<text>TopicSubDispatcherTemplate</text> <text>DinerosTemplate</text>
</name> </name>
<page id="TopicSubDispatcherTemplatePage"> <page id="DinerosTemplatePage">
<!-- the reference target is just used here, because pnml does not allow dangling refs --> <!-- the reference target is just used here, because pnml does not allow dangling refs -->
<referenceTransition id="DispatcherChannelTransitionRef" ref="DispatcherInputTransition"> <referenceTransition id="DispatcherChannelTransitionRef" ref="DispatcherInputTransition">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment