package com.gettingmobile.google.reader.rest;
import com.gettingmobile.google.Authenticator;
import com.gettingmobile.google.reader.ElementId;
import com.gettingmobile.google.reader.ItemState;
import com.gettingmobile.rest.ContentIOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.Iterator;
public final class GetItemReferencesRequest extends AuthenticatedReaderRequest<HttpGet, ItemReferenceStream> {
private final static ItemReferenceStreamExtractor itemReferenceStreamExtractor = new ItemReferenceStreamExtractor();
private static String createUri(Collection<ElementId> tags, ItemState exclude, int maxCountPerTag, long startTime,
boolean includeAllDirectStreamIds) {
final int maxLength = MAX_URI_LENGTH - BASE_URI.length();
final StringBuilder uri = new StringBuilder("/api/0/stream/items/ids?output=json");
uri.append("&n=").append(maxCountPerTag);
if (startTime > 0) {
uri.append("&ot=").append(startTime);
}
if (exclude != null) {
uri.append("&xt=").append(exclude.getId().getId());
}
if (includeAllDirectStreamIds) {
uri.append("&includeAllDirectStreamIds=true");
}
for (Iterator<ElementId> it = tags.iterator(); it.hasNext(); ) {
final ElementId tagId = it.next();
if ((uri.length() + tagId.getId().length() + 3) < maxLength) {
uri.append("&s=").append(tagId.getUrlEncodedId());
it.remove();
} else {
break;
}
}
return uri.toString();
}
/**
* Constructs the request
* @param authenticator the authenticator to be used
* @param tags the tags to be requested references for. As many tags as allowed for a reasonable URI length will
* be taken and deleted from this collection. So the tags remaining in the collection after the call have not
* been requested!
* @param exclude {@link ItemState} of items to be excluded from the list or {@code null} if no excludes are requested.
* @param maxCountPerTag maximum number of item references to be returned per tag.
* @param startTime unix timestamp in seconds specifying the minimum change time of the items to be returned.
* @param includeAllDirectStreamIds http://groups.google.com/group/fougrapi/browse_thread/thread/96bc41e878d2a0c/ab11fd7f9858462a
* @throws URISyntaxException if the URI is malformed
*/
public GetItemReferencesRequest(
Authenticator authenticator, Collection<ElementId> tags, ItemState exclude,
int maxCountPerTag, long startTime, boolean includeAllDirectStreamIds)
throws URISyntaxException {
super(createUri(tags, exclude, maxCountPerTag, startTime, includeAllDirectStreamIds), authenticator);
}
public GetItemReferencesRequest(Authenticator authenticator, Collection<ElementId> tags, int maxCountPerTag)
throws URISyntaxException {
this(authenticator, tags, null, maxCountPerTag, 0, false);
}
@Override
public ItemReferenceStream processResponse(HttpResponse response) throws ContentIOException {
return itemReferenceStreamExtractor.extract(response.getEntity());
}
@Override
protected HttpGet createRequest() {
return new HttpGet();
}
}