Class RequestPathJavaPackageMapping

All Implemented Interfaces:
Handler<Request<?>,Object>
Direct Known Subclasses:
HttpRequestJavaPackageMapping.Mapping

public class RequestPathJavaPackageMapping extends DispatchHandler<Request<?>,Object,RequestPathJavaPackageMapping>
リクエストパスをJavaパッケージへマッピングすることで動的に委譲先ハンドラを決定するディスパッチハンドラ。

マッピング先Javaパッケージは、本ハンドラの basePackage プロパティに設定する。

リクエストパスを単一のJavaパッケージにマッピングする場合の設定例を以下に示す。

本ハンドラの basePackage プロパティ リクエストパス 委譲先のハンドラクラス
nablarch.sample.apps /admin/AdminApp nablarch.sample.apps.admin.AdminApp
/user/UserApp nablarch.sample.apps.user.UserApp

委譲先のクラスが存在しない、もしくは、クラスが存在してもハンドラインターフェース Handler を実装していない場合は、 汎用例外 Result.NotFound が送出される。

ベースパスの指定

マッピング元となるリクエストパスのプレフィックスのことを「ベースパス」と呼ぶ。ベースパスは basePath プロパティ に設定する。

ベースパスには、画面オンライン処理におけるコンテキストルートを設定することを想定している。 (※画面オンライン処理では、実際にはハンドラとしてHttpRequestJavaPackageMappingを使用するが、 実際にディスパッチ処理を行なっているのは、HttpRequestJavaPackageMappingから処理を委譲される本ハンドラである)

マッピング処理を行う際には、リクエストパス中のベースパス部分の文字列を削除した上で、マッピング先Javaパッケージへとマッピングする。
以下に、画面オンライン処理でベースパスを指定し、リクエストパスを単一のJavaパッケージにマッピングする場合の設定例を示す。

本ハンドラの basePath プロパティ 本ハンドラの basePackage プロパティ リクエストパス 委譲先のハンドラクラス
/webapp/sample nablarch.sample.apps /webapp/sample/admin/AdminApp nablarch.sample.apps.admin.AdminApp
nablarch.sample.apps /webapp/sample/user/UserApp nablarch.sample.apps.user.UserApp

なお、ベースパスが指定されていて、かつリクエストパスがそのベースパスに合致しない場合は、汎用例外 Result.NotFound が送出される。

リクエストパスごとのマッピング先Javaパッケージの切り替え

optionalPackageMappingEntries プロパティに設定を行うことで、リクエストパスごとにマッピング先Javaパッケージを切り替えることができる。

optionalPackageMappingEntries プロパティには、リクエストパスのパターン(requestPattern プロパティ)とマッピング先Javaパッケージ(basePackage プロパティ)の組み合わせを設定する。
optionalPackageMappingEntries プロパティに設定した順番にリクエストパスのパターンとリクエストパスとのマッチングが行われ、 最初にマッチしたマッピング先Javaパッケージが使用される。 マッチするものが存在しない場合、本ハンドラの basePackage プロパティに設定したマッピング先Javaパッケージが使用される。

以下に、リクエストパスごとにマッピング先Javaパッケージを切り替える場合の設定例を示す。

optionalPackageMappingEntriesの requestPattern プロパティ optionalPackageMappingEntriesの basePackage プロパティ リクエストパス 委譲先のハンドラクラス
/admin// nablarch.app1 /admin/AdminApp nablarch.app1.admin.AdminApp
/user// nablarch.app2 /user/UserApp nablarch.app2.user.UserApp

リクエストパスのパターンのマッチングは、リクエストパス中のすべてのドット(.)をスラッシュ(/)に置換してから行う。 この仕様は、Nablarch のバッチ処理で過去に使用していたドット区切りのリクエストパス(例: ss01A001.B01AA001Action/B01AA0010)との互換性を保つために存在している。

リクエストパスのパターンの記法についての詳細はRequestPathMatchingHelperを参照すること。

