package fr.openwide.core.basicapp.web.application.notification.service; import java.util.Date; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.ImmutableList; import fr.openwide.core.basicapp.core.business.notification.service.IBasicApplicationNotificationContentDescriptorFactory; import fr.openwide.core.basicapp.core.business.user.model.User; import fr.openwide.core.basicapp.core.util.binding.Bindings; import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.NotificationUserTypeDescriptor; import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.UserTypeDescriptor; import fr.openwide.core.basicapp.web.application.common.util.ResourceKeyGenerator; import fr.openwide.core.basicapp.web.application.notification.component.ExampleHtmlNotificationPanel; import fr.openwide.core.basicapp.web.application.notification.component.SimpleUserActionHtmlNotificationPanel; import fr.openwide.core.spring.notification.model.INotificationContentDescriptor; import fr.openwide.core.wicket.more.link.descriptor.generator.ILinkGenerator; import fr.openwide.core.wicket.more.link.descriptor.mapper.ITwoParameterLinkDescriptorMapper; import fr.openwide.core.wicket.more.model.BindingModel; import fr.openwide.core.wicket.more.model.GenericEntityModel; import fr.openwide.core.wicket.more.notification.service.AbstractNotificationContentDescriptorFactory; import fr.openwide.core.wicket.more.notification.service.IWicketContextProvider; @Service("BasicApplicationNotificationPanelRendererService") public class BasicApplicationNotificationContentDescriptorFactoryImpl extends AbstractNotificationContentDescriptorFactory implements IBasicApplicationNotificationContentDescriptorFactory { @Autowired public BasicApplicationNotificationContentDescriptorFactoryImpl(IWicketContextProvider contextProvider) { super(contextProvider); } @Override public INotificationContentDescriptor example(final User user, final Date date) { return new AbstractSimpleWicketNotificationDescriptor("notification.panel.example") { @Override public Object getSubjectParameter() { return user; } @Override public Iterable<?> getSubjectPositionalParameters() { return ImmutableList.of(user.getFullName(), date); } @Override public Component createComponent(String wicketId) { return new ExampleHtmlNotificationPanel(wicketId, GenericEntityModel.of(user), Model.of(date)); } }; } @Override public INotificationContentDescriptor userPasswordRecoveryRequest(final User user) { final ITwoParameterLinkDescriptorMapper<? extends ILinkGenerator, User, String> mapper; switch (user.getPasswordRecoveryRequest().getType()) { case CREATION: mapper = UserTypeDescriptor.get(user).securityTypeDescriptor().passwordCreationPageLinkDescriptorMapper(); break; case RESET: mapper = UserTypeDescriptor.get(user).securityTypeDescriptor().passwordResetPageLinkDescriptorMapper(); break; default: throw new IllegalStateException("Recovery request type unknown."); } String actionMessageKeyPart = "password.recovery.request." + user.getPasswordRecoveryRequest().getType().name() + "." + user.getPasswordRecoveryRequest().getInitiator().name(); final ResourceKeyGenerator keyGenerator = NotificationUserTypeDescriptor.USER.resourceKeyGenerator() .append(actionMessageKeyPart); return new AbstractSimpleWicketNotificationDescriptor(keyGenerator.resourceKey()) { @Override public IModel<?> getSubjectParameter() { return GenericEntityModel.of(user); } @Override public Component createComponent(String wicketId) { IModel<User> userModel = GenericEntityModel.of(user); return new SimpleUserActionHtmlNotificationPanel<>( wicketId, keyGenerator, userModel, userModel, Model.of(new Date()), mapper.map(userModel, BindingModel.of(userModel, Bindings.user().passwordRecoveryRequest().token())) ); } }; } }