From 7aa15a3eabdef55dade6ab49e55d847b2a396bbf Mon Sep 17 00:00:00 2001 From: SebastianEbert <sebastian.ebert@tu-dresden.de> Date: Wed, 14 Jun 2023 18:07:28 +0200 Subject: [PATCH] rewrite: server proto -> server instances --- .../flatter/rewrites/ServiceRewrites.jadd | 15 ++++++ .../transform/ToolspecificsTransformer.java | 54 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ToolspecificsTransformer.java diff --git a/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd b/src/main/jastadd/flatter/rewrites/ServiceRewrites.jadd index 1702d88..e66998c 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 0000000..cf20562 --- /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; + } + } + } + } + } +} -- GitLab