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

feature for cycle detection in service calls, fixed bugs related to service/signal flattening

parent 0c3f015b
No related branches found
No related tags found
No related merge requests found
...@@ -8,7 +8,7 @@ aspect ServiceChannelTransforms { ...@@ -8,7 +8,7 @@ aspect ServiceChannelTransforms {
Page res = new Page(); Page res = new Page();
Map<String, PnObject> addedObjects = new HashMap<>(); Map<String, PnObject> addedObjects = new HashMap<>();
System.out.println("Transforming service transition: " + this.getId()); System.out.println("[INFO] Transforming service transition: " + this.getId());
ServiceTransitionInformation sti = this.getStaticTransitionInformation().asServiceTransitionInformation(); ServiceTransitionInformation sti = this.getStaticTransitionInformation().asServiceTransitionInformation();
res.setId(TemplateConstants.CHANNEL_SERVICE_PAGE_PREFIX + "-" + sti.getServiceName()); res.setId(TemplateConstants.CHANNEL_SERVICE_PAGE_PREFIX + "-" + sti.getServiceName());
......
...@@ -9,15 +9,17 @@ aspect ServicePrototypeTransforms { ...@@ -9,15 +9,17 @@ aspect ServicePrototypeTransforms {
} }
// apply rule S4 // apply rule S4
syn Page Page.transformPrototypePage() { syn Page Page.transformPrototypePage(int detectedCapacity) {
int serverCapacity = 0; int serverCapacity = 0;
String serviceName = this.getServiceName(); String serviceName = this.getServiceName();
DinerosTransition serviceTransition = null; DinerosTransition serviceTransition = null;
for(DinerosTransition dt : petriNet().allDinerosTransitions()){ for(DinerosTransition dt : petriNet().allDinerosTransitions()){
if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){ if(detectedCapacity == -1 && dt.getStaticTransitionInformation().isServiceTransitionInformation()){
serverCapacity = dt.getStaticTransitionInformation().asServiceTransitionInformation().getServerChannel().getCapacity(); serverCapacity = dt.getStaticTransitionInformation().asServiceTransitionInformation().getServerChannel().getCapacity();
} else {
serverCapacity = detectedCapacity;
} }
if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){ if(dt.getStaticTransitionInformation().isServiceTransitionInformation()){
if(dt.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName().equals(serviceName)){ if(dt.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName().equals(serviceName)){
......
...@@ -48,13 +48,17 @@ aspect SignalTransforms { ...@@ -48,13 +48,17 @@ aspect SignalTransforms {
Transition toTrue = net.getTransitionById(TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_TRUE + "-" + l.getName()); Transition toTrue = net.getTransitionById(TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_TRUE + "-" + l.getName());
Transition toFalse = net.getTransitionById(TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_FALSE + "-" + l.getName()); Transition toFalse = net.getTransitionById(TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_FALSE + "-" + l.getName());
System.out.println("toTrue: " + toTrue.getId());
System.out.println("toFalse: " + toFalse.getId());
// create elements for rule I2 & I3 // create elements for rule I2 & I3
RefTransition toTrueRt = PrimitiveTemplates.getReferenceTransition(toTrue); RefTransition toTrueRt = PrimitiveTemplates.getReferenceTransition(toTrue);
toTrueRt.setId(toTrue.getId() + "REF-" + i + "-" + j); toTrueRt.setId(toTrue.getId() + "-" + t.getId() + "-REF-" + i + "-" + j);
System.out.println("Adding ref transition: " + toTrue.getId() + "-" + t.getId() + "-REF-" + i + "-" + j);
System.out.println("REF: " + toTrueRt.getRef().getId());
res.addObject(toTrueRt); res.addObject(toTrueRt);
RefTransition toFalseRt = PrimitiveTemplates.getReferenceTransition(toFalse); RefTransition toFalseRt = PrimitiveTemplates.getReferenceTransition(toFalse);
toFalseRt.setId(toFalse.getId() + "REF-" + i + "-" + j); toFalseRt.setId(toFalse.getId() + "-" + t.getId() + "-REF-" + i + "-" + j);
res.addObject(toFalseRt); res.addObject(toFalseRt);
RefPlace djRefPlace = PrimitiveTemplates.getReferencePlace(pdi); RefPlace djRefPlace = PrimitiveTemplates.getReferencePlace(pdi);
djRefPlace.setId("DJREF-" + i + "-" + j); djRefPlace.setId("DJREF-" + i + "-" + j);
......
...@@ -2,6 +2,7 @@ package de.tudresden.inf.st.pnml.flatter; ...@@ -2,6 +2,7 @@ package de.tudresden.inf.st.pnml.flatter;
import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
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.graph.ServiceGraph;
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;
...@@ -24,18 +25,23 @@ public class Main { ...@@ -24,18 +25,23 @@ public class Main {
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) {
System.out.println("No model found on given input path."); System.out.println("[ERROR] No model found on given input path.");
return; return;
} }
if(configPath == null || configPath.equals("")){
System.out.println("[WARNING] No config path configured, no model checking will be executed.");
}
// parse the global not flatted petri net // parse the global not flatted petri net
//pnmlPath = "/home/sebastian/git/dineros/dineros-v2/dineros/pnml-relast-base/src/main/resources/nets/TestNet3.pnml";
//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 // [STAGE 1] Resolve service prototype pages
TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, petriNet); ServiceGraph serviceGraph = new ServiceGraph();
serviceGraph.init(petriNet);
TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, petriNet, serviceGraph);
petriNet.flushAttrAndCollectionCache(); petriNet.flushAttrAndCollectionCache();
// [STAGE 2] Transform topic transitions // [STAGE 2] Transform topic transitions
...@@ -72,6 +78,7 @@ public class Main { ...@@ -72,6 +78,7 @@ public class Main {
petriNet.addPage(signalValuePage); petriNet.addPage(signalValuePage);
petriNet.transformSignalElements(signalValuePage); petriNet.transformSignalElements(signalValuePage);
petriNet.flushTreeCache(); petriNet.flushTreeCache();
petriNet.flushAttrAndCollectionCache();
for(DinerosTransition dt : petriNet.allDinerosTransitions()){ for(DinerosTransition dt : petriNet.allDinerosTransitions()){
Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation() Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation()
...@@ -122,6 +129,7 @@ public class Main { ...@@ -122,6 +129,7 @@ public class Main {
// [STAGE 8] Analyze // [STAGE 8] Analyze
// read config for analyzer from file // read config for analyzer from file
if(configPath != null && !configPath.equals("")) {
ConfigReader cr = new ConfigReader(configPath); ConfigReader cr = new ConfigReader(configPath);
String[] tinaConfig = cr.getTinaConfigParams(); String[] tinaConfig = cr.getTinaConfigParams();
String[] siftConfig = cr.getSiftConfigParams(); String[] siftConfig = cr.getSiftConfigParams();
...@@ -146,6 +154,7 @@ public class Main { ...@@ -146,6 +154,7 @@ public class Main {
String ktzioPath = homeDirectory + "/temp/sift/" + "sift-result-converted-" + exportId + ".txt"; String ktzioPath = homeDirectory + "/temp/sift/" + "sift-result-converted-" + exportId + ".txt";
ktzioProxy.convertBinaryToText(siftTargetPath, ktzioPath); ktzioProxy.convertBinaryToText(siftTargetPath, ktzioPath);
} }
}
System.out.println("[FLATTENER] Finished."); System.out.println("[FLATTENER] Finished.");
......
package de.tudresden.inf.st.pnml.flatter.graph;
import de.tudresden.inf.st.pnml.jastadd.model.*;
import java.util.ArrayList;
import java.util.List;
public class ServiceGraph {
public List<Node> graph;
public static class Node{
public String name;
public String serviceName;
public List<Node> targets;
public List<Node> sources;
public Node(String name, String serviceName, List<Node> targets, List<Node> sources) {
this.name = name;
this.serviceName = serviceName;
this.targets = targets;
this.sources = sources;
}
}
public List<Node> init(PetriNet petriNet){
graph = new ArrayList<>();
// [1] Create a node for each service channel
for(DinerosTransition t : petriNet.allDinerosTransitions()){
if(t.getStaticTransitionInformation().isServiceTransitionInformation()){
graph.add(new Node(t.getId(), t.getStaticTransitionInformation()
.asServiceTransitionInformation().getServiceName(), new ArrayList<>(), new ArrayList<>()));
}
}
// [2] Iterate over nodes to build connections
for(Node n : graph){
for(DinerosTransition t : petriNet.allDinerosTransitions()){
if(t.getId().equals(n.name)){
for(ServiceChannel sc : t.getStaticTransitionInformation().asServiceTransitionInformation().getClientChannels()){
for(Node iterNode : graph){
if(!n.name.equals(iterNode.name) &&
isPnObjectInPageTree(petriNet.getTransitionById(iterNode.name).ContainingPage(), sc.getRequestPlaceId())){
// [3] Build connections
n.sources.add(iterNode);
iterNode.targets.add(n);
}
}
}
}
}
}
return graph;
}
public boolean isPotentiallyCyclic(String serviceName){
for(Node n : graph){
if(n.serviceName.equals(serviceName)){
return isPotentiallyCyclicInternal(n, n);
}
}
return true;
}
private boolean isPotentiallyCyclicInternal(Node node, Node iterNode){
for(Node n : iterNode.targets){
if(n.name.equals(node.name)){
return true;
}
}
for(Node n : iterNode.targets){
if(isPotentiallyCyclicInternal(node, n)){
return true;
}
}
return false;
}
private boolean isPnObjectInPageTree(Page page, String id){
// bfs
for(PnObject po : page.getObjects()){
if(po.getId().equals(id)){
return true;
}
}
for(PnObject po : page.getObjects()){
if(po.isPageNode() &&
isPnObjectInPageTree(po.asPage(), id)){
return true;
}
}
return false;
}
}
...@@ -18,10 +18,10 @@ public class NdrioProxy extends AbstractTinaProxy{ ...@@ -18,10 +18,10 @@ public class NdrioProxy extends AbstractTinaProxy{
if(!isWindows){ if(!isWindows){
if(homeDirectory.contains("pnml-relast-flatter")){ if(homeDirectory.contains("pnml-relast-flattener")){
ndrioProcessBuilder.command(homeDirectory + "/libs/tina-3.7.0/bin/ndrio", inputPath, outputPath); ndrioProcessBuilder.command(homeDirectory + "/libs/tina-3.7.0/bin/ndrio", inputPath, outputPath);
}else{ }else{
ndrioProcessBuilder.command(homeDirectory + "/pnml-relast-checker/libs/tina-3.7.0/bin/ndrio", inputPath, outputPath); ndrioProcessBuilder.command(homeDirectory + "/pnml-relast-flattener/libs/tina-3.7.0/bin/ndrio", inputPath, outputPath);
} }
}else{ }else{
logger.error("Windows is currently not supported. Exiting ..."); logger.error("Windows is currently not supported. Exiting ...");
......
...@@ -113,7 +113,7 @@ public class ReferenceFlatter { ...@@ -113,7 +113,7 @@ public class ReferenceFlatter {
Page topLevelPage = null; Page topLevelPage = null;
for (Page p : petriNet.allPages()){ for (Page p : petriNet.allPages()){
if(p.ContainingPage() == null){ if(p.getId().equals("top")){
topLevelPage = p; topLevelPage = p;
} }
} }
......
package de.tudresden.inf.st.pnml.flatter.transform; package de.tudresden.inf.st.pnml.flatter.transform;
import de.tudresden.inf.st.pnml.flatter.graph.ServiceGraph;
import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.model.*;
import java.util.HashMap; import java.util.HashMap;
...@@ -152,11 +153,37 @@ public class TransformationUtils { ...@@ -152,11 +153,37 @@ public class TransformationUtils {
} }
} }
public static void transformPrototypePagesRecursive(Page page, Page parentPage, PetriNet petriNet){ private static DinerosTransition getTransitionByServiceName(PetriNet petriNet, String serviceName){
for(DinerosTransition t : petriNet.allDinerosTransitions()){
if(t.getStaticTransitionInformation().isServiceTransitionInformation()){
if(t.getStaticTransitionInformation().
asServiceTransitionInformation().getServiceName().equals(serviceName)){
return t;
}
}
}
return null;
}
public static void transformPrototypePagesRecursive(Page page, Page parentPage, PetriNet petriNet, ServiceGraph serviceGraph){
if(page.canTransformPrototypePage()){ if(page.canTransformPrototypePage()){
System.out.println("Transforming page: " + page.getId()); System.out.println("[INFO] Transforming page: " + page.getId());
Page transformedPage = page.transformPrototypePage();
Page transformedPage;
if(serviceGraph.isPotentiallyCyclic(page.getServiceName())){
System.out.println("[WARNING] Detected potentially cyclic service call on: " + page.getServiceName());
System.out.println("[WARNING] Falling back to user defined thread number for: " + page.getServiceName());
transformedPage = page.transformPrototypePage(-1);
} else {
int numInstances = getTransitionByServiceName(petriNet,
page.getServiceName()).getStaticTransitionInformation().asServiceTransitionInformation().getNumClientChannel();
transformedPage = page.transformPrototypePage(numInstances);
System.out.println("[INFO] Transforming prototype page: " + page.getServiceName() + " to " + numInstances + " instances.");
}
if(parentPage == null){ if(parentPage == null){
for(int i = 0; i < petriNet.getNumPage(); i++){ for(int i = 0; i < petriNet.getNumPage(); i++){
...@@ -185,7 +212,7 @@ public class TransformationUtils { ...@@ -185,7 +212,7 @@ public class TransformationUtils {
} }
for(Page iterPage : subPages){ for(Page iterPage : subPages){
transformPrototypePagesRecursive(iterPage, page, petriNet); transformPrototypePagesRecursive(iterPage, page, petriNet, serviceGraph);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment