ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Business Intelligence Discoverer WebサービスAPIユーザーズ・ガイド
11g リリース1(11.1.1)
E51913-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

1 Discoverer WebサービスAPIの概要

この章では、Discoverer WebサービスAPIの概要およびAPIの使用方法について説明します。項目は次のとおりです。

1.1 Simple Object Access Protocol

SOAP(Simple Object Access Protocol)は、Web上で情報を交換するためのXMLプロトコルに関するWorld Wide Web Consortium(W3C)勧告です。

1.2 Oracle BI Discoverer Webサービス

Oracle BI Discoverer Webサービスは、クライアントが次の処理を実行するためのApplication Programming Interface(API)の一部です。

1.3 Discoverer Webサービス用のSOAPエンドポイントのURL

Discoverer Webサービス用のSOAPエンドポイントのURLは、http(s)://<host>:<port>/discoverer/wsiです。

1.4 WSDLフォーマット

WSDL(Web Services Definition Language)フォーマットは、サービスおよびメソッドを公式に定義する業界標準であり、Discoverer Webサ―ビスAPIの定義に使用されます。サービスのプロキシ・クラスを自動的に生成できます。

注記

1.5 認証

Discoverer Webサービスは、信頼できるユーザーからのみアクセス可能です。自分のコードでこれらの資格証明を使用するためには、Discovererの中間層の管理者によって設定された信頼できるユーザー名とパスワードを取得する必要があります。

ユーザー資格証明を含むコードの例は、例1-4「保護されたWebサービスにアクセスするための資格証明の設定」を参照してください。

信頼できるユーザーを作成する方法の詳細は、「Discoverer Webサービスにアクセスするための信頼できるユーザーの定義」を参照してください。

1.6 サポートされているDiscoverer接続モード

現行リリースでは、Discoverer WebサービスでOracle Single Sign-On、Oracle Applications Single Sign-Onおよびパブリック接続がサポートされています。

1.7 Discoverer Webサービス・セッションの保守

Discoverer Webサービスは本質的にステートフルです。つまり、Webサービス・クライアント・スタブのインスタンスごとに、Discoverer Webサービスとの1つのHTTPセッションが必要です。このHTTPセッションを、すべてのクライアント・アプリケーション・ユーザーがすべてのWebサービス処理で使用できます。ユーザーごとに、クライアント・アプリケーションはDiscoverer Webサービスに新規ユーザー・セッションを通知するためにログイン・メソッドをコールする必要があります。各ユーザー・セッションは、Discovererセッション・プールから作成または再使用されたサーバー側の専用Discovererセッションと関連付けられます。関連付けられるDiscovererセッションは、ユーザーとのすべての相互作用で使用されます。クライアント・アプリケーションは、ユーザーのすべての操作が完了した後にログアウト・メソッドをコールする必要があります。

Webサービス・クライアントとサーバー間で確立されたHTTPセッションは、クッキーによって追跡され、Webサービスによって管理されます。

1.8 Discovererセッション・プールのサイズの管理

Discovererセッションはlogin()コールとそれに続くデータ・フェッチ処理が実行されるたびに必要となり、logout()コールが実行されるたびにリリースされるため、Discovererセッション・プールのサイズを把握しておくと役立ちます。

Oracle Fusion Middleware Controlを使用して、セッション・プールのサイズの最大値を設定できます(configuration.xmlで)。Discovererセッションのクリーン・アップ処理は定期的に実行され、失効したかまたは非アクティブなDiscovererSessionオブジェクトがあれば、プールから削除されます。

SSOusername、Connectionkey、Workbook、WorksheetおよびLocaleメソッドを使用して、新規ログイン・リクエストのためのDiscovererセッション割当てを最適化するために、どのDiscovererセッションを選択するかが決定されます。

1.9 可用性の要件

Discoverer Webサービスはクラスタに分散可能で、単一機器の故障がシステム全体の障害にはなりません。透過的フェイルオーバーはサポートされていないため、失敗時のイベントでは、新規ユーザー・セッションを作成するために各クライアントを再認証する必要があります。

1.10 エラー・メッセージ

WebサービスAPIコールで、クライアントの対処を必要する例外が発生することがあります。ログイン時に選択したロケールを使用して、エラー・メッセージが表示されます。

1.11 問題の診断方法

ログ・ファイルからおよびWebサービス例外から問題を診断できます。Oracle Fusion Middleware Controlを使用してログ・エントリを表示できます。詳細は、Oracle Fusion Middleware Oracle Business Intelligence Discoverer構成ガイドを参照してください。

1.12 Discoverer Webサービスを呼び出すための必要事項

Discoverer Webサービスを呼び出すには、次の条件を満たす必要があります。

1.12.1 Discoverer Webサービスにアクセスするための信頼できるユーザーの定義

