気づかうAssistantDirector

LastaFluteを制御します。

LastaFluteの現場フィット

LastaFluteのコンポーネント を、現場にフィットさせるにはどうしたらよいでしょう?

みんな優秀なタレントではありますが、なかなか気難しい連中です。

設定ファイルのコピーはしない

Di xmlのコピー拡張による調整は、フレームワーク変更への耐性がなくなってしまうため基本的にやりません。 インクリメンタル開発では、フレームワークも進化していく可能性があるため、フレームワーク内部構造への依存度は少なくしたいものです。

拡張ポイントがあらかじめ用意されている

代わって、AssistantDirector と呼ばれる、あらかじめ LastaFlute の方で用意した拡張ポイントがあり、それ経由で様々な設定を LastaFlute に反映していきます。

クラスは、mylasta パッケージにあり、例えば、Maihamaプロジェクトであれば、MaihamaFwAssistantDirector となります。

e.g. MaihamaプロジェクトのAssistantDirector @Directory
maihama-common // commonプロジェクト (DBFluteも含む)
 |-src/main/java // Maihamaプロジェクト共通クラスたち
 |  |-org.docksidestage // アプリのドメインパッケージ
 |     |-...
 |     |-mylasta // Maihama固有のLastaFlute対応クラスのパッケージ
 |        |-action // Actionに関するパッケージ
 |        |-direction // LastaFluteをMaihama風にするパッケージ
 |           |-sponsor // AssistantDirectorで設定する処理を切り出したクラスなど
 |           |  |-...
 |           |
 |           |-MaihamaConfig // maihama_config 対応クラス(自動生成)
 |           |-MaihamaEnv    // maihama_env 対応クラス(自動生成)
 |           |-MaihamaFwAssistantDirector // ☆Lastaの現場フィットを司る

マルチプロジェクトであれば、さらにそれぞれのアプリの mylasta に下に、サブクラスがあります。アプリ固有の Direction を指定する場合は、サブクラスの方でオーバーライドして調整します。

外だしの設定は [App]Config から

AssistantDirectorはクラスとして提供されています。設定というのは、必ずしも "値" になるとは限らないからです。例えば、Lambdaで書かれたコールバック実装自体が設定にも なり得ます。

もし、外だしの設定ファイルから値を取得したい場合は、AssistantDirectorの中で [App]Config インターフェースを使って、[app]_config.properties[app]_env.properties の値を参照します。

e.g. [app]_env.propertiesなど @Directory
maihama-common // commonプロジェクト (DBFluteも含む)
 |-src/main/resources  // dbflute.xml や properties など
 |  |-dbflute.xml         // DBFluteの xml (自動生成)
 |  |-lasta_di.properties // Lasta Diの微調整properties (SmartDeploy設定など)
 |  |-maihama_config.properties  // Maihamaプロジェクト共通の通常コンフィグ
 |  |-maihama_env.properties     // Maihamaプロジェクト共通の環境依存コンフィグ
 |  |-maihama_env_integration.properties // 環境依存コンフィグの結合用
 |  |-maihama_env_production.properties  // 環境依存コンフィグの本番用
 |  |-maihama_label.properties   // Maihamaプロジェクト共通のラベルリソース
 |  |-maihama_message.properties // Maihamaプロジェクト共通のメッセージリソース
e.g. [App]Config の DI @Java
@Resource
private MaihamaConfig maihamaConfig;

AssistantDirectorの中にすべての設定を実装すると巨大になってしまうので、sponsor パッケージの下に、それぞれのカテゴリごとに実装クラスが分かれています。

e.g. Maihamaプロジェクトのパッケージ構成 @Directory
maihama-common // commonプロジェクト (DBFluteも含む)
 |-src/main/java // Maihamaプロジェクト共通クラスたち
 |  |-org.docksidestage // アプリのドメインパッケージ
 |     |-...
 |     |-mylasta // Maihama固有のLastaFlute対応クラスのパッケージ
 |        |-action // Actionに関するパッケージ
 |        |  |-MaihamaLabels   // maihama_label 対応のクラス (自動生成)
 |        |  |-MaihamaMessages // maihama_message 対応のクラス (自動生成)
 |        |  |-MaihamaUserBean // ログインしているユーザー情報のBean
 |        |-direction // LastaFluteをMaihama風にするパッケージ
 |           |-sponsor // AssistantDirectorで設定する処理を切り出したクラスなど
 |           |  |-MaihamaActionAdjustmentProvider // Action微調整
 |           |  |-MaihamaApiFailureHook // APIリクエストの例外発生時の共通Hook
 |           |  |-MaihamaCookieResourceProvider // クッキーのリソース
 |           |  |-MaihamaCurtainBeforeListener // アプリ起動直前リスナー
 |           |  |-MaihamaListedClassificationProvider // リスト表示される区分値
 |           |  |-MaihamaMailDeliveryDepartmentCreator // メール配信部署の作成
 |           |  |-MaihamaSecurityResourceProvider // 暗号化リソースなど
 |           |  |-MaihamaTimeResourceProvider // 現在日時リソース
 |           |  |-MaihamaUserLocaleProcessProvider // ユーザーロケール処理
 |           |  |-MaihamaUserTimeZoneProcessProvider // ユーザータイムゾーン処理
 |           |
 |           |-MaihamaConfig // maihama_config 対応クラス(自動生成)
 |           |-MaihamaEnv    // maihama_env 対応クラス(自動生成)
 |           |-MaihamaFwAssistantDirector // ☆Lastaの現場フィットを司る

