Transport: read/write support for list of strings

Add support for reading and writng string lists to existing StreamInput and StreamOutput class.
This commit is contained in:
Christoph Büscher 2015-05-08 12:44:00 +02:00
parent a536bd5f81
commit acc42d5599
3 changed files with 35 additions and 6 deletions

View File

@ -335,6 +335,21 @@ public abstract class StreamInput extends InputStream {
return ret;
}
/**
* Read in a list of strings. List can be empty but not {@code null}.
*/
public List<String> readStringList() throws IOException {
int size = readVInt();
if (size == 0) {
return Collections.emptyList();
}
List<String> ret = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
ret.add(readString());
}
return ret;
}
@Nullable
public Map<String, Object> readMap() throws IOException {
return (Map<String, Object>) readGenericValue();

View File

@ -283,6 +283,16 @@ public abstract class StreamOutput extends OutputStream {
}
}
/**
* Write a list of strings. List can be empty but not {@code null}.
*/
public void writeStringList(List<String> stringList) throws IOException {
writeVInt(stringList.size());
for (String s : stringList) {
writeString(s);
}
}
/**
* Writes a string array, for nullable string, writes it as 0 (empty string).
*/

View File

@ -28,6 +28,8 @@ import org.elasticsearch.test.ElasticsearchTestCase;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Arrays;
import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.equalTo;
@ -282,6 +284,7 @@ public class BytesStreamsTests extends ElasticsearchTestCase {
out.writeGenericValue(doubleArray);
out.writeString("hello");
out.writeString("goodbye");
out.writeStringList(Arrays.asList(new String[]{"Hello", "Again"}));
out.writeGenericValue(BytesRefs.toBytesRef("bytesref"));
BytesStreamInput in = new BytesStreamInput(out.bytes().toBytes());
assertThat(in.readBoolean(), equalTo(false));
@ -299,6 +302,7 @@ public class BytesStreamsTests extends ElasticsearchTestCase {
assertThat(in.readGenericValue(), equalTo((Object)doubleArray));
assertThat(in.readString(), equalTo("hello"));
assertThat(in.readString(), equalTo("goodbye"));
assertThat(in.readStringList(), equalTo(Arrays.asList(new String[]{"Hello", "Again"})));
assertThat(in.readGenericValue(), equalTo((Object)BytesRefs.toBytesRef("bytesref")));
in.close();
out.close();