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

working on service split

parent a30cbc85
Branches
No related tags found
No related merge requests found
...@@ -10,10 +10,20 @@ aspect PnDistribution { ...@@ -10,10 +10,20 @@ aspect PnDistribution {
return this.getMutualTransitionInformation(); return this.getMutualTransitionInformation();
} }
syn lazy PlaceInformation OutputSignalPlace.getPlaceInformation() { /* syn lazy PlaceInformation OutputSignalPlace.getPlaceInformation() {
PlaceInformation pInfo = de.tudresden.inf.st.pnml.ToolSpecificsParser.getPlaceInformation(this.getToolspecificList()); PlaceInformation pInfo = de.tudresden.inf.st.pnml.ToolSpecificsParser.getPlaceInformation(this.getToolspecificList());
return pInfo; return pInfo;
}*/
syn lazy PlaceInformation OutputSignalPlace.getStaticTransitionInformation() {
if(this.getMutualPlaceInformation() == null){
PlaceInformation tInfo = de.tudresden.inf.st.pnml.ToolSpecificsParser.getPlaceInformationInformation(this.getToolspecificList());
return tInfo;
}
return this.getMutualPlaceInformation();
} }
} }
\ No newline at end of file
InputSignalBinding : PnObject ::= <TransitionID:String> <InputSignalID:String> <InputSignalValue:int>; InputSignalBinding : PnObject ::= <TransitionID:String> <InputSignalID:String> <InputSignalValue:int>;
OutputSignalBinding : PnObject ::= <PlaceID:String> <OutputSignalID:String> /<OutputSignalValue:String>/ EqualityOM:EqualityOutputMapping* ThresholdOM:ThresholdOutputMapping* RangeOM:RangeOutputMapping*; OutputSignalBinding : PnObject ::= <PlaceID:String> <OutputSignalID:String> /<OutputSignalValue:String>/ EqualityOM:EqualityOutputMapping* ThresholdOM:ThresholdOutputMapping* RangeOM:RangeOutputMapping*;
TransitionInformation ::= <Location:String> <Type:String> <InputLimit:java.lang.Integer> <OutputLimit:java.lang.Integer> <SubNet:String>; TransitionInformation ::= <Location:String> <Type:String> <InputLimit:java.lang.Integer> <OutputLimit:java.lang.Integer> <SubNet:String> <Instance:String>;
TopicTransitionInformation : TransitionInformation ::= <Topic:String>; TopicTransitionInformation : TransitionInformation ::= <Topic:String>;
ServiceTransitionInformation : TransitionInformation ::= <ServiceName:String>; ServiceTransitionInformation : TransitionInformation ::= <ServiceName:String>;
PlaceInformation ::= <Location:String> <Type:String> <SubNet:String>; PlaceInformation ::= <Location:String> <Type:String> <SubNet:String> <Instance:String>;
InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation]; InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation];
OutputSignalPlace : Place ::= /OutputSignalBinding*/; OutputSignalPlace : Place ::= /OutputSignalBinding*/ /StaticPlaceInformation:PlaceInformation/ [MutualPlaceInformation:PlaceInformation];
OutputMapping; OutputMapping;
......
...@@ -3,6 +3,7 @@ package de.tudresden.inf.st.pnml; ...@@ -3,6 +3,7 @@ package de.tudresden.inf.st.pnml;
import de.tudresden.inf.st.export.PnmlExporter; import de.tudresden.inf.st.export.PnmlExporter;
import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
import de.tudresden.inf.st.postprocessing.GlobalToLocalNetsPostProcessor; import de.tudresden.inf.st.postprocessing.GlobalToLocalNetsPostProcessor;
import de.tudresden.inf.st.postprocessing.PostProcessingUtils;
import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -35,7 +36,7 @@ public class Main { ...@@ -35,7 +36,7 @@ public class Main {
for(int i = 0; i < disconnectedPetriNets.size(); i++){ for(int i = 0; i < disconnectedPetriNets.size(); i++){
for(int j = 0; j < disconnectedPetriNets.get(i).size(); j++){ for(int j = 0; j < disconnectedPetriNets.get(i).size(); j++){
logger.info("Exporting splitted Petri net containing: "); logger.info("Exporting splitted Petri net containing: ");
GlobalToLocalNetsPostProcessor.printNet(disconnectedPetriNets.get(i).get(j)); PostProcessingUtils.printNet(disconnectedPetriNets.get(i).get(j));
try { try {
PnmlExporter.serializeToPnmlFile(disconnectedPetriNets.get(i).get(j), "-pnml-net-" + i + "-" + j); PnmlExporter.serializeToPnmlFile(disconnectedPetriNets.get(i).get(j), "-pnml-net-" + i + "-" + j);
......
...@@ -222,6 +222,17 @@ public class ToolSpecificsParser { ...@@ -222,6 +222,17 @@ public class ToolSpecificsParser {
} }
} }
public static PlaceInformation getPlaceInformationInformation(JastAddList<ToolInfo> toolInfos){
PlaceInformation placeInformation = new PlaceInformation();
placeInformation.setLocation(getLocationFromToolSpecifics(toolInfos));
placeInformation.setType(getTransitionTypeFromToolSpecifics(toolInfos));
placeInformation.setSubNet(getTransitionSubnetInfo(toolInfos));
return placeInformation;
}
public static PlaceInformation getPlaceInformation(JastAddList<ToolInfo> toolInfos) { public static PlaceInformation getPlaceInformation(JastAddList<ToolInfo> toolInfos) {
PlaceInformation pi = new PlaceInformation(); PlaceInformation pi = new PlaceInformation();
......
...@@ -36,8 +36,11 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -36,8 +36,11 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
// init list of distributed nets // init list of distributed nets
List<PetriNet> pns = new ArrayList<>(); List<PetriNet> pns = new ArrayList<>();
// cut the channels // cut the service transitions
PetriNet cuttedNet = cutChannels(petriNet); PetriNet serviceCuttedNet = cutServiceTransitions(petriNet);
// cut the topic transitions
PetriNet cuttedNet = cutTopicTransitions(serviceCuttedNet);
//logger.error("cuttedNet: --------------------------------------------"); //logger.error("cuttedNet: --------------------------------------------");
//printNet(cuttedNet); //printNet(cuttedNet);
...@@ -77,8 +80,8 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -77,8 +80,8 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
Set<String> allLocations = new HashSet<>(); Set<String> allLocations = new HashSet<>();
for (Place place : petriNet.allPlaces()) { for (Place place : petriNet.allPlaces()) {
if (place.asOutputSignalPlace().getPlaceInformation().getSubNet() != null) { if (place.asOutputSignalPlace().getStaticTransitionInformation().getSubNet() != null) {
allLocations.add(place.asOutputSignalPlace().getPlaceInformation().getSubNet()); allLocations.add(place.asOutputSignalPlace().getStaticTransitionInformation().getSubNet());
} else { } else {
logger.error("Found place without location."); logger.error("Found place without location.");
} }
...@@ -86,7 +89,48 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -86,7 +89,48 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
return allLocations; return allLocations;
} }
private static PetriNet cutChannels(PetriNet petriNet) { private static PetriNet cutServiceTransitions(PetriNet petriNet) {
Set<Transition> transitionsToAdd = new HashSet<>();
Set<Transition> transitionsToRemove = new HashSet<>();
for (Transition transition : petriNet.allTransitions()) {
InputSignalTransition channelIst = transition.asInputSignalTransition();
// just process service transitions
if(channelIst.getStaticTransitionInformation().isServiceTransitionInformation()
&& channelIst.getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST)){
int numInArcs = channelIst.getInArcList().toArray(new Arc[0]).length;
// STEP 1: Get location/subnet of source/target - places
String inLocation = null;
String outLocation = null;
String inSubNet = null;
String outSubNet = null;
for (Place p : channelIst.incomingPlaces()) {
inLocation = p.asOutputSignalPlace().getStaticTransitionInformation().getLocation();
inSubNet = p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet();
break;
}
for (Place p : channelIst.outgoingPlaces()) {
outLocation = p.asOutputSignalPlace().getStaticTransitionInformation().getLocation();
outSubNet = p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet();
break;
}
// STEP 2: Create new
}
}
return null;
}
private static PetriNet cutTopicTransitions(PetriNet petriNet) {
//printNet(petriNet); //printNet(petriNet);
...@@ -112,14 +156,14 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -112,14 +156,14 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
String outSubNet = null; String outSubNet = null;
for (Place p : channelIst.incomingPlaces()) { for (Place p : channelIst.incomingPlaces()) {
inLocation = p.asOutputSignalPlace().getPlaceInformation().getLocation(); inLocation = p.asOutputSignalPlace().getStaticTransitionInformation().getLocation();
inSubNet = p.asOutputSignalPlace().getPlaceInformation().getSubNet(); inSubNet = p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet();
break; break;
} }
for (Place p : channelIst.outgoingPlaces()) { for (Place p : channelIst.outgoingPlaces()) {
outLocation = p.asOutputSignalPlace().getPlaceInformation().getLocation(); outLocation = p.asOutputSignalPlace().getStaticTransitionInformation().getLocation();
outSubNet = p.asOutputSignalPlace().getPlaceInformation().getSubNet(); outSubNet = p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet();
break; break;
} }
...@@ -229,7 +273,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -229,7 +273,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
Set<String> removePlaceIds = new HashSet<>(); Set<String> removePlaceIds = new HashSet<>();
for (Place place : separatedNet.allPlaces()) { for (Place place : separatedNet.allPlaces()) {
if (!place.asOutputSignalPlace().getPlaceInformation().getSubNet().equals(location)) { if (!place.asOutputSignalPlace().getStaticTransitionInformation().getSubNet().equals(location)) {
removePlaceIds.add(place.getId()); removePlaceIds.add(place.getId());
} }
} }
...@@ -249,7 +293,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -249,7 +293,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
} }
for (Place place : separatedNet.allPlaces()) { for (Place place : separatedNet.allPlaces()) {
if (!place.asOutputSignalPlace().getPlaceInformation().getSubNet().equals(location)) { if (!place.asOutputSignalPlace().getStaticTransitionInformation().getSubNet().equals(location)) {
logger.info("removing place " + place.getId() + " from net"); logger.info("removing place " + place.getId() + " from net");
place.removeSelf(); place.removeSelf();
} }
...@@ -359,71 +403,4 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { ...@@ -359,71 +403,4 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
return null; return null;
} }
public static void printNet(PetriNet petriNet) {
logger.info("--------------- STRUCTURE ---------------");
logger.info("----------------- PLACES ----------------");
for (Place p : petriNet.allPlaces()) {
logger.info("Place " + p.asOutputSignalPlace().getName().getText() + " -- " + p.asOutputSignalPlace().getPlaceInformation().getSubNet());
}
logger.info("-------------- TRANSITIONS --------------");
for (Transition t : petriNet.allTransitions()) {
if(t.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()) {
logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
+ " service: " + t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName() + " ---------");
}else{
logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
+ " topic: " + t.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getTopic() + " ---------");
}
for (Place p : t.asInputSignalTransition().incomingPlaces()) {
logger.info("------ Inputplace: " + p.getName().getText() + " subnet: " + p.asOutputSignalPlace().getPlaceInformation().getSubNet() + " ---------");
}
for (Place p : t.asInputSignalTransition().outgoingPlaces()) {
logger.info("------ Outputplace: " + p.getName().getText() + " subnet: " + p.asOutputSignalPlace().getPlaceInformation().getSubNet() + " ---------");
}
}
logger.info("----------------- ARCS -----------------");
for (Arc a : petriNet.allArcs()) {
logger.info("Arc: " + a.getId() + " -- source: " + a.getSource().getName().getText() + " -- target: " + a.getTarget().getName().getText());
}
logger.info("--------------- T SIGNALS (STATIC)---------------");
for (Transition t : petriNet.allTransitions()) {
InputSignalTransition ist = t.asInputSignalTransition();
if (ist != null && ist.getStaticInputSignalBindingList() != null) {
ist.getStaticInputSignalBindingList().forEach(inputSignalBinding -> logger.info(" (" + t.getName().getText() + ") Signal: " + inputSignalBinding.getInputSignalID()));
}
}
logger.info("--------------- T SIGNALS (MUTUAL)---------------");
for (Transition t : petriNet.allTransitions()) {
InputSignalTransition ist = t.asInputSignalTransition();
if (ist != null && ist.getMutualInputSignalBindingList() != null) {
ist.getMutualInputSignalBindingList().forEach(inputSignalBinding -> logger.info(" (" + t.getName().getText() + ") Signal: " + inputSignalBinding.getInputSignalID()));
}
}
logger.info("--------------- TOOL SPECIFIC ---------------");
for (Transition t : petriNet.allTransitions()) {
InputSignalTransition ist = t.asInputSignalTransition();
logger.info("ToolSpecific: (" + ist.getName().getText() + ") " + ist.getToolspecific(0).getFormattedXMLBuffer().toString());
}
}
} }
package de.tudresden.inf.st.postprocessing;
import de.tudresden.inf.st.constants.PnmlConstants;
import de.tudresden.inf.st.pnml.jastadd.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class PostProcessingUtils {
private static final Logger logger = LoggerFactory.getLogger(PostProcessingUtils.class);
///////////////////////////////
// NET INFORMATION ////////////
///////////////////////////////
private static Set<Transition> getTransitionsBySubnet(String subNet, PetriNet petriNet){
return petriNet.allTransitions().stream().filter(t -> t.asInputSignalTransition()
.getStaticTransitionInformation().getSubNet().equals(subNet)).collect(Collectors.toSet());
}
private static Set<String> getTransitionIDsBySubnet(String subNet, PetriNet petriNet){
Set<String> transitionIds = new HashSet<>();
for(Transition t : getTransitionsBySubnet(subNet, petriNet)){
transitionIds.add(t.getId());
}
return transitionIds;
}
private static Set<String> getPlaceIDsBySubnet(String subNet, PetriNet petriNet){
Set<String> placeIds = new HashSet<>();
for(Place p : getPlacesBySubnet(subNet, petriNet)){
placeIds.add(p.getId());
}
return placeIds;
}
private static Set<Place> getPlacesBySubnet(String subNet, PetriNet petriNet){
return petriNet.allPlaces().stream().filter(t -> t.asOutputSignalPlace()
.getStaticTransitionInformation().getSubNet().equals(subNet)).collect(Collectors.toSet());
}
private static Set<Arc> getInternalArcsBySubnet(String subNet, PetriNet petriNet){
Set<Arc> internalArcs = new HashSet<>();
Set<String> subNetTransitionIds = getTransitionIDsBySubnet(subNet, petriNet);
Set<String> subNetPlaceIds = getPlaceIDsBySubnet(subNet, petriNet);
for(Arc arc : petriNet.allArcs()){
if((subNetTransitionIds.contains(arc.getSource().getId()) && subNetPlaceIds.contains(arc.getTarget().getId()))
|| (subNetTransitionIds.contains(arc.getTarget().getId()) && subNetPlaceIds.contains(arc.getSource().getId()))){
internalArcs.add(arc);
}
}
return internalArcs;
}
private static Set<Arc> getExternalArcsBySubnet(String subNet, PetriNet petriNet){
Set<Arc> externalArcs = new HashSet<>();
Set<String> subNetTransitionIds = getTransitionIDsBySubnet(subNet, petriNet);
Set<String> subNetPlaceIds = getPlaceIDsBySubnet(subNet, petriNet);
for(Arc arc : petriNet.allArcs()){
if(subNetTransitionIds.contains(arc.getSource().getId()) || subNetPlaceIds.contains(arc.getTarget().getId())
|| subNetTransitionIds.contains(arc.getTarget().getId()) || subNetPlaceIds.contains(arc.getSource().getId())){
externalArcs.add(arc);
}
}
return externalArcs;
}
///////////////////////////////
// NET MANIPULATION ///////////
///////////////////////////////
public static void setSubNetInstanceId(PetriNet petriNet, String subNet, String instanceId){
Set<Transition> subNetTransitions = getTransitionsBySubnet(subNet, petriNet);
Set<Place> subNetPlaces = getPlacesBySubnet(subNet, petriNet);
subNetTransitions.forEach(t -> {
if(t.asInputSignalTransition().getMutualTransitionInformation() == null){
// todo
t.asInputSignalTransition().getMutualTransitionInformation().setInstance(instanceId);
}
});
//subNetPlaces.forEach(p -> p.asOutputSignalPlace());
}
public static PetriNet copySubNet(PetriNet petriNet, String subNet, String instanceId){
Set<Transition> transitionsToAdd = new HashSet<>();
Set<Place> placesToRemove = new HashSet<>();
Set<Arc> arcsToRemove = new HashSet<>();
for (Transition transition : petriNet.allTransitions()) {
InputSignalTransition channelIst = transition.asInputSignalTransition();
// just process service transitions
if(channelIst.getStaticTransitionInformation().isServiceTransitionInformation()
&& channelIst.getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST)){
int numInArcs = channelIst.getInArcList().toArray(new Arc[0]).length;
}
}
return null;
}
///////////////////////////////
// LOGGING ////////////////////
///////////////////////////////
public static void printNet(PetriNet petriNet) {
logger.info("--------------- STRUCTURE ---------------");
logger.info("----------------- PLACES ----------------");
for (Place p : petriNet.allPlaces()) {
logger.info("Place " + p.asOutputSignalPlace().getName().getText() + " -- " + p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet());
}
logger.info("-------------- TRANSITIONS --------------");
for (Transition t : petriNet.allTransitions()) {
if(t.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()) {
logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
+ " service: " + t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName() + " ---------");
}else{
logger.info("--- Transition: " + t.getName().getText() + " subnet: " + t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()
+ " topic: " + t.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getTopic() + " ---------");
}
for (Place p : t.asInputSignalTransition().incomingPlaces()) {
logger.info("------ Inputplace: " + p.getName().getText() + " subnet: " + p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet() + " ---------");
}
for (Place p : t.asInputSignalTransition().outgoingPlaces()) {
logger.info("------ Outputplace: " + p.getName().getText() + " subnet: " + p.asOutputSignalPlace().getStaticTransitionInformation().getSubNet() + " ---------");
}
}
logger.info("----------------- ARCS -----------------");
for (Arc a : petriNet.allArcs()) {
logger.info("Arc: " + a.getId() + " -- source: " + a.getSource().getName().getText() + " -- target: " + a.getTarget().getName().getText());
}
logger.info("--------------- T SIGNALS (STATIC)---------------");
for (Transition t : petriNet.allTransitions()) {
InputSignalTransition ist = t.asInputSignalTransition();
if (ist != null && ist.getStaticInputSignalBindingList() != null) {
ist.getStaticInputSignalBindingList().forEach(inputSignalBinding -> logger.info(" (" + t.getName().getText() + ") Signal: " + inputSignalBinding.getInputSignalID()));
}
}
logger.info("--------------- T SIGNALS (MUTUAL)---------------");
for (Transition t : petriNet.allTransitions()) {
InputSignalTransition ist = t.asInputSignalTransition();
if (ist != null && ist.getMutualInputSignalBindingList() != null) {
ist.getMutualInputSignalBindingList().forEach(inputSignalBinding -> logger.info(" (" + t.getName().getText() + ") Signal: " + inputSignalBinding.getInputSignalID()));
}
}
logger.info("--------------- TOOL SPECIFIC ---------------");
for (Transition t : petriNet.allTransitions()) {
InputSignalTransition ist = t.asInputSignalTransition();
logger.info("ToolSpecific: (" + ist.getName().getText() + ") " + ist.getToolspecific(0).getFormattedXMLBuffer().toString());
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment