All Downloads are FREE. Search and download functionalities are using the official Maven repository.

redis.netty.MultiBulkReply Maven / Gradle / Ivy

There is a newer version: 0.12
Show newest version
package redis.netty;

import com.google.common.base.Charsets;
import org.jboss.netty.buffer.ChannelBuffer;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;

import static redis.util.Encoding.NEG_ONE_WITH_CRLF;
import static redis.util.Encoding.numToBytes;

/**
 * Nested replies.
 */
public class MultiBulkReply implements Reply {
  public static final char MARKER = '*';
  private Reply[] replies;
  private int size = -2;
  private int index = 0;

  public void read(RedisDecoder rd, ChannelBuffer is) throws IOException {
    if (size == -2) {
      long l = RedisDecoder.readLong(is);
      if (l > Integer.MAX_VALUE) {
        throw new IllegalArgumentException("Java only supports arrays up to " + Integer.MAX_VALUE + " in size");
      }
      size = (int) l;
      if (size == -1) {
        replies = null;
      } else {
        if (size < 0) {
          throw new IllegalArgumentException("Invalid size: " + size);
        }
        replies = new Reply[size];
      }
      rd.checkpoint();
    }
    for (int i = index; i < size; i++) {
      replies[i] = rd.readReply(is);
      index = i + 1;
      rd.checkpoint();
    }
  }

  public MultiBulkReply() {
  }

  public MultiBulkReply(Reply[] replies) {
    this.replies = replies;
  }

  @Override
  public Reply[] data() {
    return replies;
  }

  @Override
  public void write(ChannelBuffer os) throws IOException {
    os.writeByte(MARKER);
    if (replies == null) {
      os.writeBytes(NEG_ONE_WITH_CRLF);
    } else {
      os.writeBytes(numToBytes(replies.length, true));
      for (Reply reply : replies) {
        reply.write(os);
      }
    }
  }

  public List asStringList(Charset charset) {
    if (replies == null) return null;
    List strings = new ArrayList(replies.length);
    for (Reply reply : replies) {
      if (reply instanceof BulkReply) {
        strings.add(((BulkReply) reply).asString(charset));
      } else {
        throw new IllegalArgumentException("Could not convert " + reply + " to a string");
      }
    }
    return strings;
  }

  public Set asStringSet(Charset charset) {
    if (replies == null) return null;
    Set strings = new HashSet(replies.length);
    for (Reply reply : replies) {
      if (reply instanceof BulkReply) {
        strings.add(((BulkReply) reply).asString(charset));
      } else {
        throw new IllegalArgumentException("Could not convert " + reply + " to a string");
      }
    }
    return strings;
  }

  public Map asStringMap(Charset charset) {
    if (replies == null) return null;
    int length = replies.length;
    Map map = new HashMap(length);
    if (length % 2 != 0) {
      throw new IllegalArgumentException("Odd number of replies");
    }
    for (int i = 0; i < length; i += 2) {
      Reply key = replies[i];
      Reply value = replies[i + 1];
      if (key instanceof BulkReply) {
        if (value instanceof BulkReply) {
          map.put(((BulkReply) key).asString(charset), ((BulkReply) value).asString(charset));
        } else {
          throw new IllegalArgumentException("Could not convert value: " + value + " to a string");
        }
      } else {
        throw new IllegalArgumentException("Could not convert key: " + key + " to a string");
      }
    }
    return map;
  }

  public String toString() {
    return asStringList(Charsets.UTF_8).toString();
  }

  public boolean isDone() {
    return index == size;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy