okay.
here I attach four files: SharedCrud for page that can do Crud for any bean
to any table using specific DAO. And the OpenResearch that use SharedCrud.

If you open OpenResearch.html, it display link along top of it.
For example in Reference link, there's a New Reference.
And in Journal link, there's a New Journal
So on, and so on.
That link will use SharedCrud<Reference> and SharedCrud<Journal>,
respectively.

But the problem is, if I click New Reference and then New Journal, the first
time I change to another Bean Type, it'll cause problem and the error is :
An unexpected application exception has occurred.

  - org.apache.tapestry.ioc.internal.util.TapestryException Failure
  reading parameter value of component
  tapestry.pages.shared.SharedCrud:form.textfield: crms.domain.Journal
  - java.lang.ClassCastException crms.domain.Journal
  Stack trace
     -
     org.apache.tapestry.internal.services.CoercingPropertyConduitWrapper.get
     (CoercingPropertyConduitWrapper.java:36)
     -
     org.apache.tapestry.corelib.components.BeanEditForm.getValueForProperty
     (BeanEditForm.java:241)
     - org.apache.tapestry.internal.bindings.PropBinding.get(
     PropBinding.java:54)

(I am sorry that I paste it)
I'll look forward again this problem again.
(somehow I think I know the problem is)
:)
Thanks

--
Best wishes,
Eko SW
http://swdev.blogs.friendster.com/my_blog/
package tapestry.pages.shared;

import org.apache.tapestry.annotations.Component;
import org.apache.tapestry.annotations.InjectPage;
import org.apache.tapestry.annotations.OnEvent;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.corelib.components.BeanEditForm;

import tapestry.pages.crms.Home;
import tapestry.pages.crms.Login;
import tapestry.pages.crms.OpenResearch;
import crms.dao.IDao;
import crms.domain.BaseModel;

/**
 * Ini dari Comment di Reference Crud yg udah di hapus :
 * 
 * TODO ternyata subclassing page class di Tapestry, dia jadi pakai tmplate page kita
 * tak baik deh... kudunya, pakai page anaknya. atau opsional ini! bs pakai page anak,
 * jg bisa pakai page parent
 * @author eko
 * 
 * Ini page crud shared. Masih ada sedikit error di saat model yg beda di edit.
 * Pakai versi terbaru atau tanya ke milis.
 * Tp, gimana cara ordering layout formbeannya ya?
 * (TODO, malah mungkin jg dibiarkan spt itu.)
 *
 */
public class SharedCrud<T> {


	@Component(parameters =
    { "clientValidation=false", "object=data" })
    private BeanEditForm form;
	
	/**
	 * method u/ kembali ke halaman sebelumnya ini enggak dinamis
	 * tp berfungsi. cuman belum pakai TDD u/ pagenya
	 */
	
	@InjectPage
	private OpenResearch _openResearchPage;
	
	@InjectPage
	private Login _loginPage;
	
	@Persist
	private T data;

	@Persist
	private IDao<T> dao;

	@Persist
	private String backPageId;

	@InjectPage
	private Home _homePage;

	

	public void setDao(IDao<T> dao) {
		this.dao = dao;
	}

	public T getData() {
		return data;
	}
	
	@OnEvent("submit")
	private Object onSave()
	{
		if(((BaseModel) data).getId()==-1)
		{
			dao.insert(data);
		} else {
			dao.update( data);
		}
		return getBackPage();
		
	}

	private Object getBackPage() {
		if(this.backPageId.toUpperCase().equals("CRMSLOGIN"))
		{
			return _loginPage;
		} else if(this.backPageId.toUpperCase().equals("CRMSOPENRESEARCH"))
		{
			return _openResearchPage;
		} else if(this.backPageId.toUpperCase().equals("CRMSHOME"))
		{
			return _homePage;
		}
		return null;
	}

	public void preparePage(IDao<T> dao, T data, String backPageId) {
		this.data = null;
		this.dao = dao;
		this.data=data;
		
		this.backPageId = backPageId;
		
	}

}
package tapestry.pages.crms;

import java.util.List;

import org.apache.tapestry.annotations.ApplicationState;
import org.apache.tapestry.annotations.Inject;
import org.apache.tapestry.annotations.InjectPage;
import org.apache.tapestry.annotations.OnEvent;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.spring.SpringBean;

import tapestry.pages.shared.SharedCrud;
import tapestry.pages.shared.SharedDeletePage;
import crms.dao.IActivityDao;
import crms.dao.IDonateDao;
import crms.dao.IExpenseDao;
import crms.dao.IJournalDao;
import crms.dao.IReferenceDao;
import crms.dao.IResearchDao;
import crms.dao.ISeminarDao;
import crms.dao.ITeamDao;
import crms.dao.IUserDao;
import crms.domain.Activity;
import crms.domain.Donate;
import crms.domain.Expense;
import crms.domain.Journal;
import crms.domain.Reference;
import crms.domain.Research;
import crms.domain.Seminar;
import crms.domain.Team;
import crms.domain.User;

public class OpenResearch {

	@ApplicationState
	private Research openResearch;

	/**
	 * Default module to Summary
	 */
	@Persist
	private String activeModule = "onSummary";

	@InjectPage
	private Home _homePage;

	// Reference
	@Inject
	@SpringBean("referenceDao")
	private IReferenceDao referenceDao;

	private Reference reference;

	private List referenceList;

	// Activity
	@Inject
	@SpringBean("activityDao")
	private IActivityDao activityDao;

	private Activity activity;

	private List activityList;

	// Seminar
	@Inject
	@SpringBean("seminarDao")
	private ISeminarDao seminarDao;

	private Seminar seminar;

	private List seminarList;

	// Journal
	@Inject
	@SpringBean("journalDao")
	private IJournalDao journalDao;

	private Journal journal;

	private List journalList;

	// Team
	@Inject
	@SpringBean("teamDao")
	private ITeamDao teamDao;

	private Team team;

	private List teamList;

	@ApplicationState
	private User userLogged;
	
	@Inject
	@SpringBean("researchDao")
	private IResearchDao researchDao;

	@InjectPage
	private SharedDeletePage _sharedDelete;

	@InjectPage
	private SharedCrud<Reference> _sharedReferencePage;

	@InjectPage
	private SharedCrud<Activity> _sharedActivityPage;

	@InjectPage
	private SharedCrud<Seminar> _sharedSeminarPage;

	@InjectPage
	private SharedCrud<Journal> _sharedJournalPage;

	@InjectPage
	private SharedCrud<Team> _sharedTeamPage;
	
	@InjectPage
	private SharedCrud<Donate> _sharedDonatePage;

	@Inject
	@SpringBean("userDao")
	private IUserDao userDao;

	

	@Inject
	@SpringBean("donateDao")
	private IDonateDao donateDao;
	private Donate donate;

	@Inject
	@SpringBean("expenseDao")
	private IExpenseDao expenseDao;
	private Expense expense;

	@InjectPage
	private SharedCrud<Expense> _sharedExpensePage;
	
	public Expense getExpense() {
		return expense;
	}

	public void setExpense(Expense expense) {
		this.expense = expense;
	}

	public void setDonate(Donate donate) {
		this.donate = donate;
	}

	public Reference getReference() {
		return reference;
	}

	public List getReferenceList() {
		return referenceDao.findAllFromParent(openResearch.getId());
	}

	public void preparePage(Research research) {
		this.openResearch = research;

	}

	public Research getOpenResearch() {
		return openResearch;
	}

	public void setOpenResearch(Research research) {
		this.openResearch = research;
	}

	/**
	 * ActionLink (yg hanya mengubah variabel internal, jg yg lainnya), akan
	 * me-refresh page ini sendiri
	 * 
	 */
	@OnEvent(component = "onReference")
	public void OnReference() {
		this.activeModule = "onReference";
	}

	@OnEvent(component = "onSummary")
	public void OnSummary() {
		this.activeModule = "onSummary";
	}

	@OnEvent(component = "onActivity")
	public void OnActivity() {
		this.activeModule = "onActivity";
	}

	@OnEvent(component = "onSeminar")
	public void OnSeminar() {
		this.activeModule = "onSeminar";
	}

	@OnEvent(component = "onJournal")
	public void OnJournal() {
		this.activeModule = "onJournal";
	}

	@OnEvent(component = "onTeam")
	public void OnTeam() {
		this.activeModule = "onTeam";
	}

	@OnEvent(component = "onClose")
	public Home OnClose() { // to make they return to summary again
		activeModule = "onSummary";
		return _homePage;
	}
	@OnEvent(component="onDonate")
	public void OnDonate()
	{
		this.activeModule="onDonate";
	}
	
	@OnEvent(component="onExpense")
	public void OnExpense()
	{
		this.activeModule="onExpense";
	}

	/**
	 * Ini adalah method perulangan yg sering dipakai, mungkin bs digeneralisir
	 * 
	 * @return
	 */
	@OnEvent(component = "onNewReference")
	public SharedCrud onNewReference() {
		_sharedReferencePage.preparePage(referenceDao, new Reference(-1,
				openResearch.getId(), userLogged.getName(), "Kode Buku",
				"Judul Buku", "Keterangan"), "crmsopenresearch");
		return _sharedReferencePage;
	}

