ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebCenter Portal開発者ガイド
11g リリース1 (11.1.1.7.0)
B72084-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

D コンポーザ対応のページで使用するタスク・フローの作成のガイドライン

タスク・フローは、Oracle ADFの再利用可能な構成要素です。タスク・フローは、Oracle WebCenter Portalで標準提供されるほか、独自のタスク・フローを作成してFrameworkアプリケーション・ページに追加することもできます。カスタマイズ可能なページ(コンポーザ対応のページ)にタスク・フローを追加した場合、実行時にそれらのタスク・フローをパーソナライズ、カスタマイズおよび編集できます。タスク・フローを設計する際は、Oracle WebCenter Portalの出版物で説明されているルールに従う必要があります。それを怠った場合、タスク・フローをポータル・ページで使用する際に、過剰な余白、過剰なスクロール・バー、または大きいサイズのデータ・セットを表示するときの遅い応答、不安定な応答および予期できない応答などの問題が発生する可能性があります。

これらの問題の発生を防ぎ、ルック・アンド・フィール、レイアウト設計および対話に関する一貫したユーザー・エクスペリエンスを提供するために、このドキュメントで説明する手順に従い、次を実現します。

この付録の内容は、次のとおりです。

D.1 有効なジオメトリ管理とページ区切りのガイドライン

有効なジオメトリ管理を実施すると、ページでのタスク・フローのサイズ設定と配置を効率良く実行できます。タスク・フローが適切に設計されていない場合、応答時間が遅いページまたはコンポーネント間に不要なスクロール・バーや空白が大量に表示されるページが生成されます。たとえば、データをストレッチするコンテナ(Show Detail Frameコンポーネントなど)をタスク・フローで使用していて、そのコンテナの内部に非常に少量のデータしか存在しない場合、タスク・フローではデータの下に大量の空白が表示されます。設計が不適切な場合、大量のデータが表に表示されるタスク・フローで、スクロールが遅くなったり、予期しない動作を示したりする可能性もあります。これらの問題を避けるために、大量のデータ・セットを表示する際は必ず、従来のページ区切りモデルを使用するフロー・タスク・フローを設計してください。

Frameworkアプリケーションの新しいタスク・フローを設計する際は、この項のガイドラインに従ってください。また、Frameworkアプリケーションの既存のタスク・フローを編集する際も、必ずこの項のガイドラインに従ってください。

D.1.1 ガイドライン1: フロー・タスク・フローの作成

タスク·フローで不要な空白を回避するためには、タスク·フロー·コンテンツがフローし、タスク·フロー·コンテナによってストレッチされていないことを確認する必要があります。ストレッチ・タスク・フローは、コンテナの高さにストレッチされたもので、フロー・タスク・フローは、ストレッチ・コンテナやタスク・フロー自身の固定された高さではなく、そのコンテンツによって決定されます。データ量の少ないフロー・タスク·フローは、図D-1に示されているように、データ量の多いフロー・タスク・フローよりも短くなります。

図D-1 ストレッチ・タスク・フローとフロー・タスク・フローの違い

図D-1の説明が続きます
「図D-1 ストレッチ・タスク・フローとフロー・タスク・フローの違い」の説明

フロー・タスク・フローを設計するには、次のことを保証する必要があります。

  • タスク・フローの子コンポーネントの高さが固定されていない。

  • タスク・フロー・リージョンを囲むShow Detail Frameコンポーネントの高さが(そのcontentStyle属性を使用して)固定されていない。

次の2つの例は、タスク・フロー内でフロー・コンポーネントを使用する方法を示します。

D.1.1.1 例1: Oracle ADF FacesのTableコンポーネントのautoHeightRows属性が特定の値に設定されている場合

タスク・フロー内にOracle ADF FacesのTableコンポーネントを追加し、TableautoHeightRows属性を特定の値に設定します。この属性を定義することによって、表の高さは、固定またはコンテナに合せてストレッチされる(ストレッチ動作)のではなく、コンテンツに従って調整されます(フロー動作)。autoHeightRows属性を設定することによって、表のデータは次のように表示されます。

  • autoHeightRowsに値Hを設定した場合、表は最大H行まで表示されます。

  • データ・ソースから返されるレコード数がH未満の場合、表の高さはその数に対応したものになります。

  • レコードの数がHを超える場合、表にはH行のみ表示され、表示されていない行を表示するためのスクロールバーが表示されます。

  • autoHeightRows属性が使用されない場合、表は、表示するデータ量に関係なく、デフォルトの固定高さで表示されます。

autoHeightRows属性を固定値に設定するかわりに、指定した論理に基づいて属性が設定されるようにEL値を指定することもできます。タスク・フローのカスタマイズとパーソナライズを可能にし、この属性の値を指定するオプションをユーザーに提供することができます。パーソナライズ・オプションを使用して指定された値は、カスタマイズ・オプションを使用して指定された値をオーバーライドします。

例D-1に、recent-pages-task-flow-definitionという名前のタスク・フロー内のサンプルADF Faces tableコンポーネントの属性を示します。autoHeightRows属性は、recentPagesBeanという名前のJava Beanを参照するEL式に設定されています。このBeanには、この属性をエンド・ユーザーによって(パーソナライズまたはカスタマイズとして)指定された値に設定する論理が含まれています。

例D-1 サンプルADF Faces TableのautoHeightRows属性

<af:table value="#{pageFlowScope.recentPagesBean.pages}" 
          var="row" rowBandingInterval="0" id="t1" 
          rowSelection="none" columnBandingInterval="0" 
          width="100%" inlineStyle="border:none;width:100%;" 
          columnStretching="last" horizontalGridVisible="true" 
          verticalGridVisible="false"
          autoHeightRows="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}"
            contentDelivery="immediate"
           fetchSize="#{pageFlowScope.recentPagesBean.number_of_items_to_query}">
      . 
      .
      .    
</af:table>

autoHeightRowsの値を指定するパーソナライズおよびカスタマイズのオプションを表示するサンプル・タスク・フローの詳細は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。

contentDelivery属性をimmediateに設定するなどの要件も含めたautoHeightRows属性の詳細は、Oracle Fusion Middleware Oracle ADF Facesタグ・リファレンス<af:tableのタグの説明を参照してください。

D.1.1.2 例2: スクロール・レイアウトを使用するPanel Group Layout内のOracle ADF FacesのIteratorコンポーネント

タスク・フローにPanel Group Layoutコンポーネントを追加し、そのlayout属性をscrollに設定します。次に、Panel Group Layout内にIteratorを追加します。コンテンツは、Iterator内に追加します。Iteratorのコンテンツは、Panel Group Layout内に表示されます。

Panel Group Layoutの高さは、Iteratorのコンテンツの量に応じて決まるので、Panel Group LayoutinlineStyle属性でmin-heightmax-heightを使用してコンポーネントの最小高さと最大高さを指定します。

D.1.2 ガイドライン2: タスク・フローに表示されるレコード数の制限

タスク・フローで大量のデータ・セットをスクロールする際に応答が遅くなったり不安定になったりするのを避けるために、データ・ソースから一度にフェッチするレコード数を制限する必要があります。たとえば、タスク・フローでADF faces Tableコンポーネントを使用している場合、表に表示されるレコード数を制限します。TablefetchSize属性を使用して、1回の問合せでデータ・ソースからフェッチするレコード数を指定します。フェッチ・サイズとしてNを指定した場合、データ・ソースからN件のレコードのみがクライアントに送信されます。

