package fr.openwide.maven.artifact.notifier.web.application.administration.form;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.EmailTextField;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.form.FormPanelMode;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.component.AbstractAjaxModalPopupPanel;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.component.DelegatedMarkupPanel;
import fr.openwide.core.wicket.more.model.BindingModel;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
import fr.openwide.maven.artifact.notifier.core.business.user.model.User;
import fr.openwide.maven.artifact.notifier.core.business.user.service.IUserService;
import fr.openwide.maven.artifact.notifier.core.util.binding.Binding;
import fr.openwide.maven.artifact.notifier.web.application.MavenArtifactNotifierSession;
import fr.openwide.maven.artifact.notifier.web.application.administration.page.AdministrationUserDescriptionPage;
import fr.openwide.maven.artifact.notifier.web.application.common.component.LocaleDropDownChoice;
public class UserFormPopupPanel extends AbstractAjaxModalPopupPanel<User> {
private static final long serialVersionUID = -3575009149241618972L;
private static final Logger LOGGER = LoggerFactory.getLogger(UserFormPopupPanel.class);
@SpringBean
private IUserService userService;
private FormPanelMode mode;
private Form<User> userForm;
private PasswordTextField newPasswordField;
private PasswordTextField confirmPasswordField;
public UserFormPopupPanel(String id, IModel<User> userModel) {
this(id, userModel, FormPanelMode.EDIT);
}
public UserFormPopupPanel(String id) {
this(id, new GenericEntityModel<Long, User>(new User()), FormPanelMode.ADD);
}
public UserFormPopupPanel(String id, IModel<User> userModel, FormPanelMode mode) {
super(id, userModel);
this.mode = mode;
}
@Override
protected Component createHeader(String wicketId) {
if (isAddMode()) {
return new Label(wicketId, new ResourceModel("administration.user.form.addTitle"));
} else {
return new Label(wicketId, new StringResourceModel("administration.user.form.editTitle", getModel()));
}
}
@Override
protected Component createBody(String wicketId) {
DelegatedMarkupPanel body = new DelegatedMarkupPanel(wicketId, UserFormPopupPanel.class);
userForm = new Form<User>("form", getModel());
body.add(userForm);
TextField<String> emailField = new EmailTextField("email", BindingModel.of(userForm.getModel(),
Binding.user().email())) {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(UserFormPopupPanel.this.isAddMode());
}
};
emailField.setLabel(new ResourceModel("administration.user.field.email"));
emailField.setRequired(isAddMode());
userForm.add(emailField);
TextField<String> fullNameField = new TextField<String>("fullName", BindingModel.of(userForm.getModel(),
Binding.user().fullName()));
fullNameField.setLabel(new ResourceModel("administration.user.field.fullName"));
userForm.add(fullNameField);
WebMarkupContainer passwordContainer = new WebMarkupContainer("passwordContainer") {
private static final long serialVersionUID = 2727669661139358058L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(UserFormPopupPanel.this.isAddMode());
}
};
userForm.add(passwordContainer);
CheckBox activeField = new CheckBox("active", BindingModel.of(userForm.getModel(), Binding.user().active()));
activeField.setLabel(new ResourceModel("administration.user.field.active"));
passwordContainer.add(activeField);
newPasswordField = new PasswordTextField("newPassword", Model.of(""));
newPasswordField.setLabel(new ResourceModel("administration.user.field.password"));
newPasswordField.setRequired(true);
passwordContainer.add(newPasswordField);
confirmPasswordField = new PasswordTextField("confirmPassword", Model.of(""));
confirmPasswordField.setLabel(new ResourceModel("administration.user.field.confirmPassword"));
confirmPasswordField.setRequired(true);
passwordContainer.add(confirmPasswordField);
LocaleDropDownChoice localeField = new LocaleDropDownChoice("locale", BindingModel.of(userForm.getModel(), Binding.user().locale()));
localeField.setLabel(new ResourceModel("administration.user.field.locale"));
userForm.add(localeField);
return body;
}
@Override
protected Component createFooter(String wicketId) {
DelegatedMarkupPanel footer = new DelegatedMarkupPanel(wicketId, UserFormPopupPanel.class);
// Validate button
AjaxButton validate = new AjaxButton("save", userForm) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
User user = UserFormPopupPanel.this.getModelObject();
try {
user.setUserName(user.getEmail());
List<User> usersWithSameName = userService.listByUserName(user.getUserName());
if (isAddMode()) {
String newPasswordValue = newPasswordField.getModelObject();
String confirmPasswordValue = confirmPasswordField.getModelObject();
if (newPasswordValue != null && confirmPasswordValue != null) {
if (confirmPasswordValue.equals(newPasswordValue)) {
if (newPasswordValue.length() >= User.MIN_PASSWORD_LENGTH &&
newPasswordValue.length() <= User.MAX_PASSWORD_LENGTH) {
if (usersWithSameName.isEmpty()) {
userService.create(user);
userService.setPasswords(user, newPasswordValue);
getSession().success(getString("administration.user.form.add.success"));
throw AdministrationUserDescriptionPage
.linkDescriptor(UserFormPopupPanel.this.getModel())
.newRestartResponseException();
} else {
LOGGER.warn("Username '" + user.getUserName() + "' already used");
form.error(getString("administration.user.form.userName.notUnique"));
}
} else {
LOGGER.warn("Password does not fit criteria.");
form.error(getString("administration.user.form.password.malformed"));
}
} else {
LOGGER.warn("Password confirmation does not match.");
form.error(getString("administration.user.form.password.wrongConfirmation"));
}
}
} else {
if (usersWithSameName.isEmpty() || (usersWithSameName.size() == 1 &&
user.getId().equals(usersWithSameName.get(0).getId()))) {
if (user.getLocale() != null) {
MavenArtifactNotifierSession.get().setLocale(user.getLocale());
}
userService.update(user);
getSession().success(getString("administration.user.form.edit.success"));
closePopup(target);
target.add(getPage());
} else {
LOGGER.warn("Username '" + user.getUserName() + "' already used");
form.error(getString("administration.user.form.userName.notUnique"));
}
}
} catch (RestartResponseException e) {
throw e;
} catch (Exception e) {
if (isAddMode()) {
LOGGER.error("Error occured while creating user", e);
Session.get().error(getString("administration.user.form.add.error"));
} else {
LOGGER.error("Error occured while updating user", e);
Session.get().error(getString("administration.user.form.edit.error"));
}
}
FeedbackUtils.refreshFeedback(target, getPage());
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
FeedbackUtils.refreshFeedback(target, getPage());
}
};
Label validateLabel;
if (isAddMode()) {
validateLabel = new Label("validateLabel", new ResourceModel("common.action.create"));
} else {
validateLabel = new Label("validateLabel", new ResourceModel("common.action.save"));
}
validate.add(validateLabel);
footer.add(validate);
// Cancel button
AbstractLink cancel = new AbstractLink("cancel") {
private static final long serialVersionUID = 1L;
};
addCancelBehavior(cancel);
footer.add(cancel);
return footer;
}
protected boolean isEditMode() {
return FormPanelMode.EDIT.equals(mode);
}
protected boolean isAddMode() {
return FormPanelMode.ADD.equals(mode);
}
@Override
public IModel<String> getCssClassNamesModel() {
return Model.of("modal-user-form");
}
@Override
protected void onShow(AjaxRequestTarget target) {
super.onShow(target);
if (isAddMode()) {
getModel().setObject(new User());
}
}
}