package org.tynamo.examples.simple.pages;
import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.annotations.CleanupRender;
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.tynamo.builder.BuilderDirector;
import org.tynamo.examples.simple.CustomCommitAfter;
import org.tynamo.routing.annotations.At;
import org.tynamo.services.PersistenceService;
import org.tynamo.util.TynamoMessages;
import org.tynamo.util.Utils;
/**
* Page for creating and adding objects to the DB.
*
* @note:
* When extending this page for customization purposes, it's better to copy & paste code than trying to use inheritance.
*
*/
@At("/{0}/new")
public class Add
{
@Inject
private BuilderDirector builderDirector;
@Inject
private Messages messages;
@Inject
private PersistenceService persistenceService;
@Inject
private PageRenderLinkSource pageRenderLinkSource;
@Inject
private AlertManager alertManager;
@Property(write = false)
private Class beanType;
@Property
private Object bean;
private boolean continueAdding;
@OnEvent(EventConstants.ACTIVATE)
Object activate(Class clazz)
{
if (clazz == null) return Utils.new404(messages);
this.bean = builderDirector.createNewInstance(clazz);
this.beanType = clazz;
return null;
}
@CleanupRender
void cleanup()
{
bean = null;
beanType = null;
}
@OnEvent(EventConstants.PASSIVATE)
Object[] passivate()
{
return new Object[]{beanType};
}
@OnEvent(value = "return")
void onSaveAndReturn() {
this.continueAdding = false;
}
@OnEvent(value = "stay")
void onSaveAndContinue() {
this.continueAdding = true;
}
@Log
@CustomCommitAfter
@OnEvent(EventConstants.SUCCESS)
Link success()
{
persistenceService.save(bean);
alertManager.info(messages.getFormatter(Utils.ADDED_MESSAGE).format(bean));
return !continueAdding ? pageRenderLinkSource.createPageRenderLinkWithContext(Show.class, beanType, bean) : null;
}
@OnEvent("cancel")
Link cancel()
{
return pageRenderLinkSource.createPageRenderLinkWithContext(List.class, beanType);
}
public String getTitle()
{
return TynamoMessages.add(messages, beanType);
}
public String getListAllLinkMessage()
{
return TynamoMessages.listAll(messages, beanType);
}
}