技術日記

SAP MDG ABAP FIORI等々

Groovy Xml編集サンプル

2022-07-16 15:02:10 | 日記

Valueをもって来るだけだとXmlSlurperが便利だが、

ノート追加とか属性を追加とか構造的に編集が必要だとXmlParserでやった方かいい。

っていうかXmlSlurperでは出来ない。

例は届いたXMLメッセージからSOAP headerを一旦きれいにして、新しいヘッダーを設定。

UUIDもランダムで作って付ける。その後Identificationというノードを追加して、

下にChild Nodeで設定した値を入れる。

 

後、Groovyのテストがめっちゃ面倒くさい。。IDEサポートをなんとかして欲しい。

公式ではAPIを提供しておらず、HTTPSで内部APIファイルを取ってくることを(非公式)推薦。。。

っていうかそれじゃないと出来ない。

(import com.sap.gateway.ip.core.customdev.processor.MessageImplが効かない)

https://blogs.sap.com/2019/01/03/exploring-cpis-filesystems-content/

ネットでIDE環境があるが、これ公式ではない!

https://groovyide.com/

こういうところが抜けてるんだよな。。。

 

import com.sap.gateway.ip.core.customdev.util.Message;
import com.sap.gateway.ip.core.customdev.util.SoapHeader;
import com.sap.it.api.mapping.*;
import java.util.HashMap;
import javax.xml.namespace.QName;
import groovy.xml.StreamingMarkupBuilder;

def Message processData(Message message) {
       message.clearSoapHeaders();
       def headers = new ArrayList();
       def randomID = UUID.randomUUID().toString();
       def xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><messageId xmlns=\"http://www.sap.com/webas/640/soap/features/messageId/\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">urn:uuid:$randomID</messageId>";
       def header = new SoapHeader(new QName("http://www.sap.com/webas/640/soap/features/messageId/", "messageId"), xml, false, "");
       headers.add(header);
       message.setSoapHeaders(headers);    
       
      
      def messageLog = messageLogFactory.getMessageLog(message);
              
      def body = message.getBody(java.lang.String);
      def root = new XmlParser().parseText(body);
      
     /* root.BusinessPartnerSUITEReplicateRequestMessage.MessageHeader.SenderBusinessSystemID[0].value  = 'CPI_2';
      root.BusinessPartnerSUITEReplicateRequestMessage.MessageHeader.RecipientBusinessSystemID[0].value  = 'SD1_100';
      
      root.MessageHeader.SenderBusinessSystemID[0].value = 'CPI_2';
      root.MessageHeader.RecipientBusinessSystemID[0].value  = 'SD1_100'; */
      
      def ID = root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner[0].InternalID.text()
      root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner[0].appendNode('Identification');
      root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner.Identification[0].attributes()['actionCode']='04';
      root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner.Identification[0].appendNode('PartyIdentifierTypeCode','CRM001');
      root.BusinessPartnerSUITEReplicateRequestMessage.BusinessPartner.Identification[0].appendNode('BusinessPartnerID', ID + '号');
        
       outxml = groovy.xml.XmlUtil.serialize(root);
       message.setBody(outxml);      
       
       messageLog.addAttachmentAsString("Payload post update:", outxml, "text/xml"); 
       
       return message;


ebiteの SAP CAPで駄目だったところ

2022-07-03 21:54:15 | 日記

先ず

cf create-service hanatrial hdi-shared book-service-db-hdi-container

ここに二つダメなところがあった。

1. hanatrail 

hanatrailではなく、hanaでする

hanaですると以下のようにエラー(もちろんBTP上でHANA instanceは作ってある前提)

元々hanatrailっていう別途プランがあったと覚えているが、消えた?

 

hanatrialはないと怒られて

hanaにするとOK

 

2. create-serviceの名前

これ例ではbook-service-db-hdi-containerになっているけどそのままにすると、instanceがないとエラーになる

 

 

なので、cf create-service hanatrial hdi-shared book-service-dbでhdi containerを作る。

作った後はデプロイ成功。

 

cds buildして、hdbcdsファイルが出ると失敗。これはHANA Cloudでは使えなく、

hdbview, hdbtableが使えるらしい。( from https://cap.cloud.sap/docs/guides/databases#hana-cloud)

hdbcdsでデプロイした場合、デプロイ自体は成功するが結局コンパイルエラーでCrashする。