この章では、SOADemo-Clientアプリケーションなどのクライアント・アプリケーションと、SOA Order Bookingアプリケーションのプロジェクトをインタフェースする方法に焦点を当てます。
この章では、クライアント・アプリケーションの詳細な作成方法については説明しません。クライアント・アプリケーションでは標準のADFテクノロジを使用しているため、詳細は、『Oracle Application Development Framework開発者ガイド』および『Oracle Application Development Frameworkチュートリアル』を参照してください。
項目は次のとおりです。
SOADemo-Clientアプリケーションは、顧客がGlobal Companyへの注文に使用するWebベースのアプリケーションです。 このアプリケーションにログインした顧客は、製品を参照してショッピング・カートに入れ、注文を発行できます。 SOADemo-Clientアプリケーションのページの詳細は、『Oracle SOA Suiteクイック・スタート・ガイド』を参照してください。
SOADemo-Clientアプリケーションでは、ADFテクノロジを使用して、アプリケーション開発プロセスを簡素化し、アプリケーションの管理を容易にします。 ADFアプリケーションは、JDeveloperを使用して作成できます。
SOADemo-Clientアプリケーションでは、SOA Order Bookingアプリケーションが提供する次のサービスをコールします。
CustomerService。 クライアント・アプリケーションでは、ログイン・プロセスで、CustomerServiceが提供する「電子メールで顧客を検索する」サービスを使用して、顧客のログインIDとパスワードを検証します。
CustomerService。 SOADemo-Clientアプリケーションでは、新規顧客が自分自身をデータベースに追加できるようにする「Register」ボタンを提供します。 「Register」ボタンによって、CustomerServiceが提供する「新規顧客の追加」サービスが起動されます。
OrderBookingESB。 顧客が注文を発行すると、OrderBookingESBプロジェクトが起動されます。 このOrderBookingESBプロジェクトは、SOA Order Bookingアプリケーションのメイン・フローであるSOAOrderBooking BPELプロセスを起動します。
CustomerServiceおよびOrderBookingESBが提供するサービスをSOADemo-Clientアプリケーションで起動できるように、そのサービス用のWebサービス・プロキシを生成する必要があります。 クライアントのコードで、Webサービス・プロキシのメソッドをコールし、CustomerServiceまたはOrderBookingESBの対応するメソッドを起動します。 Webサービス・プロキシは、JDeveloperを使用して生成できます。
この項では、CustomerService用のWebサービス・プロキシを生成する方法と、そのWebサービス・プロキシをクライアント・アプリケーションからコールする方法について説明します。
CustomerService用のWebサービス・プロキシを生成するには、クライアント・アプリケーションで、Webサービス・プロキシ用のプロジェクトを作成します。 次の手順では、最初に空のプロジェクトを作成し、次にWebサービス・プロキシの作成ウィザードを起動して、CustomerService用のプロキシを作成します。
使用しているクライアント・アプリケーションにプロジェクトを作成し、CustomerService用のWebサービス・プロキシを含めます。 最初に、空のプロジェクトを作成します。
クライアント・アプリケーションを右クリックし、「新規プロジェクト」を選択します。
新規ギャラリの「カテゴリ」セクションで、「General」を開き、「Projects」を選択します。 「項目」セクションで、「空のプロジェクト」を選択します。
「OK」をクリックします。
「プロジェクトの作成」ダイアログで、「プロジェクト名」フィールドに「CustomerService」と入力します。
図10-2 CustomerService Webサービス・プロキシ・プロジェクトに関する「プロジェクトの作成」ダイアログ

