プライマリ・コンテンツに移動
Oracle® Enterprise Manager Cloud Control拡張プログラマーズ・リファレンス
12cリリース4 (12.1.0.4)
B70762-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

9 管理ユーザー・インタフェースの定義

検出、監視および自動化の導入を介して、新規ドメインの管理サポートするように、Enterprise Managerを拡張できます。Enterprise Managerフレームワークがこれらの管理機能に関連する一連の強力な機能を提供する際には、ほとんどのプラグイン開発者は、ドメインに適した方法で、管理機能を公開する必要があります。Enterprise Managerのメタデータ・プラグイン・カスタム・ユーザー・インタフェース(MPCUI)機能によって、この機能が提供されます。

この章の内容は次のとおりです。

9.1 管理ユーザー・インタフェースの定義の概要

プラグイン開発者は、ターゲット・タイプを管理するカスタム・ユーザー・インタフェースの定義について、次の手順に従う必要があります。


注意:

このドキュメントに加えて、拡張開発キット(EDK)には、このプロセス中に参考にする完全なサンプル実装が含まれています。

  1. 次のようなターゲットのモデルを決定します。

    • 他のターゲットとのアソシエーション

    • パフォーマンス・メトリックおよび構成データ

    • ターゲットのサブコンポーネント

    • 管理タスクおよび管理操作

  2. 次のような、MPCUIライブラリによって提供される機能を把握しておきます。

    • 使用可能なUIコンポーネント(ページ、グラフなど)

    • 使用可能なサービス(メトリック・データ、SQL問合せ、アソシエーション、タスク実行など)

    • メタデータのみの実装とFlex実装との機能の相違点

    • サンプル実装およびその構築方法

  3. 次に基づいたUIを設計します。

    1. 重要なデータおよびタスク

    2. MPCUIによって提供される機能

    これには、ページの作成とそのコンテンツの説明、および、適切な管理機能を公開していることを確認するためのドメイン・エキスパートによるページのレビューが含まれます。

  4. メタデータのみまたはFlexの実装オプションを選択します。

    詳細は、9.3項「プラグイン用のUIオプション」を参照してください。


    注意:

    後で必要な場合、メタデータのみのアプローチをFlex実装に容易に移行できます。詳細は、9.8項「FlexベースUIへのメタデータベースUIの変換」を参照してください。

  5. 設計でのアイテム用のターゲット・メタデータを作成します(手順1を参照)。このメタデータは、後でUIを実装するために必要です。ターゲット・メタデータの詳細は、このガイドの関連する章を参照してください。

  6. UIで表示される構成データを取得するために必要なSQL問合せを開発します。通常、これらの問合せは、構成CM$ビューを参照します。

    構成データの詳細は、第7章を参照してください。

  7. ページ、ウィザードおよびダイアログなどのUIを構成するアクティビティを特定および定義します。統合メタデータは、これらのアクティビティを定義します。

    詳細は、9.5.2項「統合メタデータの定義」を参照してください。

  8. Flex実装オプションを選択した場合、9.1.1項「Flex実装」での手順を続行します。それ以外の場合、9.1.2項「メタデータのみの実装」での手順を続行します。

9.1.1 Flex実装

Flex実装オプションを使用している場合、次の手順を実行します。

  1. Adobe Flash Builderのコピーを取得するか、Adobe Flexのソフトウェア開発キット(SDK)をダウンロードします。

    詳細は、9.30項「開発環境オプション」を参照してください。


    注意:

    Adobe Flex SDKは無料ですが、グラフィカル編集機能やデバッグ機能は提供されません。

  2. カスタムUIのソース・コードを保持するためのプロジェクト(Adobe Flash Builderを使用している場合)を作成します。テンプレートとしてEDKに含まれているサンプル・プロジェクトを使用できます。プロジェクトの設定が正しいことを確認します。

    詳細は、9.30.2項「Adobe FlashまたはFlex BuilderでのMPCUIの開発」を参照してください。

  3. MpApplicationクラスを拡張するMXMLクラスを実装します。これはFlexアプリケーションのクラスです。

    詳細は、9.6項「MPCUIアプリケーションの定義」を参照してください。

  4. Integrationクラスを拡張するMXMLクラスを実装します。これは、カスタムUIに含まれる一連のアクティビティを定義します。

    詳細は、9.6.1項「アプリケーション・アクティビティ(統合クラス)の定義」を参照してください。

  5. 各アクティビティ(ページやダイアログなど)を開発します。通常、各ページには、ページ・クラス(MXMLで記述され、Pageクラスを拡張する)およびコントローラ・クラス(ActionScriptで記述され、ActivityControllerクラスを拡張する)が含まれています。

    詳細は、9.6.2項「ページの定義」9.6.3項「ダイアログの定義」および9.6.4項「トレインおよびトレイン・ページの定義」を参照してください。

  6. Adobe Flash Builderから、カスタムUIをビルドおよびテストします。


    注意:

    ビルドおよびテストの前に、少なくとも1つのプラグインのバージョンをデプロイする必要があります。デプロイされたプラグインには、ターゲット・メタデータ(メトリックおよび構成データなど)が含まれている必要があります。ただし、プラグインには、テスト用にMPCUIメタデータを含める必要はありません。

  7. MPCUIメタデータ・ファイルを作成します。

    このファイルには、次のものが含まれます。

    • カスタムUIによって使用されたSQL文

    • UIで定義された別のページへのナビゲーションをサポートするために含めるメニュー項目

    • ビルドするFlex UIへの参照

    詳細は、9.4項「MPCUIメタデータ・ファイルの作成」を参照してください。

  8. Adobe Flash BuilderでビルドされたMPCUIメタデータ・ファイルおよびSWFファイルを含めるよう、プラグインを変更します。

    プラグイン・ステージング領域のoms/metadata/mpcuiディレクトリに、これらのファイルを置きます。

    詳細は、9.7項「プラグインとのMPCUI実装のパッケージ化」を参照してください。

  9. Enterprise Managerコンソールからターゲットのホームページにアクセスすることによって、カスタムUIをテストします。

    これにより、Enterprise ManagerアプリケーションのコンテキストにカスタムUIがロードされ、Enterprise Managerアプリケーションおよびターゲット・メニューが表示されます。

このドキュメント以外に、Flexコンポーネントで開発を行うための追加のリソースが用意されています。

  • APIリファレンス: これはパートナEDKディレクトリのdoc/sdk_api_ref.htmlの下にあります。

  • HostSampleのプラグイン例: Oracleが提供するサンプル・プラグインが数多くのMPCUI機能の例を提供しています。これはEDKのsamples/plugins/HostSampleの下にあります

ベースFlexコンポーネント(ボタンやラベルなど)も含む可能性があります。EDKの一部としてFlexコンポーネントのドキュメントを提供しませんが、次のリンクからオンラインでドキュメントを確認できます:

http://helpx.adobe.com/flex.html

9.1.2 メタデータのみの実装

メタデータのみの実装オプションを使用している場合、次の手順を実行します。

  1. MPCUIメタデータ・ファイルを作成します。

    このファイルには、次のものが含まれます。

    • カスタムUIによって使用されたSQL文

    • UIで定義された別のページへのナビゲーションをサポートするために含めるメニュー項目

    • 次の各手順で説明するすべてのメタデータ定義

    詳細は、9.4項「MPCUIメタデータ・ファイルの作成」を参照してください。

  2. 統合メタデータをMPCUIメタデータ・ファイルに追加します。

    統合メタデータは、カスタムUIに含まれる一連のアクティビティを定義します。

    詳細は、9.5.2項「統合メタデータの定義」を参照してください。

  3. ページ定義(ActivityDefinitions)をMPCUIメタデータ・ファイルに追加します。

    詳細は、9.5.3項「ナビゲーションの定義」を参照してください。

  4. MPCUIメタデータ・ファイルを含めるよう、プラグインを変更します。

    プラグイン・ステージング領域のoms/metadata/mpcuiディレクトリに、これらのファイルを置きます。

    詳細は、9.7項「プラグインとのMPCUI実装のパッケージ化」を参照してください。

  5. Enterprise Managerコンソールからターゲットのホームページにアクセスすることによって、カスタムUIをテストします。

    これにより、Enterprise ManagerアプリケーションのコンテキストにカスタムUIがロードされ、Enterprise Managerアプリケーションおよびターゲット・メニューが表示されます。

9.1.3 前提条件

この章では、次の内容を十分に理解していると想定します。

  • プラグインとそのXMLファイルのパッケージ化の方法を含む、プラグイン開発の概要。

  • MXMLと呼ばれるXMLベースのユーザー・インタフェース・マークアップ言語

9.2 MPCUIの概念

MPCUIフレームワークを使用する際に、理解しておく必要がある重要な概念がいくつかあります。これらの概念は、この項で簡単に定義し、以降の項で詳しく説明します。

9.2.1 統合クラス

統合クラスはアプリケーションのブートストラップで、アプリケーションに含める一連のページ、ダイアログおよびトレインを定義するために使用されます。MPCUIフレームワークは、統合クラスに含まれる情報を使用して、UI要素間のナビゲーションの管理など、アプリケーションを駆動します。

9.2.2 アクティビティ

MPCUIで最上位のUI要素は、通常、アクティビティと呼ばれます。アクティビティには、ページ、ダイアログ、トレインとトレイン・ページ、URL、およびジョブがあります。

9.2.3 ページ

ページは、UIの構成を単純化し、より大規模なEnterprise Managerコンソールに必然的に適合するようにするためにMPCUIフレームワークによって提供される構造ですが、Flexにはページの概念がありません。

MPCUIフレームワークは、ページ間の単純なナビゲーションを提供し、ページをブラウザ履歴およびEnterprise Managerメニュー・システムに統合して、アプリケーション内でページを管理します。

9.2.4 サービス

MPCUIフレームワークは、Management Serverからデータを取得したり、アクション(ジョブまたはリモート操作)を処理するために使用できる一連のサービスを提供します。

9.2.4.1 データ・サービス

MPCUIによって提供されるデータ・サービスには、メトリック・データ、アソシエーション、ターゲット・プロパティなどを取得するためのデータ・サービスが含まれます。これには、プラグイン内の名前付きSQL文を実行するために使用できるSQLDataServiceが含まれています。

9.2.4.2 操作サービス

MPCUIには、プラグイン・コードによって管理されたターゲットに対する管理アクションを実行するために使用できるジョブ・サービスおよびRemoteOpサービスが含まれています。

  • ジョブ・サービスは、プラグインにジョブ・タイプ定義を含める必要があります。

  • RemoteOpサービスは、プラグイン・フレームワークにスクリプトを登録する必要があります。

9.2.4.3 非同期サービスのリクエスト処理

Adobe FlexおよびAdobe Flashフレームワーク(したがってMPCUIフレームワーク)は、ネットワーク・リクエストを非同期に処理します。これは、リクエストがサーバーに作成される結果ハンドラ・パターン使用する必要があり、リクエストの一部として、ハンドラ(またはコールバック)がリクエストに登録されます。リクエストの完了時(またはフォルトが発生した場合)に、ハンドラが呼び出され、結果を渡します。

9.2.5 URL

MPCUIでは、URLの生成に関連する多くの異なる機能、および次へのリンクを埋め込む機能が提供されます。

  • Enterprise Managerの他のページ

  • MPCUIアプリケーション内の他のページ

  • 外部のページ

MPCUIはFlexアプリケーションであるため、これは、URLへのリンクの埋込みほど容易ではありません。URLの詳細は、9.10.2項「URLおよびリンク」を参照してください。

9.3 プラグイン用のUIオプション

メタデータ・プラグイン用のUIオプションは、次のとおりです。

  1. 制限された情報を含み、カスタマイズを行わない、デフォルトのホームーページを使用します。

  2. ホームページのカスタマイズを含むメタデータ・プラグイン(リリース10.2または11.1)を変換します。リリース11.1と同じ情報を含むが、カスタマイズを行わないホームーページを提供します。詳細は、9.31項「ホームページのカスタマイズの移行」を参照してください。

  3. MPCUIを使用したメタデータのみの実装。カスタマイズされているが制限のあるUIを提供します。詳細は、9.3.1項「メタデータのみの実装」を参照してください。


    注意:

    メタデータのみを使用してUIを実装できます。その後、Flex実装でのみ使用可能な機能を追加する場合、Flex実装を作成するように、メタデータのみの実装を展開します。詳細は、9.8項「FlexベースUIへのメタデータベースUIの変換」を参照してください。

  4. MPCUIを使用したFlex実装。より複雑な実装ですが、最も柔軟性があり多くの機能が提供されます。詳細は、9.3.2項「Flex実装」を参照してください。

9.3.1 メタデータのみの実装

MPCUIメタデータは、UIのレイアウトおよびEnterprise Managerサービスへのバインディングを記述するXMLです。MPCUIメタデータの詳細は、9.4項「MPCUIメタデータ・ファイルの作成」を参照してください。

デモ・ホスト・サンプル(demo_hostsample)を開始点として使用するか、または新しいUIを開発できます。UIは、少なくとも1つのページ(ホームページ)を含める必要があり、オプションで他のページを含めることもできます。各ページ定義は、MPCUIメタデータ・ファイルに含まれます。

各ページのメタデータの説明に加えて、メタデータは、統合定義も含める必要があります。統合の定義の詳細は、9.5.2項「統合メタデータの定義」を参照してください。

9.3.2 Flex実装

Flex実装オプションは、ジョブまたはエージェント・スクリプトとしてプラグインに含まれる管理機能の上にカスタマイズされたUIを提供するための、追加の機能を提供します。

MPCUIフレームワークの目標の1つが、実装されるFlexフレームワークの上に単純化された抽象のレイヤーを提供することであるとき、Flexフレームワークと、Flexフレームワークを使用した開発方法を熟知している必要があります。

9.3.2.1 MXML

Flexには、ユーザー・インタフェースを配置し、データ要素にUIコンポーネントをバインドするために使用できるタグ言語(MXML)が含まれます。MPCUIを使用して行うことの多くは、MXMLで実行できます。


注意:

MXMLは、メタデータのみの実装およびFlexベースの実装に使用されます。
  • メタデータのみの実装の場合、MXMLを使用して、MPCUIメタデータ・ファイル内のすべてのページを定義します。詳細は、9.5.2.1項「ページの定義」を参照してください。

  • Flexベースの実装の場合、SWFファイルにコンパイルするための別のMXMLファイルに、各ページのメタデータを保存します。詳細は、9.6.2項「ページの定義」を参照してください。


9.3.2.2 ActionScript

データまたはイベントのより複雑な処理を必要とする場合、ActionScript (ECMAスクリプト準拠のプログラミング言語)を使用してUIの一部を開発する必要があります。Javaを熟知している開発者は、ActionScriptをすぐに使いこなせるようになります。

9.3.2.3 SWFバイナリ・ファイル

Flexアプリケーションをビルドする際に、MXMLおよびActionScriptは、バイナリ・ファイルを形成するようコンパイルされます。このバイナリ形式(*.swf)はプラグインに含まれ、実行時にAdobe Flash Playerによって解釈されます。Enterprise Managerの拡張フレームワークおよびMPCUIフレームワークは、特に、Enterprise Managerの必要なラッパー・ページとのSWFの統合を処理し、実行時にそのページのレンダリングを処理します。カスタムUIの表示を有効化するために、追加のApplication Development Framework (ADF)、HTMLまたはJavaScriptを構築する必要はありません。

9.3.2.4 ホームページの定義

MPCUIコンポーネントおよびサービスを使用してページおよびカスタムUIを定義し、プラグインの一部として出荷されるAdobe Flexアプリケーションをビルドすることによって、UIをビルドします。このオプションによって、柔軟性およびUIの制御が提供されますが、MPCUIフレームワークによって提供されるコンポーネントおよびサービスを理解するためにさらに努力する必要もあります。

ホームページのテンプレートへの変更が単純な場合、ページを説明するメタデータを送信するMPCUIフレームワーク機能を利用するため、Flexアプリケーション(MPCUI SWF)をビルドおよびパッケージ化するための要件を回避します。

9.4 MPCUIメタデータ・ファイルの作成

MPCUIが含まれる各プラグインは、MPCUIメタデータ・ファイルを含める必要があります。

メタデータ・ファイルは、次を行います。

  • MPCUIで必要なSQL問合せを定義します。

  • MPCUIで必要なメニュー項目を定義します。

  • UIメタデータ(カスタムUIのレイアウト)を含めます(メタデータベースのオプションのみ)。

  • SWF (MPCUIを含むファイル名)を指定します(Flexベースのオプションのみ)。

  • ターゲット・アイコン、ターゲット・ナビゲータ、およびシステムのホームページのオプションを指定します。

  • 検出SWF (ガイドされた検出UIを含むファイル名)を指定します(Flexベースのオプションのみ)。

このファイルの構文の詳細は、拡張開発キット(EDK)仕様にあるXSDファイルを参照してください。

例9-1に、メタデータベースUIのMPCUIメタデータ・ファイルのサマリーを示し、例9-2に、Flex UIのメタデータ・ファイルのサマリーを示します。

例9-1 メタデータベースUIのMPCUIメタデータ・ファイル

  <CustomUI target_type="demo_hostsample"
                 xmlns="http://www.oracle.com/EnterpriseGridControl/MpCui">
 
    <!-- SqlStatements defines the individual SQL statements that are used by
       the MPCUI code.  Each statement is identified by a unique name and 
       can only be referenced by that name from the MPCUI code itself -->
    <SqlStatements>
      <Sql name="INSTANCE_INFO">
          select * from...
      </Sql>
    </SqlStatements>

  <UIMetadata>
    <Integration>
    .....
    </Integration>

    <ActivityDefinition
    .....
    </ActivityDefinition

  </UIMetadata>
 
    <!-- MenuMetadata defines the set of menu items that should appear in the 
         target menu on the homepage and specifies which of the MPCUI pages
         should be accessed from that menu item -->
    <MenuMetadata>
      <menu label=”Host Sample”>
        <menuItem>
          <command .. />
        </menuItem>
      </menu>
    </MenuMetadata>
 
    <EmuiConfig>
      <context-pane-visible>true</context-pane-visible>
      <large-icon>dhs_large.png</large-icon>   
      <small-icon>dhs_small.png</small-icon>
      <use-framework-homepage>true</use-framework-homepage>
    </EmuiConfig>

  </CustomUI>

例9-2 FlexベースUIのMPCUIメタデータ・ファイル

  <CustomUI target_type="demo_hostsample"
                 xmlns="http://www.oracle.com/EnterpriseGridControl/MpCui">
 
    <!-- 
    SQL Statements to be used by the custom UI code.  All bind variables should be
    identified using "?VAR?" type notation, and can then be referenced using
    either the SQLDataService MXML tag or using the SQL or BatchSQL services.
    -->
    <SqlStatements>
      <Sql name="INSTANCE_INFO">
          select * from...
      </Sql>
    </SqlStatements>

    <!--
      SwfFiles tag is used to register the Flex application (must extend
      MpApplication) that includes the custom UI for the plug-in.
      The SWF file registered must be included in the plug-in along with this
      meta-data in the oms/metadata/mpcui directory.
    -->
   <SwfFiles>
      <Swf is_homepage="true">HostSample.swf</Swf>
      <Swf discovery_module="DemoHostSample">HostSampleDiscovery.swf</Swf>
    </SwfFiles>

    <!-- MenuMetadata defines the set of menu items that should appear in the 
         target menu on the homepage and specifies which of the MPCUI pages
         should be accessed from that menu item -->
    <MenuMetadata>
      <menu label=”Host Sample”>
        <menuItem>
          <command .. />
        </menuItem>
      </menu>
    </MenuMetadata>

    <EmuiConfig>
       <large-icon>dhs_large.png</large-icon>   
       <small-icon>dhs_small.png</small-icon>
    </EmuiConfig>
 
  </CustomUI>

9.4.1 MPCUIメタデータ要素の概要

表9-1では、検出メタデータを定義する重要な要素について説明します。

表9-1 検出メタデータを定義するために使用する重要な要素

要素 説明

SqlStatements

SqlStatements要素には、管理リポジトリに格納された情報にアクセスできるSQL文が含まれます。これらのSQL文の詳細は、9.11.4項「パッケージ化されたSQLおよび問合せサービス」を参照してください。

UIMetadata (メタデータベースUIのみ)

UIMetadata要素は、メタデータで説明された統合およびページ(アクティビティ)の定義の最上位のコンテナです。

<UIMetadata>
  
  <!-- The meta-data only definition must include an Integration element 
  which defines the set of activities (pages, dialogs, etc.) that make up
  the application -->
  <Integration>
    <intg:Integration targetType='demo_hostsample' xmlns:intg="oracle.sysman.emx.intg" >
    ..
    </intg:Integration>
  </Integration>
    
  <!-- The meta-data only definition must include 1 or more ActivityDefinition
  elements each of which defines an activity (e.g. page, dialog, etc.) -->
  <ActivityDefintion>
    <intg:Page id=”homePg” label=”Home Page” ...>
    </intg:Page>
  </ActivityDefintion>
 
</UIMetadata>

Integration (メタデータベースUIのみ)

Integration要素は、一連のページを指定し、そのページ間のタスク・フロー(必要な場合)を定義するために使用される統合メタデータを定義します。統合メタデータの定義の詳細は、9.5.2項「統合メタデータの定義」を参照してください。

ActivityDefinition (メタデータベースUIのみ)

ActivityDefinition要素は、UIにページ間のナビゲーションを定義します。ナビゲーションの定義の詳細は、9.5.3項「ナビゲーションの定義」を参照してください。

SwfFiles (Flex UIのみ)

SWFfiles要素は、SWFファイルの名前を指定します。

MenuMetadata

MenuMetadata要素には、MPCUIメタデータで定義されたアクティビティへのナビゲーションを定義するmenuItem要素が含まれます。MenuMetadata要素の詳細は、9.5.3項「ナビゲーションの定義」を参照してください。

EmuiConfig

EmuiConfig要素には、次を定義するための要素が含まれます。


9.5 メタデータの定義

MPCUIメタデータ実装の完全な例は、拡張開発キット(EDK)で提供されるデモ・サンプル実装(demo_hostsample_uimd_fullmd.xml)を参照してください。

9.5.1 メタデータ実装の制限事項

この実装ではページの定義のみがサポートされ、ダイアログやトレインの定義はサポートされません。カスタムUIがダイアログまたはトレインを必要とする場合、ホームページをビルドするには、Flexベースのオプションを使用する必要があります。詳細は、9.3.2項「Flex実装」を参照してください。

表示するデータの操作を実行する機能、または、UIイベントに応答し、ジョブやリモート操作を起動する機能は、この実装では使用できません。

9.5.2 統合メタデータの定義

統合メタデータを使用して、一連のページを指定し、そのページ間のタスク・フロー(必要な場合)を定義します。

例9-3 統合メタデータ

    <Integration> 
       <mp:Integration targetType="demo_hostsample" xmlns:mp="http://www.oracle.com/mpcui">
         <mp:PageActivityDef id="homePg" label="Home" isDefaultPage="true" />  
         <mp:PageActivityDef id="perfPg" label="Performance" />
         <mp:PageActivityDef id="processesPg" label="Processes" />
         <mp:PageActivityDef id="adminPg" label="Configuration" /> 
         <mp:DialogActivityDef id="detailsDialog" label="Metrics Detail" /> 
         <mp:DialogActivityDef id="metricHistory" label="Metric History">
           <mp:inputParams>
             <mp:InputParam name="targetName" /> 
             <mp:InputParam name="targetType" /> 
             <mp:InputParam name="metric" /> 
             <mp:InputParam name="columns" /> 
             <mp:InputParam name="period" /> 
             <mp:InputParam name="title" /> 
           </mp:inputParams>
         </mp:DialogActivityDef>
         <mp:DialogActivityDef id="metricDetails" label="Metric Details">
           <mp:inputParams>
             <mp:InputParam name="targetName" /> 
             <mp:InputParam name="targetType" /> 
             <mp:InputParam name="metric" /> 
             <mp:InputParam name="columns" /> 
             <mp:InputParam name="period" /> 
             <mp:InputParam name="title" /> 
           </mp:inputParams>
         </mp:DialogActivityDef>
       </mp:Integration>
    /<Integration>

9.5.2.1 ページの定義

ページ・メタデータは、ページを構成するコンポーネントやページ上に表示されるデータなど、ページのレイアウトを定義します。各ページは、独自のXMLに含まれ、統合メタデータ内でページに指定された同じアクティビティ識別子を使用して、ホームページのメタデータ登録サービス(MRS)に登録する必要があります。統合メタデータの詳細は、9.5.2項「統合メタデータの定義」を参照してください。


注意:

ページを定義するために使用されるタグ言語は、Flexベースの実装でサポートされているタグ言語のサブセットです。次を行うことによって、メタデータ・ファイルで定義されたページを取得し、それをMPCUIアプリケーション(SWFファイル)の一部であるページにすることができます。
  • XMLからMXMLへのファイル拡張子の変更

  • ファイルの上部での適切なMXMLネームスペースの追加

詳細は、9.8項「FlexベースUIへのメタデータベースUIの変換」を参照してください。


例9-4は、メタデータ・ページ定義のサンプルの一部です。

例9-4 メタデータ・ページ定義

  <ActivityDefinition>
    <!--
      Each page included in the plugin UI should extend the Page class and be
      coded in MXML.
      The page file specifies the layout of the page, declares some of the data
      binding (see below) and specifies handlers for events that are initiated in
      the page, when a user clicks a button or link for example.  The page also
      has a controller class (that extends PageController)that is associated with
      the page.  The controller loads data shown in the page and includes
      functions that are called as event handlers.
    -->
    <mp:Page id="homePg" label="Home Page"   
             xmlns:mx="http://www.adobe.com/2006/mxml"
             xmlns:mp="http://www.oracle.com/mpcui" >

      <!-- 
          Data Services - these are sources of data that will be shown in the
          page. Data can either be bound from a data service declared here, or it
          may be loaded within the controller.
      -->
      <mp:services>
        <!--
          SQLDataService - this service allows you to execute a SQL query packaged
          with your plugin and then refer to the result set from the query
          execution. Properties passed to the query are declared as name-value
          pairs.  If the properties are runtime/dynamic properties then 
          you will have to use the SQL service within the controller, load the 
          data there and then map the result set to the page model.
        -->
        <mp:SQLDataService id="ids" queryID="INSTANCE_INFO" properties="{props('TARGET_GUID',appModel.target.guid)}" />

        <mp:SQLDataService id="cht1" queryID="CHTSQL1" properties="{props('HC_TARGET_GUID',appModel.target.guid)}" />   

        <!--
          MetricValuesDataService - this service allows you to obtain data for a
          metric, for some period of time.  This time period may be a historical
          time period, or it may be REALTIME which creates a data service that 
          will poll for the current value of the metric through the Agent.  
        -->
        <mp:MetricValuesDataService id="mv1" 
          flattenData="true"
          targetName="{appModel.target.name}" targetType="{appModel.target.type}" 
          metricName="CPUProcessorPerf"
          columns="{['CPUUser','CPUIdle']}"
          timePeriod="LAST_DAY" />     

        <!--
          AvailDataService - this service obtains target availability, that 
          includes current status, availability for the last 24 hours, and up
          since time.
        -->
        <mp:AvailDataService id="ads" targetName="{appModel.target.name}" targetType="{appModel.target.type}" />

        <!-- 
          AssociationService - this service obtains associated targets 
        -->
        <mp:AssociationDataService id="asc" targetName="{appModel.target.name}" targetType="{appModel.target.type}" assocTypes="{['hosted_by']}" /> 
      </mp:services>  

   <!-- 
          Page Content - the page should be laid out in a grid pattern using a
          combination or columns (VBox)and rows (HBox).  Also to ensure property
          sizing/resizing behavior relative height/width should be used in
          percentages. 
      -->
      <mx:VBox width="100%" height="100%">
          <!--
              1st Row - will occupy 30% of the height of the page and includes a
              Summary region, Availability region and Job Summary region. The
              Availability and Job Summary region require no parameters.  The
              Summary region uses the InfoDisplay component to show a series of
              name-value pairs.  Each item may also specify an optional
              destination and image.

              The example below also demonstrates the ways data may be bound to a
              UI component included in the page:

             1. Data Service Reference
             2. Global/Application Model Reference
             3. Page Model Reference 
             4. Set Directly from Controller
          -->
          <mx:HBox width="100%" height="30%">
              <mp:Region title="Summary" width="25%" height="100%"  >
                  <mp:InfoDisplay id="summaryInfo">
                      <mp:InfoItem label="CPU Model" value="{ids.result.getString(0,'CPU Model')}" />   <!-- ref to SQLDataService --> 
                      <mp:InfoItem label="Target Name" value="{appModel.target.name}" />   <!-- ref to global/application model -->
                      <mp:InfoItem label="Current Status" value="{ads.currentStatus}"  image="{ads.currentStatusIcon}" />   <!-- ref to AvailDataService -->
                      <mp:InfoItem source="{ads.statusSinceItem}" />   <!-- ref to AvailDataService -->
                  <!--    <mp:InfoItem label="{model.osVersLabel}" value="{model.osVersion}" /> -->   <!-- ref to page model; model set in controller in SQL svc handler -->
                  <!--    <mp:InfoItem id="infoItem" label="Controller Set" />   -->   <!-- value property set directly in controller -->
                      <mp:InfoItem label="Hosted By" value="{asc.assocs.getAssoc('hosted_by').name}" />   <!-- ref to AssociationService -->
                  </mp:InfoDisplay>
              </mp:Region>

              <!--
              <mp:AvailabilityRegion width="33%" height="100%" daySpan="1" />
              -->

              <mp:Region title="Memory Usage (Last 24 Hrs)" width="45%" height="100%">
                  <mp:AreaChart id="memHist" width="100%" height="100%" 
                               metricName="MemoryPerf"
                               metricColumns="['Active','MemFree']"
                               timePeriod="LAST_DAY" />
                <!--  <mp:Link label="Current" click="{controller.showCpuMetricDetails(event)}" /> -->
              </mp:Region>

              <mp:Region title="Memory Used (Current)" width="30%" height="100%">
                  <mp:LineChart id="memRt" width="100%" height="100%"
                               metricName="MemoryPerf"
                               metricColumns="['Active']"
                               timePeriod="REALTIME"
                               interval="15"/> 
                <!--  <mp:Link label="History" click="{invokeActivity('metricHistory', 
                bean('targetName', appModel.target.name, 'targetType', appModel.target.type,
                'metric', 'Response', 'columns', ['Load'], 'period', 'LAST_DAY', 'title', 'Metric History'))}" /> -->
              </mp:Region>

              <!-- <mp:JobSummaryRegion width="25%" height="100%" /> -->
          </mx:HBox>


          <!-- 
              2nd row - will occupy 35% of the overall page height and shows three
              charts and shows the ability to access other activities (pages,
              dialogs, etc.)  

              The 1st chart shows a line chart that displays a metric in
              real-time. 
              It will automatically start polling the metric value in the
              background and will continue to update the chart on the page until
              the page is not shown. The 2nd chart shows a line chart that
              displays a metric history.  The 3rd chart shows a barch chart
              showing metric data grouped by the key in the data, in this case the
              CPU #.

              Each region also includes a Link component and shows the ability to
              navigate to other activites.  This may be any activity (page, 
              dialog, train, URL, job).  The 1st chart shows using the 
              invokeActivity method being called directly from the page and 
              passing context to the activity using the bean method to form the 
              input context for the metricDetails activity.

              The 2nd link shows calling a function in the controller, and then
              navigating to another activity from within the controller.  The 
              final link shows the use of the invokeActivity method again, however 
              shows navigating to an activity that requires no additional context 
              (the Processes page).
          -->
          <mx:HBox width="100%" height="35%">

              <mp:Region title="Per Processor Idle Time (%)" width="25%" height="100%">
                 <mp:BarChart id="bchart" timePeriod="LAST_DAY" width="100%" groupBy="byKey" metricName="CPUProcessorPerf" metricColumns="{['CPUIdle']}"/>
                  <mp:Link label="Show Processes" click="{invokeActivity('processesPg')}" />                  
              </mp:Region>

              <mp:Region title="CPU Utilization % (Last 24 Hrs)" width="45%" height="100%">
                  <mp:LineChart id="cpuutil" width="100%" height="100%" 
                               metricName="CPUPerf"
                               metricColumns="['system','idle','io_wait']"
                               timePeriod="LAST_DAY" />                         
                  <mp:Link label="Current" click="{controller.showCpuMetricDetails(event)}" />
              </mp:Region>

              <mp:Region title="CPU Load (Current)" width="30%" height="100%">
                  <mp:LineChart id="cpuload" width="100%" height="100%"
                               metricName="Response"
                               metricColumns="['Load']"
                               timePeriod="REALTIME"
                               interval="15"/> 
                  <mp:Link label="History" click="{invokeActivity('metricHistory', 
                  bean('targetName', appModel.target.name, 'targetType', appModel.target.type, 
                  'metric', 'Response', 'columns', ['Load'], 'period', 'LAST_DAY', 'title', 'Metric History'))}" />
              </mp:Region>

              <!--
              <mp:Region title="Per Processor Idle Time (%)" width="34%" height="100%">
                 <mp:BarChart id="bchart" timePeriod="LAST_DAY" width="100%" groupBy="byKey" metricName="CPUProcessorPerf" metricColumns="{['CPUIdle']}"/>
                  <mp:Link label="Show Processes" click="{invokeActivity('processesPg')}" />                  
              </mp:Region>
              --> 
          </mx:HBox>

          <!-- 3rd row - events region -->
          <mx:HBox width="100%" height="35%">
              <mp:IncidentRegion width="75%" height="100%" />
              <!--
              <mp:Region title="Memory Details" width="25%" height="100%" >
                  <mx:ComboBox id="selMemChart" dataProvider="{model.memChoices}" labelField="choiceLabel" change="{controller.changeMemChart(event)}" />
                  <mp:PieChart id="memChart" targetName="{appModel.target.name}" targetType="{appModel.target.type}" 
                      metricName="MemoryPerf" 
                      metricColumns="{model.memoryColumns}"
                      timePeriod="REALTIME" interval="15" />
              </mp:Region>
              -->
              <mp:JobSummaryRegion width="25%" height="100%" /> 
          </mx:HBox>

      </mx:VBox>
    </mp:Page>

  </ActivityDefinition>

