if (context == null) {
throw new IllegalArgumentException("Operation context must be set!");
}
final DiscoveryService discoveryService = getBinding().getDiscoveryService();
final ObjectFactory of = getObjectFactory();
final OperationContext ctxt = new OperationContextImpl(context);
return new CollectionIterable<ChangeEvent>(new AbstractPageFetcher<ChangeEvent>(Integer.MAX_VALUE) {
private String token = changeLogToken;
private String nextLink = null;
private boolean firstPage = true;
@Override
protected AbstractPageFetcher.Page<ChangeEvent> fetchPage(long skipCount) {
assert firstPage || token != null ? (nextLink == null) : true;
// fetch the data
ExtendedHolder<String> changeLogTokenHolder = new ExtendedHolder<String>(token);
if (nextLink != null) {
changeLogTokenHolder.setExtraValue(Constants.REP_REL_CHANGES, nextLink);
}
ObjectList objectList = discoveryService.getContentChanges(getRepositoryInfo().getId(),
changeLogTokenHolder, includeProperties, ctxt.getFilterString(), ctxt.isIncludePolicies(),
ctxt.isIncludeAcls(), BigInteger.valueOf(this.maxNumItems), null);
// convert type definitions
List<ChangeEvent> page = new ArrayList<ChangeEvent>();
for (ObjectData objectData : objectList.getObjects()) {
page.add(of.convertChangeEvent(objectData));
}
if (!firstPage) {
// the last entry of the previous page is repeated
// -> remove the first entry