package fr.openwide.maven.artifact.notifier.web.application.common.component.navigation; import java.util.Map; import org.apache.wicket.model.IDetachable; import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.lang.Args; import com.google.common.collect.Maps; /** * Représente des {@link PageParameters} qui ne sont pas figés, et qui en particulier peuvent changer entre deux rafraîchissements en Ajax.<br> * Ce mécanisme ne peut pas être implémenté directement au niveau des PageParameters, car on référence des IModels qui doivent être détachés. */ public class DynamicPageParameters implements IDetachable { private static final long serialVersionUID = -9066291686294702275L; private final PageParameters baseStaticParameters; private final Map<String, IModel<?>> dynamicParametersMap; public DynamicPageParameters() { this(new PageParameters()); } public DynamicPageParameters(PageParameters baseStaticParameters) { this.baseStaticParameters = new PageParameters(baseStaticParameters); this.dynamicParametersMap = Maps.newLinkedHashMap(); } public DynamicPageParameters(DynamicPageParameters copy) { this.baseStaticParameters = new PageParameters(copy.baseStaticParameters); this.dynamicParametersMap = Maps.newLinkedHashMap(copy.dynamicParametersMap); } public DynamicPageParameters add(String name, IModel<?> valueModel) { Args.notNull(name, "name"); Args.notNull(valueModel, "valueModel"); dynamicParametersMap.put(name, valueModel); return this; } public PageParameters buildStaticPageParameters() { PageParameters result = new PageParameters(baseStaticParameters); for (Map.Entry<String, IModel<?>> parameter : dynamicParametersMap.entrySet()) { Object value = parameter.getValue().getObject(); if (value != null) { result.add(parameter.getKey(), parameter.getValue().getObject()); } } return result; } @Override public void detach() { for (Map.Entry<String, IModel<?>> parameter : dynamicParametersMap.entrySet()) { parameter.getValue().detach(); } } }