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>
これで、ようやく大ざっぱな機能として実装を終えました。
途中でステートフルにするという重大な仕様変更が発生して、大幅な手戻りも発生しました(笑)。
ようやく次ぎに進む事が出来ます・・・
次にやる事はレスがついたメッセージを解りやすく表示する事です。
現状ではレスだろうがそうでなかろうが、順番にずらずらと表示されるだけです。
これをもっと分かりやすい形で表示したいと思います。
例によって、またコンポーネントを作りこんでいきます。