package fr.openwide.core.wicket.more.link.descriptor.builder.impl.main; import java.util.Collection; import org.apache.wicket.Page; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.resource.ResourceReference; import org.javatuples.Tuple; import org.springframework.core.convert.TypeDescriptor; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; import fr.openwide.core.wicket.more.link.descriptor.builder.impl.factory.BuilderTargetFactories; import fr.openwide.core.wicket.more.link.descriptor.builder.impl.factory.IBuilderLinkDescriptorFactory; import fr.openwide.core.wicket.more.link.descriptor.builder.impl.parameter.LinkParameterTypeInformation; import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.INoMappableParameterMainState; import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.IOneMappableParameterMainState; import fr.openwide.core.wicket.more.markup.html.factory.ModelFactories; public final class NoMappableParameterMainStateImpl < TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > extends AbstractMainStateImpl < INoMappableParameterMainState < TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor >, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > implements INoMappableParameterMainState < TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > { public NoMappableParameterMainStateImpl( BuilderTargetFactories< TEarlyTargetDefinitionLinkDescriptor, ?, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > targetFactories) { super(targetFactories); } @Override public <TParam1> IOneMappableParameterMainState< TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<TParam1> clazz) { return new OneMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.valueOf(clazz) ); } @Override public <TParam1 extends Collection<TElement>, TElement> IOneMappableParameterMainState< TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<? super TParam1> clazz, Class<TElement> elementType) { return new OneMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.collection(clazz, elementType) ); } @Override public <TParam1 extends Collection<?>> IOneMappableParameterMainState< TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<? super TParam1> clazz, TypeDescriptor elementTypeDescriptor) { return new OneMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.collection(clazz, elementTypeDescriptor) ); } @Override public <TParam1 extends Collection<?>> IOneMappableParameterMainState< TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<? super TParam1> clazz, TypeDescriptor elementTypeDescriptor, Supplier<? extends TParam1> emptyCollectionSupplier) { return new OneMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.collection(clazz, elementTypeDescriptor, emptyCollectionSupplier) ); } private <TTarget, TLinkDescriptor> TLinkDescriptor createLinkDescriptor( IBuilderLinkDescriptorFactory<TTarget, TLinkDescriptor> linkDescriptorFactory, IModel<? extends TTarget> targetModel) { return mapperLinkDescriptorFactory( linkDescriptorFactory, ModelFactories.<IModel<? extends TTarget>, Tuple>constant(targetModel), ImmutableList.<Integer>of() ) .create(new Tuple() { private static final long serialVersionUID = 1L; @Override public int getSize() { return 0; } }); } private <TTarget, TLinkDescriptor> TLinkDescriptor createEarlyTargetDefinitionLinkDescriptor( BuilderTargetFactories<? extends TLinkDescriptor, TTarget, ?, ?, ?> targetFactories) { return createLinkDescriptor( targetFactories.getEarlyTargetDefinitionLinkDescriptorFactory(), targetFactories.getEarlyTargetDefinitionTargetModel() ); } @Override public TEarlyTargetDefinitionLinkDescriptor build() { return createEarlyTargetDefinitionLinkDescriptor(getTargetFactories()); } @Override public TLateTargetDefinitionPageLinkDescriptor page(IModel<? extends Class<? extends Page>> pageClassModel) { return createLinkDescriptor( getTargetFactories().getLateTargetDefinitionPageLinkDescriptorFactory(), pageClassModel ); } @Override public TLateTargetDefinitionResourceLinkDescriptor resource(IModel<? extends ResourceReference> resourceReferenceModel) { return createLinkDescriptor( getTargetFactories().getLateTargetDefinitionResourceLinkDescriptorFactory(), resourceReferenceModel ); } @Override public TLateTargetDefinitionImageResourceLinkDescriptor imageResource(IModel<? extends ResourceReference> resourceReferenceModel) { return createLinkDescriptor( getTargetFactories().getLateTargetDefinitionImageResourceLinkDescriptorFactory(), resourceReferenceModel ); } @Override public TLateTargetDefinitionPageLinkDescriptor page(Class<? extends Page> pageClass) { return page(Model.of(pageClass)); } @Override public TLateTargetDefinitionResourceLinkDescriptor resource(ResourceReference resourceReference) { return resource(Model.of(resourceReference)); } @Override public TLateTargetDefinitionImageResourceLinkDescriptor imageResource(ResourceReference resourceReference) { return imageResource(Model.of(resourceReference)); } }