「OK」をクリックします。
アプリケーション・ナビゲータで、クライアント・アプリケーションの下に空のCustomerServiceプロジェクトが表示されていることを確認します。
「CustomerService」プロジェクトを右クリックし、「新規」を選択します。 新規ギャラリの「カテゴリ」セクションで、Business Tierを開き、「Web Services」を選択します。 「項目」セクションで、「Webサービス・プロキシ」を選択します。
「OK」をクリックします。 Webサービス・プロキシの作成ウィザードが起動します。 「次へ」をクリックして続行します。
ステップ1のWebサービス記述ページで、次の操作を実行します。
WSDLドキュメントURL: 次のURLを入力します。
http://host:port/CustomerService/CustomerService?WSDL
hostは、Oracle Application Serverを実行しているマシンの名前を、portは、Oracle HTTP ServerまたはOC4JがリスニングしているHTTPポートを指定します。
マッピング・ファイル: 空白のままにします。
「次へ」をクリックします。 何も実行されない場合は、「UDDI」ボタンをクリックします。 これによって、別のウィザードがポップアップされます。 そのウィザードで、「取消」をクリックします。 再度、「次へ」をクリックします。
ステップ2のポート・エンドポイント・ページで、「外部サーバーにデプロイされたサービスに対して実行します」を選択し、「次へ」をクリックします。
ステップ3のカスタム・マッピング・ページで、「次へ」をクリックします。
ステップ4の定義済ハンドラ・ページで、「次へ」をクリックします。
ステップ5のデフォルト・マッピング・オプション・ページで、次の操作を実行します。
パッケージ名: 「oracle.soademo.view.services」と入力します。
生成タイプのルート・パッケージ: 「oracle.soademo.view.services.runtime」と入力します。
このページのすべてのオプションを選択します。
データ・バインディング・クラスの生成
既存のタイプ・クラスの再利用
ラップされたパラメータのアンラップ
パラメータにヘッダーをマップ
図10-8 Webサービス・プロキシの作成ウィザード、ステップ5、デフォルト・マッピング・オプション