9.5.2.2 UIコンポーネントへのデータのマッピング

次のオプションのうち1つを使用して、メタデータ・ページ定義でUIコンポーネントにマップするデータを指定します。

  • コンポーネントに含まれるデータを指定するプロパティをサポートするコンポーネントの場合。たとえば、チャート・コンポーネントは、チャートで表示されるメトリックの名前および列を指定するプロパティをサポートします。

    <c:LineChart id="memRt" width="100%" height="100%"
            metricName="MemoryPerf" metricColumns="['Active']"
            timePeriod="REALTIME" interval="15"/> 
    

    前述の例では、LineChartには、チャートで表示されるメトリックを指定するプロパティが含まれます。MPCUIフレームワークは、チャートを移入するManagement Serverからデータを取得します。

  • データ・サービス・タグを使用したデータ・バインディングの場合。データ・サービス・タグには、次のような複数のフォームがあります。


    注意:

    次のように、ページ定義の上部に、アクティビティ(ページ)内で使用するデータ・サービスを宣言する必要があります。
    <intg:Page id="homePg" label="Home Page"  
              ....
         <intg:services>
          ....
         </intg:services>
    

    • MetricValuesDataService

      MetricValuesDataServiceタグによって、Management Serverから、リアルタイムまたは履歴のいずれかのメトリック・データを含めることができます。その後、そのデータをUIコンポーネントにバインドします。

      <ds:MetricValuesDataService id="procData" 
         flattenData="true"
         targetName="{appModel.target.name}" targetType="{appModel.target.type}" 
         metricName="CPUProcessorPerf"
         columns="{['CPUIdle']}"
         timePeriod="REALTIME  "interval="15" />
      
    • SQLDataService

      SQLDataServiceタグによって、パッケージ化されたSQL文を実行し、resultSetに含まれた列をUIコンポーネントにバインドできます。

      <ds:SQLDataService id="ids" queryID="INSTANCE_INFO" 
         properties="{props('TARGET_GUID',appModel.target.guid)}" />
      

    ページのDataServiceを宣言すると、ページ内のコンポーネントは、サービスによって指定されたデータを参照できます。

    <components:InfoItem label="CPU(0) Idle %" 
       value="{procData.result.getString('CPU1','CPUIdle')}" />
    
    <components:InfoItem label="CPU Model" 
       value="{ids.result.getString(0,'CPU Model')}" />  
    

    それぞれが返したデータの構造、タグ上でのパラメータの設定方法、これらのサービスから返されるデータの簡単な統合をサポートするUIコンポーネントなど、これらのタグの詳細は、9.12項「タスク自動化の実行」を参照してください。


    注意:

    MetricValuesDataServiceSQLDataServiceAssociationDataServiceおよびAvailDataServiceなど、メタデータのみの実装またはFlexベースの実装でサポートされている多くのデータ・サービスがあります。

最後に、メタデータ・コンポーネントにマップされる際に使用できる多くの共通のデータ項目があります。これらの項目には、次を行うことができるプロパティが含まれています。

  • 直接表示(たとえば、appModel.target.name)

  • データ・サービスへのパラメータとして使用

  • ナビゲートされるアクティビティへのbean入力として使用

共通のデータ項目にはappModelプロパティが含まれています。appModelプロパティには、アプリケーションがレンダリングされるターゲットに対して、ターゲット(およびそのすべてのプロパティ、oracle.sysman.emx.model.Targetを参照)を含むアプリケーション・ランタイムに関連付けられた静的プロパティが含まれています。

次のような表記法を使用して、メタデータのみの実装またはFlex実装のいずれかで、UIコンポーネントからappModel.targetプロパティを参照します。

<mp:InfoItem label="Target Name"
value="{appModel.target.name}" />

この場合、UIでは次のように表示されます。

Target Name MyTargetName

9.5.3 ナビゲーションの定義

MPCUIに含まれたメタデータUI定義サポートは、ページの定義に制限されており、ダイアログ、トレイン、ジョブなどの他のアクティビティはサポートされていません。そのため、UIのページ間で使用可能なナビゲーションは、次のいずれかの方法のみになります。

  • ページへのアクセスに使用できるメタデータでメニュー項目を定義

    MenuMetadata項目には、MPCUIメタデータで定義されたアクティビティへのナビゲーションを定義するmenuItem要素が含まれます。たとえば、メタデータが次のページ定義を含む場合です。

     <ActivityDefinition>
        <intg:Page id="processesPg" label="Processes" ..>
            <!-- the body of the processes page would be declared here ?
        </intg:Page>
      </ActivityDefinition>
    

    MenuMetadata要素でmenuItemを指定して、前のページへのナビゲーションを許可します。

     <menuItem>
       <command id="processesPg" label="Processes"
                 class="oracle.sysman.emSDK.pagemodel.menu.EMNavigationMenuCommand
                 partialSubmit="true" >
          <property name="actionOutcome" value="goto_core-mpcustom-nav" /><property name="paramsMap"><mapEntry name="pageid" value="processesPg" />
          </property>      
       </command>
     </menuItem>
    

    menuItem要素のキー・プロパティは次のとおりです。

    • コマンド要素内のlabel

      labelは、ホームページ上のターゲット・メニューに表示されるラベルを指定します。前述の例では、メニュー項目Processesが含まれます。

    • actionOutcomeプロパティに指定された値。

      actionOutcomeは、SWFファイルを含むページのビューIDを指定します。

  • invokeActivityディレクティブを使用したページ内からのナビゲート

    invokeActivityディレクティブを使用して、MPCUI メタデータ実装で定義されたアクティビティ間でナビゲートします。このディレクティブを、LinkコンポーネントまたはButtonコンポーネントのクリック・プロパティに関連付けます。エンドユーザーがこれらのコンポーネントの1つをクリックすると、クリック・プロパティは、実行するアクションを指定します。

    invokeActivityディレクティブは、次を取得します。

    • 1つの必須パラメータ(アクティビティID)

      アクティビティIDは、制御が渡されるアクティビティを指定します。

    • 1つのオプション・パラメータ(アクティビティへの入力コンテキストを指定するbean)

      入力コンテキストは、アクティビティに渡される情報を指定します。

    たとえば、実装に2つのアクティビティ、homePgおよびprocessesPg (2つのページ)が含まれる場合です。クリックすると表示がプロセス・ページに変更されるリンクが、ホームページに含まれます。

    <ActivityDefinition>
    <intg:Page id="homePg" label="Home Page"   
    ...
    <mx:Link label=”Show Processes” click=”{invokeActivity('processesPg')}” />
    

    アクティビティ・コンテンツ・パラメータを使用して、パラメータ化するアクティビティを定義するため、別のコンテキストから起動できます。メタデータに含まれるアクティビティ定義の一部として、パラメータ入力の要件を指定する必要があります。たとえば、任意の数の異なるメトリックおよびイベントが異なる可能性があるターゲットの履歴折れ線グラフを表示できるダイアログ・アクティビティが必要であるとします。統合メタデータで、アクティビティ定義は、例9-5のように表示されます。

    例9-5 アクティビティの定義

     <intg:DialogActivityDef id='metricHistory' label='Metric History' >
          <intg:inputParams>
              <intg:InputParam name='targetName'/>
              <intg:InputParam name='targetType'/>
              <intg:InputParam name='metric'/>
              <intg:InputParam name='columns'/>
              <intg:InputParam name='period'/>
              <intg:InputParam name='title'/>
         </intg:inputParams>
     </intg:DialogActivityDef>
    

    inputParams要素は、ダイアログ(アクティビティ)への入力パラメータを指定します。その後、別のページ・アクティビティから、2つの異なるリンクは、異なるパラメータを持つ同じダイアログに向けることができます。

    <comp:Region title="Memory Used (Current)" width="30%" height="100%">          
      <c:LineChart id="memRt" width="100%" height="100%"
            metricName="MemoryPerf" metricColumns="['Active']"
            timePeriod="REALTIME" interval="15"/> 
      <comp:Link label="History" 
            click="{invokeActivity('metricHistory', 
                    bean('targetName', appModel.target.name, 
                         'targetType', appModel.target.type, 
                         'metric', 'Response', 
                         'columns', ['Load'], 
                         'period', 'LAST_DAY', 
                         'title', 'Memory Used (History)'))}" />
    </comp:Region>   
     
    <comp:Region title="CPU Used (Current)" width="30%" height="100%">          
      <c:LineChart id="memRt" width="100%" height="100%"
            metricName="CPUProcessorPerf" metricColumns="['CPUUser,'CPUIdle']"
            timePeriod="REALTIME" interval="15"/> 
      <comp:Link label="History" 
            click="{invokeActivity('metricHistory', 
                    bean('targetName', appModel.target.name, 
                         'targetType', appModel.target.type, 
                         'metric', 'CPUProcessorPerf', 
                         'columns', ['CPUUser','CPUIdle'], 
                         'period', 'LAST_DAY',
                         'title', 'CPU Used (History)'))}" />                
    </comp:Region>  
    

9.6 MPCUIアプリケーションの定義

MPCUIフレームワークを使用してビルドされたカスタムUIの基礎は、Flexベースのアプリケーションで構築する必要があります。このプロセスを単純化するために、フレームワークは一連のベース・クラスおよび構造を提供します。この開発の開始点は、アプリケーションを定義するためにMpApplicationクラスを拡張することです。

アプリケーション・ファイルは単一のメソッドgetIntegrationClass()を実装する単純なMXMLファイルで、このアプリケーションに関連付けられた統合クラスのインスタンスを返します。統合クラス(9.6.1項「アプリケーション・アクティビティ(統合クラス)の定義」で説明)は、アプリケーションを構成する一連のアクティビティ(ページ、ダイアログおよびトレインなど)を定義します。

コンパイルされると、アプリケーション・バイナリ(SWFファイル)は、アプリケーション・ソース・ファイルと同じ名前で呼ばれます(デフォルト)。意味のあるアプリケーションを呼び出す際は、アプリケーション・クラスは、サポートするターゲット・タイプと同じ名前にすることをお薦めします。

例9-6 アプリケーションMXML

<?xml version="1.0" encoding="utf-8"?>
 
<intg:MpApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:intg="oracle.sysman.emx.intg.*"  
    backgroundColor="#EFF3F7" preloader="oracle.sysman.emx.MpPreloader" >
  <mx:Script>
    <![CDATA[
            /* Must override the getIntegrationClass method and 
            return the class that extends Integration */
         override public function getIntegrationClass():Class 
                        { return HostSampleInteg; }            
        ]]>
    </mx:Script>    
</intg:MpApplication>               

9.6.1 アプリケーション・アクティビティ(統合クラス)の定義

統合クラスは、アプリケーションを構成する一連のUI要素を定義します。MPCUIフレームワークは、アプリケーションの構造を理解するために統合クラスと相互作用し、フレームワークが、アプリケーションを構成するUI要素の表示と、UI要素間のナビゲーションの背後のプライマリ・ドライバとなることを許可します。

アプリケーションは、getIntegrationClassメソッドを介して、アプリケーション・クラスのMPCUIフレームワークに統合クラスを登録します。各アプリケーションは、単一の統合クラスのみを持ちます。

例9-7 統合クラスの登録

<?xml version="1.0" encoding="utf-8"?>
<intg:Integration
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:intg="oracle.sysman.emx.intg.*" 
    >
      <!-- The integration class defines the pages, dialogs 
               and trains included in the application -->  

      <intg:activities>
        <intg:PageActivityDef id='homePg' label='Home' pageClass='{HomePage}' pageControllerClass='{HomePageController}' isDefaultPage="true"  />
        <intg:PageActivityDef id='processesPg' label='Processes' pageClass='{ProcessesPage}' pageControllerClass='{ProcessesPageController}' />
        <intg:PageActivityDef id='adminPg' label='Administration' pageClass='{CredentialsPage}' pageControllerClass='{CredentialsPageController}' />
        -->
        <intg:DialogActivityDef id='metricHistory' label='Metric History' dialogClass='{MetricHistoryDialog}' >
            <intg:inputParams>
                <intg:InputParam name='targetName'/>
                <intg:InputParam name='targetType'/>
                <intg:InputParam name='metric'/>
                <intg:InputParam name='columns'/>
                <intg:InputParam name='period'/>
                <intg:InputParam name='title'/>
            </intg:inputParams>
        </intg:DialogActivityDef>

        <intg:DialogActivityDef id='availDialog' label='Availability' dialogClass='{AvailabilityDialog}' />

     </intg:activities>
</intg:Integration>

例9-7では、可用性アクティビティには、PageActivityDefDialogActivityおよびTrainActivityDefが含まれています。各アクティビティは、通常、このアクティビティを参照するためにアプリケーション全体で使用されるidプロパティを指定します。

pageClassおよびdialogClassプロパティは、各アクティビティのビュー・クラスまたはUIレイアウトを指定します。たとえば、homePgアクティビティには、HomePageのpageClassがあります。これは、アプリケーションに含めると、通常MXMLで記述されたHomePageと呼ばれるクラスになることを意味します。

アクティビティは、コントローラ・クラス(pageControllerClass)を指定できます。このプロパティは、ページのデータを初期化し、ページ内のユーザーの相互作用からUIイベントに応答するために、アクティビティに関連付けられ、MPCUIフレームワークによって呼び出されるクラス(多くはActionScriptで記述された)を指します。

9.6.2 ページの定義

各ページは、PageActivityDefを追加することによって、統合クラスを介して、MPCUIフレームワークに登録する必要があります。PageActivityDefは、次によって定義されます。

  • ページ・クラス

    ページ・クラスは、レイアウトおよびコンテンツであるページの具体的な実装であり、ページ・クラスを拡張する必要があるクラスです。

  • ページ・コントローラ

    ページ・コントローラは、ActivityControllerベース・クラスを拡張するクラスで、データを取得し、それをUIコンポーネントにバインドし、エンドユーザーのかわりにUIによって発行されたイベント(ボタンの押下やリンクのクリックなど)に応答するために、Enterprise Managerサービス・レイヤーとの相互作用をサポートする一連のハンドラをカプセル化します。

各アプリケーションは、少なくとも1つのページ(1つのページ・アクティビティ)を含める必要があり、デフォルト・ページとしてページ・アクティビティの1つを特定する必要があります。


注意:

デフォルト・ページは、選択したターゲットのホームページとして、MPCUIフレームワークによって表示されます。

9.6.2.1 ページ・クラス

Pageクラスは、エンドユーザーによって定義されるすべてのページのベース・クラスです。pageは、アプリケーションで最上位のUI要素です。フレームワークは、次を行うことによって、Enterprise Managerコンソールにページの統合を指定します。

  • Enterprise Managerメニュー・システムとのページの統合

  • ページをブックマークできるように、ブラウザ履歴の更新の実行

  • ページ間の単純なナビゲーションの指定

MXMLのページ・クラスを実装し、Pageベース・クラスを拡張して、MPCUIフレームワークと統合します。

ページを記述するために使用するタグ言語には、レイアウトおよびデータ表示のためのFlexコンポーネントとMPCUI提供のコンポーネントが混在しています。このドキュメントの以降の項で、これを使用するための各コンポーネントおよび例について説明しています。

ページ・クラスの例は、EDKのデモ・ホスト・サンプルのHomePage.mxmlファイルおよびProcessesPage.mxmlファイルを参照してください。

9.6.2.2 ページ・モデル

ページ内のコンポーネントは、Enterprise Managerサービス・レイヤーを介して取得された情報を表示し、通常、ページ・モデルを介してこのデータにバインドされます。ページ・モデルは、ページに関連付けられた一連のデータです。フレームワークは、ページの表示時にデータがロードされるように、このデータのライフサイクルを管理します。ページが削除されると、データはクリーンアップされ、Adobe Flash Playerプラグインによってガベージ・コレクションを実行できます。

次を行うことによって、ページ・モデルに含めるデータを指定します。

  • データ・サービス・タグの使用

  • Enterprise Managerサービス・リクエストの結果ハンドラでのページ・モデルへのデータの直接追加

サービス・レイヤーの使用の説明、およびモデルへのデータの追加方法の詳細は、9.12項「タスク自動化の実行」を参照してください。

Adobe FlexおよびActionScriptは、Scriptタグを使用してMXMLファイルにコードを埋め込む機能をサポートしていますが、Pageコードは、ページを構成するUI要素のレイアウトに制限することをお薦めします。データ・バインディングおよびイベント処理をコントローラに委任します。これにより、MPCUIフレームワークは、各ページおよびそれに正しくバインドされたデータのライフサイクルを管理できることが確認されます。

9.6.2.3 ページ・コントローラ

ページ・コントローラは、PageControllerベース・クラスを拡張するクラスで、データを取得し、管理アクションを処理するために、Enterprise Managerサービス・レイヤーと相互作用するコードが含まれます。さらに、コントローラには、ページ・コンポーネントから発行されたイベントへの応答で呼び出される一連のイベント・ハンドラが含まれます。


注意:

ページに表示されるすべてのデータがcomponentタグまたはDataServiceタグを介して指定でき、カスタム・イベント処理が不要な場合、ページ・コントローラは不要です。

たとえば、ページが多くのチャート・コンポーネントのコンテナである場合、各コンポーネントは、チャートに表示するためのメトリックの指定をサポートします。コンポーネントは、データのライフサイクルを正しく管理するために、MPCUIフレームワークと相互作用します。


コントローラが必要な場合、init(page:Page)メソッドは、ページUI要素にバインドされるデータをロードできるコード内の場所です。Enterprise Managerサービスとの相互作用、およびページ・モデルを使用したバインディングの例は、9.12項「タスク自動化の実行」を参照してください。

initメソッドに加えて、コントローラには、ページ内で元となるイベントに応答するメソッドが含まれます。イベント(ボタンの押下など)への応答で処理を実行する必要がある場合、そのイベントが発生したときに呼び出されるコントローラでメソッドを参照できます。

  • ページ内は、次のとおりです。

     <components:Link label="Show History"
            click="controller.showHistory(buffCacheChart);"  />
    
  • コントローラ内は、次のとおりです。

    public function showProcessorHistory(even:MouseEvent):void
    {
       // show an example of invoking an activity (a dialog in this case) and
       // getting information from the dialog when it returns (is closed)
       // create the context to be passed to the dialog
       var bean:Bean = new Bean('targetName',
          ApplicationContext.getTargetName(), 'targetType',
          ApplicationContext.getTargetType(), 
            'metric', 'CPUProcessorPerf', 'columns', ['CPUIdle'],
            'period', 'LAST_DAY', 'title', 'Metric History');
       page.invokeActivity('metricHistory', bean, processorHistoryDone);
    
    }
    

ページ・コードでは、ページ・コントローラに含まれるコードと相互作用するために必要なすべてのものは、controllerへの参照です。フレームワークは、ページのロード時にコントローラ・クラスの作成を管理し、アクションを実行するためにコントローラを介して呼び出す機能を提供します。

フレームワークは、コントローラで追加のイベント・ハンドラを必要とせずに、ページから直接呼び出すことができる便利な方法を提供することによって、アクションを実行するためのプロセスを単純化します。たとえば、別のアクティビティへのアクセスは、ほとんどの場合、追加のコントローラ・コードを必要とせずに実行できます。

次の例では、リンクをクリックすると、アプリケーションをprocessPgアクティビティにリダイレクトします。

 <components:Link label="Show Process" click="{invokeActivity('processPg')}" />

注意:

詳細は、デモ・サンプルのHomePageController.asファイルおよびProcessesPageController.asファイルを参照してください。

9.6.3 ダイアログの定義

ダイアログ・アクティビティは、MPCUIダイアログ・クラスを拡張します。ダイアログは、表示される現在のページから移動せずにアプリケーションの上部に表示するポップアップ・ウィンドウです。ダイアログは、通常、MXMLファイル内で定義され、別のコントローラ・クラスを持ちません(持つことはできます)。

<?xml version="1.0" encoding="utf-8"?>
<intg:Dialog 
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:cht="oracle.sysman.emx.components.charts.*"
    xmlns:intg="oracle.sysman.emx.intg.*"
  xmlns:ds="oracle.sysman.emx.service.util.*"     
  xmlns:comp="oracle.sysman.emx.components.*"
  xmlns:tbl="oracle.sysman.emx.components.table.*"
    height="250" width="450"
    title="{model.title}"
    >  
    <cht:LineChart id="hchart" targetName="{model.targetName}" targetType="{model.targetType}" timePeriod="{model.period}" interval="15"
                                    metricName="{model.metric}" metricColumns="{model.columns}" keys="{model.keys}" width="100%" height="100%" />
</intg:Dialog>

前の例では、ダイアログは、UIコンポーネントで使用するプロパティのソースとしてmodelを参照します。

次のいずれかの方法で、ダイアログ・モデルを初期化します。

  • ダイアログに関連付けられたコントローラで

  • 統合クラスのダイアログ定義が入力パラメータを指定する場合、MPCUIフレームワークによって

            <intg:DialogActivityDef id='metricHistory' label='Metric History' dialogClass='{MetricHistoryDialog}' >
                <intg:inputParams>
                    <intg:InputParam name='targetName'/>
                    <intg:InputParam name='targetType'/>
                    <intg:InputParam name='metric'/>
                    <intg:InputParam name='columns'/>
                    <intg:InputParam name='period'/>
                    <intg:InputParam name='title'/>
                </intg:inputParams>
            </intg:DialogActivityDef>
    

    注意:

    この場合、ダイアログで必要な入力パラメータを含む入力として、beanを指定する必要があります。
    <components:Link label="Show History" 
            click="{invokeActivity('metricHistory', 
            bean('targetName', appModel.target.name, 
                    'targetType', appModel.target.type, 
                    'metric', 'Response', 
                    'columns', ['Load'], 
                    'period', '', 
                            'title', 'Metric History'))}" />                                                          
    


注意:

詳細な例は、デモ・サンプルのMetricDetailsDialog.mxmlファイルおよびAvailabilityDialog.mxmlファイルを参照してください。

9.6.4 トレインおよびトレイン・ページの定義

トレイン・アクティビティでは、一連のページをつなげることによって、トレイン(ガイド付きワークフローまたはウィザード)を定義できます。

トレインを定義するには、トレイン自体(TrainActivityDef)および各ステップ(TrainStepActivityDef)の宣言を統合クラスに含めます。

  <intg:TrainActivityDef id='addNewUserEmbeddedTrain' label='Add New User'>
      <intg:stepActivities>
         <mx:Array>
           <intg:TrainStepActivityDef id='anuStep1' label='User Info'pageClass='{trainSamp.S1_UserInfo}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
           <intg:TrainStepActivityDef id='anuStep2' label='Expiry' pageClass='{trainSamp.S2_Expiry}'pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
           <intg:TrainStepActivityDef id='anuStep3' label='Credentials' pageClass='{trainSamp.S3_Credentials}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
           <intg:TrainStepActivityDef id='anuStep4' label='Schedule' pageClass='{trainSamp.S4_Schedule}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
           <intg:TrainStepActivityDef id='anuStep5' label='Notifications' pageClass='{trainSamp.S5_Notifications}' pageControllerClass='{trainSamp.NotificationsTrainStepController}'/>
           <intg:TrainStepActivityDef id='anuStep6' label='Confirmation' pageClass='{trainSamp.S6_Confirm}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>                
         </mx:Array>
      </intg:stepActivities>
   </intg:TrainActivityDef>

TrainControllerには、次のメソッドがあります。

  • init(Train): トレインのロード時に呼び出されるメソッドで、トレインに関連付けられたモデルを制御できます。

  • trainDone: ユーザーがトレイン内で「終了」または「取消」ボタンをクリックした場合に呼び出されるメソッドです。その時点で、トレインの状態(トレイン・モデルに格納されているもの)を調べて、次のいずれかを行うことができます。

    • トレインを完了し、完了アクティビティを続行するかどうかを制御します。

    • train.setStepメソッドを使用してトレインを前のステップに戻すなど、別のアクションを実行するか、またはトレインを終了して別のアクティビティを起動します。

トレイン内の各トレイン・ステップは、TrainStepPage (ページの特別なタイプ)を拡張し、コントローラ(TrainStepController)に関連付けられる必要があります。この場合、コントローラはPageControllerの特別なタイプで、トレイン・ページのコンテンツを初期化できるinit(Page)メソッドのサポートを含みます。ページはトレイン内にあるため、トレインは独自のページ・モデル(model.propertyなど)またはトレイン・モデルに格納されたデータ(train.model.propertyなど)のいずれかを参照する可能性があります。.

最後に、トレイン・ステップ・コントローラまたはトレイン・コントローラのいずれかで、コードは状態のチェックを行うことができ、トレインを完了できる場合、つまり、すべての必要な情報が入力された場合、コントローラ・コードはtrain.setMayFinish()を呼び出すことができます。


注意:

詳細は、デモ・サンプルのtrainSampの例を参照してください。

9.6.5 URLの定義

UrlActivityDefは、UIコンポーネント・クリック・ハンドラ(InfoItem、ImageLink、Buttonなど)からのinvokeActivityディレクティブを使用してアクセスできるURLを定義する能力をサポートしています。URLはすべてのリクエスト・パラメータを含む絶対URLとして表すことができ、パラメータは実行時に提供できます。実行時に置換される必要のあるURLパラメータを持つURLを定義するには、次のようにinputParamsを含むようにUrlActivityDefを定義します。

 <mp:UrlActivityDef id='oracle' label='myExtApp' urlBase="http://www.extapp.com" >
     <mp:inputParams>
               <mp:InputParam name='pageId' />                                                                          
     </mp:inputParams>  
 </mp:UrlActivityDef>

URLを参照するには、invokeActivityディレクティブを使用して、UrlActivityDefのIDを指定し、パラメータと適切な値を含むbeanを渡します。提供されるパラメータは、リクエスト・パラメータとしてURLに追加されます。

<mp:InfoItem id="currentLoad" label="CPU Load" 
      value="{respData.result.getString('','Load')}" 
      click="{invokeActivity('extapp', bean('pageId','Load'))}"
      />

この例では、アクセスされるURLは、http://www.extapp.com&pageId=Loadです。

9.7 プラグインとのMPCUI実装のパッケージ化

プラグイン・ステージ・ディレクトリの/mpcuiサブディレクトリにMPCUIのメタデータ定義を置くことによって、プラグインにMPCUI実装を含めます。プラグインの構造およびパッケージ化の詳細は、第14章を参照してください。

メタデータのみの実装

MPCUIメタデータ・ファイルを次のディレクトリに置きます。

plugin_stage/oms/metadata/mpcui/my_mpcui_metatadata.xml

Flex実装

次のように、単一のメタデータ・ファイルおよびSWFファイル(カスタムUIであるFlexアプリケーション)を、/mpcuiサブディレクトリに含めます。

plugin_stage/oms/metadata/mpcui/my_mpcui_metadata.xml

plugin_stage/oms/metadata/mpcui/MyMpcui.swf

注意:

前の例では、プラグイン開発者として、要件に従ってXMLファイル(my_mpcui_metadata.xml)およびSWFファイル(MyMpcui.swf)の名前を設定します。

9.8 FlexベースUIへのメタデータベースUIの変換

メタデータベースUIのページを定義するために使用されるタグ言語は、Flexベースの実装でサポートされているタグ言語のサブセットです。そのため、メタデータベースUIがあり、Flex実装のみでサポートされている追加の機能を使用することを決定した場合、メタデータベースUIを使用して、FlexベースUIを作成します。メタデータは再利用できるため、再起動する必要はありません。

次の手順に従って、メタデータベースの実装用のメタデータ・ファイルで定義されたページを取得し、それをMPCUIアプリケーション(SWFファイル)の一部であるページにします。

  1. メタデータ・ファイルから、変換するページを特定します。

  2. ページのActivityDefinitionブロックをコピーし、そのブロックをMXMLファイルとして保存します。

  3. 変換する各ページに対して、手順2を繰り返します。たとえば、4つのページ定義がある場合、4つのMXMLファイルを作成する必要があります。

  4. メタデータ・ファイルから統合ブロックをコピーし、その統合ブロックをMXMLファイルとして保存します。

  5. 各MXMLファイルの上部に、適切なMXMLネームスペースを追加します。

  6. 9.6項「MPCUIアプリケーションの定義」で説明されているように、アプリケーションMXMLファイルを作成します。

  7. 9.4項「MPCUIメタデータ・ファイルの作成」で説明されているように、Flexベースのメタデータ・ファイルを作成します。

9.9 システムのホームページの定義

