diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java index 4ba7d5464859f316398672aa68c14bb7ca7e7a09..3a09e700dc4fe6f96b1cafd3fcb7efb5a4597f60 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java @@ -16,15 +16,15 @@ public class Main { public static void main(String[] args) { - String inputPath = (args.length > 0) ? args[0] : null; + /* String inputPath = (args.length > 0) ? args[0] : null; if (inputPath == null) { logger.error("No model found on given input path."); return; - } + }*/ - // List<PetriNet> petriNets = PnmlParser.parsePnml("/home/sebastian/git/dineros/pnml-relast-tools/pnml-relast-nets/src/main/resources/topicTestNets/structureTestNets/topic-structure-correct.pnml"); - List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); + List<PetriNet> petriNets = PnmlParser.parsePnml("/home/sebastian/git/dineros-v2/dineros/pnml-relast-tools/pnml-relast-splitter/src/main/nets/TestNet1.pnml"); + // List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>(); GlobalToLocalNetsPostProcessor processor = new GlobalToLocalNetsPostProcessor(); diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java index 8827e6c3d92d602e587a183bbf9051de2289622f..1147fa617f8e37f0a1a974d1e49ee159319ec243 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java +++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java @@ -1,11 +1,13 @@ package de.tudresden.inf.st.pnml.splitter.postprocessing; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; +import de.tudresden.inf.st.pnml.base.data.CommunicatorInformation; import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.splitter.constants.SplitterPnmlConstants; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -47,6 +49,8 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { Set<String> locations = getNodes(serviceCutNet); + updateToolSpecificsWithPlaceInfos(serviceCutNet); + logger.info("##############################################################################################"); PostProcessingUtils.printNet(serviceCutNet, true, false); @@ -283,55 +287,98 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { return petriNet; } - private ToolInfo updateToolSpecificsWithPlaceInfos(ToolInfo oldToolInfo) { + private void updateToolSpecificsWithPlaceInfos(PetriNet petriNet) { + + ToolInfo ti = buildToolSpecifics(petriNet); + JastAddList<ToolInfo> tiList = new JastAddList<>(); + tiList.add(ti); + petriNet.setToolspecificList(tiList); + petriNet.flushTreeCache(); - return null; } - private ToolInfo buildToolSpecifics(ToolInfo oldToolInfo) { + private void buildPlaceInfoListPart(Document doc, Element ports, Map<String, List<DinerosPlace>> map, String placeType) { - StringBuffer oldXMLContent = oldToolInfo.getFormattedXMLBuffer(); + for (Map.Entry<String, List<DinerosPlace>> entry : map.entrySet()) { + for (DinerosPlace dp : entry.getValue()) { + Element port = doc.createElement(PnmlConstants.CHANNEL_PORT_KEY); + port.appendChild(doc.createTextNode(dp.getId())); - try { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Attr attr1 = doc.createAttribute(PnmlConstants.CHANNEL_NAME_KEY); + attr1.setValue(entry.getKey()); + port.setAttributeNode(attr1); - Document doc = docBuilder.newDocument(); - Element rootElement = doc.createElement(SplitterPnmlConstants.TOOLSPECIFIC_KEY); - rootElement.setAttribute(SplitterPnmlConstants.TOOL_KEY, SplitterPnmlConstants.SPLITTER_TOOL_NAME); - rootElement.setAttribute(SplitterPnmlConstants.VERSION_KEY, SplitterPnmlConstants.SPLITTER_TOOL_VERSION); - doc.appendChild(rootElement); + Attr attr2 = doc.createAttribute(PnmlConstants.CHANNEL_PLACE_TYPE_KEY); + attr2.setValue(placeType); + port.setAttributeNode(attr2); + + ports.appendChild(port); + } + } + } - Element pubPlaces = doc.createElement("publisherPlaces"); - Element subPlaces = doc.createElement("publisherPlaces"); + private void buildPlaceInfoListServerPart(Document doc, Element ports, Map<String, DinerosPlace> map, String placeType) { + for (Map.Entry<String, DinerosPlace> entry : map.entrySet()) { - for (Map.Entry<String, List<DinerosPlace>> entry : topicPublisherPlaces.entrySet()) { + Element port = doc.createElement(PnmlConstants.CHANNEL_PORT_KEY); + port.appendChild(doc.createTextNode(entry.getValue().getId())); - } + Attr attr1 = doc.createAttribute(PnmlConstants.CHANNEL_NAME_KEY); + attr1.setValue(entry.getKey()); + port.setAttributeNode(attr1); + Attr attr2 = doc.createAttribute(PnmlConstants.CHANNEL_PLACE_TYPE_KEY); + attr2.setValue(placeType); + port.setAttributeNode(attr2); - /* for (InputSignalBinding isb : inputSignalBindings) { + ports.appendChild(port); - Element binding = doc.createElement(PnmlConstants.INPUT_SIGNAL_BINDING_KEY); + } + } - Element transitionID = doc.createElement(PnmlConstants.TRANSITION_ID_KEY); - transitionID.appendChild(doc.createTextNode(isb.getTransitionID())); - binding.appendChild(transitionID); + private ToolInfo buildToolSpecifics(PetriNet petriNet) { - Element inputsignalID = doc.createElement(PnmlConstants.INPUT_SIGNAL_ID_KEY); - inputsignalID.appendChild(doc.createTextNode(isb.getInputSignalID())); - binding.appendChild(inputsignalID); + // get old infos + CommunicatorInformation ci = ToolSpecificsParser.getCommunicatorInformationFromToolSpecifics(petriNet.getToolspecifics()); - Element initialvalue = doc.createElement(PnmlConstants.CURRENT_VALUE_KEY); - initialvalue.appendChild(doc.createTextNode(String.valueOf(isb.getInputSignalValue()))); - binding.appendChild(initialvalue); + // build place infos + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - bindings.appendChild(binding); - } + Document doc = docBuilder.newDocument(); + Element rootElement = doc.createElement(SplitterPnmlConstants.TOOLSPECIFIC_KEY); + rootElement.setAttribute(SplitterPnmlConstants.TOOL_KEY, SplitterPnmlConstants.SPLITTER_TOOL_NAME); + rootElement.setAttribute(SplitterPnmlConstants.VERSION_KEY, SplitterPnmlConstants.SPLITTER_TOOL_VERSION); + doc.appendChild(rootElement); + Element ports = doc.createElement(PnmlConstants.CHANNEL_PORTS_KEY); + + buildPlaceInfoListPart(doc, ports, topicPublisherPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_PUB_KEY); + buildPlaceInfoListPart(doc, ports, topicSubscriberPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_SUB_KEY); + buildPlaceInfoListPart(doc, ports, serviceClientReqPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_REQ_KEY); + buildPlaceInfoListPart(doc, ports, serviceClientResPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_RES_KEY); + buildPlaceInfoListServerPart(doc, ports, serviceServerReqPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_SERVER_REQ_KEY); + buildPlaceInfoListServerPart(doc, ports, serviceServerResPlaces, PnmlConstants.CHANNEL_PLACE_TYPE_SERVER_RES_KEY); + + Element coms = doc.createElement(PnmlConstants.COMMUNICATORS); + + for(String s : ci.getCommunicatorMapping().keySet()){ + for(String type : ci.getCommunicatorMapping().get(s)){ + Element com = doc.createElement(PnmlConstants.COMMUNICATOR); + Element cType = doc.createElement(PnmlConstants.COMMUNICATOR_TYPE); + cType.setTextContent(type); + com.appendChild(cType); + Element cSubnet = doc.createElement(PnmlConstants.COMMUNICATOR_SUBNET); + cSubnet.setTextContent(s); + com.appendChild(cSubnet); + coms.appendChild(com); + } + } - rootElement.appendChild(bindings); + rootElement.appendChild(coms); + rootElement.appendChild(ports); TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); @@ -343,12 +390,13 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> { toolInfo.setVersion(SplitterPnmlConstants.SPLITTER_TOOL_VERSION); toolInfo.setTool(SplitterPnmlConstants.SPLITTER_TOOL_NAME); - return toolInfo;*/ + return toolInfo; } catch (ParserConfigurationException pce) { pce.printStackTrace(); + } catch (TransformerException e) { + throw new RuntimeException(e); } return null; } - } \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/PostProcessingUtils.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/PostProcessingUtils.java index 3ab3f122e85984c666f91110d83ea9112ed1850a..d520b56ff382d684ee7b7851de6df858d1fef1e1 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/PostProcessingUtils.java +++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/PostProcessingUtils.java @@ -267,7 +267,10 @@ public class PostProcessingUtils { if (ist != null && ist.getMutableTransitionInformation() == null) { if(ist.getStaticTransitionInformation().isSignalTransitionInformation()){ - System.out.println(ist.getStaticTransitionInformation().asSignalTransitionInformation().getClause().printClause()); + InputSignalClause isc = ist.getStaticTransitionInformation().asSignalTransitionInformation().getClause(); + if(isc != null){ + System.out.println(isc.printClause()); + } } } }