「次へ」をクリックします。
ステップ6のサポート・ファイル・ページでは、JUnitを使用してテスト・ケースを記述する場合のみ、「JUnitユニット・テスト・コードの生成」を選択します。 JUnitを使用するファイルをコンパイルできるようにするには、外部サイト(例: http://www.junit.org)からJUnitライブラリ・ファイルをダウンロードする必要があります。
「次へ」をクリックします。
最終ステップで、「終了」をクリックします。
JDeveloperによって、プロジェクトのsrcディレクトリに、Webサービス・プロキシ・ファイルが作成されます。
手順8で、「JUnitユニット・テスト・コードの生成」を選択した場合は、外部サイト(例: http://www.junit.org)からJUnitをダウンロードする必要があります。
プロジェクトをビルドする前に、JUnit jarファイルをプロジェクトに追加します。 jarファイルをプロジェクトに追加するには、クライアントの「CustomerService」プロジェクトを右クリックし、「プロジェクト・プロパティ」を選択します。 「プロジェクト・プロパティ」ダイアログで、左側にある「ライブラリ」を選択し、右側にある「Jar/ディレクトリの追加」をクリックします。 JUnit jarファイルを選択して、プロジェクトに追加します。
クライアントの「CustomerService」プロジェクトを右クリックし、「再ビルド」を選択します。
CustomerService用Webサービス・プロキシのメイン・ファイルは、src¥oracle¥soademo¥view¥services¥CustomerServiceClient.javaです。 このファイルには、CustomerServiceが提供するメソッドがリストされています。 クライアント・アプリケーションはこのクラスのメソッドをコールできるため、Webサービス・プロキシを使用してクライアント・アプリケーションをデプロイできます。
SOADemo-Clientアプリケーションでは、次の2つの場所で、CustomerService用Webサービス・プロキシを起動します。
SOADemo-Clientアプリケーションでは、顧客が「Login」ボタンをクリックすると、Login.javaのlogin_actionメソッドを起動します。Login.javaは、SOADEMO-CLIENT¥UserInterface¥src¥oracle¥soademo¥view¥backingディレクトリにあります。
login_actionメソッドは、CustomerServiceClientのfindCustomerByEmailメソッドをコールして顧客のログインを検証します。 このメソッドには、顧客がログイン・ページで入力した電子メールとパスワードの情報が渡されます。 該当する顧客が検出された場合は、顧客情報がセッションに格納され、"success"が戻されます。
public String login_action() {
String AUTH_USER = "Authorized_User";
// Check credentials
FacesContext ctx = FacesContext.getCurrentInstance();
// Call Web service to check user credentials
try {
oracle.soademo.view.services.CustomerServiceClient myPort =
new oracle.soademo.view.services.CustomerServiceClient();
System.out.println("calling " + myPort.getEndpoint());
// test adding new customer
Customer newCust = null;
newCust = myPort.findCustomerByEmail(emailId.getValue().toString(),
pwd.getValue().toString());
//Store customer info on session
if (newCust != null)
JSFUtils.storeOnSession(ctx, "custinfo", newCust);
else {
FacesMessage msg = new FacesMessage("Login Failed!");
msg.setSeverity(msg.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
return null;
}
} catch (Exception ex) {
FacesMessage msg = new FacesMessage("Login Failed!");
msg.setSeverity(msg.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
//ex.printStackTrace();
return null;
}
// Set CurrentUser mananged bean properties
JSFUtils.setManagedBeanValue(ctx,"Current_User.loggedIn",true);
JSFUtils.setManagedBeanValue(ctx,"Current_User.userid",
emailId.getValue().toString());
JSFUtils.storeOnSession(ctx, AUTH_USER, "Authorized_User");
return "success";
}
Registerページを使用すると、新規顧客は自分自身をデータベースに追加できます。 顧客がこのページに情報を入力し、「Register」ボタンをクリックすると、Register.javaのregister_actionメソッドが起動されます。Register.javaも、SOADEMO-CLIENT¥UserInterface¥src¥oracle¥soademo¥view¥backingディレクトリにあります。
register_actionメソッドは顧客情報を収集し、CustomerServiceのaddNewCustomerメソッドを起動します。
public void register_action(ActionEvent ae) {
String AUTH_USER = "Authorized_User";
FacesContext ctx = FacesContext.getCurrentInstance();
Customer newCust = new Customer();
if (password.getValue().toString().equals(password_chk.getValue().toString())) {
// Call Web service to register new customer
try {
oracle.soademo.view.services.CustomerServiceClient myPort =
new oracle.soademo.view.services.CustomerServiceClient();
System.out.println("calling " + myPort.getEndpoint());
// Adding new customer info
Address addr = new Address();
newCust.setFname(fname.getValue().toString());
newCust.setLname(lname.getValue().toString());
newCust.setEmail(email.getValue().toString());
newCust.setPhonenumber(phone.getValue().toString());
newCust.setPassword(password.getValue().toString());
addr.setStreet(street.getValue().toString());
addr.setCity(city.getValue().toString());
addr.setState(state.getValue().toString());
addr.setZip(zip.getValue().toString());
// For now set to US address
addr.setCountry("USA");
List addrList = new ArrayList();
addrList.add(addr);
newCust.setAddressList(addrList);
myPort.addNewCustomer(newCust);
// Generate successful registration message
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Registration Successful!"));
} catch (Exception ex) {
FacesMessage msg = new FacesMessage("Registration Failed!");
msg.setSeverity(msg.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(ex.getMessage()));
ex.printStackTrace();
}
//Store customer info on session
JSFUtils.storeOnSession(ctx, "custinfo", newCust);
// Set CurrentUser mananged bean properties
JSFUtils.setManagedBeanValue(ctx,"Current_User.loggedIn",true);
JSFUtils.setManagedBeanValue(ctx,"Current_User.userid",
email.getValue().toString());
JSFUtils.storeOnSession(ctx, AUTH_USER, "Authorized_User");
} else {
// Generate password mismatch msg
FacesMessage msg = new FacesMessage("Your password values do not match!");
msg.setSeverity(msg.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
OrderBookingESBプロジェクト用のWebサービス・プロキシの作成は、CustomerService用のプロキシの作成とは若干異なります。これは、OrderBookingESBがESBプロジェクトであるためです。
Webサービス・プロキシの作成ウィザードを実行するには、OrderBookingESB用のWSDLを戻す具体的なURLが必要です。 具体的なURLは、ESB Consoleを使用して取得できます。
次のURLを使用して、ESB Consoleにアクセスします。
http://hostname:port/esb/esb/EsbConsole.html
hostnameは、Oracle Application Serverを実行しているマシンの名前を、portは、Oracle HTTP ServerまたはOC4JがリスニングしているHTTPポートを指定します。
ESB Consoleの左側で、「OrderBookingService」を選択します。 これが、OrderBookingESBプロジェクトの起点になります。
ESB Consoleの右側で、「定義」タブを選択します。 ページが図10-10のように表示されることを確認します。
図10-10 OrderBookingServiceの「定義」タブのページが表示されたESB Console

具体的なURLをWebサービス・プロキシの作成ウィザードで貼り付けできるようにコピーします。 また、WSDLの内容を表示する場合は、そのURLをクリックすることもできます。
使用しているクライアント・アプリケーションにプロジェクトを作成し、OrderBookingESB用のWebサービス・プロキシを含めます。 最初に、クライアント・アプリケーションに空のプロジェクトを作成します。
クライアント・アプリケーションを右クリックし、「新規プロジェクト」を選択します。
新規ギャラリの「カテゴリ」セクションで、「General」を開き、「Projects」を選択します。 「項目」セクションで、「空のプロジェクト」を選択します。
「OK」をクリックします。
「プロジェクトの作成」ダイアログで、「プロジェクト名」フィールドに「OrderService」と入力します。
図10-12 OrderService Webサービス・プロキシ・プロジェクトに関する「プロジェクトの作成」ダイアログ

「OK」をクリックします。
アプリケーション・ナビゲータで、クライアント・アプリケーションの下に空のOrderServiceプロジェクトが表示されていることを確認します。
「OrderService」プロジェクトを右クリックし、「新規」を選択します。 新規ギャラリの「カテゴリ」セクションで、Business Tierを開き、「Web Services」を選択します。 「項目」セクションで、「Webサービス・プロキシ」を選択します。
「OK」をクリックします。 Webサービス・プロキシの作成ウィザードが起動します。 「次へ」をクリックして続行します。
ステップ1のWebサービス記述ページで、次の操作を実行します。
WSDLドキュメントURL: OrderBookingESB用のURLを入力します。 このURLを取得する方法については、第10.3.1項「具体的なWSDL URLの取得」を参照してください。
マッピング・ファイル: 空白のままにします。
WSDLをプロジェクトにコピー: このオプションは選択しません。
「次へ」をクリックします。 何も実行されない場合は、「UDDI」ボタンをクリックします。 これによって、別のウィザードがポップアップされます。 そのウィザードで、「取消」をクリックします。 再度、「次へ」をクリックします。
ステップ2のポート・エンドポイント・ページで、「外部サーバーにデプロイされたサービスに対して実行します」を選択します。
「エンドポイントURL」で、URLを次のように編集します。
localhostは、OrderBookingESBプロジェクトを実行しているマシンの名前に置き換えます。
必要に応じて、ポート番号を検証して修正します。
「次へ」をクリックします。
ステップ3のカスタム・マッピング・ページで、「次へ」をクリックします。
ステップ4の定義済ハンドラ・ページで、「次へ」をクリックします。
ステップ5のデフォルト・マッピング・オプション・ページで、次の操作を実行します。
パッケージ名: 「oracle.soademo.view.services」と入力します。
生成タイプのルート・パッケージ: 「com.globalcompany.ns.order」と入力します。
このページのすべてのオプションを選択します。
データ・バインディング・クラスの生成
既存のタイプ・クラスの再利用
ラップされたパラメータのアンラップ
パラメータにヘッダーをマップ
図10-18 Webサービス・プロキシの作成ウィザード、ステップ5、デフォルト・マッピング・オプション

「次へ」をクリックします。
ステップ6のサポート・ファイル・ページでは、JUnitを使用してテスト・ケースを記述する場合のみ、「JUnitユニット・テスト・コードの生成」を選択します。 JUnitを使用するファイルをコンパイルできるようにするには、外部サイト(例: http://www.junit.org)からJUnitライブラリ・ファイルをダウンロードする必要があります。
「次へ」をクリックします。
最終ステップで、「終了」をクリックします。
手順8で、「JUnitユニット・テスト・コードの生成」を選択した場合は、外部サイト(例: http://www.junit.org)からJUnitをダウンロードする必要があります。
プロジェクトをビルドする前に、JUnit jarファイルをプロジェクトに追加します。 jarファイルをプロジェクトに追加するには、クライアントの「OrderService」プロジェクトを右クリックし、「プロジェクト・プロパティ」を選択します。 「プロジェクト・プロパティ」ダイアログで、左側にある「ライブラリ」を選択し、右側にある「Jar/ディレクトリの追加」をクリックします。 JUnit jarファイルを選択して、プロジェクトに追加します。
クライアントの「OrderService」プロジェクトを右クリックし、「再ビルド」を選択します。
SOADemo-ClientアプリケーションのShopping Cartページで、顧客は「Place Order」ボタンをクリックして注文を発行します。 このボタンによって、(SOADEMO-CLIENT¥UserInterface¥src¥oracle¥soademo¥view¥backingディレクトリにある)ShoppingCart.javaのPlaceOrder_actionメソッドが起動されます。
PlaceOrder_actionメソッドは、次の処理を実行します。
OrderBookingESB用のプロキシである__soap_initiate_pptClientのインスタンスを作成します。 このクラスは、Webサービス・プロキシ・ウィザードによって生成されています。
使用している環境で、生成されたファイルの名前を確認します。 クラスの名前が若干異なる場合があります(例: __soap_OrderBookingService_initiate_pptClient.java)。
ショッピング・カートから注文情報を取得します。
セッションから顧客情報を取得します。
発注を作成し、注文と顧客の情報を移入します。
プロキシのinitiateをコールして、OrderBookingESBを起動します。
ショッピング・カートを空に設定します。
太字の行は、Webサービス・プロキシを起動するコードの位置を示しています。
public String PlaceOrder_action() {
// Place order
FacesContext ctx = FacesContext.getCurrentInstance();
// Get order items from Cart
Cart cartBean = (Cart) JSFUtils.getManagedObject("Shopping_Cart");
List CartItemList = cartBean.getItemList();
// Get Customer info from session
Customer currentCustomer = (Customer) JSFUtils.getFromSession(ctx,
"custinfo");
try {
oracle.soademo.view.services.__soap_initiate_pptClient myPort =
new oracle.soademo.view.services.__soap_initiate_pptClient();
System.out.println("calling " + myPort.getEndpoint());
PurchaseOrderType po = new PurchaseOrderType();
// Customer ID
po.setCustID(currentCustomer.getCustid());
// Need to randomly set ID for now since WS won't auto-assign
po.setID("" + (int)(Math.random() * 1000));
// Order Info
OrderInfoType order = new OrderInfoType();
order.setOrderPrice(cartBean.getOrderTotal());
order.setOrderComments("This order was issued from the SOA Retail
Client.");
Calendar caldate = Calendar.getInstance();
order.setOrderDate(caldate);
order.setOrderStatus("pending");
po.setOrderInfo(order);
// Order Items
OrderItemsType oitems = new OrderItemsType();
ItemType[] items = new ItemType[CartItemList.size()];
for (int i = 0; i < CartItemList.size(); i++) {
items[i] = (ItemType) CartItemList.get(i);
}
oitems.setItem(items);
po.setOrderItems(oitems);
// Supplier Info
// For now hard code fictional Supplier
SupplierInfoType supplier = new SupplierInfoType();
supplier.setSupplierName("Express Deliveries");
// Supplier has 10% discount
supplier.setSupplierPrice(cartBean.getOrderTotal().
subtract(cartBean.getOrderTotal().movePointLeft(1)));
po.setSupplierInfo(supplier);
// Contact Info
ContactType contact = new ContactType();
contact.setEmailAddress(currentCustomer.getEmail());
contact.setPhoneNumber(currentCustomer.getPhonenumber());
po.setUserContact(contact);
// Initiate Order
myPort.initiate(po);
System.out.println("Order submitted...");
}
catch (Exception ex) {
ex.printStackTrace();
}
// report success
ctx.addMessage(null, new FacesMessage("Order Submitted!"));
cartBean.EmptyCart();
return "home";
}
この項では、soademo_101310_prod.zipファイルの事前に作成されたクライアント・アプリケーションをデプロイする方法について説明します。
このzipファイルからSOADEMO-Clientアプリケーションをデプロイする手順は、次のとおりです。
JDeveloperで、SOADEMO-CLIENT¥SOADEMO-CLIENT.jwsを開きます。 このファイルは、SOADEMO-Clientアプリケーション用のプロジェクト・ファイルです。
この手順は、次の条件に一致する場合のみ必要です。
JDeveloperとOracle Application Serverを異なるマシンで実行している場合
インストールしたOracle Application Serverが、8888以外のポートのHTTPリクエストをリスニングしている場合
前述の条件のいずれか、または両方に一致する場合は、次の手順を実行する必要があります。
次のファイルを編集します。
SOADEMO-CLIENT¥CustomerService¥src¥oracle¥soademo¥view¥services¥runtime¥CustomerServiceSoapHttp_Stub.java
このファイルには、JDeveloperのアプリケーション・ナビゲータから次のようにアクセスできます。
i. JDeveloperで、「表示」→「構造」の順に選択して、構造ウィンドウを表示します。
ii. アプリケーション・ナビゲータで、「SOADEMO-CLIENT」→「CustomerService」→「アプリケーション・ソース」→「oracle.soademo.view」→「サービス」→「CustomerSvcProxy」の順に選択します。
iii. 構造ウィンドウで、「CustomerServiceSoapHttp_Stub.java」をダブルクリックします。
SOADEMO-CLIENT¥OrderService¥src¥oracle¥soademo¥view¥services¥runtime¥__soap_initiate_ppt_Stub.java
このファイルには、JDeveloperのアプリケーション・ナビゲータから次のようにアクセスできます。
i. JDeveloperで、「表示」→「構造」の順に選択して、構造ウィンドウを表示します。
ii. アプリケーション・ナビゲータで、「SOADEMO-CLIENT」→「OrderService」→「アプリケーション・ソース」→「oracle.soademo.view」→「サービス」→「Initiate_pptServiceProxy」の順に選択します。
iii. 構造ウィンドウで、「__soap_initiate_ppt_Stub.java」をダブルクリックします。
このファイルに、次の変更を加えます。
localhostを検索して、Oracle Application Serverを実行しているマシンの完全修飾名(ドメイン名を含む)に置き換えます。
8888を検索して、使用している環境のHTTPポートに置き換えます。
次のファイルを削除(または名前変更)します。
SOADEMO-CLIENT¥UserInterface¥deploy¥soaui.war
SOADEMO-CLIENT¥UserInterface¥deploy¥soaui.ear
削除したファイルを再生成します。
i. 「SOADEMO-CLIENT」→「UserInterface」→「リソース」の順に開きます。
ii. 「soaui.deploy」を右クリックし、「WARファイルへデプロイ」を選択します。
iii. 「soaui.deploy」を右クリックし、「EARファイルへデプロイ」を選択します。
「SOADEMO-CLIENT」→「アセンブリ」→「アプリケーション・ソース」の順に開きます。
「SOADEMO.deploy」を右クリックし、「配布先」→「ApplicationServerConnection」の順に選択します。ApplicationServerConnectionは、Oracle Application Serverインストールへの接続を指定します。
「アプリケーションの構成」ダイアログで、「OK」をクリックします。