diff --git a/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java b/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java index 9093fce3d3e0754a51433e8843da0cd95e4ef3d2..66c72a54b5252a0ac349af66d48beef4a0c8886c 100644 --- a/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java +++ b/src/main/java/de/tudresden/inf/st/postprocessing/GlobalToLocalNetsPostProcessor.java @@ -6,6 +6,7 @@ import de.tudresden.inf.st.export.PnmlExporter; import de.tudresden.inf.st.pnml.PnmlParser; import de.tudresden.inf.st.pnml.jastadd.model.*; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -146,14 +147,9 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String inLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String inSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition sourceIst = new InputSignalTransition(); - sourceIst.setName(new Name().setText(ist.getName().getText() + sufix + serviceCount)); - sourceIst.setId(ist.getId() + sufix + serviceCount); + InputSignalTransition sourceIst = createRosInputTransition(ist, serviceCount, sufix); - ServiceTransitionInformation tInfoSource = new ServiceTransitionInformation(); - tInfoSource.setSubNet(inSubNet); - tInfoSource.setLocation(inLocation); - tInfoSource.setServiceName(ist.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName()); + ServiceTransitionInformation tInfoSource = copyServiceTransitionInformation(ist, inLocation, inSubNet); // attributized infos need to be written back to XML JastAddList<ToolInfo> inputToolInfoJastAddList = new JastAddList<>(); @@ -163,26 +159,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { sourceIst.setToolspecificList(inputToolInfoJastAddList); sourceIst.setMutualTransitionInformation(tInfoSource); - - // Reconnect Input Signals - for (InputSignalBinding isb : ist.getStaticInputSignalBindingList()) { - - InputSignalBinding newIsb = new InputSignalBinding(); - newIsb.setInputSignalValue(isb.getInputSignalValue()); - newIsb.setTransitionID(isb.getTransitionID()); - newIsb.setId(isb.getId()); - newIsb.setInputSignalID(isb.getInputSignalID()); - - sourceIst.addMutualInputSignalBinding(newIsb); - } - - // Get all incoming arcs and connect them to new output transition - for (Arc arc : p.asOutputSignalPlace().getOutArcList().toArray(new Arc[0])) { - - if (arc.getTarget().getId().equals(transition.getId())) { - arc.setTarget(sourceIst); - } - } + reconnectSourceTransitionSignalsAndArcs(transition, ist, p, sourceIst); // Add new transitions to net transitionsToAdd.add(sourceIst); @@ -212,22 +189,16 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String outLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String outSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition requestServerIst = new InputSignalTransition(); - requestServerIst.setName(new Name().setText(ist.getName().getText() + sufix + serviceCount)); - requestServerIst.setId(ist.getId() + sufix + serviceCount); + InputSignalTransition requestServerIst = createRosInputTransition(ist, serviceCount, sufix); - ServiceTransitionInformation tInfoTarget = new ServiceTransitionInformation(); - tInfoTarget.setSubNet(outSubNet); - tInfoTarget.setLocation(outLocation); - tInfoTarget.setServiceName(ist.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName()); + ServiceTransitionInformation tInfoTarget = copyServiceTransitionInformation(ist, outLocation, outSubNet); - // attributized infos need to be written back to XML + // attribute infos need to be written back to XML JastAddList<ToolInfo> outputToolInfoJastAddList = new JastAddList<>(); tInfoTarget.setType(targetType); outputToolInfoJastAddList.add(buildServiceToolSpecifics(targetType, outLocation, outSubNet, tInfoTarget.getServiceName(), null)); - requestServerIst.setToolspecificList(outputToolInfoJastAddList); requestServerIst.setMutualTransitionInformation(tInfoTarget); @@ -309,9 +280,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String outLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String outSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition subscriberIst = new InputSignalTransition(); - subscriberIst.setName(new Name().setText(channelIst.getName().getText() + "-subscriber-" + subscriberCount)); - subscriberIst.setId(channelIst.getId() + "-subscriber-" + subscriberCount); + InputSignalTransition subscriberIst = createRosInputTransition(channelIst, subscriberCount, "-subscriber-"); TopicTransitionInformation tInfoTarget = new TopicTransitionInformation(); tInfoTarget.setSubNet(outSubNet); @@ -373,9 +342,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { String inLocation = p.asOutputSignalPlace().getStaticPlaceInformation().getLocation(); String inSubNet = p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet(); - InputSignalTransition publisherIst = new InputSignalTransition(); - publisherIst.setName(new Name().setText(channelIst.getName().getText() + "-publisher-" + publisherCount)); - publisherIst.setId(channelIst.getId() + "-publisher-" + publisherCount); + InputSignalTransition publisherIst = createRosInputTransition(channelIst, publisherCount, "-publisher-"); TopicTransitionInformation tInfoSource = new TopicTransitionInformation(); tInfoSource.setSubNet(inSubNet); @@ -401,24 +368,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { publisherIst.setMutualTransitionInformation(tInfoSource); // Reconnect Input Signals - for (InputSignalBinding isb : channelIst.getStaticInputSignalBindingList()) { - - InputSignalBinding newIsb = new InputSignalBinding(); - newIsb.setInputSignalValue(isb.getInputSignalValue()); - newIsb.setTransitionID(isb.getTransitionID()); - newIsb.setId(isb.getId()); - newIsb.setInputSignalID(isb.getInputSignalID()); - - publisherIst.addMutualInputSignalBinding(newIsb); - } - - // Get all incoming arcs and connect them to new output transition - for (Arc arc : p.asOutputSignalPlace().getOutArcList().toArray(new Arc[0])) { - - if (arc.getTarget().getId().equals(transition.getId())) { - arc.setTarget(publisherIst); - } - } + reconnectSourceTransitionSignalsAndArcs(transition, channelIst, p, publisherIst); // Add new transitions to net transitionsToAdd.add(publisherIst); @@ -441,23 +391,22 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { private static PetriNet createdSeparatedNetByLocation(PetriNet petriNet, String location) { - PetriNet separatedNet = petriNet; Set<String> removedTransitionIds = new HashSet<>(); Set<String> removePlaceIds = new HashSet<>(); - for (Place place : separatedNet.allPlaces()) { + for (Place place : petriNet.allPlaces()) { if (!place.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(location)) { removePlaceIds.add(place.getId()); } } - for (Transition transition : separatedNet.allTransitions()) { + for (Transition transition : petriNet.allTransitions()) { if (!transition.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(location)) { removedTransitionIds.add(transition.getId()); } } - for (Arc arc : separatedNet.allArcs()) { + for (Arc arc : petriNet.allArcs()) { if (removedTransitionIds.contains(arc.getSource().getId()) || removedTransitionIds.contains(arc.getTarget().getId()) || removePlaceIds.contains(arc.getSource().getId()) || removePlaceIds.contains(arc.getTarget().getId())) { logger.info("removing arc " + arc.getId() + " from net"); @@ -465,14 +414,14 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } } - for (Place place : separatedNet.allPlaces()) { + for (Place place : petriNet.allPlaces()) { if (!place.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(location)) { logger.info("removing place " + place.getId() + " from net"); place.removeSelf(); } } - for (Transition transition : separatedNet.allTransitions()) { + for (Transition transition : petriNet.allTransitions()) { if(transition.asInputSignalTransition().getStaticTransitionInformation().isTopicTransitionInformation()){ if (!transition.asInputSignalTransition().getStaticTransitionInformation().asTopicTransitionInformation().getSubNet().equals(location)) { @@ -489,10 +438,10 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { } } - separatedNet.flushTreeCache(); - separatedNet.flushAttrAndCollectionCache(); + petriNet.flushTreeCache(); + petriNet.flushAttrAndCollectionCache(); - return separatedNet; + return petriNet; } private static ToolInfo buildTopicToolSpecifics(String type, String location, String subnet, String topic, int inputLimit, int outputLimit, JastAddList<InputSignalBinding> inputSignalBindings) { @@ -603,4 +552,46 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { return null; } + + private static void reconnectInputSignals(InputSignalTransition sourceIst, InputSignalBinding isb) { + InputSignalBinding newIsb = new InputSignalBinding(); + newIsb.setInputSignalValue(isb.getInputSignalValue()); + newIsb.setTransitionID(isb.getTransitionID()); + newIsb.setId(isb.getId()); + newIsb.setInputSignalID(isb.getInputSignalID()); + + sourceIst.addMutualInputSignalBinding(newIsb); + } + + @NotNull + private static InputSignalTransition createRosInputTransition(InputSignalTransition ist, int serviceCount, String sufix) { + InputSignalTransition sourceIst = new InputSignalTransition(); + sourceIst.setName(new Name().setText(ist.getName().getText() + sufix + serviceCount)); + sourceIst.setId(ist.getId() + sufix + serviceCount); + return sourceIst; + } + + @NotNull + private static ServiceTransitionInformation copyServiceTransitionInformation(InputSignalTransition ist, String inLocation, String inSubNet) { + ServiceTransitionInformation tInfoSource = new ServiceTransitionInformation(); + tInfoSource.setSubNet(inSubNet); + tInfoSource.setLocation(inLocation); + tInfoSource.setServiceName(ist.getStaticTransitionInformation().asServiceTransitionInformation().getServiceName()); + return tInfoSource; + } + + private static void reconnectSourceTransitionSignalsAndArcs(Transition transition, InputSignalTransition ist, Place p, InputSignalTransition sourceIst) { + // Reconnect Input Signals + for (InputSignalBinding isb : ist.getStaticInputSignalBindingList()) { + reconnectInputSignals(sourceIst, isb); + } + + // Get all incoming arcs and connect them to new output transition + for (Arc arc : p.asOutputSignalPlace().getOutArcList().toArray(new Arc[0])) { + + if (arc.getTarget().getId().equals(transition.getId())) { + arc.setTarget(sourceIst); + } + } + } } \ No newline at end of file