package fr.openwide.maven.artifact.notifier.web.application.project.form; import java.util.Collections; 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.TextField; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidationError; import org.apache.wicket.validation.ValidationError; import org.apache.wicket.validation.validator.PatternValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.openwide.core.spring.util.StringUtils; 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.project.model.Project; import fr.openwide.maven.artifact.notifier.core.business.project.model.ProjectVersion; import fr.openwide.maven.artifact.notifier.core.business.project.service.IProjectService; import fr.openwide.maven.artifact.notifier.core.business.project.service.IProjectVersionService; import fr.openwide.maven.artifact.notifier.core.util.binding.Binding; import fr.openwide.maven.artifact.notifier.web.application.common.behavior.AuthenticatedOnlyBehavior; public class ProjectVersionFormPopupPanel extends AbstractAjaxModalPopupPanel<ProjectVersion> { private static final long serialVersionUID = 4914283916847151778L; private static final Logger LOGGER = LoggerFactory.getLogger(ProjectVersionFormPopupPanel.class); @SpringBean private IProjectService projectService; @SpringBean private IProjectVersionService projectVersionService; private FormPanelMode mode; private Form<ProjectVersion> form; public ProjectVersionFormPopupPanel(String id, FormPanelMode mode) { this(id, new GenericEntityModel<Long, ProjectVersion>(null), mode); } public ProjectVersionFormPopupPanel(String id, IModel<ProjectVersion> projectVersionModel) { this(id, projectVersionModel, FormPanelMode.EDIT); } public ProjectVersionFormPopupPanel(String id, IModel<ProjectVersion> projectVersionModel, FormPanelMode mode) { super(id, projectVersionModel); this.mode = mode; add(new AuthenticatedOnlyBehavior()); } @Override protected Component createHeader(String wicketId) { if (isAddMode()) { return new Label(wicketId, new ResourceModel("project.version.add")); } else { return new Label(wicketId, new StringResourceModel("project.version.edit", getModel())); } } @Override protected Component createBody(String wicketId) { DelegatedMarkupPanel body = new DelegatedMarkupPanel(wicketId, ProjectVersionFormPopupPanel.class); form = new Form<ProjectVersion>("form", getModel()); body.add(form); TextField<String> versionField = new TextField<String>("version", BindingModel.of(getModel(), Binding.projectVersion().version())) { private static final long serialVersionUID = 1L; @Override protected void onConfigure() { super.onConfigure(); setVisible(ProjectVersionFormPopupPanel.this.isAddMode()); } }; versionField.setLabel(new ResourceModel("project.version.field.version")); versionField.setRequired(isAddMode()); versionField.add(new ProjectVersionPatternValidator()); form.add(versionField); form.add(new VersionAdditionalInformationFormComponentPanel("additionalInformationPanel", BindingModel.of(getModel(), Binding.projectVersion().additionalInformation()))); return body; } @Override protected Component createFooter(String wicketId) { DelegatedMarkupPanel footer = new DelegatedMarkupPanel(wicketId, ProjectVersionFormPopupPanel.class); // Validate button AjaxButton validate = new AjaxButton("save", form) { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { ProjectVersion projectVersion = ProjectVersionFormPopupPanel.this.getModelObject(); if (StringUtils.hasText(projectVersion.getVersion())) { try { if (isAddMode()) { ProjectVersion duplicate = projectVersionService.getByProjectAndVersion(getProject(), projectVersion.getVersion()); if (duplicate == null) { projectService.createProjectVersion(getProject(), projectVersion); getSession().success(getString("project.version.add.success")); closePopup(target); target.add(getPage()); } else { LOGGER.warn("A project version with the same version already exists"); getSession().error(getString("project.version.add.notUnique")); } } else { projectVersionService.update(projectVersion); getSession().success(getString("project.version.edit.success")); closePopup(target); target.add(getPage()); } } catch (Exception e) { if (isAddMode()) { LOGGER.error("Error occured while adding the project version", e); getSession().error(getString("project.version.add.error")); } else { LOGGER.error("Error occured while updating the project version", e); getSession().error(getString("project.version.edit.error")); } } } FeedbackUtils.refreshFeedback(target, getPage()); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { FeedbackUtils.refreshFeedback(target, getPage()); } }; validate.add(new Label("validateLabel", new ResourceModel("common.action.save"))); 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 protected void onShow(AjaxRequestTarget target) { super.onShow(target); if (isAddMode()) { ProjectVersion version = new ProjectVersion(null); getModel().setObject(version); } } protected Project getProject() { return null; } public class ProjectVersionPatternValidator extends PatternValidator { private static final long serialVersionUID = 315971574858314679L; private static final String PROJECT_VERSION_VALIDATION_PATTERN = "[\\w-_\\.]{1,20}"; public ProjectVersionPatternValidator() { super(PROJECT_VERSION_VALIDATION_PATTERN); } @Override protected IValidationError decorate(IValidationError error, IValidatable<String> validatable) { ((ValidationError) error).setKeys(Collections.singletonList("project.version.field.version.malformed")); return error; } } }