	@OnEvent(component = "onEditReference")
	public SharedCrud onEditReference(int id) {
		_sharedReferencePage.preparePage(referenceDao, referenceDao
				.findById(id), "crmsopenresearch");
		return _sharedReferencePage;
	}

	@OnEvent(component = "onDeleteReference")
	private SharedDeletePage onDeleteReference(int id) {
		Reference editReference = referenceDao.findById(id);
		_sharedDelete.preparePage(editReference.getName(), editReference,
				referenceDao, "crmsopenresearch");
		return _sharedDelete;

	}

	/**
	 * activity
	 * 
	 * @return
	 */
	@OnEvent(component = "onNewActivity")
	public SharedCrud onNewActivity() {
		_sharedActivityPage.preparePage(activityDao, new Activity(-1,
				openResearch.getId(), userLogged.getName(), null, "Aktivitas",
				"Jenis", "Lokasi", "Keterangan"), "crmsopenresearch");
		return _sharedActivityPage;
	}

	@OnEvent(component = "onEditActivity")
	public SharedCrud onEditActivity(int id) {
		_sharedActivityPage.preparePage(activityDao, activityDao.findById(id),
				"crmsopenresearch");
		return _sharedActivityPage;
	}

	@OnEvent(component = "onDeleteActivity")
	private SharedDeletePage onDeleteActivity(int id) {
		Activity editActivity = activityDao.findById(id);
		_sharedDelete.preparePage(editActivity.getName(), editActivity,
				activityDao, "crmsopenresearch");
		return _sharedDelete;

	}

	/**
	 * seminar
	 * 
	 * @return
	 */
	@OnEvent(component = "onNewSeminar")
	public SharedCrud onNewSeminar() {
		_sharedSeminarPage.preparePage(seminarDao, new Seminar(-1, openResearch
				.getId(), userLogged.getName(), "Seminar", "Lokasi",
				"Pembicara", "Keterangan"), "crmsopenresearch");
		return _sharedSeminarPage;
	}

	@OnEvent(component = "onEditSeminar")
	public SharedCrud onEditSeminar(int id) {
		_sharedSeminarPage.preparePage(seminarDao, seminarDao.findById(id),
				"crmsopenresearch");
		return _sharedSeminarPage;
	}

	@OnEvent(component = "onDeleteSeminar")
	private SharedDeletePage onDeleteSeminar(int id) {
		Seminar editSeminar = seminarDao.findById(id);
		_sharedDelete.preparePage(editSeminar.getName(), editSeminar,
				seminarDao, "crmsopenresearch");
		return _sharedDelete;

	}

	/**
	 * Journal : generalization of shared crud
	 * 
	 * @return
	 */

	/**
	 * journal
	 * 
	 * @return
	 */
	@OnEvent(component = "onNewJournal")
	public SharedCrud onNewJournal() {
		_sharedJournalPage
				.preparePage(journalDao, new Journal(-1, openResearch.getId(),
						userLogged.getName(), "Journal", null,
						"Media Publikasi", "Penulis", "Keterangan"),
						"crmsopenresearch");
		return _sharedJournalPage;
	}

	@OnEvent(component = "onEditJournal")
	public SharedCrud onEditJournal(int id) {
		_sharedJournalPage.preparePage(journalDao, journalDao.findById(id),
				"crmsopenresearch");
		return _sharedJournalPage;
	}

	@OnEvent(component = "onDeleteJournal")
	private SharedDeletePage onDeleteJournal(int id) {
		Journal editJournal = journalDao.findById(id);
		_sharedDelete.preparePage(editJournal.getName(), editJournal,
				journalDao, "crmsopenresearch");
		return _sharedDelete;

	}

	/**
	 * team
	 * 
	 * @return
	 */
	@OnEvent(component = "onNewTeam")
	public SharedCrud onNewTeam() {
		_sharedTeamPage.preparePage(teamDao, new Team(-1, openResearch.getId(),
				userLogged.getName(), "Nama", "Kualifikasi",
				"Posisi dalam Team", "Keterangan", false), "crmsopenresearch");
		return _sharedTeamPage;
	}
	
	@OnEvent(component = "onNewDonate")
	public SharedCrud onNewDonate() {
		_sharedDonatePage.preparePage(donateDao, new Donate(-1, openResearch.getId(),
				userLogged.getName(), "Judul Donasi", null,
				"Keterangan Donasi", 10000, "IDR"), "crmsopenresearch");
		return _sharedDonatePage;
	}
	
	@OnEvent(component = "onNewExpense")
	public SharedCrud onNewExpense() {
		_sharedExpensePage.preparePage(expenseDao, new Expense(-1, openResearch.getId(),
				userLogged.getName(), "Judul Expense", null,
				"Keterangan Expense", 1000, "IDR"), "crmsopenresearch");
		return _sharedExpensePage;
	}

