MessageComponentとResPageの変更

このコンポーネントは返信機能を持っています。ここがネックでほとんどを変更せざるを得ませんでした・・
返信機能はどのようになるのか、やってみたいと思います。

修正前のソースはこんな感じでした。

MessageComponent.java(抜粋)

public void resAction(IRequestCycle rc) {
    ResPage nextPage = (ResPage) rc.getPage("ResPage");
    Message parent = getMessage();
    
    Message res = new Message();
    res.setDataContext(parent.getDataContext()); //DataContextを同じものにする
    res.setSubject("Re:" + parent.getSubject()); //parentのタイトルのアタマに「Re:」を付ける
    parent.addToChildren(res); //resをparentの子供に付け加える
    
    nextPage.setResMessage(res);
    nextPage.setParentMessage(parent);
    rc.activate(nextPage);
}

返信がクリックされたら、返信用メッセージを作ってvisitのcurrentMessageに入れます。
currentMessageに入っているMessageオブジェクトは、次のResPageに組み込まれているSubmitComponentのsubmitMessageメソッドによりその内容がフォームに自動入力されます。
ResPageのparentMessageには返信元のMessageオブジェクトを入れます。

MessageComponent.java

package bbs.view;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IRequestCycle;
import org.objectstyle.cayenne.access.DataContext;

import bbs.data.Message;

/**
 * メッセージを表示するコンポーネント
 * 
 * @author toolkit
 * @version $Revision$
 */
public abstract class MessageComponent extends BaseComponent {
	private static final Log log = LogFactory.getLog(MessageComponent.class);

	public abstract Message getMessage();
	public abstract void setMessage(Message message);

	public void resAction(IRequestCycle rc) {
		Visit visit = (Visit) getPage().getVisit();
		DataContext context = visit.getDataContext();

		//返信メッセージを作ります。
		Message res = new Message();
		res.setDataContext(context); //DataContextを関連付けておく
		res.setSubject("Re:" + getMessage().getSubject()); //返信元のタイトルにRe:を付け加えます。
		getMessage().addToChildren(res); //返信元のメッセージに返信メッセージを子メッセージとして追加します。

		ResPage nextPage = (ResPage) rc.getPage("ResPage");
		nextPage.setParentMessage(getMessage()); //ResPageのparentに返信元メッセージをセットします。

		visit.setCurrentMessage(res); //visitに返信メッセージをセットします。
		
		rc.activate(nextPage);

	}
}

ResPageにはresMessageプロパティは必要なくなったので、削除します。

ResPage.java

package bbs.view;

import org.apache.tapestry.html.BasePage;

import bbs.data.Message;

/**
 * 返信ページ
 * 
 * @author toolkit
 * @version $Revision$
 */
public abstract class ResPage extends BasePage {
	public abstract Message getParentMessage();
	public abstract void setParentMessage(Message parentMessage);
}

ResPage.page

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">

<page-specification class="bbs.view.ResPage">
    <property-specification name="parentMessage" type="bbs.data.Message" persistent="no"/>

	<component id="messageComponent" type="MessageComponent">
		<binding name="message" expression="parentMessage"/>
	</component>

    <component id="submitComponent" type="SubmitComponent"/>

</page-specification>

これで、ようやく大ざっぱな機能として実装を終えました。
途中でステートフルにするという重大な仕様変更が発生して、大幅な手戻りも発生しました(笑)。
ようやく次ぎに進む事が出来ます・・・


次にやる事はレスがついたメッセージを解りやすく表示する事です。
現状ではレスだろうがそうでなかろうが、順番にずらずらと表示されるだけです。
これをもっと分かりやすい形で表示したいと思います。

例によって、またコンポーネントを作りこんでいきます。