https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-Process-Orchestration-blog-posts.xml SAP Community - SAP Process Orchestration 2024-05-20T20:01:20.202730+00:00 python-feedgen SAP Process Orchestration blog posts in SAP Community https://community.sap.com/t5/technology-blogs-by-members/managing-keys-and-certificates-using-keystore-explorer/ba-p/13573190 Managing keys and certificates using KeyStore Explorer 2024-01-02T12:12:01+01:00 RaghuVamseedhar https://community.sap.com/t5/user/viewprofilepage/user-id/191580 This blog explores the fundamentals of cryptography, a vast subject that cannot be comprehensively covered in a single entry. For precise details, it is recommended to refer to the official documentation. The KeyStore Explorer application offers a user-friendly solution for creating, managing, and inspecting keystores, keys, certificates, and certificate requests. It serves as a viable alternative to OpenSSL commands.<BR /><BR /><IFRAME width="560" height="315" src="https://www.youtube.com/embed/KdzEVxMLa_Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></IFRAME> 2024-01-02T12:12:01+01:00 https://community.sap.com/t5/technology-blogs-by-sap/using-generative-ai-to-migrate-java-mapping-to-cloud-integration-part-1-the/ba-p/13583434 Using Generative AI to Migrate Java Mapping to Cloud Integration - Part 1: The Concept 2024-01-31T10:34:17.740000+01:00 Philip-Li https://community.sap.com/t5/user/viewprofilepage/user-id/1382626 <H2 id="toc-hId-964849703">Introduction: Java Mapping</H2><P>Java mapping is one of the commonly used mapping types in SAP Process Orchestration.</P><P>Essentially, a Java mapping is a special Java class that implements the Java Mapping API (Package com.sap.aii.mapping.api), to process XML documents, use Java API for XML Processing (JAXP), for example. The JAXP supports the Document Object Model (DOM) and the Simple API for XML (SAX). This gives you great flexibility for mapping-programming with Java.</P><P>The diagram below depicts how Java mapping works in SAP Process Orchestration.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="How_Java_Mapping_Works.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53778i2A071FAAF38F876C/image-size/large?v=v2&amp;px=999" role="button" title="How_Java_Mapping_Works.png" alt="How_Java_Mapping_Works.png" /></span></P><H2 id="toc-hId-768336198">&nbsp;</H2><H2 id="toc-hId-571822693"><SPAN>The Use Case: Migrate Java Mapping to Cloud Integration</SPAN></H2><P>In SAP Cloud Integration, which is a core capability of SAP Integration Suite, a<SPAN>&nbsp;</SPAN><STRONG>Java mapping cannot run inside an integration flow directly</STRONG>. The most similar integration flow step (artifact) is a transformation script, either JavaScript or Groovy script.</P><P>Unlike the Java mapping in SAP Process Orchestration, the Groovy script can be directly assigned to the SAP Cloud Integration flow, without explicitly compiling to other formats or embedding into other artifacts.</P><P>The diagram below depicts how Groovy script works in SAP Cloud Integration.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="How_Groovy_Script_Works.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53779i3B20A9D7DBB48E29/image-size/large?v=v2&amp;px=999" role="button" title="How_Groovy_Script_Works.png" alt="How_Groovy_Script_Works.png" /></span></DIV><DIV class="">&nbsp;</DIV><DIV class="">To<SPAN>&nbsp;</SPAN><STRONG>reuse</STRONG><SPAN>&nbsp;</SPAN>the business logic of the Java mapping in SAP Cloud Integration, some migration works are required.</DIV><P>For example, you can:</P><UL><LI>wrap the original Java mapping code inside a Groovy script (mix Groovy and Java code)</LI><LI>upload the compiled Jar file to integration flow, invoke the Java mapping via additional (customized) adapter code</LI><LI>re-implement the same logic from scratch, using either Groovy or JavaScript language</LI></UL><P>&nbsp;</P><H2 id="toc-hId-375309188">The Idea: Generate Groovy from Java via Generative AI</H2><P>In the blog, we will try from a new perspective: Leverage the emerging generative AI to migrate SAP Process Orchestration Java mapping to SAP Cloud Integration Groovy script.</P><P><STRONG>The core of the idea is: Provide the Java mapping code as the raw input, plus integration domain-specific prompts as instruction, to guide the generative AI to produce Groovy code by "translating" existing Java code.</STRONG></P><P>The diagram below depicts the main steps of the solution.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Main_Steps.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53780i308794203E47CC5F/image-size/large?v=v2&amp;px=999" role="button" title="Main_Steps.png" alt="Main_Steps.png" /></span><P>&nbsp;<SPAN>Let us dig into these steps one by one.</SPAN></P></DIV><H3 id="toc-hId-307878402">Preparation</H3><P>Before the generation, you should collect the following artifacts from the SAP Process Orchestration system:</P><UL><LI><STRONG>Source code of the Java mapping</STRONG><UL><LI>will be used as part of the input for the generative AI call.</LI></UL></LI></UL><UL><LI><STRONG>Sample input XML document of the Java mapping</STRONG><UL><LI>will be used as input for the generated Groovy script, which then produces an output XML.</LI></UL></LI></UL><UL><LI><STRONG>Sample output XML document of the Java mapping</STRONG><UL><LI>will be used for evaluation, by comparing it with the XML produced by the generated Groovy script.</LI></UL></LI></UL><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>Normally, the Java mapping developer can provide the Java mapping source code directly.<BR />If this is not true for your case, you can export the Java mapping archive from your Process Orchestration system. The exported archive is a Java archive (with extension .jar). This Java archive contains the compiled Java class (with extension .class). You can use a Java decompiler tool such as jd-gui to decompile the Java class file to Java source code</P><H3 id="toc-hId-111364897">Generation</H3><H4 id="toc-hId-43934111">Craft Prompt</H4><P>In the context of generative AI, a well-crafted prompt is crucial for obtaining accurate and useful results from the language model.<BR />In our case, the prompts should be crafted with SAP Process Orchestration, Cloud Integration relevant domain knowledge.</P><P>For example, the following prompt contains integration relevant context and very specific requirements:</P><UL><LI><EM><STRONG>Please convert this SAP Process Orchestration Java mapping code to Cloud Integration Groovy script, fulfill following requirements:</STRONG></EM><UL><LI><EM>Use Groovy 2 syntax, must compatible with JDK 8</EM></LI><LI><EM>Generate def Message processData(Message message), don't wrap it in any class</EM></LI><LI><EM>Remember to import necessary packages</EM></LI><LI><EM>Run the generated code by yourself, make sure no syntax error</EM></LI><LI><EM>Just provide code, don't say anything else</EM></LI></UL></LI></UL><H4 id="toc-hId--152579394">Use Generative AI</H4><P>With the Java mapping source code and relevant prompt being prepared, the next step is to send the complete prompt text to the Large Language Model (LLM).</P><P>You can do this:</P><UL><LI>directly via the provider company's website UI</LI><LI>programmatically via their (rest) API call.</LI></UL><P>Depending on the AI provider you chose, the quality of the prompt, and the complexity of Java mapping, the quality of the generated Groovy code may vary significantly.</P><P data-unlink="true"><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>The LLM we used is described in the<SPAN>&nbsp;</SPAN><A title="Disclaimer" href="#h_479955508171706423108885" target="_self" rel="nofollow noopener noreferrer">Disclaimer<SPAN>&nbsp;</SPAN></A>section.</P><H3 id="toc-hId--478175618">Evaluation</H3><P>How can you evaluate the quality of generated Groovy code? Is it correct, both syntactically and logically?</P><P>There are different options/aspects to do the evaluation.</P><P>For example, you can:</P><UL><LI>use/build a local tool (e.g., IDE like IntelliJ IDEA) to validate the syntax of the generated Groovy code</LI><LI>build a local simulator to run the generated Groovy code</LI><LI>use/build a tool to compare the Groovy-produced XML with the expected XML</LI></UL><P>However,<SPAN>&nbsp;</SPAN><STRONG>a very straightforward way is to run the generated Groovy script into a real integration flow</STRONG>:</P><UL><LI>create an integration flow</LI><LI>upload the generated Groovy code to the integration flow</LI><LI>send the prepared input XML to the integration flow<UL><LI>the generated Groovy script will run the mapping logic, and then generate the output XML</LI></UL></LI><LI>compare the expected XML with the output XML of the integration flow message.</LI></UL><H2 id="toc-hId--803771842">Conclusion</H2><P>Sometimes, the generated code just works perfectly, you don't have to change anything. Sometimes, the generated code has small syntax or logical issues, you need to verify and fix them manually.<BR />Nevertheless, in general, the<SPAN>&nbsp;</SPAN><STRONG>generated code can be used as a very good starting point for the migration</STRONG>.<BR />The generative AI can<SPAN>&nbsp;</SPAN><STRONG>help accelerate the migration</STRONG><SPAN>&nbsp;</SPAN>of SAP Process Orchestration Java mappings.<BR />You can<SPAN>&nbsp;</SPAN><STRONG>use it as your copilot</STRONG><SPAN>&nbsp;</SPAN>of the migration.</P><H2 id="toc-hId--653030990">Next Step</H2><P>In the&nbsp;<A href="https://community.sap.com/t5/technology-blogs-by-sap/using-generative-ai-to-migrate-java-mapping-to-cloud-integration-part-2-a/ba-p/13583450" target="_self"><SPAN>part 2</SPAN></A><SPAN>&nbsp;</SPAN>of this blog series, we will try the idea with a sample Java mapping scenario.</P><H2 id="toc-hId--849544495">Disclaimer</H2><H3 id="toc-hId--1339461007">Generative AI and Large Language Model (LLM)</H3><P>In the blog, we use the terms generative AI and LLM interchangeably.<BR />In theory, the idea is LLM-independent, but at the time of this blog, we<SPAN>&nbsp;</SPAN><STRONG>only tried the idea with OpenAI's GPT-3.5 and GPT-4 models</STRONG>.</P><H3 id="toc-hId--1535974512">Security</H3><P>When you invoke the generative AI, you have to send your source code to the AI provider. This implies the business logic is completely exposed to the AI provider, this can lead to security/IP-related issues if the AI provider is not reliable.<BR />So please always keep this in mind, and<SPAN>&nbsp;</SPAN><STRONG>only use the AI provider you TRUST</STRONG>.</P><H3 id="toc-hId--1732488017">Support</H3><P>This idea described in the blog is not an SAP officially released feature,<SPAN>&nbsp;</SPAN><STRONG>SAP will not formally support</STRONG><SPAN>&nbsp;</SPAN>any implementation of this idea.</P><H3 id="toc-hId--1929001522">AI Limitation</H3><P>The AI-generated content is not predictable, you may get a different response every time even you feed it with the same input, and there is no chance to debug why the response is different.</P><P>Generative AI is incredibly good at generating code, but AI-generated code is not always correct, sometimes the generated code has syntax issues, sometimes it has logical issues.<BR />So you cannot use the generated code for production use directly.</P><P>Depending on the size of your Java mapping code, the AI token consumption could go beyond the token limitation, this cloud lead to higher costs, and even worse, a low-quality code (the generated code might be truncated due to token limitation).</P><H3 id="toc-hId--2125515027">Suitable Scenario</H3><P>The most suitable scenario for this idea is: The Java mapping does not have too many dependencies.</P><P>If the Java mapping class (which implements the Java Mapping API) itself has too many dependency Java classes, you will have to do the generation not only for the main Java mapping class, but also for its dependency Java classes as well.</P><P>This will increase not only the cost of AI token consumption but also the complexity of code integration (combining different codes together).</P> 2024-01-31T10:34:17.740000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/using-generative-ai-to-migrate-java-mapping-to-cloud-integration-part-2-a/ba-p/13583450 Using Generative AI to Migrate Java Mapping to Cloud Integration - Part 2: A Sample 2024-01-31T10:37:59.023000+01:00 Philip-Li https://community.sap.com/t5/user/viewprofilepage/user-id/1382626 <H2 id="toc-hId-964849761">Introduction: Sample Java Mapping Scenario</H2><P>In the<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/using-generative-ai-to-migrate-java-mapping-to-cloud-integration-part-1-the/ba-p/13583434" target="_self">part 1</A><SPAN>&nbsp;</SPAN>of this blog series, we introduced the idea at the conceptual level.<BR />In this part, we will try the idea with a sample Java mapping that maps flight booking data.</P><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>This sample is a<SPAN>&nbsp;</SPAN><STRONG>fictitious</STRONG><SPAN>&nbsp;</SPAN>scenario, it's used for demo purpose only.</P><P>The diagram below depicts the data model and logic of the Java mapping in SAP Process Orchestration.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Mapping_Types.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53794i35ADB8166B105EE8/image-size/large?v=v2&amp;px=999" role="button" title="Mapping_Types.png" alt="Mapping_Types.png" /></span></P><P>It implements the following mapping logic:</P><UL><LI><STRONG>Determine the field "Preferred_Language" based on the field "Customer_Country"</STRONG><UL><LI>If the preferred language is already provided, use the original value, no further logic for this field</LI><LI>Find the value from a mapping list, e.g., if the customer country is DE, then the preferred language is German</LI><LI>If no value is found from the mapping list, use the default language "English"</LI></UL></LI></UL><UL><LI><STRONG>Determine the field "Discounted_Price" based on the fields "Flight_Date" and "Full_Price"</STRONG><UL><LI>If the flight date is within a peak season (April 1 to October 31), no discount</LI><LI>If the flight date is NOT within a peak season, apply a 10% discount</LI></UL></LI></UL><UL><LI><STRONG>Determine the field "Total_Price"</STRONG><UL><LI>Sum up the field "Discounted_Price" of each flight, and assign the total value to the field "Total_Price"</LI></UL></LI></UL><UL><LI><STRONG>Keep original values for other fields</STRONG></LI></UL><H2 id="toc-hId-768336256">Migration Process</H2><P>Recap: The diagram below depicts the main steps of the solution.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Main_Steps.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53795iE17817D8B0408455/image-size/large?v=v2&amp;px=999" role="button" title="Main_Steps.png" alt="Main_Steps.png" /></span><P>&nbsp;<SPAN>Let us follow these steps one by one.</SPAN></P></DIV><H3 id="toc-hId-700905470">Preparation</H3><H4 id="toc-hId-633474684">Source Code of the Java Mapping</H4><P>The Java mapping is a Java class that extends the AbstractTransformation abstract class.<BR />Its source code is as below.</P><DIV class=""><PRE><SPAN class="">package</SPAN> <SPAN class="">com</SPAN>.<SPAN class="">sap</SPAN>.<SPAN class="">poc</SPAN>.<SPAN class="">java</SPAN>.<SPAN class="">mapper</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">com</SPAN>.<SPAN class="">sap</SPAN>.<SPAN class="">aii</SPAN>.<SPAN class="">mapping</SPAN>.<SPAN class="">api</SPAN>.<SPAN class="">AbstractTransformation</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">com</SPAN>.<SPAN class="">sap</SPAN>.<SPAN class="">aii</SPAN>.<SPAN class="">mapping</SPAN>.<SPAN class="">api</SPAN>.<SPAN class="">StreamTransformationException</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">com</SPAN>.<SPAN class="">sap</SPAN>.<SPAN class="">aii</SPAN>.<SPAN class="">mapping</SPAN>.<SPAN class="">api</SPAN>.<SPAN class="">TransformationInput</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">com</SPAN>.<SPAN class="">sap</SPAN>.<SPAN class="">aii</SPAN>.<SPAN class="">mapping</SPAN>.<SPAN class="">api</SPAN>.<SPAN class="">TransformationOutput</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">org</SPAN>.<SPAN class="">w3c</SPAN>.<SPAN class="">dom</SPAN>.<SPAN class="">Document</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">org</SPAN>.<SPAN class="">w3c</SPAN>.<SPAN class="">dom</SPAN>.<SPAN class="">Element</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">org</SPAN>.<SPAN class="">w3c</SPAN>.<SPAN class="">dom</SPAN>.<SPAN class="">NodeList</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">javax</SPAN>.<SPAN class="">xml</SPAN>.<SPAN class="">parsers</SPAN>.<SPAN class="">DocumentBuilder</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">javax</SPAN>.<SPAN class="">xml</SPAN>.<SPAN class="">parsers</SPAN>.<SPAN class="">DocumentBuilderFactory</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">javax</SPAN>.<SPAN class="">xml</SPAN>.<SPAN class="">transform</SPAN>.<SPAN class="">Transformer</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">javax</SPAN>.<SPAN class="">xml</SPAN>.<SPAN class="">transform</SPAN>.<SPAN class="">TransformerFactory</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">javax</SPAN>.<SPAN class="">xml</SPAN>.<SPAN class="">transform</SPAN>.<SPAN class="">dom</SPAN>.<SPAN class="">DOMSource</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">javax</SPAN>.<SPAN class="">xml</SPAN>.<SPAN class="">transform</SPAN>.<SPAN class="">stream</SPAN>.<SPAN class="">StreamResult</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">java</SPAN>.<SPAN class="">io</SPAN>.*; <SPAN class="">import</SPAN> <SPAN class="">java</SPAN>.<SPAN class="">util</SPAN>.<SPAN class="">HashMap</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">java</SPAN>.<SPAN class="">util</SPAN>.<SPAN class="">Map</SPAN>; <SPAN class="">public</SPAN> <SPAN class="">class</SPAN> <SPAN class="">BookingDataMapper_DOM</SPAN> <SPAN class="">extends</SPAN> <SPAN class="">AbstractTransformation</SPAN> { <SPAN class="">private</SPAN> <SPAN class="">Map</SPAN>&lt;<SPAN class="">String</SPAN>, <SPAN class="">String</SPAN>&gt; <SPAN class="">countryToLanguageMap</SPAN>; <SPAN class="">public</SPAN> <SPAN class="">void</SPAN> <SPAN class="">transform</SPAN>(<SPAN class="">TransformationInput</SPAN> <SPAN class="">transformationInput</SPAN>, <SPAN class="">TransformationOutput</SPAN> <SPAN class="">transformationOutput</SPAN>) <SPAN class="">throws</SPAN> <SPAN class="">StreamTransformationException</SPAN> { <SPAN class="">InputStream</SPAN> <SPAN class="">inputstream</SPAN> = <SPAN class="">transformationInput</SPAN>.<SPAN class="">getInputPayload</SPAN>().<SPAN class="">getInputStream</SPAN>(); <SPAN class="">OutputStream</SPAN> <SPAN class="">outputstream</SPAN> = <SPAN class="">transformationOutput</SPAN>.<SPAN class="">getOutputPayload</SPAN>().<SPAN class="">getOutputStream</SPAN>(); <SPAN class="">mapBookingData</SPAN>(<SPAN class="">inputstream</SPAN>, <SPAN class="">outputstream</SPAN>); } <SPAN class="">public</SPAN> <SPAN class="">void</SPAN> <SPAN class="">mapBookingData</SPAN>(<SPAN class="">InputStream</SPAN> <SPAN class="">inputstream</SPAN>, <SPAN class="">OutputStream</SPAN> <SPAN class="">outputstream</SPAN>) { <SPAN class="">try</SPAN> { <SPAN class="">DocumentBuilder</SPAN> <SPAN class="">docBuilder</SPAN> = <SPAN class="">DocumentBuilderFactory</SPAN>.<SPAN class="">newInstance</SPAN>().<SPAN class="">newDocumentBuilder</SPAN>(); <SPAN class="">Document</SPAN> <SPAN class="">inDoc</SPAN> = <SPAN class="">docBuilder</SPAN>.<SPAN class="">parse</SPAN>(<SPAN class="">inputstream</SPAN>); <SPAN class="">Document</SPAN> <SPAN class="">outDoc</SPAN> = <SPAN class="">docBuilder</SPAN>.<SPAN class="">newDocument</SPAN>(); <SPAN class="">outDoc</SPAN> = <SPAN class="">inDoc</SPAN>; <SPAN class="">setPreferredLanguage</SPAN>(<SPAN class="">outDoc</SPAN>); <SPAN class="">calculateBookingPrice</SPAN>(<SPAN class="">outDoc</SPAN>); <SPAN class="">Transformer</SPAN> <SPAN class="">transformer</SPAN> = <SPAN class="">TransformerFactory</SPAN>.<SPAN class="">newInstance</SPAN>().<SPAN class="">newTransformer</SPAN>(); <SPAN class="">transformer</SPAN>.<SPAN class="">transform</SPAN>(<SPAN class="">new</SPAN> <SPAN class="">DOMSource</SPAN>(<SPAN class="">outDoc</SPAN>), <SPAN class="">new</SPAN> <SPAN class="">StreamResult</SPAN>(<SPAN class="">outputstream</SPAN>)); } <SPAN class="">catch</SPAN> (<SPAN class="">Exception</SPAN> <SPAN class="">e</SPAN>) { <SPAN class="">e</SPAN>.<SPAN class="">printStackTrace</SPAN>(); <SPAN class="">this</SPAN>.<SPAN class="">getTrace</SPAN>().<SPAN class="">addDebugMessage</SPAN>(<SPAN class="">e</SPAN>.<SPAN class="">toString</SPAN>()); } } <SPAN class="">private</SPAN> <SPAN class="">void</SPAN> <SPAN class="">setPreferredLanguage</SPAN>(<SPAN class="">Document</SPAN> <SPAN class="">outDoc</SPAN>) <SPAN class="">throws</SPAN> <SPAN class="">Exception</SPAN> { <SPAN class="">Element</SPAN> <SPAN class="">preferredLanguageElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">outDoc</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Preferred_Language"</SPAN>).<SPAN class="">item</SPAN>(<SPAN class="">0</SPAN>); <SPAN class="">if</SPAN> (<SPAN class="">preferredLanguageElement</SPAN>.<SPAN class="">getTextContent</SPAN>().<SPAN class="">isEmpty</SPAN>()) { <SPAN class="">loadCountryToLanguageMap</SPAN>(); <SPAN class="">// Find the Customer_Country element</SPAN> <SPAN class="">Element</SPAN> <SPAN class="">customerCountryElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">outDoc</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Customer_Country"</SPAN>).<SPAN class="">item</SPAN>(<SPAN class="">0</SPAN>); <SPAN class="">// Get the customer country value</SPAN> <SPAN class="">String</SPAN> <SPAN class="">customerCountry</SPAN> = <SPAN class="">customerCountryElement</SPAN>.<SPAN class="">getTextContent</SPAN>().<SPAN class="">trim</SPAN>(); <SPAN class="">// Find the corresponding language in the map</SPAN> <SPAN class="">String</SPAN> <SPAN class="">language</SPAN> = <SPAN class="">countryToLanguageMap</SPAN>.<SPAN class="">get</SPAN>(<SPAN class="">customerCountry</SPAN>); <SPAN class="">if</SPAN> (<SPAN class="">language</SPAN> != <SPAN class="">null</SPAN>) { <SPAN class="">// Update the Preferred_Language element with the found language</SPAN> <SPAN class="">preferredLanguageElement</SPAN>.<SPAN class="">setTextContent</SPAN>(<SPAN class="">language</SPAN>); } <SPAN class="">else</SPAN> { <SPAN class="">preferredLanguageElement</SPAN>.<SPAN class="">setTextContent</SPAN>(<SPAN class="">"English"</SPAN>); } } } <SPAN class="">private</SPAN> <SPAN class="">boolean</SPAN> <SPAN class="">isSlowSeason</SPAN>(<SPAN class="">String</SPAN> <SPAN class="">date</SPAN>) { <SPAN class="">int</SPAN> <SPAN class="">iData</SPAN> = <SPAN class="">Integer</SPAN>.<SPAN class="">parseInt</SPAN>(<SPAN class="">date</SPAN>.<SPAN class="">substring</SPAN>(<SPAN class="">4</SPAN>)); <SPAN class="">int</SPAN> <SPAN class="">iStartDate</SPAN> = <SPAN class="">401</SPAN>; <SPAN class="">int</SPAN> <SPAN class="">iEndDate</SPAN> = <SPAN class="">1031</SPAN>; <SPAN class="">return</SPAN> !(<SPAN class="">iData</SPAN> &gt;= <SPAN class="">iStartDate</SPAN> &amp;&amp; <SPAN class="">iData</SPAN> &lt;= <SPAN class="">iEndDate</SPAN>); } <SPAN class="">private</SPAN> <SPAN class="">void</SPAN> <SPAN class="">loadCountryToLanguageMap</SPAN>() <SPAN class="">throws</SPAN> <SPAN class="">Exception</SPAN> { <SPAN class="">countryToLanguageMap</SPAN> = <SPAN class="">new</SPAN> <SPAN class="">HashMap</SPAN>&lt;&gt;(); <SPAN class="">countryToLanguageMap</SPAN>.<SPAN class="">put</SPAN>(<SPAN class="">"DE"</SPAN>, <SPAN class="">"German"</SPAN>); <SPAN class="">countryToLanguageMap</SPAN>.<SPAN class="">put</SPAN>(<SPAN class="">"CN"</SPAN>, <SPAN class="">"Chinese"</SPAN>); } <SPAN class="">private</SPAN> <SPAN class="">void</SPAN> <SPAN class="">calculateBookingPrice</SPAN>(<SPAN class="">Document</SPAN> <SPAN class="">outDoc</SPAN>) { <SPAN class="">NodeList</SPAN> <SPAN class="">flightsList</SPAN> = <SPAN class="">outDoc</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Flight"</SPAN>); <SPAN class="">int</SPAN> <SPAN class="">totalDiscountedPrice</SPAN> = <SPAN class="">0</SPAN>; <SPAN class="">// Loop through each "Flights" element</SPAN> <SPAN class="">for</SPAN> (<SPAN class="">int</SPAN> <SPAN class="">i</SPAN> = <SPAN class="">0</SPAN>; <SPAN class="">i</SPAN> &lt; <SPAN class="">flightsList</SPAN>.<SPAN class="">getLength</SPAN>(); <SPAN class="">i</SPAN>++) { <SPAN class="">Element</SPAN> <SPAN class="">flightElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">flightsList</SPAN>.<SPAN class="">item</SPAN>(<SPAN class="">i</SPAN>); <SPAN class="">Element</SPAN> <SPAN class="">flightDateElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">flightElement</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Flight_Date"</SPAN>).<SPAN class="">item</SPAN>(<SPAN class="">0</SPAN>); <SPAN class="">Element</SPAN> <SPAN class="">fullPriceElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">flightElement</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Full_Price"</SPAN>).<SPAN class="">item</SPAN>(<SPAN class="">0</SPAN>); <SPAN class="">Element</SPAN> <SPAN class="">discountedPriceElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">flightElement</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Discounted_Price"</SPAN>).<SPAN class="">item</SPAN>(<SPAN class="">0</SPAN>); <SPAN class="">// Get the values</SPAN> <SPAN class="">String</SPAN> <SPAN class="">flightDate</SPAN> = <SPAN class="">flightDateElement</SPAN>.<SPAN class="">getTextContent</SPAN>(); <SPAN class="">int</SPAN> <SPAN class="">fullPrice</SPAN> = <SPAN class="">Integer</SPAN>.<SPAN class="">parseInt</SPAN>(<SPAN class="">fullPriceElement</SPAN>.<SPAN class="">getTextContent</SPAN>()); <SPAN class="">if</SPAN> (<SPAN class="">isSlowSeason</SPAN>(<SPAN class="">flightDate</SPAN>)) { <SPAN class="">// Calculate the discounted price as 90% of the full price</SPAN> <SPAN class="">int</SPAN> <SPAN class="">discountedPrice</SPAN> = (<SPAN class="">int</SPAN>) (<SPAN class="">fullPrice</SPAN> * <SPAN class="">0.9</SPAN>); <SPAN class="">discountedPriceElement</SPAN>.<SPAN class="">setTextContent</SPAN>(<SPAN class="">String</SPAN>.<SPAN class="">valueOf</SPAN>(<SPAN class="">discountedPrice</SPAN>)); <SPAN class="">totalDiscountedPrice</SPAN> += <SPAN class="">discountedPrice</SPAN>; } <SPAN class="">else</SPAN> { <SPAN class="">totalDiscountedPrice</SPAN> += <SPAN class="">fullPrice</SPAN>; <SPAN class="">discountedPriceElement</SPAN>.<SPAN class="">setTextContent</SPAN>(<SPAN class="">String</SPAN>.<SPAN class="">valueOf</SPAN>(<SPAN class="">fullPrice</SPAN>)); } } <SPAN class="">// Update the Total_Price element with the sum of discounted prices</SPAN> <SPAN class="">Element</SPAN> <SPAN class="">totalPriceElement</SPAN> = (<SPAN class="">Element</SPAN>) <SPAN class="">outDoc</SPAN>.<SPAN class="">getElementsByTagName</SPAN>(<SPAN class="">"Total_Price"</SPAN>).<SPAN class="">item</SPAN>(<SPAN class="">0</SPAN>); <SPAN class="">totalPriceElement</SPAN>.<SPAN class="">setTextContent</SPAN>(<SPAN class="">String</SPAN>.<SPAN class="">valueOf</SPAN>(<SPAN class="">totalDiscountedPrice</SPAN>)); } }</PRE></DIV><H4 id="toc-hId-436961179">Sample Input XML</H4><P>The sample XML data contains two flights, the first flight is in the peak season, and the second one is not.<BR />It will be sent to the integration flow in later chapters.</P><DIV class=""><PRE>&lt;<SPAN class="">ns0</SPAN><SPAN class="">:</SPAN><SPAN class="">Ext_FlightBooking_MT</SPAN> <SPAN class="">xmlns</SPAN><SPAN class="">:</SPAN><SPAN class="">ns0</SPAN>=<SPAN class="">"http://www.aif.com"</SPAN>&gt; &lt;<SPAN class="">Agency_ID</SPAN>&gt;1001&lt;/<SPAN class="">Agency_ID</SPAN>&gt; &lt;<SPAN class="">Customer_ID</SPAN>&gt;100&lt;/<SPAN class="">Customer_ID</SPAN>&gt; &lt;<SPAN class="">Customer_Name</SPAN>&gt;SAP Manager&lt;/<SPAN class="">Customer_Name</SPAN>&gt; &lt;<SPAN class="">Customer_Country</SPAN>&gt;DE&lt;/<SPAN class="">Customer_Country</SPAN>&gt; &lt;<SPAN class="">Preferred_Language</SPAN>&gt;&lt;/<SPAN class="">Preferred_Language</SPAN>&gt; &lt;<SPAN class="">Total_Price</SPAN> /&gt; &lt;<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Airport_From</SPAN>&gt;FRA&lt;/<SPAN class="">Airport_From</SPAN>&gt; &lt;<SPAN class="">Airport_To</SPAN>&gt;SHA&lt;/<SPAN class="">Airport_To</SPAN>&gt; &lt;<SPAN class="">Flight_Date</SPAN>&gt;20231001&lt;/<SPAN class="">Flight_Date</SPAN>&gt; &lt;<SPAN class="">Flight_Number</SPAN>&gt;LH770&lt;/<SPAN class="">Flight_Number</SPAN>&gt; &lt;<SPAN class="">Seat_Class</SPAN>&gt;B&lt;/<SPAN class="">Seat_Class</SPAN>&gt; &lt;<SPAN class="">Full_Price</SPAN>&gt;1000&lt;/<SPAN class="">Full_Price</SPAN>&gt; &lt;<SPAN class="">Discounted_Price</SPAN> /&gt; &lt;/<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Airport_From</SPAN>&gt;SHA&lt;/<SPAN class="">Airport_From</SPAN>&gt; &lt;<SPAN class="">Airport_To</SPAN>&gt;FRA&lt;/<SPAN class="">Airport_To</SPAN>&gt; &lt;<SPAN class="">Flight_Date</SPAN>&gt;20231201&lt;/<SPAN class="">Flight_Date</SPAN>&gt; &lt;<SPAN class="">Flight_Number</SPAN>&gt;LH780&lt;/<SPAN class="">Flight_Number</SPAN>&gt; &lt;<SPAN class="">Seat_Class</SPAN>&gt;B&lt;/<SPAN class="">Seat_Class</SPAN>&gt; &lt;<SPAN class="">Full_Price</SPAN>&gt;1000&lt;/<SPAN class="">Full_Price</SPAN>&gt; &lt;<SPAN class="">Discounted_Price</SPAN> /&gt; &lt;/<SPAN class="">Flight</SPAN>&gt; &lt;/<SPAN class="">ns0</SPAN><SPAN class="">:</SPAN><SPAN class="">Ext_FlightBooking_MT</SPAN>&gt;</PRE></DIV><H4 id="toc-hId-240447674">Sample Output XML</H4><P>The sample output XML is produced by the Java mapping.<BR />It will be used to compare with the XML produced by the Groovy script in later chapters.</P><DIV class=""><PRE>&lt;<SPAN class="">ns0</SPAN><SPAN class="">:</SPAN><SPAN class="">Ext_FlightBooking_MT</SPAN> <SPAN class="">xmlns</SPAN><SPAN class="">:</SPAN><SPAN class="">ns0</SPAN>=<SPAN class="">"http://www.aif.com"</SPAN>&gt; &lt;<SPAN class="">Agency_ID</SPAN>&gt;1001&lt;/<SPAN class="">Agency_ID</SPAN>&gt; &lt;<SPAN class="">Customer_ID</SPAN>&gt;100&lt;/<SPAN class="">Customer_ID</SPAN>&gt; &lt;<SPAN class="">Customer_Name</SPAN>&gt;SAP Manager&lt;/<SPAN class="">Customer_Name</SPAN>&gt; &lt;<SPAN class="">Customer_Country</SPAN>&gt;DE&lt;/<SPAN class="">Customer_Country</SPAN>&gt; &lt;<SPAN class="">Preferred_Language</SPAN>&gt;German&lt;/<SPAN class="">Preferred_Language</SPAN>&gt; &lt;<SPAN class="">Total_Price</SPAN>&gt;1900&lt;/<SPAN class="">Total_Price</SPAN>&gt; &lt;<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Airport_From</SPAN>&gt;FRA&lt;/<SPAN class="">Airport_From</SPAN>&gt; &lt;<SPAN class="">Airport_To</SPAN>&gt;SHA&lt;/<SPAN class="">Airport_To</SPAN>&gt; &lt;<SPAN class="">Flight_Date</SPAN>&gt;20231001&lt;/<SPAN class="">Flight_Date</SPAN>&gt; &lt;<SPAN class="">Flight_Number</SPAN>&gt;LH770&lt;/<SPAN class="">Flight_Number</SPAN>&gt; &lt;<SPAN class="">Seat_Class</SPAN>&gt;B&lt;/<SPAN class="">Seat_Class</SPAN>&gt; &lt;<SPAN class="">Full_Price</SPAN>&gt;1000&lt;/<SPAN class="">Full_Price</SPAN>&gt; &lt;<SPAN class="">Discounted_Price</SPAN>&gt;1000&lt;/<SPAN class="">Discounted_Price</SPAN>&gt; &lt;/<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Airport_From</SPAN>&gt;SHA&lt;/<SPAN class="">Airport_From</SPAN>&gt; &lt;<SPAN class="">Airport_To</SPAN>&gt;FRA&lt;/<SPAN class="">Airport_To</SPAN>&gt; &lt;<SPAN class="">Flight_Date</SPAN>&gt;20231201&lt;/<SPAN class="">Flight_Date</SPAN>&gt; &lt;<SPAN class="">Flight_Number</SPAN>&gt;LH780&lt;/<SPAN class="">Flight_Number</SPAN>&gt; &lt;<SPAN class="">Seat_Class</SPAN>&gt;B&lt;/<SPAN class="">Seat_Class</SPAN>&gt; &lt;<SPAN class="">Full_Price</SPAN>&gt;1000&lt;/<SPAN class="">Full_Price</SPAN>&gt; &lt;<SPAN class="">Discounted_Price</SPAN>&gt;900&lt;/<SPAN class="">Discounted_Price</SPAN>&gt; &lt;/<SPAN class="">Flight</SPAN>&gt; &lt;/<SPAN class="">ns0</SPAN><SPAN class="">:</SPAN><SPAN class="">Ext_FlightBooking_MT</SPAN>&gt;</PRE></DIV><H3 id="toc-hId--85148550">Generation</H3><H4 id="toc-hId--152579336">Prompt</H4><P>For this sample, we use the following prompt:</P><DIV class=""><PRE>Please convert this SAP Process Orchestration Java mapping code to Cloud Integration Groovy script, fulfill following requirements: 1. Use Groovy 2 syntax, must compatible with JDK 8 2. Generate def Message processData(Message message), don't wrap it in any class 3. Follow the code pattern below: def inputstream = message.getBody(InputStream) // get input stream def outputstream = new ByteArrayOutputStream() // create output stream transform(inputstream, outputstream) // transform data message.setBody(outputstream) // set the output payload 4. Prefer DOM to process XML 5. Import necessary packages, classes and interfaces 6. Import com.sap.gateway.ip.core.customdev.util.Message 7. Run the generated code by yourself, make sure no syntax error 8. Just provide code, don't say anything else</PRE></DIV><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>In this sample prompt, we prefer DOM to process XML, just because DOM is also used by the original Java mapping.<BR />In your scenario, DOM might not be the right choice, especially when the XML payload size is big.</P><P>In the context of generative AI, the prompt is crucial for obtaining accurate and useful results. You can also try a tailored prompt that fits your specific requirements.</P><H4 id="toc-hId--349092841">Use Generative AI</H4><P>We use OpenAI's ChatGPT-3.5 model and invoke it via the<SPAN>&nbsp;</SPAN><A href="https://chat.openai.com/" target="_blank" rel="nofollow noopener noreferrer">official website UI</A>.</P><P>Combine the prompt and the Java mapping source code together, the complete input message should be as below:</P><DIV class=""><PRE>Please convert this SAP Process Orchestration Java mapping code to Cloud Integration Groovy script, fulfill following requirements: 1. Use Groovy 2 syntax, must compatible with JDK 8 2. Generate def Message processData(Message message), don't wrap it in any class 3. Follow the code pattern below: def inputstream = message.getBody(InputStream) // get input stream def outputstream = new ByteArrayOutputStream() // create output stream transform(inputstream, outputstream) // transform data message.setBody(outputstream) // set the output payload 4. Prefer DOM to process XML 5. Import necessary packages, classes and interfaces 6. Import com.sap.gateway.ip.core.customdev.util.Message 7. Run the generated code by yourself, make sure no syntax error 8. Just provide code, don't say anything else import com.sap.aii.mapping.api.AbstractTransformation; import com.sap.aii.mapping.api.StreamTransformationException; import com.sap.aii.mapping.api.TransformationInput; import com.sap.aii.mapping.api.TransformationOutput; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.*; import java.util.HashMap; import java.util.Map; public class BookingDataMapper_DOM extends AbstractTransformation { private Map&lt;String, String&gt; countryToLanguageMap; public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { InputStream inputstream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); mapBookingData(inputstream, outputstream); } public void mapBookingData(InputStream inputstream, OutputStream outputstream) { try { DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document inDoc = docBuilder.parse(inputstream); Document outDoc = docBuilder.newDocument(); outDoc = inDoc; setPreferredLanguage(outDoc); calculateBookingPrice(outDoc); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(outDoc), new StreamResult(outputstream)); } catch (Exception e) { e.printStackTrace(); this.getTrace().addDebugMessage(e.toString()); } } private void setPreferredLanguage(Document outDoc) throws Exception { Element preferredLanguageElement = (Element) outDoc.getElementsByTagName("Preferred_Language").item(0); if (preferredLanguageElement.getTextContent().isEmpty()) { loadCountryToLanguageMap(); // Find the Customer_Country element Element customerCountryElement = (Element) outDoc.getElementsByTagName("Customer_Country").item(0); // Get the customer country value String customerCountry = customerCountryElement.getTextContent().trim(); // Find the corresponding language in the map String language = countryToLanguageMap.get(customerCountry); if (language != null) { // Update the Preferred_Language element with the found language preferredLanguageElement.setTextContent(language); } else { preferredLanguageElement.setTextContent("English"); } } } private boolean isSlowSeason(String date) { int iData = Integer.parseInt(date.substring(4)); int iStartDate = 401; int iEndDate = 1031; return !(iData &gt;= iStartDate &amp;&amp; iData &lt;= iEndDate); } private void loadCountryToLanguageMap() throws Exception { countryToLanguageMap = new HashMap&lt;&gt;(); countryToLanguageMap.put("DE", "German"); countryToLanguageMap.put("CN", "Chinese"); } private void calculateBookingPrice(Document outDoc) { NodeList flightsList = outDoc.getElementsByTagName("Flight"); int totalDiscountedPrice = 0; // Loop through each "Flights" element for (int i = 0; i &lt; flightsList.getLength(); i++) { Element flightElement = (Element) flightsList.item(i); Element flightDateElement = (Element) flightElement.getElementsByTagName("Flight_Date").item(0); Element fullPriceElement = (Element) flightElement.getElementsByTagName("Full_Price").item(0); Element discountedPriceElement = (Element) flightElement.getElementsByTagName("Discounted_Price").item(0); // Get the values String flightDate = flightDateElement.getTextContent(); int fullPrice = Integer.parseInt(fullPriceElement.getTextContent()); if (isSlowSeason(flightDate)) { // Calculate the discounted price as 90% of the full price int discountedPrice = (int) (fullPrice * 0.9); discountedPriceElement.setTextContent(String.valueOf(discountedPrice)); totalDiscountedPrice += discountedPrice; } else { totalDiscountedPrice += fullPrice; discountedPriceElement.setTextContent(String.valueOf(fullPrice)); } } // Update the Total_Price element with the sum of discounted prices Element totalPriceElement = (Element) outDoc.getElementsByTagName("Total_Price").item(0); totalPriceElement.setTextContent(String.valueOf(totalDiscountedPrice)); } }</PRE></DIV><P>Submit the message, after a few seconds, ChatGPT will return code similar like below:</P><DIV class=""><PRE><SPAN class="">import</SPAN> <SPAN class="">com.sap.gateway.ip.core.customdev.util.Message</SPAN> <SPAN class="">import</SPAN> <SPAN class="">org.w3c.dom.Document</SPAN> <SPAN class="">import</SPAN> <SPAN class="">java.io.ByteArrayOutputStream</SPAN> <SPAN class="">import</SPAN> <SPAN class="">java.io.InputStream</SPAN> <SPAN class="">import</SPAN> <SPAN class="">javax.xml.parsers.DocumentBuilder</SPAN> <SPAN class="">import</SPAN> <SPAN class="">javax.xml.parsers.DocumentBuilderFactory</SPAN> <SPAN class="">import</SPAN> <SPAN class="">javax.xml.transform.Transformer</SPAN> <SPAN class="">import</SPAN> <SPAN class="">javax.xml.transform.TransformerFactory</SPAN> <SPAN class="">import</SPAN> <SPAN class="">javax.xml.transform.dom.DOMSource</SPAN> <SPAN class="">import</SPAN> <SPAN class="">javax.xml.transform.stream.StreamResult</SPAN> <SPAN class="">def</SPAN> <SPAN class="">Message</SPAN> <SPAN class="">processData</SPAN>(<SPAN class="">Message</SPAN> <SPAN class="">message</SPAN>) { <SPAN class="">def</SPAN> inputstream <SPAN class="">=</SPAN> message<SPAN class="">.</SPAN>getBody(<SPAN class="">InputStream</SPAN>) <SPAN class="">// get input stream</SPAN> <SPAN class="">def</SPAN> outputstream <SPAN class="">=</SPAN> <SPAN class="">new</SPAN> <SPAN class="">ByteArrayOutputStream</SPAN>() <SPAN class="">// create output stream</SPAN> mapBookingData(inputstream, outputstream) <SPAN class="">// transform data</SPAN> message<SPAN class="">.</SPAN>setBody(outputstream) <SPAN class="">// set the output payload</SPAN> } <SPAN class="">def</SPAN> <SPAN class="">mapBookingData</SPAN>(<SPAN class="">InputStream</SPAN> <SPAN class="">inputstream</SPAN>, <SPAN class="">ByteArrayOutputStream</SPAN> <SPAN class="">outputstream</SPAN>) { <SPAN class="">try</SPAN> { <SPAN class="">DocumentBuilder</SPAN> docBuilder <SPAN class="">=</SPAN> <SPAN class="">DocumentBuilderFactory</SPAN><SPAN class="">.</SPAN>newInstance()<SPAN class="">.</SPAN>newDocumentBuilder() <SPAN class="">def</SPAN> inDoc <SPAN class="">=</SPAN> docBuilder<SPAN class="">.</SPAN>parse(inputstream) <SPAN class="">def</SPAN> outDoc <SPAN class="">=</SPAN> docBuilder<SPAN class="">.</SPAN>newDocument() outDoc <SPAN class="">=</SPAN> inDoc setPreferredLanguage(outDoc) calculateBookingPrice(outDoc) <SPAN class="">Transformer</SPAN> transformer <SPAN class="">=</SPAN> <SPAN class="">TransformerFactory</SPAN><SPAN class="">.</SPAN>newInstance()<SPAN class="">.</SPAN>newTransformer() transformer<SPAN class="">.</SPAN>transform(<SPAN class="">new</SPAN> <SPAN class="">DOMSource</SPAN>(outDoc), <SPAN class="">new</SPAN> <SPAN class="">StreamResult</SPAN>(outputstream)) } <SPAN class="">catch</SPAN> (<SPAN class="">Exception</SPAN> e) { e<SPAN class="">.</SPAN>printStackTrace() <SPAN class="">this</SPAN><SPAN class="">.</SPAN>getTrace()<SPAN class="">.</SPAN>addDebugMessage(e<SPAN class="">.</SPAN>toString()) } } <SPAN class="">def</SPAN> <SPAN class="">setPreferredLanguage</SPAN>(<SPAN class="">Document</SPAN> <SPAN class="">outDoc</SPAN>) <SPAN class="">throws</SPAN> <SPAN class="">Exception</SPAN> { <SPAN class="">def</SPAN> preferredLanguageElement <SPAN class="">=</SPAN> outDoc<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Preferred_Language"</SPAN>)<SPAN class="">.</SPAN>item(<SPAN class="">0</SPAN>) <SPAN class="">if</SPAN> (preferredLanguageElement<SPAN class="">.</SPAN>getTextContent()<SPAN class="">.</SPAN>isEmpty()) { loadCountryToLanguageMap() <SPAN class="">def</SPAN> customerCountryElement <SPAN class="">=</SPAN> outDoc<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Customer_Country"</SPAN>)<SPAN class="">.</SPAN>item(<SPAN class="">0</SPAN>) <SPAN class="">def</SPAN> customerCountry <SPAN class="">=</SPAN> customerCountryElement<SPAN class="">.</SPAN>getTextContent()<SPAN class="">.</SPAN>trim() <SPAN class="">def</SPAN> language <SPAN class="">=</SPAN> countryToLanguageMap<SPAN class="">.</SPAN>get(customerCountry) <SPAN class="">if</SPAN> (language <SPAN class="">!=</SPAN> <SPAN class="">null</SPAN>) { preferredLanguageElement<SPAN class="">.</SPAN>setTextContent(language) } <SPAN class="">else</SPAN> { preferredLanguageElement<SPAN class="">.</SPAN>setTextContent(<SPAN class="">"English"</SPAN>) } } } <SPAN class="">def</SPAN> <SPAN class="">isSlowSeason</SPAN>(<SPAN class="">String</SPAN> <SPAN class="">date</SPAN>) { <SPAN class="">def</SPAN> iData <SPAN class="">=</SPAN> <SPAN class="">Integer</SPAN><SPAN class="">.</SPAN>parseInt(date<SPAN class="">.</SPAN>substring(<SPAN class="">4</SPAN>)) <SPAN class="">def</SPAN> iStartDate <SPAN class="">=</SPAN> <SPAN class="">401</SPAN> <SPAN class="">def</SPAN> iEndDate <SPAN class="">=</SPAN> <SPAN class="">1031</SPAN> <SPAN class="">!</SPAN>(iData <SPAN class="">&gt;=</SPAN> iStartDate <SPAN class="">&amp;&amp;</SPAN> iData <SPAN class="">&lt;=</SPAN> iEndDate) } <SPAN class="">def</SPAN> <SPAN class="">loadCountryToLanguageMap</SPAN>() <SPAN class="">throws</SPAN> <SPAN class="">Exception</SPAN> { countryToLanguageMap <SPAN class="">=</SPAN> <SPAN class="">new</SPAN> <SPAN class="">HashMap&lt;&gt;</SPAN>() countryToLanguageMap<SPAN class="">.</SPAN>put(<SPAN class="">"DE"</SPAN>, <SPAN class="">"German"</SPAN>) countryToLanguageMap<SPAN class="">.</SPAN>put(<SPAN class="">"CN"</SPAN>, <SPAN class="">"Chinese"</SPAN>) } <SPAN class="">def</SPAN> <SPAN class="">calculateBookingPrice</SPAN>(<SPAN class="">Document</SPAN> <SPAN class="">outDoc</SPAN>) { <SPAN class="">def</SPAN> flightsList <SPAN class="">=</SPAN> outDoc<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Flight"</SPAN>) <SPAN class="">def</SPAN> totalDiscountedPrice <SPAN class="">=</SPAN> <SPAN class="">0</SPAN> <SPAN class="">for</SPAN> (<SPAN class="">def</SPAN> i <SPAN class="">=</SPAN> <SPAN class="">0</SPAN>; i <SPAN class="">&lt;</SPAN> flightsList<SPAN class="">.</SPAN>getLength(); i<SPAN class="">++</SPAN>) { <SPAN class="">def</SPAN> flightElement <SPAN class="">=</SPAN> flightsList<SPAN class="">.</SPAN>item(i) <SPAN class="">def</SPAN> flightDateElement <SPAN class="">=</SPAN> flightElement<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Flight_Date"</SPAN>)<SPAN class="">.</SPAN>item(<SPAN class="">0</SPAN>) <SPAN class="">def</SPAN> fullPriceElement <SPAN class="">=</SPAN> flightElement<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Full_Price"</SPAN>)<SPAN class="">.</SPAN>item(<SPAN class="">0</SPAN>) <SPAN class="">def</SPAN> discountedPriceElement <SPAN class="">=</SPAN> flightElement<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Discounted_Price"</SPAN>)<SPAN class="">.</SPAN>item(<SPAN class="">0</SPAN>) <SPAN class="">def</SPAN> flightDate <SPAN class="">=</SPAN> flightDateElement<SPAN class="">.</SPAN>getTextContent() <SPAN class="">def</SPAN> fullPrice <SPAN class="">=</SPAN> <SPAN class="">Integer</SPAN><SPAN class="">.</SPAN>parseInt(fullPriceElement<SPAN class="">.</SPAN>getTextContent()) <SPAN class="">if</SPAN> (isSlowSeason(flightDate)) { <SPAN class="">def</SPAN> discountedPrice <SPAN class="">=</SPAN> (<SPAN class="">int</SPAN>) (fullPrice <SPAN class="">*</SPAN> <SPAN class="">0.9</SPAN>) discountedPriceElement<SPAN class="">.</SPAN>setTextContent(<SPAN class="">String</SPAN><SPAN class="">.</SPAN>valueOf(discountedPrice)) totalDiscountedPrice <SPAN class="">+</SPAN><SPAN class="">=</SPAN> discountedPrice } <SPAN class="">else</SPAN> { totalDiscountedPrice <SPAN class="">+</SPAN><SPAN class="">=</SPAN> fullPrice discountedPriceElement<SPAN class="">.</SPAN>setTextContent(<SPAN class="">String</SPAN><SPAN class="">.</SPAN>valueOf(fullPrice)) } } <SPAN class="">def</SPAN> totalPriceElement <SPAN class="">=</SPAN> outDoc<SPAN class="">.</SPAN>getElementsByTagName(<SPAN class="">"Total_Price"</SPAN>)<SPAN class="">.</SPAN>item(<SPAN class="">0</SPAN>) totalPriceElement<SPAN class="">.</SPAN>setTextContent(<SPAN class="">String</SPAN><SPAN class="">.</SPAN>valueOf(totalDiscountedPrice)) }</PRE></DIV><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>Don't expect you will get the exact same code as above.<BR />Usually, you will get (slightly) different code every time. And it is very possible that the code you get has syntax issues. You can copy the code into your IDE to check the syntax issues.</P><P>The most common issues could be:</P><UL><LI>The org.w3c.dom.Document<SPAN>&nbsp;</SPAN><STRONG>class is not imported</STRONG>, you need to add the import statement manually</LI><LI>Other used classes not imported, you need to check and import the missing classes manually</LI></UL><P>Alternatively, OpenAI also provides rest API and even programming libraries, you can also programmatically invoke it.</P><H3 id="toc-hId--674689065">Evaluation</H3><H4 id="toc-hId--1239836946">Create Testing Integration Flow</H4><P>After verifying the syntax of the generated Groovy script, we will run it in a testing integration flow, which contains the following steps:</P><UL><LI>a HTTPS sender adapter</LI><LI>a Groovy script to log the input XML payload<UL><LI>Sample code:</LI></UL><DIV class=""><PRE><SPAN class="">import</SPAN> <SPAN class="">com.sap.gateway.ip.core.customdev.util.Message</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">java.util.HashMap</SPAN>; <SPAN class="">def</SPAN> <SPAN class="">Message</SPAN> <SPAN class="">processData</SPAN>(<SPAN class="">Message</SPAN> <SPAN class="">message</SPAN>) { <SPAN class="">def</SPAN> body <SPAN class="">=</SPAN> message<SPAN class="">.</SPAN>getBody(<SPAN class="">java.lang.String</SPAN>); <SPAN class="">def</SPAN> messageLog <SPAN class="">=</SPAN> messageLogFactory<SPAN class="">.</SPAN>getMessageLog(message); messageLog<SPAN class="">.</SPAN>addAttachmentAsString(<SPAN class="">"In_Payload"</SPAN>, body, <SPAN class="">"text/plain"</SPAN>); <SPAN class="">return</SPAN> message; }</PRE></DIV></LI><LI>a Groovy script that contains the generated Groovy code</LI><LI>a Groovy script to log the output XML payload (produced by the generated Groovy code)<UL><LI>Sample code:</LI></UL><DIV class=""><PRE><SPAN class="">import</SPAN> <SPAN class="">com.sap.gateway.ip.core.customdev.util.Message</SPAN>; <SPAN class="">import</SPAN> <SPAN class="">java.util.HashMap</SPAN>; <SPAN class="">def</SPAN> <SPAN class="">Message</SPAN> <SPAN class="">processData</SPAN>(<SPAN class="">Message</SPAN> <SPAN class="">message</SPAN>) { <SPAN class="">def</SPAN> body <SPAN class="">=</SPAN> message<SPAN class="">.</SPAN>getBody(<SPAN class="">java.lang.String</SPAN>); <SPAN class="">def</SPAN> messageLog <SPAN class="">=</SPAN> messageLogFactory<SPAN class="">.</SPAN>getMessageLog(message); messageLog<SPAN class="">.</SPAN>addAttachmentAsString(<SPAN class="">"Out_Payload"</SPAN>, body, <SPAN class="">"text/plain"</SPAN>); <SPAN class="">return</SPAN> message; }</PRE></DIV></LI></UL><P>The diagram below depicts the main steps of the integration flow.<SPAN>&nbsp;</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="iFlow.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53796i0EC92F7A131DD555/image-size/large?v=v2&amp;px=999" role="button" title="iFlow.png" alt="iFlow.png" /></span></SPAN></P><P><SPAN>Copy the generated Groovy code to the middle Groovy script step, deploy the testing integration flow, we can get a URL to receive new message.</SPAN></P><P>Next, we send the input XML using an HTTP client tool such as Postman or Insomnia.</P><DIV class=""><PRE>&lt;<SPAN class="">ns0</SPAN><SPAN class="">:</SPAN><SPAN class="">Ext_FlightBooking_MT</SPAN> xmlns:ns0=<SPAN class="">"http://www.aif.com"</SPAN>&gt; &lt;<SPAN class="">Agency_ID</SPAN>&gt;1001&lt;/<SPAN class="">Agency_ID</SPAN>&gt; &lt;<SPAN class="">Customer_ID</SPAN>&gt;100&lt;/<SPAN class="">Customer_ID</SPAN>&gt; &lt;<SPAN class="">Customer_Name</SPAN>&gt;SAP Manager&lt;/<SPAN class="">Customer_Name</SPAN>&gt; &lt;<SPAN class="">Customer_Country</SPAN>&gt;DE&lt;/<SPAN class="">Customer_Country</SPAN>&gt; &lt;<SPAN class="">Preferred_Language</SPAN>&gt;&lt;/<SPAN class="">Preferred_Language</SPAN>&gt; &lt;<SPAN class="">Total_Price</SPAN>/&gt; &lt;<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Airport_From</SPAN>&gt;FRA&lt;/<SPAN class="">Airport_From</SPAN>&gt; &lt;<SPAN class="">Airport_To</SPAN>&gt;SHA&lt;/<SPAN class="">Airport_To</SPAN>&gt; &lt;<SPAN class="">Flight_Date</SPAN>&gt;20231001&lt;/<SPAN class="">Flight_Date</SPAN>&gt; &lt;<SPAN class="">Flight_Number</SPAN>&gt;LH770&lt;/<SPAN class="">Flight_Number</SPAN>&gt; &lt;<SPAN class="">Seat_Class</SPAN>&gt;B&lt;/<SPAN class="">Seat_Class</SPAN>&gt; &lt;<SPAN class="">Full_Price</SPAN>&gt;1000&lt;/<SPAN class="">Full_Price</SPAN>&gt; &lt;<SPAN class="">Discounted_Price</SPAN>/&gt; &lt;/<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Flight</SPAN>&gt; &lt;<SPAN class="">Airport_From</SPAN>&gt;SHA&lt;/<SPAN class="">Airport_From</SPAN>&gt; &lt;<SPAN class="">Airport_To</SPAN>&gt;FRA&lt;/<SPAN class="">Airport_To</SPAN>&gt; &lt;<SPAN class="">Flight_Date</SPAN>&gt;20231201&lt;/<SPAN class="">Flight_Date</SPAN>&gt; &lt;<SPAN class="">Flight_Number</SPAN>&gt;LH780&lt;/<SPAN class="">Flight_Number</SPAN>&gt; &lt;<SPAN class="">Seat_Class</SPAN>&gt;B&lt;/<SPAN class="">Seat_Class</SPAN>&gt; &lt;<SPAN class="">Full_Price</SPAN>&gt;1000&lt;/<SPAN class="">Full_Price</SPAN>&gt; &lt;<SPAN class="">Discounted_Price</SPAN>/&gt; &lt;/<SPAN class="">Flight</SPAN>&gt; &lt;/<SPAN class="">ns0</SPAN><SPAN class="">:</SPAN><SPAN class="">Ext_FlightBooking_MT</SPAN>&gt;</PRE></DIV><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>To send a message to the HTTP sender adapter, you need to generate a service key and obtain the authorization token.<BR />How to create the service key and get the token is out of scope of this blog.</P><P>Alternatively, you can use the<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/simulation-of-integration-flow" target="_blank" rel="noopener noreferrer"><STRONG>simulation feature</STRONG></A><SPAN>&nbsp;</SPAN>to test the Groovy script step before you deploy the integration flow.</P><H4 id="toc-hId--1436350451">Verify Output</H4><P>After sending the new message to the integration flow, we can check the message status in the monitor of Integration Suite.<BR />We can see both input and output payload have been saved as attachments.<BR />Check the content of the output payload, it should be the same as the XML produced by Java mapping.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Monitor.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/53797iFB0638C5F420BFF6/image-size/large?v=v2&amp;px=999" role="button" title="Monitor.png" alt="Monitor.png" /></span></P><P>&nbsp;</P><P><STRONG>Note:</STRONG><SPAN>&nbsp;It is not uncommon that the messages run into error status.</SPAN></P><P>Sometimes, it complains syntax-related issues, sometimes it complains logical issues.<BR />In any case, you can iterate the process. I.e., copy the error message, send it to ChatGPT (in the same session you generate the code), ask it to fix the issues, and then do the evaluation again.<BR />Of course, you can also check the code and fix the issues by yourself.</P><H2 id="toc-hId--1046057942">Disclaimer</H2><H3 id="toc-hId--1535974454">Generative AI and Large Language Model (LLM)</H3><P>In the blog, we use the terms generative AI and LLM interchangeably.<BR />In theory, the idea is LLM-independent, but at the time of this blog, we<SPAN>&nbsp;</SPAN><STRONG>only tried the idea with OpenAI's GPT-3.5 and GPT-4 models</STRONG>.</P><H3 id="toc-hId--1732487959">Security</H3><P>When you invoke the generative AI, you have to send your source code to the AI provider. This implies the business logic is completely exposed to the AI provider, this can lead to security/IP-related issues if the AI provider is not reliable.<BR />So please always keep this in mind, and<SPAN>&nbsp;</SPAN><STRONG>only use the AI provider you TRUST</STRONG>.</P><H3 id="toc-hId--1929001464">Support</H3><P>This idea described in the blog is not an SAP officially released feature,<SPAN>&nbsp;</SPAN><STRONG>SAP will not formally support</STRONG><SPAN>&nbsp;</SPAN>any implementation of this idea.</P><H3 id="toc-hId--2125514969">AI Limitation</H3><P>The AI-generated content is not predictable, you may get a different response every time even you feed it with the same input, and there is no chance to debug why the response is different.</P><P>Generative AI is incredibly good at generating code, but AI-generated code is not always correct, sometimes the generated code has syntax issues, sometimes it has logical issues.<BR />So you cannot use the generated code for production use directly.</P><P>Depending on the size of your Java mapping code, the AI token consumption could go beyond the token limitation, this cloud lead to higher costs, and even worse, a low-quality code (the generated code might be truncated due to token limitation).</P><H3 id="toc-hId-1972938822">Suitable Scenario</H3><P>The most suitable scenario for this idea is: The Java mapping does not have too many dependencies.</P><P>If the Java mapping class (which implements the Java Mapping API) itself has too many dependency Java classes, you will have to do the generation not only for the main Java mapping class, but also for its dependency Java classes as well.</P><P>This will increase not only the cost of AI token consumption but also the complexity of code integration (combining different codes together).</P> 2024-01-31T10:37:59.023000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/what-s-new-for-sap-integration-suite-january-2024/ba-p/13602459 What's New for SAP Integration Suite - January 2024 2024-02-12T12:43:09.193000+01:00 GabrielaGahse https://community.sap.com/t5/user/viewprofilepage/user-id/4015 <P>The new year has started already with big steps, and it is time to present the January highlights of SAP Integration Suite. Detailed presentations and a Q&amp;A section with helpful questions by you, you find in the <A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_fbu7vwau" target="_blank" rel="noopener nofollow noreferrer">recording</A> of our Monthly Updates webinar that happened last week.</P><P>SAP Integration Suite highlights are:</P><UL><LI>AdvancedEventMesh adapter for event mediation</LI><LI>Simply search for a flow step in complex integration flows</LI><LI>Manual configuration of proxy settings for some adapters in Edge runtime</LI><LI>Reminder: Upgrade to new version of third-party connectors before March 2024</LI><LI>Simplified mass-maintenance in TPM via extended agreement template configuration</LI><LI>Support for custom SOA messages in Integration Advisor</LI><LI>New Tradacoms message standard</LI><LI>New rules for Migration Assessment</LI><LI>Message mapping and function library integration in migration tool</LI><LI>Virtual host information as part of the API for Edge Integration Cell</LI><LI>New pre-built integration content by our partners</LI></UL><H2 id="toc-hId-986060962">Cloud Integration</H2><H3 id="toc-hId-918630176">AdvancedEventMesh adapter for event mediation</H3><P>We have recently published the AdvancedEventMesh adapter connecting the Cloud Integration with advanced event mesh brokers through the Solace message format (SMF) message protocol. You may consume in Cloud Integration guaranteed messages from queues or non-persistent messages using a topic subscription. And you can send messages to queues or topics. The adapter is designed to handle large-scale event processing, making it suitable for enterprise-level applications. It is available with the SAP Integration Suite, standard and premium editions. See the initial version of the sender and receiver <A href="https://api.sap.com/package/AdvancedEventMeshAdapterforSAPIntegrationSuite/integrationadapter" target="_blank" rel="noopener noreferrer">adapters</A> at the SAP Business Accelerator Hub and check the details within the <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/advanced-event-mesh-adapter" target="_blank" rel="noopener noreferrer">documentation</A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_5-1707736639212.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/64067i3B749C356FBB6229/image-size/medium?v=v2&amp;px=400" role="button" title="GabrielaGahse_5-1707736639212.png" alt="GabrielaGahse_5-1707736639212.png" /></span></P><H3 id="toc-hId-722116671">Simply search for a flow step in complex integration flows</H3><P>The integration flow editor in Cloud Integration has been extended offering you a search for an existing flow step. Within the palette you can search the step by its type, name, or ID. This search is also available for deployed integration flows and accessible from the runtime views (Monitor and Inspect). This extremely helpful feature helps you e.g., to easily identify a step causing an issue like memory exhaustion as you can copy a step ID in Inspect and navigate to the flow view. Refer to the <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/overview-of-integration-flow-editor?version=Cloud#search-existing-flow-steps" target="_blank" rel="noopener noreferrer">documentation</A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_4-1707736611374.png" style="width: 616px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/64066i4A16D3286E4ECB84/image-dimensions/616x304?v=v2" width="616" height="304" role="button" title="GabrielaGahse_4-1707736611374.png" alt="GabrielaGahse_4-1707736611374.png" /></span></P><H3 id="toc-hId-525603166">Manual configuration of proxy settings for some adapters in Edge runtime</H3><P>We have enabled the following adapters to support the proxy type <EM>manual</EM> in case you have set the Edge Integration Cell as runtime profile. With this setting you can configure the proxy host and port by yourself. Supported are the adapters <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/elster-receiver-adapter?locale=en-US&amp;state=PRODUCTION&amp;version=Cloud" target="_blank" rel="noopener noreferrer">ELSTER receiver</A>, <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/configure-sftp-sender-adapter?locale=en-US&amp;state=PRODUCTION&amp;version=Cloud" target="_blank" rel="noopener noreferrer">SFTP sender</A>, <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/configure-sftp-receiver-adapter?locale=en-US&amp;state=PRODUCTION&amp;version=Cloud" target="_blank" rel="noopener noreferrer">SFTP receiver</A>, and <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/configure-sftp-sender-adapter-used-with-poll-enrich-step?locale=en-US&amp;state=PRODUCTION&amp;version=Cloud" target="_blank" rel="noopener noreferrer">SFTP sender adapter used with the poll enrich step</A><SPAN>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_3-1707736585618.png" style="width: 668px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/64065i63E5FFF2E745E5D5/image-dimensions/668x124?v=v2" width="668" height="124" role="button" title="GabrielaGahse_3-1707736585618.png" alt="GabrielaGahse_3-1707736585618.png" /></span></P><H3 id="toc-hId-329089661">Reminder: Upgrade to new version of third-party connectors before March 2024</H3><P>As per <A href="https://launchpad.support.sap.com/#/notes/3001980" target="_blank" rel="noopener noreferrer">SAP note 3001980</A> the following previous adapter versions are deprecated since end of 2020: Salesforce, Amazon Web Services, Microsoft Dynamics, SugarCRM. There haven't been any new features or enhancements for these previous adapter versions. As of March 1st, 2024, the previous adapter versions will no longer run.</P><P>Action is urgently required from the customer side. Please either migrate to updated new adapter versions and benefit from new features (request access to <A href="https://workzone.one.int.sap/site#workzone-home&amp;/groups/PT9LrZvj1sFlRcDehwsxn4/overview_page/FXORsu2YkcPI8zMJ0DdlVi" target="_blank" rel="noopener nofollow noreferrer">migration documentation</A> by <A href="mailto:annemarie.kiefer@sap.com" target="_blank" rel="noopener nofollow noreferrer">annemarie.kiefer@sap.com</A>) or purchase new Advantco adapter versions from Advantco with support from Advantco only. Additionally, you must delete integration flows using the adapters that are no longer in use and undeploy the adapters.</P><H2 id="toc-hId-3493437">B2B Integration</H2><H3 id="toc-hId--63937349">Simplified mass-maintenance in TPM via extended agreement template configuration</H3><P>Minimize the efforts required to establish trading partner scenario by reusing a common mapping across multiple agreements. Additional to copying an agreement from a template it is also possible now to create a new trading partner agreement by referencing to the template. With this new option you may change the common mapping and do a refresh for all bound trading partner agreements. For more information refer to the <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/creating-trading-partner-agreement?version=CLOUD" target="_blank" rel="noopener noreferrer">documentation</A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_2-1707736554870.png" style="width: 599px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/64064i7CFF6E6C8098A767/image-dimensions/599x328?v=v2" width="599" height="328" role="button" title="GabrielaGahse_2-1707736554870.png" alt="GabrielaGahse_2-1707736554870.png" /></span></P><H3 id="toc-hId--260450854">Support for custom SOA messages in Integration Advisor</H3><P>We are more and more extending the set of supported a third custom type system. It is already possible to upload custom messages as XSDs or custom IDocs (refer to recently published <A href="https://blogs.sap.com/2024/01/11/integration-advisor-extended-support-for-custom-idocs/" target="_blank" rel="noopener noreferrer">blog post</A>). Now you may upload also proprietary or modified SAP S/4HANA SOA messages as a WSDL file. With this new feature you may add new nodes or reorder nodes in standard SAP S/4HANA SOA messages or create your own SOA messages. Migration of existing standard message MIGs to a custom message MIG is supported. And the proposal service of the Integration Advisor will use MIGs based on these messages and enrich its knowledge graph. For more information refer to our <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/adding-custom-message" target="_blank" rel="noopener noreferrer">documentation</A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_1-1707736520739.png" style="width: 619px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/64063i361BB3A409E07668/image-dimensions/619x150?v=v2" width="619" height="150" role="button" title="GabrielaGahse_1-1707736520739.png" alt="GabrielaGahse_1-1707736520739.png" /></span></P><H3 id="toc-hId--456964359">New Tradacoms message standard</H3><P>The new message standard Tradacoms has been introduced in December already. GS1 Tradacoms was the core message standard from early days in Retails for EDI. Therefore, important to have it in the Cloud now. A new <A href="https://blogs.sap.com/2024/01/12/integration-advisor-tradacoms-message-standard/" target="_blank" rel="noopener noreferrer">blogpost</A> has been published detailing out how to use it.</P><H2 id="toc-hId--782560583">API Management</H2><H3 id="toc-hId--925222738">Edge Integration Cell API shows virtual host information</H3><P>When using the wizard for designing an API for the Edge Integration Cell runtime, the selected runtime profile now shows the virtual host information for this API.&nbsp;For more information, see the documentation pages&nbsp;<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/create-api-artifact-using-url?version=CLOUD" target="_blank" rel="noopener noreferrer">create an API artifact using URL</A> and&nbsp;<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/create-api-using-imported-api-definition?version=CLOUD" target="_blank" rel="noopener noreferrer">create an API using an imported API definition</A>.</P><H2 id="toc-hId--828333236">Migration Assessment and migration tool</H2><H3 id="toc-hId--1318249748">New rules for Migration Assessment</H3><P>We have released a couple of new rules for improving the assessment results of the Migration Assessment capability that is used to assess the effort and the feasibility of the migration of SAP Process Integration / SAP Process Orchestration scenarios to the Cloud Integration capability of SAP Integration Suite.</P><H3 id="toc-hId--1514763253">Message mapping and function library integration in migration tool</H3><P>Customers moving their integration projects to SAP Integration Suite can now import Integrated Configuration Object (ICOs) that contain message <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/migrate-integrated-configuration-objects#loio7e7909e6ebd44365867a6c611d94083a__mmap" target="_blank" rel="noopener noreferrer">mapping objects with dependent resources</A> such as function library objects. In Cloud Integration, <EM>reusable</EM> message mapping artifacts are created. &nbsp;Within the migration wizard you have also the option to import <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/migrate-integrated-configuration-objects#loio7e7909e6ebd44365867a6c611d94083a__flib" target="_blank" rel="noopener noreferrer">only supported message mapping objects</A> and skip the unsupported ones.</P><P>Additionally, new <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/supported-templates?&amp;version=CLOUD" target="_blank" rel="noopener noreferrer">migration templates</A> such as for <EM>multicast</EM> and for recipient list with <EM>order at runtime</EM> have been shipped. And an AS2 adapter with preset parameters is now generated in Cloud Integration if you have a scenario with AS2 adapter in SAP Process Orchestration.</P><H2 id="toc-hId--1417873751">SAP Business Accelerator Hub</H2><P>New pre-built integration content has been published by our partners to our public central content catalog, the SAP Business Accelerator Hub. For customers from the B2B sector, PROCLANE has published Salesforce and PAYONE adapters. Effective People A/S offers an event-driven integration to generate employee initials within the SAP SuccessFactors EC. Pricefx comes with new integrations with SAP S/4HANA and Degreed with SAP SuccessFactors integration packs. Check out the blogpost <A href="https://blogs.sap.com/2024/01/01/new-partner-content-on-sap-business-accelerator-hub-q4-23/" target="_blank" rel="noopener noreferrer">New partner content on SAP Business Accelerator Hub (Q4 ’23)</A> and access the&nbsp;<A href="https://hub.sap.com/allpartners" target="_blank" rel="noopener noreferrer">partner listing</A>&nbsp;on SAP Business Accelerator Hub that is going along with all published content. In case you are interested in partnering with us see the details of our&nbsp;<A href="https://hub.sap.com/partnerwithus" target="_blank" rel="noopener noreferrer">partner program</A>.</P><H2 id="toc-hId--1614387256">How to stay tuned on recent and upcoming innovations?</H2><P>The SAP Road Map Explorer is your one-stop shop for all&nbsp;<A href="https://roadmaps.sap.com/board?PRODUCT=000D3A47875C1EDB98A8A910864AC24B&amp;range=CURRENT-LAST" target="_blank" rel="noopener noreferrer">SAP Integration Suite</A>&nbsp;innovations. You can easily check out the latest innovations and follow what is planned for the following quarters. All recent innovations also cover under the tab <EM>Features</EM> further links to blogposts or documentation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_0-1707736442692.png" style="width: 756px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/64062iE1E848BB9592978A/image-dimensions/756x282?v=v2" width="756" height="282" role="button" title="GabrielaGahse_0-1707736442692.png" alt="GabrielaGahse_0-1707736442692.png" /></span></P><P>We also refer to the complete list of new releases in our documentation: <A href="https://help.sap.com/whats-new/5793247a5d5741beb0decc5b7dee1160?locale=en-US" target="_blank" rel="noopener noreferrer">What’s New in SAP Integration Suite</A>.</P><P>And if you have not heard of&nbsp;our monthly webinars, I suggest you <A href="https://www.sap.com/cmp/nl/sap-cloud-platform-integration-suite/index.html?sap-outbound-id=6287F912007644D6C49C53EAA9594EE1B4431938&amp;smc_campaign_id=0000032983&amp;source=email-smc" target="_blank" rel="noopener noreferrer">sign up</A> to get an invitation to the upcoming ones. Our team of Product Management experts host these webinars to showcase the latest and greatest updates regarding all SAP Integration Suite capabilities. The webinars are hosted on the last Tuesday of every month and the next one is already scheduled for February 27th.</P><P>In case you have missed our last monthly webinar, don’t worry. Visit <A href="https://webinars.sap.com/sap-user-groups-k4u/en/ifgintegration" target="_blank" rel="noopener noreferrer">2024 Learning Sessions for SAP User Groups on SAP Integration Suite</A> for all recordings, presentations, and Q&amp;As.</P><P>Are you aware of the <A href="https://readiness-at-scale.enable-now.cloud.sap/pub/20230621_ras/index.html?show=book!BO_EC8330B09B97CDBE#SL_120BDFE08096029D" target="_blank" rel="noopener nofollow noreferrer">Release Navigator for SAP BTP</A>? It consolidates release information across SAP BTP products and services easing you the way to find product release related notes, blogposts, and webpages. For your convenience use the direct link to the <A href="https://readiness-at-scale.enable-now.cloud.sap/pub/20230621_ras/index.html?show=book!BO_EC8330B09B97CDBE#slide!SL_83EFB74698B85387" target="_blank" rel="noopener nofollow noreferrer">SAP Integration Suite section of the Release Navigator</A>.</P> 2024-02-12T12:43:09.193000+01:00 https://community.sap.com/t5/technology-blogs-by-members/sap-integration-make-your-sap-migration-assessment-for-sap-po-more-accurate/ba-p/13592336 SAP Integration – Make your SAP Migration Assessment for SAP PO more accurate with the aRC Analysis 2024-02-13T09:37:51.826000+01:00 vanessadayanc https://community.sap.com/t5/user/viewprofilepage/user-id/126506 <P>The maintenance of SAP Process Orchestration expires at the end of 2027 – this should no longer be news to most integration managers. From this point on, support must be provided by each customer themselves (extended support). In addition, innovations will no longer be implemented in the on-premise SAP PO. So it´s really time to migrate to the SAP Integration Suite. Many of the components of the SAP Integration Suite (e.g. SAP Cloud Integration) have been on the market for a long time now and are well established. In addition, new functionalities such as the recently introduced Edge Integration Cell round off the functional scope of the SAP Integration Suite. A good summary of all the reasons to move to SAP Integration Suite can also be found <A class="" title="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fhelp.sap.com%2Fdocs%2Fhelp%2F90c8ad90cb684ee5979856093efe7462%2Fe5928032fee14042bde3980eca390284.html&amp;data=05%7C02%7Cmonika.schunke%40realcore.de%7C97107322da714f57a39a08dc128d0f8b%7C99c7da5256fc49caaa958f7fb09c995e%7C0%7C0%7C638405644292605087%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=B4w%2B7jx8VxZ7r%2FDzrv62Pfcs4njKk48uiHB6RajIMl4%3D&amp;reserved=0" href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fhelp.sap.com%2Fdocs%2Fhelp%2F90c8ad90cb684ee5979856093efe7462%2Fe5928032fee14042bde3980eca390284.html&amp;data=05%7C02%7Cmonika.schunke%40realcore.de%7C97107322da714f57a39a08dc128d0f8b%7C99c7da5256fc49caaa958f7fb09c995e%7C0%7C0%7C638405644292605087%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=B4w%2B7jx8VxZ7r%2FDzrv62Pfcs4njKk48uiHB6RajIMl4%3D&amp;reserved=0" target="_blank" rel="noopener nofollow noreferrer">here</A>.</P><P>Apart from the functional point of view and the end of maintenance, there are also strategic reasons to <STRONG>start your migration now</STRONG>:</P><OL class=""><LI><P>Correlation with SAP S/4HANA transformation projects – an S/4HANA project is no reason to postpone an SAP PO migration, but to utilize synergies here and migrate the interfaces at the same time</P></LI><LI><P>Use your migration project to clean up you legacy SAP PO systems and get rid of unnecessary interfaces and obsolete technology stacks</P></LI><LI><P>Depending on your <A class="" title="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fblogs.sap.com%2F2023%2F01%2F23%2Fstart-your-sap-po-to-integration-suite-migration-now%2F&amp;data=05%7C02%7Cmonika.schunke%40realcore.de%7C97107322da714f57a39a08dc128d0f8b%7C99c7da5256fc49caaa958f7fb09c995e%7C0%7C0%7C638405644292605087%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=9zyQVmYNYCxkEzpZKpgGFEIfCj0ylv1PI1bgFRtk88o%3D&amp;reserved=0" href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fblogs.sap.com%2F2023%2F01%2F23%2Fstart-your-sap-po-to-integration-suite-migration-now%2F&amp;data=05%7C02%7Cmonika.schunke%40realcore.de%7C97107322da714f57a39a08dc128d0f8b%7C99c7da5256fc49caaa958f7fb09c995e%7C0%7C0%7C638405644292605087%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=9zyQVmYNYCxkEzpZKpgGFEIfCj0ylv1PI1bgFRtk88o%3D&amp;reserved=0" target="_blank" rel="noopener nofollow noreferrer">migration approach</A>&nbsp;(Greenfield, Brownfield, Selective) the migration project can be very complex and therefore take a lot of time</P></LI></OL><P>There are various tools on the market to support you on your estimation of your SAP PO to SAP Integration Suite migration project. In this Blog post I would like to outline the different advantages between the <STRONG>SAP Migration Assesment</STRONG>&nbsp;and the <STRONG>RealCore aRC Analysis</STRONG>&nbsp;tool.</P><P><A class="" title="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fhelp.sap.com%2Fdocs%2Fintegration-suite%2Fsap-integration-suite%2Fwhat-is-migration-assessment&amp;data=05%7C02%7Cmonika.schunke%40realcore.de%7C97107322da714f57a39a08dc128d0f8b%7C99c7da5256fc49caaa958f7fb09c995e%7C0%7C0%7C638405644292605087%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=ShLJ%2F4f%2FOgpDHuzmyW3a0HrX2Cq4BQ43jg4qLX%2BAmWM%3D&amp;reserved=0" href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fhelp.sap.com%2Fdocs%2Fintegration-suite%2Fsap-integration-suite%2Fwhat-is-migration-assessment&amp;data=05%7C02%7Cmonika.schunke%40realcore.de%7C97107322da714f57a39a08dc128d0f8b%7C99c7da5256fc49caaa958f7fb09c995e%7C0%7C0%7C638405644292605087%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=ShLJ%2F4f%2FOgpDHuzmyW3a0HrX2Cq4BQ43jg4qLX%2BAmWM%3D&amp;reserved=0" target="_blank" rel="noopener nofollow noreferrer">SAP Migration Assement</A>&nbsp;is part of SAP Integration Suite (availablity depending on service plan in SAP BTP Cloud Foundry environment). After enabilig the Migration Assesment capability in SAP BTP Cockpit and adding your SAP Process Orchestration System (7.31 SP28 and above, 7.40 SP23 and above, 7.50 SP06 and above), the migration assesment process can be done in two steps:</P><OL class=""><LI><P>Data Extraction Request</P></LI><LI><P>Scenario Evaluation Request the receive evaluation results via .xslx oder .pdf file</P></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="MigrationAssessment.JPG" style="width: 834px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/60754i1C90B306B2E1181E/image-size/large?v=v2&amp;px=999" role="button" title="MigrationAssessment.JPG" alt="MigrationAssessment.JPG" /></span></P><P>aRC Analyse stands for <STRONG>A</STRONG>nalyse <STRONG>R</STRONG>ate <STRONG>C</STRONG>ost and is also a tool based approach the estimate the migration effort for a SAP PO to SAP CPI migration project. Unlike the SAP Migration Assesment Check there is no need for a SAP Integration Suite Tenant in advance. After installing the tool and adding SAP PO System, we also start with the data extraction:</P><OL class=""><LI><P><STRONG>A</STRONG>nalyse: Extract Data like all parties, business systems &amp; components. communication channels, adapters and adapter modules, additionally analyse of all mappings (quantity and categorisation in types) and extraction of all unused objects</P></LI><LI><P><STRONG>R</STRONG>ate: The rating is based on the analyses of the configration scenarios. Every CS element is checked for their migraiton capability and rated on a sacle from 0-10. Based on those ratings a individual roadmap for the migration and different reportings are generated.</P></LI><LI><P><STRONG>C</STRONG>ost: We create for you not only a cost report for the migration effort but also a operating cost calculation based on the extracted message volumes</P></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="ARC-Analysis Loading Configuration Scenarios - Initial Screen" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/60749iD8176710C42068A4/image-size/large?v=v2&amp;px=999" role="button" title="Loading CS.JPG" alt="ARC-Analysis Loading Configuration Scenarios - Initial Screen" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ARC-Analysis Loading Configuration Scenarios - Initial Screen</span></span></P><P><SPAN>Both tools provide different types of advantages for your analysis:</SPAN></P><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><TABLE><TBODY><TR><TD><P>SAP Migration Assesment Check</P></TD><TD><P>aRC Analyse</P></TD></TR><TR><TD><UL class=""><LI><P>Efforts are calculated with learning effects (many identical interfaces) – certain number and fixed value without prices</P></LI><LI><P>The migration capability is based on the possibilities of the tool (uses defined SAP templates). With new templates, the checks will be more precise and better in future</P></LI><LI><P>With existing cloud integration simple execution.</P></LI><LI><P>Deployable on Cloud Integration</P></LI></UL></TD><TD><UL class=""><LI><P>Shows unused objects</P></LI><LI><P>Presentation per scenario and therefore rather on a migration path</P></LI><LI><P>Calculation of all costs (documentation effort, test effort, GoLive support,etc. )</P></LI><LI><P>Evaluation of message volumes and therefore information about license costs and costs per interface</P></LI><LI><P>aRC Analysis is also possible without Integration Suite and Cloud Connector</P></LI><LI><P>Deployable local</P></LI></UL></TD></TR></TBODY></TABLE><DIV class="">&nbsp;</DIV></DIV></DIV><P>Both tools reports can be downloaded as .pdf and .xls files, so you can work with them offline.</P><DIV class=""><P>The aRC Analyse gives you an overview about all <STRONG>unsed objects</STRONG> in your SAP PO, that means all objects that have no used. For example you get all mappings that where not used in ICOs or Operation Mappings<SPAN class="">. </SPAN>This not only makes the effort estimate more accurate, as these orphaned objects are no longer taken into account, but also provides an overview of objects that can be cleaned up before the project start.</P></DIV><P>A big advantage is that aRC analysis gives you an indication of the costs for using the running service. This means that there is a calculation on different metrics what the cost in operation would be. Expecially if SAP will take cost for message size and message count in future.</P><P>The presentation per scenario instead of considering only ICOs provides the possbility to look if ICOs are used multiple times. So the cost for migration could be more accurate.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="ARC Analysis - Scenario-based Analysis" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/60750i5D4D73693CBE72D6/image-size/large?v=v2&amp;px=999" role="button" title="Unbenannt.JPG" alt="ARC Analysis - Scenario-based Analysis" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ARC Analysis - Scenario-based Analysis</span></span></P><P>In the meantime you can also have a report on ICO level so you can have a look on szenario costs and can compare it on ICO costs.</P><P>Additonally the aRC analysis groups all Adapters and ESR objects on the categories based on their migration complexity.</P><P>So we have categories for easy, medium and hard to migrate objects.</P><DIV class=""><DIV class=""><DIV><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV><TABLE width="734px"><TBODY><TR><TD width="179.833px"><STRONG>Easy</STRONG></TD><TD width="259.771px"><STRONG>Medium</STRONG></TD><TD width="293.729px"><STRONG>Hard</STRONG></TD></TR><TR><TD width="179.833px"><P>ICOs without mapping, rules or conditions</P></TD><TD width="259.771px"><P>adaptermodules and mappings also java and xslt</P></TD><TD width="293.729px"><P>File Adapter, X400 Adapter</P></TD></TR><TR><TD width="179.833px"><P>Adapters like SOAP, REST, SFTP, HTTP, AS2</P></TD><TD width="259.771px"><P>Lookups</P></TD><TD width="293.729px"><P>operation mappings with parameters</P><P>own developed adaptermodules</P></TD></TR><TR><TD width="179.833px"><P>here migration is possible with automatic tools</P></TD><TD width="259.771px"><P>here migration is possible with manually work and automatic tools</P></TD><TD width="293.729px"><P>here migration has to be done manually and maybe with redesign of interfaces</P></TD></TR></TBODY></TABLE><DIV class="">&nbsp;</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Example Report" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/60751iF68B5B221D122C0B/image-size/large?v=v2&amp;px=999" role="button" title="Ergebnisse.JPG" alt="Example Report" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Example Report</span></span></DIV><DIV class="">&nbsp;</DIV><DIV class="">One more advantage of aRC analysis is that you can work with parameters for the single tasks. This means you can configure via excel your parameter for the times of single tasks.&nbsp;</DIV></DIV></DIV><P>The aRC analysis has many advantages for the estimation of a project (volume, holistic effort) and helps to reduce the complexity of the SAP PO before the migration.<BR />With this tried-and-tested procedure, both tools can be used and the results summarized to get a more accurate estimation result.</P><P>&nbsp;Furthermore the aRC analysis is continiuos improved, as well as the SAP Migration Assement Check tool.</P> 2024-02-13T09:37:51.826000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/integration-advisor-using-the-pre-transformation-feature-within-a-mapping/ba-p/13606186 Integration Advisor: Using the Pre-Transformation feature within a Mapping Guideline (MAG) 2024-02-15T17:09:35.581000+01:00 mert_oezkan https://community.sap.com/t5/user/viewprofilepage/user-id/142311 <H3 id="toc-hId-1115260052">Introduction</H3><P><SPAN>Hello dear SAP Integration community,</SPAN></P><P><SPAN>In this Blog I want to show how to use one of the powerful features in Integration Advisor - the "<A href="https://community.sap.com/t5/technology-blogs-by-sap/new-feature-in-integration-advisor-reordering-of-source-structure/ba-p/13563089" target="_self">Pre-Transformation</A>". This feature allows to transform the source Message Implementation Guideline (MIG) structure which significantly simplifies the logic between source and target within the Mapping Guideline (MAG).&nbsp;</SPAN></P><P><SPAN>In this case a shipment based advanced shipping notification which is a key document in collaboration between suppliers and customers is exchanged. A SOAP message is send from SAP S/4HANA which must be transformed to UN/EDIFACT and send to the specific Trading Partner.</SPAN></P><P><SPAN>Please note that the scope of this blog does not describe how to create and qualify MIGs. As a starting point you can refer to this blog:&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/integration-content-advisor-create-a-customized-interface-using-mig-editor/ba-p/13354699" target="_self">Create a customized interface using MIG editor</A></P><H3 id="toc-hId-918746547">Real world challenge</H3><P><SPAN>The shipment on the source side consists of multiple item segments, one with the gross details, multiple with package details and multiple with product details. They are all on the same segment level.<BR />However, one package can contain multiple products. And that is how the target side is expecting the content.</SPAN></P><H3 id="toc-hId-722233042"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (6).png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65956i164B5847BDD774D6/image-size/large?v=v2&amp;px=999" role="button" title="MicrosoftTeams-image (6).png" alt="MicrosoftTeams-image (6).png" /></span></H3><DIV><DIV class="">Ideally, we should transform the source message in such a way that we group all products together which belong to one package.</DIV><DIV class=""><BR /><H3 id="toc-hId-525719537">Solution</H3><P>Looking at the source payload, for each PRD item an additional segment &lt;HierarchyRelationship&gt; is created pointing to the relevant PKG:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (3).png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65861i87FD8F4BF8824F77/image-size/medium?v=v2&amp;px=400" role="button" title="MicrosoftTeams-image (3).png" alt="MicrosoftTeams-image (3).png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (4).png" style="width: 501px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65862i75718A8010DE17E6/image-size/large?v=v2&amp;px=999" role="button" title="MicrosoftTeams-image (4).png" alt="MicrosoftTeams-image (4).png" /></span></P><P>And that is the information we need to do the Pre-Transformation.</P><P>In this case we have following relationship:</P><TABLE border="1" width="70%"><TBODY><TR><TD width="50%" height="30px"><STRONG>PKG ID</STRONG></TD><TD width="50%" height="30px"><STRONG>PRD ID</STRONG></TD></TR><TR><TD width="50%" height="30px">10</TD><TD width="50%" height="30px">150, 200, 160, 220, 230</TD></TR><TR><TD width="50%" height="30px">70</TD><TD width="50%" height="30px">170</TD></TR><TR><TD width="50%" height="30px">90</TD><TD width="50%" height="30px">180</TD></TR><TR><TD width="50%" height="30px">110</TD><TD width="50%" height="30px">190</TD></TR><TR><TD>130</TD><TD>210</TD></TR></TBODY></TABLE><P>So 5 Packages and 9 Products whereas one of the packages contain 5 products.<BR /><BR />Let's jump into the MAG:<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (5).png" style="width: 719px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65871iB8D86084DC4CCBBC/image-size/large?v=v2&amp;px=999" role="button" title="MicrosoftTeams-image (5).png" alt="MicrosoftTeams-image (5).png" /></span></P><P>What do we want to do exactly?&nbsp;<BR /><STRONG>We want to copy the item segments qualified with PRD into the item segment qualified with PKG where the IDs are matching.<BR /></STRONG>Which can be achieved by the following:</P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="MicrosoftTeams-image (8).png" style="width: 661px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65972iEE988850A179AC7E/image-dimensions/661x609?v=v2" width="661" height="609" role="button" title="MicrosoftTeams-image (8).png" alt="MicrosoftTeams-image (8).png" /></span></STRONG></P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><H3 id="toc-hId-329206032">Simulation</H3><P>Let's see what the result looks like.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (9).png" style="width: 709px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65975iB381FF1D42A96691/image-size/large?v=v2&amp;px=999" role="button" title="MicrosoftTeams-image (9).png" alt="MicrosoftTeams-image (9).png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (10).png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65993i7037402C073FD593/image-size/large?v=v2&amp;px=999" role="button" title="MicrosoftTeams-image (10).png" alt="MicrosoftTeams-image (10).png" /></span></P><P>Here on the right side (After Pre-Transformation) we can see that inside Item (Package) another node has been created - Item_gq_PRD_Copy. The first package with ID=10 has 5&nbsp;Item_gq_PRD_Copy elements (see the yellow highlighted area). Inside the first package the first product has the ID=150. Now let's look at the second product:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MicrosoftTeams-image (11).png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/65995i767A26036C9D90B0/image-size/large?v=v2&amp;px=999" role="button" title="MicrosoftTeams-image (11).png" alt="MicrosoftTeams-image (11).png" /></span><BR />Here we can see that it has the ID=200. And this matches with the table above.</P><H3 id="toc-hId-132692527">Conclusion</H3><P><SPAN>In this blog article we showed the powerful and easy to use feature of the Pre-Transformation, where we transformed the source structure in such a way that it matches the structure of the target which expects to group all products belonging to one package.&nbsp;<BR />Especially in this case, the Pre-Transformation helps to avoid building complex mapping logics which is also an essential aspect and which will be beneficial for operations.&nbsp;</SPAN></P></DIV></DIV> 2024-02-15T17:09:35.581000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/step-by-step-process-to-migrate-b2b-inbound-edifact-interfaces-from-sap-po/ba-p/13608290 Step by Step process to migrate B2B Inbound EDIFACT Interfaces from SAP PO to CI(CPI) w/o TPM 2024-02-19T08:08:39.884000+01:00 adarshrao_rao https://community.sap.com/t5/user/viewprofilepage/user-id/882299 <P style=" text-align : left; ">This blog provides a step by step process to migrate, simple, point to point B2B&nbsp;<STRONG><U>outbound</U> <U>EDIFACT</U></STRONG> interfaces from SAP PO to Cloud Integration (CPI) <U><STRONG>without</STRONG></U> TPM.</P><P style=" text-align : left; ">I have taken an example of an outbound invoice interface (Own system --&gt; Trading Partner) to explain the process</P><P style=" text-align : left; ">System Type: UNEDIFACT</P><P style=" text-align : left; ">Message Type: INVOIC</P><P style=" text-align : left; ">Version: 96A</P><H2 id="toc-hId-986237901">Introduction</H2><P>When we talk about migrating B2B interfaces which are in SAP PO to cloud then there are below options.</P><OL><LI>Create MIGs, MAGs and implement the interface using <A href="https://community.sap.com/t5/technology-blogs-by-sap/announcement-sap-trading-partner-management-and-b2b-monitoring-brand-new/ba-p/13493416" target="_blank">SAP Trading Partner Management (TPM)</A> and leverage B2B monitoring</LI><LI>Migrate the interface from SAP PO to Cloud Integration without using TPM.</LI><LI>Migrate the interface from SAP PO to Cloud using both Cloud Integration and TPM</LI></OL><P>Migrating by implementing the B2B interfaces via TPM comes with a lot of benefits and best practices. Please refer to the <A href="https://community.sap.com/t5/technology-blogs-by-sap/announcement-sap-trading-partner-management-and-b2b-monitoring-brand-new/ba-p/13493416" target="_self">blog</A> for more details but there are customers who wants to avoid time and effort in creating MIGs, qualifying the fields, redoing the MAGs, testing, and implementing via TPM. They want to reuse the existing simple B2B mappings done in SAP PO system.</P><P><BR />Hence, in this blog, we will focus on the <STRONG>option #2</STRONG> with step-by-step approach to easily migrate B2B&nbsp;<STRONG><U>outbound</U> <U>EDIFACT</U></STRONG> interfaces from SAP PO to Cloud Integration</P><P><STRONG>Note</STRONG>: This approach works for message mapping with function libraries without imported archive. To import it to Cloud Integration, please refer <SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-integration-suite-import-pi-po-function-library-into-cloud-integration/ba-p/13568905" target="_blank">blog</A></SPAN>&nbsp;.</P><H2 id="toc-hId-789724396">Pre-requisite</H2><P>Connection between SAP PO and Cloud Integration is already set up. Please refer <A href="https://community.sap.com/t5/technology-blogs-by-sap/how-to-connect-cpi-and-pi-system-to-import-mappings-via-sap-cloud-connector/ba-p/13378543" target="_self">blog</A></P><H2 id="toc-hId-593210891">Steps to Migrate</H2><P>In this case, we will concentrate on migrating a outbound INVOIC interface (Own system --&gt; Trading Partner) from SAP PO to Cloud Integration</P><P>1. Create a package, Click on <STRONG>Edit</STRONG> --&gt; <STRONG>Migrate</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_0-1708107792290.png" style="width: 559px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66670i5BA03418D1AE4216/image-dimensions/559x41?v=v2" width="559" height="41" role="button" title="adarshrao_rao_0-1708107792290.png" alt="adarshrao_rao_0-1708107792290.png" /></span></P><P>2. Select your already configured SAP PO system from the drop-down --&gt; <STRONG>Next Step</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_1-1708107792294.png" style="width: 562px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66671iCA50B872FF318B32/image-dimensions/562x111?v=v2" width="562" height="111" role="button" title="adarshrao_rao_1-1708107792294.png" alt="adarshrao_rao_1-1708107792294.png" /></span></P><P>3. Select Integrated Configuration (ICo) of the B2B interface you wish to migrate.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_2-1708107792297.png" style="width: 577px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66672iF6176B6E9A462E77/image-dimensions/577x160?v=v2" width="577" height="160" role="button" title="adarshrao_rao_2-1708107792297.png" alt="adarshrao_rao_2-1708107792297.png" /></span></P><P>4. ICo selected will be reviewed dynamically by the tool and following template proposals are provided.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_3-1708107792307.png" style="width: 552px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66675i6967911D598C1DCD/image-dimensions/552x309?v=v2" width="552" height="309" role="button" title="adarshrao_rao_3-1708107792307.png" alt="adarshrao_rao_3-1708107792307.png" /></span></P><P>5. For Simplicity purpose, I will select the below template and click on Next Step&nbsp;</P><P><FONT color="#333399"><U><STRONG>Update</STRONG></U>: For the list of supported templates available, please refer</FONT> <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/supported-templates" target="_self" rel="noopener noreferrer">Supported Templates</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_4-1708107792308.png" style="width: 587px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66673i141BF1D48857D490/image-dimensions/587x91?v=v2" width="587" height="91" role="button" title="adarshrao_rao_4-1708107792308.png" alt="adarshrao_rao_4-1708107792308.png" /></span></P><P>6. Provide a name for your iFlow --&gt; <STRONG>Review</STRONG> --&gt; <STRONG>Migrate</STRONG> --&gt; <STRONG>View Artifact</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_5-1708107792311.png" style="width: 595px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66674i95899A49C1B7CE25/image-dimensions/595x128?v=v2" width="595" height="128" role="button" title="adarshrao_rao_5-1708107792311.png" alt="adarshrao_rao_5-1708107792311.png" /></span></P><P>7. Click on <STRONG>Configure</STRONG> - to configure sender and receiver channels.</P><P>8. In the Local integration process, you can see the mapping migrated from SAP PO</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_6-1708107792312.png" style="width: 596px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66677iA9A4FE0DEDEC7EBB/image-dimensions/596x147?v=v2" width="596" height="147" role="button" title="adarshrao_rao_6-1708107792312.png" alt="adarshrao_rao_6-1708107792312.png" /></span></P><P>9. If you have any fields, which is using <STRONG>$B2B_END_UEBNR</STRONG> for unique numbers which is a parameter in SAP PO then follow below steps.</P><P style=" padding-left : 30px; ">1. Open another tab, to create NRO as below.</P><P style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_7-1708107792314.png" style="width: 491px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66676i07E9501002E5CABA/image-dimensions/491x238?v=v2" width="491" height="238" role="button" title="adarshrao_rao_7-1708107792314.png" alt="adarshrao_rao_7-1708107792314.png" /></span></P><P style=" padding-left : 30px; ">2. Add Content modifier before SAP PO mapping and set exchange property.</P><P style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_8-1708107792318.png" style="width: 600px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66678iFDF6347693165036/image-dimensions/600x294?v=v2" width="600" height="294" role="button" title="adarshrao_rao_8-1708107792318.png" alt="adarshrao_rao_8-1708107792318.png" /></span></P><P style=" padding-left : 30px; ">3. Click on create to create a custom function</P><P style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_9-1708107792320.png" style="width: 470px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66679i484620DDDB2B603F/image-dimensions/470x428?v=v2" width="470" height="428" role="button" title="adarshrao_rao_9-1708107792320.png" alt="adarshrao_rao_9-1708107792320.png" /></span></P><P style=" padding-left : 30px; ">4. Add the below code</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-java"><code>import com.sap.it.api.mapping.*; def String customFunc1(String P1,MappingContext context) { String value1 = context.getProperty(P1); return value1; }​</code></pre><P>&nbsp;</P><P>&nbsp;</P><P><FONT color="#333399"><U><STRONG>Update</STRONG></U>:</FONT></P><P><FONT color="#333399">Now, in CI we have standard function "getProperty" available. Hence, please use this function instead of above mentioned custom. In the property name maintain the the value as ICN_DEFAULT</FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_0-1709479891356.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/74679i887A168EC14426D1/image-size/medium?v=v2&amp;px=400" role="button" title="adarshrao_rao_0-1709479891356.png" alt="adarshrao_rao_0-1709479891356.png" /></span></P><P style=" padding-left : 30px; ">5. Do the mapping as below for all the fields which is using SAP PO NRO parameter, <STRONG>$B2B_END_UEBNR</STRONG>, save and deploy the message mapping</P><P style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_10-1708107792325.png" style="width: 620px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66680iBBD88F7EDB7EAEB5/image-dimensions/620x278?v=v2" width="620" height="278" role="button" title="adarshrao_rao_10-1708107792325.png" alt="adarshrao_rao_10-1708107792325.png" /></span></P><P>10. If your mapping is using <STRONG>$B2B_SEG_COUNTER</STRONG> to count the number of segments which is the value for the field D_0074 under the segment, S_UNT, then we will make use of XSLT mapping</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_0-1709688544025.png" style="width: 656px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/76059i3AA8BA644075C740/image-dimensions/656x212?v=v2" width="656" height="212" role="button" title="adarshrao_rao_0-1709688544025.png" alt="adarshrao_rao_0-1709688544025.png" /></span></P><P style=" padding-left : 30px; ">1. Add a property in the content modifier. This property will be called in the XSLT mapping.</P><P style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_12-1708107792336.png" style="width: 618px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66683iB9E20AD120D99CD4/image-dimensions/618x411?v=v2" width="618" height="411" role="button" title="adarshrao_rao_12-1708107792336.png" alt="adarshrao_rao_12-1708107792336.png" /></span></P><P style=" padding-left : 30px; ">2. Create a XSLT Mapping next to the imported message mapping and add the below code</P><P style=" padding-left : 30px; "><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_13-1708107792338.png" style="width: 571px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66682i5FE983B47FD49D4A/image-dimensions/571x164?v=v2" width="571" height="164" role="button" title="adarshrao_rao_13-1708107792338.png" alt="adarshrao_rao_13-1708107792338.png" /></span></P><pre class="lia-code-sample language-markup"><code>&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;!-- Declaring the Parameter --&gt; &lt;xsl:param name="MessageType"/&gt; &lt;!-- Matching the template --&gt; &lt;xsl:template match="@*|node()"&gt; &lt;xsl:copy&gt; &lt;xsl:apply-templates select="@*|node()"/&gt; &lt;/xsl:copy&gt; &lt;/xsl:template&gt; &lt;!-- Matching the template for D_0074 under S_UNT where segment count is added --&gt; &lt;xsl:template match="S_UNT/D_0074"&gt; &lt;xsl:copy&gt; &lt;!-- Use the parameter in the XPath expression --&gt; &lt;xsl:value-of select="count(//*[starts-with(name(), 'S_')][ancestor-or-self::*[name()=$MessageType]])"/&gt; &lt;/xsl:copy&gt; &lt;/xsl:template&gt; &lt;!-- Template to remove "_1" from node names --&gt; &lt;xsl:template match="*[substring(name(), string-length(name()) - 1) = '_1']"&gt; &lt;xsl:element name="{substring-before(name(), '_1')}"&gt; &lt;xsl:apply-templates select="@*|node()"/&gt; &lt;/xsl:element&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>Parameter can be changed based on the message type used in the flow to make this XSLT mapping dynamic. Template to remove _1 from the node names is added to convert PO xml to CI (CPI) specific xml.</P><P>11. Final step would be to download the EDIFACT xsd from Integration Advisor. In this case it is <STRONG>“UN-EDIFACT_INVOIC_D96A.xsd”</STRONG>, add the <STRONG>XML to EDI converter</STRONG> and add the downloaded xsd.</P><P><FONT color="#333399"><U><STRONG>Update</STRONG></U>: For steps to download the xsd from Integration Advisor, please refer</FONT> <A href="https://community.sap.com/t5/technology-blogs-by-sap/step-by-step-process-to-download-edifact-xsds-from-integration-advisor-for/ba-p/13626288?emcs_t=S2h8ZW1haWx8dG9waWNfc3Vic2NyaXB0aW9ufExURDdYVTlLUlpDWE9PfDEzNjI2Mjg4fFNVQlNDUklQVElPTlN8aEs" target="_self">blog</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_14-1708107792342.png" style="width: 660px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66684i22B0F2C342798832/image-dimensions/660x315?v=v2" width="660" height="315" role="button" title="adarshrao_rao_14-1708107792342.png" alt="adarshrao_rao_14-1708107792342.png" /></span></P><P>12. That’s it, save and deploy the iFlow!</P><P>Now, when an IDOC is triggered to this iFlow, you will be able to see that the IDOC gets converted successfully to EDI format and the unique values from NRO and segment counters are also populated correctly .</P><P style=" padding-left : 30px; ">Unique values from NRO for the field D_0020</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_15-1708107792343.png" style="width: 417px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66686i02DE6385ABBEE054/image-dimensions/417x96?v=v2" width="417" height="96" role="button" title="adarshrao_rao_15-1708107792343.png" alt="adarshrao_rao_15-1708107792343.png" /></span></P><P>Segment counter for the field D_0074</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_16-1708107792343.png" style="width: 131px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/66685iCCAF5FD9820FCEB6/image-dimensions/131x49?v=v2" width="131" height="49" role="button" title="adarshrao_rao_16-1708107792343.png" alt="adarshrao_rao_16-1708107792343.png" /></span></P><H2 id="toc-hId-396697386">Summary</H2><P>These steps will help to easily and quickly migrate simple, point to point B2B&nbsp;<STRONG><U>outbound</U> <U>EDIFACT</U></STRONG> interfaces from SAP PO to CI. This will help in reusing the existing mapping done in SAP PO. This blog also explained how SAP PO parameters like&nbsp;&nbsp;<STRONG>$B2B_END_UEBNR&nbsp;</STRONG>and&nbsp;<STRONG>$B2B_SEG_COUNTER&nbsp;</STRONG>are replaced in SAP Cloud Integration.&nbsp;</P><P><STRONG>Note:&nbsp;</STRONG>Inbound EDIFACT interfaces will require more modifications and it cannot be used directly from the EDI to xml converter in the imported PO mapping.</P><P>In my next blog, I will try to cover how to migrate inbound EDIFACT interfaces w/o using TPM.</P><P><SPAN>Please feel free to discuss your experience with B2B migration from SAP PO to cloud in the comment section of this blog post.</SPAN></P> 2024-02-19T08:08:39.884000+01:00 https://community.sap.com/t5/technology-blogs-by-members/pgp-encryption-decryption-using-java-code-inside-payload/ba-p/13620956 PGP Encryption/Decryption using Java code inside payload 2024-03-01T10:51:37.554000+01:00 Ajith_Nair https://community.sap.com/t5/user/viewprofilepage/user-id/615390 <P>In this blog, I will retrace the steps that I have used to encrypt and decrypt payload coming inside message tags using PGP encryption/decryption. After many searches and tries, I was able to find a blog by Sandeep using Bouncy Castle,<BR /><A href="https://community.sap.com/t5/additional-blogs-by-members/pgp-encryption-decryption-using-java-code/ba-p/12912768" target="_blank">https://community.sap.com/t5/additional-blogs-by-members/pgp-encryption-decryption-using-java-code/ba-p/12912768</A><BR />This is an update to the same blog where I have worked around the mentioned trick without using Bouncy Castle to add the encrypted payload within the messages.<BR /><BR />For OpenPGP encryption and decryption, the requirement that I had was to convert the generated message through <STRONG>BCM(Bank Communication Management)&nbsp;</STRONG>by first encrypting&nbsp;with PGP encryption and then converting to base64 while having this within the payload.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="INBOUND flow" style="width: 595px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/72470i66D20601E16A597C/image-size/large?v=v2&amp;px=999" role="button" title="inbound flow.jpg" alt="INBOUND flow" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">INBOUND flow</span></span></P><P>&nbsp;</P><OL><LI>Download the necessary libraries required.<BR /><STRONG>bcpg-lw-jdk15on-1.70.jar</STRONG><BR /><STRONG>bcprov-lw-jdk15on-1.70.jar</STRONG><BR /><STRONG>pgplib-3.2.3.jar</STRONG><BR /><STRONG>com.sap.xi.mapping.tool.lib_api.jar</STRONG><BR /><STRONG>com.sap.xpi.ib.mapping.lib.jar</STRONG><BR /><BR />You can get the first 3 libraries from the below link<BR /><A href="https://didisoft.com/java-openpgp/" target="_blank" rel="noopener nofollow noreferrer">https://didisoft.com/java-openpgp/</A><BR />The other 2 libraries are sap standard libraries used in Java mapping or any UDF concerned, if required I will also try to attach the same on edit.<BR /><BR /></LI><LI>Next step, you have to generate your keys, I have used <STRONG>GPG4WIN 3.1.9 </STRONG>to generate&nbsp;keys<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="keys.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71943i9524A8ADB4FFFA81/image-size/large?v=v2&amp;px=999" role="button" title="keys.jpg" alt="keys.jpg" /></span><BR /><BR />Post your keys generation, you will have 3 keys, one public key from the bank and 2 keys generated at your end, one public and one private.<BR /><BR /></LI><LI>You have to store the keys in the OS folder such that your Java code can access the keys, I have mentioned the path in which I have stored them for your reference. <STRONG>You have to use SKR for private keys and PKR extension for public keys.</STRONG><BR /><PRE><STRONG>/usr/sap/XXX/X00/&lt;your_custom_folder&gt;/privatekey.skr<BR /></STRONG></PRE></LI><LI>I have used Eclipse for my Java code development, as currently NWDS is not available. Below is the reference path of the package I have used, I have inserted keys within the package and reference libraries which I have uploaded.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="package content" style="width: 256px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71990i3B9E56682FAE67AD/image-size/large?v=v2&amp;px=999" role="button" title="folder path 2.jpg" alt="package content" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">package content</span></span><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="reference libraries" style="width: 315px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/71989i2987AD6CB512E8E0/image-size/large?v=v2&amp;px=999" role="button" title="folder path.jpg" alt="reference libraries" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">reference libraries</span></span><BR /><BR /></LI><LI>Below is the encryption Java code that I have used, I have used many "getTrace" code which is for my reference, you can remove them or add additional ones based on what you prefer during testing.</LI></OL><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-java"><code>package z001; import java.io.InputStream; import java.io.OutputStream; import com.sap.aii.mapping.api.*; import java.io.*; import java.util.Base64; import com.didisoft.pgp.PGPLib; public class encrypt extends AbstractTransformation { @Override public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try{ PGPLib pgp = new PGPLib(); String privateKeyFile = "/usr/sap/XXX/X00/&lt;your_custom_folder&gt;/privatekey.skr"; String privateKeyPassword = "&lt;your_key_password&gt;"; String publicEncryptionKeyFile = "/usr/sap/XXX/X00/&lt;your_custom_folder&gt;/bankkey.pkr"; InputStream inputStream = transformationInput.getInputPayload().getInputStream(); BufferedReader inpxml = new BufferedReader(new InputStreamReader(inputStream)); getTrace().addInfo("input received"); StringBuffer buffer = new StringBuffer(); String line=""; while ((line = inpxml.readLine()) != null) { buffer.append(line); } String org_msg=buffer.toString(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); getTrace().addInfo("encrypt"); String signedAndEncryptedString = pgp.signAndEncryptString(org_msg, privateKeyFile, privateKeyPassword, publicEncryptionKeyFile); getTrace().addInfo("encode"); byte[] bytes = signedAndEncryptedString.getBytes(); String encodedString = Base64.getEncoder().encodeToString(bytes); // int msg_length = org_msg.length(); getTrace().addInfo("finalstructure"); String target_msg = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;"+"&lt;ns0:MT_bank_Pay_Request xmlns:ns0=\"http://x.com/bank_Payment\"&gt;"+"&lt;paymentBase64&gt;"+encodedString+"&lt;/paymentBase64&gt;"+"&lt;/ns0:MT_bank_Pay_Request&gt;"; outputstream.write(target_msg.getBytes()); //this is to get the final target message that we have converted getTrace().addInfo("finalstructure"+target_msg); } catch (Exception ie) { } } }​</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>This will convert the final message below</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"&gt; ​&lt;ns0:MT_bank_Pay_Request xmlns:ns0="http://x.com/bank_Payment"&gt; &lt;paymentBase64&gt;"your encoded and encrypted string"&lt;/paymentBase64&gt; &lt;/ns0:MT_bank_Pay_Request&gt;</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="OUTBOUND flow" style="width: 533px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/72471i44174C7D0387DAB6/image-size/large?v=v2&amp;px=999" role="button" title="outbound flow.jpg" alt="OUTBOUND flow" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">OUTBOUND flow</span></span><BR />This is the response from the bank side that I was receiving, here in responsebase64 I had the original file content response, which needed to be decoded and decrypted.</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;ns0:MT_Vendor_Pay_Response xmlns:ns0="http://x.com/bank_Payment"&gt; &lt;referenceId&gt;1&lt;/referenceId&gt; &lt;profileId&gt;2&lt;/profileId&gt; &lt;statusCode&gt;3&lt;/statusCode&gt; &lt;statusDesc&gt;5&lt;/statusDesc&gt; &lt;responseBase64&gt;6&lt;/responseBase64&gt; &lt;/ns0:MT_Vendor_Pay_Response&gt;</code></pre><P>&nbsp;</P><P>&nbsp;</P><P><BR />For decryption, in the below Java code, you can see the original content (which is encrypted and encoded) is within the responsebase64 tag, if blank I am generating a different XML response, but if non-blank I will be consuming the payload within SAP PO. Integration response will be generally provided by the bank side, you can add the dummy payload as same as the response you are having from the bank.</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-java"><code>package z001; import com.sap.aii.mapping.api.*; import java.io.*; import java.util.Base64; import com.didisoft.pgp.PGPLib; public class decrypt extends AbstractTransformation { @Override public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try { PGPLib pgp = new PGPLib(); String privateKeyFile = "/usr/sap/XXX/X00/&lt;your_custom_folder&gt;/privatekey.skr"; String privateKeyPassword = "&lt;your_key_password&gt;"; InputStream inputStream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); BufferedReader inpxml = new BufferedReader(new InputStreamReader(inputStream)); getTrace().addInfo("input received"); String originalFileName = ""; StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = inpxml.readLine()) != null) { buffer.append(line); } String org_msg = buffer.toString(); String s3 = org_msg; String isFound = ""; String headerstatus = ""; String headerdesc = ""; String responsebase64 ; headerstatus = s3; headerdesc = s3; responsebase64 = s3; //I have used index here as my response was having status code and message //which i have capture in local variable. headerstatus = headerstatus.substring(headerstatus.indexOf("&lt;statusCode&gt;") + 12); headerstatus = headerstatus.substring(0, headerstatus.indexOf("&lt;/statusCode&gt;")); getTrace().addInfo(headerstatus); headerdesc = headerdesc.substring(headerdesc.indexOf("&lt;statusDesc&gt;") + 12); headerdesc = headerdesc.substring(0, headerdesc.indexOf("&lt;/statusDesc&gt;")); getTrace().addInfo(headerdesc); //orginal response was coming after &lt;responseBase64&gt; tag which is capture here responsebase64 = responsebase64.substring(responsebase64.indexOf("&lt;responseBase64&gt;") + 16); getTrace().addInfo(responsebase64); //I am checking here if response is there or not, if not i am making a custom xml if ( responsebase64.indexOf("&lt;/responseBase64&gt;") == 0) { isFound = "N"; } else { responsebase64 = responsebase64.substring(0, responsebase64.indexOf("&lt;/responseBase64&gt;")); isFound = "Y"; } getTrace().addInfo("truecheck" + isFound + responsebase64); if ( isFound == "Y" ) { getTrace().addInfo("ifcheck"); org_msg = org_msg.substring(org_msg.indexOf("&lt;responseBase64&gt;") + 16); org_msg = org_msg.substring(0, org_msg.indexOf("&lt;/responseBase64&gt;")); getTrace().addInfo("beforedecoding" + org_msg); byte[] decodedBytes = Base64.getDecoder().decode(org_msg); getTrace().addInfo("decoded"); String decodedString = null; // Get the string of decoded byte array String s = new String(decodedBytes); // String encrypted = ""; decodedString = s; getTrace().addInfo("beforedecryption"); //this is the decryption code, you can use it based on ur use case originalFileName = pgp.decryptString(decodedString, privateKeyFile, privateKeyPassword); //end of decryption code getTrace().addInfo("decrypted" + originalFileName); } else { getTrace().addInfo("elsecheck"); String so = originalFileName; if (so == "") { ///if the code is blank originalFileName = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n" + "&lt;ns0:Document xmlns:ns0=\"urn:http://x.com\"&gt;\r\n" + "&lt;paymentresponseBase64&gt;"+"FAILED"+"&lt;/paymentresponseBase64&gt;" + "&lt;/ns0:Document&gt;"; } } String target_msg = originalFileName; getTrace().addInfo("finalstructure" + target_msg); outputstream.write(target_msg.getBytes()); } catch (Exception ie) { } } }​</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>Note:<BR />I have used the above code based on my use case, you can play around with the Didisoft libraries and choose what fits best. For the adapter level, many modules and blogs are available that can be used to do the encryption and decryption.<BR />Keep track of the expiry of keys, would be helpful for you as a change in year-end activity.<BR /><BR /></P><P>&nbsp;</P> 2024-03-01T10:51:37.554000+01:00 https://community.sap.com/t5/technology-blogs-by-members/analyze-your-sap-pi-po-system-before-a-migration-to-integration-suite/ba-p/13628495 Analyze Your SAP PI/PO System Before a Migration to Integration Suite 2024-03-05T14:30:56.817000+01:00 DG https://community.sap.com/t5/user/viewprofilepage/user-id/3313 <P class=""><SPAN>Before you can create any SAP PI/PO migration you need to plan and budget for a migration project. It is not an easy to do task and there are a lot of factors you should consider. </SPAN></P><P class=""><SPAN>SAP has their&nbsp;</SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/migration-assessment" target="undefined" rel="noopener noreferrer"><SPAN>migration assessment tool</SPAN></A><SPAN>, that you can trigger to fetch data about your current system and landscape. I strongly encourage you to run it and get the details from it. The more perspectives you have on your integration, the better. </SPAN></P><P class=""><SPAN>At Figaf we also have our report over your landscape. It does not come with any timeline on how long it should take to process each migration. It is something that is up to you to process with your landscape. </SPAN></P><H1 id="toc-hId-859004151"><SPAN>How Figaf collects data</SPAN></H1><P class=""><SPAN>Once you install Figaf and it connect to your SAP PI/PO system it collects a local version of all objects. Then it links all objects to so we got a tree of the objects. This is the same as SAPs tool does. </SPAN></P><P class=""><SPAN>You can use our <A href="https://figaf.com/migrationedition/" target="_self" rel="nofollow noopener noreferrer">free migration edition</A>, which will also help you test the migration and allow you to try our migration tool. You can </SPAN><A href="https://figaf.com/figaf-in-your-migration-project/" target="undefined" rel="nofollow noopener noreferrer"><SPAN>install</SPAN></A><SPAN> Figaf on a laptop for a PoC or on BTP for productive usage. </SPAN></P><H1 id="toc-hId-662490646"><SPAN>Figaf report</SPAN></H1><P class=""><SPAN>Once data is collected, you can generate a report like the following with all data.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DG_0-1709645080536.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/75803i05DDA2F9EF6BCDE4/image-size/medium?v=v2&amp;px=400" role="button" title="DG_0-1709645080536.png" alt="DG_0-1709645080536.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DG_1-1709645099531.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/75804i3EA5F30D68453110/image-size/medium?v=v2&amp;px=400" role="button" title="DG_1-1709645099531.png" alt="DG_1-1709645099531.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DG_2-1709645116371.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/75805i0BF2180696A4FC8E/image-size/medium?v=v2&amp;px=400" role="button" title="DG_2-1709645116371.png" alt="DG_2-1709645116371.png" /></span></P><P>&nbsp;</P><P class=""><SPAN>You will need to go through and find:</SPAN></P><UL><LI><P class=""><SPAN>The different types of adapters used. It is mainly the first time you connect with an adapter that it will cost you time. </SPAN></P></LI></UL><UL><LI><P class=""><SPAN>Number of different modules you need to support and how critical it is</SPAN></P></LI></UL><UL><LI><P class=""><SPAN>Number of EDI interfaces </SPAN></P></LI></UL><UL><LI><P class=""><SPAN>Find problems that cannot be migrated</SPAN></P></LI></UL><P class=""><SPAN class="">&nbsp;</SPAN></P><P class=""><SPAN>Once you have gone thru the list it becomes easier for you to estimate how many interfaces you need to migrate. </SPAN></P><H1 id="toc-hId-465977141"><SPAN>The small differences</SPAN></H1><P class=""><SPAN>With the projects we have been working with we have found that it is small details that makes or breaks if a migration will work. Some of the recent challenges we have come up with are:</SPAN></P><OL><LI><P class=""><SPAN>Local function in a message mapping that are using Imported Archives</SPAN></P></LI></OL><OL><LI><P class=""><SPAN>Message mapping that links to an Imported Message. Something we have only seen in old mappings.</SPAN></P></LI></OL><P class=""><SPAN class="">&nbsp;And you will probably find a lot of other cases</SPAN></P><P class=""><SPAN>In our latest release (2402) of Figaf we have created a option to callow you to create your own rules via Xpath or Regex. Then it will find all objects in your ESR or Directory that matches this. On a call we should the team in about 5 minutes how to create a new rule to cover checking for the second case. Then we could see less than 10 mappings were affected so no need to automate a workaround. If it was 20-50 we may have considered improving to fix this case. </SPAN></P><P class=""><SPAN>For 1. Figaf allows you to extract the UDF to a groovy script as we do for Function Libraries. This gives you a way to edit and manage the content much more accessible.</SPAN></P><P class=""><SPAN>To create a new rule check the following guide</SPAN></P><P class=""><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Ff8bosL9oavk%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Df8bosL9oavk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Ff8bosL9oavk%2Fhqdefault.jpg&amp;key=b0d40caa4f094c68be7c29880b16f56e&amp;type=text%2Fhtml&amp;schema=youtube" width="200" height="112" scrolling="no" title="Qustion Query in your SAP PI landscape for SAP PI migration" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P class=""><SPAN>I hope this will be a part of your migration toolbox.</SPAN></P><H1 id="toc-hId-269463636"><SPAN>Pilot project</SPAN></H1><P class=""><SPAN>The assessment is not something that can stand alone. Running a pilot project where you migrate some integrations with the different options SAPs, Figafs or manual migration will give you much more data about how to get started. </SPAN></P><P class=""><SPAN>Also consider the effort of moving it into production and all the steps involved, like testing and go live considerations. </SPAN></P><P class=""><SPAN class="">&nbsp;</SPAN></P> 2024-03-05T14:30:56.817000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/what-s-new-for-sap-integration-suite-february-2024/ba-p/13635001 What’s New for SAP Integration Suite – February 2024 2024-03-12T09:22:05.281000+01:00 GabrielaGahse https://community.sap.com/t5/user/viewprofilepage/user-id/4015 <P>Before going into the highlights of our innovations, we are thrilled to inform you that SAP Integration Suite has been recognized as a Leader in the latest Gartner Magic Quadrant for Integration Platform-as-a-Service (iPaaS) for the fourth consecutive time. We are convinced that we have been received this recognition for our commitments to deliver a top-tier customer-centric integration solution, the ability to accelerate business outcomes through prebuilt content, ongoing innovation, the global geographic strategy, and readiness for the future. And a big thanks also goes to you in supporting us with all your great feedback. For more details checkout the <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-recognized-as-a-leader-in-2024-gartner-magic-quadrant-for-ipaas/ba-p/13623157" target="_blank">blogpost</A> and the <A href="https://news.sap.com/2024/02/sap-named-leader-2024-gartner-magic-quadrant-ipaas/" target="_blank" rel="noopener noreferrer">SAP News article</A>.</P><P>SAP Integration Suite highlights are:</P><UL><LI>JMS receiver adapter: property to identify sending integration flow</LI><LI>Inspect resource consumption through SAP Cloud ALM/SAP Focused Run</LI><LI>Call to action: Upgrade to new version of third-party connectors</LI><LI>Duplicate nodes on target side in a MAG</LI><LI>Definition of more complex code value mapping scenarios</LI><LI>Add metadata for OData-based API artifacts deployed on Edge Integration Cell</LI><LI>Enhancement of security standards in API Management</LI><LI>Policy templates in API Management</LI><LI>Distributed tracing in advanced event mesh</LI><LI>Direct consumption of SAP S/4HANA Cloud events in advanced event mesh</LI></UL><H2 id="toc-hId-988916891">Cloud Integration</H2><H3 id="toc-hId-921486105">JMS receiver adapter: property to identify sending integration flow</H3><P>We have extended the JMS receiver adapter by storing a new <STRONG>SAP_IntegrationFlowID</STRONG> property. It contains the ID of the integration flow that has sent the message through the JMS receiver adapter. The JMS consumer can use this property to define steps depending on the sending integration flow ID. Refer the&nbsp;<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/headers-and-exchange-properties-provided-by-integration-framework" target="_blank" rel="noopener noreferrer">documentation</A>.&nbsp;</P><H3 id="toc-hId-724972600">Inspect resource consumption through SAP Cloud ALM/SAP Focused Run</H3><P>Inspection of your resource consumption has been available since the middle of last year. Now you may analyze the utilization of database and system resources through the health monitoring application of SAP Cloud ALM and SAP Focused Run. For troubleshooting bottlenecks caused by integration flows you may jump directly to the Inspect section of the Cloud Integration monitor.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_0-1710162608878.png" style="width: 703px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/78583i4DDAA3ACF5EC10BD/image-dimensions/703x262?v=v2" width="703" height="262" role="button" title="GabrielaGahse_0-1710162608878.png" alt="GabrielaGahse_0-1710162608878.png" /></span></P><H3 id="toc-hId-528459095">Call to action: Upgrade to new version of third-party connectors</H3><P>As per <A href="https://me.sap.com/notes/3001980" target="_blank" rel="noopener noreferrer">SAP note 3001980</A> the following previous adapter versions are deprecated since end of 2020: Salesforce, Amazon Web Services, Microsoft Dynamics, SugarCRM. There haven't been any new features or enhancements for these previous adapter versions. After the upcoming Apache Camel upgrade, the adapter versions will no longer run.</P><P>Action is required from the customer's side. Check all your tenants to see whether you have any kind of the above adapters still deployed. Please undeploy and delete the adapters. In case of question reach out to <A href="mailto:annemarie.kiefer@sap.com" target="_blank" rel="noopener nofollow noreferrer">annemarie.kiefer@sap.com</A><SPAN>.</SPAN></P><H2 id="toc-hId-202862871">B2B Integration</H2><P>We have extended the mapping functionality of the Integration Advisor capability to offer you more flexibility.</P><H3 id="toc-hId-135432085">Duplicate nodes on target side in a MAG</H3><P>When designing B2B integration scenarios you may have situations where certain information within the source structure needs to be mapped to only one node in the target structure. Now the mapping guidelines editor of the Integration Advisor capability enables you to duplicate group or leave nodes and map each source alternative to one of the reproductions. Refer to the <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/mapping-source-and-target-nodes#duplicate-target-nodes" target="_blank" rel="noopener noreferrer">documentation</A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_1-1710156933032.jpeg" style="width: 652px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/78430iB74065749B4DCFAC/image-dimensions/652x259?v=v2" width="652" height="259" role="button" title="GabrielaGahse_1-1710156933032.jpeg" alt="GabrielaGahse_1-1710156933032.jpeg" /></span></P><P>&nbsp;</P><H3 id="toc-hId--61081420">Definition of more complex code value mapping scenarios</H3><P>You are now able to define local or global mappings of multiple code values at the source side to one code value at the target side. The value function now supports N:1 cardinality code value mapping ease e.g., situations where you have to map multiple partners or currencies.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_2-1710156933037.jpeg" style="width: 692px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/78429i302CBE7871F725EB/image-dimensions/692x285?v=v2" width="692" height="285" role="button" title="GabrielaGahse_2-1710156933037.jpeg" alt="GabrielaGahse_2-1710156933037.jpeg" /></span></P><H2 id="toc-hId--386677644">API Management</H2><H3 id="toc-hId--454108430">Add metadata for OData-based API artifacts deployed on Edge Integration Cell</H3><P>You can now supply an EDMX specification for API artifacts (API-led integration flows for deployment on Edge Integration Cell), that are based on OData APIs. This allows you to easily specify additional integration steps based on the resources of this API. See the detailed <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/create-api-artifact-using-url" target="_blank" rel="noopener noreferrer">documentation.</A></P><H3 id="toc-hId--650621935">Enhancement of security standards</H3><P>As always, our intention is to offer the highest security standards to avoid attack vulnerabilities. Therefore, we encourage you to use strong certificates, and will no longer accept uploads to the Trust Store of weak customer-owned self-signed certificates or certificate chains used for mTLS handshakes.&nbsp;Consequently, the OpenSSL security level has been increased to level 2. See a comprehensive definition of security level 2 published on the <A href="https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_security_level.html#DEFAULT-CALLBACK-BEHAVIOURInformation" target="_blank" rel="noopener nofollow noreferrer">OpenSLL site</A>. For additional details please see <A href="https://me.sap.com/notes/3418201" target="_blank" rel="noopener noreferrer">note -3418201</A>.</P><H3 id="toc-hId--922366809">Policy templates</H3><P>We have filled a small gap when applying policy templates to an API proxy. Default fault&nbsp;rules or post-client flows available within a policy template will now also be appended to the API proxy. Refer to the &nbsp;<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/apply-policy-template" target="_blank" rel="noopener noreferrer">documentation</A>.</P><H2 id="toc-hId--825477307">Event-driven Integration</H2><P>We have news regarding SAP Integration Suite, advanced event mesh our offering for distributed network of event brokers and sophisticated features.</P><H3 id="toc-hId--1315393819">Distributed tracing</H3><P>We have extended SAP Integration Suite, advanced event mesh with a distributed tracing capability. Now you are able to trace the the lifecycle of events through OpenTelemetry, from the producing application across one or multiple event brokers to the receiving application.</P><H3 id="toc-hId--1511907324">Direct consumption of SAP S/4HANA Cloud events</H3><P>We have an update regarding the event sources. We have enabled the direct consumption of SAP S/4HANA Cloud events into SAP Integration Suite, advanced event mesh without any intermediate hops. SAP S/4HANA Cloud customers may leverage SAP Integration Suite, advanced event mesh for very large projects, where performance is crucial. Read the <A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/9b34c841dfba4f82af0825a2f3196ecf.html?version=2402.500" target="_blank" rel="noopener noreferrer">documentation</A>.</P><H2 id="toc-hId--1415017822">How to stay tuned to recent and upcoming innovations?</H2><P>The SAP Road Map Explorer is your one-stop shop for all&nbsp;<A href="https://roadmaps.sap.com/board?PRODUCT=000D3A47875C1EDB98A8A910864AC24B&amp;range=CURRENT-LAST" target="_blank" rel="noopener noreferrer">SAP Integration Suite</A>&nbsp;innovations. You can easily check out the latest innovations and follow what is planned for the following quarters. All recent innovations also cover under the tab <EM>Features</EM> further links to blogposts or documentation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="GabrielaGahse_0-1710227126039.png" style="width: 635px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/78987i1CA65BB89053CE1B/image-dimensions/635x237?v=v2" width="635" height="237" role="button" title="GabrielaGahse_0-1710227126039.png" alt="GabrielaGahse_0-1710227126039.png" /></span></P><P>We also refer to the complete list of new releases in our documentation: <A href="https://help.sap.com/whats-new/5793247a5d5741beb0decc5b7dee1160?locale=en-US" target="_blank" rel="noopener noreferrer">What’s New in SAP Integration Suite</A>.</P><P>And if you have not heard of&nbsp;our monthly webinars, I suggest you <A href="https://www.sap.com/cmp/nl/sap-cloud-platform-integration-suite/index.html?sap-outbound-id=6287F912007644D6C49C53EAA9594EE1B4431938&amp;smc_campaign_id=0000032983&amp;source=email-smc" target="_blank" rel="noopener noreferrer">sign up</A> to get an invitation to the upcoming ones. Our team of Product Management experts host these webinars to showcase the latest and greatest updates regarding all SAP Integration Suite capabilities. The webinars are hosted on the last Tuesday of every month and the next one is already scheduled for February 27th.</P><P>In case you have missed our last monthly webinar, don’t worry. Visit <A href="https://webinars.sap.com/sap-user-groups-k4u/en/ifgintegration" target="_blank" rel="noopener noreferrer">2024 Learning Sessions for SAP User Groups on SAP Integration Suite</A> for all recordings, presentations, and Q&amp;As.</P><P>Are you aware of the <A href="https://readiness-at-scale.enable-now.cloud.sap/pub/20230621_ras/index.html?show=book!BO_EC8330B09B97CDBE#SL_120BDFE08096029D" target="_blank" rel="noopener nofollow noreferrer">Release Navigator for SAP BTP</A>? It consolidates release information across SAP BTP products and services easing you the way to find product release related notes, blogposts, and webpages. For your convenience use the direct link to the <A href="https://readiness-at-scale.enable-now.cloud.sap/pub/20230621_ras/index.html?show=book!BO_EC8330B09B97CDBE#slide!SL_83EFB74698B85387" target="_blank" rel="noopener nofollow noreferrer">SAP Integration Suite section of the Release Navigator</A>.</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2024-03-12T09:22:05.281000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651 Introducing the new pipeline concept in Cloud Integration 2024-03-19T13:17:59.760000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P>We have lately published the so-called <STRONG>Pipeline Concept</STRONG> for Cloud Integration as part of the <A title="Migration Guide for SAP Process Orchestration" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/c344b1c395144095834a961699293889.html" target="_blank" rel="noopener noreferrer">Migration Guide for SAP Process Orchestration</A>. This can be seen as another building block supporting you in your transition to the cloud. The pipeline concept has been a joint effort of development, consulting, Center of Excellence experts, product management, and selected customers with whom we have validated the concept at a very early stage.</P><P>In the <A title="Pipeline Concept" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/6e527fb074834af2be2546c6e7e2fa5f.html" target="_blank" rel="noopener noreferrer">Pipeline Concept</A>&nbsp;documentation, we describe the concept in detail. Furthermore, you find an integration package with the set of integration flows and a groovy script collection on the <A title="Process Integration Pipeline - Generic Integration Flows &amp; Templates" href="https://hub.sap.com/package/PIPipelineGenericIntegrationFlows/overview" target="_blank" rel="noopener noreferrer">SAP Business Accelerator Hub</A> to setup your pipeline on Cloud Integration.</P><P>Feel free to apply the concept to your migration projects. You can use the material that we provide as template, feel free to adapt to your needs, hence we call it a concept and not a final solution. If you are a partner supporting your customers within their migration projects or if you even have your own migration tool in your portfolio, feel free to apply the concept for your own tool.</P><H3 id="toc-hId-1118124695">What are the benefits?</H3><P>Cloud integration is very flexible in terms of modeling and running your integration scenarios allowing the design of a rich variety of integration patterns. SAP Process Orchestration in contrary has a very strict pipeline designed for reliable message processing providing decoupling, splitting and restarting capabilities out of the box guaranteeing Exactly Once processing. Those requirements are still valid for interfaces in Cloud Integration and are all addressed with the pipeline concept.</P><P>In a nutshell, key achievements of the pipeline concept are as follows:</P><UL><LI>Ensures decoupling and Exactly Once processing for asynchronous processing, also for split scenarios and in case of restart</LI><LI>Provides sophisticated restart capabilities, i.e., automatic retries as well as manual retry options</LI><LI>Simplifies operations by separating errors into different generic queues separated by routing, mapping and receiver system delivery</LI><LI>Requires lower number of JMS queues to take into account the resource limits of an SAP Integration Suite tenant which at the end also simplifies operations</LI><LI>Allows isolation and tuning of parallelization for individual receiver systems</LI><LI>Allows reusability of artifacts across multiple flows by using generic flow concept</LI><LI>Simplifies integration flow model especially for content based router and recipient list scenarios</LI><LI>Simplifies configuration on the backend sender side, e.g., just one ALE port on SAP S/4HANA system required</LI><LI>Supports packaging in IDoc and proxy, multi-message mappings, and maintain order at runtime in a generic manner</LI></UL><H3 id="toc-hId-921611190">What is it all about?</H3><P>The pipeline concept allows you to set up your <STRONG>asynchronous integration scenarios</STRONG> in Cloud Integration in a similar way how messages are processed in SAP Process Orchestration, namely in pipelines. <SPAN>Other than in Cloud Integration where you are very flexible in orchestrating the message flows, pipelines in SAP Process Orchestration</SPAN> <SPAN>are rather static, i.e., each pipeline consists of a fixed number of pipeline steps whereas the order </SPAN>is fixed<SPAN>, e.g., for a message processed within the SAP Process Orchestration runtime, first the receiver is determined, then the interface, and then the mapping is carried out.</SPAN></P><P><SPAN>The pipeline concept is mainly addressed to existing SAP Process Orchestration customers which plan to migrate their scenarios to the Cloud Integration capability of SAP Integration Suite. However, it can also be generally applied to any asynchronous integration scenario that you like to implement and run on Cloud Integration. In case of the migration use case, it can be seen as an alternative approach or in conjunction with the individual migration of single integration scenarios supported by the <A title="migration tool" href="https://help.sap.com/docs/integration-suite/sap-integration-suite/migration-tooling" target="_blank" rel="noopener noreferrer">migration tool</A> within SAP Integration Suite or migration tools provided by partners to overcome its shortcomings.</SPAN></P><P><SPAN>The pipeline concept may not apply to all customers, it depends on your individual situation, i.e., the number or the type of integration scenarios that you have. If you have a low number of integration scenarios to be migrated to Cloud Integration, then you may rather opt for creating individual integration flows for each of your source integration scenarios. If you have however a very large number of scenarios, the pipeline concept may help you to accelerate your migration project itself and to reduce effort and cost in terms of operating and monitoring your integration scenarios in the Cloud Integration.</SPAN></P><P><SPAN>One of the shortcomings that we address with the pipeline concept is the JMS queue handling in Cloud Integration for asynchronous integration scenarios. Resources on an SAP Integration Suite tenant are limited, so you need to properly model your integration flows in such a way to best suit the resource limits of your tenants, see <A title="Run an Integration Flow Under Well-Defined Boundary Conditions" href="https://help.sap.com/docs/integration-suite/sap-integration-suite/run-integration-flow-under-well-defined-boundary-conditions" target="_blank" rel="noopener noreferrer">Run an Integration Flow Under Well-Defined Boundary Conditions</A> for instance. If you migrate your asynchronous integrated configuration scenarios in SAP Process Orchestration to integration flows in Cloud Integration one-by-one and use an own JMS queue for each integration flow to ensure exactly once delivery, you end up in a very high number of JMS queues. The pipeline concept reduces the number of JMS queues required to run your integration scenarios on Cloud Integration. A proper usage of JMS queues and ProcessDirect adapters and relying on the Partner Directory to be able to dynamically configure your integration flows, help to reduce the number of required JMS queues to four. If you count in four more JMS queues for the retry and dead letter handling, you end up at eight JMS queues required.</SPAN></P><H3 id="toc-hId-725097685">What’s the approach?</H3><P><SPAN>The pipeline concept defines a <STRONG>sequence of integration flows</STRONG> each representing a pipeline step. We distinguish between a set of <STRONG>generic integration flows</STRONG> which can be commonly used across all scenarios and <STRONG>scenario-specific integration flows</STRONG>. The generic integration flows are used across all integration scenarios and hence need to be deployed only once. The scenario-specific integration flows handle the scenario-specific message conversions and mappings. They can be created </SPAN>as copy of the templates provided.</P><P><SPAN>In general, the integration flows are decoupled using <STRONG>JMS queues</STRONG>. This ensures that messages can be restarted</SPAN> which <SPAN>is a prerequisite for guaranteed delivery.</SPAN> <SPAN>To call the scenario-specific integration flows</SPAN> however<SPAN> we use the <STRONG>ProcessDirect</STRONG> adapter. Replacing the ProcessDirect connection with a JMS connection was not an option because then we would end up again in far too many JMS queues.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="01_Pipelines.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/83995iFBBB02D4E5EFF7C7/image-size/large?v=v2&amp;px=999" role="button" title="01_Pipelines.png" alt="01_Pipelines.png" /></span></P><P><SPAN>One key element of the pipeline concept is the usage of the <STRONG>Partner Directory</STRONG>. The Partner Directory on the one hand helps to define the message processing behavior, e.g., you can define scenario-specific maximum number of retries or receiver-specific outbound queues. On the other side, you use the Partner Directory to dynamically configure the generic integration flows. Latter helps to reduce the number of required JMS queues.</SPAN></P><P><SPAN>Another key element is the usage of <STRONG>XSLT mappings</STRONG> to carry out the receiver determination and interface split pipeline steps. The idea was nicked from the extended receiver determination capability in SAP Process Orchestration where you can run an operation mapping to determine your receivers in a content-based router or recipient list pattern. On the one hand, this dramatically simplifies the integration flow models of the receiver determination and interface split. Instead of a combination of multicast branches and multiple routers for all your content-based router xpath expressions which easily blows up your integration flow model, we simply run the xpath expressions within an XSLT mapping. So, the model becomes very neat and better readable. On the other side, we prefer XSLT over graphical message mapping because XSLT mappings are supported in the Partner Directory. So, the usage of XSLT in combination with the Partner Directory also contributes to the reduction of the number of required JMS queues.</SPAN></P><P>If you like to learn more about the pipeline concept, check out the <A title="Pipeline Concept" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/6e527fb074834af2be2546c6e7e2fa5f.html" target="_blank" rel="noopener noreferrer">Pipeline Concept</A> chapter as part of the migration guide for SAP Process Orchestration.</P><P>If you like to apply the pipeline concept, you find the integration package at the <A title="Process Integration Pipeline - Generic Integration Flows &amp; Templates" href="https://hub.sap.com/package/PIPipelineGenericIntegrationFlows/overview" target="_blank" rel="noopener noreferrer">SAP Business Accelerator Hub</A>.</P><P>Also check out my blog series where I describe how to apply the pipeline concept for a particular integration scenario. The&nbsp;<A title="Applying the pipeline concept for an integration scenario in general" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-integration-scenario-in-general/ba-p/13640018" target="_blank">first blog post</A> covers a general use case with multiple receivers and multiple receiver interfaces.</P><P>And here's the complete list of blogs in the blog series:</P><UL><LI><A title="Applying the pipeline concept for an integration scenario in general" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-integration-scenario-in-general/ba-p/13640018" target="_self"><SPAN>Applying the pipeline concept for an integration scenario in general</SPAN></A></LI><LI><A title="Applying the pipeline concept for a multicast integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-multicast-integration-scenario/ba-p/13641417" target="_self"><SPAN>Applying the pipeline concept for a multicast integration scenario</SPAN></A></LI><LI><A title="Applying the pipeline concept for a point-to-point integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-point-to-point-integration-scenario/ba-p/13641474" target="_self"><SPAN>Applying the pipeline concept for a point-to-point integration scenario</SPAN></A></LI><LI><A title="Applying the pipeline concept for an interface split scenario with one receiver message type" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-one/ba-p/13641560" target="_self"><SPAN>Applying the pipeline concept for an interface split scenario with one receiver message type</SPAN></A></LI><LI><A title="Applying the pipeline concept for an interface split scenario with multiple receiver message types" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-multiple/ba-p/13641662" target="_self"><SPAN>Applying the pipeline concept for an interface split scenario with multiple receiver message types</SPAN></A></LI><LI><A title="Applying the pipeline concept for an interface split scenario with order at runtime flag set" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-order-at/ba-p/13641691" target="_self"><SPAN>Applying the pipeline concept for an interface split scenario with order at runtime flag set</SPAN></A></LI></UL><P>&nbsp;</P><P>&nbsp;</P> 2024-03-19T13:17:59.760000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-integration-scenario-in-general/ba-p/13640018 Applying the pipeline concept for an integration scenario in general 2024-03-19T13:18:13.056000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P><SPAN>In this blog post, I like to describe how to apply the pipeline concept on Cloud Integration for implementing an integration scenario containing multiple receivers and multiple receiver interfaces. I will first show you how the scenario is configured in SAP Process Orchestration, and then go through the main implementation steps to get the scenario run on Cloud Integration leveraging the pipeline concept.</SPAN></P><P data-unlink="true"><SPAN>For an introduction to the pipeline concept, see this <A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">intro blog post</A>. If you haven't gone through the basics of the pipeline concept, I strongly recommend to first read the introduction blog post before proceeding.</SPAN></P><H3 id="toc-hId-1118774214"><SPAN>Source Integrated Configuration Object in SAP Process Orchestration</SPAN></H3><P><SPAN>The integrated configuration object example on SAP Process Orchestration combines both receiver determination with multiple receivers and interface determination with multiple interfaces. It defines a recipient list pattern whereas each receiver may receive multiple messages.</SPAN></P><P><SPAN>The message contains an item in JSON format like in the example message below.</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-json"><code>{ "ns0:Item":{ "@PurchaseOrderNumber":"99202", "@OrderDate":"2019-05-06", "@ItemNumber":"10", "ProductId":"HT-1000", "ProductName":"Keyboard XX", "Category":"Keyboards", "Quantity":"10", "CurrencyCode":"EUR", "Price":"799.00" } }</code></pre><P>&nbsp;</P><P><SPAN>In a REST sender adapter, the JSON format is converted into XML.</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version='1.0' encoding='UTF-8'?&gt;&lt;ns0:Item xmlns:ns0="http://demo.sap.com/eip/recipient-list" PurchaseOrderNumber="99202" OrderDate="2019-05-06" ItemNumber="10"&gt; &lt;ProductId&gt;HT-1000&lt;/ProductId&gt; &lt;ProductName&gt;Keyboard XX&lt;/ProductName&gt; &lt;Category&gt;Keyboards&lt;/Category&gt; &lt;Quantity&gt;10&lt;/Quantity&gt; &lt;CurrencyCode&gt;EUR&lt;/CurrencyCode&gt; &lt;Price&gt;799.00&lt;/Price&gt; &lt;/ns0:Item&gt;</code></pre><P>&nbsp;</P><P><SPAN>As you can see from the Integrated Configuration Object in the Integration Directory of SAP Process Orchestration, the sender communication component equals <EM>IFSplit_Sender_5</EM> with sender interface <EM>si_item_async_ob</EM>.</SPAN></P><P><SPAN>The xpath condition depends on the product category whereas a context object named <EM>category</EM> of the service interface is used. The conditions may apply to multiple receivers. If no receiver is found, the message is sent to the default receiver <EM>RL_Receiver_1</EM>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_01_ReceiverDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81528i867E2B7DAE7D7FB0/image-size/large?v=v2&amp;px=999" role="button" title="02_01_ReceiverDetermination.png" alt="02_01_ReceiverDetermination.png" /></span></P><P><SPAN>For the first receiver, three conditions are defined to determine the receiver interfaces. Depending on the message payload, the receiver may receive multiple messages.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_02_Receiver1InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81529i4B3DED4EE7CC10CB/image-size/large?v=v2&amp;px=999" role="button" title="02_02_Receiver1InterfaceDetermination.png" alt="02_02_Receiver1InterfaceDetermination.png" /></span></P><P><SPAN>For the second receiver, only one receiver interface with no condition is defined.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_03_Receiver2InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81530i4F20B449A689010A/image-size/large?v=v2&amp;px=999" role="button" title="02_03_Receiver2InterfaceDetermination.png" alt="02_03_Receiver2InterfaceDetermination.png" /></span></P><P><SPAN>For the third receiver, three conditions are defined to determine the receiver interfaces. Depending on the message payload, the receiver may receive multiple messages.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_04_Receiver3InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81534i58DD1E6891066AAF/image-size/large?v=v2&amp;px=999" role="button" title="02_04_Receiver3InterfaceDetermination.png" alt="02_04_Receiver3InterfaceDetermination.png" /></span></P><P><SPAN>For the fourth receiver, three conditions are defined to determine the receiver interfaces. Depending on the message payload, the receiver may receive multiple messages.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_05_Receiver4InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81544i128F845AD9694F12/image-size/large?v=v2&amp;px=999" role="button" title="02_05_Receiver4InterfaceDetermination.png" alt="02_05_Receiver4InterfaceDetermination.png" /></span></P><P><SPAN>For the fifth receiver, only one receiver interface with no condition is defined.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_06_Receiver5InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81558i1E3A9B0026E9C5BC/image-size/large?v=v2&amp;px=999" role="button" title="02_06_Receiver5InterfaceDetermination.png" alt="02_06_Receiver5InterfaceDetermination.png" /></span></P><H3 id="toc-hId-922260709"><SPAN>Target implementation in Cloud Integration</SPAN></H3><P><SPAN>We would like to model and run the scenario on Cloud Integration applying the pipeline concept. Prerequisite is that you have deployed all generic integration flows as well as the script collection from the integration package provided.</SPAN></P><P><SPAN>To set up the scenario using the pipeline, the Partner Directory entries need to be created as well as the scenario-specific integration flows. In our case, inbound conversion from JSON to XML is needed. So, we need to create the scenario-specific inbound processing, inbound conversion, and outbound processing integration flows as copies from the provided templates.</SPAN></P><P><SPAN>The partner ID to store the inbound conversion end point in the Partner Directory needs to be set to <EM>IFSplit_Sender_5~si_item_async_ob</EM>. During message processing, the generic integration flow&nbsp;<EM>Pipeline Generic Step02 - Inbound Processing</EM> reads the end point from the Partner Directory and dispatches the message to the very scenario-specific inbound conversion flow.</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-json"><code>{ "Pid": "IFSplit_Sender_5~si_item_async_ob", "Id": "InboundConversionEndpoint", "Value": "/pip/03/scenario1" }</code></pre><P>&nbsp;</P><P><SPAN>The partner ID to store the receiver determination XSLT mapping in the Partner Directory needs to be set to <EM>IFSplit_Sender_5~si_item_async_ob</EM> as well.&nbsp;During message processing, the generic integration flow&nbsp;<EM>Pipeline Generic Step04 - Receiver Determination</EM>&nbsp;reads the XSLT from the&nbsp;Partner Directory and then runs it to determine the number of receivers the message should be sent to.</SPAN></P><P><SPAN>The XSLT mapping to determine the list of receivers is defined as follows whereas the context object of the service interface has been resolved:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;ReceiverNotDetermined&gt; &lt;Type&gt;Default&lt;/Type&gt; &lt;DefaultReceiver&gt; &lt;Service&gt;RL_Receiver_1&lt;/Service&gt; &lt;/DefaultReceiver&gt; &lt;/ReceiverNotDetermined&gt; &lt;xsl:if test="/*:Item/Category = 'Software'"&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_1&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_2&lt;/Service&gt; &lt;/Receiver&gt; &lt;/xsl:if&gt; &lt;xsl:if test="/*:Item/Category = 'Notebooks'"&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_3&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_4&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_5&lt;/Service&gt; &lt;/Receiver&gt; &lt;/xsl:if&gt; &lt;/ns0:Receivers&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the first receiver, the partner ID to store the interface determination XSLT mapping in the Partner Directory equals <EM>IFSplit_Sender_5~si_item_async_ob~RL_Receiver_1</EM>.&nbsp;During message processing, the generic integration flow&nbsp;<EM>Pipeline Generic Step05 - Interface Determination</EM>&nbsp;reads the XSLT from the&nbsp;Partner Directory and then runs it to determine the receiver interfaces.</SPAN></P><P><SPAN>The XSLT mapping to determine the receiver interfaces for the first receiver is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;xsl:if test="/*:Item/ProductName = 'Word'"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx1/ifidx1&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;xsl:if test="/*:Item/Quantity = '10'"&gt; &lt;Interface&gt; &lt;Index&gt;2&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx1/ifidx2&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;xsl:if test="/*:Item/Quantity != '10'"&gt; &lt;Interface&gt; &lt;Index&gt;3&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx1/ifidx3&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the second receiver, the partner ID to store the interface determination XSLT mapping in the Partner Directory equals <EM>IFSplit_Sender_5~si_item_async_ob~RL_Receiver_2</EM>. The interface determination contains one receiver only with no condition, so the XSLT mapping to determine the interfaces is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx2/ifidx1&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the third receiver, the partner ID to store the interface determination XSLT mapping in the Partner Directory equals <EM>IFSplit_Sender_5~si_item_async_ob~RL_Receiver_3</EM>. The XSLT mapping to determine the interfaces is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;xsl:if test="(/*:Item/ProductName = 'Lenovo') and (/*:Item/Quantity = '1')"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx3/ifidx1&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;xsl:if test="(/*:Item/ProductName = 'Lenovo') and (/*:Item/Quantity = '2')"&gt; &lt;Interface&gt; &lt;Index&gt;2&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx3/ifidx2&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;xsl:if test="/*:Item/ProductName != 'Lenovo'"&gt; &lt;Interface&gt; &lt;Index&gt;3&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx3/ifidx3&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the fourth receiver, the partner ID to store the interface determination XSLT mapping in the Partner Directory equals <EM>IFSplit_Sender_5~si_item_async_ob~RL_Receiver_4</EM>. The XSLT mapping to determine the interfaces is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;xsl:if test="(/*:Item/ProductName = 'Lenovo') or (/*:Item/ProductId = 'HT-0001')"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx4/ifidx1&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;xsl:if test="/*:Item/Quantity = '1'"&gt; &lt;Interface&gt; &lt;Index&gt;2&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx4/ifidx2&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;xsl:if test="/*:Item/Quantity != '1'"&gt; &lt;Interface&gt; &lt;Index&gt;3&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx4/ifidx3&lt;/Service&gt; &lt;/Interface&gt; &lt;/xsl:if&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the fifth receiver, the partner ID to store the interface determination XSLT mapping in the Partner Directory equals <EM>IFSplit_Sender_5~si_item_async_ob~RL_Receiver_5</EM>. The XSLT mapping to determine the interfaces is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario1/rcvidx5/ifidx1&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>You need to create a scenario-specific integration flow for the inbound processing as copy of the templates provided. Here, <EM>SAP_Sender</EM> and <EM>SAP_SenderInterface</EM> are maintained accordingly which are then passed to the next integration flows in the sequence of integration flows to read the Partner Directory information.</SPAN></P><P><SPAN>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_07_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81559i01B9A8DA134319DE/image-size/large?v=v2&amp;px=999" role="button" title="02_07_InboundProcessing.png" alt="02_07_InboundProcessing.png" /></span></SPAN></P><P><SPAN>You need to create a scenario-specific integration flow for the inbound conversion as copy of the templates provided. In our case, we copied the template <EM>Pipeline Template Step01 - Inbound Processing At Least Once,</EM>&nbsp;see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>. Here, a JSON to XML converter is added.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_08_InboundConversion.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81560iE28FBDFF6077E186/image-size/large?v=v2&amp;px=999" role="button" title="02_08_InboundConversion.png" alt="02_08_InboundConversion.png" /></span></SPAN></P><P><SPAN>For each interface index from the interface determination XSLTs, you need to create an integration flow with ProcessDirect sender adapter and endpoint as defined in the Service node of the XSLTs. According to the integrated configuration object above, the first receiver has three interfaces. For the first and the second index, the integration flow contains a message mapping which maps the item format to another item format. For the third index, the message mapping maps from item to an order format. Below, the outbound processing integration flow for the third interface index of the first receiver is displayed.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="02_09_OutboundProcessingExample.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/81561iB742FD4D81025E95/image-size/large?v=v2&amp;px=999" role="button" title="02_09_OutboundProcessingExample.png" alt="02_09_OutboundProcessingExample.png" /></span></SPAN></P><P><SPAN>For the rest of the receivers and interfaces, similar outbound interfaces need to be created. We created all outbound integration flows as copies of the template <EM>Pipeline Template Step07 - Outbound Processing Point-to-Point</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN>That’s it. If you like to test the integration scenario, you can send the test message above to the entry point of the scenario-specific inbound processing.</SPAN></P><P><SPAN>In the&nbsp;<A title="Applying the pipeline concept for a multicast integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-multicast-integration-scenario/ba-p/13641417" target="_blank">next blog post</A>, we will cover a special use case, namely a multicast scenario.</SPAN></P> 2024-03-19T13:18:13.056000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-multicast-integration-scenario/ba-p/13641417 Applying the pipeline concept for a multicast integration scenario 2024-03-19T13:18:44.130000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P><SPAN>The current blog is part of a blog series where I describe how to implement different asynchronous integration scenarios using the&nbsp;pipeline concept on Cloud Integration. In the&nbsp;<A title="Applying the pipeline concept for an integration scenario in general" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-integration-scenario-in-general/ba-p/13640018" target="_blank">previous blog post</A>, I described a generic use case with multiple receivers and receiver interfaces.&nbsp;</SPAN><SPAN>In this blog post, I like to describe how to apply the pipeline concept on Cloud Integration for implementing a multicast integration scenario, i.e., the messages are distributed to multiple receivers, no xpath condition is defined. I will first show you how the scenario is configured in SAP Process Orchestration, and then go through the main implementation steps to get the scenario run on Cloud Integration leveraging the pipeline concept.</SPAN></P><P data-unlink="true"><SPAN>For an introduction to the pipeline concept, see this&nbsp;<A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">intro blog post</A>&nbsp;. If you haven't gone through the basics of the pipeline concept, I strongly recommend to first read the blog post before proceeding.</SPAN></P><H3 id="toc-hId-1118807848"><SPAN>Source Integrated Configuration Object in SAP Process Orchestration</SPAN></H3><P><SPAN>The integrated configuration object example on SAP Process Orchestration describes a Recipient List pattern with no xpath condition, i.e., a multicast pattern. Here,</SPAN><SPAN>&nbsp;the sender communication component equals&nbsp;<EM>RL_Sender_5</EM>&nbsp;with sender interface&nbsp;<EM>si_item_async_ob</EM>. An incoming message is delivered to three receivers whereas if no receiver is found, the message is simply ignored, so no error is raised.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="03_01_ReceiverDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82302i156BA8DBD98AD770/image-size/large?v=v2&amp;px=999" role="button" title="03_01_ReceiverDetermination.png" alt="03_01_ReceiverDetermination.png" /></span></SPAN></P><P><SPAN>For each receiver, only one interface is defined with no xpath condition. For the first receiver, the incoming message is mapped to an order format.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="03_02_Receiver1InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82311iF7BDEB83E13B35F5/image-size/large?v=v2&amp;px=999" role="button" title="03_02_Receiver1InterfaceDetermination.png" alt="03_02_Receiver1InterfaceDetermination.png" /></span></SPAN></P><P><SPAN>For the second receiver, the incoming message is mapped to an order format as well.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="03_03_Receiver2InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82312i9E7E083E1882D8D0/image-size/large?v=v2&amp;px=999" role="button" title="03_03_Receiver2InterfaceDetermination.png" alt="03_03_Receiver2InterfaceDetermination.png" /></span></SPAN></P><P><SPAN>For the third receiver, the incoming message is mapped to an item format.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="03_04_Receiver3InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82313i68555FAB7F4BA4A8/image-size/large?v=v2&amp;px=999" role="button" title="03_04_Receiver3InterfaceDetermination.png" alt="03_04_Receiver3InterfaceDetermination.png" /></span></SPAN></P><H3 id="toc-hId-922294343"><SPAN>Target implementation in Cloud Integration</SPAN></H3><P><SPAN>We would like to model and run the scenario on Cloud Integration applying the pipeline concept. Prerequisite is that you have deployed all generic integration flows as well as the script collection from the integration package provided.</SPAN></P><P><SPAN>To set up the scenario using the pipeline, the Partner Directory entries need to be created as well as the scenario-specific integration flows. In our case, we assume that no inbound conversion is needed.</SPAN></P><P><SPAN>You need to create a scenario-specific integration flow for the inbound processing as copy of the templates provided. Here, we copied the template <EM>Pipeline Template Step01 - Inbound Processing At Least Once</EM> and maintained <EM>SAP_Sender</EM> and <EM>SAP_SenderInterface</EM> accordingly which are then passed to the next integration flows in the sequence of integration flows to read the Partner Directory information.</SPAN></P><P><SPAN>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="03_05_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82314iD0A51A40F7D9F8DE/image-size/large?v=v2&amp;px=999" role="button" title="03_05_InboundProcessing.png" alt="03_05_InboundProcessing.png" /></span></SPAN></P><P><SPAN>For each receiver/receiver interface, the scenario-specific outbound integration flows need to be created as copies from the provided templates. Below, the outbound processing integration flow for the first receiver is displayed. It’s based on the template <EM>Pipeline Template Step07 - Outbound Processing Point-to-Point</EM>, see <A title="Pipeline Step" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Step</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="03_06_OutboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82316i75809460122C61AB/image-size/large?v=v2&amp;px=999" role="button" title="03_06_OutboundProcessing.png" alt="03_06_OutboundProcessing.png" /></span></SPAN></P><P><SPAN>The partner ID to store the receiver determination XSLT mapping in the Partner Directory needs to be set to <EM>RL_Sender_5~si_item_async_ob</EM>.&nbsp;</SPAN><SPAN>The XSLT mapping to determine the list of receivers is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;ReceiverNotDetermined&gt; &lt;Type&gt;Ignore&lt;/Type&gt; &lt;DefaultReceiver/&gt; &lt;/ReceiverNotDetermined&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_1&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_2&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_3&lt;/Service&gt; &lt;/Receiver&gt; &lt;/ns0:Receivers&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>During message processing, the generic integration flow&nbsp;<EM>Pipeline Generic Step04 - Receiver Determination</EM>&nbsp;reads the XSLT from the&nbsp;Partner Directory and then runs it to determine the number of receivers the message should be sent to. Since there is no xpath condition, the resulting XML is always the same containing all three receivers.</SPAN></P><P><SPAN>For the first receiver, the partner ID to store the interface determination XSLT mapping in the Partner Directory equals <EM>RL_Sender_5~si_item_async_ob~RL_Receiver_1</EM>. The XSLT mapping to determine the interfaces is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario2/rcvidx1/ifidx1&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>During message processing, the generic integration flow&nbsp;<EM>Pipeline Generic Step05 - Interface Determination</EM>&nbsp;reads the XSLT from the&nbsp;Partner Directory and then runs it to determine the receiver interface.&nbsp;Since there is no xpath condition defined to determine the receiver interface, the resulting XML is always the same containing the end point of the scenario-specific outbound processing flow for the first receiver.</SPAN></P><P><SPAN>The XSLT mappings for the other two receivers are similarly defined and hence not explicitly displayed here.</SPAN></P><P data-unlink="true"><SPAN>Next, we will cover a special use case, namely a point-to-point scenario, see this <A title="Applying the pipeline concept for a point-to-point integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-point-to-point-integration-scenario/ba-p/13641474" target="_self">blog post</A>.</SPAN></P> 2024-03-19T13:18:44.130000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-point-to-point-integration-scenario/ba-p/13641474 Applying the pipeline concept for a point-to-point integration scenario 2024-03-19T13:19:08.516000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P data-unlink="true"><SPAN>The current blog is part of a blog series where I describe how to implement different asynchronous integration scenarios using the&nbsp;pipeline concept on Cloud Integration. In the&nbsp;<A title="Applying the pipeline concept for a multicast integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-multicast-integration-scenario/ba-p/13641417" target="_blank">previous blog post</A>, I described a multicast scenario.&nbsp;</SPAN><SPAN>In this blog post, I like to describe how to apply the pipeline concept on Cloud Integration for implementing a point-to-point integration scenario, i.e., one sender and one receiver with no condition at all. I will first show you how the scenario is configured in SAP Process Orchestration, and then go through the main implementation steps to get the scenario run on Cloud Integration leveraging the pipeline concept.</SPAN></P><P data-unlink="true"><SPAN>For an introduction to the pipeline concept, see this&nbsp;<A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">intro blog post</A>&nbsp;. If you haven't gone through the basics of the pipeline concept, I strongly recommend to first read the blog post before proceeding</SPAN></P><H3 id="toc-hId-1118808031"><SPAN>Source Integrated Configuration Object in SAP Process Orchestration</SPAN></H3><P><SPAN>The integrated configuration object example on SAP Process Orchestration has one single receiver with no condition defined.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="04_01_ReceiverDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82338i7C5972D9BB83F3DC/image-size/large?v=v2&amp;px=999" role="button" title="04_01_ReceiverDetermination.png" alt="04_01_ReceiverDetermination.png" /></span></SPAN></P><P><SPAN>On the Receiver Interfaces tab, an interface with an operation mapping and no xpath condition is defined.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="04_02_InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82340i8C7CC13E8F8C6F22/image-size/large?v=v2&amp;px=999" role="button" title="04_02_InterfaceDetermination.png" alt="04_02_InterfaceDetermination.png" /></span></P><H3 id="toc-hId-922294526"><SPAN>Target implementation in Cloud Integration</SPAN></H3><P><SPAN>We would like to model and run the scenario on Cloud Integration applying the pipeline concept. Prerequisite is that you have deployed all generic integration flows as well as the script collection from the integration package provided.</SPAN></P><P><SPAN>To set up the scenario using the pipeline, the Partner Directory entries need to be created as well as the scenario-specific integration flows. In our case, we assume that no inbound conversion is needed. So, we need to create the scenario-specific inbound processing as well as outbound processing integration flows as copies from the provided templates.</SPAN></P><P><SPAN>You have two options to implement the scenario in Cloud Integration, either running through all pipeline steps or bypassing most of the pipeline steps since receiver determination and interface determination are not needed anyway.</SPAN></P><H4 id="toc-hId-854863740"><SPAN>Option 1: Complete pipeline</SPAN></H4><P><SPAN>In the first option, we run through all pipeline steps although most of the steps are not really needed. In this case, the XSLTs for the receiver determination and the interface determination always provide the same output with one and the same receiver and one and the same receiver interface, respectively, because no xpath conditions are carried out. You may opt for this option since those settings follow a common approach across all your integration scenarios</SPAN></P><P><SPAN>The partner ID to store the receiver determination XSLT mapping in the Partner Directory needs to be set to <EM>PIMAS_Sender~SI_SalesOrder_Out</EM>.</SPAN></P><P><SPAN>The XSLT mapping to determine the list of receivers is defined as follows. In this case, no xpath condition is carried out, so the resulting XML is always fixed.</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;ReceiverNotDetermined&gt; &lt;Type&gt;Ignore&lt;/Type&gt; &lt;DefaultReceiver/&gt; &lt;/ReceiverNotDetermined&gt; &lt;Receiver&gt; &lt;Service&gt;PIMAS_Receiver&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;/ns0:Receivers&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the interface determination XSLT mapping, the partner ID equals <EM>PIMAS_Sender~SI_SalesOrder_Out ~PIMAS_Receiver</EM>. Like for the XSLT mapping to determine the receiver, the XSLT mapping to determine the interfaces results into a fixed XML as well. It is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario3&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>The scenario-specific inbound integration flow looks as follows. It’s a copy of the template <EM>Pipeline Template Step01 - Inbound Processing At Least Once</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="04_03_Option1_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82344i29E4C0DFC238EE42/image-size/large?v=v2&amp;px=999" role="button" title="04_03_Option1_InboundProcessing.png" alt="04_03_Option1_InboundProcessing.png" /></span></SPAN></P><P><SPAN>The scenario-specific outbound integration flow looks as follows. It’s a copy of the template <EM>Pipeline Template Step07 - Outbound Processing Point-to-Point</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="04_06_OutboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82346i5CC356347D6B4D8E/image-size/large?v=v2&amp;px=999" role="button" title="04_06_OutboundProcessing.png" alt="04_06_OutboundProcessing.png" /></span></SPAN></P><H4 id="toc-hId-658350235"><SPAN>Option 2: Bypassing most of the pipeline steps</SPAN></H4><P><SPAN>In the second option, we can reduce the number of pipeline steps that are carried out to a minimum. We assume that no inbound conversion is needed, so we simply end up with three integration flows: the scenario-specific inbound flow, the generic outbound processing, and the scenario-specific outbound processing. In this case, the Partner Directory is not needed.</SPAN></P><P><SPAN>In the scenario-specific inbound flow, we configure the JMS receiver adapter pointing to the fourth and last queue so that most of the flows are bypassed. Since the Partner Directory is usually read in the generic flows that are bypassed, we need to ensure to maintain the headers which are needed to dispatch the message to the right outbound flow. So, in addition to the headers <EM>SAP_Sender</EM> and <EM>SAP_SenderInterface</EM>, the headers <EM>SAP_Receiver</EM>, <EM>maxJMSRetries</EM>, and <EM>SAP_OutboundProcessingEndpoint</EM> need to be maintained as well. In the header <EM>SAP_OutboundProcessingEndpoint</EM> enter the ProcessDirect end point of the scenario-specific outbound processing flow.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="04_04_Option2_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82347iFEFFCB465060DF6C/image-size/large?v=v2&amp;px=999" role="button" title="04_04_Option2_InboundProcessing.png" alt="04_04_Option2_InboundProcessing.png" /></span></SPAN></P><P><SPAN>Since we entered here the fourth queue, the message is then picked up by the generic outbound processing and dispatched to the scenario-specific outbound processing flow.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="04_05_Option2_InboundProcessingQueue.png" style="width: 523px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82348iA5172B02F5392097/image-size/large?v=v2&amp;px=999" role="button" title="04_05_Option2_InboundProcessingQueue.png" alt="04_05_Option2_InboundProcessingQueue.png" /></span></SPAN></P><P><SPAN>Next, we will cover another special use case, namely an interface split scenario with one receiver message type, see <A title="Applying the pipeline concept for an interface split scenario with one receiver message type" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-one/ba-p/13641560" target="_self">blog post</A>.</SPAN></P> 2024-03-19T13:19:08.516000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-one/ba-p/13641560 Applying the pipeline concept for an interface split scenario with one receiver message type 2024-03-19T13:19:33.687000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P data-unlink="true"><SPAN>The current blog is part of a blog series where I describe how to implement different asynchronous integration scenarios using the&nbsp;pipeline concept on Cloud Integration. In the&nbsp;<A title="Applying the pipeline concept for a point-to-point integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-point-to-point-integration-scenario/ba-p/13641474" target="_blank">previous blog post</A>, I described a point-to-point scenario.&nbsp;</SPAN><SPAN>In this blog post, I like to describe how to apply the pipeline concept on Cloud Integration for implementing an integration scenario with interface split&nbsp;whereas all split messages are of same message type.</SPAN></P><P data-unlink="true"><SPAN>The scenario is like the point-to-point scenario except that the operation mapping splits the message into multiple messages. Here, we have an incoming message with an order and multiple items whereas each item should be sent to one and the same receiver individually.</SPAN><SPAN>&nbsp;I will first show you how the scenario is configured in SAP Process Orchestration, and then go through the main implementation steps to get the scenario run on Cloud Integration leveraging the pipeline concept.</SPAN></P><P data-unlink="true"><SPAN>For an introduction to the pipeline concept, see this&nbsp;<A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">intro blog post</A>&nbsp;. If you haven't gone through the basics of the pipeline concept, I strongly recommend to first read the introduction blog post before proceeding</SPAN></P><H3 id="toc-hId-1118808957"><SPAN>Source Integrated Configuration Object in SAP Process Orchestration</SPAN></H3><P><SPAN>The integrated configuration object example on SAP Process Orchestration has one single receiver with no condition defined.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_01_ReceiverDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82371iA5A43A075C7D85BF/image-size/large?v=v2&amp;px=999" role="button" title="05_01_ReceiverDetermination.png" alt="05_01_ReceiverDetermination.png" /></span></SPAN></P><P><SPAN>On the Receiver Interfaces tab, an interface with a one-to-many operation mapping and no xpath condition is defined.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_02_InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82372i34686667A9E8A61E/image-size/large?v=v2&amp;px=999" role="button" title="05_02_InterfaceDetermination.png" alt="05_02_InterfaceDetermination.png" /></span></SPAN></P><H3 id="toc-hId-922295452"><SPAN>Target implementation in Cloud Integration</SPAN></H3><P><SPAN>We would like to model and run the scenario on Cloud Integration applying the pipeline concept. Prerequisite is that you have deployed all generic integration flows as well as the script collection from the integration package provided.</SPAN></P><P><SPAN>To set up the scenario using the pipeline, the Partner Directory entries need to be created as well as the scenario-specific integration flows. In our case, we assume that no inbound conversion is needed. So, we need to create the scenario-specific inbound processing and outbound processing integration flows as copies from the provided templates.</SPAN></P><P><SPAN>Like for the point-to-point scenario described in the <A href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-point-to-point-integration-scenario/ba-p/13641474" target="_self">previous blog post</A>, the XSLT mappings for the receiver determination as well as for the interface determination result into fixed XMLs.</SPAN></P><P><SPAN>The partner ID to store the receiver determination XSLT mapping in the Partner Directory needs to be set to <EM>IFSplit_Sender_7~si_order_async_ob</EM>.</SPAN></P><P><SPAN>The XSLT mapping to determine the list of receivers is defined as follows. In this case, no xpath condition is carried out, as said the resulting XML is then fixed.</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;ReceiverNotDetermined&gt; &lt;Type&gt;Ignore&lt;/Type&gt; &lt;DefaultReceiver/&gt; &lt;/ReceiverNotDetermined&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_1&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;/ns0:Receivers&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the interface determination XSLT mapping, the partner ID equals <EM>IFSplit_Sender_7~si_order_async_ob ~RL_Receiver_1</EM>. The XSLT mapping to determine the interfaces is fixed as well. It is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario4&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>The scenario-specific inbound integration flow looks as follows. It’s a copy of the template <EM>Pipeline Template Step01 - Inbound Processing At Least Once</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_01_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82382iAE3F7817AF1DAC2C/image-size/large?v=v2&amp;px=999" role="button" title="05_01_InboundProcessing.png" alt="05_01_InboundProcessing.png" /></span></SPAN></P><P><SPAN>The scenario-specific outbound integration flow needs to be modelled as follows. It’s a copy of the template <EM>Pipeline Template Step07 - Outbound Processing One-to-Many with One Message Type</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_02_OutboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82389iA5A2E2599C71E919/image-size/large?v=v2&amp;px=999" role="button" title="05_02_OutboundProcessing.png" alt="05_02_OutboundProcessing.png" /></span></SPAN></P><P><SPAN>In an XML Modifier step, you need to remove the XML declaration from the message body.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_03_Remove XML Declaration.png" style="width: 604px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82383i8F7428687B27D75E/image-size/large?v=v2&amp;px=999" role="button" title="05_03_Remove XML Declaration.png" alt="05_03_Remove XML Declaration.png" /></span></SPAN></P><P><SPAN>In a content modifier step, you need to wrap the body with the&nbsp;nodes required when running multi-mappings.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_04_Add Messages Nodes.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82386i0FF3BAE1F724D7D3/image-size/large?v=v2&amp;px=999" role="button" title="05_04_Add Messages Nodes.png" alt="05_04_Add Messages Nodes.png" /></span></SPAN></P><P><SPAN>In a message mapping step, you run the multi-mapping that you can reuse from the SAP Process Orchestration system.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_05_Run 1 to many Mapping.png" style="width: 813px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82387iEBADAE45A3F3169E/image-size/large?v=v2&amp;px=999" role="button" title="05_05_Run 1 to many Mapping.png" alt="05_05_Run 1 to many Mapping.png" /></span></SPAN></P><P><SPAN>The mapped message needs to be split using an iterating splitter with expression type XPath and an xpath to split the message on Item level. By intention, we unselect the Parallel Processing flag, see below.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_06_Split.png" style="width: 879px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82388i4439FFD97827DBC4/image-size/large?v=v2&amp;px=999" role="button" title="05_06_Split.png" alt="05_06_Split.png" /></span></SPAN></P><P><SPAN>To ensure Exactly Once delivery, we need to assign each split message a unique ID, hence we concatenate the unique ID that we received from the generic parent flow with the Camel split index and store the value into the exchange property <EM>SplitMessageID</EM>. Since the split was done sequentially, each item always gets its same split index assigned in case that the message is retried.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_07_UniqueID.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82391i7A28461390D5650A/image-size/large?v=v2&amp;px=999" role="button" title="05_07_UniqueID.png" alt="05_07_UniqueID.png" /></span></SPAN></P><P><SPAN>In an idempotent process call, the actual receiver is called. The beforehand created <EM>SplitMessageID</EM>&nbsp;property is used to identify duplicates. If the idempotent process was successfully carried out before, a retry with the same ID will be skipped.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_08_Idempotent Process Call.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82393i6E467912F794F6CC/image-size/large?v=v2&amp;px=999" role="button" title="05_08_Idempotent Process Call.png" alt="05_08_Idempotent Process Call.png" /></span></SPAN></P><P><SPAN>Next, we will cover another interface split scenario, this time with multiple receiver message types, see <A title="Applying the pipeline concept for an interface split scenario with multiple receiver message types" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-multiple/ba-p/13641662" target="_self">next blog post</A>.</SPAN></P> 2024-03-19T13:19:33.687000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-multiple/ba-p/13641662 Applying the pipeline concept for an interface split scenario with multiple receiver message types 2024-03-19T13:20:27.646000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P data-unlink="true"><SPAN>The current blog is part of a blog series where I describe how to implement different asynchronous integration scenarios using the&nbsp;pipeline concept on Cloud Integration.&nbsp;In this blog, I like to describe how to apply the pipeline concept for an integration scenario with interface split and multiple receiver message types. The scenario is like the <A title="Applying the pipeline concept for an interface split scenario with one receiver message type" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-one/ba-p/13641560" target="_blank">previous interface split scenario</A> except that the operation mapping not only splits the message into multiple messages but also different message types. Here, we have an incoming message with an order and multiple items whereas a header message with the order information and each item should be sent to one and the same receiver individually.</SPAN></P><P data-unlink="true"><SPAN>For an introduction to the pipeline concept, see this&nbsp;<A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">intro blog post</A>&nbsp;. If you haven't gone through the basics of the pipeline concept, I strongly recommend to first read the introduction blog post before proceeding.</SPAN></P><H3 id="toc-hId-1118809920"><SPAN>Source Integrated Configuration Object in SAP Process Orchestration</SPAN></H3><P><SPAN>The integrated configuration object example on SAP Process Orchestration has one single receiver with no condition defined.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_01_ReceiverDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82423iB789EFC6EA069843/image-size/large?v=v2&amp;px=999" role="button" title="06_01_ReceiverDetermination.png" alt="06_01_ReceiverDetermination.png" /></span></SPAN></P><P><SPAN>On the Receiver Interfaces tab, a one-to-many operation mapping and no xpath condition is defined. The one-to-many operation mapping splits the message into multiple message types.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_02_InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82424i44B828014FE9F1A8/image-size/large?v=v2&amp;px=999" role="button" title="06_02_InterfaceDetermination.png" alt="06_02_InterfaceDetermination.png" /></span></SPAN></P><H3 id="toc-hId-922296415"><SPAN>Target implementation in Cloud Integration</SPAN></H3><P><SPAN>We would like to model and run the scenario on Cloud Integration applying the pipeline concept. Prerequisite is that you have deployed all generic integration flows as well as the script collection from the integration package provided.</SPAN></P><P><SPAN>To set up the scenario using the pipeline, the Partner Directory entries need to be created as well as the scenario-specific integration flows. In our case, we assume that no inbound conversion is needed. So, we need to create the scenario-specific inbound processing and outbound processing integration flows as copies from the provided templates.</SPAN></P><P><SPAN>Like for the <A title="Applying the pipeline concept for a point-to-point integration scenario" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-a-point-to-point-integration-scenario/ba-p/13641474" target="_blank">point-to-point scenario</A> or the <A title="Applying the pipeline concept for an interface split scenario with one receiver message type" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-one/ba-p/13641560" target="_blank">split scenario</A> described in the previous examples, the XSLT mappings for the receiver determination as well as for the interface determination result into fixed XMLs.</SPAN></P><P><SPAN>In our example, the partner ID to store the receiver determination XSLT mapping in the Partner Directory needs to be set to <EM>IFSplit_Sender_8~si_order_async_ob</EM>.</SPAN></P><P><SPAN>The XSLT mapping to determine the list of receivers is defined as follows. In this case, no xpath condition is carried out, as said the resulting XML is fixed.</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;ReceiverNotDetermined&gt; &lt;Type&gt;Ignore&lt;/Type&gt; &lt;DefaultReceiver/&gt; &lt;/ReceiverNotDetermined&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_1&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;/ns0:Receivers&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>For the interface determination XSLT mapping, the partner ID equals I<EM>FSplit_Sender_8~si_order_async_ob ~RL_Receiver_1</EM>. The XSLT mapping to determine the interfaces is fixed as well. It is defined as follows:</SPAN></P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario5&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P><SPAN>The scenario-specific inbound integration flow looks as follows. It’s a copy of the template <EM>Pipeline Template Step01 - Inbound Processing At Least Once</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_02_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82427iFCC3D7C9402F08F3/image-size/large?v=v2&amp;px=999" role="button" title="06_02_InboundProcessing.png" alt="06_02_InboundProcessing.png" /></span></P><P><SPAN>The scenario-specific outbound integration flow needs to be modelled as follows. It’s a copy of the template <EM>Pipeline Template Step07 - Outbound Processing One-to-Many with Multiple Message Types</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.&nbsp;</SPAN><SPAN>You need to add as much branches as you have receiver message types, in our case two, one for the items and one for the header.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_03_OutboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82428i1289ED8493367A81/image-size/large?v=v2&amp;px=999" role="button" title="06_03_OutboundProcessing.png" alt="06_03_OutboundProcessing.png" /></span></SPAN></P><P><SPAN>In an XML Modifier step, you need to remove the XML declaration from the message body.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_03_Remove XML Declaration.png" style="width: 604px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82431iB40F1A1B37CC35A4/image-size/large?v=v2&amp;px=999" role="button" title="05_03_Remove XML Declaration.png" alt="05_03_Remove XML Declaration.png" /></span></SPAN></P><P><SPAN>In a content modifier step, you need to wrap the body with the Messages nodes required when running multi mappings.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_04_Add Messages Nodes.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82432iCE40CF183A781C82/image-size/large?v=v2&amp;px=999" role="button" title="05_04_Add Messages Nodes.png" alt="05_04_Add Messages Nodes.png" /></span></SPAN></P><P><SPAN>In a message mapping step, you run the multi mapping that you can reuse from the SAP Process Orchestration system.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_04_Mapping.png" style="width: 826px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82434iFC53DDA05BCACB55/image-size/large?v=v2&amp;px=999" role="button" title="06_04_Mapping.png" alt="06_04_Mapping.png" /></span></SPAN></P><P><SPAN>After the mapping, you add a parallel multicast.</SPAN></P><P><SPAN>In the first branch of the parallel multicast, the mapped message needs to be split using an iterating splitter with expression type <EM>XPath</EM> and an xpath to split the message on <EM>Item</EM> level.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_05_Split 1.png" style="width: 894px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82435iBEC1BDE3A98AF801/image-size/large?v=v2&amp;px=999" role="button" title="06_05_Split 1.png" alt="06_05_Split 1.png" /></span></SPAN></P><P><SPAN>To ensure Exactly Once delivery, we need to assign each split message a unique ID, hence we concatenate the unique ID that we received from the generic parent flow with the constant <EM>Branch1</EM> for the first branch and the Camel split index and store the value into the exchange property&nbsp;<EM>SplitMessageID</EM>. Since the split was done sequentially, each item always gets its same split index assigned in case that the message is retried.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_06_Unique ID 1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82437i07CB5839F446E672/image-size/large?v=v2&amp;px=999" role="button" title="06_06_Unique ID 1.png" alt="06_06_Unique ID 1.png" /></span></SPAN></P><P><SPAN>In the second branch of the parallel multicast, the mapped message needs to be split using an iterating splitter with expression type <EM>XPath</EM> and an xpath to split the message on <EM>Order</EM> level. Since we only have one single Order node, we could have used a filter instead.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_07_Split 2.png" style="width: 863px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82436iB7DFAA4F406EA6E7/image-size/large?v=v2&amp;px=999" role="button" title="06_07_Split 2.png" alt="06_07_Split 2.png" /></span></SPAN></P><P><SPAN>For the second branch, we concatenate the unique ID that we received from the generic parent flow with the constant <EM>Branch2</EM>&nbsp;and the Camel split index and store the value into the exchange property&nbsp;<EM>SplitMessageID</EM>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="06_08_Unique ID 2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82439i9ABE42EBB4C5DF05/image-size/large?v=v2&amp;px=999" role="button" title="06_08_Unique ID 2.png" alt="06_08_Unique ID 2.png" /></span></P><P><SPAN>In an idempotent process call, the actual receiver is called. The beforehand created&nbsp;<EM>SplitMessageID</EM>&nbsp;property is used to identify duplicates. If the idempotent process was successfully carried out before, a retry with the same ID will be skipped.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="05_08_Idempotent Process Call.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82442i308E45DC72241757/image-size/large?v=v2&amp;px=999" role="button" title="05_08_Idempotent Process Call.png" alt="05_08_Idempotent Process Call.png" /></span></SPAN></P><P><SPAN>Next, we will cover an interface split scenario with Maintain Order at Runtime flag set, see <A title="Applying the pipeline concept for an interface split scenario with order at runtime flag set" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-order-at/ba-p/13641691" target="_self">next blog post</A>.</SPAN></P> 2024-03-19T13:20:27.646000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-order-at/ba-p/13641691 Applying the pipeline concept for an interface split scenario with order at runtime flag set 2024-03-19T13:21:05.206000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P data-unlink="true"><SPAN>The current blog is part of a blog series where I describe how to implement different asynchronous integration scenarios using the&nbsp;pipeline concept on Cloud Integration. In the&nbsp;<A title="Applying the pipeline concept for an interface split scenario with multiple receiver message types" href="https://community.sap.com/t5/technology-blogs-by-sap/applying-the-pipeline-concept-for-an-interface-split-scenario-with-multiple/ba-p/13641662" target="_blank">previous blog post</A>, I described an interface split scenario resulting in multiple messages which may have different message types. In this blog post, I describe another interface split scenario, however here the split messages should be processed in order.&nbsp;A use case might be to store a message on a file system and only if successfully written, we like to add a trigger file which would then trigger subsequent processing steps. For this, in the interface determination, the <EM>Maintain Order at Runtime</EM> flag is set.</SPAN></P><P data-unlink="true"><SPAN>I will first show you how the scenario is configured in SAP Process Orchestration, and then go through the main implementation steps to get the scenario run on Cloud Integration leveraging the pipeline concept.</SPAN></P><P data-unlink="true"><SPAN>For an introduction to the pipeline concept, see this&nbsp;<A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_blank">intro blog post</A>&nbsp;. If you haven't gone through the basics of the pipeline concept, I strongly recommend to first read the introduction blog post before proceeding</SPAN></P><H3 id="toc-hId-1118810012"><SPAN>Source Integrated Configuration Object in SAP Process Orchestration</SPAN></H3><P><SPAN>The integrated configuration object example on SAP Process Orchestration has one single receiver with no condition defined.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="07_01_ReceiverDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82455iFE2790CB8E915EC2/image-size/large?v=v2&amp;px=999" role="button" title="07_01_ReceiverDetermination.png" alt="07_01_ReceiverDetermination.png" /></span></SPAN></P><P><SPAN>On the Receiver Interfaces tab, two interfaces with no xpath condition are defined. The <EM>Maintain Order at Runtime</EM> flag is selected ensuring that the message of the second interface is processed only if the first message has been successfully processed.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="07_02_InterfaceDetermination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82456i6E94F89087D9F2E8/image-size/large?v=v2&amp;px=999" role="button" title="07_02_InterfaceDetermination.png" alt="07_02_InterfaceDetermination.png" /></span></SPAN></P><H3 id="toc-hId-922296507"><SPAN>Target implementation in Cloud Integration</SPAN></H3><P><SPAN>We would like to model and run the scenario on Cloud Integration applying the pipeline concept. Prerequisite is that you have deployed all generic integration flows as well as the script collection from the integration package provided.</SPAN></P><P><SPAN>To set up the scenario using the pipeline, the Partner Directory entries need to be created as well as the scenario-specific integration flows. In our case, we assume that no inbound conversion is needed. So, we need to create the scenario-specific inbound processing and outbound processing integration flows as copies from the provided templates.</SPAN></P><P><SPAN>The XSLT mapping for the receiver determination results into a fixed XML with one receiver only. The partner ID to store the receiver determination XSLT mapping in the Partner Directory needs to be set to <EM>IFSplit_Sender_6~si_item_async_ob</EM>.</SPAN></P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Receivers xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;ReceiverNotDetermined&gt; &lt;Type&gt;Ignore&lt;/Type&gt; &lt;DefaultReceiver/&gt; &lt;/ReceiverNotDetermined&gt; &lt;Receiver&gt; &lt;Service&gt;RL_Receiver_1&lt;/Service&gt; &lt;/Receiver&gt; &lt;Receiver&gt; &lt;/ns0:Receivers&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P>&nbsp;</P><P><SPAN>For the interface determination XSLT mapping, the partner ID equals<EM> IFSplit_Sender_6~si_item_async_ob ~RL_Receiver_1</EM>. Although we have two interfaces, the XSLT mapping to determine the interfaces contains one interface index only. Since the messages should be processed in order, we only need to call one single outbound processing integration flow.</SPAN></P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:template match="/"&gt; &lt;ns0:Interfaces xmlns:ns0="http://sap.com/xi/XI/System"&gt; &lt;Interface&gt; &lt;Index&gt;1&lt;/Index&gt; &lt;Service&gt;/pip/07/scenario6&lt;/Service&gt; &lt;/Interface&gt; &lt;/ns0:Interfaces&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P>&nbsp;</P><P><SPAN>The scenario-specific inbound integration flow looks as follows. It’s a copy of the template&nbsp;<EM>Pipeline Template Step01 - Inbound Processing At Least Once</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="07_03_InboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82458iCF9CBD045E62EA3D/image-size/large?v=v2&amp;px=999" role="button" title="07_03_InboundProcessing.png" alt="07_03_InboundProcessing.png" /></span></SPAN></P><P><SPAN>The scenario-specific outbound integration flow needs to be modelled using a sequential multicast step. This way, you ensure that the messages are processed in sequence. It’s a copy of the template <EM>Pipeline Template Step07 - Outbound Processing Maintain Order At Runtime</EM>, see <A title="Pipeline Steps" href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f8e69f43059a44cdb891892f4ff083d8.html" target="_blank" rel="noopener noreferrer">Pipeline Steps</A>.</SPAN></P><P><SPAN>In the first branch of the sequential multicast, the message is mapped to the item format.</SPAN></P><P><SPAN>In the second branch of the sequential multicast, the message is mapped to the trigger file format.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="07_04_OutboundProcessing.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/82460iF81BF9608A6D393D/image-size/large?v=v2&amp;px=999" role="button" title="07_04_OutboundProcessing.png" alt="07_04_OutboundProcessing.png" /></span></SPAN></P><P><SPAN><STRONG>Note:</STRONG> In Order using a Sequential Multicast is only supported if the receiver adapter doesn't persist and restart on its own. As an example, when using an XI receiver adapter with At Least Once or Exactly Once message delivery, the message is first persisted and then delivered. The moment the first branch successfully persists&nbsp; the message, the second branch will be processed even if the first branch hasn't successfully delivered the message. Especially in an error situation, i.e., if the first branch fails to deliver its message and the second branch successfully delivers its message, in order will be violated. But even if both branches run successfully, the second message may still overtake the first. So, if you like to implement In Order for the XI receiver adapter following the approach above, you need to switch to Best Effort message delivery.</SPAN></P><P><SPAN>This was the last blog in the blog series about the pipeline use cases. For a complete overview of all blogs, check out the <A title="Introducing the new pipeline concept in Cloud Integration" href="https://community.sap.com/t5/technology-blogs-by-sap/introducing-the-new-pipeline-concept-in-cloud-integration/ba-p/13639651" target="_self">intro blog post</A>.</SPAN></P> 2024-03-19T13:21:05.206000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/sap-pi-po-migration-why-you-should-move-to-the-cloud-with-sap-integration/ba-p/13655584 SAP PI/PO migration? Why you should move to the Cloud with SAP Integration Suite! 2024-04-02T11:57:06.272000+02:00 thomas_volmering https://community.sap.com/t5/user/viewprofilepage/user-id/189303 <P><STRONG>Are you among the thousands SAP customers using <A href="https://www.sap.com/products/technology-platform/process-orchestration.html" target="_blank" rel="noopener noreferrer">SAP Process Integration / SAP Process Orchestration</A>?</STRONG></P><P>If yes, you’re aware that this product is impacted by SAP NetWeaver 7.5 maintenance strategy, as explained in <A href="https://community.sap.com/t5/technology-blogs-by-sap/maintenance-strategy-for-sap-netweaver-7-5-fully-aligned-with-sap-business/ba-p/13456253" target="_blank">this blog post</A>: indeed, the maintenance of SAP Process Integration and SAP Process Orchestration will be extended in accordance with SAP NetWeaver 7.5, with mainstream maintenance until end of 2027 with option of extended maintenance until end of 2030.</P><P>Let’s consider that it typically takes a year to get business case approvals and then it takes time to convince stakeholders and cooperate in development and productive cycles: you should start your move to SAP Integration Suite in 2024 to be sure to have the migration completed by 2027. That’s why I’m happy to guide you on the path that will let you adopt SAP Integration Suite, the modern way of integrating your SAP and non-SAP systems for the best business outcomes.</P><H2 id="toc-hId-990768989">What is SAP Integration Suite?</H2><P>SAP Integration Suite is an integration platform-as-a-service – iPaaS – that helps you quickly integrate on-premises and cloud-based processes, services, applications, events, and data. With SAP Integration Suite, you accelerate innovation, automate more processes, and realize a faster time to value.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="sap-integration-suite-device-intrgrflw.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/89732i56C50364B2F76BE2/image-size/large?v=v2&amp;px=999" role="button" title="sap-integration-suite-device-intrgrflw.png" alt="sap-integration-suite-device-intrgrflw.png" /></span></P><P>SAP Integration Suite helps you quickly connect systems, automate business processes, and harmonize experiences across the extended enterprise. It comes with:</P><UL><LI>Prebuilt integrations managed and updated by SAP and by our valued partners</LI><LI>Harmonized access to popular third-party cloud applications</LI><LI>Tools for designing, publishing, and managing APIs</LI><LI>AI-assisted development and integration optimization</LI><LI>Tools-based, guided approach to define, document, and govern you&gt;<A href="https://www.sap.com/services-support/integration-solution-advisory-methodology.html" target="_blank" rel="noopener noreferrer">integration strategy</A></LI></UL><P>To get an overview, watch our 4 minutes video&nbsp; <A href="https://www.sap.com/products/technology-platform/integration-suite.html?video=8e86c54f-d07d-0010-87a3-c30de2ffd8ff&amp;source=community-blog-TV%20" target="_self" rel="noopener noreferrer"><STRONG>What is SAP Integration Suite</STRONG></A></P><P>To delve deeper into SAP Integration Suite, read our <STRONG><A href="https://help.sap.com/doc/e50e61e7b66c4b60ae5e88c00c01486a/CLOUD/en-US/FSD_IntegrationSuite.pdf" target="_blank" rel="noopener noreferrer">44 pages Feature Scope Description</A></STRONG>.</P><P>With SAP Integration Suite comes <STRONG>SAP Integration Solution Advisory Methodology</STRONG>, which defines your proven path toward integration excellence to successfully move from SAP Process Integration / SAP Process Orchestration.</P><H2 id="toc-hId-794255484">What is SAP Integration Solution Advisory Methodology</H2><P><A href="https://www.sap.com/services-support/integration-solution-advisory-methodology.html" target="_blank" rel="noopener noreferrer">SAP Integration Solution Advisory Methodology</A> has been created by our experts to provide a standardized approach to integration. With SAP ISA-M, you can accelerate your digital transformation and become an integrated intelligent enterprise.</P><P>Our methodology offers <STRONG>a comprehensive framework</STRONG> that helps accelerate hybrid integration platform design, safeguard integration projects based on SAP best practices, and enable an agile integration practice across your organization. As you answer the assessment questions, you’ll learn more about the five levels of maturity and gain insight into where your business stands – and what to do next.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP ISAM 5 levels.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/89733i2DB71FF01E6A9AE9/image-size/large?v=v2&amp;px=999" role="button" title="SAP ISAM 5 levels.png" alt="SAP ISAM 5 levels.png" /></span></P><P>With SAP ISA-M you raise your organization's integration maturity level, moving from ad hoc integration to a systematic approach based on well-defined integration standards:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP Integration Solution Advisory Methodology.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/89734i8902DE6E14F96889/image-size/large?v=v2&amp;px=999" role="button" title="SAP Integration Solution Advisory Methodology.png" alt="SAP Integration Solution Advisory Methodology.png" /></span></P><P>You will find all the links to resources related to this methodology in <A href="https://community.sap.com/t5/sap-business-technology-platform-partner-knowledge/sap-integration-solution-advisory-methodology/ta-p/125013" target="_blank">Katrin von Ahsen’s blog post</A>.</P><H2 id="toc-hId-597741979">What is Event Driven Architecture?</H2><P>Event Driven Architecture is more and more popular simply because the world is more and more real-time.</P><P>Let me share just 2 business examples of this</P><UL><LI>Inventories must be updated as soon as sales happen</LI><LI>Maintenance teams need to know of breakdown as soon as possible</LI></UL><P>Let me go back to the very basics to quickly introduce Event Driven Architecture aka EDA:</P><UL><LI>An <STRONG>event </STRONG>is a significant <STRONG>change in the state of a system</STRONG>.</LI><LI><STRONG>Notification events</STRONG> or <STRONG>data events</STRONG> can be sent from the <STRONG>event source</STRONG> to inform other counterparts of the change.</LI><LI>A message holding the event description in an encoded format is sent through an <STRONG>event broker, </STRONG>in charge of properly distributing the events.</LI><LI><STRONG>Event consumers</STRONG> have registered with the event broker and are informed of the event, so they can appropriately react to it.</LI></UL><P>From a business perspective, with EDA you take advantage of</P><UL><LI>Improved reaction time and lower costs through full automation of real-time business processes</LI></UL><UL><LI>Smarter business decisions based on up-to-date information</LI><LI>Open ecosystem across vendor boundaries</LI><LI>Organizational empowerment through social-media communication style&nbsp;</LI></UL><P>From a technology perspective, you benefit of</P><UL><LI>Loose coupling for flexibility and scalability</LI><LI>Improved fault tolerance using suitable patterns</LI><LI>Incremental growth and higher-quality operations through step-by-step addition of event consumers and event sources</LI><LI>Real-time technical integrations and extensions</LI></UL><P>In SAP event-driven ecosystem as it is today, <STRONG>Event Sources</STRONG> can be</P><UL><LI>SAP S/4HANA</LI><LI>SAP S/4HANA Cloud</LI><LI>SAP ERP</LI><LI>SAP SuccessFactors solutions</LI><LI>SAP Marketing Cloud</LI><LI>SAP Data Intelligence</LI><LI>SAP CPQ</LI><LI>other SAP solutions</LI><LI>third-party solutions</LI></UL><P>and <STRONG>Event Consumers</STRONG> can be&nbsp;</P><UL><LI>SAP Integration Suite</LI><LI>SAP Build</LI><LI>SAP BTP services and apps</LI><LI>SAP S/4HANA</LI><LI>SAP S/4HANA Cloud</LI><LI>SAP ECC using add-on</LI><LI>SAP BTP, Kyma runtime</LI><LI>SAP Data Intelligence</LI><LI>other SAP solutions</LI><LI>third-party solutions</LI></UL><P>And as the most powerful and reliable event broker, we bring <STRONG>Advanced Event Mesh</STRONG>.;/p&gt;</P><H2 id="toc-hId-401228474">What is Advanced Event Mesh?</H2><P>Advanced Event Mesh for SAP Integration Suite is a complete event streaming, event management, and monitoring platform that makes software event brokers available as a service. With advanced event mesh you can create event broker services in minutes, build a model of your event mesh to design and help implement it, and monitor your services and event mesh to ensure everything runs smoothly.</P><P>Learn more on Advanced Event Mesh technical concepts in <A href="https://community.sap.com/t5/technology-blogs-by-sap/advanced-event-mesh-basic-concepts/ba-p/13572050" target="_blank">this blog post</A> from <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/157315" target="_blank">Luiz Guilherme Cerqueira Campos</A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Advanced Event Mesh architecture.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/89736i6DC1B646F5617042/image-size/large?v=v2&amp;px=999" role="button" title="Advanced Event Mesh architecture.png" alt="Advanced Event Mesh architecture.png" /></span></P><P>This cloud platform incorporates best practices, expertise, and technology for event-driven architecture (EDA) on a single platform. As a SaaS solution, it provides:</P><UL><LI>everything you need to accelerate your organization’s EDA adoption, allowing you to fulfill modern use cases that demand real-time, intelligent event streaming</LI><LI>an intuitive, unified interface to design, deploy, manage, monitor, and govern your event streaming infrastructure (including the events that flow over it) in the <A href="https://help.pubsub.em.services.cloud.sap/Cloud/Security/cloud-security-overview.htm" target="_blank" rel="noopener nofollow noreferrer">most secure manner</A>.</LI></UL><P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FbELEDGLixvM%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DbELEDGLixvM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FbELEDGLixvM%2Fhqdefault.jpg&amp;key=b0d40caa4f094c68be7c29880b16f56e&amp;type=text%2Fhtml&amp;schema=youtube" width="600" height="337" scrolling="no" title="🔴 Combine event driven programming and EDA with SAP S/4HANA and Advanced Event Mesh" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P>To delve deeper on Advanced Event Mesh, browse our Help Portal content on <A href="https://help.pubsub.em.services.cloud.sap/" target="_blank" rel="noopener nofollow noreferrer">SAP Integration Suite, Advanced Event Mesh</A> and learn with the missions available in <A href="https://discovery-center.cloud.sap/serviceCatalog/advanced-event-mesh" target="_blank" rel="noopener nofollow noreferrer">SAP Discovery Center</A>.</P><H2 id="toc-hId-204714969">What about Edge Integration Cell?</H2><P>Edge Integration Cell is an optional hybrid integration runtime offered as part of SAP Integration Suite, which enables you to manage APIs and run integration scenarios within your private landscape.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Slide1-5" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/90309i47D1C9E665D128BC/image-size/large?v=v2&amp;px=999" role="button" title="Slide1-5" alt="Slide1-5" /></span></P><P>&nbsp;The hybrid deployment model of Edge Integration Cell enables you to:</P><UL><LI>Design and monitor your integration content in the cloud.</LI><LI>Deploy and run your integration content in your private landscape.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Edge Integration Cell overview.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/89737iC9DBEA5EBAF10CD9/image-size/large?v=v2&amp;px=999" role="button" title="Edge Integration Cell overview.png" alt="Edge Integration Cell overview.png" /></span></P><P>To learn more about how hybrid deployment works using Edge Integration Cell, see <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/hybrid-deployment-using-edge-integration-cell" target="_blank" rel="noopener noreferrer">Hybrid Deployment Using Edge Integration Cell</A>.&nbsp;</P><P>To compare hybrid deployment with the standard deployment model of SAP Integration Suite, see <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/standard-deployment-in-cloud" target="_blank" rel="noopener noreferrer">Standard Deployment in the Cloud</A>.&nbsp;</P><P>Edge Integration Cell supports the following use cases:&nbsp;</P><UL><LI>Security or compliance use cases</LI></UL><P>In many enterprises, sensitive data must be managed and controlled inside the enterprise's firewall. In addition, there could be strict architectural restrictions and you want to keep your data within your private landscape.</P><UL><LI>Getting a migration path for SAP Process Integration / SAP Process Orchestration customers</LI></UL><P>SAP Process Integration / SAP Process Orchestration is used by many customers for ground-to-ground integration scenarios. Edge Integration Cell allows these customers to benefit from the newest innovations that come with SAP Integration Suite, with the option to design and monitor integration content in the cloud, and deploy and run their scenarios exclusively in their private landscapes.</P><P>In both cases, we recommend using a hybrid integration approach for enterprise-wide connectivity.</P><P>For more information about the supported features and limitations of Edge Integration Cell, see <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/supported-features-and-limitations-of-edge-integration-cell" target="_blank" rel="noopener noreferrer">Edge Integration Cell Runtime Scope</A>. Read more from <A href="https://people.sap.com/piyush.gakhar" target="_blank" rel="noopener noreferrer">Piyush Gakhar</A>, in his blog post “<A href="https://blogs.sap.com/2023/11/05/announcement-hybrid-integrations-with-integration-suite/" target="_blank" rel="noopener noreferrer">Announcement: Hybrid Integrations with Integration Suite</A>”. Read also <A href="https://people.sap.com/finny.babu" target="_blank" rel="noopener noreferrer">Finny Babu</A>’s “<A href="https://blogs.sap.com/2023/11/16/next-gen-hybrid-integration-with-sap-integration-suite-edge-integration-cell-introduction-setup/" target="_blank" rel="noopener noreferrer">Next-gen hybrid integration with SAP Integration Suite &amp; Edge Integration Cell – Introduction &amp; Setup</A>” and <A href="https://people.sap.com/ashutosh.kumar.singh02" target="_blank" rel="noopener noreferrer">Ashutosh Kumar Singh</A>’s “<A href="https://blogs.sap.com/2023/11/15/edge-integration-cell-an-introduction-to-api-artifact/" target="_blank" rel="noopener noreferrer">Edge Integration Cell: Design, deploy and manage APIs</A>”.</P><H2 id="toc-hId-8201464">How to move?</H2><P>To get the latest information on the migration from SAP Process Integration / SAP Process Orchestration to SAP Integration Suite, we prepared <A href="https://www.sap.com/products/technology-platform/integration-suite/migration.html" target="_blank" rel="noopener noreferrer">a dedicated web page</A>. You will learn about SAP Integration Suite capabilities, and evaluate <A href="https://www.sap.com/products/technology-platform/integration-suite/capabilities.html#business-challenges" target="_blank" rel="noopener noreferrer">top business challenges</A> to streamline processes, enhance productivity, and simplify the way people, data, and systems work together. You will also discover <A href="https://api.sap.com/content-type/Integration/integrations/packages" target="_blank" rel="noopener noreferrer">pre-built integrations available on SAP Business Accelerator Hub</A>: indeed, you can connect and integrate applications and business partners with thousands of pre-built integrations, connectors, APIs and more.</P><P>For more information on the new tools and the established services you can also check out this <A href="https://blogs.sap.com/2023/01/30/elevate-from-sap-process-orchestration-and-modernize-your-integration-platform-with-sap-integration-suite/" target="_blank" rel="noopener noreferrer">blog post</A> from our expert <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/46168" target="_blank">Arti Gopalan</A>.</P><P>And to facilitate this move, we bring you a comprehensive <A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/c344b1c395144095834a961699293889.html?locale=en-US" target="_blank" rel="noopener noreferrer"><STRONG>Migration Guide for SAP Process Orchestration</STRONG></A>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP PO migration guide.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/89738i42670779C6C59F9D/image-size/large?v=v2&amp;px=999" role="button" title="SAP PO migration guide.png" alt="SAP PO migration guide.png" /></span></P><P>This online document describes what you need to know when you want to migrate from SAP Process Orchestration to SAP Integration Suite. It covers a variety of topics related to the migration process:</P><UL><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/f2d8c9c558844cc884fd3f26478b9607.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Introduction to SAP Integration Suite</STRONG></A>: Before you start your migration, get to know SAP Integration Suite, learn about its advantages, and get an overview of the migration process from SAP Process Orchestration to SAP Integration Suite.</LI><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/ca24a08bfa024d11a4bb4ada4d25dd01.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Landscape</STRONG></A>: Assess your existing integration landscape and plan your target landscape.</LI><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/94ab03007f5d4b5eacec457aa129577a.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Connectivity</STRONG></A>: Learn how to move your connectivity options to the connectors and adapters of the SAP Integration Suite.</LI><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/dd0fb21d47c54fff9ccab9667f3b4de7.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Security</STRONG></A>: Get an overview of the security aspects you must consider while migrating and how to manage them in SAP Integration Suite.</LI><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/8faa23e5e04e4360ba3b74abd36f53dc.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Error Handling and Logging Strategy</STRONG></A>: Learn about cloud-based error handling and logging strategies and understand the different approaches available to you.</LI><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/e8819d7c7ccd45e98552bb7fa736728e.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Interface Governance</STRONG></A>: Understand how interfaces are governed in the cloud and how to manage them across multiple landscapes.</LI><LI><A href="https://help.sap.com/docs/help/90c8ad90cb684ee5979856093efe7462/0cab9f447d944344a400b05a95c75dfe.html?locale=en-US&amp;state=PRODUCTION&amp;version=SHIP" target="_blank" rel="noopener noreferrer"><STRONG>Interface Migration</STRONG></A>: Discover the different aspects involved in moving interfaces from SAP Process Integration and SAP Process Orchestration to SAP Integration Suite, as well as scenario and object assessment and how testing can be automated.</LI></UL><P>We also provide you with&nbsp;&nbsp;</P><UL><LI>12 months <A href="https://community.sap.com/t5/technology-blogs-by-sap/leverage-free-test-automation-tools-to-accelerate-your-migration-from-sap/ba-p/13554274" target="_blank"><STRONG>free regression test</STRONG></A> tool</LI><LI><A href="https://www.sap.com/documents/2022/04/f4e75e48-267e-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer"><STRONG>SAP Migration Factory</STRONG></A> with 2-3 weeks of free service&nbsp;</LI><LI><A href="https://www.sap.com/documents/2022/04/b23e04cf-267e-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer"><STRONG>SAP Services and Support</STRONG></A> offered in our <A href="https://www.sap.com/services-support/service-offerings/preferred-success.html" target="_blank" rel="noopener noreferrer"><STRONG>Preferred Success</STRONG></A> and <A href="https://www.sap.com/services-support/premium-support/maxattention.html" target="_blank" rel="noopener noreferrer"><STRONG>MaxAttention</STRONG></A> programs</LI></UL><P>And our valued partners are bringing powerful migration tools such as <A href="https://blogs.sap.com/2021/08/03/automating-your-sap-pi-to-cpi-migrations/" target="_blank" rel="noopener noreferrer"><STRONG>FIGAF</STRONG></A> and <A href="https://blogs.sap.com/2021/09/09/automate-your-sap-po-to-sap-is-migration-with-int4-iftt-ipaas-migration-edition/" target="_blank" rel="noopener noreferrer"><STRONG>INT4</STRONG></A>.</P><H2 id="toc-hId--188312041">Keep in touch!</H2><P>Now, you should have access to all the information you need to consider your migration from SAP Process Integration / SAP Process Orchestration toward SAP Integration Suite.</P><P>To stay updated throughout the year, regularly browse <A href="https://roadmaps.sap.com/board?range=2024Q1-2025Q1&amp;sap-outbound-id=04E3F10DABBEFCFB1B6214E98A81D79900D76B53&amp;sap-outbound-id=F84338300454061B469DD99EFA855784D1EE0293&amp;smc_campaign_id=0000038009&amp;source=email-smc&amp;PRODUCT=000D3A47875C1EDB98A8A910864AC24B&amp;PRODUCT=73554900100800003241&amp;PRODUCT=73554900100800004463#Q1%202024" target="_blank" rel="noopener noreferrer"><STRONG>our public roadmap for SAP Integration Suite</STRONG></A> and… feel free to follow me <A href="https://community.sap.com/t5/user/viewprofilepage/user-id/189303" target="_blank"><STRONG>here</STRONG></A> and/or <A href="https://www.linkedin.com/in/thomas-volmering-3538b7/" target="_blank" rel="noopener nofollow noreferrer"><STRONG>on LinkedIn</STRONG></A> to be notified of my next blog posts! <span class="lia-unicode-emoji" title=":winking_face:">😉</span>&nbsp;</P> 2024-04-02T11:57:06.272000+02:00 https://community.sap.com/t5/enterprise-resource-planning-blogs-by-members/sap-po-remove-double-quotes-from-sent-request/ba-p/13685558 SAP PO- Remove Double Quotes From Sent Request 2024-04-29T13:14:50.771000+02:00 DenizZilyas https://community.sap.com/t5/user/viewprofilepage/user-id/171723 <H5 id="toc-hId-1380787620"><STRONG>Introduction:</STRONG></H5><P>In this blog, we have a scenario where data sent from SAP to an external system is in the form of Proxy To REST. An external system provides us with a REST API. We will send a request to this API using the POST method. In the request sent according to the API of the external system, there are integer values corresponding to the IDs field. These values, after passing through the XML type at the mapping step and transitioning to the converter step in the adapter, have double quotes added to them by the adapter. Consequently, the service returns a 400 bad request response.</P><P>Typically, these fields within the array correspond to an IDs field. In other words:</P><P>[<BR />"IDs":6913,<BR />"IDs":6915<BR />]</P><P>In contrast, during triggering, they are sending all integer values within an array with commas between them, like so;</P><P>[6913,6915...]</P><P>As a result, the adapter incorrectly interprets them as separate key-value pairs with the key "IDs", leading to the addition of double quotes during JSON conversion.</P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot_3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103075i2E1511B904FB5F2E/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot_3.png" alt="Screenshot_3.png" /></span></STRONG></P><P>&nbsp;</P><P>Firstly, defining the IDs field as an integer in the adapter did not work because the PO (Process Orchestration) converts this request to a string due to the commas between the values in the sent request.</P><P>When we inspect the logs, we observe that in the step where the adapter converts to JSON, it adds double quotes as follows:</P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Receiver json.png" style="width: 727px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103189iCE8E5ED402B70849/image-dimensions/727x200?v=v2" width="727" height="200" role="button" title="Receiver json.png" alt="Receiver json.png" /></span></STRONG></P><P><STRONG>Step 1. XSLT</STRONG></P><P>I decided not to perform the conversion operation in the adapter because I believe the error stems from that conversion process. By default, the structure outputted from the mapping step is in XML format. If we convert this structure to JSON in the mapping step and specify that this structure is an array, the issue will be resolved. To achieve this, I have written an XSLT.</P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:output method="text" encoding="UTF-8"/&gt; &lt;xsl:template match="/"&gt; &lt;xsl:text&gt;[&lt;/xsl:text&gt; &lt;xsl:apply-templates/&gt; &lt;xsl:text&gt;]&lt;/xsl:text&gt; &lt;/xsl:template&gt; &lt;!-- Process the IDs element --&gt; &lt;xsl:template match="IDs"&gt; &lt;!-- Convert XML content directly to JSON --&gt; &lt;xsl:value-of select="."/&gt; &lt;/xsl:template&gt; &lt;!-- Match the delimiters to add commas --&gt; &lt;xsl:template match="IDs[position() &amp;gt; 1]"&gt; &lt;xsl:text&gt;,&lt;/xsl:text&gt; &lt;xsl:value-of select="."/&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</code></pre><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P><STRONG>Step 2. XSLT Import in PO</STRONG></P><P>Afterward, I imported this XSLT file into PO as an imported archive.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="xslt.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103206i4B32E6CFE6F32B0A/image-size/large?v=v2&amp;px=999" role="button" title="xslt.png" alt="xslt.png" /></span></P><P>&nbsp;</P><P><STRONG>Step 3. XSLT Mapping</STRONG></P><P>Then, in the operation mapping step, I provided the imported XSLT file to the request mapping.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mapp.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103208i50F8116046973364/image-size/large?v=v2&amp;px=999" role="button" title="mapp.png" alt="mapp.png" /></span></P><P>&nbsp;</P><P><STRONG>Step 4. REST Receiver Adapter</STRONG></P><P>In a default proxy to REST scenario, XML is expected to be output from the after mapping step, so we usually check the option "<STRONG>Convert XML payload to JSON</STRONG>" in the adapter. However, in our scenario, we are sending a JSON structure from the mapping step to the adapter. Therefore, we will not check this option. Instead, we will simply select JSON as the Data Format to indicate that our request is in <STRONG>JSON format</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DenizZilyas_0-1714388552783.png" style="width: 750px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103209iC5B18E409F65D9F3/image-dimensions/750x378?v=v2" width="750" height="378" role="button" title="DenizZilyas_0-1714388552783.png" alt="DenizZilyas_0-1714388552783.png" /></span></P><P>&nbsp;</P><P><STRONG>Step 5. Testing</STRONG></P><P>After completing all the PO steps, our service is now ready for testing. We can send a payload from the <STRONG>"Send Message"</STRONG> step to proceed.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="4.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103213iC11429F9B0B0AA86/image-size/large?v=v2&amp;px=999" role="button" title="4.png" alt="4.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="affmap.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/103214i380AD9BB8A8E263E/image-size/large?v=v2&amp;px=999" role="button" title="affmap.png" alt="affmap.png" /></span></P><P>&nbsp;</P> 2024-04-29T13:14:50.771000+02:00 https://community.sap.com/t5/enterprise-resource-planning-blogs-by-members/how-do-we-adapt-the-patch-method-in-sap-po/ba-p/13699267 How do we adapt the PATCH method in SAP PO 2024-05-13T12:54:11.101000+02:00 DenizZilyas https://community.sap.com/t5/user/viewprofilepage/user-id/171723 <P>Hello everyone,</P><P>I will explain how to adapt a REST service called with the PATCH method for use in SAP PO.</P><P>In an integration scenario triggered from SAP, if we have a REST link on the receiver side and this link is called with the PATCH method in Postman, we can easily adapt it in PO. This is because not all methods may be available in every PO system. If the PATCH method is not available in your PO system, you can follow the steps below.</P><P>&nbsp;</P><P><STRONG>1- When configuring, first, we create a Rest receiver adapter.</STRONG></P><P>If there is no authorization in our Rest link, we do not select Basic Authentication. However, if our service authenticates with a username and password, we must specify it in this section.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/109462iCCB93BD12DA363FE/image-size/large?v=v2&amp;px=999" role="button" title="1.png" alt="1.png" /></span></P><P>&nbsp;</P><P><STRONG>2- We use our link in the Target URL section in the REST URL tab.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DenizZilyas_0-1715597364975.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/109464i04840CE2CD74AC23/image-size/large?v=v2&amp;px=999" role="button" title="DenizZilyas_0-1715597364975.png" alt="DenizZilyas_0-1715597364975.png" /></span></P><P>&nbsp;</P><P><STRONG>3- We should select POST as the Static Value for our Rest Operation.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DenizZilyas_1-1715597403696.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/109465iFD90A8BE34C100F7/image-size/large?v=v2&amp;px=999" role="button" title="DenizZilyas_1-1715597403696.png" alt="DenizZilyas_1-1715597403696.png" /></span></P><P>To send a service from SAP using the PATCH method through the adapter, we need to add two module configurations in the Module section of the adapter.</P><P>&nbsp;</P><P><STRONG>4- Module Configuration:</STRONG></P><P><EM>overrideHttpMethod - PATCH</EM></P><P><EM>useSAPHttpLibrary - apache</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DenizZilyas_2-1715597466085.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/109469iC570D0D1BD425239/image-size/large?v=v2&amp;px=999" role="button" title="DenizZilyas_2-1715597466085.png" alt="DenizZilyas_2-1715597466085.png" /></span></P><P>After adding these modules, we can complete the Integrated Configuration steps of the service and trigger it from SAP.</P><P>We can easily adapt a REST service triggered as PATCH in Postman to be used in the adapter with the POST method in SAP PO.</P><P>&nbsp;</P> 2024-05-13T12:54:11.101000+02:00