package fr.openwide.core.wicket.more.link.descriptor.builder.state.main;
import java.util.Collection;
import org.springframework.core.convert.TypeDescriptor;
import com.google.common.base.Supplier;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.common.IMainState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.common.IMappableParameterDeclarationState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.generic.IGenericTwoMappableParameterMainState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.parameter.chosen.common.IChosenParameterState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.terminal.IBackwardCompatibleTerminalState;
import fr.openwide.core.wicket.more.link.descriptor.mapper.ITwoParameterLinkDescriptorMapper;
/**
* A builder state with two mappable parameters from which one may:
* <ul>
* <li>call any of the {@link IMainState} methods to map parameters and defined validators
* <li>call {@link #pickFirst()} or {@link #pickSecond()} to choose among mappable parameters and then use any of the
* {@link IChosenParameterState} methods, allowing to reference these mappable parameters without them being entirely
* defined (no model was provided yet).
* <li>add another mappable parameter by calling the {@link #model(Class)} method.
* <li>end the build with one of the {@link IBackwardCompatibleTerminalState} methods.
* </ul>
*/
public interface ITwoMappableParameterMainState
<
TParam1, TParam2,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
>
extends IGenericTwoMappableParameterMainState
<
ITwoMappableParameterMainState
<
TParam1, TParam2,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
>,
TParam1, TParam2,
ITwoParameterLinkDescriptorMapper
<
TEarlyTargetDefinitionLinkDescriptor,
TParam1, TParam2
>,
ITwoParameterLinkDescriptorMapper
<
TLateTargetDefinitionPageLinkDescriptor,
TParam1, TParam2
>,
ITwoParameterLinkDescriptorMapper
<
TLateTargetDefinitionResourceLinkDescriptor,
TParam1, TParam2
>,
ITwoParameterLinkDescriptorMapper
<
TLateTargetDefinitionImageResourceLinkDescriptor,
TParam1, TParam2
>
>,
IMappableParameterDeclarationState {
@Override
<TParam3> IThreeMappableParameterMainState<
TParam1, TParam2, TParam3,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
> model(Class<TParam3> clazz);
@Override
<TParam3 extends Collection<TElement>, TElement> IThreeMappableParameterMainState<
TParam1, TParam2, TParam3,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
> model(Class<? super TParam3> clazz, Class<TElement> elementType);
@Override
<TParam3 extends Collection<?>> IThreeMappableParameterMainState<
TParam1, TParam2, TParam3,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
> model(Class<? super TParam3> clazz, TypeDescriptor elementTypeDescriptor);
@Override
<TParam3 extends Collection<?>> IThreeMappableParameterMainState<
TParam1, TParam2, TParam3,
TEarlyTargetDefinitionLinkDescriptor,
TLateTargetDefinitionPageLinkDescriptor,
TLateTargetDefinitionResourceLinkDescriptor,
TLateTargetDefinitionImageResourceLinkDescriptor
> model(Class<? super TParam3> clazz, TypeDescriptor elementTypeDescriptor,
Supplier<? extends TParam3> emptyCollectionSupplier);
}