package org.appfuse.webapp.components;
import org.apache.tapestry5.*;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.internal.services.StringValueEncoder;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.appfuse.model.Role;
import org.appfuse.model.User;
import org.appfuse.service.RoleManager;
import org.appfuse.webapp.AppFuseEventConstants;
import org.appfuse.webapp.services.CountryService;
import org.appfuse.webapp.services.impl.RoleEncoder;
import org.slf4j.Logger;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Generic form for User manipulation
*
* @author Serge Eby
* @version $Id: UserForm.java 5 2008-08-30 09:59:21Z serge.eby $
*/
@SupportsInformalParameters
public class UserForm implements ClientElement, FormValidationControl {
@Inject
private Logger logger;
@Parameter(required = true, autoconnect = true)
@Property
private User user;
@Parameter("true")
@Property
private boolean signup;
@Parameter(value = "message:button.save", defaultPrefix = BindingConstants.LITERAL)
@Property
private String submitLabel;
@Parameter(allowNull = true)
private String from;
@Parameter(value = "true")
@Property
private boolean cookieLogin;
@Property
@Parameter
private String heading;
@Parameter(allowNull = true)
@Property
private List<Role> selectedRoles;
@Property(write = false)
private String infoMessage;
@Inject
private ComponentResources resources;
@Inject
private Messages messages;
@Inject
private JavaScriptSupport jsSupport;
@Inject
HttpServletRequest request;
@Inject
private RoleManager roleManager;
@Inject
private CountryService countryService;
@SuppressWarnings("unchecked")
@Environmental
private TrackableComponentEventCallback eventCallback;
@Component(parameters = "validatationId=componentResources.id",
publishParameters = "clientValidation,autofocus,zone")
private Form form;
public Form getForm() {
return form;
}
boolean onValidateFromForm() {
resources.triggerEvent(AppFuseEventConstants.VALIDATE_PASSWORD, null, null);
return true;
}
public String getClientId() {
return form.getClientId();
}
public void clearErrors() {
form.clearErrors();
}
public boolean getHasErrors() {
return form.getHasErrors();
}
public boolean isValid() {
return form.isValid();
}
public void recordError(Field field, String errorMessage) {
form.recordError(field, errorMessage);
}
public void recordError(String errorMessage) {
form.recordError(errorMessage);
}
@Cached
public Map<String, String> getCountryModel() {
return countryService.getAvailableCountries();
}
public ValueEncoder<String> getCountryEncoder() {
return new StringValueEncoder();
}
@Cached
public List<Role> getRoleModel() {
return roleManager.getAll();
}
public ValueEncoder getRoleEncoder() {
return new RoleEncoder(roleManager);
}
public List<String> getUserRoles() {
List<String> userRoles = new ArrayList<String>();
if (user != null) {
for (Role r : user.getRoles()) {
userRoles.add(r.getName());
}
}
return userRoles;
}
public boolean isUserVersionNull() {
return (user == null || user.getVersion() == null);
}
public boolean isFromList() {
return "list".equals(from);
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public boolean isUserPersisted() {
return user != null && user.getId() != null;
}
public void setInfoMessage(String infoMessage) {
this.infoMessage = infoMessage;
}
public String getConfirmDeletion() {
return messages.format("delete.confirm", "user: " + user.getUsername());
}
public boolean isSelf() {
return isUserPersisted() && user.getUsername().equals(request.getRemoteUser());
}
}