BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

B2B Integration cXML の実装

 前 次 目次 索引 PDFで表示  

cXML API の使用

注意: cXML ビジネス プロトコルは、WebLogic Integration の本リリースより非推奨になりました。代替機能に関する詳細については、『WebLogic Integration リリース ノート』を参照してください。

以下の節では、cXML API の主要なプログラミング問題について説明します。

ビジネス処理のプログラミングの詳細については、『B2B Integration ワークフローの作成』を参照してください。

 


cXML メソッド

次の表に、cXML メッセージを操作するためのメソッドを示します。

表3-1 パブリック cXML メソッド

メソッド

パッケージ

説明

onMessage

com.bea.b2b.protocol.cxml.CXMLListener

送信された CXMLMessage を受信する。

deregister

com.bea.b2b.protocol.cxml.CXMLManager

この CXMLManager からアプリケーションの登録を解除する。プロパティ セットを使用して登録を選択する。

getInstance

com.bea.b2b.protocol.cxml.CXMLManager

CXMLManager のインスタンスを取得する。

getSharedSecret

com.bea.b2b.protocol.cxml.CXMLManager

このトレーディング パートナの共有秘密を取得する。トレーディング パートナ名を使用して共有秘密を検索する。

register

com.bea.b2b.protocol.cxml.CXMLManager

この CXMLManager にアプリケーションを登録する。プロパティ セットを使用して、このトレーディング パートナのコラボレーション アグリーメントを選択する。

cXML メッセージの送信に使用する。

getHttpStatusCode

com.bea.b2b.protocol.cxml.CXMLHttpStatusException

例外から HTTP ステータス コードを返す。

getAsString

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

cXML パートを文字列として取得する。

getDocument

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

関連付けられている XML ドキュメントを取得する。

getFromCredentialDomains

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから From Credential Domain を取得する。

getFromCredentialIdentities

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから From Credential Identity を取得する。

getIdentifier

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドメイン識別子またはメッセージ識別子を取得する。

getNodeValue

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

指定された XPath 式を使用してドキュメント ノードの値を取得して、ドキュメント ノードを検索する。複数のノードが XPath 式に一致した場合、最初のノードだけが使用される。

getSenderCredentialDomain

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから Sender Credential Domain を取得する。

getSenderCredentialIdentity

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから Sender Credential Identity を取得する。

getSenderSharedSecret

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから Sender Credential Shared Secret を取得する。

getSenderUserAgent

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから Sender User Agent を取得する。

getTimeStamp

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント タイムスタンプまたはメッセージ タイムスタンプのいずれかを取得する。

getToCredentialDomain

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから To Credential Domain を取得する。

getToCredentialIdentity

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント ヘッダから To Credential Identity を取得する。

getVersion

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

ドキュメント バージョンを取得する。

setDocument

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

関連付けられている XML ドキュメントを設定する。

setNodeValue

com.bea.b2b.protocol.cxml.messaging.CXMLDocument

指定された XPath 式を使用してドキュメント ノードの値を設定して、ドキュメント ノードを検索する。

reply

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

要求メッセージに応答する。このメソッドは、このオブジェクトが CXMLListener.onMessage() へのパラメータとして使用される場合にのみ有効。応答は、このメソッドの呼び出し後に非同期に送信できる。

getReplyDocument

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

応答 cXML ドキュメントを取得する。

getRequestDocument

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

要求 cXML ドキュメントを取得する。

send

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

要求メッセージを送信する。このメソッドは、応答が受信されるまでブロックされる。応答には、getReplyDocument() を介してアクセスできる。

setCollaborationAgreement

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

このメッセージが属するコラボレーション アグリーメントのコラボレーション アグリーメント ID を設定する。プロパティ セットを使用してコラボレーション アグリーメントを選択する。

setReplyDocument

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

応答 cXML ドキュメントを設定する。

setRequestDocument

com.bea.b2b.protocol.cxml.messaging.CXMLMessage

要求 cXML ドキュメントを設定する。

getHttpStatusCode

com.bea.b2b.protocol.cxml.messaging.CXMLMessageToken

