package fr.openwide.core.wicket.more.link.descriptor.builder.impl.main; import java.util.Collection; import java.util.List; 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.mapper.CoreOneParameterLinkDescriptorMapperImpl; import fr.openwide.core.wicket.more.link.descriptor.builder.impl.parameter.LinkParameterTypeInformation; import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.IOneMappableParameterMainState; import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.ITwoMappableParameterMainState; import fr.openwide.core.wicket.more.link.descriptor.builder.state.parameter.chosen.IOneMappableParameterOneChosenParameterState; import fr.openwide.core.wicket.more.link.descriptor.mapper.IOneParameterLinkDescriptorMapper; import fr.openwide.core.wicket.more.markup.html.factory.IDetachableFactory; final class OneMappableParameterMainStateImpl < TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > extends AbstractGenericOneMappableParameterMainStateImpl < IOneMappableParameterMainState < TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor >, TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor, IOneParameterLinkDescriptorMapper < TEarlyTargetDefinitionLinkDescriptor, TParam1 >, IOneParameterLinkDescriptorMapper < TLateTargetDefinitionPageLinkDescriptor, TParam1 >, IOneParameterLinkDescriptorMapper < TLateTargetDefinitionResourceLinkDescriptor, TParam1 >, IOneParameterLinkDescriptorMapper < TLateTargetDefinitionImageResourceLinkDescriptor, TParam1 > > implements IOneMappableParameterMainState < TParam1, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > { OneMappableParameterMainStateImpl( NoMappableParameterMainStateImpl< TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > previousState, LinkParameterTypeInformation<TParam1> addedParameterType) { super(previousState, addedParameterType); } @Override public <TParam2> TwoMappableParameterMainStateImpl< TParam1, TParam2, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<TParam2> clazz) { return new TwoMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.valueOf(clazz) ); } @Override public <TParam2 extends Collection<TElement>, TElement> ITwoMappableParameterMainState< TParam1, TParam2, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<? super TParam2> clazz, Class<TElement> elementType) { return new TwoMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.collection(clazz, elementType) ); } @Override public <TParam2 extends Collection<?>> ITwoMappableParameterMainState< TParam1, TParam2, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<? super TParam2> clazz, TypeDescriptor elementTypeDescriptor) { return new TwoMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.collection(clazz, elementTypeDescriptor) ); } @Override public <TParam2 extends Collection<?>> ITwoMappableParameterMainState< TParam1, TParam2, TEarlyTargetDefinitionLinkDescriptor, TLateTargetDefinitionPageLinkDescriptor, TLateTargetDefinitionResourceLinkDescriptor, TLateTargetDefinitionImageResourceLinkDescriptor > model(Class<? super TParam2> clazz, TypeDescriptor elementTypeDescriptor, Supplier<? extends TParam2> emptyCollectionSupplier) { return new TwoMappableParameterMainStateImpl<>( this, LinkParameterTypeInformation.collection(clazz, elementTypeDescriptor, emptyCollectionSupplier) ); } private <TTarget, TLinkDescriptor> IOneParameterLinkDescriptorMapper<TLinkDescriptor, TParam1> createMapper(IBuilderLinkDescriptorFactory<TTarget, TLinkDescriptor> linkDescriptorFactory, IDetachableFactory<? extends Tuple, ? extends IModel<? extends TTarget>> pageClassFactory, List<Integer> parameterIndices) { return new CoreOneParameterLinkDescriptorMapperImpl<>( mapperLinkDescriptorFactory( linkDescriptorFactory, pageClassFactory, parameterIndices ) ); } private <TTarget, TLinkDescriptor> IOneParameterLinkDescriptorMapper<TLinkDescriptor, TParam1> createEarlyTargetDefinitionMapper( BuilderTargetFactories<TLinkDescriptor, TTarget, ?, ?, ?> targetFactories) { return createMapper( targetFactories.getEarlyTargetDefinitionLinkDescriptorFactory(), constantModelFactory(targetFactories.getEarlyTargetDefinitionTargetModel()), ImmutableList.<Integer>of() ); } @SuppressWarnings({"rawtypes", "unchecked"}) private class OneParameterChosenParameterStateImpl extends AbstractInternalChosenParameterStateImpl<OneParameterChosenParameterStateImpl> implements IOneMappableParameterOneChosenParameterState { @Override protected OneParameterChosenParameterStateImpl thisAsTSelf() { return this; } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionPageLinkDescriptor, TParam1> page(IDetachableFactory pageClassFactory) { return createMapper( getTargetFactories().getLateTargetDefinitionPageLinkDescriptorFactory(), pageClassFactory, getParameterIndices() ); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionResourceLinkDescriptor, TParam1> resource(IDetachableFactory resourceReferenceFactory) { return createMapper( getTargetFactories().getLateTargetDefinitionResourceLinkDescriptorFactory(), resourceReferenceFactory, getParameterIndices() ); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionImageResourceLinkDescriptor, TParam1> imageResource(IDetachableFactory resourceReferenceFactory) { return createMapper( getTargetFactories().getLateTargetDefinitionImageResourceLinkDescriptorFactory(), resourceReferenceFactory, getParameterIndices() ); } } private OneParameterChosenParameterStateImpl pickNone() { return new OneParameterChosenParameterStateImpl(); } @Override protected OneParameterChosenParameterStateImpl pickLast() { return pickNone().andFirst(); } @Override public IOneParameterLinkDescriptorMapper<TEarlyTargetDefinitionLinkDescriptor, TParam1> build() { return createEarlyTargetDefinitionMapper(getTargetFactories()); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionPageLinkDescriptor, TParam1> page( IModel<? extends Class<? extends Page>> pageClassModel) { return pickNone().page(constantModelFactory(pageClassModel)); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionResourceLinkDescriptor, TParam1> resource( IModel<? extends ResourceReference> resourceReferenceModel) { return pickNone().resource(constantModelFactory(resourceReferenceModel)); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionImageResourceLinkDescriptor, TParam1> imageResource( IModel<? extends ResourceReference> resourceReferenceModel) { return pickNone().imageResource(constantModelFactory(resourceReferenceModel)); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionPageLinkDescriptor, TParam1> page( Class<? extends Page> pageClass) { return page(Model.of(pageClass)); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionResourceLinkDescriptor, TParam1> resource( ResourceReference resourceReference) { return resource(Model.of(resourceReference)); } @Override public IOneParameterLinkDescriptorMapper<TLateTargetDefinitionImageResourceLinkDescriptor, TParam1> imageResource( ResourceReference resourceReference) { return imageResource(Model.of(resourceReference)); } }