package fr.openwide.core.wicket.more.link.descriptor.builder.impl.factory; import java.util.List; import java.util.Map; import org.apache.wicket.Page; import org.apache.wicket.model.IModel; import org.apache.wicket.request.resource.ResourceReference; import org.javatuples.Pair; import org.javatuples.Tuple; import fr.openwide.core.wicket.more.link.descriptor.IImageResourceLinkDescriptor; import fr.openwide.core.wicket.more.link.descriptor.IPageLinkDescriptor; import fr.openwide.core.wicket.more.link.descriptor.IResourceLinkDescriptor; import fr.openwide.core.wicket.more.link.descriptor.builder.impl.parameter.LinkParameterMappingEntryBuilder; import fr.openwide.core.wicket.more.link.descriptor.impl.CoreImageResourceLinkDescriptorImpl; import fr.openwide.core.wicket.more.link.descriptor.impl.CorePageLinkDescriptorImpl; import fr.openwide.core.wicket.more.link.descriptor.impl.CoreResourceLinkDescriptorImpl; import fr.openwide.core.wicket.more.link.descriptor.parameter.mapping.ILinkParameterMappingEntry; import fr.openwide.core.wicket.more.link.descriptor.parameter.mapping.LinkParametersMapping; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.ILinkParameterValidator; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.LinkParameterValidators; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.factory.ILinkParameterValidatorFactory; import fr.openwide.core.wicket.more.markup.html.factory.IDetachableFactory; public abstract class BuilderLinkDescriptorFactory<TTarget, TLinkDescriptor> implements IBuilderLinkDescriptorFactory<TTarget, TLinkDescriptor> { private static final long serialVersionUID = 1L; private BuilderLinkDescriptorFactory() { } @Override public TLinkDescriptor create(IModel<? extends TTarget> target, Iterable<? extends ILinkParameterMappingEntry> parameterMappingEntries, Iterable<? extends ILinkParameterValidator> validators) { LinkParametersMapping parametersMapping = new LinkParametersMapping(parameterMappingEntries); ILinkParameterValidator validator = LinkParameterValidators.chain(validators); return create(target, parametersMapping, validator); } protected abstract TLinkDescriptor create(IModel<? extends TTarget> target, LinkParametersMapping parametersMapping, ILinkParameterValidator validator); @Override public IBuilderMapperLinkDescriptorFactory<TLinkDescriptor> forMapper( Pair< ? extends IDetachableFactory<? extends Tuple, ? extends IModel<? extends TTarget>>, ? extends List<Integer> > targetFactory, Map<LinkParameterMappingEntryBuilder<?>, List<Integer>> mappingEntryBuilders, Map<ILinkParameterValidatorFactory<?>, List<Integer>> validatorFactories) { return new BuilderMapperLinkDescriptorFactory<>( this, targetFactory, mappingEntryBuilders, validatorFactories ); } @SuppressWarnings("unchecked") // Works for any T that extends Serializable public static <T> IBuilderLinkDescriptorFactory<T, Void> none() { return NONE; } @SuppressWarnings("rawtypes") private static final BuilderLinkDescriptorFactory NONE = new BuilderLinkDescriptorFactory<Object, Void>() { private static final long serialVersionUID = 1L; @Override public void detach() { // Nothing to do } @Override protected Void create(IModel<?> target, LinkParametersMapping parametersMapping, ILinkParameterValidator validator) { return null; } private Object readResolve() { return NONE; } }; public static IBuilderLinkDescriptorFactory<Class<? extends Page>, IPageLinkDescriptor> page() { return PAGE; } private static final BuilderLinkDescriptorFactory<Class<? extends Page>, IPageLinkDescriptor> PAGE = new BuilderLinkDescriptorFactory<Class<? extends Page>, IPageLinkDescriptor>() { private static final long serialVersionUID = 1L; @Override public void detach() { // Nothing to do } @Override protected IPageLinkDescriptor create(IModel<? extends Class<? extends Page>> target, LinkParametersMapping parametersMapping, ILinkParameterValidator validator) { return new CorePageLinkDescriptorImpl(target, parametersMapping, validator); } private Object readResolve() { return PAGE; } }; public static IBuilderLinkDescriptorFactory<ResourceReference, IResourceLinkDescriptor> resource() { return RESOURCE; } private static final BuilderLinkDescriptorFactory<ResourceReference, IResourceLinkDescriptor> RESOURCE = new BuilderLinkDescriptorFactory<ResourceReference, IResourceLinkDescriptor>() { private static final long serialVersionUID = 1L; @Override public void detach() { // Nothing to do } @Override protected IResourceLinkDescriptor create(IModel<? extends ResourceReference> target, LinkParametersMapping parametersMapping, ILinkParameterValidator validator) { return new CoreResourceLinkDescriptorImpl(target, parametersMapping, validator); } private Object readResolve() { return RESOURCE; } }; public static IBuilderLinkDescriptorFactory<ResourceReference, IImageResourceLinkDescriptor> imageResource() { return IMAGE_RESOURCE; } private static final BuilderLinkDescriptorFactory<ResourceReference, IImageResourceLinkDescriptor> IMAGE_RESOURCE = new BuilderLinkDescriptorFactory<ResourceReference, IImageResourceLinkDescriptor>() { private static final long serialVersionUID = 1L; @Override public void detach() { // Nothing to do } @Override protected IImageResourceLinkDescriptor create(IModel<? extends ResourceReference> target, LinkParametersMapping parametersMapping, ILinkParameterValidator validator) { return new CoreImageResourceLinkDescriptorImpl(target, parametersMapping, validator); } private Object readResolve() { return IMAGE_RESOURCE; } }; }