機械翻訳について

拡張ルールを使用した外部情報の取得方法

外部サービスは、拡張ルール内から呼び出すことができます。

これは、モデルの適切な構成を支援するために外部ソースを参照する必要がある場合に便利です。 多くの場合、外部ソースからデータ(製品仕様や政府の規制など)を取得する方が、モデルでの保守を試みるよりも効率的です。

拡張ルールから外部サービスを呼び出すには、次のことを行う必要があります:

  • サービス・コールで使用されるwebサービス接続を登録

  • スクリプトがその接続を使用してサービスをコールする拡張ルールを定義

Webサービス接続の登録

コンフィギュレータが外部webサービスにアクセスするには、外部Webサービスへの接続を登録する必要があります。

webサービス接続を定義するには:

  1. 設定およびメンテナンス作業領域で、タスク・パネルから「検索」を選択します。 タスク「拡張の外部サービス詳細の管理」を検索して選択します。

  2. 「Webサービス詳細」表で、「処理」メニューから「行の追加」を選択します。

  3. 「ターゲット・システム」リストから、登録済の取引先コミュニティ・パートナ・アプリケーションまたはOracleアプリケーションを選択します。

  4. 「コネクタ名」フィールドに、サービスを参照するために使用する名前(AxelWSなど)を拡張ルールに入力します。

  5. 「コネクタURL」フィールドに、http://axel04.com:7011/services/AxelServicesPortなどの外部webサービスへのURLを入力します。

  6. 「起動モード」リストから、サポートされているモードである「同期サービス」を選択します。

  7. オプションで、webサービスの呼出しに必要なその他のサービス情報(ユーザー名やパスワードなど)を入力します。

  8. 「保存してクローズ」を選択します

拡張ルールの定義

コンフィギュレータが外部webサービスを呼び出すには、特定のAPIを使用してサービスをコールし、必要な操作を指定する拡張ルールを定義する必要があります。

  1. コンフィギュレータ・モデル作業領域にナビゲートします。

  2. ワークスペースで、モデルを追加し、編集のために開きます。

  3. 「コンフィギュレータ・モデルの編集」ページのルール・タブで、「処理」メニューから「拡張ルールの作成」を選択します。

  4. 構造ペインで、モデルのルート・ノードなど、ルールのベース・ノードを選択します。

  5. 「ルール・テキスト」ペインで、外部サービスを呼び出す有効なGroovyスクリプトを入力します。 このトピックでは、サンプル・スクリプトについて説明します。

  6. ルールのイベント・バインディングを定義する場合は、サービスをコールするタイミングを選択します:

    • 構成セッションの開始時にサービスを呼び出すには、postConfigInitを選択します。

    • 関連付けられたモデル・ノード値が変更された場合にサービスを呼び出すには、postValueChangeを選択します。

  7. この例のスクリプトでは、イベント・バインディングの「クラス」がScriptClassで、「メソッド」getCpuHw(String region)である必要があります。

  8. 引数regionの引数バインディングは、webサービスで解釈できる値である必要があります。

外部サービスのコール

ここに示すスクリプト例は、拡張ルール・スクリプトで外部webサービスをコールする重要なポイントを示しています。

重要な留意点:

  • SoapServiceResponseおよびSoapServiceRequestのクラスをインポートすることが重要です。 他のインポートの必要性は、スクリプトの目的の動作によって決まります。

  • ペイロード文字列を構築する場合、この例ではネームスペースhttp://services.axelとサービス・メソッドcpuHwを使用します。 これらは、登録したwebサービスで定義されているものとします。

  • サービスをコールするには、構成オブジェクトからメソッドinvokeSoapService()を使用し、登録したコネクタ名と作成したペイロード文字列を渡す必要があります。 この例では、コネクタ名はAxelWSです。

  • 一部の外部SOAPサービスは、SOAP 1.1仕様を使用してのみ起動できます。 SOAP 1.2では機能しません。WSDLはSOAP 1.1のみの互換性がある可能性があります。 この問題を回避するには、拡張ルールからそのようなサービスを呼び出すときに、次のHTTPヘッダーを追加します:

    • Content-Type: text/xml

    • SOAPAction: executeWebCX

    次に、拡張ルールでこれらのHTTPヘッダーを設定する方法の例を示します:

    SOAPMessage message  = request.getSoapMessage(); 
    message.getMimeHeaders().addHeader("Content-Type", "text/xml; charset=utf-8"); 
    message.getMimeHeaders().addHeader("SOAPAction", "executeWebCX");

    これらのHTTPヘッダーが設定されていない場合、SOAP 1.1コールは失敗します。

次のスクリプト例は、いくつかの品目を選択しようとするwebサービスのSOAPメッセージを作成します:

import oracle.apps.scm.configurator.runtime.core.IRuntimeNode; 
import oracle.apps.scm.configurator.runtime.core.ServiceException; 
import oracle.apps.scm.configurator.runtime.core.SoapServiceRequest; 
import oracle.apps.scm.configurator.runtime.core.SoapServiceRequest.SOAP_PROTOCOL_TYPE; 
import oracle.apps.scm.configurator.runtime.core.SoapServiceResponse; 
import javax.xml.soap.SOAPBody; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.soap.SOAPElement; 
import javax.xml.soap.SOAPBodyElement; 
import javax.xml.namespace.QName; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

public class WebCXmin implements Serializable { 
   public WebCXmin() { } 
   
   public String callWebService(IRuntimeNode node) { 
     SoapServiceRequest request = new SoapServiceRequest(node.getConfiguration()); 
     SOAPMessage message  = request.getSoapMessage(); 

     // create XML payload here 
     QName bodyName = new QName("ws", "executeWebCX"); 
     SOAPBodyElement bodyElement = request.getSoapBody().addBodyElement(bodyName); 
     bodyElement.addNamespaceDeclaration("ws", "http://services.axel/"); 
     bodyElement.setPrefix("ws");   
     
     QName className = new QName("className"); 
     SOAPElement classes = bodyElement.addChildElement(className);     
     classes.addTextNode("axel.ce.ws.webcx.DSPrimeTestCX"); 
     
     QName name = new QName("params"); 
     SOAPElement params = bodyElement.addChildElement(name); 
     
     QName entry = new QName("entry"); 
     SOAPElement entries = params.addChildElement(entry);     
     
     QName key = new QName("key"); 
     SOAPElement keys = entries.addChildElement(key);   
     keys.addTextNode("json"); 
     
     QName value = new QName("value"); 
     SOAPElement values = entries.addChildElement(value);   
     values.addTextNode("{\"qty\": 2, \"children\": [], \"type\": \"MI\", \"state\": [\"UTRU\", \"SELD\", \"USLD\"]}");     
     
     message.getMimeHeaders().addHeader("Content-Type", "text/xml; charset=utf-8"); 
     message.getMimeHeaders().addHeader("SOAPAction", "executeWebCX");     
     
     SoapServiceResponse response; 
     try { 
     // Invoke the external web service that was registered in the Setup and Maintenance work area 
        response = node.getConfiguration().invokeSoapService("AxelWS", request); 
     } catch (ServiceException e1) { 
        throw new Exception(" msg=" + e1.getMessage()); 
     } 

     def base = node; 
     def tf = base.getChildByName("TextFeature");         
     Document doc = response.getSoapBody().extractContentAsDocument(); 
     Element root = doc.getDocumentElement();           
     tf.textValue = "SOAP Body node: "+root.getFirstChild().getTextContent(); 


  } 
}