HTTP ステータス コードを取得する。


 

個々のメソッドの詳細については、『BEA WebLogic Integration Javadoc』を参照してください。

コラボレーション アグリーメントを検索するためのプロパティ

cXML は、定義済みのプロパティ セットを使用して一意なコラボレーション アグリーメントを特定します。特定のコラボレーション アグリーメントを検索する場合は、以下のすべてのプロパティの値を指定する必要があります。

 


cXML メッセージの構造

cXML メッセージは、メッセージ エンベロープをベースとしています。メッセージ エンベロープには、以下のデータ構造が含まれています。

図3-1 cXML メッセージ アーキテクチャ


 

メッセージのデータ構造は次のとおりです。

アプリケーションは、ペイロードに含まれるすべてのメッセージング オブジェクトを処理する必要があります。

 


cXML DTD

必要な DTD は、以下の場所で入手できます。

cXML メッセージを送信するときには、これらの DTD を使用した検証は必須ではありません。しかし、cXML メッセージング構造の前提の 1 つは、送信するすべてのメッセージが検証済みであるということです。このため、少なくとも新しいトレーディング パートナとの相互運用性をテストするときには、メッセージを DTD と照らし合わせて検証するようにしてください。トレーディング パートナとの相互運用性に問題がなければ、オプションでメッセージ検証を解除してパフォーマンスを向上させても構いません。

 


共有秘密の処理

cXML API は、リポジトリに格納される共有秘密の値へのアクセスを提供します。GetSharedSecret メソッドを使用すると、リポジトリから共有秘密を取得して、受信ドキュメントに格納されている共有秘密と比較したり、送信 cXML ドキュメントで使用したりできます。

受信ドキュメントの場合、ビジネス処理コードは、受信メッセージの共有秘密の検証を実行する必要があります。そのためには、その共有秘密の値と、リポジトリ内のコンフィグレーションに指定されている値を比較します。

送信ドキュメントの場合、ビジネス処理コードは、各送信 cXML ドキュメントの Credential ノードに共有秘密を挿入する必要があります。

 


受信メッセージの処理

受信メッセージを処理するには、まずそのメッセージを初期化する必要があります。登録機能は、コラボレーション アグリーメントをリスナまたは送信アプリケーションに関連付けます。初期化プロセスによって返されるトークンは、メッセージの送受信時に cXML メッセージで使用されます。

初期化

受信メッセージを初期化するには、次の手順を行います。

  1. リスナ オブジェクトのコピーを取得します。

  2. リターン トークンを定義します。
    private static CXMLToken token;

  3. cXML Manager クラス com.bea.b2b.protocol.cxml.CXMLManager のインスタンスを検索します。
    private static CXMLManager cxmlm = CXMLManager.getInstance();

  4. プロパティ セットを定義して、このアプリケーションとリスナを登録します。これらのプロパティは、一意のコラボレーション アグリーメントの検索およびマップに使用されます。一意のコラボレーション アグリーメントのマップに必要なプロパティについては、コラボレーション アグリーメントを検索するためのプロパティを参照してください。
    prop.setProperty("BusinessProcess", businessProcess);
    prop.setProperty("BusinessProcessVersion", businessProcessVersion);
    prop.setProperty("DeliveryChannel", deliveryChannel);
    prop.setProperty("thisTradingPartner", myTradingPartnerName);
    prop.setProperty("otherTradingPartner", otherTradingPartnerName);
    prop.setProperty("toRole", toRole);
    prop.setProperty("Party", "duns4");

  5. CXMLManager クラスから登録メソッドを呼び出します。
    token = cxmlm.register(prop);

メッセージの処理

