package fr.openwide.core.wicket.more.link.descriptor.parameter.mapping; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.lang.Args; import org.bindgen.BindingRoot; import org.javatuples.Unit; import com.google.common.collect.ImmutableList; import fr.openwide.core.wicket.more.link.descriptor.parameter.injector.LinkParameterInjectionException; import fr.openwide.core.wicket.more.link.descriptor.parameter.mapping.factory.AbstractLinkParameterMappingEntryFactory; import fr.openwide.core.wicket.more.link.descriptor.parameter.mapping.factory.ILinkParameterMappingEntryFactory; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.ILinkParameterValidator; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.SimpleMandatoryLinkParameterValidator; import fr.openwide.core.wicket.more.link.service.ILinkParameterConversionService; import fr.openwide.core.wicket.more.model.BindingModel; public class InjectOnlyLinkParameterMappingEntry<T> extends AbstractLinkParameterMappingEntry { private static final long serialVersionUID = -5638280709363241126L; protected final String parameterName; protected final IModel<? extends T> mappedModel; public static <T> ILinkParameterMappingEntryFactory<Unit<IModel<? extends T>>> factory(final String parameterName) { Args.notNull(parameterName, "parameterName"); return new AbstractLinkParameterMappingEntryFactory<Unit<IModel<? extends T>>>() { private static final long serialVersionUID = 1L; @Override public ILinkParameterMappingEntry create(Unit<IModel<? extends T>> parameters) { return new InjectOnlyLinkParameterMappingEntry<T>(parameterName, parameters.getValue0()); } }; } public static <R, T> ILinkParameterMappingEntryFactory<Unit<IModel<? extends R>>> factory(final String parameterName, final BindingRoot<R, T> bindingRoot) { Args.notNull(parameterName, "parameterName"); Args.notNull(bindingRoot, "bindingRoot"); return new AbstractLinkParameterMappingEntryFactory<Unit<IModel<? extends R>>>() { private static final long serialVersionUID = 1L; @Override public ILinkParameterMappingEntry create(Unit<IModel<? extends R>> parameters) { return new InjectOnlyLinkParameterMappingEntry<T>(parameterName, BindingModel.of(parameters.getValue0(), bindingRoot)); } }; } public InjectOnlyLinkParameterMappingEntry(String parameterName, IModel<? extends T> mappedModel) { this.parameterName = parameterName; this.mappedModel = mappedModel; } @Override public void inject(PageParameters targetParameters, ILinkParameterConversionService conversionService) throws LinkParameterInjectionException { inject(targetParameters, conversionService, parameterName, mappedModel.getObject()); } @Override public void extract(PageParameters sourceParameters, ILinkParameterConversionService conversionService) { // Nothing to do } @Override public ILinkParameterMappingEntry wrap(Component component) { IModel<? extends T> wrappedModel = wrap(mappedModel, component); return new InjectOnlyLinkParameterMappingEntry<T>(parameterName, wrappedModel); } @Override public ILinkParameterValidator mandatoryValidator() { return new SimpleMandatoryLinkParameterValidator( ImmutableList.of(parameterName), ImmutableList.<IModel<?>>of() // The model is not mandatory : we won't extract it anyway ); } @Override public void detach() { mappedModel.detach(); } }