Wednesday, January 24, 2024

variables in xpath xslt cpi

 <?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:cpi="http://sap.com/it/" exclude-result-prefixes="cpi" version="2.0">


<!-- include exchange parameter -->

  <xsl:param name="exchange"/>

<!-- define property quantity -->

  <xsl:param name="quantity"/>

<!-- define header orderid -->

  <xsl:param name="orderid"/>

  

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:strip-space elements="*"/>


  <xsl:template match="@* | node()">

    <xsl:apply-templates select="@* | node()"/>

  </xsl:template>


  <xsl:template match="/">

<!-- set headers -->

    <xsl:value-of select="cpi:setHeader($exchange, 'context', 'ModelingBasics-HeaderPropertiesInXSLT')"/>

    <xsl:value-of select="cpi:setHeader($exchange, 'content-type', 'application/xml')"/>

    <xsl:element name="PurchaseOrder">

      <xsl:element name="PurchaseOrderNumber">

<!-- use header orderid -->

        <xsl:value-of select="$orderid"/>

      </xsl:element>

      <xsl:element name="Items">

        <xsl:for-each select="/Products/Product">

          <xsl:call-template name="Order_Items"/>

        </xsl:for-each>

      </xsl:element>

    </xsl:element>

  </xsl:template>


  <xsl:template name="Order_Items">

    <xsl:element name="Item">

      <xsl:element name="ProductId">

        <xsl:value-of select="./ProductId"/>

      </xsl:element>

      <xsl:element name="ProductName">

        <xsl:value-of select="./Name"/>

      </xsl:element>

      <xsl:element name="Category">

        <xsl:value-of select="./Category"/>

      </xsl:element>

      <xsl:element name="Quantity">

<!-- use property quantity -->

        <xsl:value-of select="$quantity"/>

      </xsl:element>

      <xsl:element name="Price">

        <xsl:value-of select="./Price * $quantity"/>

      </xsl:element>

      <xsl:element name="Currency">

        <xsl:value-of select="./CurrencyCode"/>

      </xsl:element>

    </xsl:element>

  </xsl:template>


</xsl:stylesheet>

----------------------------------

cpi basics:

 Attachment Handling - Create Attachments

Attachment Handling - Read Attachment Based On Filter Criteria

Attachment Handling - Read Multiple Attachments

Attachment Handling - Read Multiple Attachments Based On Filter Criteria

Attachment Handling - Replace Body With Attachment Content

File Transfer - Combine XML Files via Poll Enrich

File Transfer - Concatenating Files via Poll Enrich

File Transfer - Poll And Merge Folder

File Transfer - Poll File by Done File

File Transfer - Poll Folder by Fixed Done File

Modeling Basics - Access Header And Properties In Message Mapping

Modeling Basics - Access Header And Properties In XPATH And Conditions

Modeling Basics - Access Header And Properties In XSLT Mapping

Modeling Basics - Base64 Decoder

Modeling Basics - Base64 Encoder

Modeling Basics - Consume Public HTTP Service With Query Parameters

Modeling Basics - CSV To XML Converter

Modeling Basics - Decouple Flows Using JMS

Modeling Basics - Decouple Flows Using Persistence

Modeling Basics - Decouple Flows With Polling Consumer

Modeling Basics - Decouple Flows Without Persistence

Modeling Basics - Delta Sync With Timestamp Via Date Now

Modeling Basics - Delta Sync With Timestamp Via Payload

Modeling Basics - JSON to XML Converter And XML to JSON Converter

Modeling Basics - Mapping Context

Modeling Basics - MIME Multipart Encoder Decoder

Modeling Basics - Restrict Http Method

Modeling Basics - Sender-Initiated Scenario with External Data Source and Receiver

Modeling Basics - Timer-Initiated Scenario

Modeling Basics - Timer-Initiated Scenario with External Data Source and Receiver

Modeling Basics - Usage Of Data Store