システム・ターゲットとして識別されるターゲット・タイプの場合、ホームページがシステム・ターゲットにレンダリングされる3つのオプションがあります。

  1. Enterprise Managerのデフォルトのシステムのホームページを表示します。

    このページは、システム・メンバーの可用性およびインシデントのサマリーを表示します。次のいずれかの方法で、このオプションを有効化します。

    • プラグインからMPCUIメタデータを省略します。

    • プラグインにMPCUIメタデータを含め、MPCUIメタデータ・ファイルに次の<EmuiConfig>要素を含めます。

      例9-8 デフォルトのシステムのホームページの使用

      <CustomUI target_type="demo_hostsystem"xmlns="http://www.oracle.com/EnterpriseGridControl/MpCui">
      
        <EmuiConfig>
           <use-framework-homepage>true</use-framework-homepage>
        </EmuiConfig> 
      </CustomUI>
      

      図9-1 デフォルトのシステムのホームページ

      図9-1の説明が続きます
      「図9-1 デフォルトのシステムのホームページ」の説明

  2. カスタマイズされたコンテンツを使用して、Enterprise Managerのデフォルトのシステムのホームページを表示します。

    ホームページは、カスタマイズされたレイアウトで、多くの事前パッケージ済のリージョンを表示できます。例9-8に示すように、デフォルトのホームページの使用は、メタデータによって制御されます。

    リージョンの選択、およびホームページ上でのそのレイアウトは、systemUiIntegrationメタデータをプラグインに含めることによって指定されます。詳細は、9.9.1項「systemUiIntegrationメタデータの定義」を参照してください。

    図9-2 カスタマイズを使用したシステムのホームページ

    図9-2の説明が続きます
    「図9-2 カスタマイズを使用したシステムのホームページ」の説明

  3. EDKに付属のMPCUI機能を使用して、カスタム・ホームページを構築します。

    MPCUIメタデータまたはMPCUI Flexライブラリのいずれかを使用して、ホームページを構築します。システムまたは複合ターゲット・タイプに固有のMPCUIによって提供される、複数のデータ・サービスおよびUIコンポーネントがあります。詳細は、9.9.2項「システム・リージョンの定義」を参照してください。

    図9-3 カスタマイズされたシステムのホームページ

    図9-3の説明が続きます
    「図9-3 カスタマイズされたシステムのホームページ」の説明

9.9.1 systemUiIntegrationメタデータの定義

カスタマイズされたコンテンツを使用して、デフォルトのシステムのホームページを使用するには、次を実行します。

  1. 次の情報を含む、ターゲット・タイプのsystemUiIntegrationメタデータXMLファイルを定義します。

    • 優先レイアウト

    • リージョンの追加または削除(リージョンを変更する場合のみ必要)

      例9-9に、systemUiIntegrationメタデータXMLファイルの例を示します。

      systemUiIntegrationメタデータXMLファイルを制御するXMLスキーマ定義(XSD)の詳細は、ORACLE_HOME/sysman/emSDK/core/system/xml/SystemUiIntegration.xsdを参照してください。

    例9-9 systemUiIntegrationメタデータXML

    <systemUiIntegration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.oracle.com/EnterpriseGridControl/SystemUiIntegration.xsd"
           xmlns="http://www.oracle.com/EnterpriseGridControl/SystemUiIntegration">
    
    <general targetType="demo_hostsystem"
                 defaultLayout="twoColumnNarrowLeft"  
            showOptionalRegions="false" 
            topLevelTarget="true" 
            allowCreateFromSystemsUi="true"/>
    
     
     <region taskFlowId="/WEB-INF/db/system/region/db-system-region-hihgavail-task-flow.xml#db-system-region-hihgavail-task-flow"
                titleResBundle="oracle.sysman.db.rsc.inst.DBMsg"
                                                    titleNlsId="GENERAL"
                                                    titleDefText="General"
                                                    regionType="add" 
                                                    displayOrder="1" />
    
     <region taskFlowId="/WEB-INF/sdk/core/regions/events/console/incident-overview-task-flow.xml#incident-overview-task-flow"
                titleResBundle="oracle.sysman.core.groups.ui.CoreGroupsUiMsg"
                                                                            titleNlsId="ISSUE_OVERVIEW"
                                                                            titleDefText="Issue Overview"
                                                                            regionType="add" 
                                                                            displayOrder="4" />  
    
     <region taskFlowId="/WEB-INF/sdk/core/regions/jobs/jobs-activity-task-flow.xml#jobs-activity-task-flow"
                titleResBundle="oracle.sysman.db.rsc.inst.DBMsg"
                                                                                                    titleNlsId="JOB_ACTIVITY"
                                                                                                    titleDefText="Job Activity"
                                                                                                    regionType="add" 
                                                                                                    displayOrder="7" />
    
     <region taskFlowId="/WEB-INF/db/system/region/db-system-region-dep-members-task-flow.xml#db-system-region-dep-members-task-flow"
                titleResBundle="oracle.sysman.core.groups.ui.CoreGroupsUiMsg"
                                                                                                    titleNlsId="DEPENDENT_TARGETS"
                                                                                                    titleDefText="Dependent Targets"
                                                                                                    regionType="add" 
                                                                                                    displayOrder="9" />    
    
     <region taskFlowId="/WEB-INF/sdk/core/regions/gccompliance/target/compliance-overview-task-flow-brief.xml#compliance-overview-task-flow-brief" 
                titleResBundle="oracle.sysman.core.groups.ui.CoreGroupsUiMsg"
                                                                                                    titleNlsId="COMPLIANCE_SUMMARY"
                                                                                                    titleDefText="Compliance Standard Summary"
                                                                                                    regionType="add" 
                                                                                                    displayOrder="6" />                        
    
     <region taskFlowId="/WEB-INF/sdk/core/regions/mos/patch/target-patch-recommendation-task-flow.xml#target-patch-recommendation-task-flow" 
                titleResBundle="oracle.sysman.db.rsc.inst.DBMsg"
                                                                                                    titleNlsId="PATCH_RECOMMEND"
                                                                                                    titleDefText="Patch Recommendations"
                                                                                                    regionType="add" 
                                                                                                    displayOrder="12"/> 
    
     <region taskFlowId="/WEB-INF/config/adfc/blackout/region/emcore-groups-blackout-task-flow.xml#blackout_group_taskflow" 
                titleResBundle="oracle.sysman.core.groups.ui.CoreGroupsUiMsg"
                                                                                                    titleNlsId="BLACKOUTS"
                                                                                                    titleDefText="Blackouts"
                                                                                                    regionType="add" 
                                                                                                    displayOrder="2" />
    
     <region taskFlowId="/WEB-INF/sdk/core/regions/ecm/history/config-history-task-flow.xml#config-history-task-flow" 
                titleResBundle="oracle.sysman.db.rsc.inst.DBMsg"
                                                                                                    titleNlsId="CONFIG_CHANGES"
                                                                                                    titleDefText="Configuration Changes (24 Hours)"
                                                                                                    regionType="add" 
                                                                                                    displayOrder="5" />                      
    
    </systemUiIntegration>
    
  2. systemUiIntegrationメタデータXMLファイルを次のディレクトリに保存します。

    plugin_stage/stage/oms/metadata/systemUiIntegration
    
  3. プラグインがすでにデプロイされている場合、emctl register oms metadataコマンドを使用して、プラグインのみのMPCUI部分を更新できます。emctl register oms metadataコマンドの詳細は、第14.7項を参照してください。

9.9.2 システム・リージョンの定義

MPCUIフレームワークは、システム・ターゲットの情報を表示するためにビルドされたホームページの一部として使用できる多くのリージョンをサポートしています。

9.9.2.1 システム・ステータス・リージョンの定義

システム・ステータス・リージョンは、システム・ターゲットおよびそのすべてのメンバーの最近の高可用性を表示します。リージョンは、次のタグを使用して、システムのホームページに含まれます。

<mp:StatusOverviewRegion id="statusOverview" height="50%"/>

図9-4 システム・ステータス・リージョン

図9-4の説明が続きます
「図9-4 システム・ステータス・リージョン」の説明

9.9.2.2 システムの問題リージョンの定義

システムの問題リージョンは、システム内のすべてのターゲットのインシデントのサマリー数を表示します。リージョンは、次のタグを使用して、システムのホームページに含まれます。

<mp:IssuesOverviewRegion id="issuesOverview" height="50%"/>

図9-5 問題の概要リージョン

図9-5の説明が続きます
「図9-5 問題の概要リージョン」の説明

9.9.2.3 システムのジョブ・アクティビティ・リージョンの定義

システムのジョブ・アクティビティ・リージョンは、システム・ターゲットのそれぞれのプライマリ・ジョブ・ステータスのジョブの数、およびすべてのシステム・メンバーのサマリーを表示します。

<mp:JobsActivityRegion id="jobsOverview" height="40%"/>

図9-6 システムのジョブ・アクティビティ・リージョン

図9-6の説明が続きます
「図9-6 システムのジョブ・アクティビティ・リージョン」の説明

9.10 ナビゲーションの定義

MPCUIアプリケーションでのナビゲーションは、次のいずれかになります。

9.10.1 アクティビティへのナビゲーション

9.5.3項「ナビゲーションの定義」では、メタデータ実装からのアクティビティ間のナビゲートへのアプローチについて説明しています。これらの説明は、MXMLで定義されたメニューまたは別のアクティビティからのアクティビティへのナビゲートに適用します。

この項では、コントローラ・コード、つまりアクティビティに関連付けられたActionScriptコード内から別のアクティビティへのナビゲート方法について説明します。

 public function showProcessorHistory(even:MouseEvent):void
  {
    // show an example of invoking an activity (a dialog in this case) and
    // getting information from the dialog when it returns (is closed)
 
    // create the context to be passed to the dialog
    var bean:Bean = new Bean('targetName', 
      ApplicationContext.getTargetName(), 'targetType', 
      ApplicationContext.getTargetType(), 
        'metric', 'CPUProcessorPerf', 'columns', ['CPUIdle'], 
        'period', 'LAST_DAY', 'title', 'Metric History');

     page.invokeActivity('metricHistory', bean, processorHistoryDone);                                      
  }

前述の例は、page.invokeActivityメソッドを使用して別のアクティビティ(この場合はダイアログ)にリダイレクトするコントローラ・メソッドを示しています。

このメソッドと、MXMLページ内から使用可能なメソッド(9.5.3項「ナビゲーションの定義」で説明)との重要な相違点は、呼び出されたアクティビティの完了時に呼び出されるコールバック(この例ではprocessorHistoryDone)を関連付ける機能です。このコールバックは、現在のアクティビティのスコープ外への移動が引き起こされないアクティビティに対してのみ有用です。

9.10.2 URLおよびリンク

URLを介して、MPCUIアプリケーション内のコンポーネントから他の場所にナビゲートするには、多くの方法があります。Linkコンポーネントを使用して、ツールチップや場所など、HTML形式のリンクをレンダリングします。

  • 絶対URL (Enterprise Managerの外部)

    絶対URLへのリンクを指定するためにUrlAbsクラスを使用すると、このクラスのインスタンスは、Link宛先に関連付けられるか、invokeActivityメソッドを介してアクセスすることができます。

        In the Page Class:
        <comp:Link id=”gotoOracle” label=”Oracle” destination=”{model.oracleUrl}” />
    
        In the Controller Class:
        page.setModel(”oracleUrl”, new UrlAbs("http://www.oracle.com", "Oracle"));
    

    invokeActivityを使用した代替方法は、次のとおりです。

        In the Page Class:
        <mx:Button label=”Go To Oracle” click=”{invokeActivity(model.oracleUrl)}” />
    
        In the Controller Class:
        page.setModel(”oracleUrl”, new UrlAbs("http://www.oracle.com", "Oracle"));
    
  • ページ定数を使用したEnterprise Managerページへのリンク

    絶対URLに加えて、MPCUIフレームワークは、Link宛先から参照できるか、またはクリック・ハンドラの一部としてinvokeActivityメソッドに渡すことができる、UrlEmオブジェクトを構築することによって、既知のEnterprise Managerのページにリンクする機能をサポートしています。リファレンス・ガイドには、使用可能なすべてのページ定数のoracle.sysman.emx.Constantsクラス、およびURLを生成するために指定する必要がある対応するパラメータの完全なリストが記載されています。

      // setup link to availability page
      var availLink:UrlEm = new UrlEm(Constants.PAGE_AVAILABILITY,
                                    [new InputParam(Constants.P_TARGET_NAME,  
                                     ApplicationContext.getTargetName()), 
                                     new InputParam(Constants.P_TARGET_TYPE, 
                                     ApplicationContext.getTargetType()),
                                     new InputParam(Constants.P_PAGE_TYPE, 
                                     Constants.BY_DAY)]);
      page.setModel("availPageLink", availLink);                        
    
  • 定数が定義されていないEnterprise Managerページへのリンク

    UrlEmは、oracle.sysman.emx.util.Constantsクラス内のページ定数を介してサポートされているページにアクセスするためにのみ使用できます。現在定数が定義されていないページの場合、ページにアクセスするには、ページのADFビューID値を含むUrlRelオブジェクトを作成します。

    たとえば、Bare Metal Provisioningダッシュボードにアクセスするには、次のようにページのビューID (/faces/core-bmp-dashboard)を指定します。

     var url:UrlRel = new UrlRel("/faces/core-bmp-dashboard", null);
    

    ページURLで特定のADFページのビューIDを見つける最も簡単な方法は、http://<server:host>/em/に続く文字列です。

  • Enterprise Managerのターゲットのホームページへのリンク

    Enterprise ManagerのターゲットのホームページへのURLを生成することは、特別な場合です。この場合、静的UrlEm.homepageUrlメソッドを使用します。

     page.setModel("relatedHostLink", UrlEm.homepageUrl(host.name, host.type));
    
  • DIRECT_URLを使用した動的URL

    実行時にデータ・サービスから動的にURLを作成する必要がある場合、次のオプションが必要になることがあります。DIRECT_URLというアクティビティIDは、特別な場合のために予約されており、フレームワークによって提供されます。この場合UrlActivityDefが宣言されていませんが、かわりにinvokeActivityディレクティブから、urlプロパティを指定するbeanが渡されます。このプロパティのために提供される値は、コンポーネントをクリックしたときに誘導されるURLとして使用されます。

    次の例では、URLを取得するために、データ・サービスrespDataが問い合せられます。必要なURLを取得するために、これは、ページ内で使用されているどのようなデータ・サービスにも置換されます。これはMetricValuesDataServiceまたはSqlDataServiceにすることができます。

    <mp:InfoItem id="currentLoad" label="CPU Load" 
       value="{respData.result.getString('','Load')}" 
       click="{invokeActivity('DIRECT_URL', 
       bean('url',respData.result.getString('','Load')))}"
       />
    

9.10.3 外部アプリケーションへのリンクの追加

Enterprise Managerの外部の他のアプリケーションにリンクする機能は現在サポートされていません。

9.11 Enterprise Managerデータへのアクセス

MPCUIフレームワークは、Enterprise ManagerのWebサービス・レイヤーへのActionScriptインタフェースを介して、Enterprise Managerのサービスにアクセスできます。必要な場合、これらのクライアント・サービスに直接アクセスできます。多くの場合、Enterprise Managerサーバーと相互作用して管理UIで表示する適切なデータを取得するためにサービスを利用するUIコンポーネントを介して、サービスはさらに抽象化されます。

次の各項では、MPCUIフレームワークに含まれる様々なサービスについて説明し、これらのサービスをコードから使用する方法の簡単な例を示します。


注意:

EDKでは、Flex UIから任意のWebサービスへのアクセスはサポートされていません。Webサービスにアクセスする適切な方法は、メトリック、ジョブ、またはfetchletによって起動されるリモート・コマンドとして、サービス・ホストに常駐する管理エージェントを介します。

9.11.1 メトリック・サービス

MPCUIでは、リアルタイムまたは履歴のいずれかの形式でManagement Serverからメトリック・データを取得するための単純なサービスが提供されます。リアルタイム・データの場合、Oracle Management Serviceは管理エージェントにアクセスしてデータを取得するため、リアルタイムでメトリックを効率的に収集できる場合はこれを使用します。

9.11.1.1 メトリック値サービスの透過的な使用

通常、メトリック値サービスは、グラフに表示するメトリック(折れ線グラフの場合はデータの周期性)を指定することによって、グラフから透過的に使用されます。

            <mp:LineChart id="cacheChart" 
                        width="100%" height="100%" 
                        metricName="MSSQL_MemoryStatistics" 
                        metricColumns="['cache_hit_ratio']"
                        timePeriod="REALTIME" interval="15" >
            </mp:LineChart>

この場合、コール元はサービスと直接相互作用することはありません。MPCUIフレームワークは、サービスを使用して、グラフのデータを取得します。

表コンポーネントの場合、次のようにメトリックを直接指定することもできます。

<c:Table id="processesTable" width="100%" height="100%"
              metricName="CPUProcessesPerf"
              metricColumns="['ProcUser', 'ProcCPU', 'ProcCmd']"
              timePeriod="REALTIME"
              interval="30"
              >
    <c:columns>
      <mx:AdvancedDataGridColumn width="50" dataField="key" />
      <mx:AdvancedDataGridColumn width="100" dataField="ProcUser" />
      <mx:AdvancedDataGridColumn width="80" dataField="ProcCPU" />
      <mx:AdvancedDataGridColumn width="400" dataField="ProcCmd" />
   </c:columns>                
</c:Table>

9.11.1.2 MetricValuesDataServiceタグの使用

ページ(またはダイアログ)内でMetricValuesDataServiceタグを使用して、表コンポーネントにメトリック・データを表示し、表のdataProvider属性はデータ・サービスに設定されます。その後、メトリック・サービスからのデータは表に表示され、サービスからのデータは複数のコンポーネント(たとえば、表とリンクまたはラベル)の間で共有されます。

例9-10 MetricValueDataServiceタグの使用

   <intg:services>
      <dataserv:MetricValuesDataService id="mv1" flattenData="true"
                  targetName="{ApplicationContext.getTargetName()}" 
                  targetType="{ApplicationContext.getTargetType()}" 
                  metricName="Load" columns="{['cpuUtil', 'cpuUser', 'cpuKernel']}"
                  timePeriod="{MetricCollectionTimePeriod.LAST_DAY}"
                  /> 
    </intg:services>
    <comp:Table id="mvTable" dataProvider="{mv1}" />

9.11.1.3 コントローラからのメトリック値サービスの呼出し

コントローラ内からメトリック値サービスを呼び出すことができます。これは、サービスを使用する最も柔軟性のある方法で、UIで表示できるよう、最終結果のモデルへの追加前に、必要に応じてコール元はデータを操作できます。

メトリック・サービスからの個々の値の取得(MXML)

Label、InfoItemまたはそのような他のコンポーネントで表示するために、メトリック・サービスから個々の値を取得できます。

     <ds:MetricValuesDataService id="procData" 
      flattenData="true"
      targetName="{appModel.target.name}" 
      targetType="{appModel.target.type}" 
      metricName="CPUProcessorPerf"
      columns="{['CPUIdle']}"
      timePeriod="REALTIME"
      interval="15" />

値を表示するコンポーネントから、次のように記述します。

<components:InfoItem label="CPU(0) Idle %" 
value="{procData.result.getString('0','CPUIdle')}" />

例9-11 コントローラからのメトリック・サービス

    var cpuPerf:Metric = 
            ApplicationContext.getTargetContext().getMetric("CPUPerf");
    var cpuPerfSel:MetricSelector = procMetric.getSelector( 
            ['system','idle', 'io_wait']);
    cpuPerfSel.getData(cpuDataHandler, MetricCollectionTimePeriod.CURRENT,
            page.getBatchRequest());

特定のメトリックのMetricSelectorを作成することによってメトリック・サービスを使用し、そのセレクタでgetDataメソッドを呼び出します。getDataメソッドを呼び出すと、次の2つのパラメータが渡されます。

  • リクエストの結果を使用して呼び出されるハンドラ

  • 選択の周期性

サービス・リクエストが完了すると、成功またはエラーのどちらの場合でも、ハンドラが呼び出され、リクエストの結果およびフォルトを渡します。データ結果の処理を続行する前に、コール元は、フォルトの存在を確認する必要があります。

例9-12 メトリック・サービスの結果ハンドラ

        public function cpuDataHandler(cpuData:MetricResultSet,fault:ServiceFault):void
        {
        if(fault != null) return;   // handle this better!

        var dataPoint:TimestampMetricData = cpuData.results[0];
        var collectionTime:Date = dataPoint.timestamp;
        var idleTime:Number = dataPoint.data[0]['idle'];
        var systemTime:Number = dataPoint.data[0]['system'];
        var ioWaitTime:Number = dataPoint.data[0]['io_wait']; 
        }

データにアクセスするには、dataService.result.getString('key'、'column')への参照が設定されている必要があります。メトリックが複数のキーをサポートする場合に、サンプルで返される行を識別するために、キーが必要です。メトリックにキー列が含まれていない場合、キー値は''またはNULLとして渡されます。列は、メトリック定義から取得されるデータ列です。

各データ・ポイント(TimestampMetricData)には、データ・ポイントが収集されたときに知らせるタイムスタンプ・メンバーがあり、そのメトリックの表を効率的にするデータ配列が含まれています。

メトリックに複数のキー(プロセス、ファイルシステムなど)がある場合、データ配列には、複数の行(各キーに1つ)があり、各行にはリクエストされたデータ列があります。前の例では、データ配列には、各プロセスに対して1つの行が含まれています。メトリックにキー列が含まれていない場合、データ配列には、単一の行のみが含まれています。

データ配列内の各行は、KeyMetricDataオブジェクトです。メトリックにキーがある場合、metricKeyプロパティは、行が適用するキーを示します。メトリックのキーがない場合、このプロパティは無視されます。KeyMetricDataは、列の値を取得するためにその列の名前を使用して索引付けできる動的オブジェクトです。

前の例では、コードはデータ配列の中の行を進み、各行(KeyMetricData)で、データから'ProcUser'列を取得します。元のリクエストにも'ProcCPU'および'ProcCmd'列が含まれていたため、これらは、同じ方法、つまり、data['ProcCPU']またはdata['ProcCmd']でアクセスできます。

9.11.1.4 メトリック・データソース・フィルタ

MXMLのMetricValuesDataServiceまたはActionScriptのMetricSelectorを介してメトリック・データ・サービスを使用する場合、サービスによって返されるデータのセットを、いくつかの追加の選択基準に従ってフィルタ処理するようにリクエストすると便利な場合があります。これをコントローラ内で実行するには、カスタム・データソースを実装し、コントローラでメトリック・サービスの結果をフィルタ処理し、カスタム・データソースに結果を移入します。

サービス自体が結果をフィルタ処理し、フィルタ処理されたセットのみをクライアントに返して表示するようにするリクエストに適用できるメトリック・フィルタを定義することもできます。

メトリック・フィルタ(MetricPredicateと呼ぶ)は、個々の列フィルタ、フィルタ演算子、基準によるオプションの順序など、いくつかの要素で構成されています。各列フィルタには、フィルタ処理する列、フィルタ処理に使用する演算子、およびフィルタ処理での照合に使用する値を指定します。列フィルタは、GT、LT、GE、LEなど、数値データ用の標準的な演算子をサポートしています。

文字列データの場合、演算子には、EQ、NEおよびREGEXが含まれます。REGEX演算子は、各値とフィルタ入力値をパターンとして使用して、正規表現文字列一致を実行します。正規表現パターン一致はJava regexライブラリを使用して行うため、パターンは、Javaパターン一致の要件に従っている必要があります。

条件演算子は、列フィルタを組み合せて1つの式にし、AND (すべての列フィルタを満たす必要がある)またはOR (いずれかの列フィルタを満たせば十分)をサポートしています。条件による順序には、結果を順序付けする列、および制限する行数を指定します。これは、上位Nの結果を希望する場合に有用です。

メトリック・フィルタを作成する場合、列フィルタはオプションにでき、順序条件は指定したもののみにできます。あるいは、順位条件はオプションにでき、列フィルタは指定したもののみになります。メトリック・フィルタを作成する場合、列フィルタと順序条件に含まれるすべての列は、同じメトリックの一部である必要があり、このメトリックは、対応するメトリック・データ・サービス・リクエストで選択するメトリックである必要があります。複数のメトリックの列を組み合せて同じフィルタにすることは、サポートされていません。

次の例は、MetricValuesDataServiceタグ上でメトリック・フィルタを定義するプロセスを示しています。データ・サービス・タグには、次のように対応するメトリック・フィルタ(MetricPredicate)にバインドされる条件プロパティが含まれます。

<mp:MetricValuesDataService
  id="fsMetDs"
  metricName="FilesystemPerf"
  columns="['MountPoint','Utilization','FreeKB','UsedKB','TotalKB','FSType',
  'FSName']"
  targetName="{appModel.targetName}"
  targetType="{appModel.targetType}"
  timePeriod="LAST_HOUR"
  predicate="{model.fsFilter}"
  />

ページに関連付けられたコントローラでは、フィルタ列、演算子、および条件による順序を指定することで、フィルタが作成されます。次の例では、前述のサービスからのファイル・システム・メトリック・リクエストはフィルタ処理されて、TotalKBサイズが1000kbより大きく、.netのファイル・システム名(FSName)上の正規表現一致を備えたファイル・システムになります。最後に結果は、最初の5つのファイル・システムに制限されたFreeKB列(降順)によって順位が設定されます。

private function createFsFilter():MetricPredicate
  {
        var filters:Array = new Array(
                new MetricFilter('TotalKB', MetricOperator.GT, 1000),
                new MetricFilter('FSName', MetricOperator.REGEX, '(.*)net(.*)') );        
        var orderBy:MetricOrderBy = new MetricOrderBy('FreeKB',
         MetricOrderBy.DESC, 5);            
        var predicate:MetricPredicate = new MetricPredicate(filters,
         MetricOperator.AND, orderBy);
 
        return predicate;
   }

9.11.2 カスタム・データソース

グラフのデータを取得するために使用できるメトリックとSQLデータソース(およびサービス・タグ)、表およびその他のコンポーネントに加えて、これらのコンポーネントの独自のカスタム・データソースを構築できます。他のMPCUIサービスからデータを取得し、表示前にそれを操作する場合に、これは役立ちます。たとえば、2つのメトリックのデータを結合するには、何らかの方法でデータをフィルタ処理するか、またはデータを集計します。カスタム・データソースを作成するには、コントローラ・コードを使用して、ソース・データを取得してから、データソースを作成するようにそれを操作する必要があります。カスタム・データソースでは、次の重要な動作が実行されます。

  • データの表示時にUIコンポーネントで役立つように、データソースに含まれるデータの列記述子を設定します。記述子には、データ型、表示ラベルなどのプロパティが含まれています(凡例または列ヘッダー用)。

  • 時系列グラフでデータの表示を可能にするための、複数のデータ・ポイントをサポートします。

  • データソースの基礎となる情報が変更されると、コンポーネントは更新されたデータを表示できるようになり、データソースのキャッシュおよび変更をサポートします。

9.11.2.1 カスタム・データソースの作成

通常、カスタム・データソース(oracle.sysman.emx.model.CustomDataSource)は、Page.setModelを使用して、ページ・モデルで構築および設定されます。データソースを構築する際には、次を示すフラグとともに、データソースを構成する列(またはデータ項目)を指定する必要があります。

  • キーが含まれているようにデータを処理する場合

    データソースが棒グラフまたは列グラフなどのキーを適用するグラフで表示される場合のみ、キーを指定します。データが表形式のビューや非グラフ・コンポーネントで表示される場合、列の1つをキーとして特定する必要はありません。

  • 複数のタイムスタンプ・サンプルが含まれているようにデータを処理する場合

    データが時系列グラフ(LineChart)で表示され、MPCUIポーリング・メカニズムを使用して一定期間にデータソースに追加されるデータ・サンプルがある場合のみ、データがタイムスタンプを含めるよう指定します。

public function CustomDataSource(columns:Array, hasKey:Boolean=false, isTimeSeries:Boolean=false)

列の配列は、データソースに含まれるデータ項目を指定します。この配列は次のいずれかになります。

  • 各文字列がデータ項目のラベルを指定する、文字列の配列

  • 列記述子(QueryColumDescまたはCustomColumnDescのいずれか)の配列

    列記述子を指定すると、列のラベルおよびデータ型を指定できSpecifying (QueryColumnDescの場合)、列がソート可能な場合など、列幅などの表形式の表示でデータを表示するための追加のプロパティを指定できます(CustomColumnDescの場合)。

例9-13に、SqlQueryServiceへのリクエストから返されるデータを処理するために設定されるコントローラでの結果ハンドラを示します。

例9-13 SQLQueryServiceへのリクエストから返されるデータの処理

// execute a SQL query and then massage the data for display
                var query:SqlQueryService = new SqlQueryService('CPU_USAGE', 
                            [SqlQueryInput.createParam("TARGET_GUID", 
                            ApplicationContext.getTargetContext().guid)]);
                query.execute(cpuQueryHandler, page.getBatchRequest());
        }
        
        
        public function cpuQueryHandler(result:SqlQueryResultSet, 
                            fault:ServiceFault):void
        {
            
            if(fault != null || result.getError() != null) return;
            
                    cpuSqlData = new CustomDataSource([
                        new QueryColumnDesc("Processor", QueryColumnType.STRING), 
                        new QueryColumnDesc("Idle Percentage", QueryColumnType.DECIMAL),
                        new QueryColumnDesc("Used Percentage", QueryColumnType.DECIMAL)
                        ], true);
                    page.setModel("cpuSqlData", cpuSqlData);
      
            if(result.rows != null)
            {
                for(var r:int=0; r<result.rows.length; r++)
                {
                    var id:String = result.getString(r, 'CPU Number');
                    var idle:Number = result.getNumber(r, 'Idle %');
                    var used:Number = result.getNumber(r, 'Used %');
                    cpuSqlData.setRow("Processor #"+id, idle, used);
                }
            }           
        }
  

例9-13では、データソースは3つの列で構築され、データ型が指定されます。コンストラクタへの2番目のパラメータは、キーが含まれているようにデータを処理することを示すtrueとして渡されます。この場合、リストの最初の列は、常にキーとして処理されます。データ内の別の位置を指定できません。

最後に、SqlQueryResultSet (result.rows)の各行に対して、コードでは、カスタム・データソースに行を構築します。


関連項目:

処理の完全な例は、EDKのdemo_hostsample,ProcessesPageController.asを参照してください。

9.11.2.2 UIコンポーネントへのデータソースのバインディング

ページ・レイアウト(たとえばProcessesPage.mxml)で、データは、dataProviderプロパティを使用して、UIコンポーネントにバインドされます。例9-14では、cpuSqlTableに注意してください。これは、cpuSqlDataカスタム・データソースにロードされたデータを表示する表です。

例9-14 UIコンポーネントへのデータソースのバインディング

<mp:Region id="cpuUtilRegion" width="100%" height="100%" title="CPU Utilization" >     
  <mx:HBox width="100%" height="100%"> 
  <mp:LineChart id="cpuUtilChart" width="60%" height="100%" 
         dataProvider="{model.cpuChartData}" 
         legendLocation="right" showLegend="true" />
  <mp:Table id="cpuSqlTable" dataProvider="{model.cpuSqlData}" 
                                        width="40%" height="100%"/>
  </mx:HBox>      
</mp:Region>

図9-7に、例9-14によって表示される結果を示します。

