🚀 Efwフレームワーク サーバー側処理フローの全体分析
提供された4つの主要ソース(efwServlet.java、ScriptManager.java、サーバーサイドefw.js、efw.server.js)を統合し、Efwフレームワークのサーバー側処理フロー全体を分析します。
Efwフレームワークのサーバー側は、クライアントの Efw("eventId") 呼び出しから始まるAJAX/WebSocketリクエストを受け付け、JavaとサーバーサイドJavaScriptの強力な連携により、認証、バリデーション、ロジック実行、およびリソース管理を統合的に行うイベント駆動型ミドルウェアとして機能します。
1. ゲートウェイ層: efwServlet.java
efwServlet は、クライアントからのすべてのWebイベントリクエストを受け付ける唯一のディスパッチャ(Dispatcher)です。
| 役割 | 説明 |
|---|---|
| 初期化 | loadOnStartup=1 により、起動時にフレームワーク全体(framework.initServlet)を初期化します。 |
| リクエスト受付 | クライアントからのPOSTリクエスト(JSONデータ)を読み取ります。 |
| エラー制御 | 初期化失敗時やJavaレベルのエラー発生時に、規定のJSONエラーレスポンスを返します。 |
| 処理委譲 | 読み取ったJSON文字列を ScriptManager.doPost() へ渡し、JavaScript環境での処理を依頼します。 |
| リソースクリーンアップ | finally ブロックで、スレッドローカルなコンテキスト情報(言語、ログなど)を削除し、スレッドセーフティを確保します。 |
2. 実行エンジン層: ScriptManager.java
ScriptManager は、サーバーサイドJavaScriptを実行するための抽象化されたエンジン管理レイヤーです。
| 役割 | 説明 |
|---|---|
| エンジン選択 | 設定(efw.script.engine)に基づき、NashornまたはGraalJSなどの具体的なJavaScript実行環境を動的にロードし、抽象化(ScriptEngine4Efw)します。 |
| 実行制御 | efwServlet から渡されたJSONを _se.doPost(req) に委譲し、JavaScript環境でイベント処理を開始させます。 |
| 排他制御 | ReentrantLock(ファイルI/O用)と、イベントIDごとのSemaphore(同時実行数制限用)を提供し、マルチスレッド環境での安全なリソース利用とサービス品質(QoS)制御を実現します。 |
3. コアロジック層: efw.js (サーバーサイド)
ScriptManager によってロードされ、JavaScript環境のグローバルコンテキストとして機能する、フレームワークの基盤ライブラリです。
| 役割 | 説明 |
|---|---|
| エントリーポイント | Efw.prototype.doPost(req) が、JavaからJavaScript環境への公式な入口です。 |
| フェーズ判定 | リクエストJSONの params の有無で、パラメーター形式取得フェーズ (params==null) か、イベント実行フェーズ (params!=null) かを判定し、処理を分岐させます。 |
| セキュリティ | デバッグモード時に、グローバル汚染チェックを行い、開発者が意図しない変数定義を行っていないかを警告します。 |
| リソース管理 | イベント実行後、finallyでアップロードファイルの一時削除やセマフォの解放を行います。 |
| 機能委譲 | 実際の認証、バリデーション、実行処理は、EfwServer インスタンス(efw.server)に委譲します。 |
4. セキュリティ・サービス層: efw.server.js
efw.js から呼び出され、イベント実行に必要な事前処理と事後処理を担います。
| 機能 | メソッド | 詳細 |
|---|---|---|
| ログイン | checkLogin |
セッションにログインキーが存在するか確認。セッション切れの場合、loginUrl へのナビゲーションを指示。 |
| 認可 | checkAuth |
ユーザーの権限値とイベントIDが、設定されたパターンにマッチするか確認。権限がない場合はシステムエラーへ遷移。 |
| バリデーション | checkStyle |
サーバーサイドバリデーションの核心。event.paramsFormat に基づき、必須、型変換、最大長、min/max範囲、禁則文字、暗号化/復号化を再帰的にチェック。成功した場合、リクエスト値を適切な型(Date, Number)に変換して上書き。 |
| 実行 | fire |
バリデーション済みのパラメーターを携え、最終的にユーザーが定義したイベントスクリプト(event.fire)を実行。 |
| トランザクション | fire (try/catch/finally) |
イベント実行の成否に応じて db._commitAll() または db._rollbackAll() を実行し、トランザクションを管理。 |
| 特殊アクション | fire |
actions.download や actions.preview が含まれる場合、そのファイル情報をセッションに保存し、別途専用サーブレットで処理できるように準備。 |
📝 サーバー処理の統合フローまとめ
クライアントのイベントリクエストは、以下の明確な多層構造をたどって処理されます。
- Java I/O (Servlet): リクエスト受信、JSON読み取り、Java → JavaScriptへの入口。
- Java Engine (ScriptManager): JavaScript実行環境のセットアップ、排他制御、実行開始。
- JS Framework (efw.js): リクエストパース、フェーズ判定、リソース管理、セキュリティフック。
- JS Security/Validation (efw.server.js): ログイン $\rightarrow$ 認可 $\rightarrow$ バリデーションと型変換。
- JS Event Script: コアビジネスロジック実行(DBアクセスなど)。
- JS/Java Cleanup: トランザクション処理、リソース解放、レスポンスJSONの国際化と返却。
この構造により、Efwフレームワークは、ビジネスロジックとインフラストラクチャ(セキュリティ、I/O、並行処理)を明確に分離し、堅牢なエンタープライズアプリケーション開発を可能にしています。