package hu.sch.web.idm.pages.wizard; import hu.sch.domain.user.RegisteringUser; import hu.sch.util.PatternHolder; import hu.sch.services.RegistrationManagerLocal; import hu.sch.services.exceptions.InvalidNewbieStateException; import hu.sch.services.exceptions.PekEJBException; import hu.sch.services.exceptions.UserAlreadyExistsException; import hu.sch.services.exceptions.UserNotFoundException; import hu.sch.web.idm.pages.RegistrationFinishedPage; import javax.inject.Inject; import org.apache.wicket.RestartResponseException; import org.apache.wicket.extensions.markup.html.form.DateTextField; import org.apache.wicket.extensions.wizard.IWizardModel; import org.apache.wicket.extensions.wizard.Wizard; import org.apache.wicket.extensions.wizard.dynamic.DynamicWizardModel; import org.apache.wicket.extensions.wizard.dynamic.DynamicWizardStep; import org.apache.wicket.extensions.wizard.dynamic.IDynamicWizardStep; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.PasswordTextField; import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.markup.html.form.RadioGroup; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator; import org.apache.wicket.markup.html.form.validation.IFormValidator; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; import org.apache.wicket.validation.validator.EmailAddressValidator; import org.apache.wicket.validation.validator.PatternValidator; import org.apache.wicket.validation.validator.StringValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Regisztrációs varázsló. * Utókornak: sorry a sok belső osztályért, de így a legegyszerűbb megoldani, * hogy a formok ne veszítsenek el adatokat, peace ;) * * @author aldaris * @author balo */ public class RegisterWizard extends Wizard { private static final Logger logger = LoggerFactory.getLogger(RegisterWizard.class); // @Inject RegistrationManagerLocal registrationManager; // private RegisteringUser person = new RegisteringUser(); private String newPass; //ezek a mezők használva vannak a CPM által private String newPass2; private RegistrationMode regMode; public RegisterWizard(String id) { super(id, false); setDefaultModel(new CompoundPropertyModel<>(this)); IWizardModel model = new DynamicWizardModel(new RegistrationModeSelectStep()); init(model); //prevent duplicated feedback messages, PekPage already contains a feedbackpanel getForm().replace(new WebMarkupContainer(FEEDBACK_ID)); } @Override public void onCancel() { super.onCancel(); regMode = null; person = new RegisteringUser(); newPass = newPass2 = null; getWizardModel().reset(); } @Override public void onFinish() { super.onFinish(); try { registrationManager.doRegistration(person, newPass); } catch (UserNotFoundException | PekEJBException ex) { getSession().error("A regisztráció közben hiba lépett fel!"); logger.warn("Exception on finishing registration, RegisteringPerson=" + person.toString(), ex); throw new RestartResponseException(RegistrationFinishedPage.class); } getSession().info("Sikeres regisztráció!"); setResponsePage(RegistrationFinishedPage.class); } private class RegistrationModeSelectStep extends DynamicWizardStep { public RegistrationModeSelectStep() { super(null, new StringResourceModel("reg.modeselect.title", null), new StringResourceModel("reg.modeselect.help", null)); final RadioGroup<RegistrationMode> radioGroup = new RadioGroup<>("regMode"); ListView<RegistrationMode> lv = new ListView<RegistrationMode>("choiceList", new RegistrationModeListModel()) { @Override protected void populateItem(ListItem<RegistrationMode> item) { item.add(new Radio("radio", item.getModel())); item.add(new Label("name", new StringResourceModel(item.getModelObject().toString(), null))); } }; radioGroup.add(lv); radioGroup.setRequired(true); add(radioGroup); } @Override public boolean isLastStep() { return false; } @Override public IDynamicWizardStep next() { switch (regMode) { case ACTIVE_WITH_NEPTUN_CODE: person.setNewbie(false); return new NeptunLoginStep(this); case NEWBIE_WITH_NEPTUN_CODE: person.setNewbie(true); return new NeptunLoginStep(this); case NEWBIE_WITH_OM_CODE: person.setNewbie(true); return new EducationIdLoginStep(this); default: return new NeptunLoginStep(this); } } } private class NeptunLoginStep extends DynamicWizardStep { public NeptunLoginStep(IDynamicWizardStep previousStep) { super(previousStep, new StringResourceModel("reg.neptun.title", null), new StringResourceModel("reg.neptun.help", null)); final RequiredTextField<String> neptun = new RequiredTextField<>("person.neptun"); neptun.add(StringValidator.exactLength(6)); add(neptun); final DateTextField dob = new DateTextField("person.dateOfBirth", "yyyy.MM.dd."); dob.setRequired(true); add(dob); add(new IFormValidator() { @Override public FormComponent<?>[] getDependentFormComponents() { return new FormComponent<?>[]{neptun, dob}; } @Override public void validate(Form<?> form) { try { person.setDateOfBirth(dob.getConvertedInput()); person.setNeptun(neptun.getConvertedInput().toUpperCase()); if (!registrationManager.canUserRegisterWithNeptun(person)) { error(new StringResourceModel("reg.error.unknown", getForm(), null).getString()); } // } catch (UserNotFoundException | InvalidNewbieStateException ex) { error(new StringResourceModel(ex.getMessage(), getForm(), null).getString()); } catch (UserAlreadyExistsException ex) { error(new StringResourceModel(ex.getMessage(), getForm(), null, new Object[]{ex.getUid()}).getString()); } } }); } @Override public boolean isLastStep() { return false; } @Override public IDynamicWizardStep next() { return new PersonalInfoStep(this); } } private class EducationIdLoginStep extends DynamicWizardStep { public EducationIdLoginStep(IDynamicWizardStep previousStep) { super(previousStep, new StringResourceModel("reg.educationId.title", null), new StringResourceModel("reg.educationId.help", null)); final RequiredTextField<String> educationId = new RequiredTextField<>("person.educationId"); educationId.add(new PatternValidator(PatternHolder.EDUCATION_ID_PATTERN)); add(educationId); final DateTextField dob = new DateTextField("person.dateOfBirth", "yyyy.MM.dd."); dob.setRequired(true); add(dob); add(new IFormValidator() { @Override public FormComponent<?>[] getDependentFormComponents() { return new FormComponent<?>[]{educationId, dob}; } @Override public void validate(Form<?> form) { try { person.setDateOfBirth(dob.getConvertedInput()); person.setEducationId(educationId.getConvertedInput()); if (!registrationManager.canUserRegisterWithEducationId(person)) { error(new StringResourceModel("reg.error.unknown", getForm(), null).getString()); } // } catch (UserNotFoundException | InvalidNewbieStateException ex) { error(new StringResourceModel(ex.getMessage(), getForm(), null).getString()); } catch (UserAlreadyExistsException ex) { error(new StringResourceModel(ex.getMessage(), getForm(), null, new Object[]{ex.getUid()}).getString()); } } }); } @Override public boolean isLastStep() { return false; } @Override public IDynamicWizardStep next() { return new PersonalInfoStep(this); } } private class PersonalInfoStep extends DynamicWizardStep { public PersonalInfoStep(IDynamicWizardStep previousStep) { super(previousStep, new StringResourceModel("reg.personalinfo.title", null), new StringResourceModel("reg.personalinfo.help", null)); RequiredTextField<String> mail = new RequiredTextField<>("person.mail"); mail.add(EmailAddressValidator.getInstance()); add(mail); RequiredTextField<String> sn = new RequiredTextField<>("person.lastName"); sn.add(new PatternValidator(PatternHolder.NAME_PATTERN)); add(sn); RequiredTextField<String> givenName = new RequiredTextField<>("person.firstName"); givenName.add(new PatternValidator(PatternHolder.NAME_PATTERN)); add(givenName); } @Override public boolean isLastStep() { return false; } @Override public IDynamicWizardStep next() { return new NewAccountStep(this); } } private class NewAccountStep extends DynamicWizardStep { public NewAccountStep(DynamicWizardStep previousStep) { super(previousStep, new StringResourceModel("reg.new.user.title", null), new StringResourceModel("reg.new.user.help", null)); final RequiredTextField<String> uidField = new RequiredTextField<>("person.screenName"); uidField.add(new PatternValidator(PatternHolder.UID_PATTERN)); uidField.add(StringValidator.lengthBetween(2, 10)); uidField.add(new IValidator<String>() { @Override public void validate(final IValidatable<String> validatable) { final String uid = validatable.getValue(); if (registrationManager.isUidTaken(uid)) { validatable.error(new ValidationError().addKey("reg.error.existing.user")); } } }); add(uidField); PasswordTextField pwdTF = new PasswordTextField("newPass"); pwdTF.add(StringValidator.minimumLength(6)); PasswordTextField pwdTF2 = new PasswordTextField("newPass2"); add(pwdTF, pwdTF2); add(new EqualPasswordInputValidator(pwdTF, pwdTF2)); } @Override public boolean isLastStep() { return true; } @Override public IDynamicWizardStep next() { return null; } } }