図9-7 cpuSqlDataカスタム・データソースにロードされたデータを表示する表

図9-7の説明が続きます
「図9-7 cpuSqlDataカスタム・データソースにロードされたデータを表示する表」の説明

9.11.2.3 カスタム・データソースの更新

データソースはUIコンポーネントにバインドされるため、更新すると、UIは新しいデータを自動的に表示します。カスタム・データソースを更新するには、次の2つのオプションがあります。

  1. CustomDataSource.setRowまたはsetRowsメソッドのいずれかを呼び出します。

    これらのメソッドは、タイムスタンプ付きデータを含まないデータソースがある場合に使用されます。この場合、データソースに含まれる行を変更します。

  2. データソースがタイムスタンプ付きデータを含む場合、CustomDataSource.setTimestampedRowsメソッドを呼び出します。

    このメソッドは、新しいサンプルを時系列に追加し、通常、データソースを折れ線グラフに表示する場合に使用されます。このメソッドを呼び出して新しいサンプルを追加すると、新しい時間スライスが折れ線グラフに表示されます。

これらのメソッドの詳細は、APIリファレンスおよびカスタム・データソースを使用した例のdemo_hostsampleを参照してください。

9.11.3 計算されるデータソース

Enterprise Managerメトリック収集フレームワークは、カウンタからの値を計算する能力をサポートしています。ただし、値が正確であると保証されるのは、エージェントが収集した履歴データから取得され、リポジトリに格納されている場合のみです。リアルタイム・リクエスト(たとえば、timePeriodがREALTIMEに設定されているMetricValuesDataService)からこれらの値を問い合せしようとすると、予期しない結果が生じることがあります。計算される値は、リアルタイム収集用に格納されたカウンタではなく、履歴収集時に格納された最後のカウンタを使用するためです。したがって、計算されたメトリックのリアルタイム表示を必要とする場合、計算されたデータソースの使用の検討が必要になることがあります。

計算されたデータソースは、2つのメトリックからのデータを組み合せて1つの表示にできます。これが有用なのは、表示するメトリックが、すでに説明した格納済のカウンタを使用した計算式に基づいている場合です。

このデータソースを使用するには、通常2つのメトリックを定義します。1つのメトリックは、収集されて履歴用にリポジトリに格納される値を計算します。このメトリックは、格納されているカウンタを使用する計算式を含んでいます。もう1つのメトリックは、カウンタ自体のみを収集する一時メトリックです。RAWカウンタ値は通常有用ではないため、このメトリックは履歴目的では収集されません。

UIコードで計算されたデータソースを作成する場合、両方のメトリック・セットが必要です。1番目のメトリックは、計算された形式でメトリックを指定し、ソース・メトリックと呼ばれます。データソースは、これらのメトリックを使用して、列のラベルなどのデータの表示属性を定義し、必要な履歴データも取得します。

/**
* Construct a data source that shows the CPU-System% and CPU-Idle% from historical 
* data and then appends data to it from a real-time data source that acquires  
* counter columns and derives the values from the counters.  First declare the 
* columns to be shown on the chart, the labels will be based on the metric-column * labels and will obtain the historical data that initially populates the chart.
*/
var srcCols:Array = [
    new ComputeColumnDesc( ApplicationContext.getTargetContext(), "CPUPerf", 
    "system"),
     new ComputeColumnDesc( ApplicationContext.getTargetContext(), "CPUPerf", 
     "idle"),                
    ];
                
/**
* These are the counter columns; they do not need to be from the same metric as  
* the source columns, however the counter columns must be from the same metric as 
* all other counters.
*/
var ctrCols:Array = [
    new ComputeColumnDesc( ApplicationContext.getTargetContext(), "CPUPerf", 
    "systemCounter"),
    new ComputeColumnDesc( ApplicationContext.getTargetContext(), "CPUPerf", 
    "idleCounter"),             
    ];
            
/**
* create the data source and pass the source columns, the counter columns and a 
* pointer to the compute function.  Finally pass the page the data source will be 
* consumed on and the interval to be used to populate the data.  The compute 
* function will be called at each interval.
*/
var computedDataSource:ComputeDataSource = new ComputeDataSource(srcCols, ctrCols, computeFunction, 
                         page, PollingInterval.EVERY_15_SECONDS);
page.setModel("compDataSource", computedDataSource);

計算されたデータソースは、履歴データを求めるリクエストを送り、指定した間隔でカウンタのポーリングを行います。サンプルが取得されるたびに、計算関数が呼び出され、計算されたデータソースと、カウンタ・メトリック用の最新の値セットを含むデータ・ポイント(TimestampMetricData)に参照が渡されます。

計算関数は、カウンタを使用して値を計算でき、ソース列で特定されるメトリックと同じ名前を持ったメトリックを含むデータ・ポイントを返す必要があります。前の例では、カウンタ列はsystemCounterとidleCounterですが、計算関数から返されるデータ・ポイントは、ソース列systemとidleの値を含んでいる必要があります。

public function computeFunction(ds:ComputeDataSource, dp:TimestampMetricData):TimestampMetricData
 {
   // retrieve the counter values from the data point passed; could also retreive
   // any necessary context from the data source
   var systemCounter:Number = dp.data[0]["systemCounter"];
   var idleCounter:Number = dp.data[0]["idleCounter"];
       
   // compute values; this is where you would replicate the logic in your 
   // computed metric
   var systemValue:Number = systemCounter+Math.floor(Math.random()*(50 - 20 + 1)) + 20;
   var idleValue:Number = idleCounter+Math.floor(Math.random()*(120 - 80 + 1)) + 80;
            
   // you must now return a TimestampMetricData object.  You can use the one passed and return
   // it, but to do so you must add columns to the data point.  The index reference [0] is
   // a reference to the fact that the datapoint could have multiple rows, one for each key
   // but the example does *NOT* support multiple keys.  Also, if you created a new 
   // data point to return you would need to set the timestamp of the datapoint
   // correctly, using the timestamp of the sourced datapoint
   dp.data[0]["system"] = systemValue;
   dp.data[0]["idle"] = idleValue;
                       
   return dp;
 }

9.11.4 パッケージ化されたSQLおよび問合せサービス

MPCUIフレームワークがUIコンポーネントまたは単純化されたサービス(メトリック・サービスなど)のいずれかを介して最も有用なデータにアクセスする場合、必然的に、より非構造化された形式で管理リポジトリに格納された他の情報にアクセスできる必要があります。MPCUIフレームワークは、このアクセスのためにSQL問合せサービスを提供します。

SQL問合せサービスによって、プラグインを使用してSQL文をパッケージ化し、その文をWebサービスを介して実行し、データをカスタムUIのUI要素にバインドすることができます。SQL問合せサービスでは、セキュリティ・リスクが発生する可能性があるため、無制限なAPIやスクリプト化可能なAPIを管理リポジトリに提供しません

SQL問合せサービスは、Enterprise Managerの拡張フレームワークを介して管理リポジトリにデプロイされたSQL文のみを実行できます。これにより、文がEDKビューのみにアクセスできることを確認します。これにより、多くの柔軟性が提供され、Enterprise ManagerのパートナEDKビューとともに、独自のビュー(Enterprise Manager構成データから生成されたビューなど)からデータにアクセスする機能が提供されます。

SQLDataServiceタグを使用して、ページ・コード内の問合せサービスを完全にカプセル化できます。このタグによって、コール元がSQLを処理し、パラメータを渡すように指定できます。このデータ・サービス・オブジェクトは、表またはサポートする他のUIコンポーネントにバインドできます。

例9-15 SQLDataServiceタグの使用

    <intg:services>
      <ds:SQLDataService id="dbSummaryDS" queryID="DATABASE_SUMMARY" 
                    properties="{model.dbSummProp}" />      
    </intg:services>
    
            <t:Table id="dbSummaryTable" dataProvider="{dbSummaryDS}"> 
                <t:columns>
                    <mx:AdvancedDataGridColumn width="100" dataField="Name"/>
                    <mx:AdvancedDataGridColumn width="100" dataField="Status"/>
                    <mx:AdvancedDataGridColumn width="500" dataField="Database File Location"/>
                </t:columns>
            </t:Table>

SQL DataServiceからの個々の値の取得

コンポーネント(LinkやLabelなど)内で使用するためにSQLdataServiceから返される特定のセルを参照するには、次のタイプの参照が使用されます。

      <ds:SQLDataService id="ids" queryID="INSTANCE_INFO" 
                     properties="{props('TARGET_GUID',appModel.target.guid)}" />
 
      <components:InfoItem label="CPU Model" 
                     value="{ids.result.getString(0,'CPU Model')}" />   
                        

データ・サービスへの参照は、dataService.result.getString(rowIndex,'column')を介して行い、rowIndexは問合せから返される行で、columnは元のSQL問合せで指定される列の名前です。

問合せサービスは、コントローラ内から呼び出すこともでき、表示前のデータの操作方法の点で、より多くの柔軟性が提供されます。問合せサービスにアクセスする2つのAPIがあります。

  • SqlQueryインタフェース

    SqlQueryインタフェースによって、単一のSQL問合せが処理を行い、バインド変数を渡し、返される結果セットを受け取ることができます。結果セットでは、JDBC ResultSetのインタフェースとかなり類似したインタフェースが提供されます。

    例9-16 SqlQuery APIの使用

        var getInfoSvc:SqlQuery = new SqlQuery("GET_TARGET_INFO",
                [["TARGET", name],["TYPE", type]]);   // bind variables
         getInfoSvc.execute(getTargetInfoHandler);
    
     public function getTargetInfoHandler(resultSet:ResultSet, fault:ServiceFault):void
     {    
         var target:Target;            
         if(fault == null)
         { 
             if(resultSet != null && resultSet.getError() == null)
             {
                 target.setGuid(resultSet.getBase64Binary(0, "TARGET_GUID"));
                 target.setTypeMetaVer(resultSet.getString(0, "TYPE_META_VER"));
                 
                 var props:Array = new Array();
                 for(var i:int=1; i<Target.NUM_PROPERTIES+1; i++)
                     props.push(resultSet.getString(0, "CATEGORY_PROP_"+i));
                 target.setCatProperties(props);      
             }    
     }
    
  • BulkSqlQueryインタフェース

    バインド変数は、名前によって参照され、パッケージ化されたSQL文で表される変数に対応します。

        SELECT target_guid, type_meta_ver, category_prop_1, category_prop_2, 
                 category_prop_3, category_prop_4, category_prop_5
         FROM mgmt_targets
         WHERE target_name = ?TARGET?
         AND target_type = ?TYPE? 
    

    多くの問合せを単一のリクエストで処理できる場合、BulkSqlQueryインタフェースを使用できます。各問合せは、一括問合せに追加する必要があり、処理するすべての問合せが追加されると、BulkSqlQuery.executeメソッドが呼び出され、結果を使用して呼び出される結果ハンドラに渡されます。

    SqlQueryの結果ハンドラが、処理された問合せの単一のSqlQueryResultSetに渡されると、BulkSqlQueryの結果ハンドラがBulkResultSetに渡されます。その後、問合せの追加時に指定されたリクエストIDを使用して、各問合せのSqlQueryResultSetを取得する必要があります。

    同じ問合せを、同じ一括リクエストの一部として、異なるバインド変数で複数回処理できる場合をサポートするには、別のリクエストIDが必要です。

    例9-17 BulkSqlQuery APIの使用

      var guidParam:Array = [["TARGET_GUID", ApplicationContext.getTargetContext().guid]];
    
      var bulkQuery:BulkSqlQuery = new BulkSqlQuery();  
      bulkQuery.addQuery("INSTANCE_INFO", "INSTANCE_INFO", guidParam);      
      bulkQuery.addQuery("PROCESS_STATES", "PROCESS_STATES", guidParam);
      bulkQuery.addQuery("PROCESS_INFO", "PROCESS_INFO", guidParam);    
                                                             
      bulkQuery.execute(pageDataHandler, page.getBatchRequest()); 
    
    public function pageDataHandler(bulkResult:BulkResultSet, fault:ServiceFault):void
    {
      var info:SqlQueryResultSet = bulkResult.getResultSet("INSTANCE_INFO");
    

9.11.4.1 パッケージ化されたSQLの記述に関するガイドライン

MPCUI用にパッケージ化されたSQLを記述する際は、次のガイドラインに従ってください。

  • パッケージ化されたSQLは、パートナEDKの一部であるビューにのみアクセスできます。これには、構成メトリック定義の結果として生成されるビューが含まれます。

  • データの変更(更新または削除)を試行するSQLは、プラグイン・デプロイメントの際にMRSによってフィルタ処理されます。

  • データ定義言語(DDL)を試行するSQL文は、MRSによって除外され、許可されません。

  • PL/SQLプロシージャへのアクセスはパッケージ化されたSQLから許可されていないため、匿名PL/SQL (begin、endコンストラクトなど)は許可されません。

  • バインド変数は、テキスト識別子によって識別し、接頭辞および接尾辞に?を付ける必要があります。たとえば、?TARGET_TYPE?のようになります。

  • バインド変数は、大/小文字が区別されません。

  • 問合せサービスでは、結果セットのサイズが1000行または100,000バイトに制限されるため、問合せで返される可能性がある結果セットのサイズを制限するよう注意してください。

9.11.4.2 プラグインでのSQLのパッケージ化

MPCUIコードで使用されるSQL文は、SqlStatements要素を使用したMPCUIメタデータでパッケージ化されます。

MPCUIメタデータでのSQL文の場所の詳細は、9.4.1項「MPCUIメタデータ要素の概要」を参照してください。MPCUIメタデータXSDの詳細は、EDKメタデータのAPIリファレンスを参照してください。

9.11.4.3 ターゲット・タイプ情報の取得

プラグインUIが、表示名などの関連のターゲット・タイプに関する情報を必要とし、また、そのターゲット・タイプの特定のインスタンスに関する詳細を必要としない場合、TargetFactoryは、このサマリー情報を取得する関数を提供します。

TargetFactory.getTargetTypeInfo関数は、ターゲット・タイプの表示名を含むTargetTypeInfoオブジェクトを返します。この関数を呼び出すと、内部targetTypeが提供された(たとえば、oracle_database) TargetTypeInfoオブジェクトとハンドラ関数が渡されます。ハンドラは、TargetTypeInfoと、リクエストの処理中に発生した障害とともに呼び出されます。

            var typeInfo:TargetTypeInfo = new TargetTypeInfo("oracle_database");
            TargetFactory.getTargetTypeInfo(typeInfo, getTypeInfoHandler);
    }
        
    private function getTypeInfoHandler(typeInfo:TargetTypeInfo,
    fault:ServiceFault):void
        {
            if(fault != null)
             {
                MpLog.logError(fault, "Getting Target Type Info");
                return;
            }
             
            MpLog.info("Target Display Label for (oracle_database):
            "+typeInfo.typeDisplayName);
         } 

9.11.5 ターゲット・サービスの操作

以前に説明したサービスに加えて、MPCUIフレームワークでは、ターゲット・オブジェクト(oracle.sysman.emx.model.Target)の不可欠な部分である他の多くのサービスが提供されます。MPCUIアプリケーションの実行時に、ApplicationContext.getTargetContext()コールによって、プライマリ・ターゲットのターゲット・インスタンスが返されます。

関連するターゲットに対して、他のターゲット・インスタンスを構築できます。どちらの場合も、次の方法を使用して、MPCUIサービス・レイヤーを介してこれらのターゲットの追加情報を取得します。

9.11.5.1 ターゲット・プロパティ・サービス

ターゲット・クラスのインスタンスに対して、getTargetInfo()メソッドを呼び出して、そのターゲット・インスタンスに関連付けられたターゲット・プロパティを取得できます。返されるターゲット情報は、guidcatPropertiestypeMetaVertimezoneRegionなどのターゲット・インスタンスのプロパティを移入します。

これらのプロパティの詳細は、EDKのターゲット・クラスのドキュメント(/doc/partnersdk/mpcui/emcore/doc/oracle/sysman/emx/model/Target.html)を参照してください。

getTargetInfo()メソッドを呼び出す場合、ハンドラを指定する必要があります。このハンドラは、targetInfoサービスが返す際に呼び出されます。これは、完全に移入されたターゲット・インスタンス、および、ターゲット・プロパティを取得するためのリクエストの処理中に発生したエラーを含めるよう設定されたフォルト・オブジェクトに渡されます。

    var target:Target = ApplicationContext.getTargetContext();
     target.getTargetInfo(targetInfoHandler);


         public function targetInfoHandler(target:Target, fault:Fault):void

注意:

ApplicationContext.getTargetContext()の場合、アプリケーションの起動時に、現在のターゲット情報がロードされ、ターゲット・プロパティが変更されたことを考慮しない場合、そのターゲット・インスタンスのgetTargetInfo()を呼び出す必要はありません。

9.11.5.2 関連ターゲット・サービス

target.getAssociatedTargets()メソッドを使用して、ターゲット・インスタンスに関連する一連のターゲットを取得します。このメソッドは、呼び出され、アソシエーション・タイプの配列および関連ターゲットのリストとともに呼び出されるハンドラに渡されます。このメソッドによって返されるオブジェクトのタイプの完全な説明は、APIドキュメントを参照してください。

   // get associated host 
    var target:Target = ApplicationContext.getTargetContext();
    var assocTypes:Array = [ AssociationDataService.HOSTED_BY ];
    target.getAssociatedTargets(assocTypes, assocHandler); 

        public function assocHandler(assocResult:GetAssociationsResult,
                                 fault:ServiceFault):void
        {
            var host:ManageableEntityComponent = 
                assocResult.getAssoc(AssociationDataService.HOSTED_BY);
            if(host != null) 
                page.setModel("relatedHost", host.name);
        }

9.11.5.3 メトリック・メタデータ・サービス

target.getMetricMetadata ()メソッドを使用して、ターゲット・インスタンスのメトリック定義情報を取得します。指定したメトリック名のメトリック・オブジェクトを返すTarget.getMetric()メソッドを呼び出すことによって、メトリック・メタデータ情報が取得されます。このメソッドによって返されるオブジェクトのタイプの完全な説明は、APIドキュメントを参照してください。

    var target:Target = ApplicationContext.getTargetContext();
     target.getMetricMetadata(metadataHandler);


 public function metadataHandler (target:Target,
        fault:Fault):void

注意:

ApplicationContext.getTargetContext()の場合、アプリケーションの起動時に、現在のターゲット・メトリック・メタデータがロードされ、ターゲット・メタデータが変更された(この可能性は低い)ことを考慮しない場合、そのターゲット・インスタンスのgetMetricMetadata()を呼び出す必要はありません。

9.11.5.4 可用性サービス

target.getAvailability()メソッドを使用して、ターゲット・インスタンスの現在の可用性情報を取得します。可用性情報(AvailOverviewData)には、現在のステータス、過去24時間の稼働時間(%)などがあります。このメソッドによって返されるオブジェクトのタイプの完全な説明は、APIドキュメントを参照してください。

      var target:Target = ApplicationContext.getTargetContext();
       target.getAvailability(targetAvailHandler);


           public function targetAvailHandler(availInfo:AvailOvervieData,
                                 fault:Fault):void

9.11.6 サービス・リクエスト・パフォーマンスの監視

MPCUIには、MPCUIコードで作成されたサービス・リクエストのパフォーマンスを監視できるトレース・サービスがあります。これは、遅いページのトラブルシューティングや、Management Serverでリクエストの処理に要した時間の特定を行う際に役立ちます。

サービス・トレースを有効にするには、次の手順に従います。

  1. 実装に応じて、次のいずれかを選択します。

    • FlexベースのUI

      1. html-template/data/mpCuiProperties.xmlファイルを特定します。これは、プロジェクト・ディレクトリに含まれています(デモ・サンプルをテンプレートとして使用している場合)。

      2. mpCuiProperties.xmlファイルに次の行を追加します。

        <traceEnabled>true</traceEnabled>
        
      3. アプリケーションを再ビルドしてから、Flex Builderデバッガを使用して起動するか、オプションを実行します。

    • メタデータのみのUI

      1. コンソールでMPCUIページを実行する際には、プラグインがデプロイされていることを確認します。

      2. プラグインに関連付けられたターゲットのホームページにアクセスします。

      3. ブラウザ・ウィンドウのアドレス・ボックスで、URLの末尾に次を追加します。

        &traceEnabled=true
        
      4. [Enter]を押して、ページをリロードします。

    MPCUIアプリケーションはロードを行い、図9-8のような「アクティビティ・トレース」ダイアログを含むホームページが表示されます。

    「アクティビティ・トレース」ダイアログには、現在のセッションでアクセスされた一連のページが表示され、各ページの下に、Management Serverに対して作成された一連のリクエストが表示されます。

    図9-8 「アクティビティ・トレース」ダイアログ

    図9-8の説明が続きます
    「図9-8 「アクティビティ・トレース」ダイアログ」の説明

  2. 右上隅にあるコントロールを使用して、ダイアログを開いたり閉じたりします。MPCUIアプリケーションがアクティブである間、リフレッシュを続行します。


    注意:

    ダイアログの上部のペインで、サービス・リクエストを選択すると、合計時間(往復)およびManagement Serverでリクエストの処理に要した時間(サービス時間)が表示されます。

  3. 詳細ペインで、「アイテム詳細の表示」をクリックすると、アプリケーションとManagement Serverとの間で送信されたリクエストおよび応答のメッセージの本文が表示されます。

9.11.7 サービス・リクエストの自動ポーリング


注意:

グラフ、表またはデータ・サービスに対するREALTIMEデータ選択の重要な使用方法は、指定した間隔でデータの自動ポーリングを開始することです。

MPCUIフレームワークでは、Management Serverへの膨大なリクエストを回避するため、リクエストをグループ化できるように、制限された間隔のサブセット(15、30、60、90秒)をサポートしています。

各ページまたはダイアログが表示されるか削除(スコープ外に移動)されると、MPCUIフレームワークは、これらのリクエストのポーリングを自動的に開始および停止します。

ページまたはダイアログのスコープを超えて永続的なポーリング・リクエストは開始できません。

9.11.8 サービス・リクエストのバッチ処理

ポーリング・リクエストのバッチ処理に加えて、MPCUIフレームワークでは、アクティビティ(ページまたはダイアログ)コントローラから実行時に作成されたリクエストを明示的にバッチ処理する機能が提供されています。UIメッセージのパフォーマンスを遅くするManagement Serverへの追加の往復を回避し、Management Serverにさらにオーバーヘッドを追加する場合に、リクエストのバッチ処理はよい方法です。

リクエストをバッチ処理する最も一般的な機会は、アクティビティの初期化の一部として行うときです。

  • ページ・レイアウト(MXMLファイル)で宣言されたデータ・サービスの場合、MPCUIフレームワークは、リクエストをバッチ処理します。

  • controller.init()メソッドから作成するサービス・リクエストの場合、ページのバッチ・リクエストをサービス・メソッドに渡すことができます。MPCUIフレームワークは、ページのロード後にinit()メソッドを呼び出します。

例9-18は、デモ・サンプルのHomePageController.asファイルから抽出したものです。メソッド内のpage.getBatchRequest()のインスタンスに注意してください。この方法で作成されたすべてのリクエストは、Management Serverへの単一のパスで実行されます。

例9-18 アクティビティの初期化の一部としてのリクエストのバッチ処理

 override public function init(pg:IActivity):void
  {   
    super.init(pg);                               
    page = pg as HomePage;                                                     

    var guidParam:Array = [["TARGET_GUID", 
            ApplicationContext.getTargetContext().guid]];            
    var bulkQuery:BulkSqlQuery = new BulkSqlQuery();          
    bulkQuery.addQuery("INSTANCE_INFO", "INSTANCE_INFO", guidParam);
    bulkQuery.addQuery("CPU_USAGE", "CPU_USAGE", guidParam);  
    bulkQuery.execute(queryResultHandler, page.getBatchRequest());

    // get processes metric to get process summary information
    var procMetric:Metric = ApplicationContext.getTargetContext()
            .getMetric("CPUProcessesPerf");
    var procSelector:MetricSelector = procMetric
            .getSelector(['ProcUser', 'ProcCPU', 'ProcCmd']);
    procSelector.getData(processesHandler, 
            MetricCollectionTimePeriod.CURRENT, page.getBatchRequest());    
            
    var cpuPerf:Metric = ApplicationContext.getTargetContext()
            .getMetric("CPUPerf");
    var cpuPerfSel:MetricSelector = cpuPerf.
            getSelector(['system', 'idle', 'io_wait']);
    cpuPerfSel.getData(cpuDataHandler, 
            MetricCollectionTimePeriod.REALTIME, page.getBatchRequest());           

    // get associated host 
    var target:Target = ApplicationContext.getTargetContext();
    var assocTypes:Array = [ AssociationDataService.HOSTED_BY ];
    target.getAssociatedTargets(assocTypes, assocHandler, 
            page.getBatchRequest());    
}

MultiServiceRequestor (バッチ・リクエスト)を作成し、作成した各リクエストにそれを渡すことによって、コントローラ・コードの他の場所でバッチ・リクエストを使用できます。たとえば、ページでのボタン・クリックへの応答で、情報を取得するためにManagement Serverへの2つのリクエストが作成されるとします。例9-19に示すように、これらはそれぞれ別に実行されます(サーバーへの往復が2回行われることになります)。

例9-19 個々のバッチ・リクエストの作成

 var procMetric:Metric = ApplicationContext.getTargetContext()
            .getMetric("CPUProcessesPerf");
 var procSelector:MetricSelector = procMetric
            .getSelector(['ProcUser', 'ProcCPU', 'ProcCmd']);
 procSelector.getData(processesHandler, 
            MetricCollectionTimePeriod.CURRENT);    // 1st round trip

 var cpuPerf:Metric = ApplicationContext.getTargetContext()
            .getMetric("CPUPerf");
 var cpuPerfSel:MetricSelector = cpuPerf.
            getSelector(['system', 'idle', 'io_wait']);
 cpuPerfSel.getData(cpuDataHandler, 
            MetricCollectionTimePeriod.REALTIME);  // 2nd round trip        

かわりに、例9-20に示すように、複数のバッチ・リクエストを単一のバッチ・リクエストに結合して、Management Serverへの追加の往復を回避することもできます。

例9-20 バッチ・リクエストの結合

  var batchRequest:MultiServiceRequestor = new MultiServiceRequestor();
 
            var procMetric:Metric = ApplicationContext.getTargetContext()
            .getMetric("CPUProcessesPerf");
  var procSelector:MetricSelector = procMetric
            .getSelector(['ProcUser', 'ProcCPU', 'ProcCmd']);
  procSelector.getData(processesHandler, 
            MetricCollectionTimePeriod.CURRENT, batchRequest);    
            
  var cpuPerf:Metric = ApplicationContext.getTargetContext()
            .getMetric("CPUPerf");
  var cpuPerfSel:MetricSelector = cpuPerf.
            getSelector(['system', 'idle', 'io_wait']);
  cpuPerfSel.getData(cpuDataHandler, 
            MetricCollectionTimePeriod.REALTIME, batchRequest); 
 
  batchRequest.sendRequest();     // 1st and ONLY round trip!

注意:

バッチ・リクエストをコミットするには、sendRequest()メソッドを呼び出す必要があります。それ以外の場合、リクエストは送信されません。page.getBatchRequest()PageController.initを使用する場合、MPCUIフレームワークで行われるため、これは必要ありません

9.11.9 ソフトウェア・ライブラリ検索サービス

プラグインUIがソフトウェア・ライブラリ・エンティティに関する情報を必要とする場合、名前、ステータス、成熟度レベル、エンティティ属性など、様々な条件を使用して検索できます。SearchField列挙を使用して問合せ条件を指定すると、目的のエンティティをフィルタ処理できます。問合せ条件と一致するエンティティ・リビジョンを表すEntityInfoオブジェクトのリストが返されます。EntityInfoオブジェクトのURNは、エンティティ・リビジョンの一意な識別子として使用できます。エラーが発生した場合、ListSwlibEntitiesResult.errorMessageに設定されます。

    // search the software library
    var swSearch:ListSwlibEntities = new ListSwlibEntities();
    swSearch.addSearchInput(new SearchInput(SearchField.NAME, "oracle"));
    var swlib:Swlib = Swlib.getSwLib();
    swlib.listEntities(swSearch, swSearchHandler);
  }
            
  private function swSearchHandler(result:ListSwlibEntitiesResult, fault:ServiceFault):void
     {
         var r:ListSwlibEntitiesResult; var e:EntityInfo;
         if(fault != null)
            {
                MpLog.logError(fault, "Search Software Library");
                return;
            }
    
         for(var i:int=0; i<result.swlibEntitiesList.length; i++)
            {
                var entity:EntityInfo = result.swlibEntitiesList[i];
                MpLog.info("Swlib Entity: "+entity.toString());
            }
 
         page.setModel("swlibContents", result.swlibEntitiesList);
     }

9.12 タスク自動化の実行

次の各項では、タスク自動化の実行方法について例とともに説明します。

次が含まれています。

9.12.1 自動化サービス

MPCUIフレームワークのより強力な側面の1つは、目的のためにカスタマイズされたUIを介して、管理機能にアクセスする機能です。フレームワークでは、Enterprise Managerのジョブ・システムおよびジョブ・システムにアクセスするWebサービスを介して、管理タスクの処理をサポートします。

MPCUIでは、次のジョブ・サービスが提供されます。

  • Job.submit

  • Job.runSynchronous

  • JobExecution.getStatus

  • JobExecution.getDetails

  • JobExecution.stopJob

  • JobExecution.deleteJob

  • JobExecution.getJobDetailsURL

  • RemoteOp.performOperation

9.12.1.1 ジョブの発行または実行

ジョブ・サービスによって、プラグイン・ターゲットに登録されたジョブを、処理のために発行できます。サービスは、現時点でのシステムのジョブ・タイプを発行する機能はサポートしていません。

ジョブ・サービスを介したジョブのスケジュールは、ジョブ・システムによってサポートされた一連の制限付きスケジュール・オプションをサポートします。ジョブ・スケジュールは次のオプションをサポートしています。

  • 即時、一度、毎時、毎日、毎週、毎月、毎年

  • 発行の繰返しの開始時間および終了時間

  • 繰返しの回数および頻度

  • 開始期間の猶予期間

  • 管理リポジトリまたはターゲットのタイムゾーン

サポートされているジョブのパラメータ・タイプは、Vector、Scalar、LargeおよびValueOfです。

他のサービスと同様に、Adobe Flexフレームワークは、リクエストを非同期に発行します。これには、リクエストが完了(または)失敗したときに呼び出されるハンドラを指定する必要があります。ジョブを発行すると、結果ハンドラが呼び出され、JobExecutionオブジェクトに渡されます。このオブジェクトには、発行されたジョブの処理コンテキストが含まれ、ジョブのステータスの取得や、ジョブにおける操作(停止や削除)に使用できます。

例9-21 ジョブの発行

  var job:Job = new Job("backup", "MyBackup", null, 
                ApplicationContext.getTargetContext(), 
                [Job.jobParam("dsn", "AdminDS"), Job.jobParam("sql_cmd",stmt)], 
                 JobSchedule.IMMEDIATE);
  job.submit(jobSubmitHandler);
} 

private function jobSubmitHandler(exec:JobExecution, fault:Fault):void
{
       // using exec (JobExecution) can now get current status of job,
       // get step details, and start or stop the job
  var execId:JobExecutionId = exec.getExecutionId();
}

