気づかう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;
細かい要件は Sponsor から
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) の暗号化の設定も、プロジェクト作成時に真っ先に。
マルチプロジェクトであれば、メッセージリソースの追加の設定がサブクラスで行われます。