package fr.openwide.core.basicapp.web.application.administration.form;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.basic.Label;
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.form.validation.EqualPasswordInputValidator;
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.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.openwide.core.basicapp.core.business.user.model.User;
import fr.openwide.core.basicapp.core.security.service.ISecurityManagementService;
import fr.openwide.core.basicapp.web.application.BasicApplicationSession;
import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.UserTypeDescriptor;
import fr.openwide.core.basicapp.web.application.common.validator.UserPasswordValidator;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
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;
public class UserPasswordUpdatePopup<U extends User> extends AbstractAjaxModalPopupPanel<U> {
private static final long serialVersionUID = -4580284817084080271L;
private static final Logger LOGGER = LoggerFactory.getLogger(UserPasswordUpdatePopup.class);
@SpringBean
private ISecurityManagementService securityManagementService;
private Form<?> passwordForm;
private final IModel<String> newPasswordModel = Model.of("");
private final UserTypeDescriptor<U> typeDescriptor;
public UserPasswordUpdatePopup(String id, IModel<U> model) {
super(id, model);
setStatic();
this.typeDescriptor = UserTypeDescriptor.get(model.getObject());
}
@Override
protected Component createHeader(String wicketId) {
return new Label(wicketId, new ResourceModel("administration.user.password.update.title"));
}
@Override
protected Component createBody(String wicketId) {
DelegatedMarkupPanel body = new DelegatedMarkupPanel(wicketId, UserPasswordUpdatePopup.class);
passwordForm = new Form<Void>("form");
TextField<String> newPasswordField = new PasswordTextField("newPassword", newPasswordModel);
TextField<String> confirmPasswordField = new PasswordTextField("confirmPassword", Model.of(""));
body.add(
passwordForm
.add(
newPasswordField
.setLabel(new ResourceModel("business.user.newPassword"))
.setRequired(true)
.add(
new UserPasswordValidator(typeDescriptor)
.userModel(getModel())
),
new CoreLabel("passwordHelp",
new ResourceModel(
typeDescriptor.securityTypeDescriptor().resourceKeyGenerator().resourceKey("password.help"),
new ResourceModel(UserTypeDescriptor.USER.securityTypeDescriptor().resourceKeyGenerator().resourceKey("password.help"))
)
),
confirmPasswordField
.setLabel(new ResourceModel("business.user.confirmPassword"))
.setRequired(true)
)
.add(new EqualPasswordInputValidator(newPasswordField, confirmPasswordField))
);
return body;
}
@Override
protected Component createFooter(String wicketId) {
DelegatedMarkupPanel footer = new DelegatedMarkupPanel(wicketId, UserPasswordUpdatePopup.class);
// Validate button
AjaxButton validate = new AjaxButton("save", passwordForm) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
try {
User user = UserPasswordUpdatePopup.this.getModelObject();
String newPassword = newPasswordModel.getObject();
securityManagementService.updatePassword(user, newPassword, BasicApplicationSession.get().getUser());
getSession().success(getString("administration.user.password.update.success"));
closePopup(target);
target.add(getPage());
} catch (Exception e) {
LOGGER.error("Error occured while changing password.", e);
getSession().error(getString("common.error.unexpected"));
}
FeedbackUtils.refreshFeedback(target, getPage());
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
FeedbackUtils.refreshFeedback(target, getPage());
}
};
footer.add(validate);
// Cancel button
AbstractLink cancel = new AbstractLink("cancel") {
private static final long serialVersionUID = 1L;
};
addCancelBehavior(cancel);
footer.add(cancel);
return footer;
}
@Override
protected void onDetach() {
super.onDetach();
newPasswordModel.detach();
}
}