fetchSize属性とautoHeightRows属性の組合せにより、表に表示される行数が制御されます。これらの属性には次の関係があります。

  • fetchSizeautoHeightRowsが等しい場合、表にはすべてのレコードが表示されます。

  • fetchSizeautoHeightRowsより小さい場合、表にはfetchSizeの値までしか表示されません。

  • fetchSizeautoHeightRowsより大きい場合、autoHeightRowsの値と同じ数のレコードのみ表示するか、またはページ区切りコントロールを使用して残りのレコードを表示するかを決定できます。たとえば、タスク・フローの一番下に「詳細」リンクを追加するか、「前へ」リンクまたは「次へ」リンクを使用してページ区切りを使用することができます。詳細は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。

図D-2に、autoHeightRowsfetchSizeの値が等しく5の場合と10の場合の2つのタスク・フローの違いを示します。タスク・フローは表示レコード数まで表示されます。

図D-2 フェッチ・サイズの値が異なるタスク・フローの違い

10件のレコードと5件のレコードを表示する2つのタスク・フロー

fetchSize属性を固定値に設定するかわりに、指定した論理に基づいて属性が設定されるようにEL値を指定することもできます。タスク・フローのカスタマイズとパーソナライズを可能にし、この属性の値を指定するオプションをユーザーに提供することができます。パーソナライズ・オプションを使用して指定された値は、カスタマイズ・オプションを使用して指定された値をオーバーライドします。

次の例に、recent-pages-task-flow-definitionという名前のタスク・フロー内のサンプルADF Faces Tableコンポーネントの属性を示します。fetchSize属性は、recentPagesBeanという名前のJava Beanを参照するEL式に設定されています。このBeanには、この属性をエンド・ユーザーによって指定されたカスタマイズ値に設定する論理が含まれています。

<af:table value="#{pageFlowScope.recentPagesBean.pages}" 
          var="row" rowBandingInterval="0" id="t1" 
          rowSelection="none" columnBandingInterval="0" 
          width="100%" inlineStyle="border:none;width:100%;" 
          columnStretching="last" horizontalGridVisible="true" 
          verticalGridVisible="false"
           autoHeightRows="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}"
          contentDelivery="immediate"
           fetchSize="#{pageFlowScope.recentPagesBean.number_of_items_to_query}">
      . 
      .
      .    
</af:table>

fetchSizeの値を指定するカスタマイズのオプションを表示するサンプル・タスク・フローの詳細は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。

fetchSize属性の詳細は、Oracle Fusion Middleware Oracle ADF Facesタグ・リファレンス<af:tableのタグの説明を参照してください。

D.1.3 ガイドライン3: タスク・フローの最小高さの指定

第D.1.1項「ガイドライン1: フロー・タスク・フローの作成」で説明する1番目のガイドラインに従うことによって、タスク・フローがコンテンツの高さに制限されることを保証できます。

タスク・フローが、レコードが0件のときに完全に閉じたり、レコードが1-2件しかなくて短くなりすぎたりしないように、コンテンツの最小高さを指定します。

たとえば、タスク・フローの表のautoHeightRowsの値が指定されている場合、表のinlineStyle属性を使用してmin-height値を指定できます。

図D-3に、2行しかなくても適切な高さで表示されるタスク・フローを示します。

図D-3 最小高さが指定されているタスク・フロー

最小高さが指定されているタスク・フロー

D.1.4 ガイドライン4: 表示制限を超えるデータにアクセスするためのUIの追加

タスク・フローで10件のレコードを表示していて、データ・ソースに100件のレコードが存在する場合、タスク・フロー内のデータの特徴に応じて次のいずれかを実行するようにタスク・フローを設計できます。

  • 10件のレコードのみ表示

    たとえば、人気のあるディスカッション・トピック・タスク・フローでは、人気のあるトピックの上位10件が表示されれば十分であり、それ以外はたとえ11番目に人気のあるトピックでもユーザーに見せる必要はないと判断する場合は、このオプションを使用できます。

  • もっと多くのレコードを表示する機能を持つビューを開く「詳細」リンクをタスク・フローの最下行に表示

    たとえば、「スペース」ページのピープル・コネクション・タスク・フローには、最下行に「詳細」リンクが表示されます。

  • 「前へ」リンクと「次へ」リンクのページ区切りコントロールの表示

    たとえば、監視されたディスカッション・トピック・タスク・フローでは、ユーザーは通常監視しているすべてのトピックを参照するので、ページ区切りコントロールを表示できます。ページ区切りは、タスク・フローのデータが本質的に重要度でランク付けされるものでも様々な方法でソートできるものでもなく、データ・セットの任意のレコードにアクセスできることが重要視される場合に、一般的な選択肢です。ページ区切りコントロールは、コンテンツの性質に応じてコンテンツの上部または下部に配置できます。

図D-4は、fetchSizeが5の表を持つ「監視トピック」タスク・フローおよび「人気のトピック」タスク・フローを示しています。両方ともデータ・ソースに5件以上のレコードがあります。「監視トピック」タスク·フローは、下部にページ区切りのある5件のレコードを表示しますが、「人気のトピック」タスク·フローは、他のレコードを表示するUIオプションがない5件のみのレコードを表示します。

図D-4 ページ区切りコントロールが表示されるタスク・フローと表示されないタスク・フロー

5件を超えるレコードがあるタスク・フロー

ページ区切りの詳細

ページ区切りコントロールを作成する場合、次のようにすることをお薦めします。

  • ページ区切りメッセージは1 to N of M [prev][next]という形式で追加します。

  • ページ間をナビゲートする際に「前へ」リンクと「次へ」リンクが移動しないように、ページ区切り要素の位置を右揃えにします。

  • 「前へ」オプションまたは「次へ」オプションは、必要ない場合は必ずグレー表示されるようにします。

ページ区切りコントロールの使用例は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。

次のパラメータを使用して、ページ区切りコントロールをカスタマイズできます。

  • 「前へ」リンクと「次へ」リンクの位置

  • 「前へ」リンクと「次へ」リンクのラベル(NewerとOlderなど)

  • 「前へ」リンクと「次へ」リンクで使用するアイコン

  • 「全ページ中の何ページから何ページまで」を表すために使用する単語または記号(1-5 of 100など)

  • ランダム・アクセスを許可するオプション(Prev 1 2 3 ... Next Lastなど)

D.2 タスク・フロー・パラメータおよびカスタマイズとパーソナライズのオプションを有効利用するためのガイドライン

タスク・フローを作成する際、パラメータを作成して、タスク・フローをカスタマイズおよびパーソナライズできるオプションをユーザーに提供できます。特権ユーザーがコンポーザですべてのユーザーのタスク・フローをカスタマイズし(カスタマイズ)、タスク・フローのプロパティとパラメータを編集できるようにすることが可能です。すべてのユーザーがページを表示し、ページの表示をカスタマイズ(パーソナライズ)できるようにすることが可能です。この項では、タスク・フロー・パラメータおよびカスタマイズとパーソナライズのオプションを実装するためのガイドラインについて説明します。

表D-1に、ユーザーが使用できる様々なタスク・フロー編集オプションの概要を示します。

表D-1 タスク・フローの外観と動作を定義するために使用するオプション

オプション 説明 使用する状況 表示できるユーザー

パラメータ

タスク・フローのプログラミングまたはそのコンテキストの設定に使用する観念的な少量のスカラー値。各パラメータにはわかりやすい表示名と説明(指定できる値と例が含まれる必要があります)を指定する必要があります。

タスク・フローの複数のインスタンスを追加できるように、市区町村コードまたはPINコードなどのコンテキストに使用します。各インスタンスは、異なる情報を表示するか、またはページからプログラムまたはURLを通じて受け取った値に応じて情報を表示するようにプログラミングされます。

Spacesでは、スペース名などのコンテキストのパラメータを使用できます。

優先順位: 3

この値はタスク・フローの組込み値よりも優先されます。

