拡張ルールを使用した外部情報の取得方法
外部サービスは、拡張ルール内から呼び出すことができます。
これは、モデルの適切な構成を支援するために外部ソースを参照する必要がある場合に便利です。 多くの場合、外部ソースからデータ(製品仕様や政府の規制など)を取得する方が、モデルでの保守を試みるよりも効率的です。
拡張ルールから外部サービスを呼び出すには、次のことを行う必要があります:
-
サービス・コールで使用されるwebサービス接続を登録
-
スクリプトがその接続を使用してサービスをコールする拡張ルールを定義
Webサービス接続の登録
コンフィギュレータが外部webサービスにアクセスするには、外部Webサービスへの接続を登録する必要があります。
webサービス接続を定義するには:
-
設定およびメンテナンス作業領域で、タスク・パネルから「検索」を選択します。 タスク「拡張の外部サービス詳細の管理」を検索して選択します。
-
「Webサービス詳細」表で、「処理」メニューから「行の追加」を選択します。
-
「ターゲット・システム」リストから、登録済の取引先コミュニティ・パートナ・アプリケーションまたはOracleアプリケーションを選択します。
-
「コネクタ名」フィールドに、サービスを参照するために使用する名前(
AxelWS
など)を拡張ルールに入力します。 -
「コネクタURL」フィールドに、
http://axel04.com:7011/services/AxelServicesPort
などの外部webサービスへのURLを入力します。 -
「起動モード」リストから、サポートされているモードである「同期サービス」を選択します。
-
オプションで、webサービスの呼出しに必要なその他のサービス情報(ユーザー名やパスワードなど)を入力します。
-
「保存してクローズ」を選択します
拡張ルールの定義
コンフィギュレータが外部webサービスを呼び出すには、特定のAPIを使用してサービスをコールし、必要な操作を指定する拡張ルールを定義する必要があります。
-
コンフィギュレータ・モデル作業領域にナビゲートします。
-
ワークスペースで、モデルを追加し、編集のために開きます。
-
「コンフィギュレータ・モデルの編集」ページのルール・タブで、「処理」メニューから「拡張ルールの作成」を選択します。
-
構造ペインで、モデルのルート・ノードなど、ルールのベース・ノードを選択します。
-
「ルール・テキスト」ペインで、外部サービスを呼び出す有効なGroovyスクリプトを入力します。 このトピックでは、サンプル・スクリプトについて説明します。
-
ルールのイベント・バインディングを定義する場合は、サービスをコールするタイミングを選択します:
-
構成セッションの開始時にサービスを呼び出すには、
postConfigInit
を選択します。 -
関連付けられたモデル・ノード値が変更された場合にサービスを呼び出すには、
postValueChange
を選択します。
-
-
この例のスクリプトでは、イベント・バインディングの「クラス」がScriptClassで、「メソッド」が
getCpuHw(String region)
である必要があります。 -
引数
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();
}
}