[
https://issues.apache.org/jira/browse/ABDERA-168?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12598732#action_12598732
]
Remy Gendron commented on ABDERA-168:
-------------------------------------
I have added the following to my adapter ancestor class...
/**
* On intercept une requête pour une collection (getEntries()) qui sera
faite
* par addFeedDetails, afin de traiter automatiquement un filtre par
categories
* pour les adapteurs qui n'implante pas le support des catégories.
*
* Si on ne le faisait pas, un adapteur ignorerait simplement les catégories
* passées en paramètres.
*
* Un adapteur retournera un 400 automatiquement si le support des
catégories
* est à false, sans avoir à ce soucier de ce support dans le dao associé à
l'adapteur.
*
* De plus, on en profite pour ajouter automatiquement les liens pour le
paging.
*
* @see #getHandlesCategories()
*/
@Override
protected void addFeedDetails(Feed feed, RequestContext request) throws
ResponseContextException {
// Y a-t-il au moins une categorie sur l'URL?
if (request.getTarget().getParameter("category1") != null) {
// Il y a des categories dans l'URI de la requete...
if (!getHandlesCategories()) {
// L'adapteur ne supporte pas les categories. On bypass le
traitement normal.
ServiceContext context = getServiceContext(request);
context.getGenericErrors().reject(BaseErrorCode.REST_REQUEST_CATEGORIES_NOT_SUPPORTED.toString(),
"Cet adapteur ne supporte pas les catégories.");
checkForErrors(context, request);
}
}
// TODO:RG Devrait utiliser un hook du genre afterGetEntries() plutôt
// que de réimplanter complètement addFeedDetails().
// Ajouter automatiquement un lien next page pour le paging si le
nombre d'entrées
// dans le feed est un de plus que ce qui devait être retourné.
// La méthode getServiceContext() a modifié cette valeur pour que
l'adapteur
// charge une entrée supplémentaire. Donc, si cette entrée est présente
dans
// le feed, cela indique qu'une prochaine page est disponible.
feed.setUpdated(new Date());
Iterable<T> entries = getEntries(request);
ServiceContext context = getServiceContext(request);
int inflatedMaxResult = context.getMaxResults();
// On corrige l'info de paging dans le ServiceContext.
context.setMaxResults(inflatedMaxResult - 1);
boolean needNextPageLink = false;
int collectionSize = 0;
if (entries != null) {
for (T entryObj : entries) {
// Detection de la presence d'une prochaine page.
++collectionSize;
if (collectionSize >= inflatedMaxResult) {
needNextPageLink = true;
// Ne pas ajouter cette dernière entrée.
break;
}
Entry e = feed.addEntry();
IRI feedIri = new IRI(getFeedIriForEntry(entryObj, request));
addEntryDetails(request, e, feedIri, entryObj);
if (isMediaEntry(entryObj)) {
addMediaContent(feedIri, e, entryObj, request);
} else {
addContent(e, entryObj, request);
}
}
}
int currentStartIndex = context.getStartIndex();
// Ajout d'un lien premiere page?
if (currentStartIndex > 1) {
FeedPagingHelper.setFirst(feed, createPagingLink(request, 1));
}
// Ajout d'un lien page précédente?
if (currentStartIndex > 1) {
int newStartIndex = currentStartIndex - context.getMaxResults();
if (newStartIndex < 1) {
newStartIndex = 1;
}
FeedPagingHelper.setPrevious(feed, createPagingLink(request,
newStartIndex));
}
// Ajout d'un lien page suivante?
if (needNextPageLink) {
int newStartIndex = currentStartIndex + context.getMaxResults();
FeedPagingHelper.setNext(feed, createPagingLink(request,
newStartIndex));
}
// Un lien derniere page n'est jamais ajouté étant trop couteux à
calculer.
}
/**
* Génère un lien de paging pour insertion dans le feed par l'appelant.
*
* @param startIndex Le nouveau start-index.
* @return Un lien absolue.
*/
private String createPagingLink(RequestContext request, int startIndex) {
String uri = request.getResolvedUri().toString();
int separatorIndex = uri.indexOf("?");
if (separatorIndex != -1) {
uri = uri.substring(0, separatorIndex);
}
StringBuilder link = new StringBuilder(uri);
link.append("?").append(SearchConstants.START_INDEX).append("=").append(startIndex);
for(String parameterName : request.getParameterNames()) {
if (!parameterName.equals(SearchConstants.START_INDEX)) {
String parameterValue = request.getParameter(parameterName);
link.append("&").append(parameterName).append("=").append(parameterValue);
}
}
return link.toString();
}
> Generating page links
> ---------------------
>
> Key: ABDERA-168
> URL: https://issues.apache.org/jira/browse/ABDERA-168
> Project: Abdera
> Issue Type: Improvement
> Affects Versions: 0.4.0
> Reporter: Remy Gendron
> Priority: Minor
>
> Hello all,
> I'm adding glue code in my application to automatically generate and add
> paging links to a returned feed.
> I have the necessary information to decide if a link should be there.
> I know how to compute the URI parameters to target another page.
> I know how to add a link to a feed with the FeedPagingHelper class.
> My question is: Is there an easy way provided by Abdera to generate the link
> by altering the current request URI parameters? I need to pass thru all the
> current parameters that define the feed content returned (eg
> ?q=xxx&author=yyy&max-results=10) but alter the start-index parameter to
> target the new page.
> I can do it manually by getting this information from the RequestContext and
> building the new link. But I see a bunch of getLink() methods in the adapter
> classes. Is there an easy (or recommended) way of generated new links based
> on the current request that I haven't seen?
> Another question would be... do you make the paging links relative to the
> base URI or do paging links need to be absolute as the examples in RFC5005
> seem to indicate?
> Thank you,
> Rémy
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.