diff --git a/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd b/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd index 1702d88e9bb1acc15e0914b1a564e40953ed5b73..e66998cb1d6e68ed89df81dd312529d4a578dc04 100644 --- a/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd +++ b/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd @@ -4,14 +4,29 @@ aspect ServiceRewrites { 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 + .updateServiceTransitionToolspecifics(petriNet(), serverCapacity, this); + Page containerPage = new Page(); containerPage.setId(this.getId() + "-" + PnmlConstants.PAGE_SERVER_CONTAINER_SUFFIX); diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java new file mode 100644 index 0000000000000000000000000000000000000000..cf20562524df264b5afa28b53443af20d7a3427a --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java @@ -0,0 +1,54 @@ +package de.tudresden.inf.st.pnml.flatter.transform; + +import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; +import de.tudresden.inf.st.pnml.jastadd.model.*; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class ToolspecificsTransformer { + + /** + * Updates service transitions toolspecifics after service instance flattening + * serverInput/serverOutput remain unchanged because we know the new one are id + index + suffix + * only client-wise channels are updated + */ + public static void updateServiceTransitionToolspecifics(PetriNet petriNet, int serviceCapacity, Page sPage) { + + Set<String> pagePlaceIds = new HashSet<>(); + + for (PnObject p : sPage.getObjectList()) { + if (p.isPlaceObject()) { + pagePlaceIds.add(p.getId()); + } + } + + for (DinerosTransition dt : petriNet.allDinerosTransitions()) { + if (dt.getStaticTransitionInformation().isServiceTransitionInformation()) { + for (ServiceChannel sc : dt.getMutableTransitionInformation().asServiceTransitionInformation().getClientChannelList()) { + + if (pagePlaceIds.contains(sc.getRequestPlaceId().split("-")[0]) + && pagePlaceIds.contains(sc.getResponsePlaceId().split("-")[0])) { + + if (dt.getMutableTransitionInformation() == null) { + dt.setMutableTransitionInformation(dt.getStaticTransitionInformation().asServiceTransitionInformation().treeCopyNoTransform()); + } + + for (int i = 0; i < serviceCapacity; i++) { + + ServiceChannel newSc = new ServiceChannel(); + newSc.setId(UUID.randomUUID().toString()); + newSc.setRequestPlaceId(sc.getRequestPlaceId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX); + newSc.setResponsePlaceId(sc.getResponsePlaceId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX); + dt.getMutableTransitionInformation().asServiceTransitionInformation().getClientChannelList().add(newSc); + } + + sc.removeSelf(); + break; + } + } + } + } + } +}