ジョブがこの方法(submitメソッドを使用して)実行されると、ジョブは処理するために発行され、サービスは即時に返します。そのため、ジョブのステータスは、発行済から、実行中、完了に変更され、クライアントは、ステータスを定期的にチェックする必要があります。

ジョブ・サービスでも、即時処理のためにジョブを発行する方法が提供され、ジョブ実行が完了、失敗またはタイムアウトに到達するまで待機(同期的に)します。クライアント・ハンドラは、この状態に到達するまで呼び出されません。

例9-22 同期ジョブの実行

    var job:Job = new Job("backup", "MyBackup", null, 
            ApplicationContext.getTargetContext(), 
            [Job.jobParam("dsn", "AdminDS"), Job.jobParam("sql_cmd",stmt)], 
            JobSchedule.IMMEDIATE);
    job.runSynchronous((jobRunHandler, 30); // 2nd param is timeout
} 

private function jobRunHandler(exec:SynchronousJobExecution, fault:Fault):void
{
    // using exec (SynchronousJobExecution) can get details about job execution;
    // this handler will not be called until the job completes, fails
    // or the timeout is reached
    var execId:JobExecutionId = exec.getExecutionId();
}

タスク・インタフェースは、Job.submitJob APIに関連付けられたすべての追加設定を行う必要なく、即時処理のためのジョブを発行する、単純化された方法です。