前節の初期化,で説明したとおり受信メッセージを初期化したら、そのメッセージを処理できます。そのためには、アプリケーションは以下のことを行う必要があります。

  1. onMessage() コールバック メソッドを使用して、受信した cXML メッセージから要求 cXML ドキュメントを取得します。このメソッドは、受信した cXML メッセージを WebLogic Integration ランタイムからアプリケーション コードに渡します。

  2. cXML ドキュメントから XML DOM ドキュメントを取得します。
    // cXML ドキュメントを取得
    CXMLDocument reqMsgDoc = cmsg.getRequestDocument();

    // XML DOM ドキュメントを取得
    Document reqXMLDoc = reqMsgDoc.getDocument();

  3. ペイロードに基づいて要求ドキュメントを処理します。

  4. 受信メッセージから共有秘密を取得します。トレーディング パートナの共有秘密は、メッセージの //cXML/Header/From/Credential に定義されています。
    String otherSharedSecret = cxmlm.getSharedSecret(otherTradingPartnerName);

  5. メッセージの共有秘密が、トレーディング パートナのコンフィグレーションに定義されている共有秘密に一致するかどうかを検証します。トランザクションがピア ツー ピアの場合、トレーディング パートナはバイヤまたはサプライヤです。トランザクションがハブを介して発生する場合、トレーディング パートナはハブです。
    debug("Stored Shared Secret for " + otherTradingPartnerName + ": " + otherSharedSecret);

    以下の比較失敗オプションが発生する場合があります。


     

  6. 応答 XML DOM 実装ドキュメントを作成します。
    DOMImplementationImpl domi = new DOMImplementationImpl(); 

    DocumentType dType =
    domi.createDocumentType("request", null, "cXML.dtd");

    org.w3c.dom.Document punchoutDoc = new DocumentImpl(dType);
    CxmlElementFactory cf = new CxmlElementFactory(punchoutDoc);

  7. 応答 cXML ドキュメントを作成します。
    Element request = punchoutDoc.createElement("Request");

  8. ドキュメントにヘッダ要素を作成します。
    // ヘッダ
    cf.createHeaderElement(
    // 送信元
    cf.createFromElement(
    cf.createCredentialElement(
    "DUNS",
    myTradingPartnerName,
    null)),
    // 送信先
    cf.createToElement(
    cf.createCredentialElement(
    "DUNS",
    otherTradingPartnerName,
    null)),
    // 送信者
    cf.createSenderElement(
    cf.createCredentialElement(
    "AribaNetworkUserId",
    "admin@acme.com",
    otherSharedSecret),
    "Ariba ORMS 5.1P4")),

  9. cXML ドキュメントに XML ドキュメントを設定します。
    CXMLDocument replyMsgDoc = new CXMLDocument();
    replyMsgDoc.setDocument(replyXMLDoc);

  10. 応答 cXML メッセージに cXML ドキュメントを設定します。
    cmsg.setReplyDocument(replyMsgDoc);

  11. cXML メッセージにコラボレーション アグリーメントを設定します。
    cmsg.setCollaborationAgreement(prop);

  12. 応答メッセージを送信し、送信 cXML メッセージをアプリケーションから WebLogic Integration ランタイムにディスパッチします。
    cmsg.reply();

 


送信メッセージの処理

送信メッセージを送信するには、そのメッセージを初期化しておく必要があります。そのための手順は次のとおりです。

  1. リターン トークンを定義します。
    private static CXMLToken token;

  2. cXML Manager クラスのインスタンスを取得します。
    com.bea.b2b.protocol.cxml.CXMLManager.
    private static CXMLManager cxmlm = CXMLManager.getInstance();

  3. プロパティ セットを定義して、このアプリケーションを登録します。これらのプロパティは、一意のコラボレーション アグリーメントの検索およびマップに使用されます。一意のコラボレーション アグリーメントのマップに必要なプロパティについては、コラボレーション アグリーメントを検索するためのプロパティを参照してください。
    prop.setProperty("BusinessProcess", businessProcess);
    prop.setProperty("BusinessProcessVersion", businessProcessVersion);
    prop.setProperty("DeliveryChannel", deliveryChannel);
    prop.setProperty("thisTradingPartner", myTradingPartnerName);
    prop.setProperty("otherTradingPartner", otherTradingPartnerName);
    prop.setProperty("toRole", toRole);
    prop.setProperty("Party", "duns4");

  4. register メソッドを呼び出します。
    token = cxmlm.register(prop);

メッセージの送信