Asssit Direction

基本的なアシストの設定です。AssistantDirectorの根幹となる config の設定がされています。

e.g. Assist Direction の実装 @Java
@Override
protected void prepareAssistDirection(FwAssistDirection direction) {
    direction.directConfig(nameList -> setupAppConfig(nameList)
            , "maihama_config.properties", "maihama_env.properties");
}
protected abstract void setupAppConfig(List<String> nameList);

propertiesの読み込みと同時に、propertiesの継承関係を構築しています。

マルチプロジェクトであれば、さらにサブクラスで setupAppConfig() を実装して追加します。

Core Direction

LastaFluteの core なコンポーネントの調整です。

e.g. Assist Direction の実装 @Java
@Override
protected void prepareCoreDirection(FwCoreDirection direction) {
    // this configuration is on maihama_env.properties because this is true only when development
    direction.directDevelopmentHere(maihamaConfig.isDevelopmentHere());

    // titles of the application for logging are from configurations
    direction.directLoggingTitle(maihamaConfig.getDomainTitle(), maihamaConfig.getEnvironmentTitle());

    // this configuration is on sea_env.properties because it has no influence to production
    // even if you set true manually and forget to set false back
    direction.directFrameworkDebug(maihamaConfig.isFrameworkDebug()); // basically false

    // you can add your own process when your application's curtain before
    direction.directCurtainBefore(createCurtainBeforeHook());

    direction.directSecurity(createSecurityResourceProvider());
    direction.directTime(createTimeResourceProvider());
    direction.directJson(createJsonResourceProvider());
    direction.directMail(createMailDeliveryDepartmentCreator().create());
}

protected MaihamaCurtainBeforeHook createCurtainBeforeHook() {
    return new MaihamaCurtainBeforeHook();
}

protected MaihamaSecurityResourceProvider createSecurityResourceProvider() { // #change_it_first
    final InvertibleCryptographer inver = InvertibleCryptographer.createAesCipher("maihama:dockside");
    final OneWayCryptographer oneWay = OneWayCryptographer.createSha256Cryptographer();
    return new MaihamaSecurityResourceProvider(inver, oneWay);
}

protected MaihamaTimeResourceProvider createTimeResourceProvider() {
    return new MaihamaTimeResourceProvider(maihamaConfig);
}

protected MaihamaJsonResourceProvider createJsonResourceProvider() {
    return new MaihamaJsonResourceProvider();
}

protected MaihamaMailDeliveryDepartmentCreator createMailDeliveryDepartmentCreator() {
    return new MaihamaMailDeliveryDepartmentCreator(maihamaConfig);
}

さらに、FwCoreDirection にて様々な Direction を指定することができるので探してみましょう。

メインで使う暗号化コンポーネントたち、設定の調整はプロジェクト作成時に真っ先にやりましょう。

Provider など実装自体を渡すものは、sponsorパッケージに出すとよいでしょう。 AssistantDirectorのクラスは、網羅性を高めるために、それらを new するだけにします。

DB Direction

LastaFlute の DB にまつわるコンポーネントの調整です。

e.g. DB Direction の実装 @Java
@Override
protected void prepareDbDirection(FwDbDirection direction) {
    direction.directClassification(createListedClassificationProvider());
}

protected ListedClassificationProvider createListedClassificationProvider() {
    return new MaihamaListedClassificationProvider();
}

少ないですねぇ。

Web Direction

LastaFlute の Web にまつわるコンポーネントの調整です。

e.g. Web Direction の実装 @Java
@Override
protected void prepareWebDirection(FwWebDirection direction) {
    direction.directRequest(createUserLocaleProcessProvider(), createUserTimeZoneProcessProvider());
    direction.directCookie(createCookieResourceProvider());
    direction.directAdjustment(createActionAdjustmentProvider());
    direction.directMessage(nameList -> setupAppMessage(nameList), "maihama_message", "maihama_label");
    direction.directApiCall(createApiFailureHook());
}

protected MaihamaUserLocaleProcessProvider createUserLocaleProcessProvider() {
    return new MaihamaUserLocaleProcessProvider();
}

protected MaihamaUserTimeZoneProcessProvider createUserTimeZoneProcessProvider() {
    return new MaihamaUserTimeZoneProcessProvider();
}

protected MaihamaCookieResourceProvider createCookieResourceProvider() { // #change_it_first
    final InvertibleCryptographer cr = InvertibleCryptographer.createAesCipher("dockside:maihama");
    return new MaihamaCookieResourceProvider(maihamaConfig, cr);
}

protected MaihamaActionAdjustmentProvider createActionAdjustmentProvider() {
    return new MaihamaActionAdjustmentProvider();
}

protected abstract void setupAppMessage(List<String> nameList);

protected MaihamaApiFailureHook createApiFailureHook() {
    return new MaihamaApiFailureHook();
}

さらに、FwWebDirection にて様々な Direction を指定することができるので、ぜひ探索を。

クッキー (Cookie) の暗号化の設定も、プロジェクト作成時に真っ先に。

マルチプロジェクトであれば、メッセージリソースの追加の設定がサブクラスで行われます。