Oracle® Fusion Middleware Oracle Business Intelligence Discoverer WebサービスAPIユーザーズ・ガイド 11g リリース1(11.1.1) E51913-01 |
|
戻る |
次へ |
この章では、Discoverer WebサービスAPIの概要およびAPIの使用方法について説明します。項目は次のとおりです。
SOAP(Simple Object Access Protocol)は、Web上で情報を交換するためのXMLプロトコルに関するWorld Wide Web Consortium(W3C)勧告です。
Oracle BI Discoverer Webサービスは、クライアントが次の処理を実行するためのApplication Programming Interface(API)の一部です。
Discoverer接続、ワークブックおよびワークシートの取得
ワークシート・クエリーの実行
SOAPプロトコル(Version 1.1、JAX-WS/documentラップ・フォーマットを使用)を使用したワークシート・コンテンツの取得
Discoverer Webサービス用のSOAPエンドポイントのURLは、http(s)://<host>:<port>/discoverer/wsi
です。
WSDL(Web Services Definition Language)フォーマットは、サービスおよびメソッドを公式に定義する業界標準であり、Discoverer Webサ―ビスAPIの定義に使用されます。サービスのプロキシ・クラスを自動的に生成できます。
注記
WSDLにはhttp(s)://<host>:<port>/discoverer/wsi?wsdl
からアクセスできます。
このマニュアルでは、Webサービスの開発者に、WSDLとSOAPの技術およびWSDLからのクライアント・コードの生成方法に関する知識があることを前提としています。
Discoverer Webサービスは、信頼できるユーザーからのみアクセス可能です。自分のコードでこれらの資格証明を使用するためには、Discovererの中間層の管理者によって設定された信頼できるユーザー名とパスワードを取得する必要があります。
ユーザー資格証明を含むコードの例は、例1-4「保護されたWebサービスにアクセスするための資格証明の設定」を参照してください。
信頼できるユーザーを作成する方法の詳細は、「Discoverer Webサービスにアクセスするための信頼できるユーザーの定義」を参照してください。
現行リリースでは、Discoverer WebサービスでOracle Single Sign-On、Oracle Applications Single Sign-Onおよびパブリック接続がサポートされています。
Discoverer Webサービスは本質的にステートフルです。つまり、Webサービス・クライアント・スタブのインスタンスごとに、Discoverer Webサービスとの1つのHTTPセッションが必要です。このHTTPセッションを、すべてのクライアント・アプリケーション・ユーザーがすべてのWebサービス処理で使用できます。ユーザーごとに、クライアント・アプリケーションはDiscoverer Webサービスに新規ユーザー・セッションを通知するためにログイン・メソッドをコールする必要があります。各ユーザー・セッションは、Discovererセッション・プールから作成または再使用されたサーバー側の専用Discovererセッションと関連付けられます。関連付けられるDiscovererセッションは、ユーザーとのすべての相互作用で使用されます。クライアント・アプリケーションは、ユーザーのすべての操作が完了した後にログアウト・メソッドをコールする必要があります。
Webサービス・クライアントとサーバー間で確立されたHTTPセッションは、クッキーによって追跡され、Webサービスによって管理されます。
Discovererセッションはlogin()コールとそれに続くデータ・フェッチ処理が実行されるたびに必要となり、logout()コールが実行されるたびにリリースされるため、Discovererセッション・プールのサイズを把握しておくと役立ちます。
Oracle Fusion Middleware Controlを使用して、セッション・プールのサイズの最大値を設定できます(configuration.xmlで)。Discovererセッションのクリーン・アップ処理は定期的に実行され、失効したかまたは非アクティブなDiscovererSessionオブジェクトがあれば、プールから削除されます。
SSOusername、Connectionkey、Workbook、WorksheetおよびLocaleメソッドを使用して、新規ログイン・リクエストのためのDiscovererセッション割当てを最適化するために、どのDiscovererセッションを選択するかが決定されます。
Discoverer Webサービスはクラスタに分散可能で、単一機器の故障がシステム全体の障害にはなりません。透過的フェイルオーバーはサポートされていないため、失敗時のイベントでは、新規ユーザー・セッションを作成するために各クライアントを再認証する必要があります。
ログ・ファイルからおよびWebサービス例外から問題を診断できます。Oracle Fusion Middleware Controlを使用してログ・エントリを表示できます。詳細は、Oracle Fusion Middleware Oracle Business Intelligence Discoverer構成ガイドを参照してください。
Discoverer Webサービスを呼び出すには、次の条件を満たす必要があります。
「Oracle Fusion Middleware Controlを使用したDiscoverer Webサービスの値の設定」
「生成済Webサービス・クライアント・スタブを使用してWebサービスを呼び出すためのクライアント・アプリケーションを記述」
Discoverer Webサービスにアクセスできるのは信頼できるユーザーのみです。信頼できるユーザーは、WebLogic Server管理コンソールを使用して作成します。ユーザーの作成の詳細は、WebLogic管理コンソール・オンライン・ヘルプのユーザーの作成に関する項を参照してください。
注意: デフォルトで、「管理者」グループにはDiscovererアプリケーションのスコープ指定されたセキュリティ・ロールが割り当てられます。Discoverer Webサービスへのアクセスを提供するには、新規ユーザーを 「管理者」グループに追加します。グループへのユーザーの追加の詳細は、WebLogic管理コンソール・オンライン・ヘルプのグループへのユーザーの追加に関する項を参照してください。 |
新規ユーザーがDiscoverer Webサービスにアクセスできるようにするには、そのユーザーにDiscovererスコープ指定セキュリティ・ロールを割り当てる必要があります。セキュリティ・ロールへのユーザーの追加の詳細は、WebLogic管理コンソール・オンライン・ヘルプのロールへのユーザーの追加に関する項を参照してください。
Discoverer Webサービスを呼び出すためのJavaクラスを作成する前に、Discoverer Webサービスがインストールおよび設定されていることを確認する必要があります。
Discoverer Webサービスがインストールおよび構成されていることを確認するには、エンドポイントURLにアクセスします。URLにアクセスできない場合は、Discovererマネージャに問い合せてください。
リンクhttp://<host>:<port>/discoverer/wsi
にナビゲートします。
前のステップで作成したユーザー/パスワードの入力が求められます。
注意: インストール時に入力した「weblogic」ユーザーのユーザー名とパスワードも使用できます(詳細は中間層の管理者に問い合せてください)。
Fusion Middleware Controlを使用してDiscoverer WebサービスのmaxSessions設定を構成する必要があります。この設定は、同時に有効にできるDiscovererセッションの最大数を指定します(推奨値は20です)。
Fusion Middleware Controlを使用したDiscoverer Web Servicesの構成に関する詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Discoverer構成ガイド』を参照してください。
Webサービス・クライアント・ライブラリからプロキシ/クライアント・ファイルを生成できます。Oracle Webサービスには、この目的のためのライブラリが用意されています。詳細は、Oracle Fusion Middleware Oracle Web Services開発者ガイドを参照してください。
Discoverer WSDL URLからDiscoverer Webサービス・クライアントを生成する手順は、次のとおりです。
Webブラウザを表示します。
Discoverer WSDL URL: http://<host>:<port>/discoverer/wsi?wsdl
にアクセスします。
詳細は、「WSDLフォーマット」と「生成済Webサービス・クライアント・スタブを使用してWebサービスを呼び出すためのクライアント・アプリケーションを記述」を参照してください。
Webサービス・ライブラリでSESSION_MAINTAIN_PROPERTYの値を設定する必要があります。SESSION_MAINTAIN_PROPERTYはセッションがステートフルかどうかを指定します。Discoverer Webサービス・セッションはステートフルであるため、このプロパティは次のようにTrue
に設定する必要があります。
Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
注意: サポートされている各Webサービス・ライブラリには、ステートフル・セッションを保守するための同等のSESSION_MAINTAIN_PROPERTY
があります。詳細は、お使いのWebサービスのマニュアルを参照してください。
基本的なクライアント・アプリケーションのコードの例を次に示します。
例1-2 Webサービス・クライアント・スタブのインスタンス化
class webserviceclient { @WebServiceRef private static Wsi_Service wsi_Service; public static void main(String[] args) { wsi_Service = new Wsi_Service(); wsiProxy proxy = wsi_Service.getWsi(); } }
例1-3 クライアントのセッション保守の保証
これが必要となるのは、Discoverer Webサービスがステートフルであるためです。
class webserviceclient { @WebServiceRef private static Wsi_Service wsi_Service; public static void main(String[] args) { wsi_Service = new Wsi_Service(); wsiProxy proxy = wsi_Service.getWsi(); Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true); } }
例1-4 保護されたWebサービスにアクセスするための資格証明の設定
class webserviceclient { @WebServiceRef private static Wsi_Service wsi_Service; public static void main(String[] args) { wsi_Service = new Wsi_Service(); wsiProxy proxy = wsi_Service.getWsi(); Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.USERNAME_PROPERTY,"username"); requestContext.put(BindingProvider.PASSWORD_PROPERTY,"password"); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true); } }
例1-5 Webサービスのエンドポイントの設定
class webserviceclient{ @WebServiceRef private static Wsi_Service wsi_Service; public static void main(String[] args) { wsi_Service = new Wsi_Service(); wsiProxy proxy = wsi_Service.getWsi(); Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.USERNAME_PROPERTY,"username"); requestContext.put(BindingProvider.PASSWORD_PROPERTY,"password"); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://host:port/discoverer/wsi"); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true); }}
例1-6 スタブでのWebサービス処理の実行
class webserviceclient{ @WebServiceRef private static Wsi_Service wsi_Service;f public static void main(String[] args) { wsi_Service = new Wsi_Service(); wsiProxy proxy = wsi_Service.getWsi(); Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.USERNAME_PROPERTY,"username"); requestContext.put(BindingProvider.PASSWORD_PROPERTY,"password"); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://host:port/discoverer/wsi"); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true); DisplayName displayname = new DisplayName(); displayname.setUser("DISPLAYNAME"); Identifier idfr = new Identifier() ; idfr.setId("IDENTIFIER"); UserCredential uc = new UserCredential(); uc.setDisplayName(displayname); uc.setIdentifier(idfr); LocaleBean locale = new LocaleBean(); locale.setCountry("US"); locale.setLanguage("en"); locale.setVariant(""); SessionKey sKey = proxy.login(uc, locale); proxy.logout(sKey); }}
注意: 上述のクライアント・アプリケーションをコンパイルするには、classpathでWebサービス・ライブラリを設定してください。Oracleライブラリを使用している場合、soap.jar、Http_client.jarおよびダウンロードされたproxy.jarが存在する必要があります。たとえば、コマンド・プロンプトからクライアント・アプリケーションを実行する場合、Java classpathを次のように設定できます。
set CLASSPATH=<absolute path of>/proxy.jar;<absolute path of>\soap.jar;<absolute path of>\Http_client.jar
注意: Oracle JDeveloperやEclipseのような統合開発環境を使用している場合は、その環境のユーザー・インタフェースを使用してJava classpathを設定してください。
クライアント・アプリケーションでDiscoverer WebサービスAPIを使用して、Discoverer接続およびワークシートに関連するXMLデータを取得できます。イベントの標準フローを次に示します(詳細は、「イベントの標準フロー: 詳細なタスク例」を参照)。
イベントの標準フロー
これによりユーザー・セッションが開始され、有効なセッション・キーが提供されます。
注意: Oracle E-Business Suiteユーザーは、AppConnect() APIを使用してセッション・キーを生成する必要があります。詳細は、「Oracle E-Business SuiteユーザーのためのDiscoverer Webサービスへのセキュアなアクセス」を参照してください。 |
「getConnectionList()の呼出しによる接続情報の検証」
クライアントが表示および選択に使用できる接続リストが返されます。
「特定の接続の選択およびgetFolderEntryList()の呼出し」
ユーザーの表示および選択に使用できるワークブックのリストが返されます。
OLAP接続の場合は、フォルダとワークブックが返される場合もあります。
「getWorksheetList()の呼出しによる特定のワークシートの選択」
ワークシートのリストのみが空のパラメータ情報とともに返されます。
「getParameterValueList()の呼出しによるワークシート・パラメータの選択およびLOVの取得」
クライアントがユーザーの表示および選択に使用するLOVデータのまとまりが返されます。
または、getCascadeParameterValueList()を呼び出すことによって、カスケード・スタイルのワークシート・パラメータを選択することもできます。詳細は、「getCascadeParameterValueList()の呼出しによるカスケード・スタイルのワークシート・パラメータの選択とLOVの取得」を参照してください。
注意: ワークシートにパラメータが含まれない場合、クライアントはgetParameterValueList()またはgetCascadeParameterValueList()を呼び出すことができません。
「submitWorksheetQuery()の呼出しによるワークシート・クエリーの発行(パラメータも含む)」
クライアントは必要に応じてパラメータを渡して、発行を実行します。
ワークシート・クエリー・リクエストが発行されると、queryKeyが取得されます。
「getQueryStatus()の呼出しによるクエリー・ステータスの確認」
ユーザーの表示および選択に使用できるクエリーの現在のステータスが返されます。
注意: クエリーは順次実行し、クライアント・アプリケーションがユーザーに対して1つのログオン・コールを実行する際、前のクエリー発行の結果が出るのを待ってからワークシートのクエリー発行が行われるようにする必要があります。
注意: OLAPワークシートでは、XMLに総計が含まれていることがあります。その場合、APIクライアントが総計の入ったOLAPワークシートについて合計を作成すると、誤った結果が生成されます。
次のイベント・フローは、各タスク例の標準的なJavaクラス・エントリを示しています。
login() APIコールを正常に実行するには、次のコードを実行する必要があります。
wsi_Service = new Wsi_Service(); Wsi proxy = wsi_Service.getWsi(); Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.USERNAME_PROPERTY,"weblogic"); requestContext.put(BindingProvider.PASSWORD_PROPERTY,"weblogic"); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,testEndpoint); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
login()コールを使用するには、Discoverer Webサービスを呼び出すための資格証明を提供する必要があります。詳細は、「資格証明の提供によるDiscoverer Webサービスの呼出し」を参照してください。
注意: このlogin()コールは、他のDiscoverer Webサービスを呼び出す前に呼び出す必要があります。
DisplayName displayname = new DisplayName(); displayname.setUser("DISPLAYNAME"); Identifier idfr = new Identifier() ; idfr.setId("IDENTIFIER"); UserCredential uc = new UserCredential(); uc.setDisplayName(displayname); uc.setIdentifier(idfr); LocaleBean locale = new LocaleBean(); locale.setCountry("US"); locale.setLanguage("en"); locale.setVariant(""); System.out.println("Invoke the login() WS API"); SessionKey sKey = proxy.login(uc, locale); System.out.println("Session Key :"+sKey.getKey());
注意: SSOベースの接続にアクセスするには、GUIDとSSOUsernameをそれぞれIdentifierとDisplayNameとして提供します。
login() APIを使用するかわりに、Oracle E-Business Suiteユーザーは、AppsConnect()
APIを使用してセキュアなチケットと接続詳細を指定し、Discoverer Worksheetsにアクセスできます。
注記
|
LocaleBean locale = new LocaleBean(); locale.setCountry("US"); locale.setLanguage("en"); locale.setVariant(""); public SessionKey AppsConnect ( Ticket ticket, ConnectString connectStr, DiscoEulName eul, LocaleBean aLocale ) throws DiscovererWSException, DiscovererSessionUnavailableException System.out.println("Invoke the AppsConnect() WS API"); SessionKey sKey = AppsConnect(ticket,ConnectStr,eul,locale); System.out.println("Session Key :"+sKey.getKey());
AppsConnect()
APIでは、Ticket
、ConnectString
およびDiscoEulName
はstring wrapperオブジェクトです。これらのオブジェクトの値は、DiscovererユーザーがDiscovererを起動するために使用したDiscoverer URLから取得できます。
Discoverer Viewer URLの例は次のとおりです。
http://hostname.domain
/discoverer/viewer?Connect=[APPS_SECURE]discor11&SessionCookieName=discor11&eul=EUL_US&opendbid=HRIPWCMP&FrameDisplayStyle=separate&acf=453560870&NLS_LANG=AMERICAN_AMERICA&NLS_DATE_FORMAT=DD-MON-RRRR&NLS_NUMERIC_CHARACTERS=.,&NLS_DATE_LANGUAGE=AMERICAN&NLS_SORT=BINARY&exitURL=http://hostname.domain
/OA_HTML/OA.jsp?OAFunc=OAHOMEPAGE
SessionCookieName
パラメータの値が、クッキーのticket
キーです。
Connect
パラメータの値が、ConnectString
オブジェクトに渡す値です。上のURLでは[APPS_SECURE]discor11
になります。
eul
パラメータの値が、DiscoEulName
オブジェクトに渡す値です。上のURLではEUL_US
になります。
ロケール詳細は、LocaleBean
オブジェクトを使用して定義するか、URLから取得します。
acf
パラメータは、ユーザー/職責/セキュリティ・グループを識別します。このパラメータに変更があると、新規のDiscovererセッションが開始されます。
ログイン後、ユーザーはgetConnectionList() APIを呼び出して、次のような使用可能な接続のリストを取得できます。
System.out.println("Invoke the getConnectionList() API"); ConnectionList cl = proxy.getConnectionList(sKey); List conns = cl.getConnections(); System.out.println("Discoverer connections:"); for(int i=0; i<conns.size(); i++) { System.out.println("Name:"+conns.get(i).getConnectionName().getName()); System.out.println(" Key:"+ conns.get(i).getConnectionKey().getKey()); System.out.println(" Desc:"+ conns.get(i).getConnectionDesc().getDesc()); }
getFolderEntryList() APIを使用するには、Discoverer Webサービスを呼び出すための資格証明を提供する必要があります。また、有効なセッション・キーを取得する(login()コールを実行)必要があります。詳細は、「資格証明の提供によるDiscoverer Webサービスの呼出し」および「識別子の使用によるlogin()の呼出し」を参照してください。
注意: Oracle E-Business Suiteユーザーは、AppsConnect() APIを使用してセッション・キーを生成する必要があります。AppsConnect()を使用してDiscovererに接続した後、getFolderEntryList() APIを呼び出すために、ConnectionKeyにNULLを渡します。 |
ConnectionKey cKey = new ConnectionKey(); cKey.setKey("CONNECTIONKEY"); FolderEntryPath fPath = new FolderEntryPath(); fPath.setPath(""); System.out.println("Invoke the getFolderEntryList() API"); FolderEntryList fList = proxy.getFolderEntryList(sKey, cKey, fPath); List fEntries = fList.getFolderEntries(); for(int i=0; i<fEntries.size(); i++) { System.out.println("Name:"+ fEntries.get(i).getName().getName()); System.out.println(" Path:"+ fEntries.get(i).getPath().getPath()); System.out.println(" Desc:"+fEntries.get(i).getDesc().getDesc()); System.out.println(" Type:"+ fEntries.get(i).getType().getType()); }
注記
|
getWorksheetList() APIを使用して、指定されたワークブックのワークシートのリストを取得します。
注意: Oracle E-Business Suiteユーザーは、AppsConnect() APIを使用してDiscovererに接続するため、ConnectionKeyを作成する必要はありません。Discovererに接続した後、getWorksheetList() APIを呼び出すために、ワークブックに関連付けられたConnectionKey をNULL または空の文字列として渡します。 |
WorkbookKey wbKey = new WorkbookKey(); wbKey.setConnKey(cKey); wbKey.setKey("ANALYTIC_FUNCTION_EXAMPLES"); System.out.println("Invoke the getWorksheetList() API"); WorksheetList wsList = proxy.getWorksheetList(sKey, wbKey); List wsheets = wsList.getWorksheets(); for(int i=0; i<wsheets.size(); i++) { System.out.println("Name:" +wsheets.get(i).getName().getName()); System.out.println(" Key:"+wsheets.get(i).getKey().getKey()); }
前述の呼出しで取得したキーは、後続のWebサービス・コールのワークシート・キーとして使用できます。
このAPIは、Discovererワークシートのディメンションに関する情報を提供します。
WorksheetKey wsKey = new WorksheetKey(); wsKey.setWbKey(wbKey); wsKey.setKey("ANALYTIC_FUNCTION_EXAMPLES/1817"); System.out.println("Invoke the getLayoutMetadata() API"); Layout layout = proxy.getLayoutMetadata(sKey, wsKey); List dimensions = layout.getDimensions(); List measures = layout.getMeasures(); for(int i=0; i< dimensions.size(); i++) { System.out.println("Dimension :"+dimensions.get(i).getName()); } for(int i=0; i<measures.size(); i++) { System.out.println("Measure :"+measures.get(i).getName()); }
このAPIを使用して、ワークシートで使用可能なパラメータ・メタデータがあるかどうかを確認します。
System.out.println("Invoke the getParameterMetaData() API"); ParameterList pList = proxy.getParameterMetadata(sKey, wsKey); List parameters = pList.getParameters(); for(int i=0; i< parameters.size(); i++) { System.out.println("Name:"+ parameters.get(i).getName().getName()); System.out.println(" Key:"+parameters.get(i).getKey().getKey()); }
ワークシートにパラメータが含まれていない場合、このAPIは空のリストを返します。
このAPIのパラメータは、sessionKey、parameterKeyおよび整数です。
ParameterKey pKey = new ParameterKey(); pKey.setKey("ANALYTIC_FUNCTION_EXAMPLES/1817/36211"); pKey.setWsKey( wsKey); ParameterValueList pvList = proxy.getParameterValueList(sKey,pKey,new Integer(50)); List pvs = pvList.getParamValues(); System.out.println("Invoke the getParameterValueList() API"); System.out.println("Parameter Lovs:"); for(int i=0; i< pvs.size(); i++) { System.out.println("Val :"+pvs.get(i).getValue()); // Lov System.out.println(" DescriptorKey :"+pvs.get(i).getDescriptorKey()); //paramter descriptor key. This is valid if the parameter is an indexed type; }
このAPIのパラメータは、sessionKey、parameterKey、整数およびParameterSelectListです。
// Code to retrieve cities from the region 'west'. // To build the ParameterSelectList with the region as "west" ParameterValue[] pval_region = new ParameterValue[1]; pval_region[0] = new ParameterValue(); pval_region[0].setValue("West"); pval_region[0].setDescriptorKey(null); ParameterSelect[] pselect_region = new ParameterSelect[1]; pselect_region[0] = new ParameterSelect(); pselect_region[0].setKey(pKey_region); ArrayList<ParameterValue> pval_regionlist = new ArrayList<ParameterValue>(); pval_regionlist.add(pval_region[0]); pselect_region[0].getValues().addAll(pval_regionlist); ParameterSelectList pselectList= new ParameterSelectList(); ArrayList<ParameterSelect> pSelectArraylist = new ArrayList<ParameterSelect>(); pSelectArraylist.add(pselect_region[0]); pselectList.getSelParams().addAll(pSelectArraylist); // To get the values for the city parameter ParameterKey pKey_city = new ParameterKey(); pKey_city.setKey("XMLP_PARAMETERSCASCADE/1/10"); pKey_city.setWsKey(wsKey); do { pvList = proxy.getCascadeParameterValueList(sKey,pKey_city,new Integer(10),pselectList); pvs= pvList.getParamValues(); System.out.println("Invoke the getParameterValueList() API"); System.out.println("Parameter Lovs: "+pvs.size()); for(int i=0; i< pvs.size(); i++) { System.out.println("Val :"+pvs.get(i).getValue()); // Lov System.out.println(" DescriptorKey :"+pvs.get(i).getDescriptorKey()); } }while (pvs.size()>0 );
このAPIのパラメータは、sessionKey、workSheetKey、ParameterSelectListおよびQueryOptionです。
ParameterSelectListは、選択されたパラメータのリストを渡す際に役立ちます。次のコードは、複数のパラメータおよび各パラメータの複数の値に使用します。
ParameterValue[] pval = new ParameterValue[1]; pval[0] = new ParameterValue(); pval[0].setValue("Aladdin"); pval[0].setDescriptorKey(null); pval[1] = new ParameterValue(); pval[1].setValue("A Few Good Men"); pval[1].setDescriptorKey(null); ParameterSelect[] pselect = new ParameterSelect[1]; pselect[0] = new ParameterSelect(); pselect[0].setKey(pKey); ArrayList pvallist = new ArrayList(); pvallist.add(pval[0]); pvallist.add(pval[1]); pselect[0].getValues().addAll(pvallist); ParameterSelectList pselectList = new ParameterSelectList(); ArrayList pselectlist = new ArrayList(); pselectlist.add(pselect[0]); pselectList.getSelParams().addAll(pselectlist);
QueryOptionは、結果セットのプロパティの制御に役立ちます。サポートされる結果タイプは、XMLROWSET、PDF、HTMLおよびXLSです。XMLROWSETタイプの場合、フェッチごとの行数を指定できます。
指定したQueryOptionsのうち、適用可能なオプションが考慮され、その他は破棄されます。
ResultType rt = new ResultType(); rt.setType("XMLROWSET"); QueryOption qo = new QueryOption(); qo.setChunkSize(1021); qo.setNoOfrows(25); qo.setResultType(rt); qo.setUserCredential(uc);
次のコードはクエリーを発行します。
QueryKey qKey = proxy.submitWorksheetQuery(sKey, wsKey,pselectList,qo); System.out.println("Query Key :" + qKey.getKey());
String status=""; String resultsReady = "Results Ready"; String cancelled = "Cancelled"; QueryStatus qs = null; while(!status.equalsIgnoreCase(resultsReady) && !status.equalsIgnoreCase(cancelled)) { qs = proxy.getQueryStatus(sKey, qKey); status = qs.getStatus(); System.out.println("Status :"+qs.getStatus()); Thread.sleep(5); }
クエリーが「準備完了」ステータスになったら、getWorksheetData() APIを使用してワークシート・データを取得できます。次のコードは、XMLROWSET結果タイプのワークシート・データを取得する方法を示しています。
if(qs!= null && qs.getStatus().equalsIgnoreCase(resultsReady)) { System.out.println("Invoking getWorksheetData() API"); QueryResult qr = null; do { qr = proxy.getWorksheetData(sKey, qKey,false); String data = qr.getData(); if (qo.getResultType().getType().matches("XMLROWSET") ) { System.out.println("------------Data block begin------------"); System.out.println(data); System.out.println("------------Data block end------------"); } }while(qr.isFinished()== false); }
次のコード・サンプルは、バイナリ・データ型(XLSなど)のワークシート・データを取得する方法を説明しています。
if(qs!= null && qs.getStatus().equalsIgnoreCase(resultsReady)) { System.out.println("Invoking getWorksheetData() API"); QueryResult qr = null; do { qr = proxy.getWorksheetData(sKey, qKey,false); String data = qr.getData(); if(qo.getResultType().getType().matches("XLS") ) { String opFilename = "/tmp/out.xls" ; else if Base64Decoder myBase64Decoder = new Base64Decoder(); byte _myTempByteArray [] = null; FileOutputStream fout = null; String opFilename = "/tmp/out.xls" ; try { fout =new FileOutputStream(opFilename); } catch(FileNotFoundException e) { System.out.println("Error Opening Output File"); return; } _myTempByteArray = myBase64Decoder.decode(data); fout.write(_myTempByteArray); } }while(qr.isFinished()== false); }
proxy.logout(sKey);
次に、Discoverer Webサービス呼び出すJavaクラス(wsiClient.java)の例を示します。
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.List; import java.util.Map; import javax.xml.ws.BindingProvider; import javax.xml.ws.WebServiceRef; import jaxwstest.proxy.Wsi; import jaxwstest.proxy.Wsi_Service; import jaxwstest.proxy.types.ConnectionKey; import jaxwstest.proxy.types.ConnectionList; import jaxwstest.proxy.types.DisplayName; import jaxwstest.proxy.types.FolderEntry; import jaxwstest.proxy.types.FolderEntryList; import jaxwstest.proxy.types.FolderEntryPath; import jaxwstest.proxy.types.Identifier; import jaxwstest.proxy.types.LocaleBean; import jaxwstest.proxy.types.QueryKey; import jaxwstest.proxy.types.QueryOption; import jaxwstest.proxy.types.QueryResult; import jaxwstest.proxy.types.QueryStatus; import jaxwstest.proxy.types.ResultType; import jaxwstest.proxy.types.SessionKey; import jaxwstest.proxy.types.UserCredential; import jaxwstest.proxy.types.WorkbookKey; import jaxwstest.proxy.types.Worksheet; import jaxwstest.proxy.types.WorksheetKey; import jaxwstest.proxy.types.WorksheetList; import oracle.net.www.Base64Decoder; public class wsiClient { @WebServiceRef private static Wsi_Service wsi_Service; public static void main(String[] args) { try { // Create a new stub wsi_Service = new Wsi_Service(); wsiProxy proxy = new wsiProxy(); Map requestContext = ((BindingProvider)proxy).getRequestContext(); requestContext.put(BindingProvider.USERNAME_PROPERTY,"weblogic"); requestContext.put(BindingProvider.PASSWORD_PROPERTY,"weblogic"); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,testEndpoint); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true); // Add your code to call the desired methods String version = proxy.getVersion(); System.out.println("Version ="+version ); DisplayName ssouser = new DisplayName(); ssouser.setUser("SSOUSER1"); Identifier idfr = new Identifier(); idfr.setId("IDENTIFIER"); UserCredential uc = new UserCredential(); uc.setDisplayName(ssouser); uc.setIdentifier(idfr); LocaleBean locale = new LocaleBean(); locale.setCountry("US"); locale.setLanguage("en"); locale.setVariant(""); System.out.println("Invoke the login() WS API"); SessionKey sKey = proxy.login(uc, locale); System.out.println("Session Key :"+sKey.getKey()); System.out.println("-----------------------------------------------"); // Get the list of connections accessible to this SSOUser System.out.println("Invoke the getConnectionList() API"); ConnectionList cl = proxy.getConnectionList(sKey); List conns = cl.getConnections(); System.out.println("Discoverer connections:"); for(int i=0; i<conns.size(); i++) { System.out.println("Name:"+conns.get(i).getConnectionName().getName()); System.out.println(" Key:"+ conns.get(i).getConnectionKey().getKey()); System.out.println(" Desc:"+ conns.get(i).getConnectionDesc().getDesc()); } System.out.println("-----------------------------------------------"); System.out.println("Invoke the getFolderEntryList() API"); // Create a valid connectionKey object using one of the connection keys obtained in the getConnectionList ConnectionKey cKey = new ConnectionKey(); cKey.setKey("CONNECTIONKEY"); FolderEntryPath fPath = new FolderEntryPath(); fPath.setPath(""); System.out.println("Invoke the getFolderEntryList() API"); FolderEntryList fList = proxy.getFolderEntryList(sKey, cKey, fPath); List fEntries = fList.getFolderEntries(); for(int i=0; i<fEntries.size(); i++) { System.out.println("Name:"+ fEntries.get(i).getName().getName()); System.out.println(" Path:"+ fEntries.get(i).getPath().getPath()); System.out.println(" Desc:"+fEntries.get(i).getDesc().getDesc()); System.out.println(" Type:"+ fEntries.get(i).getType().getType()); } System.out.println("-----------------------------------------------"); WorkbookKey wbKey = new WorkbookKey(); wbKey.setConnKey(cKey); wbKey.setKey("ANALYTIC_FUNCTION_EXAMPLES"); System.out.println("Invoke the getWorksheetList() API"); WorksheetList wsList = proxy.getWorksheetList(sKey, wbKey); List wsheets = wsList.getWorksheets(); for(int i=0; i<wsheets.size(); i++) { System.out.println("Name:" +wsheets.get(i).getName().getName()); System.out.println(" Key:"+wsheets.get(i).getKey().getKey()); } System.out.println("-----------------------------------------------"); WorksheetKey wsKey = new WorksheetKey(); wsKey.setWbKey(wbKey); wsKey.setKey("ANALYTIC_FUNCTION_EXAMPLES/1817"); System.out.println("Invoke the getLayoutMetadata() API"); Layout layout = proxy.getLayoutMetadata(sKey, wsKey); List dimensions = layout.getDimensions(); List measures = layout.getMeasures(); for(int i=0; i< dimensions.size(); i++) { System.out.println("Dimension :"+dimensions.get(i).getName()); } for(int i=0; i<measures.size(); i++) { System.out.println("Measure :"+measures.get(i).getName()); } System.out.println("-----------------------------------------------"); System.out.println("Invoke the getParameterMetaData() API"); ParameterList pList = proxy.getParameterMetadata(sKey, wsKey); List parameters = pList.getParameters(); for(int i=0; i< parameters.size(); i++) { System.out.println("Name:"+ parameters.get(i).getName().getName()); System.out.println(" Key:"+parameters.get(i).getKey().getKey()); } System.out.println("-----------------------------------------------"); ParameterKey pKey = new ParameterKey(); pKey.setKey("ANALYTIC_FUNCTION_EXAMPLES/1817/36211"); pKey.setWsKey( wsKey); ParameterValueList pvList = proxy.getParameterValueList(sKey,pKey,new Integer(50)); List pvs = pvList.getParamValues(); System.out.println("Invoke the getParameterValueList() API"); System.out.println("Parameter Lovs:"); for(int i=0; i< pvs.size(); i++) { System.out.println("Val :"+pvs.get(i).getValue()); // Lov System.out.println(" DescriptorKey :"+pvs.get(i).getDescriptorKey()); //paramter descriptor key. This is valid if the parameter is an indexed type; } ParameterValue[] pval = new ParameterValue[1]; pval[0] = new ParameterValue(); pval[0].setValue("Aladdin");
pval[0].setDescriptorKey(null); pval[1] = new ParameterValue(); pval[1].setValue("A Few Good Men"); pval[1].setDescriptorKey(null); ParameterSelect[] pselect = new ParameterSelect[1]; pselect[0] = new ParameterSelect(); pselect[0].setKey(pKey); ArrayList pvallist = new ArrayList(); pvallist.add(pval[0]); pvallist.add(pval[1]); pselect[0].getValues().addAll(pvallist); ParameterSelectList pselectList = new ParameterSelectList(); ArrayList pselectlist = new ArrayList(); pselectlist.add(pselect[0]); pselectList.getSelParams().addAll(pselectlist); ResultType rt = new ResultType(); rt.setType("XMLROWSET"); QueryOption qo = new QueryOption(); qo.setChunkSize(1021); qo.setNoOfrows(25); qo.setResultType(rt); qo.setUserCredential(uc); QueryKey qKey = proxy.submitWorksheetQuery(sKey, wsKey,pselectList,qo); System.out.println("Query Key :" + qKey.getKey()); String status=""; String resultsReady = "Results Ready"; String cancelled = "Cancelled"; QueryStatus qs = null; while(!status.equalsIgnoreCase(resultsReady) && !status.equalsIgnoreCase(cancelled)) { qs = proxy.getQueryStatus(sKey, qKey); status = qs.getStatus(); System.out.println("Status :"+qs.getStatus()); Thread.sleep(5); } if(qs!= null && qs.getStatus().equalsIgnoreCase(resultsReady)) { System.out.println("Invoking getWorksheetData() API"); QueryResult qr = null; do { qr = proxy.getWorksheetData(sKey, qKey,false); String data = qr.getData(); if (qo.getResultType().getType().matches("XMLROWSET") ) { System.out.println("------------Data block begin------------"); System.out.println(data); System.out.println("------------Data block end------------"); } }while(qr.isFinished()== false); } proxy.logout(sKey); } catch(Exception ex){ ex.printStackTrace(); } } }