パワー・ユーザー(または編集権限またはカスタマイズ権限を持つユーザー)は、ページの編集中に、コンポーザの「コンポーネント・プロパティ」ダイアログでパラメータを表示できます。

Spacesでは、モデレータは、タスク・フロー・パラメータを表示および編集できます。

WebCenter Portalサービス・タスク・フローがOracle Portalでポートレットとして公開されている場合、ページ設計者はポートレットを設定する際にこれらのパラメータを表示できます。

カスタマイズ/プリファレンス

これら2つは同義です。カスタマイズは、通常、ビジネス·ユーザーがタスク·フローに加えた変更とみなされます。これらの変更は、ページのすべてのビューアに利用可能であり、タスク·フローで定義されたオプションの値の指定に使用されます。たとえば、ユーザーはドキュメントの作成者名や改定日を表示するかどうかを決めることができます。

プリファレンスは、タスクのコンテンツの定義と呼ばれます。たとえば、「ドキュメント・ビューア」タスク・フローの問合せ定義やOmniPortletの問合せがあります。

これらを使用するのは、ユーザーがタスク・フローの動作を定義できるようにするためのユーザー・インタフェースをタスク・フローに用意する必要がある場合です。すなわち、値リストまたはイメージやラジオ・ボタンなどの特定のUIコンポーネントを使用するとユーザーが作業しやすい場合や、複数ステップのウィザード・スタイルのインタフェースでタスク・フローを設定する場合です。

パラメータは単なるスカラー値であり、説明以外に何もないので、パラメータを使用する場合はそのような作業しやすくするためのサポートは得られません。

優先順位: 2

同一パラメータ値(スペース名など)が存在する場合、その値よりもカスタマイズが優先されます。

コンポーザでページを編集するビジネス・ユーザー(または編集権限またはカスタマイズ権限を持つユーザー)は、カスタマイズまたはプリファレンスのオプションを表示できます。

通常は、カスタマイズまたはプリファレンスのオプションは、編集モードでタスク・フローの周りに表示されるクロムで使用できます。ただし、編集権限またはカスタマイズ権限を持つユーザーは、ページ表示モードでもクロムにこれらのオプションが表示されます。

WebCenter Portalタスク・フローがOracle Portalでポートレットとして公開されている場合、ページ設計者はポートレットを設定する際にこれらを「デフォルトの編集」のオプションとして表示できます。

パーソナライズ

カスタマイズとプリファレンスのオプションのサブセット。カスタマイズ・オプションではないパーソナライズ・オプションを使用することはできません。

これらを使用して、ページを表示するすべてのユーザーがタスク・フローの視覚的要素やタスク・フローに表示するデータ量を調節することを許可します。たとえば、表示するアイテム数を設定できます。

優先順位: 1

同一カスタマイズ値(アイテム数など)が存在する場合、その値よりもパーソナライズが優先されます。

表示権限を持つすべてのユーザーがこれらのオプションを表示できます。

パーソナライズ・オプションは、タスク・フローの周りのクロムで使用できます。WebCenter Portalタスク・フローがOracle Portalでポートレットとして公開されている場合、エンド・ユーザーはパーソナライズ・オプションを使用して、同じ視覚的要素を調整できます。

暗黙的パーソナライズ

セッション間でエンド・ユーザーに対して保持されるオプション。暗黙的パーソナライズ・オプションは、タスク・フローの周りのクロムには表示されませんが、タスク・フローの本体に対して直接実行できるアクションです。たとえば、ソートや列のサイズ変更は、暗黙的パーソナライズ・オプションです。

これらのオプションは、頻繁に変更するオプションにのみ、慎重に使用してください。列のサイズ変更やソートなどのオプションは、Oracle ADFから無償で使用できます。

ページに対する表示権限を持つすべてのエンド・ユーザーがパーソナライズを実行できます。


アプリケーションのパフォーマンスを高めるには、タスク・フローでパラメータおよびカスタマイズとパーソナライズのオプションを実装する際に、この項のガイドラインに従ってください。

D.2.1 タスク・フロー・パラメータを実装するためのガイドライン

(JDeveloperでの)デザインタイム中は、タスク・フロー定義XMLファイルでパラメータを定義することによって、パラメータを作成できます。実行時は、編集権限またはカスタマイズ権限を持つユーザーが、コンポーザの「コンポーネント・プロパティ」ダイアログでタスク・フロー・パラメータを編集できます。適切なユーザー・エクスペリエンスを提供するには、パラメータを作成する際に次のガイドラインに準拠する必要があります。

  • わかりやすい表示名を指定します。

  • パラメータごとに説明、例および指定できる値を提供します。

次の例に、タスク・フロー定義ファイルでlayoutStyleという名前のパラメータを定義するコードを示します。

<input-parameter-definition>
  <name>layoutStyle</name>
  <description> Used to control whether the documents must display as a list, with icons, or with document details.  
Allowed values are list, icon, and detail.</description>
  <display-name>Layout Style</display-name>
</input-parameter-definition>

D.2.2 カスタマイズを実装するためのガイドライン

編集権限またはカスタマイズ権限を持つユーザーは、タスク・フローの周りのクロムでカスタマイズ・オプションにアクセスできます。

タスク・フローにカスタマイズを実装する際、次のガイドラインに準拠する必要があります。

  • カスタマイズ・オプションはタスク・フローのパラメータのサブセットである必要があります。

  • タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューを別のダイアログで開きます。たとえば、ダイアログでadvancedEditPopupViewという名前のビューを起動する制御フロー・ルールは次のようになります。

    <control-flow-case>
      <from-outcome>dialog:advancedEditPopup</from-outcome>
      <to-activity-id>advancedEditPopupView</to-activity-id>
    </control-flow-case>
    

    新しいタスク・フローでは、このガイドラインに従う必要があります。

  • タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューのインラインに移行します。たとえば、同じ画面内でadvancedEditViewという名前のビューを起動する制御フロー・ルールは次のようになります。

    <control-flow-case>
      <from-outcome>advancedEdit</from-outcome>
      <to-activity-id>advancedEditView</to-activity-id>
    </control-flow-case>
    

    この方法でもタスク・フローを実装できますが、結果を公開してダイアログでビューを開くことをお薦めします。

  • アプリケーションによって設定されているMDSレベルにカスタマイズが保存されることを確認します。タスク・フロー・パラメータはタスク・フロー定義自体に格納されますが、カスタマイズはそれとは異なり、メタデータ記憶域(MDS)に保存されます。タスク・フローのカスタマイズを保存するMDSレイヤーを明示的に指定しない場合、カスタマイズ・メタデータとそれを使用するアプリケーション・メタデータが異なるレイヤーに格納される可能性があります。

    カスタマイズがアプリケーション・メタデータと同じレイヤーに保存されることを保証するには、タスク・フローのプリファレンス・ファイルにアプリケーションのMDSセッションのクローンを作成し、カスタマイズを構成する際はそれを参照するようにする必要があります。この実装例は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。

D.2.3 パーソナライズを実装するためのガイドライン

ページを表示するすべてのユーザーは、ページ表示モードでタスク・フローの周りのクロムでパーソナライズ・オプションにアクセスできます。