例9-23 タスクAPIの使用

            var task:Task = new Task("TTisql", null, [Job.jobParam("dsn", "AdminDS"), 
                        Job.jobParam("sql_cmd",stmt)]);
            task.execute(createTableHandler, 10);   // timeout is 10s
         }

        private function createTableHandler(result:SynchronousJobExecution, fault:Fault):void
        {        
            var status:JobStatus = result.getRunStatus();
            if(status == JobStatus.RUNNING)
            {
                // timed out while waiting for job... still running
            

同期ジョブの場合、ジョブのステータスは、ハンドラに渡された結果から即時に使用できます。ただし、それがJobStatus.RUNNINGと等しいかどうかを確認する必要があります。その場合、リクエストは指定したタイムアウトに到達しており、コール元は、ジョブ実行を非同期で発行されたように処理する必要があります。

9.12.1.2 ジョブのステータスおよびステップの詳細の取得

ジョブの発行後に、ジョブのステータスや、ジョブ出力などの各ステップの詳細を取得するために使用できるAPIがあります。これらのAPIを使用するには、コール元は、有効なJobExecutionオブジェクトを持っている必要があり、これは、submitおよびrunSynchronous APIの結果ハンドラに渡されます。現在は、クライアントにジョブ実行の検索を許可するサービスはありません。

例9-24 ジョブ・ステータスの取得

private function submitHandler(exec:JobExecution, fault:Fault):void
{
    exec.getStatus(statusHandler);
}

private function statusHandler(status:JobStatus, fault:Fault):void
{
    if(status.getStatus() == JobStatus.FINISHED)

発行されたジョブのジョブ・ステータスを取得するには、サービス・リクエストが必要であるため、結果とともに呼び出されるハンドラが必要です(リクエスト処理が失敗した場合、フォルトの可能性があります)。ジョブのステータスの他に、ジョブ・ステップの詳細を取得できます。

ジョブ詳細の取得

ステップ出力の詳細およびジョブ・ステータスを取得するには、発行ハンドラに渡されるJobExecutionオブジェクトを使用します。ジョブが失敗するか、ステップが完了しない場合、データは返されません。

同期ジョブ実行の場合、Job.runSynchronousまたはTask.execute callのハンドラは、ジョブ・ステータスを確認でき、完了した場合、結果からジョブ詳細を直接取得します。

 private function createTableHandler(result:SynchronousJobExecution, fault:Fault):void
 {        
     var status:JobStatus = result.getRunStatus();
     if(result != null && result.Status() == JobStatus.COMPLETED)
     {
         var steps:Array = result.getStepDetail();
         for(var i:int=0; i<steps.length; i++)
         {
             var detail:JobStepDetail = steps[i];
             proc.addDetailText(detail.output);
         }

非同期ジョブ実行の場合、Job.submitのハンドラは、JobExecution.getStatusJobExecution.getDetailsの順に呼び出す必要があります。各コールには、サーバーへのリクエストが必要です。

 private function submitJob():void
 {
     var params:Array = new Array();
     params.push(Job.jobParam("p0","p0value"));
     var job:Job = new Job(type, name, desc, ApplicationContext.getTarget(), params,Job.immediateSchedule()); 
     job.submit(submitHandler);
 }
 
 private function submitHandler(result:JobExecution, fault:Fault):void
 {
     if(fault == null && result != null)
     {
         // get the job status; calls the server
         result.getStatus(statusHandler);
     }
 }
 
 private function statusHandler(result:JobStatus, fault:Fault):void
 {
     if(fault == null && result != null)
     {
         if(result.getStatus() == JobStatus.COMPLETED)
         {
             // now can get job output details
             result.getJobExecution().getDetails(detailsHandler);
         }
     }
 }
 
 private function detailsHandler(result:JobExecutionDetails, fault:Fault):void
 {
     if(fault == null && result != null)
     {
         var steps:Array = result.getStepDetail();
         for(var i:int=0; i<steps.length; i++)
         {
             var detail:JobStepDetail = steps[i];
             proc.addDetailText(detail.output);
         }                
     }
}

9.12.1.3 タイマーを使用したジョブ・ステータスの定期的なチェック

ジョブが非同期で発行されるか(Job.submit)、または同期的に実行されるが、リクエストがタイムアウトに到達した場合、JobStatus.RUNNINGのジョブ・ステータスが返されます。これは、ジョブがまだ実行中であることを示し、後で再度ジョブのステータスを確認してください。

コードの観点から最も簡単なのは、アプリケーションがジョブのステータスを確認するように、ユーザーが相互作用するUI要素を公開することです。たとえば、UIは、現在ステータスを確認中とラベル付けされたボタンまたはリンクを含む「実行中」インジケータを表示します。ユーザーがボタンまたはリンクをクリックすると、JobExecution.getStatusメソッドが呼び出され、更新されたステータスを取得します。

必要な相互作用パターンが、ジョブがバックグラウンドで実行中で、ジョブのステータスに関する情報を持つUIを定期的に更新中に、UIがアクティブなままであることである場合、MPCUIは、ジョブ・ステータスの期間チェックを実行するジョブAPIを提供します。各更新は、現在のステータスを処理し、その情報を持つUIを更新する機会をコール元に提供するハンドラを呼び出します。

9.12.1.4 ジョブの停止および削除

MPCUI APIを介して発行されたジョブは、次のAPIを使用して、停止または削除できます。

例9-25 ジョブの停止

 private function stopJob(exec:JobExecution):void
 {
     // NOTE: the JobExecution must be a valid job context obtained from submitted a job
     exec.stopJob(stopJobHandler);
 }

 private function stopJobHandler(exec:JobExecution, fault:Fault):void
 {
     if(fault == null && exec != null)
     {
         // job was successfully stopped
 } 
 }

例9-26 ジョブの削除

private function deleteJob(exec:JobExecution):void
 {
     // NOTE: the JobExecution must be a valid job context obtained from submitted a job            
     exec.deleteJob(deleteJobHandler);
 }

 private function deleteJobHandler(exec:JobExecution, fault:Fault):void
 {
     if(fault == null && exec != null)
     {
         // job was successfully deleted
     } 
 }  

Job.runSynchronous APIを使用して発行されたジョブの場合、deleteWhenFinishedパラメータをtrueに設定して渡すことによって完了すると、ジョブを削除できます。これは3番目のパラメータで、デフォルトはfalseです。

     var job:Job = new Job("backup", "MyBackup", null, 
                 ApplicationContext.getTargetContext(), 
                [Job.jobParam("dsn", "AdminDS"), Job.jobParam("sql_cmd",stmt)], 
                JobSchedule.IMMEDIATE);
                job.runSynchronous((jobRunHandler, 30, true); 

9.12.1.5 リモート操作

ジョブを使用して管理タスクを実行することは、スケジュールおよび制御(開始、中断または停止)の観点で最も柔軟性のあるアプローチですが、処理するタスクを管理するための追加のオーバーヘッドを伴います。スケジュールの制御が必要なく、迅速に実行されると思われる単純なタスクの場合、RemoteOpサービスを使用します。

このサービスによって、プラグインとパッケージ化されたスクリプトを、管理エージェントを介して直接実行できます。


注意:

スクリプトは、agent/ scriptsディレクトリで、プラグインとパッケージ化される必要があり(次の項で説明)、資格証明またはパラメータを処理する必要があります。

リモート操作のスクリプトのパッケージ化

リモート操作用のプラグインに含まれるスクリプトは、ステージング領域に含まれている必要があります。

stage/agent/scripts

必要な場合、/scriptsの下に追加のサブディレクトリを作成できます。この場所にあるスクリプトは、RemoteOpサービスを使用して、%scriptsDir%変数を参照することによって、参照できます。例:

プラグインのステージ領域

 ./stage/agent/scripts/process/kill_process.pl

MPCUIコード(ActionScript)

    var params:Array = [ 
            RemoteOp.param("%scriptsDir%/process/kill_process.pl"),
            RemoteOp.param(pid) ]; 
    var remoteOp:RemoteOp = new RemoteOp("perl", params);              
    remoteOp.performOperation(killProcessHandler);

この例では、RemoteOpオブジェクトは、実行するシェル/コマンドと、そのシェルに渡すパラメータを使用して構成されています。最初のパラメータは、常に、実行するスクリプトの場所である必要があり、%scriptsDir%変数に関連する場所を参照しています。実行するスクリプトで必要な場合、後続のパラメータを追加します。

リモート操作を実行するには、RemoteOp.performOperationメソッドを呼び出し、リモート操作が処理を完了する際に呼び出される関数に渡します。このハンドラには、次のシグネチャがあります。

 private function killProcessHandler(remoteOp:RemoteOp, fault:Fault):void

リモート操作が管理エージェントへの通信に失敗した場合、faultパラメータに、そのエラーの詳細が記述されます。リモート操作が処理された場合、faultはNULLになり、remoteOpパラメータが指定されます。

管理エージェントでのコマンドの実行中に返されるエラー・ステータスを示しているため、remoteOpパラメータのステータスを確認してください。例9-27に、実行するこのチェックを示します。

例9-27 remoteOpパラメータ・ステータスのチェック

 /**
  * Check status; could be any number of problems some of which may result 
  * in step output, some of which (like missing creds) result in a non-successful 
  * run status but no step details.
  * 
  * result.getRunStatus() - the status of the job, refer to Constants.JOB_*_STATUS
  * result.getStepDetail().stepName/detail - name and output from each step in the job 
  * result.getJob() - the complete job Object, to reference parameters:
  *   result.getJob().parameter[0].paramName/paramValue[0]
  * 
  */
  if(remoteOp.result.status != Constants.JOB_COMPLETED_STATUS)
  {
    // job did *NOT* complete successfully
    var pid:String = remoteOp.getParameter(2).paramValue[0] as String;
    var msg:String = "Unable to successfully kill process ["+pid+
                "].  The status of the command was: " 
               +Util.getCatString(Util.JOB_STATUS, remoteOp.result.status)
               +"\nReturn Code: "+remoteOp.result.returnCode
               +"\nCommand Output: "+remoteOp.result.commandOutput;
    MessageAlert.show(msg, "Failed to Kill Process", Alert.OK);
   }
   else
   {
    // successful job execution; process was killed; can look at the
    // step details to get possible output from the job
    MpLog.debug("Command was successful: "
         +"\nReturn Code: "+remoteOp.result.returnCode
           +"\nCommand Output: "+remoteOp.result.commandOutput);       
    page.processesTable.refreshImmediate();    
   }                                    

9.12.2 資格証明の操作

Enterprise Managerの資格証明モデルは、資格証明を必要とする操作を実行するための次の3つの異なるモデルをサポートします。

  • 優先資格証明

    特定の資格証明が、特定タイプの1つまたはすべてのターゲットに設定されます。このモードでは、ユーザーは、一連の資格証明を追加したり、資格証明の値を指定することはありません。

  • 名前付き資格証明セット

    一連の資格証明が、特定タイプの1つまたはすべてのターゲットに作成され、各セットに名前が割り当てられます。このモードでは、ユーザーは、名前付きセットのリストに表示され、操作を実行するために使用するセットを選択できます。

  • オーバーライド資格証明

    このモードでは、ユーザーは、操作を実行するために使用する実行時の資格証明を指定できます。

9.12.2.1 資格証明情報の取得

MPCUIには、特定のターゲットに関する資格証明情報を取得する機能があります。このサービスは、現在のユーザーが参照する権限を持つ情報のみを返すことができます。これにより、セキュアな情報への未認可のアクセスがないことが保証されます。資格証明情報が、MPCUIコードにアクセスしているユーザーにとって使用できない状況についても、処理する必要があります。

9.12.2.1.1 優先資格証明のチェック

ターゲットに優先資格証明セットがあるかどうかを確認するには、次のようにCheckPreferredCredsService.getPreferredCredsInfoメソッドを呼び出します。

var ccSvc:CheckPreferredCredsService = new CheckPreferredCredsService();
       ccSvc.getPreferredCredsInfo(ApplicationContext.getTargetName(), 
       ApplicationContext.getTargetType(), 
       'HostCreds', checkPrefCredsHandler);

サービスはCheckPreferredCredsResultオブジェクトを返し、これは、グローバル(すべてのターゲット・インスタンスのタイプに適用)またはインスタンス(単一のターゲット・インスタンスにのみ適用)のどちらの資格証明が使用可能であるかを示します。

 public function checkPrefCredsHandler(result:CheckPreferredCredsResult, 
                        fault:ServiceFault):void
  {
    if(fault != null)
        MessageAlert.show(fault.faultDetail, "Error Checking Preferred Creds");
    else
    {
        var msg:String = "Checked for Preferred Credentials for 
               target("+ApplicationContext.getTargetName()+","+
               ApplicationContext.getTargetType()+" for set(HostCreds) 
               user("+ApplicationContext.getEmUser()+") \n"+
               "Global Set = "+result.globalSet+" Instance Set = "
                +result.instanceSet;
        MessageAlert.show(msg, "Check Preferred Creds Result");   
    }
}

注意:

優先資格証明が設定されている場合、資格証明情報を渡すことなく、ジョブの発行やリモート操作の実行を行うことができます。この場合、優先セットが使用されます。

9.12.2.1.2 名前付き資格証明セットの取得

特定のターゲットで使用できる名前付き資格証明セットを取得し、次を行うことができます。

  • 選択肢(リストまたはコンボ・ボックス)での名前付き資格証明セットの表示

  • プラグインで必要な表記規則に基づいた名前付き資格証明セットからの選択

次のコードでは、現在のターゲットの2つの異なる資格証明タイプに対してすべての名前付きセットをリクエストし、結果とともにcredSetResultHandlerハンドラを呼び出します。

 var target:Target = ApplicationContext.getTargetContext();
  target.getCredentialSets(["HostCreds", "HostSampleCreds"], 
                credSetResultHandler);

結果ハンドラは、名前付きセットの戻りを適切に使用できます(この例では、表に表示するデータソースを構築します)。

  var credTableData:ArrayCollection;
   if(creds.credSet != null)
   {
      credTableData = new ArrayCollection(creds.credSet);
      
      // check to see if there are sets for both types
      var hostFound:Boolean = false;
      var sampFound:Boolean = false;
      for(var c:int=0; c<creds.credSet.length; c++)
      {
         if(creds.credSet[c].credentialType == "HostCreds")
             hostFound = true;
         else if(creds.credSet[c].credentialType == "HostSampleCreds")
             sampFound = true;
      }
                
      var missingType:String = ( !hostFound ? "HostCreds" : 
                                    "HostSampleCreds" );
      var empty:CredentialSet = new CredentialSet();
      empty.credentialType = missingType;
      empty.name = "<No Sets Found>";
      empty.guid = "";     
      credTableData.addItem(empty);           
   }
   else
   {
      empty = new CredentialSet();
      empty.credentialType = "<No Credential Sets Defined>";
      empty.name = "";
      empty.guid = "";                
      credTableData = new ArrayCollection([empty]);
   }  

9.12.2.2 ジョブへの資格証明の受渡し送信およびリモート操作

この項では、ジョブおよびリモート操作への優先資格証明および名前付き資格証明セットの受渡しについて説明します。

優先資格証明

実行するタスク(ジョブまたは操作)が優先資格証明の使用を試みた場合、タスクに渡される資格証明パラメータは省略されます。ジョブとリモート・操作の両方のサービスは、優先資格証明を使用したタスクの実行を試みます。優先資格証明が設定されていない場合、エラーが返されます。

名前付きセット

タスクの実行に名前付きセットを使用するよう指定するために、JobCredential (ジョブの場合)およびOpCredential (リモート操作の場合)で、資格証明が渡されます。どちらの場合も、資格証明オブジェクトには次の4つのプロパティがあり、それらを指定する必要があります。

  • targetName: 資格証明が適用するターゲットで、通常はApplicationContext.getTargetName()

  • targetType: 資格証明が適用するターゲットのタイプで、通常はApplicationContext.getTargetType()

  • usage: 操作に定義される、資格証明の使用方法(ジョブ・タイプ定義を参照)。この使用方法は、必要な資格証明タイプ、およびジョブの実行中に適用する場所を指定します。

  • credGuid: 使用する名前付きセットの識別子。これは、名前付き資格証明セットを保持する、CredentialSetクラスのプロパティの1つです。詳細は、9.12.2.1項「資格証明情報の取得」を参照してください。

9.12.2.3 再利用可能な資格証明UIコンポーネント

MPCUIでは、エンドユーザーがタスク(ジョブまたはリモート操作)の実行時に使用可能な一連の資格証明を表示し、優先資格証明、名前付き資格証明またはオーバーライド資格証明を選択する、Enterprise Managerの資格証明サブシステムと相互作用できるページに含まれる資格証明リージョンが提供されます。

このリージョンをページに含めるには、次のMXMLを追加します。

例9-28 「資格証明」リージョンの追加

   <credentials:CredentialsRegion id="credRegion" width="40%" height="100%" 
         title="Credentials" target="{ApplicationContext.getTargetContext()}" 
         credentialType="HostCreds" />     

ページに関連付けられたページ・コントローラから、エンドユーザーによってこのリージョンに適用された設定を取得します。

例9-29 選択した資格証明情報の取得

        public function getCredsEntered(event:MouseEvent):void
        {            
            var mode:String = page.credRegion.getMode();
            var msg:String = "Credential Option Selected: "+mode+"\n";
         
            var namedSet:String;
            var creds:Array;
            if(mode == CredentialsRegion.NAMED_MODE)
            {
                namedSet = page.credRegion.getNamedSet();
                msg += "Named Set Selected: "+namedSet;
            }
            else if(mode == CredentialsRegion.OVERRIDE_MODE)
            {
                try
                {
                    creds = page.credRegion.getOverrideCredentials();
                    for(var c:int=0; c<creds.length; c++)
                        msg += "Field:"+creds[c].label+", "+creds[c].value+"\n";
                }
                catch(e:Error)
                {
                    msg += "Error Entering Credentials:\n";
                    msg += e.message;
                }
            }
            else
            {
                // preferred selected... 
            }
            MessageAlert.show(msg, "Credentials Entered");                   
        }       

例9-29では、ユーザーが優先資格証明、名前付き資格証明またはオーバーライド資格証明を選択したかどうかを決定するモードに注意してください。モードに応じて、名前付きセット(CredentialsRegion.getNamedSet())、またはオーバーライド資格証明(CredentialsRegion.getOverrideCredentials())を取得できます。

9.12.2.4 モニタリング資格証明の管理

Targetクラスは、現在のターゲットの監視資格証明を取得および設定する機能を提供します。監視資格証明を取得するには、Targetクラスのインスタンスが必要で、getMonitoringCredentials関数が呼び出され、監視資格証明セットを含む資格証明メタデータを受け取る結果ハンドラを渡します。

// get monitoring credentials
target.getMonitoringCredentials(getMonCredResultHandler, page.getBatchRequest());

ハンドラは次のように表示されます。

private function getMonCredResultHandler(cred:CredentialTypeMetadata, fault:ServiceFault):void
   {
      if(fault != null)
       {
          if(cred != null && cred.isMissingCredentials())
                {
               // no monitoring credentials are set
               MpLog.info("Monitoring Credentials have not been set: "+fault.faultDetail);
        }
       else
           MpLog.logError(fault, "Get Monitoring Credentials");
       return;
    }
           
        /**
        * The CredentialTypeMetadata returned includes the meta-data for the
        * credentials as well as the actual values.  NOTE: credentials never
        * return the actual values for any field identified as a password it only
        * returns the masked "****" value.  You should never have any need to
        * access the actual values for a password field as any time credentials
        * are passed you are passing a credential set and don't need the actual
        * values of a pre-existing credentials set
        */
            
            var credFieldValues:Array = (cred.credentialSets[0] as CredentialSet).columnValues;
            for(var i:int=0; i<credFieldValues.length; i++)
            {
                var credField:CredentialColumnValue = credFieldValues[i];
                MpLog.debug("Monitoring Credentials["+credField.label+"] = "+credField.value);
            }
        }

監視資格証明を設定するには、資格証明タイプに従った資格証明フィールドを、資格証明の監視用に指定します。これはターゲット・メタデータで定義されます。

/**
* the CredentialSet passed contains the monitoring credentials to be set.  
* Note that only the columnValues property of the credentials needs
* to be set when updating monitoring credentials as the framework
* derives the values for the credential set and type.  It is CRITICAL
* that the label set for each columnValue is the column NAME and not
* the display label for that column.  The name is the identifier assigned
* to the credential column in the target meta-data.
* 
* In the demo_hostsample, for example, the credentials fields are:
*     name: SampleCredUser        label: User Id
*     name: SampleCredPassword    label: Password
*     name: SampleCredRole        label: Role
*/
                        
var monitoringCreds:CredentialSet = new CredentialSet();
monitoringCreds.columnValues = [ 
     new CredentialColumnValue("SampleCredUser", "myMonitoringUser"),
     new CredentialColumnValue("SampleCredPassword", "myMonitoringPassword"),
     new CredentialColumnValue("SampleCredRole", "myMonitoringRole")
     ];
            
var target:Target = ApplicationContext.getTargetContext();
target.setMonitoringCredentials(monitoringCreds, setMonCredResultHandler);

次に、ハンドラは次のように表示されます。

private function setMonCredResultHandler(cred:CredentialSet, fault:ServiceFault):void
    {
      if(fault != null)
         {
            MpLog.logError(fault, "Set Monitoring Credentials");
            return;
         }
                        
        /**
        * if the set monitoring credentials was successful then the handler is
        * called with no fault and the set of credentials that were passed in
        */
     }

9.13 セッション状態の格納

セッション状態サービスは、Flexアプリケーションに関連付けられたグローバル状態を格納する機能を提供します。これが有用なのは、カスタムUIを定義するFlexアプリケーションの外側のページ間をユーザーが移動する場合でも、現在のユーザーに対して状態を維持する必要がある場合です。たとえば、ユーザーがホームページの状態を変更して「すべてのメトリック」ページに移動し、その後、ホームページに戻ったときに、ユーザーが離れたときのページの状態を復元したい場合です。Flexアプリケーションを構成するページをユーザーは離れたため、Flexアプリケーション自体の内部ではなく、このユーザー・セッション用に確立されたサーバー側セッションで必要な状態を格納する必要があります。

セッション状態を設定するには、EmUser.setSessionData関数を呼び出し、SessionAttributesオブジェクトを渡します。セッション属性にはSessionAttributeオブジェクトの配列が含まれ、各オブジェクトは、格納されている属性に対して対応する名前と値のペアを持ちます。

public function setSessionAttributes():void
        {
            var sessionData:SessionAttributes = new SessionAttributes();            
            var item1Value:String = page.item1Input.text;
            var item2Value:String = page.item2Input.text;
 
            sessionData.attributes.push(new SessionAttribute("attr1",
            item1Value));
            sessionData.attributes.push(new SessionAttribute("attr2",
            item2Value));
 
            EmUser.setSessionData(sessionData, setSessAttrResultHandler);            
        }
 
public function setSessAttrResultHandler(attr:SessionAttributes,
fault:ServiceFault):void
        {
                 if(fault != null)
                {
                        MpLog.logError(fault, "Set Session Data");
                        return;
                  }
        }

セッション状態を取得するには、対応するEmUser.getSessionDataサービス関数を使用します。この関数は、SessionAttributesのリストと、結果とともに呼び出されるハンドラを渡すことでリクエストされるセッション状態を取得します。これは同じSessionAttributesになり、セッションから取得されたデータが移入されます。

public function getSessionAttributes():void
    {
       var sessionData:SessionAttributes = new SessionAttributes();
       sessionData.attributes.push(new SessionAttribute("attr1"));
        sessionData.attributes.push(new SessionAttribute("attr2"));
        EmUser.getSessionData(sessionData, getSessAttrResultHandler);  
     }
        
public function getSessAttrResultHandler(attr:SessionAttributes, fault:ServiceFault):void
     {
        if(fault != null)
            {
                MpLog.logError(fault, "Get Session Data");
                return;
            }
            
        for(var i:int=0; i<attr.attributes.length; i++)
            {
                var item:SessionAttribute = attr.attributes[i];
                if(item.name == "attr1")
                    page.setModel("lastItem1Value", item.value);
                else if(item.name == "attr2")
                    page.setModel("lastItem2Value", item.value);
            }
      }

9.14 ページ・レイアウト・コンポーネントの定義

ブラウザ・ウィンドウのサイズ変更時にMPCUIページが適切にリサイズされることを保証するために、MPCUIベースのページのページ・レイアウトに関する次のガイドラインをお薦めします。

  • HBox (水平ボックス)およびVBox (垂直ボックス)コンテナを使用します。

  • 絶対ピクセル・サイズではなく、サイズの割合を使用して、コンテナの高さと幅を設定します。

たとえば、3行で、それぞれがページの高さの3分の1を占めるレイアウトを作成するには、MXMLファイルに次のように入力します。

例9-30 3行のページ・レイアウトの定義

    <mx:VBox height="100%" width="100%">
        <!-- 1st row -->
        <mx:HBox height="33%" width="100%">                        
        </mx:HBox>
        
        <!-- 2nd row -->
        <mx:HBox height="33%" width="100%">                        
        </mx:HBox>
        
        <!-- 3rd row -->
        <mx:HBox height="33%" width="100%">                        
        </mx:HBox>                
    </mx:VBox>

次に、各行を、2つの均等に分かれたセクションに水平に分割するには、次のように入力します。

例9-31 2つの均等なセクションへの行の分割

    <mx:VBox height="100%" width="100%">
        <!-- 1st row -->
        <mx:HBox height="33%" width="100%">   
            <mx:VBox height="100%" width="50%" >                
            </mx:VBox>                     
            <mx:VBox height="100%" width="50%" >                
            </mx:VBox>    
        </mx:HBox>
        
        <!-- 2nd row -->
        <mx:HBox height="33%" width="100%">      
            <mx:VBox height="100%" width="50%" >                
            </mx:VBox>                     
            <mx:VBox height="100%" width="50%" >                
            </mx:VBox>                           
        </mx:HBox>
        
        <!-- 3rd row -->
        <mx:HBox height="33%" width="100%">
            <mx:VBox height="100%" width="50%" >                
            </mx:VBox>                     
            <mx:VBox height="100%" width="50%" >                
            </mx:VBox>                                 
        </mx:HBox>                
    </mx:VBox>

各セクション内に、ページのレイアウトに入力する個々のコンポーネントを含めます。

9.14.1 リージョンの定義

Enterprise ManagerのUIスタイル・ガイドでは、ページの情報をリージョンにまとめることをお薦めしています。リージョンは、開いたり閉じたりできるタイトルを持つ視覚的なボックスです。たとえば、例9-30では、各行は、垂直方向のコンテナではなく、別々のリージョンに分割されます。

例9-32 リージョンの定義

  <mx:VBox height="100%" width="100%">
      <!-- 1st row -->
      <mx:HBox height="33%" width="100%">
          <components:Region height="100%" width="50%" title="Row 1 Region 1" > 
          </components:Region>       
          <components:Region height="100%" width="50%" title="Row 1 Region 2" >
          </components:Region>             
      </mx:HBox>
      
      <!-- 2nd row -->
      <mx:HBox height="33%" width="100%">      
          <components:Region height="100%" width="50%" title="Row 2 Region 1" > 
          </components:Region>       
          <components:Region height="100%" width="50%" title="Row 2 Region 2" >
          </components:Region>                         
      </mx:HBox>
      
      <!-- 3rd row -->
      <mx:HBox height="33%" width="100%">
          <components:Region height="100%" width="50%" title="Row 3 Region 1" >
          </components:Region>       
          <components:Region height="100%" width="50%" title="Row 3 Region 2" > 
          </components:Region>                              
      </mx:HBox>                
  </mx:VBox>

例9-32の結果として、図9-10のように表示されます。各リージョンを使用して、意味のある情報を表示するための他のUIコンポーネント(表やグラフなど)を含めることができます。詳細な例は、拡張開発キットにあるデモ・サンプルの例を参照してください。

図9-10 リージョン

図9-10の説明が続きます
「図9-10 リージョン」の説明

9.15 パッケージ化されたリージョンの包含

リージョン・コンポーネントは、UIを構築するための任意の数のコンポーネントを表示できる空のコンテナです。MPCUIでは、単一の単純なタグを使用してページに含めることができるいくつかのパッケージ化されたリージョンが提供されます。

9.15.1 「可用性」リージョン

「可用性」リージョンは、AvailabiltyRegionタグのdaySpanプロパティで指定した期間の、ターゲットの可用性を表示します。同じ期間の、ターゲット可用性の詳細(停止など)を示す、セグメント化された棒グラフで表示されます。

<avail:AvailabilityRegion width="25%" height="100%" daySpan=”1”/>

9.15.2 「インシデントと問題」リージョン

インシデントのリージョンには、現在のターゲットおよび関連するすべてのターゲットの、一連のオープン・インシデントが表示されます。表示されたインシデントのリストをフィルタ処理するオプションが提供されています。リージョンに必要な設定は、サイズ(幅/高さ)のみです。

<events:IncidentRegion width="50%" height="100%"/>

図9-12 インシデントと問題

図9-12の説明が続きます
「図9-12 インシデントと問題」の説明

9.15.3 「ジョブ・サマリー」リージョン

ジョブ・サマリーのリージョンには、ステータス別のジョブ数が表示されます。

<jobs:JobSummaryRegion width="20%" height="100%" />

図9-13 ジョブ・サマリー

図9-13の説明が続きます
「図9-13 ジョブ・サマリー」の説明

9.15.4 「資格証明」リージョン

再利用可能な資格証明UIコンポーネントの詳細は、9.12.2.3項「再利用可能な資格証明UIコンポーネント」を参照してください。

9.16 グラフの定義

MPCUIでは、3つのグラフ・コンポーネントをサポートしています。すべてのグラフ・コンポーネントには、メトリック・プロパティを指定してメトリック情報を表示するために不可欠なサポートがあります。さらに、SQLDataServiceなどの他のサービスから取得した情報を使用して、グラフに独自のデータを構築し、それをdataProviderプロパティを使用してグラフにマップすることができます。

次に示す各グラフ・タイプの例および説明は、各グラフで使用できる様々なオプションの簡単なサマリーです。各グラフのプロパティの完全な説明は、APIドキュメントを参照してください。実行時のこれらのグラフの操作方法の例は、拡張開発キットにあるデモ・サンプルを参照してください。

9.16.1 折れ線グラフ

通常、折れ線グラフには、一定期間の情報が表示されますT(時系列グラフと呼ばれることも多くあります)。そのため、メトリック情報を履歴またはリアルタイムで表示する際に役立ちます。グラフには、グラフで表示するmetricNameおよびmetricColumns (配列)を指定するプロパティ、および、履歴データまたはリアルタイムのサンプル・データを表示するために設定できるtimePeriodプロパティが含まれます。timePeriod"REALTIME"に設定すると、グラフは、自動ポーリング・リクエストを管理し、新しいサンプルが到着するとグラフ・データを更新します。

<components:Region title="CPU Load" width="75%" height="100%" >
    <charts:LineChart id="cpuload" width="100%" height="100%"
                 metricName="Response"
                 metricColumns="['Load']"
                 timePeriod=”REALTIME” interval=”15” />
    <components:Link label="Show History" 
           click="{invokeActivity('metricHistory'))}" />   
 </components:Region> 

図9-14 折れ線グラフの例

図9-14の説明が続きます
「図9-14 折れ線グラフの例」の説明

9.16.1.1 折れ線グラフのデータソースの指定

折れ線グラフを使用して描画されるメトリックを指定する他に、データを表示するグラフで使用する独自のデータソースを作成できます。たとえば、SQLデータ・サービスまたは他の方法(ポーリング・サービスを使用したり、グラフに追加するデータ・サンプルを作成するなど)で取得されたデータです。

次の例では、ページには、ページ・コントローラに構築されるページ・モデル内のアイテムにマップされたchartDataSourceを持つグラフが含まれます。

  • ProcessesPage.mxml

    <ch:LineChart id="cpuUtilChart" width="100%" height="100%" 
                                    chartDataSource="{model.cpuChartData}" />  
    
  • ProcessesPageController.as (initメソッド)

     // setup a data provider for the CPU line chart; it will be 
     // updated each time a new data sample comes back for this metric
     
     // first get the polling context for a 15 second interval
     var pollingCtx:PollingContext = 
                page.pollingContext.getContext(PollingInterval.EVERY_15_SECONDS);
    
     // now get the metric to be selected and initiate the request (won't start until 
     // "startPolling" is called)
     var cpuPerf:Metric = ApplicationContext.getTargetContext().getMetric("CPUPerf");
     var cpuPerfSel:MetricSelector = cpuPerf.getSelector(['system', 'idle', 'io_wait']);
     cpuPerfSel.getData(cpuDataHandler, MetricCollectionTimePeriod.REALTIME, pollingCtx);    
                
     // start polling; this will automatically stop when the user moves to another page
     pollingCtx.startPolling();
    
  • ProcessesPageController.as (cpuDataHandlerメソッド)

     public function cpuDataHandler(cpuData:MetricResultSet, fault:ServiceFault):void
     {
       if(fault != null) return;   // handle this better!
    
       // get the current data point and derive a new one to
       // add to the charts data source
       var dataPoint:TimestampMetricData = cpuData.results[0];
       var systemTime:Number = dataPoint.data[0]['system'];
       var ioWaitTime:Number = dataPoint.data[0]['io_wait'];     
       
       // create a new data point; this is added to the chart
       // data source (ChartData) below
       var dataSample:ChartDataSample = new ChartDataSample();
       dataSample.timestamp = dataPoint.timestamp;
       dataSample["cpuTime"] = systemTime + ioWaitTime;
       
       // check if the chart data source is there yet and if
       // not create it and add it to the page model 
       var cpuChartData:ChartData = page.model["cpuChartData"] as ChartData;
       if(cpuChartData == null)
       {
          cpuChartData = new ChartData();
          page.setModel("cpuChartData", cpuChartData);
          
          // define the series "cpuTime" in the chart including a label
          page.cpuUtilChart.setLineSeries(["cpuTime"], ["CPU Time %"]);
       }              
       cpuChartData.addDatapoint(dataSample);
     } 
           
    

9.16.1.2 凡例の制御

すべてのグラフには、グラフで示すアイテムを表示する凡例を含めることができます。次の例を使用して、4つの場所(上下左右)のいずれかに凡例を配置します。

  <c:LineChart id="hchart" timePeriod="REALTIME" 
              showLegend="true" legendLocation="top"

9.16.2 面グラフ

面グラフは、折れ線グラフに類似しており、同じ属性を持っています。これは、LineChartと同じ方法で、データを表示します。showCumulativeLineプロパティは、面グラフの表示を制御します。ほとんどの面グラフでは、積上げまたは累積の面グラフを表示するために、このプロパティをtrueに設定して含める必要があります。それ以外の場合、面グラフは、グラフに含まれる各時系列の塗りつぶしの領域を重ね合せます。

<charts:AreaChart id="cpuutil" width="100%" height="100%" 
          metricName="CPUProcessorPerf" 
          metricColumns="{['CPUIdle']}"
          timePeriod="LAST_DAY" />

9.16.3 横棒グラフ

棒グラフは、視覚的な属性およびデータソースの制御の指定について、列グラフと同じプロパティを公開します。

<charts:BarChart id="spaceChart" timePeriod="CURRENT" 
          width="100%" height="100%" 
          groupBy="byKey" 
          metricName="MSSQL_Database" 
          metricColumns="{['spaceavailable']}" />   

9.16.3.1 棒のグループ化

groupByプロパティ(棒グラフおよび列グラフで使用可能)によって、データをキーまたは列ごとにまとめることができます。データ・セットにキーが含まれない場合、デフォルト(列ごと)が適用されます。

たとえば、「ユーザー」列がデータへのキーとして処理される場合の次のデータ・セットがあるとします。

ユーザー ログイン エラー
Jones 23 12
Smith 30 4
Shah 27 20

例9-33では、groupByプロパティはbyColumnに設定されています。これにより、図9-16に示すように、2つの列のグループが作成され、それぞれが各データ列用になり、各グループに3つのすべてのキーが表示されます。

例9-33 列でグループ化

 <mp:BarChart id="userBarChart" 
               dataProvider="{model.userData}" 
               showLegend="true"
               groupBy="byColumn"
               />

図9-16 列でグループ化

図9-16の説明が続きます
「図9-16 列でグループ化」の説明

例9-34では、groupByプロパティはbyKeyに設定されています。これにより、図9-17に示すように、3つのグループが作成され、それぞれが各キー用になり、各グループに両方の列(データ項目)が表示されます。

例9-34 キーでグループ化

 <mp:BarChart id="userBarChart" 
                        dataProvider="{model.userData}" 
                        showLegend="true"
                        groupBy="byKey"
                        />

図9-17 キーでグループ化

図9-17の説明が続きます
「図9-17 キーでグループ化」の説明

9.16.4 列グラフ(縦棒グラフ)

列グラフは、縦方向の棒グラフで、視覚的な属性およびデータソースの制御の指定について、棒グラフと同じプロパティを公開します。

<charts:ColumnChart id="bchart" timePeriod="LAST_DAY" 
          width="100%" groupBy="byKey" 
          metricName="CPUProcessorPerf" metricColumns="{['CPUIdle']}"/>

9.16.5 円グラフ

次の例では、コードは、メトリック名およびメトリック列を指定することによって円グラフを構築します。MPCUIフレームワークは、Management Serverからから情報を取得するために必要なリクエストを実行し、値をグラフに移入します。


注意:

metricColumns属性では、グラフの上部にあるコンボ・ボックスの値を変更するユーザーへの応答として、コントローラに値を設定します(HomePageController.asの例を参照)。

<charts:PieChart id="memChart" 
       targetName="{appModel.target.name}" 
       targetType="{appModel.target.type}" 
       metricName="MemoryPerf" 
       metricColumns="{model.memoryColumns}"
       timePeriod="LAST_DAY" 
       labelPosition="none" />    

9.17 表の定義

次の各項では、表を定義する様々な方法について、各方法の例を示して説明します。

9.17.1 データ・サービス

例9-35では、metricNameおよびmetricColumnsを指定することによって、表をMetricDataServiceにマップします。メトリック列ラベルが入力されているため、列にheaderText属性を指定する必要はありません。必要な場合、これらのラベルをオーバーライドできます。

例9-35 MetricDataServiceへの表のマッピング

<c:Table id="processesTable" width="100%" height="100%"
              metricName="CPUProcessesPerf"
              metricColumns="['ProcUser', 'ProcCPU', 'ProcCmd']"
              timePeriod="REALTIME"
              interval="30"
              >
    <c:adminElements>               
        <mx:Button id="killProcessButton" label="Kill Process" 
                click="controller.killProcess(event)"/>
    </c:adminElements>                
    <c:columns>
      <mx:AdvancedDataGridColumn width="50" dataField="key" />
      <mx:AdvancedDataGridColumn width="100" dataField="ProcUser" />
      <mx:AdvancedDataGridColumn width="80" dataField="ProcCPU" />
      <mx:AdvancedDataGridColumn width="400" dataField="ProcCmd" />
    </c:columns>                
</c:Table>     

図9-20 データ・サービス

図9-20の説明が続きます
「図9-20 データ・サービス」の説明

9.17.2 カスタム・データ・プロバイダ

例9-36では、表のデータはコントローラにロードされ、ページ・モデルprocessInfoDataアイテムにマップされます。processInfoDataは、(任意のタイプの)オブジェクトの配列です。各列に指定されたdataFieldプロパティは、各列に表示されるパブリック・プロパティを識別します。この場合、dataFieldの名前はheaderTextとしても使用されます。このラベルをオーバーライドするheaderTextプロパティを指定できます。

例9-36 processInfoDataアイテムへの表のマッピング

<tbl:Table id="processInfoTable" dataProvider="{model.processInfoData}">
    <tbl:columns>
            <mx:AdvancedDataGridColumn width="100" dataField="Process ID"/>
            <mx:AdvancedDataGridColumn width="250" dataField="User"/>
            <mx:AdvancedDataGridColumn width="100" dataField="Database"/>
            <mx:AdvancedDataGridColumn width="100" dataField="Status"/>
            <mx:AdvancedDataGridColumn width="250" dataField="Command"/>
            <mx:AdvancedDataGridColumn width="100" dataField="CPU Time"/>
            <mx:AdvancedDataGridColumn width="100" dataField="Memory Usage"/>
    </tbl:columns>
</tbl:Table>

9.17.3 選択した行の取得

表のselectedRowsプロパティを参照することによって、表で現在選択されている行を取得できます。このプロパティは、選択した行の配列で、各行は、列名でキー指定された行にデータが含まれるディクショナリ・オブジェクトです。行がカスタム・データソースに基づく場合、行は、表のデータソースにマップされたオブジェクトになります。

 var process:Dictionary = page.processesTable.selectedRows[0];
 

表が単一の選択を許可するよう設定された場合、selectedRows配列には単一のエントリのみが含まれます(または行が選択されていない場合は何もありません)。

9.18 ダイアログの定義

ダイアログを構築する場合、通常、oracle.sysman.emx.intg.Dialogクラスを拡張して、MXMLクラスのみを必要とします。

9.18.1 ダイアログの登録

invokeActivityメソッドを使用して表示されるダイアログを使用可能にするには、ダイアログを統合クラスの一部として、アクティビティに登録する必要があります。例9-37では、次のことに注意してください。

  • id属性: IDは、アプリケーション内の他のアクティビティからこのダイアログを詳細するために使用されます。これは、アプリケーションに含まれるすべてのアクティビティ全体で一意である必要があります。

  • dialogClass属性: dialogClass属性は、ダイアログを拡張し、このダイアログ用の実装であるMXMLクラスへの参照です。

inputParamsはオプションですが、入力パラメータが必要で、コンテキストとしてのオブジェクトをBeanディレクティブを使用してMXMLから直接渡す状況では、ダイアログを再利用できます。MPCUIフレームワークは、入力オブジェクト・パラメータをダイアログ・パラメータにマップします。

inputParamsをダイアログ定義の一部として定義しない場合、ダイアログで必要な入力データ(カスタム・プロパティなど)は、ActionScriptで設定し、Dialog.showメソッドを使用して表示されるダイアログとする必要があります。

例9-37 ダイアログの登録

        <intg:DialogActivityDef id='metricHistory' label='Metric History' 
dialogClass='{MetricHistoryDialog}' >
            <intg:inputParams>
                <intg:InputParam name='targetName'/>
                <intg:InputParam name='targetType'/>
                <intg:InputParam name='metric'/>
                <intg:InputParam name='columns'/>
                <intg:InputParam name='period'/>
                <intg:InputParam name='title'/>
            </intg:inputParams>
        </intg:DialogActivityDef>

図9-21 メトリック履歴ダイアログ

図9-21の説明が続きます
「図9-21 メトリック履歴ダイアログ」の説明

9.18.2 ダイアログの表示およびクローズ・イベントの待機

ダイアログに、ダイアログのクローズ時に必要な状態が含まれる場合、クローズ・ハンドラをinvokeActivityメソッドに渡すことができます。このハンドラは、CloseEventを使用して呼び出されます。このハンドラは、ダイアログをクローズするために押されたボタンを特定し、ダイアログ・オブジェクト自体を取得して、そこから情報を取得します。

例9-38 クローズ・イベントの待機

   public function showCpuMetricDetails(event:MouseEvent):void
     {
        var bean:Bean = new Bean("targetName", page.appModel.target.name, 
                   "targetType", page.appModel.target.type, 
                   "metric", page.cpuutil.metricName, "columns",page.cpuutil.metricColumns, 
                   "period", "REALTIME", "title", "Metric Details (Current)");
        page.invokeActivity("metricDetails", bean, metricDialogClosed);
     }

   public function metricDialogClosed(event:CloseEvent):void
   {
        MpLog.debug("Metric Details Dialog Closed");
        var button:int = event.detail; // Alert.YES, Alert.NO, Alert.OK etc…
        var metDetailsDialog:MetricDetailsDialog = event.currentTarget 
                as MetricDetailsDialog;
   }

例9-38では、metricDialogClosed関数がinvokeActivityに渡されます。ダイアログがクローズすると、メソッドが呼び出され、CloseEventに渡されます。このイベントから、currentTargetプロパティはダイアログ自体を含み、detailプロパティはダイアログをクローズするために押されたボタンを示します。

9.19 トレインの定義

トレインは、各ステップ間をナビゲートするための次と前のボタンを持つ、複数ステップのUIの定義を許可します。トレインは、通常、ユーザーがカテゴリにまとめることができる多くの属性を持つエンティティを作成または変更しようとする場合に、使用されます。

トレインは、統合クラスに登録する必要があり、トレインには、TrainControllerおよびトレイン内の各ステップのページ・クラスを拡張し、TrainStepPageを拡張するコントローラがあります。各ステップ(トレイン・ステップ・ページ)は、独自のコントローラ・クラスを持つことができます。各ステップはコントローラを持つページでであるため、レイアウト、データの管理およびステップ内のイベントへの応答は、アプリケーション内の他のページとまったく同じです。ページ・クラスの詳細は、9.6.2.1項「ページ・クラス」を参照してください。

トレイン・ステップ・コントローラは、TrainStepPage.trainプロパティを参照することによって、トレイン自体にアクセスできます。トレイン・オブジェクトまたはそれのモデル内で保持されている他の情報にアクセスするには、これを使用します。

9.19.1 トレイン定義の例

例9-39にトレインの定義を示し、図9-22にトレインを示します。

例9-39 トレインの定義

<intg:TrainActivityDef id='addNewUserEmbeddedTrain' label='Add New User'>
 <intg:stepActivities>
  <mx:Array>
   <intg:TrainStepActivityDef id='anuStep1' label='User Info' pageClass='{trainSamp.S1_UserInfo}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
   <intg:TrainStepActivityDef id='anuStep2' label='Expiry' pageClass='{trainSamp.S2_Expiry}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
   <intg:TrainStepActivityDef id='anuStep3' label='Credentials' pageClass='{trainSamp.S3_Credentials}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
   <intg:TrainStepActivityDef id='anuStep4' label='Schedule' pageClass='{trainSamp.S4_Schedule}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>
   <intg:TrainStepActivityDef id='anuStep5' label='Notifications' pageClass='{trainSamp.S5_Notifications}' pageControllerClass='{trainSamp.NotificationsTrainStepController}'/>
   <intg:TrainStepActivityDef id='anuStep6' label='Confirmation' pageClass='{trainSamp.S6_Confirm}' pageControllerClass='{trainSamp.AddNewUserTrainStepController}'/>                
  </mx:Array>
 </intg:stepActivities>
</intg:TrainActivityDef>

図9-22 トレインの例

図9-22の説明が続きます
「図9-22 トレインの例」の説明

9.19.2 トレイン・コントローラ

トレイン・コントローラは、トレイン内のすべてのページで保持される状態を管理し、トレインの変更(ステップ間の移動)に応答し、ユーザーが「終了」または「取消」ボタンをクリックしたときに完了するトレインに応答するために使用されます。

9.19.3 トレインの状態

状態は、Train.modelプロパティを使用して、トレイン・モデルに保持されます。このプロパティは、トレインに適した情報を保持するために使用できる動的プロパティです。個別のページは、独自のモデル・プロパティの独自の状態を格納でき、トレイン・モデルに格納された情報にアクセスすることもできます。

9.19.4 トレイン・イベント

各トレイン・ステップ・コントローラは、ステップの開始または停止時に呼び出されるinitメソッドおよびdestroyメソッドを実装できます。ステップは、次のいずれかを行うことができます。

  • ステップ固有の処理ステップの実行

  • トレインへのアクセスおよびトレインへのより高いレベルのロジック処理の許可

トレイン・コントローラは、トレインが完了したイベントに対してリスナー関数を追加することによってトレインが終了(「終了」または「取消」)した場合にも、呼び出すことができます。

例9-40 リスナー関数の追加

 // register a listener for the train complete event, this may be a cancel or finish.
 train.addEventListener(TrainEvent.TRAIN_EVENT, trainDone);

リスナー(例9-40trainDone)は、トレインの状態を調べて、処理を続行するかどうかを決定できます。これは、他のアクティビティ(ページ)への制御を指示するよう選択したり、トレインを別のステップに戻すよう設定することができます。

例9-41 トレインの最後のアクションの定義

public function trainDone(event:TrainEvent):void
{
// train cancel/finish button was pressed, so caller can now validate
// the train (look at the model).  The caller has the various options indicated below.
var train:Train = event.target as Train;

if(train.model["isComplete"])
{
  // want to end the train, but go somewhere else (otherPage is a page id)
  train.endTrain("otherPage");
else
{
  // go back to train at a certain step
  train.controller.setStepById("step2");
}

9.20 情報アイテムと情報表示(ラベルと値のペア)の定義

InfoDisplayクラスおよびInfoItemクラスによって、ラベルを右に配置し、値を左に配置したグループで、一連のラベルと値のペアを表示できます。表示の各エントリ(InfoItem)は、ラベル、値、オプションのアイコン、宛先またはクリック・プロパティを指定します。

宛先またはクリック・プロパティによって、値はリンクとして表示されます。宛先は、次のいずれかに設定できます。

  • 他のアクティビティ(ページまたはダイアログ)の識別子である文字列

  • コントローラに構築されたURLオブジェクト(HomePage.mxmlおよびHomePageControllerなどを参照)

宛先ではなくクリック・ハンドラを指定して、ユーザーがアイテムをクリックしたときに呼び出されるコントローラ内の関数にそれを設定できます。

例9-42 ラベルと値のペアの定義

<components:InfoDisplay width="100%" height="100%" >
   <!-- ref to SQLDataService -->
   <components:InfoItem label="CPU Model" 
      value="{ids.result.getString(0,'CPU Model')}" />   
   <!-- ref to MetricDataService for metric with a key -->
   <components:InfoItem label="CPU(0) Idle %" 
      value="{procData.result.getString('0','CPUIdle')}" />
   <!-- ref to MetricDataService for metric with no key -->
   <components:InfoItem label="Current Load" 
      value="{respData.result.getString('','Load')}" /> 
   <!-- ref to page model; model set in controller in SQL svc handler -->      
   <components:InfoItem label="{model.osVersLabel}" value="{model.osVersion}" />
   <components:InfoItem label="Hosted By" value="{model.relatedHost}" 
      destination="{model.relatedHostLink}" />
   </components:InfoDisplay>

図9-23 ラベルと値のペア

図9-23の説明が続きます
「図9-23 ラベルと値のペア」の説明

9.21 組込みレンダラの使用

表列、ヘッダー、およびFlexフレームワークが提供する機能を使用する他のUI要素用にカスタム・レンダラを定義する機能に加えて、MPCUIフレームワークは、表内またはInfoItem用にカスタム・アイコンを表示するために使用できるいくつかの組込みレンダラも提供します。これらのレンダラは、レンダラを実装するためのコントローラ・コードを作成できないメタデータのみの実装にも有用です。

これらの組込みレンダラは、TableコンポーネントまたはInfoItemコンポーネントに、テキスト値のかわりにアイコンを表示します。MXMLでappModel.rendererディレクティブを使用することでレンダラを指定し、レンダラIDを指定してレンダラを選択し、次にレンダラ・タイプに応じてレンダラ用の入力パラメータ・セットを選択します。

たとえば、次のコードでは、InfoItem上の値の横にアイコンが表示され、InfoItemに表示される値に応じてチェック・マーク、警告またはエラー・アイコンが表示されます。

<mp:InfoItem id="currentLoad" label="CPU Load" 
  value="{respData.result.getString('','Load')}"
  imageRenderer="{appModel.renderer('CHECK_MARK',
  bean('type','number','warning','0.1','critical','0.4'))}" />    

最初のパラメータCHECK_MARKは、使用されるレンダラを示します。次の完全なリストを参照してください。2番目のパラメータbeanには、チェック・マーク・レンダラの入力パラメータを指定します。このパラメータは異なり、場合によっては、選択したレンダラに応じてオプションになります。入力パラメータに必要とされる各レンダラの詳細は、APIドキュメントを参照してください。

12.1.0.3.0のEDKでサポートされている組込みレンダラは、次のとおりです。

  • CHECK_MARK

    指定された値に応じて、チェック・マーク、警告アイコンまたはエラー・アイコンを表示します。レンダラを使用すると、ブール値が表示される場合にチェック・マークまたはエラー・アイコンを表示できます。ブール値は、true/false、t/f、または0/1にできます。タイプ・パラメータを数字として指定した場合、値は、入力パラメータに指定されたしきい値と比較されて、次のものが指定しきい値を超えている場合に異なるアイコンも表示します。

  • TARGET_TYPE

    ターゲット・タイプ値に関連付けられたアイコンを表示します。これは、内部ターゲットID (たとえば、oracle_database)であり、ターゲット・タイプが実際に表示されている文字列表現ではありません。

  • TARGET_STATUS

    ステータス値に関連付けられたアイコンを表示します。ステータス値は、up/down、true/false、または0/1になり、その値に応じて、上向き矢印または下向き矢印を表示します。

レンダラがInfoItemに関連付けられている場合、InfoItemにデフォルトで表示される値は、レンダラに渡されて、どのアイコンを表示するかを決定します。別の値を使用してレンダラを制御する必要がある場合、InfoItemはimageDataSourceプロパティを提供します。このプロパティは、表示されている値とは異なるデータ・アイテムにバインドできます。

次の例では、TARGET_TYPEレンダラは、ターゲットの名前の横にターゲット・タイプ・アイコンを表示するために使用されます。これを行うには、imageDatasourceプロパティを、レンダラが必要とする内部ターゲット・タイプを含むアイテムに設定します。

<mp:InfoItem id="relatedHost" label="Hosted By" value="{model.relatedHost}" 
  imageRenderer="{appModel.renderer('TARGET_TYPE')}"
  imageDataSource="{model.relatedHostType}"
  destination="{model.relatedHostLink}"  />

9.22 リンクの定義

リンク・コンポーネントを使用して、URLへのリンクとなるユーザーに示すものを表示します。リンクは、ラベル・プロパティを指定し、宛先またはクリック・ハンドラ・プロパティのいずれかも指定します。宛先は、コントローラで構築されるアクティビティIDまたはURLオブジェクトになります。InfoItemクラスの詳細は、9.20項「情報アイテムと情報表示(ラベルと値のペア)の定義」を参照してください。

図9-24 リンクの例

図9-24の説明が続きます
「図9-24 リンクの例」の説明

9.23 Enterprise Managerイメージの包含

Flex実装とメタデータ実装の両方で、Enterprise Manager製品に付属のイメージの1つをMXMLから参照するには、appModel.emImage関数を使用して目的のイメージを参照します。イメージとそのファイル名のリストは、現在はEnterprise Manager EDKの一部ではないため、変更されることがあります。

Enterprise Managerの新しいリリースごとに、この情報の使用は検証およびテストする必要があります。通常のデプロイメントでは、イメージはemcore_war/imagesディレクトリの下にあります。例:

<mx:Image source="{appModel.emImage('yellowFlag.gif')}" />

9.24 処理カーソルの表示

UIは、次の場合に、処理カーソルまたはビジー・カーソルを自動的に表示します。

  • 新しいアクティビティへのアクセス(ページ、トレインまたはダイアログ)

  • Management Serverへのデータに関するリクエストの発生

通常、ビジー・カーソルを表示する必要はありません。ただし、ビジー・カーソルを表示する必要があると思われる場合は、カーソルが正常に終了するよう注意してください。ビジー・カーソルの表示中に例外がスローされた場合、例外が捕捉され、カーソルが削除されたことを確認します。

カーソルを表示するには、MpCursor.setBusyCursorメソッドを呼び出します。

カーソルを削除するには、MpCursor.removeBusyCursorを呼び出します。両方のメソッドは、オプションのownerパラメータを受け入れます。このパラメータによって、複数のカーソル呼出しをネストできます。

9.25 処理ウィンドウの定義

処理ウィンドウは、長時間実行しているタスクの間に表示されるダイアログを表示します。これは、タスクの実行時に、ステータス情報とともに定期的に更新できます。次の場合に、このダイアログを表示できます。

  • 無限の完了。回転したステータス・アイコンが表示されます。

  • 有限の完了。タスクの実行につれて更新される、割合の棒が表示されます(0から100%の完了)。

例9-43 処理ウィンドウの定義

  private var proc:ProcessingWindow;
  private var indeterminate:Boolean = false;

  public function showDialog():void
  {
    proc = new ProcessingWindow();
    proc.title="Processing";
    proc.operationText = "Get Metric Info Many Times...";
    proc.showDetailText = true;
    indeterminate = !indeterminate;
    proc.indeterminate = indeterminate; 
    proc.show();

    taskCount = 0;
    longRunningTask();                        
  }     
        
  private var taskCount:int = 0;
  private function longRunningTask():void
  {
    proc.addDetailText("Starting next item of work...");
    var querySvc:SqlQuery = new SqlQuery(allMetricsHandler);          
    var queryRequest:RunQueryRequest = new RunQueryRequest();
    var tgt:Target = ApplicationContext.getTargetContext();
    queryRequest.addSqlQueryInput(new SqlQueryInput("GET_ALL_METRIC_INFO", "GET_METRIC_INFO", [
      ["TARGET_TYPE", tgt.type],
      ["TYPE_META_VER", tgt.typeMetaVer],
      ["CAT_PROP_1", tgt.catProperties[0]],
      ["CAT_PROP_2", tgt.catProperties[1]],
      ["CAT_PROP_3", tgt.catProperties[2]],
      ["CAT_PROP_4", tgt.catProperties[3]],
      ["CAT_PROP_5", tgt.catProperties[4]],
      ["TARGET_GUID", tgt.guid]
      ], SqlQueryInput.GENERIC_QUERY_TYPE)); 
    querySvc.runQuery(queryRequest);    
  }
        
  public function allMetricsHandler(event:RunQueryResultEvent):void
  {
    proc.addDetailText("Got a response from query service at "+new Date().toLocaleString());
    taskCount++;
    proc.addDetailText("task update for the "+taskCount+"th time...");
    if(taskCount < 20)
    {
      if(!indeterminate) proc.setPercentComplete(taskCount*5);
      longRunningTask();
    }
    else
    {
      proc.addDetailText("All work complete.");
      proc.setComplete();
    }
  }
...

図9-25 処理ウィンドウの例

図9-25の説明が続きます
「図9-25 処理ウィンドウの例」の説明

9.26 ターゲット・タイプ用のアイコンの定義

ターゲット・タイプ・アイコンが表示される場所(ターゲット・メニューの隣など)にはどこでも、Cloud Controlコンソールで表示されるターゲット・タイプに関連付けるアイコンを指定できます。

MPCUIは、アイコンの次のグラフィック形式をサポートします。

  • PNG

  • JPG

  • GIF

アイコンには、次のサイズ指定をお薦めします。

  • 小さいアイコン: 16x16

  • 大きいアイコン: 24x24

アイコン・ファイルをplugin_stage/oms/metadata/mpcuiディレクトリに保存します。プラグイン・ステージング・ディレクトリの詳細は、第14.2項「プラグインのステージング」を参照してください。

例9-44 アイコンの定義

  <EmuiConfig>
     <large-icon>demo_hs_large_icon.png</large-icon>   
     <small-icon>demo_hs_small_icon.png</small-icon>
  </EmuiConfig> 

図9-26および図9-27に、小さいアイコンおよび大きいアイコンの例を示します。

図9-26 小さいアイコン

小さいアイコンの例

図9-27 大きいアイコン

大きいアイコンの例

9.27 ターゲット・ナビゲータの表示

ターゲット・ナビゲータは、任意のコンポジット・ターゲットまたはそのメンバーのホームページの左側に表示できます。ターゲット・ナビゲータは、ルートにコンポジット・ターゲットを表示し、その下のcontainsアソシエーションを検索することによって、コンポジットのすべてのメンバーを表示します。コンポジット・ターゲットに関連付けられたターゲットは、コンポジット・ターゲットまたは他のターゲットとの別のnon-containsアソシエーションを持つことができます。ただし、コンポジット・ターゲットとのcontainsアソシエーションを持つターゲットのみが、ターゲット・ナビゲータに表示されます。アソシエーションの検出または導出のサポートされたメカニズムを介して、これらの包含アソシエーションを追加できます。詳細は、第11章を参照してください。

ターゲット・ナビゲータを有効化するには、MPCUIメタデータは、<EmuiConfig>要素のcontext-pane-visibleプロパティをtrueに設定して、含める必要があります。これは、コンポジット・ターゲット・タイプおよびそのメンバー・ターゲットに設定する必要があります。これがメンバー・ターゲットに設定されない場合、ナビゲータは表示されず、ホームページがこれらのターゲットに表示される際には、コンポジットの他のメンバーを表示します。

デフォルトでは、context-pane-visibleプロパティはfalseに設定されており、ターゲット・ナビゲータは表示されません。


注意:

containsアソシエーションがない場合、context-pane-visibleプロパティがtrueに設定されていても、ターゲット・ナビゲータは表示されません。

例9-45 ターゲット・ナビゲータの有効化

<?xml version = '1.0' encoding = 'UTF-8'?>

<CustomUI target_type="demo_hostsystem"xmlns="http://www.oracle.com/EnterpriseGridControl/MpCui">

  <EmuiConfig>
     <context-pane-visible>true</context-pane-visible>
  </EmuiConfig> 

</CustomUI>

9.28 ガイドされた検出用のUIの定義

MPCUIフレームワークでは、ガイドされた検出フローの一部として登録できるカスタム・ユーザー・インタフェースを定義する機能がサポートされます。登録後に、この検出フローは、「ターゲットの手動追加」ページから使用できます。手動によるターゲットの追加の詳細は、第12.6項を参照してください。

9.28.1 ガイドされた検出について

ガイドされた検出フローでは、選択した管理エージェント上で検出スクリプトを実行し、適切なエンティティを追加するサービスAPIを呼び出すことによって、Enterprise Managerにターゲットおよびアソシエーションを追加する機能が提供されます。このプロセスは、ユーザー・インタフェース・ウィザード(トレイン)から駆動され、エンドユーザーが提供した情報を使用して、プロセスを説明できます。このプロセス中に、エンドユーザーから必要な情報を(特定の要件に基づいて)決定するかどうかは、任せられています。例は、EDK (demo_hostsampleおよびdemo_hostsystem)のプラグインのサンプルを参照してください。検出スクリプトの詳細は、第12章を参照してください。

ガイドされた検出中に通常使用されるサービスは、次のとおりです。

  • 管理エージェントおよびターゲット(ターゲットの存在やターゲット・プロパティなど)を取得するTargetInfoサービス

  • 既存のアソシエーションを取得するAssociationInfoサービス

  • 選択した管理エージェント上で検出スクリプトを実行する検出サービス

  • ターゲットを作成または削除するTargetManagementサービス

  • アソシエーションを作成または削除するAssociationManagementサービス

これらのサービスの詳細は、9.28.5項「検出サービスの使用」9.28.6項「ターゲット情報サービスの使用」および9.28.7項「ターゲット管理サービスの使用」を参照してください。

9.28.2 ガイドされた検出のサポート

ガイドされた検出をプラグインに追加するには、必要なファイルに次のディレクトリが含まれていることを確認してください。

  • plugin_stage/discovery

    • ガイドされた検出フローから実行されるスクリプト。これらのスクリプトには、複数のターゲットおよびアソシエーションが含まれます。検出スクリプトの詳細は、第12.3項を参照してください。

    • customdiscover.lstファイル。このファイルには、各検出スクリプトに対してプラグインが提供されることを示す行を含める必要があります。各エントリは、検出カテゴリを参照する必要があり、これは、検出サービスを呼び出す際に実行されるスクリプトを識別するために使用される一意の識別子です。次のエントリは、ガイドされた検出フロー中にdemo_hostsample_discovery.plスクリプトを参照するために使用される検出カテゴリ(DHS_DISC)を示しています。

      DHS_DISC|demo_hostsample_discovery.pl
      
  • plugin_stage/oms/metadata/discovery

    検出メタデータ・ファイル(plugin_discovery.xml)。検出メタデータ・ファイルおよび検出XMLの例の詳細は、第12.2項を参照してください。ガイドされた検出には、ガイドされた検出を正しく登録できるよう適切に指定する必要がある多くの属性があります。

    • <DiscoveryModule name="DemoHostSample">

      これは、検出モジュールの一意の名前で、MPCUIメタデータ・ファイルに検出SWFを登録するために使用されるモジュール名に一致する必要があります。

    • <NlsValue>Discover Demo Host Sample Targets</NlsValue>

      これは、Cloud Controlコンソールの「ターゲットの手動追加」ページの「ターゲット・タイプ」リストに表示されるラベルです。

      <CustomDiscoveryUI>
         <LaunchADF>
           <DestOutcome>goto_core-mpcustomdiscovery-page</DestOutcome>
         </LaunchADF>
      </CustomDiscoveryUI>
      

      これは、検出メタデータ・ファイル内でまったく同じである必要があります。これにより、ビルドしてプラグインに含めた、ガイドされた検出UIが起動されることを確認します。

  • plugin_stage/oms/metadata/mpcui

    • discovery.swf

      ターゲットのホームページに作成されたMPCUIアプリケーションと同様、ガイドされた検出UIは、Flexアプリケーションとして構築されます。

    • MyMpcui.swf

      検出SWFに加えて、MPCUIメタデータ・ファイルには、適切な検出モジュールに検出SWFを登録するエントリが含まれている必要があります。

      例9-46 FlexベースUIのMPCUIメタデータ・ファイルからのSwfFilesタグ

      <SwfFiles>
          <Swf is_homepage="true">HostSample.swf</Swf>
          <Swf discovery_module="DemoHostSample">HostSampleDiscovery.swf</Swf>
      </SwfFiles>
      

      <Swf discovery_module="DemoHostSample">HostSampleDiscovery.swf</Swf>エントリは、検出メタデータに登録された検出モジュールに登録する検出SWFを示しています。このUIは、Cloud Controlコンソールの「ターゲットの手動追加」ページで、ユーザーがこの検出モジュールを選択したときに、起動されます。

9.28.3 ガイドされた検出のユーザー・インタフェースの構築

ガイドされた検出UIは、Flex UIを構築するためのMPCUIの機能を使用して作成されます。リージョン、ボタン、表、ダイアログなどのUIコンポーネントは、Enterprise Managerに新しいターゲットを追加するプロセスを介してユーザーに説明するユーザー・インタフェースを構築するために使用されます。これらのUIコンポーネントの追加の詳細は、9.17項「表の定義」9.18項「ダイアログの定義」など、この章の関連する項を参照してください。

9.28.3.1 検出アプリケーションおよび統合クラス

検出アプリケーションは、MpApplicationクラスではなくMpDiscoveryApplicationクラスを拡張する必要があります。検出アプリケーションは、(ファイル名から取得した)アプリケーションの名前を指定するMXMLファイルと、検出アプリケーションに含まれるアクティビティを定義する統合クラスです。

例9-47 アプリケーションMXML

<?xml version="1.0" encoding="utf-8"?>
<mp:MpDiscoveryApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
                           xmlns:mp="http://www.oracle.com/mpcui"  
    backgroundColor="#EFF3F7" preloader="oracle.sysman.emx.MpPreloader" >
    <mx:Script>
        <![CDATA[      
            import discovery.DiscoveryInteg;
            override public function getIntegrationClass():Class 
                return discovery.DiscoveryInteg; }
        ]]>
    </mx:Script>    
</mp:MpDiscoveryApplication>

検出アプリケーションの統合クラスは、検出UIで使用される一連のアクティビティを定義します。検出アプリケーションには、ガイドされた検出の開始時にロードされるページであることを示すisDefaultPage=trueプロパティを使用して定義されたPageActivityが、少なくとも1つ含まれている必要があります。例9-48 (demo_hostsystemサンプル・プラグインから抽出)では、discoHomePgアクティビティに注意してください。

例9-48 統合クラス

<mp:PageActivityDef id='discoHomePg' label='Discovery Console' pageClass='{discovery.DiscoveryTrainPage}' pageControllerClass='{discovery.DiscoveryTrainPageController}' isDefaultPage="true" />
<mp:TrainActivityDef id='discoTrain' label='Discover New Targets'>
    <mp:stepActivities>
        <mx:Array>
            <mp:TrainStepActivityDef id='selAgentsStep' shortLabel="Select Agents" label='Add Demo Host System Target: Select Agents' pageClass='{discovery.train.SelectAgentsStep}' pageControllerClass='{discovery.train.DiscoveryTrainStepController}'/>
            <mp:TrainStepActivityDef id='selHostSysStep' shortLabel="Select System" label='Add Demo Host System Target: Select Demo Host System' pageClass='{discovery.train.SelectHostSystemStep}' pageControllerClass='{discovery.train.DiscoveryTrainStepController}'/>
            <mp:TrainStepActivityDef id='selTargetsStep' shortLabel="Configure Targets" label='Add Demo Host System Target: Configure Targets' pageClass='{discovery.train.SelectTargetsStep}' pageControllerClass='{discovery.train.DiscoveryTrainStepController}'/>
            <mp:TrainStepActivityDef id='confTargetsStep' shortLabel="Confirm Changes" label='Add Demo Host System Target: Confirm Changes' pageClass='{discovery.train.ConfirmChangesStep}' pageControllerClass='{discovery.train.DiscoveryTrainStepController}'/>
            <mp:TrainStepActivityDef id='finTopo' shortLabel="Summary" label='Add Demo Host System Targets: Apply Changes' pageClass='{discovery.train.FinalizeTopoStep}' pageControllerClass='{discovery.train.DiscoveryTrainStepController}'/>
        </mx:Array>
    </mp:stepActivities>
</mp:TrainActivityDef>

9.28.4 検出アプリケーションの構造

検出アプリケーションは、中にトレインが埋め込まれた単一のページ、または検出プロセスを説明するエンドユーザーからの情報を取得するためのダイアログを表示する単一のページのいずれかであることが多いです。ガイドされた検出フローのステップは要件に応じて異なりますが、多くは次のようになります。

  1. 検出スクリプトを実行する管理エージェントの決定

  2. 検出スクリプトの実行

  3. エンドユーザーが提供した追加情報を追加して、検出スクリプトの結果を処理

  4. ターゲットを追加または削除するAPIの呼出し

ガイドされた検出に関する重要な考慮事項の1つは、これは、新しいターゲットの検出とともに、既存のコンポジット・ターゲットのトポロジの更新に使用することも可能であるということです。サンプル・プラグイン(demo_hostsystem)の場合、ガイドされた検出UIによって、ユーザーは新しいシステム・ターゲットを追加できますが、既存のシステムに対してメンバーの追加または削除を行うこともできます。

このユースケースは、ターゲットがEnterprise Managerによってすでに管理されているかどうかを識別する検出スクリプトから返される情報を持つセットを比較するために、Enterprise Managerに認識された既存のターゲットのセットを問い合せる、Enterprise Manager APIを使用するための要件も示しています。たとえば、結果は、追加する必要がある新しいターゲットのリストと、管理構成にすでに存在しないためEnterprise Managerから削除する必要がある他のターゲットのリストになります。

このシナリオは、検出アプリケーションは、ターゲットのホームページにビルドされたカスタムUIと統合する可能性もあることも示しています。これにより、コンポジット・ターゲットのホームページから、既存のコンポジット・ターゲットの構成を直接更新する機能がユーザーに提供されます。

ターゲットのホームページ内から検出UIを使用する例は、demo_hostsystemサンプル・プラグインのHostSystemConfigurationページを参照してください。

9.28.5 検出サービスの使用

検出サービスは、プラグインに付属の検出スクリプトを実行するために使用されます。検出をサポートするプラグインの要件の説明は、9.28.2項「ガイドされた検出のサポート」を参照してください。

例9-49 (DiscoveryTrainStepController内のdemo_hostsystemサンプル・プラグインに含まれています)は、検出サービス(TargetFactory.discoverTargets)の呼出しを示しています。このサービスには、必要な場合、複数の管理エージェント上の検出を処理するために複数回呼び出すことができるaddRequestメソッドが含まれています。

addRequestメソッドへの各呼出しは、検出スクリプトの結果を使用して呼び出されるハンドラとともに、次に渡されます。

  • リクエストID

    リクエストに関連付けられた特定の結果を取得できる特定のリクエストに関連付けられた一意の識別子(ユーザーが割り当てる)。

  • エージェント

    検出を実行する管理エージェント・ターゲット。

  • プラグインID

    実行する検出に関連付けられたプラグインID。プラグインには、複数の検出モジュールおよびカテゴリを含めることができます。

  • 検出カテゴリ

    検出カテゴリ。これは、プラグインのエージェント部分に含まれているdiscover.lstファイルのエントリを使用して、検出スクリプトにマップする必要があります。

例9-49 検出サービス

/**
 * when doing discovery, the service will accept multiple requests to be
 * processed at the same time.  this would typically be the case if multiple
 * agents were involved in the process, but could also be if different discovery
 * categories (scripts) were to be processed.
 *
 * the discovery request includes the following elements:
 *     requestId   a unique identifier associated with that particular request 
 *                 that will allow you to retrieve the specific results associated
 *                 with that request.
 *     agent       the agent Target that the discovery should be run against
 *     pluginId    the pluginId associated with the discovery to be run; a plug-in
 *                 can include multiple discovery modules and categories
 *     discCat     the discovery category; this must map to a discovery script via 
 *                 an entry in the discover.lst file included in the agent part of 
 *                 the plugin
 *     params      parameters that are to be passed to the discovery script
 * 
 * Note on discoveryModule - in addition to the pluginId, the discovery UI is 
 * passed the discovery module associated with this discovery pass.  If you've  
 * chosen to implement multiple types of discovery operations from a single 
 * discovery UI you may retrieve thediscoveryModule to determine in what context
 * the UI was launched.
 */

var requestId:String = "DiscReq1";
var pluginId:String = ApplicationContext.getPluginId();
var discoveryCategory:String = "DHSYSTEM_DISC";
discSvc.addRequest(requestId, agent, pluginId, discoveryCategory, params); 

TargetFactory.discoverTargets(discSvc, discoverResultsHandler);

次のように宣言される検出結果ハンドラは、フォルト・オブジェクトおよび検出結果に渡されます。

public function discoverResultsHandler(disc:Discovery, fault:ServiceFault):void

検出スクリプトの処理中にフォルトが発生しなかった場合、フォルト・オブジェクトはNULLになります。ハンドラに渡される検出オブジェクトには、addRequestメソッドを呼び出すことによって構築されたDiscoveryRequestオブジェクトの配列が含まれています。各リクエストには、指定したプロパティ(エージェント、カテゴリなど)が含まれ、DiscoveredTargetsオブジェクトも含まれています。DiscoveredTargetsオブジェクトには、指定したリクエストのターゲット管理エージェントで実行された検出スクリプトから返されたターゲットのリストが含まれています。検出スクリプトの詳細は、第12.3項を参照し、DiscoveryServiceで返された検出オブジェクトの詳細は、EDKのAPIドキュメントを参照してください。

9.28.6 ターゲット情報サービスの使用

検出処理中に、エージェントのリストや特定のタイプのターゲットのセットなど、ターゲット情報を取得する必要がよくあります。ターゲット情報サービスでは、このような目的で使用できる多くのAPIが提供されています。この項では、これらのサービスの概要について説明します。詳細は、EDKのAPIドキュメントを参照し、これらの使用例は、demo_hostsystemサンプル・プラグインを参照してください。

  • TargetFactory.getAgents

    getAgents APIは、検出を実行するために使用できる一連の管理エージェントを取得できます。Windowsホスト上で実行中のすべての管理エージェントを選択するなど、選択プロパティ(TargetPropertyの配列)を指定することによって、リストをフィルタ処理できます。

  • TargetFactory.getTargets

    getTargets APIを使用して、ホスト、ターゲット・タイプ、管理対象ステータス、メタデータ・バージョンなど、任意の数の選択基準を指定するターゲットのリストを取得します。各アイテムは使用可能な値のリストとして指定され、リクエストは1つ以上の選択基準を含めることができます。

  • Target.getSystemMembers

    getSystemMembers APIを使用して、システム・メンバー・ターゲットのリストを取得します。これらは、systemStencilを介してシステムに含まれるターゲットです。システム・ターゲットの詳細は、『Oracle Enterprise Manager Cloud Control拡張プログラマーズ・ガイド』を参照してください。

  • Target.getCompositeMembers

    getCompositeMembers APIを使用して、コンポジット・メンバー・ターゲットのリストを取得します。コンポジット・メンバーは、包含アソシエーションを介してコンポジット(またはシステム・ターゲット)に含まれるメンバーです。コンポジット・ターゲットの詳細は、『Oracle Enterprise Manager Cloud Control拡張プログラマーズ・ガイド』を参照してください。

9.28.7 ターゲット管理サービスの使用

ターゲット管理サービスでは、ターゲットまたはアソシエーションを作成または削除する機能が提供されます。ターゲット管理の場合、アソシエーションは、ターゲット定義の一部として渡すこともでき、そのアソシエーションは、ターゲット自体を追加するプロセスの一部として追加されます。この項では、これらのサービスの概要について説明します。詳細は、EDKのAPIドキュメントを参照し、これらの使用例は、demo_hostsystemサンプル・プラグインを参照してください。

  • TargetFactory.createTargets

    createTargets APIを使用して、ターゲットをEnterprise Managerに追加します。Enterprise Managerにターゲットを追加するプロセスは、各ターゲットに関連付けられた管理エージェントへの必要なプラグインのデプロイメントを強制します。このAPIへのリクエストは、ターゲット・オブジェクトのリストで、このオブジェクトのそれぞれは、最低でも、名前、タイプおよびエージェントを指定する必要があります。通常、ターゲット・インスタンス・プロパティ(このターゲット・タイプに使用される場合)を指定することもできます。

  • TargetFactory.deleteTargets

    deleteTargets APIを使用して、ターゲットをEnterprise Managerから削除します。このAPIへのリクエストは、ターゲット・オブジェクトのリストです。ターゲットの削除は元に戻せず、すべてのターゲット、メトリックおよび構成の履歴を削除するため、Enterprise Managerからのターゲットの削除は、注意して実行する必要があります。

  • Target.createAssociations

    createAssociations APIを使用して、指定したターゲットと別のターゲットの間のアソシエーションを追加します。導出されたアソシエーションまたはシステム・ステンシルを使用してアソシエーションを作成する場合は、この方法で作成できます。すべての場合、アソシエーションは、対応する許可されたペアの定義に関連付ける必要があります。詳細は、第11章を参照してください。

  • Target.deleteAssociations

    deleteAssociations APIを使用して、指定したターゲットと他のターゲットの間のアソシエーションを削除します。

9.29 ロギングについて

次の各項では、MPCUIのロギング・オプションについて説明します。

9.29.1 コードへのロギングの追加

ロギング機能(MpLog)を使用して、コードからメッセージを記録します。


注意:

Flashトレース・グローバル・メソッドのみが、ブラウザがAdobe Flash Playerのデバッグ・バージョンを実行しているFlashログへの出力を提供しているため、これを使用しないでください。

ロギングは、診断が必要な状況で役立つ一方、コード・サイズおよびオーバーヘッドの観点ではコストがかかります。そのため、ロギングは注意して使用してください。

MpLogメソッド(デバッグ、情報、エラーまたは致命的など)のうち1つを呼び出して、ロギングを実行します。メソッドは、置換する必要があるメッセージ文字列およびオプションのパラメータのリストを受け入れます。

パラメータを置換するには、{#}フォーマットを使用して、パラメータの位置を示します。

  MpLog.debug("The metric {1} was not found for the target {2}.", metricName, targetName);

このログ文で生成されたメッセージは、次のログ出力に表示されます。

2011-04-22 11:10:17 [MpCui] DEBUG The metric CPU was not found for the target MYHOST

レベル(情報、デバッグ、エラー、致命的)によって、ユーザーは、異なるクラスのメッセージのログ出力を有効化できます。

  • デフォルトでは、すべてのエラーおよび致命的メッセージは、ログ出力の場所に送信されます。

  • 情報およびデバッグのレベルのメッセージは、これらのレベルが明示的に有効化されている場合のみ、送信されます。

さらに、各レベルのメッセージを異なる出力場所に送信できます。使用可能なログの場所には、次の3つがあります。

  • FLASHLOG: メッセージはFlashログに送信されます(デバッグAdobe Flash Playerが必要)

  • EMLOG: メッセージはEnterprise Managerアプリケーション・ログに送信されます

  • CONSOLE: メッセージは、MPCUI表示の下部に表示される小さいウィンドウに送信されます

9.29.2 ログ出力を取得するオプション

ログ出力を取得するオプションは、実装に依存しています。

9.29.2.1 Adobe Flash BuilderからのMPCUIの実行

Adobe FlashまたはFlex Builderを使用してMPCUIを開発している場合、FLASHLOGに送信されたログ・メッセージは、デフォルトで、Adobe Flash Builder統合開発環境(IDE)の下部にあるコンソール・ウィンドウに表示されます。

これらのロギング設定を変更するには、次の手順に従います。

  1. html-template/data/mpCuiProperties.xmlファイルを開きます。

  2. loglevel要素を特定します。

        <!-- Logging
           level: DEBUG, INFO, ERROR, FATAL, WARN (or ALL)
           output location: FLASHLOG, CONSOLE, EMLOG 
           format: level,output;level,output (e.g. DEBUG,FLASHLOG;ERROR,EMLOG)
        --> 
        <loglevel>ALL,FLASHLOG</loglevel>
    
  3. 必要に応じて、loglevel要素を変更します。

  4. Adobe Flexアプリケーションを実行する前に、アプリケーションを再ビルドします。

9.29.2.2 Enterprise ManagerコンソールからのMPCUIの実行

プラグインのデプロイ後に、ロギングの設定がHTTPリクエストから検出されます。デフォルト設定は、FATAL,FLASHLOG;ERROR,FLASHLOGです。

エンドユーザーは、次のように設定を変更できます。

  1. ブラウザのアドレス・バーで、URLに次を追加します。

    &loglevel=ALL,FLASHLOG
    
  2. ALL,FLASHLOGを、ERROR,CONSOLEなどの有効なロギング設定に置換できます。

  3. 診断の状況の場合、URLの末尾に次を追加します。

    &loglevel=ALL,CONSOLE
    
  4. ページをリフレッシュして、図9-28のようなコンソール・ウィンドウのページおよびすべてのログ・メッセージを確認します。

図9-28 ログ・メッセージの表示

図9-28の説明が続きます
「図9-28 ログ・メッセージの表示」の説明

9.30 開発環境オプション

プラグインのカスタムUIをビルドする場合、次の開発環境オプションがあります。

  • メタデータのみ

    好みのテキスト・エディタを使用して、MPCUIメタデータ・ファイルを編集します。MPCUIメタデータ・ファイルの詳細は、9.4.1項「MPCUIメタデータ要素の概要」を参照してください。

  • Flex SDKおよびApache Ant

    Flex SDKをダウンロードし、EDKで提供されるApache Antビルド・ファイルを使用して、SWFコードをビルドします。このオプションには、Flex Builderのライセンスは必要ありませんが、Flex Builderの一部であるグラフィカル・デバッガではなく、コマンドライン・デバッガ(fdb)を使用する必要があります。Flex SDKおよびApache Antの使用の詳細は、9.30.1項「Flex SDKおよびApache Antを使用したMPCUIの開発」を参照してください。

  • Flex Builder

    Flex Builderのビルドを行うライセンスを取得し、プラグインに付属のFlexコードをデバッグする必要があります。Flex Builderの使用の詳細は、9.30.2項「Adobe FlashまたはFlex BuilderでのMPCUIの開発」を参照してください。


注意:

MPCUIプロジェクト用のAdobe Flash Builderで使用するプロジェクト設定は、アプリケーションが正しくビルドされ、プラグインの一部としてデプロイされる際に適切に動作することを確認するために不可欠です。demo_hostsampleサンプル・プロジェクトの設定を参考にし、これらの設定に正確に一致させることをお薦めします。

Adobe Flash Builderで、プロジェクト・プロパティを選択し(「File」メニューから「Properties」を選択)、設定がサンプル・プロジェクトの設定と一致することを確認します。「Library path」タブの「Flex Build Path」プロパティの設定が、「Flex Compiler」プロパティの設定と同じであることを確認します。


9.30.1 Flex SDKおよびApache Antを使用したMPCUIの開発

Flex Builderを使用できない場合、次のように、Adobe Flex SDKをインストールし、Antを使用してプラグイン用のSWFファイルをビルドします。


注意:

次のステップによって、Windows上でAntを使用して、HostSample.swfをビルドします。

コマンドラインから、またはFlex Builder IDEを使用せずに、デモ・サンプルをビルドする場合、参照用に次の2つのApache Antビルド・ファイルがあります。

  • demo_hostsample\mpcui\build.xml

  • demo_hostsample\mpcui\plugin-build-config.xml


  1. 次のWebサイトから、Apache Antをダウンロードおよびインストールします。

    http://ant.apache.org
    
    1. ANT_HOME環境変数を、Apache Antがインストールされている場所に設定します。

    2. コマンド・シェルのPATH環境変数に、$ANT_HOME\binをインクルードします。

    3. ANT_OPTS環境変数を-Xmx512mに設定します。

  2. Flex SDKバージョン3.5をダウンロードおよびインストールします。

  3. demo_hostsample\mpcui\build.xmlファイルを編集します。

    locationがFlex SDKインストールの場所を指すように、FLEX_HOMEプロパティを更新します。

  4. HostSample.swfファイルをビルドします。

    1. cd demo_hostsample\mpcui

    2. ant

      このコマンドを入力すると、demo_hostsample\mpcui\bin-debug\HostSample.swfファイルをビルドします。

9.30.2 Adobe FlashまたはFlex BuilderでのMPCUIの開発


注意:

この項では、Adobe Flash Builder 4を使用していることを前提とします。ただし、Adobe Flex Builder 3を使用している場合も、これらのステップは同じになります。

この項では、MPCUIライブラリおよびAdobe Flash Builderを使用してFlexアプリケーションをビルドする際に従うプロセスについて説明します。これらのステップは、デモ・ホスト・サンプル(またはdemo_hostsample)と呼ばれる、EDKで提供されるサンプル・アプリケーションを使用していることを前提とします。多くの開発アクティビティと同様に、提供されたAPIの動作方法、およびこれらを使用してより高いレベルのユースケースを実行する方法を理解するために、実施例から開始することは、多くの場合、最も容易です。

カスタムUIを開発するプロセスを単純化するには、各変更後にEnterprise Managerへのプラグインの再デプロイを行う必要なく、Adobe Flash BuilderからFlexアプリケーションをビルドおよび実行します。Adobe Flash Builderから実行する場合、UIは、コンソールで使用可能なEnterprise Managerの他の機能およびページにはアクセスできませんが、プラグインの一部としてデプロイする前に、適切に機能していることを確認するためにUIを実行できるようになります。

9.30.2.1 Adobe Flash Builderの構成

EDKで提供されるMPCUIライブラリは、Flex SDK 3.5を使用してビルドされ、Flex SDK 3.5を使用する必要があります。そのため、Adobe Flash BuilderでMPCUIプロジェクトをビルドする際には、3.5 SDKを使用する必要があります。

バージョンをチェックするには、次の手順に従います。

  1. Adobe Flash Builderで、「Window」メニューから、「Preferences」を選択します。

  2. 「Preferences」ダイアログで、「Flash Builder」を開き、「Installed Flex SDKs」を選択します。


    注意:

    Adobe Flex Builder 3では、「Preferences」ダイアログから、「Flex」を開きます。

Flex SDK 3.5がない場合、Flex SDK 3.5をインストールする必要があります。

  1. 次のFlex SDK 3.5 ZIPファイルをダウンロードします。

  2. これらのZIPファイルを、システム上の新しいディレクトリに展開します(たとえばc:\flex3.5\sdks\)。


    注意:

    SDKディレクトリに自動化ライブラリを追加する際には、FLEX_HOMEディレクトリではなく、FLEX_HOME/frameworksディレクトリに展開する必要があります。

    Adobe Flash Builder (またはFlex Builder)へのSDKのバージョンの追加の詳細は、AdobeのWebサイトを参照してください。

    http://www.adobe.com/support/flashbuilder/
    
  3. Adobe Flash Builderで、「Window」メニューから、「Preferences」を選択します。

  4. 「Preferences」ダイアログで、「Flash Builder」を開き、「Installed Flex SDKs」を選択します。


    注意:

    Adobe Flex Builder 3では、「Preferences」ダイアログから、「Flex」を開きます。

  5. 「Add」をクリックし、手順2でZIPファイルを解凍した場所を参照します。

9.30.2.2 デモ・サンプル・プロジェクトの設定

デモ・サンプル・プロジェクトを設定するには、次の手順に従います。

  1. EDK配布でdemo_hostsample.zipファイルを特定します。

  2. Adobe Flash Builderをインストールおよび構成したWindowsシステム上の場所に、このファイルをコピーします。

  3. Adobe Flash Builderで、「File」メニューから、「Import Flex Project」を選択します。

  4. demo_hostsample.zipファイルがある場所を参照し、そのファイルを選択して「Finish」をクリックします。

    警告ダイアログ(「Project Will Be Upgraded」)が表示され、これは、プロジェクトdemo_hostsampleは、前のバージョンのFlash Builderで作成されたことを示しています。

    2番目のダイアログ(「Choose Flex SDK Version」)が、同じ警告とともに表示されます。

  5. 2番目のダイアログで、リストから「Use a specific SDK」を選択し、「Flex 3.5」を選択して「OK」をクリックします。

  6. 最初のダイアログで、「OK」をクリックして、プロジェクトをアップグレードします。

    Adobe Flash Builderナビゲータに、demo_hostsampleプロジェクトが表示されます。

  7. mpcui/srcディレクトリにナビゲートして、プラグインUIを構成するソース・ファイルを表示します。

    これらのファイルをコンパイルすると、mpcui/bin-debug/HostSample.swfファイルが作成されます。これは、このターゲットのカスタムUIであるFlexアプリケーションで、プラグインに含まれます。

    SWFファイルの詳細は、9.7項「プラグインとのMPCUI実装のパッケージ化」および9.6項「MPCUIアプリケーションの定義」を参照してください。

9.30.2.3 Adobe Flash Builderからのデモ・サンプルのMPCUIの実行


注意:

MPCUIの利点の1つは、デプロイされたプラグインの一部として、またはAdobe Flash Builder内から直接実行して、Flex UIをテストできることです。この後者のオプションでは、反復の開発をより単純にできますが、少なくとも1つのバージョンのプラグインをEnterprise Managerにデプロイし、Adobe Flash BuilderからUI (Flexアプリケーション)を実行しようとする前にターゲット・インスタンスがすでに検出されている必要があります。

デモ・サンプル・プラグインがデプロイされ、demo_hostsample.zipプロジェクトがAdobe Flash Builderにインポートされて正常にビルドすると、Adobe Flash BuilderからFlexアプリケーションを実行できます。

  1. ナビゲータから、demo_hostsampleを選択します。

  2. 「Run」メニューから、「Run HostSample」または「Debug HostSample」を選択します。

    「管理サーバー接続」ログイン・ダイアログとともに、ブラウザ・ウィンドウが表示されます。


    注意:

    「管理サーバー接続」ダイアログが表示されない場合、または他のエラーが表示される場合、プロジェクトが正常にインポートされたことを確認し、Flash Builderウィンドウの下部に表示される「Problems」タブまたは「Console」タブにエラーが表示されていないことを確認します。

    通常の操作時に、ユーザーがターゲットのホームページに移動してEnterprise Managerコンソールを介してUIにアクセスする場合、UIはEnterprise Managerコンソールの不可欠な部分として実行中で、コンソール・セッションに埋め込まれているため、このダイアログは表示されません。

    ただし、Adobe Flash Builderから実行している場合、UIは、プラグインがデプロイされていて、管理するターゲット・インスタンスがあるEnterprise Managerのサイトに接続するための情報を必要とします。実行中のEnterprise Managerコンソールに接続するために使用するホスト、ポートおよび資格証明の、同じ情報を入力します。構成に応じてhttpまたはhttpsのいずれかを使用できますが、指定したポートが提供されたプロトコルに対して正しいことを確認する必要があります。


  3. 監視するターゲットの下に、このプラグインに関連付けられたターゲット・インスタンスのターゲット名およびターゲット・タイプ(表示されたラベルではなく内部タイプ)を入力します。これは、Enterprise Managerにすでに存在するターゲットである必要があります。デモ・サンプルを使用している場合、ターゲット・タイプはdemo_hostsampleで、ターゲット名は、ターゲット・インスタンスの作成時に指定したターゲット名です。

  4. 「OK」をクリックします。

    デモ・サンプルのホームページが表示され、データが移入されます。


注意:

このモードでは、Enterprise Managerのページ装飾およびターゲット・コンテキスト領域は、ページの上部に表示されませんが、Enterprise Managerコンソールからターゲットのホームページにアクセスすると、これらは表示されます。カスタムUIに含まれる複数のページを実行できるメニューが表示されます。

9.30.2.4 デモ・サンプルのFlex UIの要素

次に、デモ・サンプルのFlex UIを構成するコンポーネントの簡単なリストを示します。各ファイルの目的を説明するコメントおよび各ファイルに示したアイテムの詳細は、ソース・コードを参照してください。

demo_hostsample
    html-template/data/demo_hostsample_menu.xml           
    mpcui/src
          HostSample.mxml            The application definition, must extend 
                                     MpApplication and implement the single 
                                     method "getIntegrationClass"
          HostSampleInteg.mxml       The integration class, defines the set of
                                     pages, dialogs, trains, etc. that make up
                                     the application
          HomePage.mxml              The target homepage, contains the layout of
                                     the UI for the homepage
          HomePageController.as      The controller for the HomePage, includes 
                                     the methods that load data for the page
                                     and respond to events from the page
          ProcessesPage.mxml
          ProcessesPageController.as
          CredentialsPage.mxml
          CredentialsPageController.as
          AvailabilityDialog.mxml
          MetricHistoryDialog.mxml

9.30.2.5 デモ・サンプルの更新

Adobe Flash BuilderでUIを変更および再ビルドするとき、変更が行われると、 Adobe Flash BuilderからFlexアプリケーションを直接実行またはデバッグできます。

続行しようとする前に、「Problems」タブにコンパイラ・エラーが表示されていないことを確認してください。未解決のエラーがあるアプリケーションを実行しようとした場合、Adobe Flash Builderは警告を表示します。


注意:

Adobe Flash Builderで更新されたUIを参照できますが、Enterprise Managerにデプロイされるバージョンを更新していません。プラグインを更新するまで、更新されたバージョンはEnterprise Managerコンソールに表示されません。

9.30.2.6 デプロイされたプラグインの変更

Adobe Flash BuilderでUIへの変更を行った後で、Enterprise Managerコンソール内のターゲットのホームページから更新を表示できるよう、変更をプラグインに適用できます。

これを行うには、新しいバージョンのプラグインを作成およびデプロイするか、メタデータ登録サービス(MRS)を使用する必要があります。

MRSによって、新しいバージョン全体を作成およびデプロイせずに、増分更新をプラグインに適用できます。MRSの詳細は、第14.7項を参照してください。

Adobe Flash BuilderでFlexコードを変更することによってカスタムUIを変更した後で、次の手順に従います。

  1. SWFファイル(/bin-debug)を再ビルドします。

  2. Enterprise Managerのサイトがインストールされたサーバーおよび最初にデモ・サンプル・プラグイン(HostSample.swf)をデプロイしたサーバーに、SWFファイルをFTP送信またはコピーします。

  3. プラグイン・ステージング・ディレクトリを作成した場所に、このファイルをコピーします。

    stage/oms/metadata/mpcui
    

    注意:

    このディレクトリには、このファイル(HostSample.swf)の既存のバージョンが、MPCUIのメタデータXMLファイルとともに存在します。

  4. 次のコマンドを使用して、プラグインを更新します。

    emctl register oms metadata -sysman_pwd sysman -pluginId oracle.sysman.xohs 
    -service mpcui -file demo_hostsample_uimd_swf.xml
    

    emctlコマンドの詳細は、第14.7項を参照してください。

9.30.3 MPCUI用のAdobe Flash Builderプロジェクトの設定

この項では、Adobe Flash Builder 4.5を使用していることを前提としますが、Adobe Flash Builder 3のユーザー向けの注意も記載しています。

Adobe Flash Builderプロジェクトを設定するには、空のプロジェクトを作成するか、demo_hostsampleプロジェクトをテンプレートとして使用するためにAdobe Flash Builderにインポートします。demo_hostsampleプロジェクトをインポートする場合、9.30.3.1項「開始する前に」の手順を完了します。それ以外の場合、9.30.3.2項「Adobe Flash Builderプロジェクトの作成」に進みます。


注意:

Adobe Flash Builderを、Flex 3.5 SDKファイルを含めるように構成しておく必要があります。Flex 3.5 SDKファイルを含める場合の詳細は、9.30.2.1項「Adobe Flash Builderの構成」を参照してください。

9.30.3.1 開始する前に

demo_hostsampleプロジェクトをテンプレートとして使用する場合、MPCUI用にAdobe Flash Builderプロジェクトを設定する前に、次の手順を実行する必要があります。

  1. 次のディレクトリの中身を削除します。

    • /stage

    • /scripts

    • /rsc

    これらのディレクトリは、サンプル・プラグインのデプロイへのサポートを提供しますが、新しいプロジェクトには適していません。

  2. mpcui/metadataディレクトリの、demo_hostsample_uimd_swf.xmlファイルの名前をtargettype_mpcui.xml (targettypeはターゲット・タイプの名前)に変更します。

    mpcui/metadataディレクトリの中身を、targettype_mpcui.xmlを除いてすべて削除します。

  3. mpcui/data directoryディレクトリの、mpCuiProperties.xmlファイルを次のように編集します。

    • OMS接続を、Enterprise Managerサーバーに接続するための情報に置き換えます。

       <!-- Default OMS Connection -->
              <hostname>myhost.us.example.com</hostname>
              <port>7777</port>
              <emUser>sysman</emUser>
              <password>sysman_pasword</password>
      
    • <metadata>タグを、手順2で作成したファイル名 (/metadata/targettype_mpcui.xml)に置き換えます。

      <!--                 the filename that includes the mpcui meta-data that will be included
      in the plug-in. This is used to populate the menus for testing of the 
      UI in standalone (FlashBuilder) mode
      If not specified then a default filename of <targetType>_menu.xml will be used.       -->
              <metadata>../metadata/targettype_mpcui.xml</metadata>
      
  4. /srcディレクトリの、HostSample.mxml (アプリケーション定義)およびHostSampleInteg.mxml (統合クラス)のファイルの名前を、MyTargetUi.mxmlおよびMyTargetUiInteg.mxmlなど、ターゲットに関連するファイル名に変更します。これらのファイルの詳細は、9.6項「MPCUIアプリケーションの定義」を参照してください。

    /srcディレクトリの中身を、MyTargetUi.mxmlおよびMyTargetUiInteg.mxmlの2つのファイルを除いてすべて削除します。

  5. 次の2つファイルが/mpcui/libsディレクトリにあることを確認します。

    • mpcui_12.1.0.2.0.swc

    • mprslldr_12.1.0.2.0.swc


    注意:

    これらのファイルはバージョン固有です。EDKの以前のバージョンから新しいバージョンに移行した場合、これらのファイルを最新のバージョンに置き換え、この変更を反映するようプロジェクト・プロパティが更新されていることを確認する必要があります。

  6. stylesFusionFX.swfファイルが/html-templateディレクトリにあることを確認します。このファイルが見つからない場合、demo_hostsample.zipファイルでこのファイルを特定し、/html-templateディレクトリに追加します。

  7. Adobe Flash Builderで、プロジェクト・プロパティを選択し(「File」メニューから「Properties」を選択)、「Flex Compiler」を選択します。

    Flex SDKのバージョンがFlex 3.5に設定されていることを確認します。エラーが発生する場合、Flex 3.5 SDKファイルの場所がサンプルに使用されている場所と同じではありません。

    「Configure Flex SDKs...」をクリックし、Flex 3.5の設定を、Flex 3.5 SDKファイルをインストールした場所を指すよう編集します。

9.30.3.2 Adobe Flash Builderプロジェクトの作成

Adobe Flash Builderから、新しいプロジェクトを作成し、次の手順を実行してプロジェクトを設定します。

  1. ターゲットに関連する意味のある名前をプロジェクトに付けます(MyTargetUIなど)。この名前は、プロジェクトの作成後に、デフォルトのアプリケーション・ファイルに割り当てられます。たとえば、/src/MyTargetUi.mxmlのようになります。

  2. Flex SDKのバージョンがFlex 3.5に設定されていることを確認します。詳細は、9.30.2.1項「Adobe Flash Builderの構成」を参照してください。「Finish」をクリックして、アプリケーションを作成します。

  3. demo_hostsample.zipファイルで、mpcui/html-template/stylesFusionFX.swfファイルを特定します。/html-templateディレクトリの下のプロジェクトに、このファイルのコピーを作成します。

  4. demo_hostsample.zipファイルで、mpcui/libsディレクトリを特定し、/libsディレクトリの下のプロジェクトに、次のファイルをコピーします。

    • mpcui_12.1.0.2.0.swc

    • mprslldr_12.1.0.2.0.swc

  5. metadataと呼ばれるディレクトリを作成し、targettype_mpcui.xmlと呼ばれるファイルを作成します。このファイルには、プラグインのMPCUIメタデータが含まれています。このファイルの詳細は、demo_hostsampleおよび9.4項「MPCUIメタデータ・ファイルの作成」を参照してください。

  6. demo_hostsample.zipファイルで、mpcui/data/mpCuiProperties.xmlファイルを特定し、dataと呼ばれる新しいディレクトリの中のプロジェクトにコピーします。

    このファイルを次のように編集します。

    • OMS接続を、Enterprise Managerサーバーに接続するための情報に置き換えます。

       <!-- Default OMS Connection -->
              <hostname>myhost.us.example.com</hostname>
              <port>7777</port>
              <emUser>sysman</emUser>
              <password>sysman_pasword</password>
      
    • <metadata>タグを、手順5で作成したファイル名 (/metadata/targettype_mpcui.xml)に置き換えます。

      <!--                 the filename that includes the mpcui meta-data that will be included
      in the plug-in. This is used to populate the menus for testing of the 
      UI in standalone (FlashBuilder) mode
      If not specified then a default filename of <targetType>_menu.xml will be used.       -->
              <metadata>../metadata/targettype_mpcui.xml</metadata>
      
  7. /srcディレクトリに、projectname.mxmlファイルがあります。MPCUIアプリケーションの必須設定に対応するよう、このファイルを変更し、統合クラスを追加する必要があります。詳細は、9.6項「MPCUIアプリケーションの定義」を参照してください。

  8. 9.30.3.3項「MPCUIプロジェクト・プロパティの設定」で説明するように、プロジェクト・プロパティが正しく設定されていることを確認します。

9.30.3.3 MPCUIプロジェクト・プロパティの設定

プロジェクトが正常に動作することを確認するために、MPCUIアプリケーションのプロジェクト・プロパティが正しく設定されていることを確認することは重要です。

  1. Adobe Flash Builderで、プロジェクト・プロパティを選択し(「File」メニューから「Properties」を選択)、「Flex Compiler」を選択します。

    • 「Flex SDK version」がFlex 3.5に設定されていることを確認します。

    • 「Enable strict type checking」が選択されていないことを確認します。

  2. Adobe Flash Builderで、「Project」「Properties」「Flex Build Path」の順に選択し、「Library Path」タブをクリックします。

    • 新しいプロジェクトから開始する場合、プロジェクトのビルド・パス・プロパティ・ページにアクセスして、ライブラリ・パスを編集する必要があります。

      • ビルド・パス・ライブラリでlibsエントリを削除します。

      • 「Add SWC」をクリックし、mprslldr.swcファイルを選択します。

      • mpcui.swcファイルを選択するように、前の手順を繰り返します。

        各ファイルが別のリンケージ設定を持つために、これらの手順は必要です。

    • 「Verify RSL Digests」がチェックされていないことを確認します。

    • mprslldr.swcエントリを開き、「Link Type」「Merged into code」に設定されていることを確認します。設定されていない場合、「Link Type」を選択し、設定を「Merged into Code」に変更します。

    • Flex Builder 3を使用している場合、次のことを確認します。

      • MPCUI swcエントリを開き、「Link Type」を選択して「Edit」をクリックします。

      • 「Link Type」「Runtime shared library (RSL)」に変更します。

      • 「Verification」「None (trusted environments only)」に設定します。

      • 「Deployment Path/URL:」をmpcui.swfに設定し、「Automatically extract swf to deployment path」を選択します。

    • Adobe Flash Builder 4.5を使用している場合、次を実行します。

      • MPCUI swcエントリを開き、「Link Type」を選択して「Edit」をクリックします。

      • 「Link Type」「Runtime shared library (RSL)」に変更します。

      • 「RSL deployment paths:」の隣にある「Add」をクリックし、「Deployment Path/URL」にmpcui.swfと入力し、「Automatically extract SWF to deployment path」が選択されていることを確認します。

      • 「RSL Deployment paths」にすでにエントリが存在し、それがmpcui.swfではない場合、それを編集し、前の手順で示したような正しいパスであることを確認します。

9.30.3.4 適切なMPCUIライブラリ・リンケージの検証

プロジェクトを設定し、SWFをビルドしている場合、使用しているEDKのバージョンをサポートしている様々なEnterprise Managerプラットフォームのバージョンのいずれかにデプロイされているときに正しく動作していることを検証する必要があります。

最初に、SWFファイルのサイズを検証します。1MBより大きい場合、SWFが正しくリンクされていない可能性があります。標準的なMPCUIのSWFファイルは300から600KBです。これは決定的なテストではありませんが、SWFが正しくリンクされているかどうかのよい目安となります。

SWFが正しくリンクされていることを検証するには、次の手順を実行します。


注意:

これらは、12.1.0.2.0環境でプラグインをデプロイおよび実行している場合に固有の手順です。

  1. プラグインのSWFファイルを更新し、新しいバージョンのプラグインをEnterprise Managerサーバーにデプロイします。


    注意:

    プラグインがすでにデプロイされている場合、emctl register oms metadataコマンドを使用して、プラグインのみのMPCUI部分を更新できます。詳細は、14.7項を参照してください。

  2. このプラグインおよびプラグインに含まれるSWFファイルに関連付けられたターゲットのホームページにアクセスします。

  3. TargetInfoServiceでエラーが発生して、ホームページのロードが失敗した場合、RSLとしてリンクせずに古いswcファイル(12.1.0.2.0より前)でリンクした可能性があります。これが発生した場合、次を実行します。

    • ブラウザ・アドレスのURLを次のテキストを追加して変更し、ページをリロードします。

      &traceEnabled=true
      
    • ページをロードしてエラーが表示されると、エラー・ダイアログを閉じ、リクエスト・トレース・ウィンドウで、TargetInfoService.getTargetInfoエントリを特定および選択して、Shot Item Detailsを選択します。

    • rslVersionErrorの下部にあるウィンドウの右側に表示される応答メッセージを探します。このテキストが見つかった場合、サーバーが、不正にリンクされたクライアントからのリクエストを拒否したことを示しています。プロジェクト・プロパティを確認して、9.30.3.3項「MPCUIプロジェクト・プロパティの設定」で説明したように、正しくリンクされたSWFがあることを確認します。

      応答メッセージにエラーが含まれる場合、通常、次のように表示されます。

      <rslVersionError SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next" xmlns="http://em.oracle.com/">12.1.0.2.0
                                                       </rslVersionError>
      
  4. ホームページが正しくロードされた場合、ブラウザ・アドレス・バーのURLを次のテキストを追加して変更し、ページをリロードします。

    &loglevel=ALL,CONSOLE
    
  5. ページがロードされたら、ページの下部にあるロギング・ウィンドウに表示されるログ出力をチェックし、次のテキストを探します。

    [MpCui] INFO Application Linked with Version
    

    アプリケーションが正しくリンクされている場合、リンクされたswcファイルのバージョンがこの行に表示されます。

    その次の行には次のテキストが含まれ、接続しているEnterprise Managerサーバーのバージョンを示しています。そうなっていない場合、SWFは正しくリンクされていません。

    [MpCui] INFO RSL Library Loaded Version
    

    例9-50 ログ出力

    2012-05-04 13:37:44.269 [MpCui] INFO Application Linked with Version: 12.1.0.1.1 
    2012-05-04 13:37:44.270 [MpCui] INFO RSL Library Loaded Version     : 12.1.0.2.0 
    2012-05-04 13:37:44.271 [MpCui] INFO RSL Library Min Supported Vers : 12.1.0.1.0 
    2012-05-04 13:37:44.273 [MpCui] INFO RSL Build Date                 : 2012.04.02 
    2012-05-04 13:37:44.274 [MpCui] INFO Application & RSL Versions are COMPATIBLE
    

9.30.3.5 新しいEnterprise Manager OMSでの以前のSWCファイルの使用

古いバージョンのEDK (バージョン12.1.0.1.0など)に対してMPCUI SWFをビルドしているが、新しいバージョン(12.1.0.2.0など)の一部である既存のOMSに対して実行する場合、プラグインの一部として、Enterprise Managerに更新されたSWFをデプロイする必要があります。

これを行うには、Adobe Flash Builderを使用できますが、Adobe Flash Builderのプロジェクトには古いバージョンのmpcui.swfファイルが含まれ、それを使用しているため、OMSからの新しいバージョンではなく、Adobe Flash Builder内のローカル・コピーが使用されます。これにより、予期しない結果となるため、次の手順に従います。

このモードで実行するには、次のようになります。

  1. Enterprise Managerサーバー(12.1.0.2.0など)からmpcui.swfファイルをコピーし、プロジェクトの下のbin-debugディレクトリにこのファイルを追加します。


    注意:

    プロジェクトが、以前のMPCUI swcファイルに基づいて、更新されたコピーでこのファイルの再ビルドおよび置換えをしないように、自動ビルドが無効になっていることを確認します。

  2. このビルド手順によって、コンパイルしているMPCUI swcファイルに関連付けられたファイルでmpcui.swfファイルを置き換えると、プロジェクトを更新および再ビルドするたびに、Adobe Flash Builderのmpcui.swfファイルが置き換えられます。

9.30.3.6 MPCUI RSLキャッシュについて

MPCUI RSLを使用する利点は、このライブラリに含まれるコードをAdobe Flash Playerのブラウザでキャッシュできることです。そのため、MPCUI SWFファイルが含まれるEnterprise Managerのページにアクセスするたびに、コードを再ロードしないでください。

ただし、Enterprise Managerのサイトをアップグレードすると、以前のバージョンからページにアクセスしたユーザーは、ブラウザでキャッシュされた古いバージョンのMPCUI RSLをまだ持っています。このリリースでは、サーバーに対してこれを検証する追加チェックがあり、MPCUI RSLでバージョンの不一致によりページをロードできないことを示すエラーがユーザーに表示されます。このエラーが表示された場合、Adobe Flash Playerのキャッシュをクリアしてから続行する必要があります。詳細は、9.30.3.7項「Adobe Flash Playerのキャッシュのクリア」を参照してください。

9.30.3.7 Adobe Flash Playerのキャッシュのクリア

ブラウザのキャッシュをクリアせずに、Adobe Flash Playerのキャッシュをクリアするには、次の手順に従います。

  1. 「Adobe Flash Player Settings Manager」: 「Global Storage Settings」ページにアクセスするために、次のURLをオープンします。

    http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager03.html
    

    次のウィンドウが表示されます。

    図9-29 「Adobe Flash Player Settings Manager」: 「Global Storage Settings」

    図9-29の説明が続きます
    「図9-29 「Adobe Flash Player Settings Manager」: 「Global Storage Settings」」の説明

  2. 「Store common Flash components to reduce download times」を選択解除します。

  3. キャッシュされたRSLをクリアするための確認ウィンドウで、「Confirm」をクリックします。

  4. 「Store common Flash components to reduce download times」を選択します。

    これにより、キャッシュが再度有効化され、以前にキャッシュされたRSLがダウンロードされます。

9.31 ホームページのカスタマイズの移行

Enterprise Managerの拡張フレームワークの以前のバージョンは、次の方法で、Enterprise Managerのデフォルトのホームページをカスタマイズする機能をサポートしていました。

  • ホームページに表示する一連のグラフの設定

  • ホームページに表示する一連の関連リンクの定義

Enterprise Managerリリース11.2では、ターゲットのUIの基準としてこれらのカスタマイズの使用を続行するかどうかを選択できました。これにより、ターゲットのカスタムUIの実装が回避されますが、ホームページの制限された制御が維持されます。

empdkユーティリティを使用して、Enterprise Managerからホームページのカスタマイズを読み取り、このメタデータを定義するために必要な11.2のファイルを生成します。empdkユーティリティの詳細は、第18章を参照してください。


注意:

Enterprise Managerの11.2より前のリリースからホームページのカスタマイズを読み取り、11.2のメタデータを生成する機能は、このリリースではサポートされていません。

9.32 アクセシビリティ・ガイドライン

MPCUIフレームワークは、OracleグローバルHTMLアクセシビリティ・ガイドライン(OGHAG)を使用してコンパイルするユーザー・インタフェースをサポートするように設計されます。この項では、UI実装のためのアクセシビリティ標準の情報について説明します。

また、Adobeでは、アクセシビリティ標準を満たすための(MPCUIのベースとなる)Flexアプリケーションの実装に役立つガイドラインおよび情報が提供されます。詳細は、次のWebサイトを参照してください。

9.32.1 Enterprise Managerでのアクセシビリティ・オプション

Enterprise Managerでは、スクリーン・リーダー・オプションなど、アクセシビリティのためのオプションを設定する機能がエンドユーザーに提供されています。MPCUIフレームワークは、これらの設定を認識し、Flexコード内で使用可能にします(APIリファレンスのoracle.sysman.emx.util.AdaSettingsを参照)。

エンドユーザーがアクセス可能なユーザー・インタフェースを必要とするアカウントを設定すると、MPCUIはアクセス可能なコンポーネントを自動的にレンダリングするため、通常、これらの設定をチェックする必要はありません。特に、これは、グラフを同じデータのアクセス可能なビューに置き換えます。

9.32.2 クリティカルな問題のサマリー

アクセス可能なMPCUI Flexアプリケーションを構築する際には、次の項目を考慮してください。

  • アクセシビリティの有効化

    コンパイラ設定にアクセス可能なフラグを追加します。

    詳細は、Adobeベスト・プラクティスおよびdemo_hostsampleのプラグインの例での設定を参照してください。

  • MPCUIのページ、ダイアログおよびコンポーネントの使用

    これらのコンポーネントには、アクセシビリティ・サポートがあります。

    詳細は、9.32.3項「MPCUIコンポーネントの使用」を参照してください。

  • コンポーネントのタブ順序の設定

    すべてのコンポーネントの読取りおよびタブの順序を設定します。

    詳細は、9.32.4項「読取りおよびタブ移動の順序の制御」を参照してください。

  • 名前および説明の設定

    追加のテキスト説明が必要なコンポーネント(イメージなど)に対して。

    詳細は、Adobeベスト・プラクティスを参照してください。

  • ドラッグ・アンド・ドロップ、オーディオおよび装飾的なコンテンツに相当する、アクセス可能なものの使用および提供の回避。

    詳細は、Adobeベスト・プラクティスを参照してください。

  • 色を使用した情報の伝達の回避

    詳細は、Adobeベスト・プラクティスを参照してください。

  • Flexアプリケーションにメニューを追加しません。

    Enterprise Managerの「ターゲット」メニューを使用します。

    詳細は、このガイドを参照してください。

  • アクセス不能なFlexコンポーネントの使用の回避

    アクセス可能なコンポーネントのリストは、Adobeベスト・プラクティスを参照してください。

9.32.3 MPCUIコンポーネントの使用

MPCUIフレームワークでは、ベースのFlexコンポーネントを超えたアクセシビリティ・サポートを含むコンポーネントが提供されるため、MPCUIバージョンのコンポーネントを使用します。表9-2にリストされた特定のコンポーネントに加えて、アプリケーションには、ページ、ダイアログ、トレインなどの、MPCUIのみの最上位のアクティビティが含まれています。MpApplicationベース・クラスに基づいて、アプリケーションを実装します。表9-2に、MPCUIフレームワークに含まれる重要なコンポーネントのリストを示します。

表9-2 重要なMPCUIコンポーネント

Flexコンポーネント MPCUI代替

mx.controls.Panel

oracle.sysman.emx.components.Region

mx.controls.Label

oracle.sysman.emx.components.AccLabel

mx.controls.AdvancedDataGrid

oracle.sysman.emx.table.Table

mx.charts.PieChart

oracle.sysman.emx.charts.PieChart

mx.charts.BarChart

oracle.sysman.emx.charts.BarChart

mx.charts.ColumnChart

oracle.sysman.emx.charts.ColumnChart

mx.charts.AreaChart

oracle.sysman.emx.charts.AreaChart

mx.charts.LineChart

oracle.sysman.emx.charts.LineChart


9.32.4 読取りおよびタブ移動の順序の制御

Flexではアプリケーションに含まれるコンポーネントの読取りおよびタブ移動の順序を決定するためのサポートが提供されていますが、複数のリージョンやページを含む複雑なレイアウトの場合、うまく機能しません。意味をなすタブ順序がアプリケーションに提供されていることを確実にするために、各ページまたはダイアログ内で順序を設定します。

MPCUIフレームワークでは、タブ順序を設定する方法が提供されます。各プロパティのtabIndexを設定するかわりに、この方法を使用します。ページに含まれるコンポーネントのtabIndexを設定するのではなく、ページまたはダイアログのtabOrderを使用します。

tabOrderプロパティを使用するには、ページに含まれるすべてのコンポーネントに一意のIDを割り当てる必要があります。すべてのFlexおよびMPCUIコンポーネントは、idプロパティをサポートしています。例9-51に、tabOrderプロパティを含むページの宣言を示します。

例9-51 tabOrderプロパティを含むページの宣言

<mp:Page label="Home Page" 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:mp="http://www.oracle.com/mpcui"    
    tabOrder="{[ summaryRegion, statusRegion, currentStatus, statusSince, availability, 
            configurationRegion, cpuModel, cpuPer, currentLoad, osVersion, relatedHost, 
            installedSoftware, jobSummary, 
            reportsRegion, allReports, hostPerfReport, 
            currentLoadRegion, cpuLoadRegion, cpuload, showCpuHistory,
            processSummaryRegion, numUsers, numProcesses,
            resourcesRegion, cpuUtilRegion, cpuutil, 
            processorRegion, processorChart, showProcessorHistory,
            memoryRegion, selMemChart, memChart,
            eventsRegion
            ]}"  
    defaultComponent="{currentStatus}"
    >

    <!-- First Column, 25% width of page, two regions stacked vertically -->
    <mx:HBox width="100%" height="100%">
        <mx:VBox width="25%" height="100%" > 
            <mp:Region id="summaryRegion" title="Summary" height="50%" width="100%" >
                <mp:InnerRegion id="statusRegion" title="Status" height="40%" width="100%" >
                    <mp:InfoDisplay width="100%" height="100%">
                        <!-- reference to the AvailDataService -->
                        <mp:InfoItem id="currentStatus" label="Current Status" value="{ads.currentStatus}" image="{ads.currentStatusIcon}" 
                            click="invokeActivity(Constants.PAGE_AVAILABILITY, bean(Constants.P_TARGET_NAME, appModel.target.name, 
                            Constants.P_TARGET_TYPE, appModel.target.type));" /> 
                        <mp:InfoItem id="statusSince" source="{ads.statusSinceItem}"  />                                    
                        <mp:InfoItem id="availability" label="Availability %" value="{NumberFormat.formatNumber(ads.availPercent,1)}%" destination="availDialog" />                                     
                    </mp:InfoDisplay>
                </mp:InnerRegion>

tabOrderプロパティは、タブ移動または読取りの順序で含める必要があるページに含まれるコンポーネントIDの配列です。

詳細は、demo_hostsampleサンプル・アプリケーションおよびAPIリファレンス・ドキュメントを参照してください。


注意:

スクリーン・リーダーに表示するコンポーネントのtabOrderプロパティの設定に加えて、defaultComponentプロパティも設定します。これにより、ページを最初にレンダリングする際に、特定のコンポーネントにフォーカスを設定するよう、スクリーン・リーダーに指示します。

9.33 ローカリゼーション・サポート

ローカライズされたテキスト・リソースのサポートを提供するには、カスタムUIで文字列を使用する必要があります。次の設定を行う必要があります。

9.33.1 バンドルの登録

MPCUI (Flexコード)でリソース・プロパティ・ファイルを使用するには、リソース・バンドルを統合クラスに登録する必要があります。demo_hostsampleプラグインを使用すると、統合クラスはHostSampleInteg.mxmlです。これは統合を拡張するクラスです。そのクラス内で、アクティビティ・リストの前に、次のようなブロックを含めます。

<mp:resourceBundles>
<mp:MpBundle name="demoUiMsg" path="oracle.samples.xohs.rsc" isDefault="true" />
<mp:MpBundle name="demoJobMsg" path="oracle.samples.xohs.rsc" /> 
</mp:resourceBundles>

ここで示すように、リソースを複数のバンドルに分割し、1つのバンドルをデフォルト・バンドルとしてマークします。これにより、UIコードの残りの部分全体でこのバンドルの文字列へのアクセスが容易になります。パス属性はプロパティ・ファイルがProperties JARファイルに追加されたパスと一致する必要があります。Properties JARファイルの詳細は、第3.7.4項「リソース・バンドルのパッケージ化」を参照してください。

9.33.2 MXMLからの文字列の参照(ページ、ダイアログ、定義)

MXMLでページまたはダイアログ・クラス内の文字列を参照するには、getStringおよびgetBundleStringメソッドを指定する必要があります。getStringメソッドはデフォルトのリソース・バンドルから文字列を取得し、getBundleStringメソッドは統合クラスに登録された任意のバンドルから文字列を取得します。

getStringメソッドは、次のように使用されます。

<mp:InnerRegion id="configurationRegion" title="{getString('CONFIGURATION')}" height="60%" width="100%" > 

このメソッドはデフォルトのリソース・バンドル(demoUiMsg)内でキーCONFIGURATIONを持つ文字列を検索し、この内部リージョンのタイトルとして使用します。文字列が見つからない場合、キー(CONFIGURATION)が表示されます。

getBundleStringメソッドは、次のように使用されます。

<mp:InfoItem id="currentLoad" label="{getBundleString('demoJobMsg', 'JOBLOAD')}"  value="{respData.result.getString('','Load')}" /> 

getBundleStringへの最初のパラメータは、文字列を取得するバンドルを指定します。

9.33.3 ActionScript(コントローラ・コード)からの文字列へのアクセス

ActionScriptコードから文字列にアクセスするには、Util.getStringメソッドまたはUtil.getBundleStringメソッドのいずれかを使用します。

var str:String = Util.getString("CONFIGURATION"); // retrieves string from default bundle 
var str2:String = Util.getBundleString("demoJobMsg", "JOBLOAD"); // retrieves string from named bundle

9.34 オンライン・ヘルプの表示

カスタマイズされたUIページのオンライン・ヘルプを含める場合、次のディレクトリにあるヘルプJARファイルをパッケージ化します。

plugin_stage/oms/online_help

ヘルプJARファイルの例は、EDKのdemo_hostsampleの例の/oms/online helpディレクトリにあるplugin_sample_help.jarを参照してください。