Author:
Iwauo Tajima
See Also:
  • Constructor Details

    • RequestPathJavaPackageMapping

      public RequestPathJavaPackageMapping()
      デフォルトコンストラクタ。

      このメソッドの処理は次のコードと同等である。

         new RequestPathJavaPackageMapping("", "");
       
    • RequestPathJavaPackageMapping

      public RequestPathJavaPackageMapping(String basePath, String basePackage)
      リクエストパスが、basePathで始まるリクエストを、basePackageで指定された Javaパッケージ配下のリクエストハンドラに委譲するディスパッチャを作成する。
      Parameters:
      basePath - マッピング元ベースURI
      basePackage - マッピング先Javaパッケージ
  • Method Details

    • getHandlerClass

      protected Class<?> getHandlerClass(Request<?> req, ExecutionContext ctx) throws ClassNotFoundException
      処理を委譲するハンドラの型を決定する。 このクラスの実装では、ベースパスとベースパッケージの設定をもとに算出した完全修飾名に一致するリクエストハンドラに対して処理を委譲する。 正確な仕様は以下の通り。

      委譲先のクラス(完全修飾名)の決定は以下の規則に従う。

         1. basePackage の ”.” を ”/” に置換する。
         2. リクエストパスの先頭から basePath と一致する部分を basePackage
            に置換する。
         3. 2.の結果文字列を”/”で分割する。
            分割後の各トークンの内、英大文字で始まっているものを委譲先の
            クラス名とし、それ以前の各トークンをパッケージ名とみなす。
         4. コンテキストクラスパス上に上記のパッケージ及びクラスが実際に
            存在していれば、そのクラスを委譲対象とする。
       
      以下の場合、共通例外Result.NotFoundを送出する。
         - ベースパス外からのアクセスであった場合。
         - 委譲先のクラスが決定できない、決定できても存在しない場合。
         - 委譲先のクラスがHandlerインターフェースを実装していない場合。
       
      Specified by:
      getHandlerClass in class DispatchHandler<Request<?>,Object,RequestPathJavaPackageMapping>
      Parameters:
      req - 入力データ
      ctx - 実行コンテキスト
      Returns:
      処理を委譲するハンドラ
      Throws:
      ClassNotFoundException - 指定されたクラスが存在しなかった場合。
    • getBasePackage

      protected String getBasePackage(Request<?> req, ExecutionContext ctx)
      マッピング先Javaパッケージを取得する。

      optionalPackageMappingEntries プロパティに設定した順番にリクエストパスのパターンとリクエストパスとのマッチングが行われ、 最初にマッチしたJavaパッケージが使用される。
      マッチするものが存在しない場合、またはoptionalPackageMappingEntries プロパティ自体が設定されていない場合、本ハンドラのbasePackage プロパティに設定したJavaパッケージが使用される。

      Parameters:
      req - 入力データ
      ctx - 実行コンテキスト
      Returns:
      マッピング先Javaパッケージ
    • setBasePath

      public RequestPathJavaPackageMapping setBasePath(String basePath)
      マッピング元ベースパスを設定する。
      Parameters:
      basePath - マッピング元ベースパス
      Returns:
      JavaPackageMapping
    • setBasePackage

      public RequestPathJavaPackageMapping setBasePackage(String basePackage)
      マッピング先Javaパッケージを設定する。
      Parameters:
      basePackage - マッピング先Javaパッケージ
      Returns:
      JavaPackageMapping
    • setOptionalPackageMappingEntries

      public RequestPathJavaPackageMapping setOptionalPackageMappingEntries(List<JavaPackageMappingEntry> optionalPackageMappingEntries)
      RequestHandlerEntryでリクエストパスに合致したマッピング先Javaパッケージを上書きする場合に使用する、JavaPackageMappingEntryのリストを設定する。
      Parameters:
      optionalPackageMappingEntries - JavaPackageMappingEntryのリスト
      Returns:
      このオブジェクト自体
    • setClassNamePrefix

      public RequestPathJavaPackageMapping setClassNamePrefix(String prefix)
      委譲対象クラス名の接頭辞となる文字列を設定する。
      Parameters:
      prefix - 委譲対象クラス名の接頭辞となる文字列
      Returns:
      このオブジェクト自体
    • setClassNameSuffix

      public RequestPathJavaPackageMapping setClassNameSuffix(String suffix)
      委譲対象クラス名の接尾辞となる文字列を設定する。
      Parameters:
      suffix - 委譲対象クラス名の接尾辞となる文字列
      Returns:
      このオブジェクト自体