[aerogear-dev] [ag-controller] PaginationStrategy
Daniel Bevenius
daniel.bevenius at gmail.com
Fri Feb 22 04:10:47 EST 2013
>I'm just not sure about the producers, it looks like too much.
Yeah, it is actually not required to have a producer, you can simply
implement PaginationStrategy and that is enough. I'll remove the producer
part from the doc before I add this to the user guide.
Thanks
On 22 February 2013 10:07, Bruno Oliveira <bruno at abstractj.org> wrote:
> Hi Dan!
>
> +1 for
>
>
> - Extend AbstractPaginationStrategy
> - Implement PaginationStrategy
>
>
> I'm just not sure about the producers, it looks like too much.
>
>
> --
> "The measure of a man is what he does with power" - Plato
> -
> @abstractj
> -
> Volenti Nihil Difficile
>
> On Tuesday, February 19, 2013 at 10:51 AM, Daniel Bevenius wrote:
>
> For AEROGEAR-863 "Make PagingStrategy pluggable" the following suggestion
> is being proposed:
>
> Custom PaginationStrategy
>
> This section describes how a custom pagination strategy can be implemented
> in AeroGear Controller.
> Depending on if you need a completely different strategy, or if you simply
> want to change/add/rename the returned HTTP response headers, you have two
> options:
>
> - Extend AbstractPaginationStrategy
> - Implement PaginationStrategy
>
> <https://gist.github.com/danbev/ed51e57e9a1f718f1848#extend-abstractpaginationstrategy>Extend
> AbstractPaginationStrategy
>
> You would extend AbstractPaginationStrategy if you simply want to
> change/add/rename the returned HTTP response headers.
> <https://gist.github.com/danbev/ed51e57e9a1f718f1848#example-of-extending-abstractpaginationstrategy>Example
> of extending AbstractPaginationStrategy:
>
> public class MyStrategy extends AbstractPaginationStrategy {
>
> @Override
> public void setResponseHeaders(PaginationMetadata md,
> HttpServletResponse response,
> int resultSize) {
> for (Entry<String, String> entry : md.getHeaders(resultSize).entrySet()) {
> response.setHeader(entry.getKey(), entry.getValue());
> }
> }
> }
>
> This implementation actually does exactly what the default implementation
> does. But you can of course modify this to suite your own requirements. You
> have access to all the metadata<http://aerogear.org/docs/specs/aerogear-controller/org/jboss/aerogear/controller/router/rest/pagination/PagingMetadata.html> for
> the pagination, like the raw links<http://aerogear.org/docs/specs/aerogear-controller/org/jboss/aerogear/controller/router/rest/pagination/Links.html> etc,
> so you could assemble headers in any way you see fit.
> <https://gist.github.com/danbev/ed51e57e9a1f718f1848#implement-paginationstrategy>Implement
> PaginationStrategy
>
> This will give you more control over the pagination strategy. The
> interface you have to implement looks like this:
>
> /** * A strategy for implementing pagination in AeroGear Controller. */public interface PaginationStrategy {
>
> /** * Creates a PaginationInfo instance. * How this information is gathered, be it from an Annotation on the target * endpoint method, or by using separate request parameters is up to the * concrete implementation. * * @param routeContext the {@link RouteContext} of the route being processed. * @param arguments the extracted arguments from the current request. * @return {@link PaginationInfo} the information requred for paging. */
> PaginationInfo createPaginationInfo(RouteContext routeContext,
> Map<String, Object> arguments);
>
> /** * Called before the target endpoint method has been invoked and enables a * concrete strategy to manipulate the arguments that will be passed to * the target endpoint method. * * @param pagingInfo the {@link PaginationInfo} instance created by * this strategy. * @param arguments the extracted arguments from the current request. * * @return {@code Object[]} the arguments that will be passed to the target * endpoint method. */
> Object[] preInvocation(PaginationInfo pagingInfo, Map<String, Object> arguments);
>
> /** * Called after the target endpoint method has been invoked and * allows the strategy to set HTTP Response headers. * * @param result the result returned from the target endpoint method. * @param routeContext the {@link RouteContext}. * @param pagingInfo the {@link PaginationInfo} instance created by this strategy. * * @return {@code Object} Either the unchanged result or a modified result * depending on the underlying implementation. */
> Object postInvocation(Object result,
> RouteContext routeContext,
> PaginationInfo pagingInfo);
> }
>
> The createPaginationInfo method is called by AeroGear Controller prior to
> invoking the target endpoint method. The arguments extracted from the
> current request are made available to this method. The implementation can
> choose whatever way it likes to match information from the request that are
> related to pagination. This could be using an annotation on the target
> endpoint method (which is what the default implementation does) or it could
> simply pick known parameters from the request.
>
> The preInvocation methods gives the strategy a chance to modify the
> actual arguments that will be used to invoke the target endpoint method.
> Depending on the concrete implementation there might not be anything to be
> done here other than simply returning the value of the arguments map. But,
> for example with the default strategy, an endpoint has the option to accept
> a PaginationInfo type a parameter. In this case we have to add this
> instance to the arguments before calling the endpoint.
>
> The postInvocation method is called after the target endpoint method has
> been invoked allows the strategy to set the HTTP Response headers. This
> method has access to the results of the invocation which is can use to
> decide on what links should be returned, for example one might not want to
> return a previous next link header if there is no more data (the number of
> items in the results is less than the limit).
> <https://gist.github.com/danbev/ed51e57e9a1f718f1848#configuring-the-strategy-to-be-used>Configuring
> the Strategy to be used
>
> Configuration is done by adding a CDI Producer, for example:
>
> public class PaginationStrategyProducer {
>
> @Produces
> public PaginationStrategy createPagingStrategy() {
> return new AbstractPaginationStrategy() {
> @Override
> public void setResponseHeaders(PaginationMetadata md,
> HttpServletResponse response,
> int resultSize) {
> Set<Entry<String, String>> hds = md.getHeaders(resultSize).entrySet();
> for (Entry<String, String> header : hds) {
> response.setHeader(header.getKey(), header.getValue());
> }
> }
> };
> }
> }
>
> _______________________________________________
> aerogear-dev mailing list
> aerogear-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/aerogear-dev
>
>
>
> _______________________________________________
> aerogear-dev mailing list
> aerogear-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/aerogear-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/aerogear-dev/attachments/20130222/b17feb6b/attachment-0001.html
More information about the aerogear-dev
mailing list