メッセージを送信するには、アプリケーションは以下のアクションを実行する必要があります。

  1. cXML メッセージを作成します。
    DOMImplementationImpl domi = new DOMImplementationImpl(); 

    DocumentType dType =
    domi.createDocumentType("request", null, "cXML.dtd");

    org.w3c.dom.Document punchoutDoc = new DocumentImpl(dType);
    CxmlElementFactory cf = new CxmlElementFactory(punchoutDoc);

  2. XML DOM 要求ドキュメントを作成します。
    Element request = punchoutDoc.createElement("Request");
    Element trans = punchoutDoc.createElement(&dlq;PunchoutSetupRequest&drq;);
    request.appendchild(trans);

  3. 要求ドキュメントにヘッダ要素を作成します。
    punchoutDoc.appendChild(
    cf.createCxmlElement(
    // ヘッダ
    cf.createHeaderElement(
    // 送信元
    cf.createFromElement(
    cf.createCredentialElement(
    "DUNS",
    myTradingPartnerName,
    null)),
    // 送信先
    cf.createToElement(
    cf.createCredentialElement(
    "DUNS",
    otherTradingPartnerName,
    null)),
    // 送信者
    cf.createSenderElement(
    cf.createCredentialElement(
    "AribaNetworkUserId",
    "admin@acme.com",
    otherSharedSecret),
    "Ariba ORMS 5.1P4")),

  4. 該当するトレーディング パートナ プロファイルから、受信側トレーディング パートナの共有秘密を取得します。ピア ツー ピア メッセージの場合、これは実際の受信側トレーディング パートナの共有秘密です。ハブを介してルーティングされるメッセージの場合、これはハブの共有秘密です。

    受信側トレーディング パートナの共有秘密の値(//cXML/Header/To/Credential に定義される)は、送信者の共有秘密要素(//cXML/Header/Sender/Credential に定義される)に更新されます。

    String otherSharedSecret = cxmlm.getSharedSecret(otherTradingPartnerName);
    debug("Stored Shared Secret for " + otherTradingPartnerName + ": " + otherSharedSecret);

  5. cXML ドキュメントを作成します。
    CXMLDocument reqMsgDoc = new CXMLDocument();

  6. cXML メッセージに cXML ドキュメントを設定します。
    reqMsgDoc.setDocument(reqXMLDoc);
    cmsg.setRequestDocument(reqMsgDoc);

  7. cXML メッセージにコラボレーション アグリーメントを設定します。
    cmsg.setCollaborationAgreement(prop);

  8. メッセージを送信します。
    CXMLMessageToken sendToken = (CXMLMessageToken) cmsg.send();

  9. 応答ドキュメントを取得します。
    CXMLDocument replyMsgDoc = cmsg.getReplyDocument();

  10. XML ドキュメントを抽出します。
    org.w3c.dom.Document replyXMLDoc = replyMsgDoc.getDocument();

  11. 応答を検証します。

コード サンプル

この節では、バイヤとサプライヤがメッセージを処理するために使用するコードの例を示します。これらの例は cXML クラスの処理を示すためのものに過ぎず、実行を意図したものではありません。以下に示す例は、ピア ツー ピア処理用にコンフィグレーションされています。

cXML クラスの詳細については、『BEA WebLogic Integration Javadoc』を参照してください。

サンプル バイヤ

コード リスト 3-1 サンプル バイヤのコード例

/*
* Copyright (c) 2001 BEA
* All rights reserved
*/
package examples.ibcxmlverifier;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.w3c.dom.*;
import org.apache.html.dom.*;
import org.apache.xml.serialize.*;
import org.apache.xerces.dom.*;

import com.bea.b2b.protocol.cxml.messaging.*;
import com.bea.b2b.protocol.cxml.*;

import com.bea.eci.logging.*;

/**
* This example provides a simple test that will verify message flow of cXML
* peer-to-peer sending and receiving a cXML document.
* The two peers (Partner1 and Partner2) are running on a single WLS.
* Partner1 sends a PunchoutRequest to Partner2. Partner2 generates a
* PunchoutSetupResponse and returns it to Partner1. Shared Secrets are verified
* at both ends.
*/
public class Partner1Servlet extends HttpServlet
{
static final boolean DEBUG = true;

private final static String businessProcess = "PunchoutSetup";
private final static String businessProcessVersion = "1.1.009";
private final static String deliveryChannel = "CXMLPartnerVerifier1";
private final static String myTradingPartnerName = "CXMLPartnerVerifier1";
private final static String otherTradingPartnerName = "CXMLPartnerVerifier2";
private final static String toRole = "Supplier";
private final static String expectedURL = "http://xyz/abc?from=" + myTradingPartnerName;
private DocSerializer ds;

// このアプリケーションのトークンを作成
private static CXMLToken token;

// マネージャ インスタンスを取得
private static CXMLManager cxmlm = CXMLManager.getInstance();

private static Properties prop = new Properties();

public void init(ServletConfig sc) {
try {
debug("Initializing servlet for Partner1");

// コラボレーション アグリーメントを検索するためのプロパティを設定
prop.setProperty("BusinessProcess", businessProcess);
prop.setProperty("BusinessProcessVersion", businessProcessVersion);
prop.setProperty("DeliveryChannel", deliveryChannel);
prop.setProperty("thisTradingPartner", myTradingPartnerName);
prop.setProperty("otherTradingPartner", otherTradingPartnerName);
prop.setProperty("toRole", toRole);
prop.setProperty("Party", "duns4");

// プロパティを使用してバイヤをマネージャに登録
token = cxmlm.register(prop);

} catch (Exception e) {
debug("CXMLPartnerVerifier1 init exception: " + e);
e.printStackTrace();
}
}

private org.w3c.dom.Document getBusinessDocument() {
DOMImplementationImpl domi = new DOMImplementationImpl();

DocumentType dType =
domi.createDocumentType("request", null, "cXML.dtd");

org.w3c.dom.Document punchoutDoc = new DocumentImpl(dType);
CxmlElementFactory cf = new CxmlElementFactory(punchoutDoc);

try {
String otherSharedSecret = cxmlm.getSharedSecret(otherTradingPartnerName);
debug("Stored Shared Secret for " + otherTradingPartnerName + ": " + otherSharedSecret);

// ヘッダ
Element request = punchoutDoc.createElement("Request");
Element trans = punchoutDoc.createElement("PunchoutSetupRequest");
request.appendChild(trans);

punchoutDoc.appendChild(
cf.createCxmlElement(
// ペイロード
"1233444-200@ariba.acme.com",

// ヘッダ
cf.createHeaderElement(
// 送信元
cf.createFromElement(
cf.createCredentialElement(
"DUNS",
	        myTradingPartnerName,
null)),
// 送信先
cf.createToElement(
cf.createCredentialElement(
"DUNS",
otherTradingPartnerName,
null)),
// 送信者
cf.createSenderElement(
cf.createCredentialElement(
"AribaNetworkUserId",
"admin@acme.com",
otherSharedSecret),
"Ariba ORMS 5.1P4")),
// 要求
request));

}
catch( Exception e ) {
debug("MessageDeliveryException: " + e.toString());
e.printStackTrace();
}
return punchoutDoc;
}

/**
* The actual work is done in this routine. Construct a message document,
* publish the message, wait for a reply, terminate and report back.
*/
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
try {

// クライアントへの応答表示用のセットアップ
res.setContentType("text/html");
PrintWriter pw = res.getWriter();
pw.println("<HTML><BODY BGCOLOR=#ff0000>");
pw.println("<P><IMG SRC=logo.jpg WIDTH=185 HEIGHT=156"+
" ALIGN=TOP BORDER=0 NATURALSIZEFLAG=3></P>");
pw.println("<P><FONT SIZE=-1>Partner1 process flow:<BR>");
pw.println("Starting Partner1...");

debug("Starting Partner1: get Document...");

CXMLMessage cmsg = new CXMLMessage();

org.w3c.dom.Document reqXMLDoc = getBusinessDocument();

CXMLDocument reqMsgDoc = new CXMLDocument();
reqMsgDoc.setDocument(reqXMLDoc);
cmsg.setRequestDocument(reqMsgDoc);

DocSerializer ds = new DocSerializer();

debug("buyer: request document:\n" +
ds.docToString(reqXMLDoc, true) + "\n");

// プロパティで CA を設定
cmsg.setCollaborationAgreement(prop);

// メッセージを送信して応答を取得
CXMLMessageToken sendToken = (CXMLMessageToken) cmsg.send();
CXMLDocument replyMsgDoc = cmsg.getReplyDocument();

debug("Got document");
if (replyMsgDoc == null) {
debug("replyMsgDoc bad");
}
org.w3c.dom.Document replyXMLDoc = replyMsgDoc.getDocument();

debug("buyer: reply document:\n" +
ds.docToString(replyXMLDoc, true) + "\n");

// 適切な応答の取得を検証
String punchoutURL = replyMsgDoc.getNodeValue(
"//cXML/Response/PunchoutSetupResponse/StartPage/URL");
if (punchoutURL.equals(expectedURL)) {
debug("Correct response received");
pw.println("<P>Correct response received");
}
else {
debug("Unexpected response received");
pw.println("<P>Unexpected response received");
}

// 共有秘密が自分のものであることを検証
String dss = replyMsgDoc.getSenderSharedSecret();
debug("Document Shared Secret for " + myTradingPartnerName + ": " + dss);

String sss = cxmlm.getSharedSecret(myTradingPartnerName);
debug("Stored Shared Secret for " + myTradingPartnerName + ": " + sss);

if (dss.equals(sss)) {
debug("Shared Secret match");
pw.println("<P>Shared Secret match");
} else {
        debug("Shared Secret mismatch");
pw.println("<P>Shared Secret mismatch");
}
}
catch( Exception e ) {
debug("MessageDeliveryException: " + e.toString());
e.printStackTrace();
}
}

/**
* A simple routine that writes to the wlc log
*/
private static void debug(String msg){
if (DEBUG)
UserLog.log("***Partner1Servlet: " + msg);
}
}

サンプル サプライヤ

コード リスト 3-2 サンプル サプライヤのコード例

/*
* Copyright (c) 20001 BEA
* All rights reserved
*/
package examples.ibcxmlverifier;

import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.w3c.dom.*;
import org.apache.html.dom.*;
import org.apache.xml.serialize.*;
import org.apache.xerces.dom.*;

import com.bea.b2b.protocol.messaging.*;
import com.bea.b2b.protocol.cxml.messaging.*;
import com.bea.b2b.protocol.cxml.CXMLListener;
import com.bea.b2b.protocol.cxml.*;

import com.bea.eci.logging.*;

/**
* This example provides a simple test that will verify message flow of cXML
* peer-to-peer sending and receiving a cXML document.
* The two peers (Partner1 and Partner2) are running on a single WLS.
* Partner1 sends a PunchoutRequest to Partner2. Partner2 generates a
* PunchoutSetupResponse and returns it to Partner1. Shared Secrets are verified
* at both ends.
*/
public class Partner2Servlet extends HttpServlet {

static final boolean DEBUG = true;

private final static String businessProcess = "PunchoutSetup";
private final static String businessProcessVersion = "1.1.009";
private final static String deliveryChannel = "CXMLPartnerVerifier2";
private final static String myTradingPartnerName = "CXMLPartnerVerifier2";
private final static String otherTradingPartnerName = "CXMLPartnerVerifier1";
private final static String toRole = "Buyer";

// このアプリケーションのトークンを作成
private static CXMLToken token;

// マネージャ インスタンスを取得
private static CXMLManager cxmlm = CXMLManager.getInstance();

private static Properties prop = new Properties();

public void init(ServletConfig sc) {
try {
debug("Initializing servlet for Partner2");

// コラボレーション アグリーメントを検索するためのプロパティを設定
prop.setProperty("BusinessProcess", businessProcess);
prop.setProperty("BusinessProcessVersion", businessProcessVersion);
prop.setProperty("DeliveryChannel", deliveryChannel);
prop.setProperty("thisTradingPartner", myTradingPartnerName);
prop.setProperty("otherTradingPartner", otherTradingPartnerName);
prop.setProperty("toRole", toRole);
prop.setProperty("Party", "duns5");

// プロパティを使用してサプライヤ リスナをマネージャに登録
token = cxmlm.register(new Partner2MessageListener(), prop);

debug("Partner2 waiting for message...");
} catch (Exception e) {
debug("CXMLPartnerVerifier2 init exception: " + e);
e.printStackTrace();
}
}

/**
* This routine starts the peer
*/
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
debug("Starting Partner2");
}

/**
* A simple routine that writes to the wls log
*/
private static void debug(String msg){
if (DEBUG)
UserLog.log("***Partner2Servlet: " + msg);
}

public class Partner2MessageListener
implements CXMLListener
  {
public void onMessage(CXMLMessage cmsg) {
XPathHelper xp = new XPathHelper();

try {
debug("Partner2 received message");
// QualityOfService qos = cmsg.getQoS();

CXMLDocument reqMsgDoc = cmsg.getRequestDocument();
if (reqMsgDoc == null){
throw new Exception("Did not get a request payload");
}
Document reqXMLDoc = reqMsgDoc.getDocument();
if (reqXMLDoc == null){
throw new Exception("Did not get a request document");
}
String from = reqMsgDoc.getNodeValue(
"//cXML/Header/From/Credential/Identity" );
if (from == null) {
from = "nobody";
}
debug("Received request from " + from );

DocSerializer ds = new DocSerializer();

debug("supplier: request document:\n" +
ds.docToString(reqXMLDoc, true) + "\n");

debug("Building reply document");

DOMImplementationImpl domi = new DOMImplementationImpl();
DocumentType dType =
domi.createDocumentType("response", null, "cXML.dtd");

org.w3c.dom.Document replyXMLDoc = new DocumentImpl(dType);
CxmlElementFactory cf = new CxmlElementFactory( replyXMLDoc );

String otherSharedSecret = cxmlm.getSharedSecret(otherTradingPartnerName);
debug("Stored Shared Secret for " + otherTradingPartnerName + ": " + otherSharedSecret);

replyXMLDoc.appendChild(
cf.createCxmlElement(
// ペイロード
"1233444-200@ariba.acme.com",

// ヘッダ
cf.createHeaderElement(
// 送信元
	      cf.createFromElement(
cf.createCredentialElement(
"DUNS",
myTradingPartnerName,
null)),
// 送信先
cf.createToElement(
cf.createCredentialElement(
"DUNS",
otherTradingPartnerName,
null)),
// 送信者
cf.createSenderElement(
cf.createCredentialElement(
"AribaNetworkUserId",
"admin@acme.com",
otherSharedSecret),
"Ariba ORMS 5.1P4")),
// 本文
cf.createResponseElement(
"200",
"ok",
cf.createPunchoutSetupResponseElement(
"http://xyz/abc?from=" + from ))));

CXMLDocument replyMsgDoc = new CXMLDocument();
replyMsgDoc.setDocument(replyXMLDoc);

cmsg.setReplyDocument(replyMsgDoc);

debug("supplier: reply document:\n" +
ds.docToString(replyXMLDoc, true) + "\n");

// 共有秘密が自分のものであることを検証
String dss = reqMsgDoc.getSenderSharedSecret();
debug("Document Shared Secret for " + myTradingPartnerName + ": " + dss);

String sss = cxmlm.getSharedSecret(myTradingPartnerName);
debug("Stored Shared Secret for " + myTradingPartnerName + ": " + sss);

if (dss.equals(sss)) {
debug("Shared Secret match");
} else {
debug("Shared Secret mismatch");
}

// プロパティで CA を設定
cmsg.setCollaborationAgreement(prop);
cmsg.reply();

debug("Partner2 sent reply");
} catch(Exception e) {
debug("Exception errors" + e);
e.printStackTrace();
}
}

public void onTerminate(Message msg) throws Exception {
debug(" received terminate notification for " + msg.getConversationId());

// マネージャから登録を解除
cxmlm.deregister(prop);
}
}
}

 

ページの先頭 前 次