タスク・フローにパーソナライズを実装する際、次のガイドラインに準拠する必要があります。

  • パーソナライズ・オプションが、タスク・フローに定義されているカスタマイズ・オプションのサブセットであることを保証します。

  • タスク・フローの重要な一面がドキュメント、ユーザー、リクエストなどのオブジェクトを表示することである場合、ユーザーが表示するオブジェクトの最大数を設定するためのパーソナライズ・オプションを追加する必要があります。

  • タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューを別のダイアログで開きます。たとえば、ダイアログでsimpleEditPopupViewという名前のビューを起動する制御フロー・ルールは次のようになります。

    <control-flow-case>
      <from-outcome>dialog:simpleEditPopup</from-outcome>
      <to-activity-id>simpleEditPopupView</to-activity-id>
    </control-flow-case>
    

    新しいタスク・フローでは、このガイドラインに従う必要があります。

  • タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューのインラインに移行します。たとえば、同じ画面内でsimpleEditViewという名前のビューを起動する制御フロー・ルールは次のようになります。

    <control-flow-case>
      <from-outcome>simpleEdit</from-outcome>
      <to-activity-id>simpleEditView</to-activity-id>
    </control-flow-case>
    

    この方法でもタスク・フローを実装できますが、このビューをダイアログとして開くように移行することをお薦めします。

  • アプリケーションによって設定されているMDSレベルにパーソナライズが保存されることを確認します。タスク・フロー・パラメータはタスク・フロー定義自体に格納されますが、パーソナライズはそれとは異なり、MDSに保存されます。パーソナライズを保存するMDSレイヤーを明示的に指定しない場合、パーソナライズ・メタデータとアプリケーション・メタデータが異なるレイヤーに格納される可能性があります。

    パーソナライズがアプリケーション・メタデータと同じレイヤーに保存されることを保証するには、タスク・フローのプリファレンス・ファイルにアプリケーションのMDSセッションのクローンを作成し、パーソナライズを構成する際はそれを参照するようにする必要があります。この実装例は、「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。

D.2.4 暗黙的パーソナライズを実装するためのガイドライン

ユーザーはタスク・フロー自体を使用する際、表の列のサイズ変更、ソートなどを通じて、暗黙的パーソナライズを実行します。この場合、パーソナライズ・オプションはダイアログからは起動されないので、ユーザーが実際はページをパーソナライズしていることに気付かない場合もあります。

暗黙的パーソナライズを実装する際、次のガイドラインに準拠してください。

  • タスク・フローを暗黙的パーソナライズ属性でオーバーロードさせないでください。重要で頻繁に使用するいくつかの属性を選択して暗黙的として公開します。使用頻度の少ない属性や複雑な属性は、明示的パーソナライズで処理できます。

  • ダイアログが起動されるような暗黙的パーソナライズは実装しないでください。暗黙的パーソナライズは、タスク・フロー自体の本体で実行される必要があります。

D.3 ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例

このドキュメントのガイドとして、Oracle WebCenter Portal: Frameworkを使用するサンプル・アプリケーションが開発されています。RecentPagesという名前のこのサンプル・アプリケーションは、このドキュメントのガイドラインに準拠してほぼ完璧なタスク・フローを作成できることを示す例として使用します。RecentPagesアプリケーションに含まれるカスタマイズ可能なページWelcome.jspxには、必要なすべてのガイドラインに従って作成されたrecent-pages-taskflow-definitionという名前のタスク・フローが含まれています。

この項では、タスク・フローの実装方法の概要のみ説明します。タスク・フローとコンポーザの使用に関する詳細は、次の各ガイドを参照してください。

RecentPagesサンプル・アプリケーションは、次に示すOTNのOracle WebCenter Portal 11gのデモとサンプルのページからダウンロードできます。

http://webcenter.oracle.com

RecentPagesアプリケーションには、次のプロジェクトが含まれます。

D.3.1 RecentPagesTaskFlowプロジェクト

このプロジェクトには、ガイドラインに従って作成されたタスク・フローが含まれます。このプロジェクトの重要なファイルは、次のとおりです。

  • recent-pages-task-flow-definition.xmlファイル

  • mainView.jsffフラグメント

  • simpleEditPopupView.jspxページ

  • advancedEditPopupView.jspxページ

  • recentPagesBean Java Bean

  • Preference Java Bean

D.3.1.1 recent-pages-task-flow-definition.xmlファイル

これは、mainViewsimpleEditPopupViewおよびadvancedEditPopupViewの3つのビューを含むOracle ADFタスク・フロー定義です。このタスク・フローは、mainViewにアプリケーションで最近作成されたページのリストが表示され、simpleEditPopupViewにすべてのユーザー向けにパーソナライズ・オプションが表示され、advancedEditPopupViewに編集権限またはカスタマイズ権限を持つユーザー向けにカスタマイズ・オプションが表示されるように設計されています。

次の表では、recent-pages-task-flow-definition.xmlのコードを分割して、スニペットごとに説明します。

mainViewからsimpleEditPopupViewadvancedEditPopupViewに渡される結果はそれぞれ、dialog:simpleEditPopupviewdialog:advancedEditPopupViewと呼ばれます。これは、これらのビューがインラインではなく別のダイアログに表示されることを保証するためです。さらに、このタスク・フローは、mainViewで、「リフレッシュ」で最新の結果を表示したり、「前へ」および「次へ」で該当する結果を表示したりできます。simpleEditPopupViewビューとadvancedEditPopupViewビューでは、「保存」で結果を保存したり、「取消」で結果の表示を取り消したりできます。

次の表では、recent-pages-task-flow-definition.xmlファイルのコードの重要なセクションについて説明します。

表D-2 タスク・フロー定義ファイルのコードの様々なセクション

コード 説明
<default-activity>mainView</default-activity>

タスク・フローのデフォルト・ビューとしてmainViewを定義します。

<managed-bean>
  <managed-bean-name>recentPagesBean</managed-bean-name>
  <managed-bean-class>view.RecentPangesBean</managed-bean-class>
  <managed-bean-scope>pageFlow</managed-bean-scope>
</managed-bean>

タスク・フロー定義に関連付けられているrecentPagesBean Java Beanを参照します。このBeanは、viewパッケージの一部として作成されています。

<view id="mainView">
  <page>/mainView.jsff</page>
</view>  
  <view id="simpleEditPopupView">  
  <page>/simpleEditPopupView.jspx</page>
</view>
  <view id="advancedEditPopupView">  
  <page>/advancedEditPopupView.jspx</page>
</view>

タスク・フローの各ビューをページまたはページ・フラグメントにマップします。たとえば、mainViewmainView.jsffに関連付けられます。

<control-flow-rule>
   <from-activity-id>mainView</from-activity-id>
   <control-flow-case>
       <from-outcome>refresh</from-outcome>
       <to-activity-id>mainView</to-activity-id>
   </control-flow-case>
   <control-flow-case>
       <from-outcome>dialog:simpleEditPoup</from-outcome> 
       <to-activity-id>simpleEditPopupView</to-activity-id>  
   </control-flow-case>  
   <control-flow-case>    
       <from-outcome>next</from-outcome>  
        <to-activity-id>mainView</to-activity-id>  
   </control-flow-case>
   <control-flow-case>    
        <from-outcome>previous</from-outcome>   
        <to-activity-id>mainView</to-activity-id>  
   </control-flow-case> 
   <control-flow-case>    
         <from-outcome>dialog:advancedEditPopup</from-outcome> 
         <to-activity-id>advancedEditPopupView</to-activity-id>  
   </control-flow-case>
</control-flow-rule>

mainViewの制御フロー・ルールです。各制御フローでは、結果および対応するターゲット・ビューを定義します。

<control-flow-rule>
  <from-activity-id>simpleEditPopupView</from-activity-id>
   <control-flow-case>
        <from-outcome>save</from-outcome>
        <to-activity-id>mainView</to-activity-id>
   </control-flow-case>  
   <control-flow-case>  
         <from-outcome>cancel</from-outcome>
         <to-activity-id>mainView</to-activity-id>  
   </control-flow-case>
</control-flow-rule>

