diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java index a2861e8e131b605f3fe7e2946dfe750740eda29f..d1514b5e118bff1e3346b87ce50d9117c4a471ed 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ChannelFlatter.java @@ -363,8 +363,13 @@ public class ChannelFlatter extends Flatter { Set<OutputSignalPlace> topicInputPlaces = new HashSet<>(); System.out.println("[FLATTER] Copying server net: " + serverSubnet); + + // TODO: get the directly connected elements + List<Tuple2<Node, Node>> externalElementsToReconnect = new ArrayList<>(); // true -> element is source + getDirectlyConnectedElements(petriNet, serverSubnet, externalElementsToReconnect); + Pair<OutputSignalPlace, OutputSignalPlace> ioPlacePair = copyServerNet(petriNet, serverPlaces, serverTransitions, topicInputPlaces, - serverInstanceCount + "-" + clientCount, serverSubnet, copiedObjects); + serverInstanceCount + "-" + clientCount, serverSubnet, copiedObjects, externalElementsToReconnect); // new needed publisher nets (reason: publishers are potentially also cloned) int topicInputPlaceCount = 0; @@ -561,9 +566,50 @@ public class ChannelFlatter extends Flatter { return petriNet; } + private static void getDirectlyConnectedElements(PetriNet petriNet, String serverSubnet, List<Tuple2<Node, Node>> externalElementsToReconnect) { + for (Place p : petriNet.allPlaces()){ + + for(Arc a : p.getInArcList()){ + if(a.getSource().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet() + .equals(serverSubnet) && !p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(serverSubnet)){ + externalElementsToReconnect.add(new Tuple2<>(a.getSource(), p)); + break; + } + } + + for(Arc a : p.getOutArcList()){ + if(a.getTarget().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet() + .equals(serverSubnet) && !p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(serverSubnet)){ + externalElementsToReconnect.add(new Tuple2<>(p, a.getTarget())); + break; + } + } + } + + for (Transition t : petriNet.allTransitions()){ + + for(Arc a : t.getInArcList()){ + if(a.getSource().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + .equals(serverSubnet) && !t.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(serverSubnet)){ + externalElementsToReconnect.add(new Tuple2<>(a.getSource(), t)); + break; + } + } + + for(Arc a : t.getOutArcList()){ + if(a.getTarget().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + .equals(serverSubnet) && !t.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(serverSubnet)){ + externalElementsToReconnect.add(new Tuple2<>(a.getSource(), t)); + break; + } + } + } + } + private static Pair<OutputSignalPlace, OutputSignalPlace> copyServerNet(PetriNet petriNet, Set<Place> serverPlaces, Set<Transition> serverTransitions, Set<OutputSignalPlace> topicInputPlaces, - String suffix, String serverSubnet, Set<PnObject> copiedObjects) { + String suffix, String serverSubnet, Set<PnObject> copiedObjects, + List<Tuple2<Node, Node>> externalElementsToReconnect) { final String instanceId = "server-instance-" + UUID.randomUUID().toString(); @@ -603,6 +649,19 @@ public class ChannelFlatter extends Flatter { topPage.addObject(copy); addedPnObjects.add(copy); + for(Tuple2<Node, Node> t : externalElementsToReconnect){ + + if(p.getId().equals(t.get_1().getId())){ + createAndIncludeArc(topPage, "ext-" + t.get_1().getId() + "-to-" + t.get_2().getId(), t.get_1(), p); + } + + if(p.getId().equals(t.get_2().getId())){ + createAndIncludeArc(topPage, "ext-" + t.get_2().getId() + "-to-" + t.get_1().getId(), p, t.get_1()); + } + } + + // todo: remove old arcs connecting external elements + for (Arc a : p.getOutArcList()) { if (!a.getTarget().getSubnet().equals(serverSubnet)) {