Modeling Basics - Use The Persist Step

Modeling Basics - XML To CSV Converter

Modeling Basics - XML To JSON Mapping

--------------

DEPRECATED - Pattern Quality Of Service - Scenario 08

DEPRECATED - Pattern Quality Of Service - Scenario 08a

Generic Receiver

Pattern Aggregator

Pattern Composed Message Processor

Pattern Content Based Routing - Ignore If No Receiver

Pattern Content Based Routing - Raise Error

Pattern Content Based Routing - Send To Default

Pattern Content Enricher

Pattern Content Filter - Filter Step

Pattern Content Filter - Message Mapping

Pattern Message Filter

Pattern Message Splitter - General Splitter

Pattern Message Splitter - Iterating Splitter

Pattern Message Splitter - Message Mapping

Pattern Quality Of Service - Mocked Sender

Pattern Quality Of Service - Scenario 01

Pattern Quality Of Service - Scenario 01a

Pattern Quality Of Service - Scenario 01b

Pattern Quality Of Service - Scenario 02

Pattern Quality Of Service - Scenario 02a

Pattern Quality Of Service - Scenario 02b

Pattern Quality Of Service - Scenario 03

Pattern Quality Of Service - Scenario 03a

Pattern Quality Of Service - Scenario 03b

Pattern Quality Of Service - Scenario 03c

Pattern Quality Of Service - Scenario 04

Pattern Quality Of Service - Scenario 04a

Pattern Quality Of Service - Scenario 04b

Pattern Quality Of Service - Scenario 05

Pattern Quality Of Service - Scenario 05a

Pattern Quality Of Service - Scenario 06

Pattern Quality Of Service - Scenario 06a

Pattern Quality Of Service - Scenario 07

Pattern Recipient List - Dynamic Routing

Pattern Recipient List - Dynamic Routing Using JMS

Pattern Recipient List - Static Routing

Pattern Resequencer

Pattern Scatter-Gather

---------------------------------------------------

--------------------
















































standard SAP CPI Groovy scripting url,get ,set property header, security , value mapping,

 import com.sap.gateway.ip.core.customdev.util.Message

import java.nio.charset.Charset


Message extractUrlGetParameters(Message message) {

        

        String httpQuery = message.getHeader('CamelHttpQuery', String)

        

        if (httpQuery) {

            Map<String, String> queryParameters = URLDecoder.decode(httpQuery, Charset.defaultCharset().name())

                .replace("\$","")

                .tokenize('&')

                .collectEntries { it.tokenize('=') }

            

            message.setProperties(queryParameters)

        }       

    

    return message

}

----------------

import com.sap.it.api.mapping.*;

import com.sap.it.api.mapping.MappingContext;

 

/*Add MappingContext parameter to read or set headers and properties

def String customFunc1(String P1,String P2,MappingContext context) {

         String value1 = context.getHeader(P1);

         String value2 = context.getProperty(P2);

         return value1+value2;

}

 

Add Output parameter to assign the output value.

def void custFunc2(String[] is,String[] ps, Output output, MappingContext context) {

        String value1 = context.getHeader(is[0]);

        String value2 = context.getProperty(ps[0]);

        output.addValue(value1);

        output.addValue(value2);

}*/

 

def String getheader(String header_name, MappingContext context) {

 

    def headervalue= context.getHeader(header_name);

 

    return headervalue;

 

}

 

def String getProperty(String property_name, MappingContext context) {

 

    def propValue= context.getProperty(property_name);

 

    return propValue;

 

}

 

def String setHeader(String header_name, String header_value, MappingContext context) {

   

    context.setHeader(header_name, header_value);

   

   

    return header_value;

}

 

def String setProperty(String property_name, String property_value, MappingContext context) {

   

    context.setProperty(property_name, property_value);

   

   

    return header_value;

}

-----------

mpl attachment

import com.sap.gateway.ip.core.customdev.util.Message