Discoverer Webサービスにアクセスできるのは信頼できるユーザーのみです。信頼できるユーザーは、WebLogic Server管理コンソールを使用して作成します。ユーザーの作成の詳細は、WebLogic管理コンソール・オンライン・ヘルプのユーザーの作成に関する項を参照してください。


注意:

デフォルトで、「管理者」グループにはDiscovererアプリケーションのスコープ指定されたセキュリティ・ロールが割り当てられます。Discoverer Webサービスへのアクセスを提供するには、新規ユーザーを 「管理者」グループに追加します。

グループへのユーザーの追加の詳細は、WebLogic管理コンソール・オンライン・ヘルプのグループへのユーザーの追加に関する項を参照してください。


新規ユーザーがDiscoverer Webサービスにアクセスできるようにするには、そのユーザーにDiscovererスコープ指定セキュリティ・ロールを割り当てる必要があります。セキュリティ・ロールへのユーザーの追加の詳細は、WebLogic管理コンソール・オンライン・ヘルプのロールへのユーザーの追加に関する項を参照してください。

1.12.2 Discoverer Webサービスへのアクセスの確認

Discoverer Webサービスを呼び出すためのJavaクラスを作成する前に、Discoverer Webサービスがインストールおよび設定されていることを確認する必要があります。

Discoverer Webサービスがインストールおよび構成されていることを確認するには、エンドポイントURLにアクセスします。URLにアクセスできない場合は、Discovererマネージャに問い合せてください。

リンクhttp://<host>:<port>/discoverer/wsiにナビゲートします。

前のステップで作成したユーザー/パスワードの入力が求められます。

注意: インストール時に入力した「weblogic」ユーザーのユーザー名とパスワードも使用できます(詳細は中間層の管理者に問い合せてください)。

1.12.3 Oracle Fusion Middleware Controlを使用したDiscoverer Webサービスの値の設定

Fusion Middleware Controlを使用してDiscoverer WebサービスのmaxSessions設定を構成する必要があります。この設定は、同時に有効にできるDiscovererセッションの最大数を指定します(推奨値は20です)。

Fusion Middleware Controlを使用したDiscoverer Web Servicesの構成に関する詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Discoverer構成ガイド』を参照してください。

1.12.4 Webサービス・クライアント・スタブの作成(Webサービス・プロキシ)

Webサービス・クライアント・ライブラリからプロキシ/クライアント・ファイルを生成できます。Oracle Webサービスには、この目的のためのライブラリが用意されています。詳細は、Oracle Fusion Middleware Oracle Web Services開発者ガイドを参照してください。

Discoverer WSDL URLからDiscoverer Webサービス・クライアントを生成する手順は、次のとおりです。

  1. Webブラウザを表示します。

  2. Discoverer WSDL URL: http://<host>:<port>/discoverer/wsi?wsdlにアクセスします。

    詳細は、「WSDLフォーマット」「生成済Webサービス・クライアント・スタブを使用してWebサービスを呼び出すためのクライアント・アプリケーションを記述」を参照してください。

1.12.5 セッション保守プロパティの設定

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.12.6 生成済Webサービス・クライアント・スタブを使用してWebサービスを呼び出すためのクライアント・アプリケーションを記述

基本的なクライアント・アプリケーションのコードの例を次に示します。

例1-1 Javaクラスの定義

class webserviceclient
{
public static void main(String[] args)
{
}
}

例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を設定してください。

1.13 Discoverer WebサービスAPIにアクセスして結果を返すイベントの標準フロー

クライアント・アプリケーションでDiscoverer WebサービスAPIを使用して、Discoverer接続およびワークシートに関連するXMLデータを取得できます。イベントの標準フローを次に示します(詳細は、「イベントの標準フロー: 詳細なタスク例」を参照)。