simpleEditPopupViewの制御フロー・ルールです。各制御フローでは、結果および対応するターゲット・ビューを定義します。

<control-flow-rule> 
 <from-activity-id>advancedEditPopupView</from-activity-id>  
 <control-flow-case>  
   <from-outcome>save</from-outcome>    
   <to-activity-id>mainView</to-activity-id> 
 </control-flow-case>
 <control-flow-case>   
    <from-outcome>cancel</from-outcome> 
    <to-activity-id>mainView</to-activity-id>  
 </control-flow-case>
</control-flow-rule>

advancedEditPopupViewの制御フロー・ルールです。各制御フローでは、結果および対応するターゲット・ビューを定義します。


D.3.1.2 mainView.jsffフラグメント

図D-5に、アプリケーションで最近作成されたページのリストを表示します。実行時は、このリストは次のように表示されます。

図D-5 タスク・フローのmainViewフラグメント

タスク・フローのメイン・ビュー

このビュー・フラグメントの設計機能は、次のとおりです。

  • autoHeightRows属性が表に定義され、表に表示されるアイテムの数を制御します。タスク・フローは表示されるアイテムの高さで制限されます。

  • fetchSize属性が定義され、データ・ソースからフェッチして表に表示するアイテムの数を制御します。

  • Items 1-4 of 25という形式でメッセージを表示するページ区切りコントロールが、「前へ」アイコンと「次へ」アイコンとともに追加されています。

表D-3では、mainView.jsffフラグメントのコードの重要なセクションについて説明します。

表D-3 mainViewフラグメント・コード

コード 説明
<af:panelGroupLayout id="pgl1" layout="vertical">
    <af:outputText value="Shows recent pages in the application" id="ot1"/>

単一の最上位レベル・コンポーネント: Panel Group Layout。このコンポーネントは、タスク・フロー・コンテンツが垂直方向にフローし、常に水平方向にストレッチしていることを確認するように設計されています。これは、ジオメトリ管理を可能にします。

<af:table value="#{pageFlowScope.recentPagesBean.pages}" var="row"              
    rowBandingInterval="0" id="t1" rowSelection="none"     
    columnBandingInterval="0" width="100%"              
    inlineStyle="border:none;width:100%;" columnStretching="last"              
    horizontalGridVisible="true" verticalGridVisible="false"
autoHeightRows="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}"
    contentDelivery="immediate"              
fetchSize="#{pageFlowScope.recentPagesBean.number_of_items_to_query}">

Panel Group Layoutの子である表コンポーネント。

次の表の属性があります。

  • autoHeightRows (N): 一度に表に表示するアイテムの数。Java Bean recentPagesBeanが実行時にユーザーによって指定される値をこの属性に移入するように、ここでEL値が指定されます。

    表示するアイテムの数がNより大きい場合、タスク・フローにスクロールバーが表示されます。

  • fetchSize (M): データ・ソースからフェッチするアイテムの最大数。Java Bean recentPagesBeanが実行時にユーザーによって指定される値をこの属性に移入するように、ここでEL値が指定されます。

    MNより大きい場合、タスク・フローにページ区切りコントロールが表示され、ユーザーが残りのアイテムを表示できるようにします。

<af:column sortable="false" headerText="#{null}" align="start" id="c1">  
  <af:panelGroupLayout id="pgl11" styleClass="nowrap"
inlineStyle="padding-top:2px; font-weight:bold;">     
    <af:outputText value="#{row.title}" id="ot4"/> 
    <af:goLink destination="/faces#{row.contentMRef}"
               text=">>" targetFrame="_blank" id="gl1"/>  
   </af:panelGroupLayout>  
   <af:panelGroupLayout id="pgl10" styleClass="AFFieldTextDisabled nowrap"
                        inlineStyle="padding-top:2px">    
    <af:outputText value="Created on " id="ot7"/>    
    <af:outputText value="#{row.createDate}" id="ot8"/>    
    <af:outputText value=" by #{row.createdBy}" id="ot9"/>  
  </af:panelGroupLayout>
</af:column>

表に、アプリケーションのページのリストを各ページの作成日および作成者とともに表示する1つの列があります。

表の列をソートする暗黙的パーソナライズ機能は無効になっています。

<af:panelGroupLayout id="pgl2" halign="end" layout="vertical" 
              inlineStyle="margin:1px"                                 
              rendered="#{pageFlowScope.recentPagesBean.showPageControl}">  
   <af:panelGroupLayout id="pgl3">    
     <af:outputText value="#{pageFlowScope.recentPagesBean.footerText}"  
               id="ot2"/>    
     <af:commandLink id="cl1"
               actionListener="#{pageFlowScope.recentPagesBean.previous}"   
               disabled="#{not pageFlowScope.recentPagesBean.showPrevious}"  
               action="previous">     
     <af:image source="#{pageFlowScope.recentPagesBean.showPrevious ? 
'/adf/webcenter/shuttleleft_ena.png' : '/adf/webcenter/shuttleleft_dis.png'}"              
                     id="i1" shortDesc="previous"/>   
     </af:commandLink>  
     <af:commandLink id="cl2"  
               actionListener="#{pageFlowScope.recentPagesBean.next}"  
               disabled="#{not pageFlowScope.recentPagesBean.showNext}"                   
               action="next">     
     <af:image source="#{pageFlowScope.recentPagesBean.showNext ? 
'/adf/webcenter/shuttleright_ena.png' : '/adf/webcenter/shuttleright_dis.png'}"                
                id="i2" shortDesc="next"/>    
      </af:commandLink>  
    </af:panelGroupLayout>
</af:panelGroupLayout>

表に表示されているレコード以外のレコードを表示するページ区切りコントロール。

recentPagesBeanコードは、実行時に表示される内容を定義します。


D.3.1.3 simpleEditPopupView.jspxページ

図D-6に、タスク・フローで表示するアイテムの数を選択するオプションを表示します。ページを表示するすべてのユーザーが、このオプションを使用してタスク・フローをパーソナライズできます。ユーザーが指定した値は、このページの、そのユーザーが表示しているビューにのみ適用されます。

図D-6 simpleEditPopupViewページ

「簡易編集」ダイアログ

次の表では、simpleEditPopupView.jspxページのコードの重要なセクションについて説明します。

表D-4 パーソナライズ・ページのコード

コード 説明
<af:panelStretchLayout id="psl1">
  <f:facet name="center">
    <af:group id="group1">
      <af:panelFormLayout id="pfl1">
        <af:inputText label="Number of Items to show at a time"
                      id="it1"
     value="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}"
                      columns="3"/>
      </af:panelFormLayout>
      <af:panelGroupLayout id="pgl2"
                           layout="horizontal"
                           halign="right"
                        inlineStyle="width:500px;">
        <af:commandButton text="Save" id="cb1"
        action="#{pageFlowScope.recentPagesBean.saveSettings}"/>
        <af:commandButton text="Cancel" id="cb2"
                          action="cancel"
                actionListener="#{pageFlowScope.recentPagesBean.cancel}"/>
      </af:panelGroupLayout>
    </af:group>
  </f:facet>
</af:panelStretchLayout>

単一の最上位レベル・コンポーネントPanel Stretch Layoutとその中央ファセット内のGroupコンポーネント。このグループ内では、Panel Form LayoutおよびPanel Group Layoutです。

Panel Form LayoutにはInput Textコンポーネントが含まれ、このコンポーネントにはrecentPagesBeanから返される値が設定されます。

Panel Group Layoutには、SaveおよびCloseという2つのCommand Buttonコンポーネントが含まれています。これらは、recentPagesBeanで定義されているイベントに関連付けられています。


D.3.1.4 advancedEditPopupView.jspxページ

