この章では、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」をクリックします。