パッケージ jakarta.faces.flow

クラス FlowHandler


  • public abstract class FlowHandler
    extends ObjectSE

    FlowHandler は、ランタイムがフェイスフロー機能と対話できるようにする主要なエントリポイントです。NavigationHandler は、フローに関連するナビゲーション上の決定を行う必要がある場合にこのクラスを使用します。フェイスフロー機能は、ClientWindow 機能と CDI に完全に依存しています。

    フローの定義

    実装は、アプリケーション構成リソースの XML スキーマ定義で指定されている <flow-definition> 要素を使用するか、FlowBuilder API を使用して、フェースフローの定義をサポートする必要があります。フローを定義する追加の手段は、FlowHandlerFactory を装飾することによって提供される場合があります。

    フローの管理

    このクラスのシングルトンインスタンスはスレッドセーフである必要があるため、ユーザーごとの状態を格納してはなりません。ただし、フローはユーザーごとにトラバースされるため、現在の ClientWindow に関連付ける必要があります。さらに、フローはネストされる場合があります。これらの要件は、スタックのようなランタイムデータ構造でフローを管理し、ユーザーごとに保存され、ClientWindow に関連付けられることを強くお勧めします。フローインスタンスは不変ですが、フロースタックはユーザーごとであるため、実装では、フロースコープのデータ(FlowScoped として宣言されたマネージド Bean および getCurrentFlowScope() によって返される Map に格納されたデータ)を完全に再入可能にする必要があります。例: A と B の 2 つのフローがあり、それぞれが 1 つの FlowScoped Bean MyBeanA と MyBeanB を持つアプリケーションについて考えてみます。フロー A に入ると、MyBeanA がアクティブになります。A から B に呼び出すと、MyBeanB がアクティブになります。A にコールバックすると、MyBeanA の以前のインスタンスが再アクティブ化されるのではなく、MyBeanA の新しいインスタンスがアクティブになります。

    フローグラフ

    以前のバージョンの仕様ではフローグラフが定義されていましたが、グラフ内のノードの種類は VDL ビューのみでした。Faces Flow 機能は現在、次のノード型を定義しています。

    • 表示

      これは、最初から仕様に含まれている通常の Jakarta Faces VDL View です。

    • 切り替え

      これは Jakarta Expression Language 式のリストです。制御がスイッチノードに渡されると、リスト内の各式が評価され、true を返す最初の式を使用して、制御を渡す必要がある次のノードの ID が定義されます。どの式も true に評価されない場合、制御は指定されたデフォルト ID に渡されます。

    • リターン

      このノード型は、呼び出しフローに返される結果を指定します。

    • メソッド呼び出し

      このノード型では、フローの実行の任意の時点で任意のアプリケーションロジックを呼び出すことができます。メソッドが呼び出された後にナビゲーションケースがナビゲートされるようにする結果を指定できます。

    • フェイスフローコール

      このノード型により、あるフローが別のフローを呼び出すことができます。呼び出しフローはアクティブのままであり、制御が呼び出されたフローから戻るまで終了しません。

    グラフのエッジは、既存の Jakarta Faces ナビゲーションルールシステムによって定義されます。

    フローとモデルオブジェクト

    CDI アノテーション FlowScoped でアノテーションが付けられたマネージド Bean は、参照されると、指定されたスコープへのユーザーエージェントのエントリの後に遅延して作成され、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。

    flowScope Jakarta Expression Language 暗黙オブジェクトは、「現在の」勾配に値を格納するためにも使用できます。このスコープに格納されている値は、ユーザーエージェントがフローを離れるときにガベージコレクションに使用できるようにする必要があります。

    導入:
    2.2
    • フィールドの詳細

      • FLOW_ID_REQUEST_PARAM_NAME

        public static final StringSE FLOW_ID_REQUEST_PARAM_NAME

        コンポーネントファミリ jakarta.faces.OutcomeTarget の Renderers によってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローのフロー ID を表すパラメーターのパラメーター名として使用する必要があります。

        導入:
        2.2
        関連事項:
        定数フィールド値
      • TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME

        public static final StringSE TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME

        コンポーネントファミリ jakarta.faces.OutcomeTarget の Renderers によってレンダリングされるコンポーネントは、この定数を、このコンポーネントが入力されるフローの定義ドキュメント ID を表すパラメーターのパラメーター名として使用する必要があります。

        導入:
        2.2
        関連事項:
        定数フィールド値
      • NULL_FLOW

        public static final StringSE NULL_FLOW

        コンポーネントファミリ jakarta.faces.OutcomeTarget の Renderers によってレンダリングされるコンポーネントは、そのようなコンポーネントを使用してフローから(別のフローに入らずに)戻るときに、TO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME によって指定されたパラメーターの値としてこの定数を使用する必要があります。

        導入:
        2.2
        関連事項:
        定数フィールド値
    • コンストラクターの詳細

      • FlowHandler

        public FlowHandler()
    • メソッドの詳細

      • getCurrentFlowScope

        public abstract MapSE<ObjectSE,​ObjectSE> getCurrentFlowScope()

        #{flowScope} Jakarta Expression Language 暗黙オブジェクトをバックアップする Map を返します。現在アクティブなフローがない場合は、null を返します。

        戻り値:
        このフロースコープの Map
        導入:
        2.2
      • getFlow

        public abstract Flow getFlow​(FacesContext context,
                                     StringSE definingDocumentId,
                                     StringSE id)

        引数 definingDocument のスコープ内で、 id が引数 id と同等である Flow を返します。

        パラメーター:
        context - 現在のリクエストの FacesContext
        definingDocumentId - 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。
        id - definingDocument のスコープ内で一意の Flow の ID。
        戻り値:
        引数識別子の Flow
        例外:
        NullPointerExceptionSE - パラメーターのいずれかが null の場合
        導入:
        2.2
      • addFlow

        public abstract void addFlow​(FacesContext context,
                                     Flow toAdd)

        現在のアプリケーションで認識されている Flow のコレクションに引数 Flow を追加します。実装はスレッドセーフでなければなりません。

        パラメーター:
        context - 現在のリクエストの FacesContext
        toAdd - 追加する Flow
        例外:
        NullPointerExceptionSE - パラメーターのいずれかが null の場合
        IllegalStateExceptionSE - definingDocument のスコープ内に引数 Flow と同じ id のフローがすでに存在する場合。
        IllegalArgumentExceptionSE - 追加するフローの id が null または空の文字列の場合。
        IllegalArgumentExceptionSE - toAdd の  definingDocumentId が null の場合。
        導入:
        2.2
      • getCurrentFlow

        public abstract Flow getCurrentFlow​(FacesContext context)

        引数 FacesContext に対して現在アクティブな Flow を返します。アクティブなフローがない場合は、null を返します。Flow は常に正確に 1 つの ClientWindow に関連付ける必要がありますが、ClientWindow には複数の Flow が含まれる場合があります。

        このメソッドを呼び出す前に、引数として true を使用して pushReturnMode(jakarta.faces.context.FacesContext) が呼び出された場合は、実際の現在のフローの代わりにスタック上の先行するフローを返します。先行するフローがない場合は null を返します。それ以外の場合は、現在のフローを返します。

        パラメーター:
        context - 現在のリクエストの FacesContext
        戻り値:
        フローがアクティブでない場合は、現在の Flow または null 
        例外:
        NullPointerExceptionSE - パラメーターのいずれかが null の場合
        導入:
        2.2
      • getLastDisplayedViewId

        public abstract StringSE getLastDisplayedViewId​(FacesContext context)

        getCurrentFlow(jakarta.faces.context.FacesContext) によって返される現在のフローの最後に表示された viewId を返します。現在のフローがない場合は null を返します。

        パラメーター:
        context - 現在のリクエストの FacesContext
        戻り値:
        最後に表示された viewId。
        例外:
        NullPointerExceptionSE - context が null の場合
        導入:
        2.2
      • pushReturnMode

        public abstract void pushReturnMode​(FacesContext context)

        リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの NavigationHandler 仕様では、フローリターンのナビゲーションルールを処理する前にこのメソッドを呼び出し、その直後に finally ブロックから popReturnMode(jakarta.faces.context.FacesContext) を呼び出す必要があります。

        パラメーター:
        context - 現在のリクエストの FacesContext
        例外:
        NullPointerExceptionSE - context が null の場合。
        導入:
        2.2
      • popReturnMode

        public abstract void popReturnMode​(FacesContext context)

        リターンノードを処理するときに、ナビゲーションの正しい処理を有効にします。デフォルトの NavigationHandler 仕様では、finally ブロックからこのメソッドを呼び出し、フローリターンのコンテキストでナビゲーションルールの処理をすぐに試行する必要があります。

        パラメーター:
        context - 現在のリクエストの FacesContext
        例外:
        NullPointerExceptionSE - context が null の場合。
        導入:
        2.2
      • transition

        public abstract void transition​(FacesContext context,
                                        Flow sourceFlow,
                                        Flow targetFlow,
                                        FlowCallNode outboundCallNode,
                                        StringSE toViewId)

        現在のユーザーの ClientWindow のフローグラフで遷移を実行します。origin および destination 引数に対応する Flow インスタンスへの参照を取得します。origin Flow が destination Flow と等しい場合は、何も実行せずに null を返します。それ以外の場合、outboundCallNode 引数が null でない場合は、送信パラメーターを保存します。説明のために、evaluatedParams は、送信パラメーターの評価された値を格納するデータ構造です。フロースコープをポップする前にこれらの値を評価する必要があります。値は、ターゲットフローに渡す必要があるが、新しいスコープがアクティブになると使用できなくなるスコープインスタンスを参照する可能性があるためです。次のアルゴリズムを使用して、送信パラメーターを保存します。

        outboundCallNode の outboundParameters プロパティが非 null かつ空でなく、ターゲットフローの inboundParameters プロパティが非 null かつ空でない場合、名前が受信 パラメーターのエントリと一致する送信 パラメーターの各エントリについて、パラメーターの値を評価し、評価した値を対応する名前の evaluatedParams に格納します。それ以外の場合は、evaluatedParams を空と見なします。

        destination Flow が  origin Flow のサブフローである場合は、destination Flow をフローデータ構造にプッシュし、the destination Flow を返します。それ以外の場合は、フローデータ構造から現在の Flow をポップします。destination Flow が null でない場合は、 destination Flow を現在のフローにして、データ構造にプッシュします。evaluatedParams が空でない場合は、各エントリについて、ターゲットフローの受信パラメーターで対応するパラメーターを見つけ、その setValue メソッドを呼び出して、evaluatedParams からの値を渡します。

        パラメーター:
        context - 現在のリクエストの FacesContext
        sourceFlow - 現在の Flow、またはソースフローがない場合は null
        targetFlow - 宛先 Flow、または宛先フローがない場合は null
        outboundCallNode - この遷移を引き起こしているフロー呼び出しノード、またはこの遷移がフロー呼び出しによって引き起こされていない場合は null
        toViewId - この遷移の結果として表示されるビューの viewId。このパラメーターにより、getLastDisplayedViewId(jakarta.faces.context.FacesContext) を実装できるようになります。
        例外:
        NullPointerExceptionSE - context または toViewId が null の場合。
        導入:
        2.2
      • clientWindowTransition

        public abstract void clientWindowTransition​(FacesContext context)

        コンポーネントファミリ jakarta.faces.OutcomeTarget のレンダラーによってレンダリングされたコンポーネントの場合にフロー遷移を許可します。これらの遷移は、そのようなコンポーネントの HTTP GET ベースの性質により、リクエスト処理ライフサイクルの前に発生する必要があります。このメソッドは、ライフサイクルのビューの復元フェーズから呼び出されます。

        flowId を、FLOW_ID_REQUEST_PARAM_NAME の値によって名前が指定されたパラメーターのリクエストパラメーターマップの値とします。toFlowDocumentId をTO_FLOW_DOCUMENT_ID_REQUEST_PARAM_NAME の値によって名前が指定されたパラメーターのリクエストパラメーターマップの値とします。toFlowDocumentId が null の場合、何も実行せず戻ります。それ以外の場合、sourceFlow を getCurrentFlow(jakarta.faces.context.FacesContext) からの戻り値とします。null 値は、現在のフローが存在しないことを示します。これは、このナビゲーションがフローに入ろうとしている場合に当てはまります。flowId が null でなく、toFlowDocumentId が NULL_FLOW の値と等しくない場合、getFlow(jakarta.faces.context.FacesContext, java.lang.String, java.lang.String) を呼び出して、最後の 2 つの引数としてそれぞれ toFlowDocumentIdflowId を渡した結果を targetFlow とします。結果が null 以外の場合、sourceFlowFlow.getFlowCall(jakarta.faces.flow.Flow) を呼び出した際の戻り値を flowCallNode とし、引数として targetFlow を渡します。それ以外の場合、targetFlowflowCallNode は null のままで、これがフロー戻り値であることを示します。FacesContext.getViewRoot() を呼び出し、UIViewRoot.getViewId() を呼び出した際の戻り値を toViewId とします。

        前のアルゴリズムで収集された引数を渡して、transition(jakarta.faces.context.FacesContext, jakarta.faces.flow.Flow, jakarta.faces.flow.Flow, jakarta.faces.flow.FlowCallNode, java.lang.String) を呼び出します。

        パラメーター:
        context - 現在のリクエストの FacesContext
        例外:
        NullPointerExceptionSE - context が null の場合。
        導入:
        2.2
      • isActive

        public abstract boolean isActive​(FacesContext context,
                                         StringSE definingDocument,
                                         StringSE id)

        引数 definingDocument および id によって参照されるフローが現在アクティブである場合にのみ、true を返します。

        パラメーター:
        context - 現在のリクエストの FacesContext
        definingDocument - 返されるフローが定義されているドキュメントのアプリケーション固有の識別子。
        id - definingDocument のスコープ内で一意の Flow の ID。
        戻り値:
        参照されたフローがアクティブである場合にのみ true
        例外:
        NullPointerExceptionSE - パラメーターのいずれかが null の場合
        導入:
        2.2