package org.handwerkszeug.riak.ease; import static org.handwerkszeug.riak.util.Validation.notNull; import java.util.List; import org.codehaus.jackson.node.ArrayNode; import org.handwerkszeug.riak.RiakClient; import org.handwerkszeug.riak.ease.internal.DefaultExceptionHandler; import org.handwerkszeug.riak.ease.internal.MapReduceCommand; import org.handwerkszeug.riak.mapreduce.MapReduceQueryBuilder; import org.handwerkszeug.riak.mapreduce.internal.DefaultMapReduceQueryBuilder; import org.handwerkszeug.riak.mapreduce.internal.MapReduceQueryContext; import org.handwerkszeug.riak.model.Bucket; import org.handwerkszeug.riak.model.DefaultRiakObject; import org.handwerkszeug.riak.model.Location; import org.handwerkszeug.riak.model.RiakObject; import org.handwerkszeug.riak.op.RiakOperations; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBufferOutputStream; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.util.CharsetUtil; /** * @author taichi * @param <OP> */ public abstract class Riak<OP extends RiakOperations> { protected ExceptionHandler handler = DefaultExceptionHandler.INSTANCE; protected RiakClient<OP> client; protected Riak(RiakClient<OP> client) { this.client = client; } public void setExceptionHandler(ExceptionHandler handler) { notNull(handler, "handler"); this.handler = handler; } public PingCommand<OP> ping() { return new PingCommand<OP>(this.client, this.handler); } public GetCommand<OP> get(Location location) { notNull(location, "location"); return new GetCommand<OP>(this.client, this.handler, location); } public PostCommand<OP> post(RiakObject<byte[]> ro) { notNull(ro, "ro"); return new PostCommand<OP>(this.client, this.handler, ro); } public PostCommand<OP> post(String bucket, String data) { notNull(bucket, "bucket"); notNull(data, "data"); DefaultRiakObject ro = new DefaultRiakObject(new Location(bucket, "")); ro.setContent(data.getBytes()); return new PostCommand<OP>(this.client, this.handler, ro); } public PutCommand<OP> put(RiakObject<byte[]> ro) { notNull(ro, "ro"); return new PutCommand<OP>(this.client, this.handler, ro); } public PutCommand<OP> put(Location location, String data) { notNull(location, "location"); notNull(data, "data"); DefaultRiakObject ro = new DefaultRiakObject(location, data); return put(ro); } public DeleteCommand<OP> delete(Location location) { notNull(location, "location"); return new DeleteCommand<OP>(this.client, this.handler, location); } public ListKeysCommand<OP> listKeys(String bucket) { notNull(bucket, "bucket"); return new ListKeysCommand<OP>(this.client, this.handler, bucket); } public GetBucketCommand<OP> getBucket(String bucket) { notNull(bucket, "bucket"); return new GetBucketCommand<OP>(this.client, this.handler, bucket); } public SetBucketCommand<OP> setBucket(Bucket bucket) { notNull(bucket, "bucket"); return new SetBucketCommand<OP>(this.client, this.handler, bucket); } public MapReduceQueryBuilder<List<ArrayNode>> mapReduce() { MapReduceQueryContext<List<ArrayNode>> context = new MapReduceQueryContext<List<ArrayNode>>() { @Override public List<ArrayNode> execute() { ChannelBuffer cb = ChannelBuffers.dynamicBuffer(); prepare(new ChannelBufferOutputStream(cb)); String query = cb.toString(CharsetUtil.UTF_8); MapReduceCommand<OP> cmd = new MapReduceCommand<OP>( Riak.this.client, Riak.this.handler, query); return cmd.execute(); } }; DefaultMapReduceQueryBuilder<List<ArrayNode>> builder = new DefaultMapReduceQueryBuilder<List<ArrayNode>>( context); builder.initialize(); return builder; } public void dispose() { this.client.dispose(); } }