	@OnEvent(component = "onEditTeam")
	public SharedCrud onEditTeam(int id) {
		_sharedTeamPage.preparePage(teamDao, teamDao.findById(id),
				"crmsopenresearch");
		return _sharedTeamPage;
	}

	@OnEvent(component = "onDeleteTeam")
	private SharedDeletePage onDeleteTeam(int id) {
		Team editTeam = teamDao.findById(id);
		_sharedDelete.preparePage(editTeam.getName(), editTeam, teamDao,
				"crmsopenresearch");
		return _sharedDelete;

	}

	public String getActiveModule() {
		return activeModule;
	}

	public void setActiveModule(String activeModule) {
		this.activeModule = activeModule;
	}

	public boolean getIsSummary() {
		return activeModule.equals("onSummary");
	}

	public boolean getIsReference() {
		return activeModule.equals("onReference");
	}

	public boolean getIsActivity() {
		return activeModule.equals("onActivity");
	}

	public boolean getIsSeminar() {
		return activeModule.equals("onSeminar");
	}

	public boolean getIsJournal() {
		return activeModule.equals("onJournal");
	}

	public boolean getIsTeam() {
		return activeModule.equals("onTeam");
	}
	
	public boolean getIsDonate() {
		return activeModule.equals("onDonate");
	}
	
	public boolean getIsExpense() {
		return activeModule.equals("onExpense");
	}

	public Activity getActivity() {
		return activity;
	}

	public List getActivityList() {
		return activityDao.findAllFromParent(openResearch.getId());
	}

	public Journal getJournal() {
		return journal;
	}

	public List getJournalList() {
		return journalDao.findAllFromParent(openResearch.getId());
	}

	public Seminar getSeminar() {
		return seminar;
	}

	public List getSeminarList() {
		return seminarDao.findAllFromParent(openResearch.getId());
	}

	public Team getTeam() {
		return team;
	}
	
	public Donate getDonate() {
		return donate;
	}

	public List getTeamList() {
		return teamDao.findAllFromParent(openResearch.getId());
	}
	
	public List getDonateList() {
		return donateDao.findAllFromParent(openResearch.getId());
	}
	
	public List getExpenseList() {
		return expenseDao.findAllFromParent(openResearch.getId());
	}

	public void setActivity(Activity activity) {
		this.activity = activity;
	}

	public void setActivityList(List activityList) {
		this.activityList = activityList;
	}

	public void setJournal(Journal journal) {
		this.journal = journal;
	}

	public void setJournalList(List journalList) {
		this.journalList = journalList;
	}

	public void setReference(Reference reference) {
		this.reference = reference;
	}

	public void setReferenceList(List referenceList) {
		this.referenceList = referenceList;
	}

	public void setSeminar(Seminar seminar) {
		this.seminar = seminar;
	}

	public void setSeminarList(List seminarList) {
		this.seminarList = seminarList;
	}

	public void setTeam(Team team) {
		this.team = team;
	}

	public void setTeamList(List teamList) {
		this.teamList = teamList;
	}

	/**
	 * Test Method for sub module research
	 * 
	 * @return
	 */
	public boolean getIsReferenceListNotEmpty() {

		return getReferenceList().size() > 0;
	}

	public boolean getIsActivityListNotEmpty() {

		return getActivityList().size() > 0;
	}

	public boolean getIsSeminarListNotEmpty() {

		return getSeminarList().size() > 0;
	}

	public boolean getIsJournalListNotEmpty() {

		return getJournalList().size() > 0;
	}

	public boolean getIsTeamListNotEmpty() {

		return getTeamList().size() > 0;
	}
	
	public boolean getIsDonateListNotEmpty() {

		return getDonateList().size() > 0;
	}
	
	public boolean getIsExpenseListNotEmpty() {

		return getExpenseList().size() > 0;
	}
	
	

	public String getPublicOrPrivate() {
		Research research = researchDao.findById(openResearch.getId());
		if(research.getIsPublic()) return "Public Domain Research";
		else return "Private Research";
	}
	
	public String getResearchOwner()
	{
		Research research = researchDao.findById(openResearch.getId());
		User user = userDao.findById(research.getParentId());
		return user.getName();
	}
	
	public String getResearchLatestActivity()
	{
		
		return null;
	}
	
	public int getCollaboratorNumber()
	{
		List<Team> list=teamDao.findAllFromParent(openResearch.getId());		
		return list.size();
	}
	
	public long getTotalDonation()
	{
		return donateDao.getTotal();
	}
	
	public long getTotalExpense()
	{
		return expenseDao.getTotal();
	}
	
	public long getCashOnHold()
	{
		return getTotalDonation() - getTotalExpense();
	}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to