BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > B2B トピック > B2B Integration cXML の実装 > cXML API の使用 |
B2B Integration cXML の実装
|
cXML API の使用
注意: cXML ビジネス プロトコルは、WebLogic Integration の本リリースより非推奨になりました。代替機能に関する詳細については、『WebLogic Integration リリース ノート』を参照してください。
以下の節では、cXML API の主要なプログラミング問題について説明します。
ビジネス処理のプログラミングの詳細については、『B2B Integration ワークフローの作成』を参照してください。
cXML メソッド
次の表に、cXML メッセージを操作するためのメソッドを示します。
個々のメソッドの詳細については、『BEA WebLogic Integration Javadoc』を参照してください。 コラボレーション アグリーメントを検索するためのプロパティ cXML は、定義済みのプロパティ セットを使用して一意なコラボレーション アグリーメントを特定します。特定のコラボレーション アグリーメントを検索する場合は、以下のすべてのプロパティの値を指定する必要があります。
cXML メッセージの構造
cXML メッセージは、メッセージ エンベロープをベースとしています。メッセージ エンベロープには、以下のデータ構造が含まれています。
図3-1 cXML メッセージ アーキテクチャ
アプリケーションは、ペイロードに含まれるすべてのメッセージング オブジェクトを処理する必要があります。
cXML DTD
必要な DTD は、以下の場所で入手できます。
http://xml.cxml.org/schemas/cXML/version/cXML.dtd
ここで、version は完全な cXML バージョン番号(1.1、1.2、など)です。
http://xml.cxml.org/schemas/cXML/version/Fulfill.dtd
ここで、version は完全な cXML バージョン番号(1.1、1.2、など)です。
cXML メッセージを送信するときには、これらの DTD を使用した検証は必須ではありません。しかし、cXML メッセージング構造の前提の 1 つは、送信するすべてのメッセージが検証済みであるということです。このため、少なくとも新しいトレーディング パートナとの相互運用性をテストするときには、メッセージを DTD と照らし合わせて検証するようにしてください。トレーディング パートナとの相互運用性に問題がなければ、オプションでメッセージ検証を解除してパフォーマンスを向上させても構いません。
共有秘密の処理
cXML API は、リポジトリに格納される共有秘密の値へのアクセスを提供します。GetSharedSecret メソッドを使用すると、リポジトリから共有秘密を取得して、受信ドキュメントに格納されている共有秘密と比較したり、送信 cXML ドキュメントで使用したりできます。
受信ドキュメントの場合、ビジネス処理コードは、受信メッセージの共有秘密の検証を実行する必要があります。そのためには、その共有秘密の値と、リポジトリ内のコンフィグレーションに指定されている値を比較します。
送信ドキュメントの場合、ビジネス処理コードは、各送信 cXML ドキュメントの Credential ノードに共有秘密を挿入する必要があります。
受信メッセージの処理
受信メッセージを処理するには、まずそのメッセージを初期化する必要があります。登録機能は、コラボレーション アグリーメントをリスナまたは送信アプリケーションに関連付けます。初期化プロセスによって返されるトークンは、メッセージの送受信時に cXML メッセージで使用されます。
初期化
受信メッセージを初期化するには、次の手順を行います。
private static CXMLManager cxmlm = CXMLManager.getInstance();
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");
メッセージの処理
前節の初期化,で説明したとおり受信メッセージを初期化したら、そのメッセージを処理できます。そのためには、アプリケーションは以下のことを行う必要があります。
// cXML ドキュメントを取得
CXMLDocument reqMsgDoc = cmsg.getRequestDocument();
// XML DOM ドキュメントを取得
Document reqXMLDoc = reqMsgDoc.getDocument();
String otherSharedSecret = cxmlm.getSharedSecret(otherTradingPartnerName);
debug("Stored Shared Secret for " + otherTradingPartnerName + ": " + otherSharedSecret);
以下の比較失敗オプションが発生する場合があります。
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);
Element request = punchoutDoc.createElement("Request");
// ヘッダ
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")),
CXMLDocument replyMsgDoc = new CXMLDocument();
replyMsgDoc.setDocument(replyXMLDoc);
cmsg.setReplyDocument(replyMsgDoc);
cmsg.setCollaborationAgreement(prop);
cmsg.reply();
送信メッセージの処理
送信メッセージを送信するには、そのメッセージを初期化しておく必要があります。そのための手順は次のとおりです。
private static CXMLToken token;
private static CXMLManager cxmlm = CXMLManager.getInstance();
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);
メッセージの送信
メッセージを送信するには、アプリケーションは以下のアクションを実行する必要があります。
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);
Element request = punchoutDoc.createElement("Request");
Element trans = punchoutDoc.createElement(&dlq;PunchoutSetupRequest&drq;);
request.appendchild(trans);
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")),
CXMLDocument reqMsgDoc = new CXMLDocument();
reqMsgDoc.setDocument(reqXMLDoc);
cmsg.setRequestDocument(reqMsgDoc);
cmsg.setCollaborationAgreement(prop);
CXMLMessageToken sendToken = (CXMLMessageToken) cmsg.send();
CXMLDocument replyMsgDoc = cmsg.getReplyDocument();
org.w3c.dom.Document replyXMLDoc = replyMsgDoc.getDocument();
コード サンプル
この節では、バイヤとサプライヤがメッセージを処理するために使用するコードの例を示します。これらの例は 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);
}
}
}
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |