谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

S2JSFでWebParts その16

さて、リフレッシュしたことだし、
「insertで呼び出されたHTMLの、InitActionを実行する」の続き。


まず、やりたい事を整理すると、

  • 親画面
    • 子画面1 (m:inject="s:insert"タグで挿入。以下同様)
    • 子画面2
    • 子画面3

こんな構成の画面を作ったとして、
子画面のInitActionの戻り値がnull以外の場合や、
子画面のInitActionで例外が発生した場合、どう表示すべきか。


例1)
子画面2の戻り値が、子画面4の画面名だった場合。

  • 親画面
    • 子画面1
    • 子画面4
    • 子画面3

という形で表示する。


例2)
子画面2のInitActionで、例外が発生した場合。

  • 親画面
    • 子画面1
    • 例外に対応したエラー画面
    • 子画面3

という形で表示する。


、、、という所を目指して、実装開始。

	protected void processInclude(JsfContext jsfContext, Tag parentTag,
			String src) throws JspException {

		S2Container container = SingletonS2ContainerFactory.getContainer();
		ViewTemplateFactory factory = (ViewTemplateFactory) container
				.getComponent(ViewTemplateFactory.class);
		ViewTemplate template = factory.getViewTemplate(src);
		ViewProcessor viewProcessor = (ViewProcessor) template
				.getRootTagProcessor();
		InsertProcessor insertProcessor = viewProcessor
				.getInsertProcessor(null);

		// -- 変更 BEGIN
		String initAction = viewProcessor.getInitAction();
		FacesContext context = FacesContext.getCurrentInstance();
		if (initAction != null) {
			String newSrc = executeInitAction(context, initAction);
			if (newSrc != null) {
				processInclude(jsfContext, parentTag, newSrc);
				return;
			}
		}

		insertProcessor.process(jsfContext, parentTag);
		// -- 変更 END
	}

	// -- メソッド追加 BEGIN
	protected String executeInitAction(FacesContext context, String initAction) {
		Application app = context.getApplication();
		MethodBinding mb = app.createMethodBinding(initAction, null);
		try {
			String outcome = InvokeUtil.invoke(mb, context);
			if (outcome == null || context.getResponseComplete()) {
				return null;
			}
			return "★outcomeに対応したページのパス★";
		} catch (EvaluationException ex) {
			return "★例外に対応したページのパス★";
		}
	}
	// -- メソッド追加 END

子画面のInitActionを実行した結果、
遷移する場合も、例外が発生した場合も、それぞれ対応したページのパス(src)を返す。
そのsrcを使って、呼び出し側で再度processIncludeを呼び出す、、、という形。
ひとまずこれで、大枠としては動く模様。


ただ、InitActionの戻り値に対応するページのパスを、
どうやれば取得できるかが分からない (^^;


まぁ、今日の所は、ここまで!