/*******************************************************************************
* Copyright (c) 2011 GitHub Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.egit.github.core.client;
import static org.eclipse.egit.github.core.client.IGitHubConstants.HEADER_LAST;
import static org.eclipse.egit.github.core.client.IGitHubConstants.HEADER_LINK;
import static org.eclipse.egit.github.core.client.IGitHubConstants.HEADER_NEXT;
import static org.eclipse.egit.github.core.client.IGitHubConstants.META_FIRST;
import static org.eclipse.egit.github.core.client.IGitHubConstants.META_LAST;
import static org.eclipse.egit.github.core.client.IGitHubConstants.META_NEXT;
import static org.eclipse.egit.github.core.client.IGitHubConstants.META_PREV;
import static org.eclipse.egit.github.core.client.IGitHubConstants.META_REL;
/**
* Page link class to be used to determine the links to other pages of request
* responses encoded in the current response. These will be present if the
* result set size exceeds the per page limit.
*/
public class PageLinks {
private static final String DELIM_LINKS = ","; //$NON-NLS-1$
private static final String DELIM_LINK_PARAM = ";"; //$NON-NLS-1$
private String first;
private String last;
private String next;
private String prev;
/**
* Parse links from executed method
*
* @param response
*/
public PageLinks(GitHubResponse response) {
String linkHeader = response.getHeader(HEADER_LINK);
if (linkHeader != null) {
String[] links = linkHeader.split(DELIM_LINKS);
for (String link : links) {
String[] segments = link.split(DELIM_LINK_PARAM);
if (segments.length < 2)
continue;
String linkPart = segments[0].trim();
if (!linkPart.startsWith("<") || !linkPart.endsWith(">")) //$NON-NLS-1$ //$NON-NLS-2$
continue;
linkPart = linkPart.substring(1, linkPart.length() - 1);
for (int i = 1; i < segments.length; i++) {
String[] rel = segments[i].trim().split("="); //$NON-NLS-1$
if (rel.length < 2 || !META_REL.equals(rel[0]))
continue;
String relValue = rel[1];
if (relValue.startsWith("\"") && relValue.endsWith("\"")) //$NON-NLS-1$ //$NON-NLS-2$
relValue = relValue.substring(1, relValue.length() - 1);
if (META_FIRST.equals(relValue))
first = linkPart;
else if (META_LAST.equals(relValue))
last = linkPart;
else if (META_NEXT.equals(relValue))
next = linkPart;
else if (META_PREV.equals(relValue))
prev = linkPart;
}
}
} else {
next = response.getHeader(HEADER_NEXT);
last = response.getHeader(HEADER_LAST);
}
}
/**
* @return first
*/
public String getFirst() {
return first;
}
/**
* @return last
*/
public String getLast() {
return last;
}
/**
* @return next
*/
public String getNext() {
return next;
}
/**
* @return prev
*/
public String getPrev() {
return prev;
}
}