package br.com.arsmachina.eloquentia.tapestry.pages.page;
import java.util.Date;
import java.util.Locale;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.apache.tapestry5.EventContext;
import org.apache.tapestry5.Field;
import org.apache.tapestry5.ValidationTracker;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.alerts.Duration;
import org.apache.tapestry5.alerts.Severity;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.json.JSONArray;
import org.apache.tapestry5.json.JSONObject;
import org.apache.tapestry5.services.HttpError;
import br.com.arsmachina.eloquentia.controller.PageController;
import br.com.arsmachina.eloquentia.entity.Page;
import br.com.arsmachina.eloquentia.security.ObjectAction;
import br.com.arsmachina.eloquentia.security.ObjectActionPermission;
import br.com.arsmachina.eloquentia.security.SecurityConstants;
import br.com.arsmachina.eloquentia.tapestry.services.PageActivationContextService;
import br.com.arsmachina.eloquentia.tapestry.services.UserService;
/**
* Page that creates and edit pages.
*
* @author Thiago H. de Paula Figueiredo (http://machina.com.br/thiago)
*/
@RequiresRoles(SecurityConstants.AUTHOR)
public class EditPage {
@Inject
private PageController pageController;
@Inject
private AlertManager alertManager;
@Property
private Page page;
@Inject
private Messages messages;
@Inject
private UserService userService;
@Inject
private Locale locale;
@Environmental
private ValidationTracker validationTracker;
@InjectComponent("uri")
private Field uriField;
@Inject
private PageActivationContextService pageActivationContextService;
Object onActivate(EventContext context) {
Object returnValue = null;
final Subject subject = SecurityUtils.getSubject();
if (context.getCount() > 0) {
page = pageActivationContextService.toPage(context);
returnValue = page != null ? null : EditPage.class;
if (page != null) {
if (!subject.isPermitted(new ObjectActionPermission<Page>(page, ObjectAction.EDIT))) {
returnValue = new HttpError(403, messages.get("tapestry-rss.error-403.page.edit"));
}
}
}
return returnValue;
}
void onPrepare() {
if (page == null) {
page = new Page();
page.setPosted(new Date());
page.setPostedBy(userService.getUser());
}
}
void onValidateFromUri(String uri) {
Page other = pageController.findByUri(uri);
if (other != null && !other.getId().equals(page.getId())) {
validationTracker.recordError(uriField, messages.format("eloquentia.duplicated-uri", uri));
}
}
void onSuccess() {
pageController.saveOrUpdate(page);
alertManager.alert(Duration.TRANSIENT, Severity.SUCCESS,
messages.format("eloquentia.page-saved-successfully", page.getTitle()));
}
public Object getContext() {
return pageActivationContextService.toActivationContext(page);
}
public Object onPassivate() {
return pageActivationContextService.toActivationContext(page);
}
public JSONObject getOptions() {
return new JSONObject("lang", locale.getLanguage()).put("containersItems",
new JSONArray().put(new JSONObject("name", "article", "title", "Article", "css", "wym_containers_article")));
}
}