イベントの標準フロー

  1. 「資格証明の提供によるDiscoverer Webサービスの呼出し」

  2. 「識別子の使用によるlogin()の呼出し」

    これによりユーザー・セッションが開始され、有効なセッション・キーが提供されます。


    注意:

    Oracle E-Business Suiteユーザーは、AppConnect() APIを使用してセッション・キーを生成する必要があります。詳細は、「Oracle E-Business SuiteユーザーのためのDiscoverer Webサービスへのセキュアなアクセス」を参照してください。

  3. 「getConnectionList()の呼出しによる接続情報の検証」

    クライアントが表示および選択に使用できる接続リストが返されます。

  4. 「特定の接続の選択およびgetFolderEntryList()の呼出し」

    ユーザーの表示および選択に使用できるワークブックのリストが返されます。

    OLAP接続の場合は、フォルダとワークブックが返される場合もあります。

  5. 「getWorksheetList()の呼出しによる特定のワークシートの選択」

    ワークシートのリストのみが空のパラメータ情報とともに返されます。

  6. 「getLayoutMetadata()の呼出しによるワークシートのレイアウトの取得」

  7. 「getParameterMetadata()の呼出しによるワークシートのパラメータ・メタデータの選択」

  8. 「getParameterValueList()の呼出しによるワークシート・パラメータの選択およびLOVの取得」

    クライアントがユーザーの表示および選択に使用するLOVデータのまとまりが返されます。

    または、getCascadeParameterValueList()を呼び出すことによって、カスケード・スタイルのワークシート・パラメータを選択することもできます。詳細は、「getCascadeParameterValueList()の呼出しによるカスケード・スタイルのワークシート・パラメータの選択とLOVの取得」を参照してください。

    注意: ワークシートにパラメータが含まれない場合、クライアントはgetParameterValueList()またはgetCascadeParameterValueList()を呼び出すことができません。

  9. 「submitWorksheetQuery()の呼出しによるワークシート・クエリーの発行(パラメータも含む)」

    クライアントは必要に応じてパラメータを渡して、発行を実行します。

    ワークシート・クエリー・リクエストが発行されると、queryKeyが取得されます。

  10. 「getQueryStatus()の呼出しによるクエリー・ステータスの確認」

    ユーザーの表示および選択に使用できるクエリーの現在のステータスが返されます。

  11. 「getWorksheetData()の呼出しによるクエリー完了時のワークシート・データの表示」

  12. 「Logout()の呼出しによるログアウト」

注意: クエリーは順次実行し、クライアント・アプリケーションがユーザーに対して1つのログオン・コールを実行する際、前のクエリー発行の結果が出るのを待ってからワークシートのクエリー発行が行われるようにする必要があります。

注意: OLAPワークシートでは、XMLに総計が含まれていることがあります。その場合、APIクライアントが総計の入ったOLAPワークシートについて合計を作成すると、誤った結果が生成されます。

1.14 イベントの標準フロー: 詳細なタスク例

次のイベント・フローは、各タスク例の標準的なJavaクラス・エントリを示しています。

1.14.1 資格証明の提供によるDiscoverer Webサービスの呼出し

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);

1.14.2 識別子の使用によるlogin()の呼出し

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として提供します。

1.14.3 Oracle E-Business SuiteユーザーのためのDiscoverer Webサービスへのセキュアなアクセス

login() APIを使用するかわりに、Oracle E-Business Suiteユーザーは、AppsConnect() APIを使用してセキュアなチケットと接続詳細を指定し、Discoverer Worksheetsにアクセスできます。


注記

  • Oracle E-Business Suiteユーザーは、Single Sign-On (SSO)またはOracle Access Manager (OAM)認証は使用できません。DiscovererのSSOまたはOAMを有効化および無効化する方法の詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Discoverer構成ガイド』を参照してください。

  • AppsConnect()コールは、他のDiscoverer Webサービスを呼び出す前に呼び出す必要があります。


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では、TicketConnectStringおよび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セッションが開始されます。

1.14.4 getConnectionList()の呼出しによる接続情報の検証

ログイン後、ユーザーは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());
}

1.14.5 特定の接続の選択およびgetFolderEntryList()の呼出し

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()); 
}

注記

  • リレーショナル・データベース接続では、フォルダ・パスは空の文字列になります。OLAP接続では、完全なフォルダ名を指定します。

    • リレーショナル・データベースでは、Typeは常に"Workbook"になります。OLAP接続の場合は、"Folder"をTypeとみなします。


1.14.6 getWorksheetList()の呼出しによる特定のワークシートの選択

getWorksheetList() APIを使用して、指定されたワークブックのワークシートのリストを取得します。


注意:

Oracle E-Business Suiteユーザーは、AppsConnect() APIを使用してDiscovererに接続するため、ConnectionKeyを作成する必要はありません。Discovererに接続した後、getWorksheetList() APIを呼び出すために、ワークブックに関連付けられたConnectionKeyNULLまたは空の文字列として渡します。

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サービス・コールのワークシート・キーとして使用できます。

1.14.7 getLayoutMetadata()の呼出しによるワークシートのレイアウトの取得

この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());
}

1.14.8 getParameterMetadata()の呼出しによるワークシートのパラメータ・メタデータの選択

この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は空のリストを返します。

1.14.9 getParameterValueList()の呼出しによるワークシート・パラメータの選択およびLOVの取得

この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;
}

1.14.10 getCascadeParameterValueList()の呼出しによるカスケード・スタイルのワークシート・パラメータの選択とLOVの取得

この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 );

1.14.11 submitWorksheetQuery()の呼出しによるワークシート・クエリーの発行(パラメータも含む)

この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());

1.14.12 getQueryStatus()の呼出しによるクエリー・ステータスの確認

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);
}

1.14.13 getWorksheetData()の呼出しによるクエリー完了時のワークシート・データの表示

クエリーが「準備完了」ステータスになったら、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);
}

1.14.14 Logout()の呼出しによるログアウト

proxy.logout(sKey);

1.15 Discoverer Webサービスを呼び出すJavaクラスの例

次に、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(); } } }