package fr.openwide.core.wicket.more.link.descriptor.builder;
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 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.factory.BuilderLinkDescriptorFactory;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.factory.BuilderTargetFactories;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.main.NoMappableParameterMainStateImpl;
import fr.openwide.core.wicket.more.link.descriptor.builder.impl.pageinstance.CoreLinkDescriptorBuilderPageInstanceStateImpl;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.base.IBaseState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.main.INoMappableParameterMainState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.pageinstance.IPageInstanceState;
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.IEarlyTargetDefinitionTerminalState;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.terminal.ILateTargetDefinitionTerminalState;
import fr.openwide.core.wicket.more.link.descriptor.generator.IPageLinkGenerator;
import fr.openwide.core.wicket.more.link.model.PageModel;
/**
* A utility class for easily building link descriptors or link descriptor mappers with a fluent, type-safe API.
* <p>This class allows in particular to define:
* <ul>
* <li>The link target (page or resource)
* <li>The link parameters (models) and their mapping (HTTP query parameter name)
* <li>The link validations (is a permission required on one of the parameters, ...)
* </ul>
* <h1>Backward compatibility regarding target definitions</h1>
* <p>Due to backward-compatibility constraints, target definition may get a bit confusing.
* <p>For new uses of this class to build links to bookmarkable pages or resources, please use late target definition:
* begin your building code with <code>LinkDescriptorBuilder.start()</code> and finish in with one of the methods in
* {@link ILateTargetDefinitionTerminalState}. After that, refrain from calling
* {@link IEarlyTargetDefinitionTerminalState#build()} since it will only return an unusable link descriptor or mapper.
* <p>For building link descriptors to already-instantiated pages, please use {@link #toPageInstance(Page)} or
* {@link #toPageInstance(IModel)}
* <p>You may encounter legacy code using
* {@link LinkDescriptorBuilder#LinkDescriptorBuilder() LinkDescriptorBuilder's constructor} and
* {@link IEarlyTargetDefinitionTerminalState#build()}. This kind of use is called "early target definition" in this
* API's javadoc, and is deprecated because it does not allow defining dynamic targets based on parameters (as in
* {@link IChosenParameterState#page(fr.openwide.core.wicket.more.markup.html.factory.IDetachableFactory)} for instance).
*/
@SuppressWarnings("deprecation")
public class LinkDescriptorBuilder implements IBaseState {
/**
* Start building a link descriptor or a link descriptor mapper that will point to a page or to a resource.
*/
public static INoMappableParameterMainState<
Void,
IPageLinkDescriptor, IResourceLinkDescriptor, IImageResourceLinkDescriptor
> start() {
return new NoMappableParameterMainStateImpl<>(BuilderTargetFactories.late());
}
/**
* Start building a link descriptor or a link descriptor mapper that will point to an already-instantiated page.
* <p>This type of link descriptor hasn't got any parameter.
*/
public static IPageInstanceState<IPageLinkGenerator> toPageInstance(Page page) {
return toPageInstance(new PageModel<>(page));
}
/**
* Start building a link descriptor or a link descriptor mapper that will point to an already-instantiated page.
* <p>This type of link descriptor hasn't got any parameter.
*/
public static IPageInstanceState<IPageLinkGenerator> toPageInstance(IModel<? extends Page> pageInstanceModel) {
return new CoreLinkDescriptorBuilderPageInstanceStateImpl(pageInstanceModel);
}
/**
* @deprecated This constructor is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
public LinkDescriptorBuilder() { }
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public <P extends Page> INoMappableParameterMainState<
IPageLinkDescriptor,
Void, Void, Void
> page(Class<P> pageClass) {
return new NoMappableParameterMainStateImpl<>(
BuilderTargetFactories.early(BuilderLinkDescriptorFactory.page(), Model.of(pageClass))
);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public INoMappableParameterMainState<
IPageLinkDescriptor,
Void, Void, Void
> page(IModel<? extends Class<? extends Page>> pageClassModel) {
return new NoMappableParameterMainStateImpl<>(
BuilderTargetFactories.early(BuilderLinkDescriptorFactory.page(), pageClassModel)
);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public IPageInstanceState<IPageLinkGenerator> pageInstance(Page page) {
return toPageInstance(page);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public IPageInstanceState<IPageLinkGenerator> pageInstance(IModel<? extends Page> pageInstanceModel) {
return toPageInstance(pageInstanceModel);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public INoMappableParameterMainState<
IResourceLinkDescriptor,
Void, Void, Void
> resource(ResourceReference resourceReference) {
return new NoMappableParameterMainStateImpl<>(
BuilderTargetFactories.early(BuilderLinkDescriptorFactory.resource(), Model.of(resourceReference))
);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public INoMappableParameterMainState<
IResourceLinkDescriptor,
Void, Void, Void
> resource(IModel<? extends ResourceReference> resourceReferenceModel) {
return new NoMappableParameterMainStateImpl<>(
BuilderTargetFactories.early(BuilderLinkDescriptorFactory.resource(), resourceReferenceModel)
);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public INoMappableParameterMainState<
IImageResourceLinkDescriptor,
Void, Void, Void
> imageResource(ResourceReference resourceReference) {
return new NoMappableParameterMainStateImpl<>(
BuilderTargetFactories.early(BuilderLinkDescriptorFactory.imageResource(), Model.of(resourceReference))
);
}
/**
* @deprecated This method is a deprecated way of starting the build of a LinkDescriptor or a
* LinkDescriptorMapper. Please see the section about backward compatibility in {@link LinkDescriptorBuilder}.
*/
@Deprecated
@Override
public INoMappableParameterMainState<
IImageResourceLinkDescriptor,
Void, Void, Void
> imageResource(IModel<? extends ResourceReference> resourceReferenceModel) {
return new NoMappableParameterMainStateImpl<>(
BuilderTargetFactories.early(BuilderLinkDescriptorFactory.imageResource(), resourceReferenceModel)
);
}
}