package org.handwerkszeug.riak.transport.rest; import static org.handwerkszeug.riak.util.Validation.notNull; import java.util.ArrayList; import java.util.List; import org.handwerkszeug.riak.RiakAction; import org.handwerkszeug.riak.RiakClient; import org.handwerkszeug.riak.ease.ExceptionHandler; import org.handwerkszeug.riak.ease.internal.AbstractRiakCommand; import org.handwerkszeug.riak.ease.internal.ResultHolder; import org.handwerkszeug.riak.model.Location; import org.handwerkszeug.riak.model.RiakContentsResponse; import org.handwerkszeug.riak.model.RiakObject; /** * @author taichi * @param <OP> */ public class LinkWalkingCommand extends AbstractRiakCommand<List<List<RiakObject<byte[]>>>, RestRiakOperations> { final Location begin; List<LinkCondition> steps = new ArrayList<LinkCondition>(); public LinkWalkingCommand(RiakClient<RestRiakOperations> client, ExceptionHandler handler, Location begin) { super(client, handler); this.begin = begin; } @Override public List<List<RiakObject<byte[]>>> execute() { final List<List<RiakObject<byte[]>>> list = new ArrayList<List<RiakObject<byte[]>>>(); final ResultHolder<List<List<RiakObject<byte[]>>>> holder = new ResultHolder<List<List<RiakObject<byte[]>>>>(); this.client.execute(new RiakAction<RestRiakOperations>() { @Override public void execute(RestRiakOperations operations) { operations.walk(LinkWalkingCommand.this.begin, LinkWalkingCommand.this.steps, new EaseHandler<LinkWalkingResponse>(holder) { @Override public void handle( RiakContentsResponse<LinkWalkingResponse> response) throws Exception { LinkWalkingResponse contents = response .getContents(); if (contents.getDone()) { holder.setResult(list); } else { list.add(contents.getResponse()); } } }); } }); return holder.getResult(); } public LinkWalkingCommand step(String bucket, String tag) { return this.step(bucket, tag, false); } public LinkWalkingCommand step(String bucket, String tag, boolean keep) { return this.step(new LinkCondition(bucket, tag, keep)); } public LinkWalkingCommand step(LinkCondition condition) { notNull(condition, "condition"); this.steps.add(condition); return this; } }