SubmitComponentの変更

ここでは、サブミットすべきMessageオブジェクトをVisitで保存しているcurrentMessageを使用する事にします。
SubmitComponentの持っているsubmitMessageプロパティを削除し、getSubmitMessageとsetSubmitMessageはvisitのcurrentMessageを参照するように変更します。
submitActionでは、DataContextをvisitから取得するように変更します。

SubmitComponent.java

package bbs.view;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Level;
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 class SubmitComponent extends BaseComponent {
	private static final Log log = LogFactory.getLog(SubmitComponent.class);

	public Message getSubmitMessage() {
		Visit visit = (Visit) getPage().getVisit();
		return visit.getCurrentMessage();
	}

	public void setSubmitMessage(Message submitMessage) {
		Visit visit = (Visit) getPage().getVisit();
		visit.setCurrentMessage(submitMessage);
	}

	public void submitAction(IRequestCycle rc) {
		Message mes = getSubmitMessage();

		Date now = new Date();
		mes.setSubmitDate(now);
		mes.setModificationDate(now);

		Visit visit = (Visit) getPage().getVisit();
		DataContext context = visit.getDataContext();

		context.registerNewObject(mes);

		context.commitChanges(Level.WARN);

		//新しいメッセージをvisitに登録しておく
		Message newMessage = new Message();
		newMessage.setDataContext(context);
		visit.setCurrentMessage(newMessage);

		TestPage nextPage = (TestPage) rc.getPage("TestPage");
		rc.activate(nextPage);
	}
}

ここで、visitオブジェクトに変更を入れる必要があります。
getCurrentMessageメソッドで、currentMessageがnullだとまずいので、新規メッセージオブジェクトを作って保持しておくという作業が必要になります。コンストラクタにその処理を追加しておきましょう。

Visit.java(抜粋)

	public Visit() {
		super();
		dataContext = Configuration.getSharedConfiguration().getDomain().createDataContext();
		currentMessage = new Message();
		currentMessage.setDataContext(dataContext); //DataContextを関連付けておく
	}

それから忘れちゃならないのが、コンポーネント定義です。
submitMessageは今までバインドしてきましたが、SubmitComponentが自力でMessageを取得するように変更しましたんで、属性は廃止します。

SubmitComponent.jwc

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

<component-specification class="bbs.view.SubmitComponent"
    allow-body="no"
    allow-informal-parameters="no">
	<component id="subject" type="TextField">
		<binding name="value" expression="submitMessage.subject"/>
	</component>
	<component id="userName" type="TextField">
		<binding name="value" expression="submitMessage.userName"/>
	</component>
	<component id="userPass" type="TextField">
		<binding name="value" expression="submitMessage.userPass"/>
		<binding name="hidden" expression="true"/>
	</component>
	<component id="mail" type="TextField">
		<binding name="value" expression="submitMessage.mail"/>
	</component>
	<component id="url" type="TextField">
		<binding name="value" expression="submitMessage.url"/>
	</component>
	<component id="content" type="TextArea">
		<binding name="value" expression="submitMessage.content"/>
	</component>
	
	<component id="submitButton" type="Submit">
		<binding name="listener" expression="listeners.submitAction"/>
	</component>    
</component-specification>