このページでは、編集権限またはカスタマイズ権限を持つユーザーに対して、カスタマイズ・オプションが表示されます。実行時は、このページが別のダイアログで開かれて、表示するアイテムの数を選択するオプション、問い合せるアイテムの数を選択するオプション、およびページ区切りコントロールの表示または非表示を選択するチェック・ボックスが表示されます。

「高度な編集」ダイアログ

次の表では、advancedPopupView.jspxページのコードの重要なセクションについて説明します。

表D-5 カスタマイズ・ページのコード

コード 説明
<af:panelStretchLayout id="psl1">
  <f:facet name="center">
    <af:group id="group1">
      <af:panelFormLayout id="pfl1">
        <af:inputText label="Number of Items to show at a time"
                      id="it1"
            value="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}" 
                     columns="3"/>
        <af:inputText label="Number of Items to Query" id="it2"
                       value="#{pageFlowScope.recentPagesBean.number_of_items_to_query}"
                      columns="3"/>
         <af:selectBooleanCheckbox label="Show Page Control"
                                    id="sbc1"
               value="#{pageFlowScope.recentPagesBean.showPageControl}"/>
      </af:panelFormLayout>
      <af:panelGroupLayout id="pgl2"
                           layout="horizontal"
                           halign="right"
                          inlineStyle="width:500px;">
        <af:commandButton text="Save" id="cb1"
                  action="#{pageFlowScope.recentPagesBean.saveSettings}"/>
        <af:commandButton text="Cancel" id="cb2"
                          action="cancel"
                actionListener="#{pageFlowScope.recentPagesBean.cancel}"/>
      </af:panelGroupLayout>
    </af:group>
  </f:facet>
</af:panelStretchLayout>

単一の最上位レベル・コンポーネントPanel Stretch Layoutとその中央ファセット内のグループ・コンポーネント。このグループ内では、Panel Form LayoutおよびPanel Group Layoutです。

Panel Form Layoutには2つのInput TextコンポーネントとSelect Boolean Checkboxが含まれます。これらのコンポーネントは、recentPagesBeanから返される値が設定されます。

Panel Group Layoutには、SaveおよびCloseという2つのCommand Buttonコンポーネントが含まれています。これらは、recentPagesBeanで定義されているイベントに関連付けられています。


D.3.1.5 recentPagesBean Java Bean

このJava Beanには、次の論理が含まれます。

  • ユーザー入力に基づいて表に特定の数のアイテムを表示します。

  • simpleEditPopupViewページとadvancedEditPopupViewページからトリガーされるSaveイベントとCancelイベントを処理します。

  • ページ区切りが実装されている場合に「前へ」アイコンと「次へ」アイコンをレンダリングします。

  • ページの合計数を取得してからページ区切りメッセージを表示します。

  • カスタマイズとパーソナライズを保存する必要がある場所が定義されているPreference Beanを参照します。

このBeanのコードは、RecentPagesアプリケーションにあります。これは、OTNのOracle WebCenter Portal 11gのデモとサンプルのページからダウンロードできます。

http://webcenter.oracle.com

次の表では、recentPagesBean.javaファイルのコードの重要なセクションについて説明します。

表D-6 recentPagesBean Java Beanのコード

コード 説明
private String _getPreferenceFileName()
  {
    String taskflowId = 
     ControllerContextFwk.getInstanceFwk().getCurrentViewPortFwk().getClientId();
    if (taskflowId == null)
    {
      taskflowId = 
         ControllerContextFwk.getInstanceFwk().getCurrentViewPortFwk().getParentViewPort().getClientId();
    }
    String preferenceFileName = 
     PREFERENCE_BASE + taskflowId.replace(".", "_") + ".xml";
    return preferenceFileName;
  }
  private static PageServiceBean getPageServiceBean()
  {
    String beanName = "pageServiceBean";
    Object bean = null;
    FacesContext ftx = FacesContext.getCurrentInstance();
    bean =  ftx.getExternalContext().getRequestMap().get(beanName);
     if (bean == null)
    {
      ELContext elContext = ftx.getELContext();
      ExpressionFactory exFactory = 
       ftx.getApplication().getExpressionFactory();
      ValueExpression expr = 
       exFactory.createValueExpression(elContext, "#{" + beanName + "}",PageServiceBean.class);
      bean = expr.getValue(elContext);
    }
    return (PageServiceBean) bean;
  }

タスク・フローを特定し、現在実行中のタスク・フローのインスタンスレベルのプリファレンスを取得する論理。

public String saveSettings()  throws Exception
  {
    if (number_of_items_to_query != null &&
        !number_of_items_to_query.isEmpty())
    {
      Preference.setNumberOfItemsToQuery(_getPreferenceFileName(),
                                         Integer.parseInt(number_of_items_to_query));
    }
    if (this.number_of_items_to_show_at_a_time != null &&
        !this.number_of_items_to_show_at_a_time.isEmpty())
    {
      Preference.setNumberOfItemsToShow(_getPreferenceFileName(),
                                        Integer.parseInt(number_of_items_to_show_at_a_time));
    }
    if (_showPageControl != null)
    {
      Preference.setShowPageControl(_getPreferenceFileName(),_showPageControl);
    }
    AdfFacesContext.getCurrentInstance().returnFromDialog(null, null);
    return "save";
  }

パーソナライズまたはカスタマイズを実行するダイアログの「保存」ボタンの動作を定義する論理。設定は、タスク・フロー・プリファレンス・ファイルに保存されます。

public void setNumber_of_items_to_show_at_a_time(String number_of_items_to_show_at_a_time)
 {
    this.number_of_items_to_show_at_a_time = 
       number_of_items_to_show_at_a_time;
  }
  public String getNumber_of_items_to_show_at_a_time()
  {
    String query = 
     Integer.toString(Preference.getNumberOfItemsToShow(_getPreferenceFileName()));
    return query;
  }

パーソナライズまたはカスタマイズを実行するダイアログのNumber of Items to show at a timeフィールドに値を設定する論理。

public void setNumber_of_items_to_query(String number_of_items_to_query)
  {
    this.number_of_items_to_query = number_of_items_to_query;
  }
  public String getNumber_of_items_to_query()
  {
    String query =
      Integer.toString(Preference.getNumberOfItemsToQuery(_getPreferenceFileName()));
    return query;
  }

カスタマイズを実行するダイアログのNumber of Items to Queryフィールドに値を設定する論理。

public boolean getShowPageControl()
  {
    boolean showPageControl =
      Preference.getShowPageControl(_getPreferenceFileName());
    return showPageControl;
  }
  public void setShowPageControl(boolean showPageControl)
  {
    _showPageControl = showPageControl;
  }

カスタマイズを実行するダイアログのShow Page Controlチェック・ボックスを設定する論理。

public List<PageDef> getPages()
{
  PageServiceBean psb = getPageServiceBean();
   List<PageDef> pages = psb.getPages();
   int start = getStart();
   int end = getEnd();
  if (start < 0 || start > pages.size())
  {
   start = 0;
  }
  if (end < 0 || end > pages.size())
  {
    end = pages.size();
  }
  List<PageDef> tempPages = pages.subList(start, end);
  return tempPages;
}
public int getEnd()
{
  String items_to_query = this.getNumber_of_items_to_query();
  int offset = Integer.parseInt(items_to_query);
  int end = getStart() + offset;
  if (end > this.getTableSize())
  {
    end = getTableSize();
  }
  return end;
}

表の現在のビューに表示するページのリストを取得する論理。

public int getTableSize()
{
  int tableSize = -1;
   try
  {
    PageServiceBean psb = getPageServiceBean();
     List<PageDef> pages = psb.getPages();
     tableSize = pages.size();
   }
  catch (Exception e)
  {
    System.out.println(e.toString());
  }
   return tableSize;
}

