package fr.openwide.core.basicapp.web.application.administration.template; import org.apache.wicket.Component; import org.apache.wicket.Page; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import com.google.common.base.Function; 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.UserTypeDescriptor; import fr.openwide.core.basicapp.web.application.navigation.link.LinkFactory; import fr.openwide.core.commons.util.functional.SerializableFunction; import fr.openwide.core.wicket.more.link.descriptor.IPageLinkDescriptor; import fr.openwide.core.wicket.more.link.descriptor.builder.LinkDescriptorBuilder; import fr.openwide.core.wicket.more.link.descriptor.mapper.ITwoParameterLinkDescriptorMapper; import fr.openwide.core.wicket.more.link.descriptor.parameter.CommonParameters; import fr.openwide.core.wicket.more.link.model.PageModel; import fr.openwide.core.wicket.more.markup.html.factory.DetachableFactories; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.model.BindingModel; import fr.openwide.core.wicket.more.model.GenericEntityModel; import fr.openwide.core.wicket.more.model.ReadOnlyModel; public class AdministrationUserDescriptionTemplate<U extends User> extends AdministrationTemplate { private static final long serialVersionUID = -550100874222819991L; private static final Function<User, Class<? extends Page>> USER_TO_FICHE_CLASS_FUNCTION = new SerializableFunction<User, Class<? extends Page>>() { private static final long serialVersionUID = 1L; @Override public Class<? extends Page> apply(User input) { return input == null ? null : UserTypeDescriptor.get(input).administrationTypeDescriptor().getDescriptionClass(); } }; public static final <U extends User> ITwoParameterLinkDescriptorMapper<IPageLinkDescriptor, U, Page> mapper() { return mapper(User.class).<U>castParameter1(); } private static final <U extends User> ITwoParameterLinkDescriptorMapper<IPageLinkDescriptor, U, Page> mapper(Class<U> clazz) { return LinkDescriptorBuilder.start() .model(clazz) .model(Page.class) .pickFirst().map(CommonParameters.ID).mandatory() .pickSecond().map(CommonParameters.SOURCE_PAGE_ID).optional() .pickFirst().page(DetachableFactories.forUnit( ReadOnlyModel.<U, Class<? extends Page>>factory(USER_TO_FICHE_CLASS_FUNCTION) )); } protected final UserTypeDescriptor<U> typeDescriptor; protected final IModel<U> userModel = new GenericEntityModel<Long, U>(null); protected final IModel<Page> sourcePageModel = new PageModel<Page>(); public AdministrationUserDescriptionTemplate(PageParameters parameters, UserTypeDescriptor<U> typeDescriptor) { super(parameters); this.typeDescriptor = typeDescriptor; mapper(typeDescriptor.getEntityClass()).map(userModel, sourcePageModel) .extractSafely( parameters, typeDescriptor.administrationTypeDescriptor().portfolio(), getString("common.error.unexpected") ); add( new Label("pageTitle", BindingModel.of(userModel, Bindings.user().fullName())) ); Component backToSourcePage = LinkFactory.get().linkGenerator( sourcePageModel, typeDescriptor.administrationTypeDescriptor().getPortfolioClass() ) .link("backToSourcePage").hideIfInvalid(); add( backToSourcePage, typeDescriptor.administrationTypeDescriptor().portfolio().link("backToList") .add(Condition.componentVisible(backToSourcePage).thenHide()) ); } @Override protected void onDetach() { super.onDetach(); userModel.detach(); sourcePageModel.detach(); } @Override protected Class<? extends WebPage> getSecondMenuPage() { return typeDescriptor.administrationTypeDescriptor().getPortfolioClass(); } }