Recent project required to do a REST Lookup inside Java Mapping. At ESR side, the input stream Need to be in XML format. The output stream in this example is XML format as well. At ID side, Beside creating receiver
Manually Wrap Concur REST Response XML to follow SAP PI Message XML namespace
Recent project required make call to Concur REST API using PI REST adapter, get REST XML response, then do further processing. The REST XML response do not conform with message type/external definition defined, cause problem not able to process further
JAVA Mapping Simple FirstName LastName to FullName using SAX
In this example, demonstrated Java mapping to concatenate first name and last name to full name using SAX. Source XML:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <ns0:MT_FIRSTNAME_LASTNAME xmlns:ns0="http://test.com/common"> <row> <FirstName>Yun Fat</FirstName> <LastName>Chow</LastName> </row> <row> <FirstName>Michael</FirstName> <LastName>Jackson</LastName> </row> </ns0:MT_FIRSTNAME_LASTNAME> |
Target XML:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?> <MT_FULLNAME> <row> <FullName>Yun Fat Chow</FullName> </row> <row> <FullName>Michael Jackson</FullName> </row> </MT_FULLNAME> |
Java mapping class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package com.map; import java.io.*; import javax.xml.parsers.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.sap.aii.mapping.api.*; public class Test_JavaMapping_FirstNameLastName2FullName_SAX extends AbstractTransformation { public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try { InputStream inputstream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FullNameHandler handler = new FullNameHandler(); parser.parse(inputstream, handler); String outputString = handler.getOutputString(); outputstream.write(outputString.getBytes()); } catch (Exception exception) { throw new StreamTransformationException(exception.toString()); } } } class FullNameHandler extends DefaultHandler { String sContent = ""; String sName = ""; String sTemp = ""; StringBuffer fresult = new StringBuffer(); String sFirstName = ""; String sLastName = ""; public String getOutputString(){ return fresult.toString(); } public void startDocument() throws SAXException { fresult.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); fresult.append("<MT_FULLNAME>"); } public void endDocument() throws SAXException { fresult.append("</MT_FULLNAME>"); } public void startElement(String uri, String localName, String name, Attributes attributes)throws SAXException{ sContent = ""; sName = name; if("row".equalsIgnoreCase(name)){ sFirstName = ""; sLastName = ""; } } public void endElement(String uri, String localName, String name) throws SAXException{ if("FirstName".equalsIgnoreCase(name)){ sFirstName = sContent; } if("LastName".equalsIgnoreCase(name)){ sLastName = sContent; } if("row".equalsIgnoreCase(name)){ fresult.append("<row>"); fresult.append("<FullName>"); fresult.append(sFirstName + " " + sLastName); fresult.append("</FullName>"); fresult.append("</row>"); } } public void characters(char[] ch, int start, int length)throws SAXException{ sContent = new String(ch, start, length); } } |
JAVA Mapping Simple FirstName LastName to FullName using DOM
In this example, demonstrated Java mapping to concatenate first name and last name to full name using DOM. Source XML:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <ns0:MT_FIRSTNAME_LASTNAME xmlns:ns0="http://test.com/common"> <row> <FirstName>Yun Fat</FirstName> <LastName>Chow</LastName> </row> <row> <FirstName>Michael</FirstName> <LastName>Jackson</LastName> </row> </ns0:MT_FIRSTNAME_LASTNAME> |
Target XML:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?> <MT_FULLNAME> <row> <FullName>Yun Fat Chow</FullName> </row> <row> <FullName>Michael Jackson</FullName> </row> </MT_FULLNAME> |
JAVA mapping class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com.map; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import com.sap.aii.mapping.api.*; public class Test_JavaMapping_FirstNameLastName2FullName_DOM extends AbstractTransformation { public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try { InputStream inputstream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document inDoc = docBuilder.parse(inputstream); Document outDoc = docBuilder.newDocument(); Element oMT = outDoc.createElement("MT_FULLNAME"); outDoc.appendChild(oMT); NodeList nodes = inDoc.getElementsByTagName("row"); for (int i = 0; i < nodes.getLength(); i++){ Element oRow = outDoc.createElement("row"); oMT.appendChild(oRow); Node node = nodes.item(i); if (node.getNodeType() == Node.ELEMENT_NODE){ Element element = (Element)node; String sFirstName = element.getElementsByTagName("FirstName").item(0).getTextContent(); String sLastName = element.getElementsByTagName("LastName").item(0).getTextContent(); String sFullName = sFirstName + " " + sLastName; Element oFullName = outDoc.createElement("FullName"); oFullName.appendChild(outDoc.createTextNode(sFullName)); oRow.appendChild(oFullName); } } Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(outDoc), new StreamResult(outputstream)); } catch (Exception exception) { throw new StreamTransformationException(exception.toString()); } } } |
JAVA Mapping One-to-One Source-to-Target using SAX
Similar purpose like previous post, this post is using SAX parser in stead. To understand know more about SAX parser, see this https://www.google.com/?q=sax+parser
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package com.map; import java.io.*; import javax.xml.parsers.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.sap.aii.mapping.api.*; public class Test_JavaMapping_One2One_SAX extends AbstractTransformation{ public static void main(String[] args){ try{ InputStream input = new FileInputStream(new File("C:\\TEST\\in.xml")); OutputStream outout = new FileOutputStream(new File("C:\\TEST\\out.xml")); Test_JavaMapping_One2One_SAX mapping = new Test_JavaMapping_One2One_SAX(); mapping.execute(input, output); } catch(Exception e){ e.printStackTrace(); } } public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException{ InputStream inputstream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); execute(inputstream, outputstream); } public void execute(InputStream inputstream, OutputStream outputstream) { try{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); One2OneHandler handler = new One2OneHandler(); parser.parse(inputstream, handler); String outputString = handler.getOutputString(); outputstream.write(outputString.getBytes()); } catch (Exception exception){ exception.printStackTrace(); this.getTrace().addDebugMessage(exception.toString()); } } } class One2OneHandler extends DefaultHandler{ String sContent = ""; String sTemp = ""; StringBuffer fresult = new StringBuffer(); public String getOutputString(){ return fresult.toString(); } public void startDocument() throws SAXException{ fresult.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); } public void endDocument() throws SAXException{ } public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException{ sContent = ""; sTemp = "<" + name; for(int i = 0; i < attributes.getLength(); i++){ sTemp = sTemp + " " + attributes.getLocalName(i) + "=" + "\"" + attributes.getValue(i) + "\""; } sTemp = sTemp + ">"; fresult.append(sTemp); } public void endElement(String uri, String localName, String name)throws SAXException{ sTemp = "</" + name + ">"; fresult.append(sTemp); } public void characters(char[] ch, int start, int length)throws SAXException{ sContent = new String(ch, start, length); fresult.append(sContent); } } |
JAVA Mapping One-to-One Source-to-Target using DOM
To get started to develop JAVA mapping in SAP NWDS, go to this excellent post by Raghu Below PI java mapping parse source xml file into DOM, then output the same DOM to target xml. Very basic just to show
UDF Basic Building Block
UDF can be written for many different purpose, and with many different way of coding. Still, there should be some reusable coding/statement/patterns that keep on occurs again and again. In this document, is my attempt to list down some common