表のサイズを取得したレコード数に設定する論理。

public int getStart()
{
  String items_to_query =
 this.getNumber_of_items_to_query();
  int offset = Integer.parseInt(items_to_query);
  return (getPageNumber() - 1) * offset;
}
public int getPageNumber()
{
  Object page_num =
  RequestContext.getCurrentInstance().getPageFlowScope().get("page_num");
  int local_page_num = 1;
  if (page_num == null || (Integer) page_num <= 0)
    {
      local_page_num = 1;
    }
    else
    {
      local_page_num = (Integer) page_num;
    }
    return local_page_num;
  }

public void cancel(ActionEvent actionEvent)
  {
    AdfFacesContext.getCurrentInstance().returnFromDialog(null, null);
  }

パーソナライズまたはカスタマイズを実行するダイアログの「取消」ボタンの動作を定義する論理。

public void previous(ActionEvent actionEvent)
  {
    int page_num = getPageNumber();
    page_num--;
    if (page_num <= 0)
    {
      page_num = 1;
    }
    RequestContext.getCurrentInstance().getPageFlowScope().put("page_num", page_num);
  }

タスク・フローのページ区切りコントロールの「前へ」アクションの動作を定義する論理。

public void next(ActionEvent actionEvent)
{
  int page_num = getPageNumber();
  page_num++;
  String items_to_query =
 this.getNumber_of_items_to_query();
  int offset = Integer.parseInt(items_to_query);
  int total_page_num = getTotalPageNumber();
  if (page_num > total_page_num)
  {
    page_num = this.getTableSize()
 / offset;
  }
   RequestContext.getCurrentInstance().getPageFlowScope().put("page_num",  page_num);
  }

タスク・フローのページ区切りコントロールの「次へ」アクションの動作を定義する論理。

public boolean isShowPrevious()
  {
    int page_num = getPageNumber();
    if (page_num <= 1)
    {
      return false;
    }
    else
    {
      return true;
    }
  }

「前へ」アイコンをレンダリングする論理

public boolean isShowNext()
  {
    int page_num = getPageNumber();
    if (page_num >= getTotalPageNumber())
    {
      return false;
    }
    else
    {
      return true;
    }
  }

「次へ」アイコンをレンダリングする論理。

public int getTotalPageNumber()
  {
    String items_to_query =
     this.getNumber_of_items_to_query();
    int offset = Integer.parseInt(items_to_query);
    int total_page_num = this.getTableSize()
    / offset;
    if (getTableSize() % offset > 0)
    {
      total_page_num++;
    }
    return total_page_num;
  }

ページの合計数を返す論理。

public String getFooterText()
  {
    return "Items " + (this.getStart() + 1) + "-" + this.getEnd() + 
" of " + " " + this.getTableSize() + " ";
  }

ページ区切りテキストをItems 1-4 of 25という形式で返す論理。


D.3.1.6 プリファレンスBean

このJava Beanは、タスク・フロー・プリファレンス・ファイルの属性を取得および設定するAPIを提供するラッパーです。このタスク・フロー・インスタンスのパーソナライズとカスタマイズを、アプリケーションと同じMDSレイヤーに保存する論理が含まれます。このサンプル・アプリケーションでは、サイトレベルのカスタマイズはmds/mdssys/cust/site/siteディレクトリに格納されます。したがって、Preference Beanのコードにより、アプリケーションのMDSセッションのクローンが作成され、タスク・フローのパーソナライズとカスタマイズが同じディレクトリに格納されることが保証されます。

このBeanのコードは、RecentPagesアプリケーションにあります。これは、OTNのOracle WebCenter Portal 11gのデモとサンプルのページからダウンロードできます。

http://webcenter.oracle.com

次の表では、Preference.javaファイルのコードの重要なセクションについて説明します。

表D-7 プリファレンスJava Beanのコード

コード 説明
private static MDSSession _getClonedMDSSession()
  {
    MDSInstance instance = (MDSInstance) ADFContext.getCurrent().getMDSInstanceAsObject();
    MDSSession mdsSession = (MDSSession) ADFContext.getCurrent().getMDSSessionAsObject();
     mdsSession =
 instance.createSession(mdsSession.getSessionOptions(), mdsSession.getUserStateHandler());
    return mdsSession;
  }

アプリケーションのMDSセッションのクローンを作成する論理。

private static MetadataObject _readPreference(MDSSession mdsSession, String preferenceFileName)
  {
    MetadataObject mo = null;
    try
    {
      mo =
 mdsSession.getMutableMO(MOReference.create(preferenceFileName));
    }
    catch (MetadataNotFoundException mnfe)
    {
      _LOG.warning("Creating a new preference file " + preferenceFileName);
    }
    catch (ReferenceException re)
    {
      _LOG.warning("Creating a new preference file " + preferenceFileName);
    }
    catch (Exception e)
    {
      throw new RuntimeException(e);
    }
   // preference file is not available create a new one
    if (mo == null)
    {
      try
      {
        DocumentBuilderFactory builderFactory =
          DocumentBuilderFactory.newInstance();
        builderFactory.setNamespaceAware(true);
        builderFactory.setValidating(false); 
       DocumentBuilder builder =
 builderFactory.newDocumentBuilder();
        Document document =
          builder.parse(new ByteArrayInputStream(CONTENTS.getBytes()));
        mo =
 mdsSession.createMetadataObject(preferenceFileName, document);
        mdsSession.flushChanges();
        mo =
 mdsSession.getMutableMO(MOReference.create(preferenceFileName));
      }
      catch (Exception e)
      {
        throw new RuntimeException(e);
      }
    }
    return mo;
  }

MDSセッションでプリファレンス・ファイルを読み取るか、または必要に応じてプリファレンス・ファイルを作成する論理。

public static void setNumberOfItemsToShow(String preferenceFileName,
int numberOfItemsToShow)
  {
    MDSSession session = _getClonedMDSSession();
    MetadataObject mo = _readPreference(session, preferenceFileName);
    mo.getDocument().getDocumentElement().setAttribute("numberOfItemsToShow",
Integer.toString(numberOfItemsToShow));
   _flushChanges(session);
  }
  public static int getNumberOfItemsToShow(String preferenceFileName)
  {
    MDSSession session = _getClonedMDSSession(); 
    MetadataObject mo = _readPreference(session, preferenceFileName);
    String show =
      mo.getDocument().getDocumentElement().getAttribute("numberOfItemsToShow");
    return Integer.parseInt(show);
  }  

一度に表に表示するアイテムの数を取得および設定する論理。

public static void setNumberOfItemsToQuery(String preferenceFileName, 
int _numberOfItemsToQuery)
  {
    MDSSession session = _getClonedMDSSession();
    MetadataObject mo = _readPreference(session, preferenceFileName);
    mo.getDocument().getDocumentElement().setAttribute("numberOfItemsToQuery",
Integer.toString(_numberOfItemsToQuery));
    _flushChanges(session);
  }
  public static int getNumberOfItemsToQuery(String preferenceFileName)
  {
    MDSSession session = _getClonedMDSSession(); 
   MetadataObject mo = _readPreference(session, preferenceFileName);
    String query =
      mo.getDocument().getDocumentElement().getAttribute("numberOfItemsToQuery");
    return Integer.parseInt(query);
  }

データ・ソースに問い合せるアイテムの数を取得および設定する論理。

public static void setShowPageControl(String preferenceFileName, 
boolean showPageControl)
  {
    MDSSession session = _getClonedMDSSession();
    MetadataObject mo = _readPreference(session, preferenceFileName);
 mo.getDocument().getDocumentElement().setAttribute("showPageControl", 
Boolean.toString(showPageControl));
    _flushChanges(session);
  }