import java.util.HashMap


def Message payloadLogger(Message message) {

    def body = message.getBody(java.lang.String)

    def messageLog = messageLogFactory.getMessageLog(message)

    if (messageLog != null) {

        messageLog.addAttachmentAsString('Payload', body, 'text/plain')

    }

    return message

}

--------------


MPLCustomHeader.groovy

import com.sap.gateway.ip.core.customdev.util.Message;


def Message setCustomHeader(Message message) {

    

def messageLog = messageLogFactory.getMessageLog(message);

if(messageLog != null){


def po_number = message.getHeaders().get("po_number");

if(po_number!=null){

messageLog.addCustomHeaderProperty("po_number", po_number);

        }

}

return message;

}

-----------

parseJsonMessage

import com.sap.gateway.ip.core.customdev.util.Message;

import java.util.HashMap;

import groovy.json.JsonSlurper;


def Message parseJsonMessage(Message message) {

    //Get message and parse to json

    def json = message.getBody(java.io.Reader);

    def data  = new JsonSlurper().parse(json);


    //get fields of the payload (service, ressource & id)

    message.setProperty("service", data.query.service);

    message.setProperty("resource", data.query.entity.name);

    message.setProperty("id", data.query.entity.id);

    //get columns to be read

    def numFields = data.query.entity.fields.size();

    def fields = "";

    for (int i=0; i<numFields; i++) {

        fields += data.query.entity.fields[i].name;

        if (i<numFields-1) fields += ",";

    }

    message.setProperty("fields", fields);


    return message;

}

---------------
read url parameters;
import com.sap.gateway.ip.core.customdev.util.Message
import java.nio.charset.Charset

Message extractUrlGetParameters(Message message) {
        
        String httpQuery = message.getHeader('CamelHttpQuery', String)
        
        if (httpQuery) {
            Map<String, String> queryParameters = URLDecoder.decode(httpQuery, Charset.defaultCharset().name())
                .replace("\$","")
                .tokenize('&')
                .collectEntries { it.tokenize('=') }
            
            message.setProperties(queryParameters)
        }       
    
    return message
}
----------
read url path
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;

def Message extractUrlPath(Message message) {

       //get url 
       def map = message.getHeaders();
       def url = map.get("CamelHttpUrl");

       //split url
       String[] vUrl;
       vUrl = url.split('/');
       int size = vUrl.length;

       message.setProperty("service", vUrl[size-3]);
       message.setProperty("resource", vUrl[size-2]);
       message.setProperty("id", vUrl[size-1]);
       return message;
}
-----------

read security material
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import com.sap.it.api.ITApiFactory;
import com.sap.it.api.mapping.ValueMappingApi
import com.sap.it.api.securestore.SecureStoreService
import com.sap.it.api.securestore.UserCredential
import com.sap.it.api.securestore.exception.SecureStoreException

def Message accessSecurityMaterial(Message message) {
    def apikey_alias = message.getProperty("ApiKeyAlias")
    def secureStorageService =  ITApiFactory.getService(SecureStoreService.class, null)
    try{
        def secureParameter = secureStorageService.getUserCredential(apikey_alias)
        def apikey = secureParameter.getPassword().toString()
        message.setHeader("api-key", apikey)
    } catch(Exception e){
        throw new SecureStoreException("Secure Parameter not available")
    }
    return message;
}


------------
read value mapping.
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import com.sap.it.api.ITApiFactory
import com.sap.it.api.mapping.ValueMappingApi

def Message readValueMapping(Message message) {

       //Properties 
       def map = message.getProperties();
       productId = map.get("id");
       
       def valueMapApi = ITApiFactory.getService(ValueMappingApi.class, null)
       def productCode = valueMapApi.getMappedValue('CompanyA', 'ID', productId, 'CompanyB', 'ProductCode')
       message.setProperty("productCode", productCode);
       
       return message;
}