public static boolean getShowPageControl(String preferenceFileName)
  {
    MDSSession session = _getClonedMDSSession();
    MetadataObject mo = _readPreference(session, preferenceFileName);
    String pageControl =
      mo.getDocument().getDocumentElement().getAttribute("showPageControl");
    return Boolean.parseBoolean(pageControl);
  }

タスク・フローにページ・コントロールを表示するかどうかを取得および設定する論理。

private static void _flushChanges(MDSSession session)
  {
    try
    {
      session.flushChanges();
    }
    catch (Exception e)
    {
      throw new RuntimeException(e);
    }
  }

MDSセッションへのタスク·フローに加えた変更を保存するための論理。サンド・ボックスがMDSセッションで設定されている場合は、変更がサンド・ボックスに保存されます。そうでなければ、それらは永続的にMDSに書き込まれます。

private static final String CONTENTS =
 "<preference numberOfItemsToShow='5'
              numberOfItemsToQuery='10'
              showPageControl='true'
   xmlns='http://xmlns.oracle.com/apps/preference'/>";
}

Number of Items to show at a timeフィールド、Number of Items to queryフィールドおよびShow Page Controlチェック・ボックスにデフォルト値を表示する論理。ユーザーがRecentPagesタスク・フローのインスタンスに初めてアクセスする際、この内容で新しいプリファレンス・ファイルが作成されます。


これらのファイルがすべて含まれるRecentPagesプロジェクトはOracle ADFにデプロイされ、タスク・フローはWebPagesプロジェクトのカスタマイズ可能なWelcome.jspxページで使用されます。

D.3.2 WebPagesプロジェクト

このプロジェクトには、recent-pages-task-flow-definitionタスク・フローを使用するWelcome.jspxページが含まれます。

D.3.2.1 Welcome.jspxファイル

Welcome.jspxは、Panel Stretch Layoutコンポーネントを含むカスタマイズ可能なページです。Panel Stretch Layoutの上部ファセットには、Change Mode Linkとページ作成タスク・フローが含まれます。中央ファセットには、Page Customizableと子であるPanel Customizableが含まれ、後者にはShow Detail Frameコンポーネントとrecent-pages-task-flow-definitionタスク・フローが含まれます。

Show Detail FramestretchContent属性とshowResizer属性はそれぞれfalseneverに設定され、このコンポーネントによってその子のタスク・フローがストレッチされないことが保証されます。

また、refresh属性は、タスク・フロー・バインディングでifNeededに設定されます。これにより、実行時にこのページに対して実行されたカスタマイズは、ユーザーがリフレッシュを実行したときに反映されることが保証されます。

Welcome.jspxページに含まれるコードは次のとおりです。

<?xml version='1.0' encoding='US-ASCII'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:pe="http://xmlns.oracle.com/adf/pageeditor"
          xmlns:cust="http://xmlns.oracle.com/adf/faces/customizable">
  <jsp:directive.page contentType="text/html;charset=US-ASCII"/>
  <f:view>
    <af:document id="d1">
      <af:form id="f1">
        <af:panelStretchLayout id="psl1">
          <f:facet name="top">
            <af:panelGroupLayout layout="horizontal"
      xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
                                 id="pgl2">
              <pe:changeModeLink id="cml1"/>
              <af:spacer width="10" height="10" id="s2"/>
              <af:region value="#{bindings.pagecreatepage1.regionModel}"
                         id="r1"/>
              <af:panelGroupLayout id="pgl1"/>
            </af:panelGroupLayout>
          </f:facet>
          <f:facet name="center">
            <pe:pageCustomizable id="pageCustomizable1">
              <cust:panelCustomizable id="panelCustomizable1" layout="scroll">
                <cust:showDetailFrame text="Recent Pages" id="sdf1"
                 stretchContent= "never" showResizer="never">
                  <af:region value="#{bindings.recentpagestaskflowdefinition1.regionModel}"
                             id="r2"/>
                </cust:showDetailFrame>
              </cust:panelCustomizable>
              <f:facet name="editor">
                <pe:pageEditorPanel id="pep1"/>
              </f:facet>
            </pe:pageCustomizable>
          </f:facet>
          <f:facet name="start"/>
          <f:facet name="end"/>
        </af:panelStretchLayout>
      </af:form>
    </af:document>
  </f:view>
</jsp:root>

実行時のこのページは、図D-7に示すように表示されます。

図D-7 Welcome.jspxページ

実行時のWelcome.jspxページ

D.3.2.2 adf-config.xmlファイル

Show Detail Frameコンポーネント内にタスク・フローを追加して、タスク・フローの結果を親であるShow Detail Frameコンポーネントのクロムにアクションとして表示できます。これは、親であるShow Detail Frameでカスタム・アクションを定義することで実現できます。カスタム・アクションを定義するには、インスタンス・レベルでCustom ActionコンポーネントをShow Detail Frameの子コンポーネントとして追加するか、またはグローバル・レベルでCustom Action要素をアプリケーションのadf-config.xmlファイルに定義します。グローバル・カスタム・アクションは、アプリケーションのすべてのShow Detail Frameインスタンスで有効化されますが、表示されるのはShow Detail Frameインスタンスにタスク・フローが子として含まれる場合のみです。

このアプリケーションでは、タスク・フローの結果に対応するカスタム・アクションであるdialog:simpleEditPopupViewdialog:advancedEditPopupViewは、adf-config.xmlファイルで次のようにグローバルに定義されています。

<customizableComponentsSecurity xmlns="http://xmlns.oracle.com/adf/faces/customizable/config">
    <enableSecurity value="true"/>
    <customActions>
      <customAction action="refresh" text="Refresh" 
                    shortDesc="Refresh"
                    location="menu" rendered="true"
                    icon="/adf/pe/images/refresh_ena.png"/>
      <customAction action="dialog:simpleEditPoup" 
                    text="Simple Edit" 
                    shortDesc="Simple Edit" 
                    location="menu" 
                    rendered="#{!changeModeBean.inEditMode}"
                icon="/adf/pe/images/editproperties_ena.png"/>
      <customAction action="dialog:advancedEditPopup" 
                    text="Advanced Edit" 
                    shortDesc="Advanced Edit" location="menu" 
                    rendered="#{changeModeBean.inEditMode}"
                icon="/adf/pe/images/editproperties_ena.png"/>
    </customActions>
  </customizableComponentsSecurity>

D.3.3 実行時の動作

この構成の結果、実行時に次の動作が行われます。

  • すべてのユーザーに対して、ページの表示中にタスク・フローの周りのクロムに「簡易編集」アクションが表示されます。

    「アクション」メニューの「簡易編集」アクション

    このアクションをクリックすると、別のダイアログにパーソナライズ・オプションが表示されます。

    図
  • 編集権限またはカスタマイズ権限を持つユーザーに対して、ページの編集中にタスク・フローの周りのクロムに「高度な編集」アクションが表示されます。

    「高度な編集」アクション

    このアクションをクリックすると、別のダイアログにカスタマイズ・オプションが表示されます。

    「高度な編集」ダイアログ

D.4 結論

タスク・フローが含まれるFrameworkアプリケーション・ページでは、タスク・フローの設計がアプリケーションのパフォーマンスに大きな影響を与える可能性があります。また、応答が遅く、一貫性のないUIは、アプリケーション・ユーザーに好ましくないエクスペリエンスをもたらす可能性があります。パフォーマンスを高め、Frameworkアプリケーション・ユーザーに適切なユーザー・エクスペリエンスが提供されることを保証するために、このドキュメントで説明するガイドラインに従って、アプリケーションで使用するタスク・フローを実装してください。