From 63a5ad0b1d32d2ec5ac0fde0c8507e2eac6495de Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 25 Sep 2017 11:01:57 -0400 Subject: [PATCH] Add versioned DataInput and DataOutput to SQL (elastic/x-pack-elasticsearch#2600) These wrap `DataInput` and `DataOutput` to add the protocol version being serialized. This is similar to the mechanism used by core and it has made adding and removing fields from the serialization protocol fairly simple. Original commit: elastic/x-pack-elasticsearch@90b3f1199a36a0fe35f39d3c8c10fac39e4c252c --- .../sql/cli/net/protocol/InfoRequest.java | 6 +- .../cli/net/protocol/QueryInitRequest.java | 6 +- .../cli/net/protocol/QueryPageRequest.java | 6 +- .../sql/cli/net/protocol/QueryResponse.java | 6 +- .../sql/jdbc/net/protocol/InfoRequest.java | 6 +- .../jdbc/net/protocol/MetaColumnRequest.java | 8 +- .../jdbc/net/protocol/MetaColumnResponse.java | 4 +- .../jdbc/net/protocol/MetaTableRequest.java | 8 +- .../jdbc/net/protocol/MetaTableResponse.java | 4 +- .../xpack/sql/jdbc/net/protocol/Page.java | 16 +-- .../xpack/sql/jdbc/net/protocol/Payload.java | 9 +- .../jdbc/net/protocol/QueryInitRequest.java | 6 +- .../jdbc/net/protocol/QueryInitResponse.java | 10 +- .../jdbc/net/protocol/QueryPageRequest.java | 6 +- .../jdbc/net/protocol/QueryPageResponse.java | 10 +- .../sql/jdbc/net/protocol/PageTests.java | 24 +++- .../xpack/sql/plugin/jdbc/RowSetPayload.java | 8 +- .../shared/AbstractErrorResponse.java | 3 +- .../shared/AbstractExceptionResponse.java | 3 +- .../protocol/shared/AbstractInfoRequest.java | 6 +- .../protocol/shared/AbstractInfoResponse.java | 3 +- .../sql/protocol/shared/AbstractProto.java | 12 +- .../shared/AbstractQueryInitRequest.java | 6 +- .../shared/AbstractQueryPageRequest.java | 6 +- .../shared/AbstractQueryResponse.java | 3 +- .../xpack/sql/protocol/shared/Request.java | 2 +- .../xpack/sql/protocol/shared/Response.java | 5 +- .../sql/protocol/shared/SqlDataInput.java | 111 ++++++++++++++++++ .../sql/protocol/shared/SqlDataOutput.java | 107 +++++++++++++++++ .../xpack/sql/test/RoundTripTestUtils.java | 16 +-- 30 files changed, 324 insertions(+), 102 deletions(-) create mode 100644 sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataInput.java create mode 100644 sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataOutput.java diff --git a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/InfoRequest.java b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/InfoRequest.java index 378cb2c6a5b..0716de49a15 100644 --- a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/InfoRequest.java +++ b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/InfoRequest.java @@ -7,8 +7,8 @@ package org.elasticsearch.xpack.sql.cli.net.protocol; import org.elasticsearch.xpack.sql.cli.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractInfoRequest; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; -import java.io.DataInput; import java.io.IOException; /** @@ -26,8 +26,8 @@ public class InfoRequest extends AbstractInfoRequest { super(jvmVersion, jvmVendor, jvmClassPath, osName, osVersion); } - InfoRequest(int clientVersion, DataInput in) throws IOException { - super(clientVersion, in); + InfoRequest(SqlDataInput in) throws IOException { + super(in); } @Override diff --git a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryInitRequest.java b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryInitRequest.java index 307178dd6dd..becd3fc551b 100644 --- a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryInitRequest.java +++ b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryInitRequest.java @@ -8,8 +8,8 @@ package org.elasticsearch.xpack.sql.cli.net.protocol; import org.elasticsearch.xpack.sql.cli.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryInitRequest; import org.elasticsearch.xpack.sql.protocol.shared.TimeoutInfo; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; -import java.io.DataInput; import java.io.IOException; import java.util.TimeZone; @@ -21,8 +21,8 @@ public class QueryInitRequest extends AbstractQueryInitRequest { super(query, fetchSize, timeZone, timeout); } - QueryInitRequest(int clientVersion, DataInput in) throws IOException { - super(clientVersion, in); + QueryInitRequest(SqlDataInput in) throws IOException { + super(in); } @Override diff --git a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryPageRequest.java b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryPageRequest.java index b415f16f07c..5e8b45c3ac7 100644 --- a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryPageRequest.java +++ b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryPageRequest.java @@ -8,8 +8,8 @@ package org.elasticsearch.xpack.sql.cli.net.protocol; import org.elasticsearch.xpack.sql.cli.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryPageRequest; import org.elasticsearch.xpack.sql.protocol.shared.TimeoutInfo; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; -import java.io.DataInput; import java.io.IOException; public class QueryPageRequest extends AbstractQueryPageRequest { @@ -17,8 +17,8 @@ public class QueryPageRequest extends AbstractQueryPageRequest { super(cursor, timeout); } - QueryPageRequest(int clientVersion, DataInput in) throws IOException { - super(clientVersion, in); + QueryPageRequest(SqlDataInput in) throws IOException { + super(in); } @Override diff --git a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryResponse.java b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryResponse.java index d12af898c03..581af4ab69b 100644 --- a/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryResponse.java +++ b/sql/cli-proto/src/main/java/org/elasticsearch/xpack/sql/cli/net/protocol/QueryResponse.java @@ -7,9 +7,9 @@ package org.elasticsearch.xpack.sql.cli.net.protocol; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryResponse; import org.elasticsearch.xpack.sql.protocol.shared.Request; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; @@ -30,8 +30,8 @@ public abstract class QueryResponse extends AbstractQueryResponse { } @Override - protected void writeTo(int clientVersion, DataOutput out) throws IOException { - super.writeTo(clientVersion, out); + protected void writeTo(SqlDataOutput out) throws IOException { + super.writeTo(out); out.writeUTF(data); } diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/InfoRequest.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/InfoRequest.java index 2c10d04fc41..7d0e4dad1c8 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/InfoRequest.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/InfoRequest.java @@ -7,8 +7,8 @@ package org.elasticsearch.xpack.sql.jdbc.net.protocol; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractInfoRequest; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; -import java.io.DataInput; import java.io.IOException; /** @@ -26,8 +26,8 @@ public class InfoRequest extends AbstractInfoRequest { super(jvmVersion, jvmVendor, jvmClassPath, osName, osVersion); } - InfoRequest(int clientVersion, DataInput in) throws IOException { - super(clientVersion, in); + InfoRequest(SqlDataInput in) throws IOException { + super(in); } @Override diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnRequest.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnRequest.java index 7e63383a756..3ab6762666b 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnRequest.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnRequest.java @@ -7,9 +7,9 @@ package org.elasticsearch.xpack.sql.jdbc.net.protocol; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.Request; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; @@ -21,13 +21,13 @@ public class MetaColumnRequest extends Request { this.columnPattern = columnPattern == null ? "" : columnPattern; } - MetaColumnRequest(int clientVersion, DataInput in) throws IOException { + MetaColumnRequest(SqlDataInput in) throws IOException { tablePattern = in.readUTF(); columnPattern = in.readUTF(); } @Override - protected void writeTo(DataOutput out) throws IOException { + protected void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(tablePattern); out.writeUTF(columnPattern); } diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnResponse.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnResponse.java index d52365e0fdc..2737f1b18cc 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnResponse.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaColumnResponse.java @@ -9,9 +9,9 @@ import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.ResponseType; import org.elasticsearch.xpack.sql.protocol.shared.Request; import org.elasticsearch.xpack.sql.protocol.shared.Response; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -40,7 +40,7 @@ public class MetaColumnResponse extends Response { } @Override - protected void writeTo(int clientVersion, DataOutput out) throws IOException { + protected void writeTo(SqlDataOutput out) throws IOException { out.writeInt(columns.size()); for (MetaColumnInfo info : columns) { info.writeTo(out); diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableRequest.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableRequest.java index e5aa0d2b928..93367094172 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableRequest.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableRequest.java @@ -7,9 +7,9 @@ package org.elasticsearch.xpack.sql.jdbc.net.protocol; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.Request; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; public class MetaTableRequest extends Request { @@ -22,12 +22,12 @@ public class MetaTableRequest extends Request { this.pattern = pattern; } - MetaTableRequest(int clientVersion, DataInput in) throws IOException { + MetaTableRequest(SqlDataInput in) throws IOException { this.pattern = in.readUTF(); } @Override - public void writeTo(DataOutput out) throws IOException { + public void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(pattern); } diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableResponse.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableResponse.java index f73f140d3be..0ab4375762f 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableResponse.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/MetaTableResponse.java @@ -9,9 +9,9 @@ import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.ResponseType; import org.elasticsearch.xpack.sql.protocol.shared.Request; import org.elasticsearch.xpack.sql.protocol.shared.Response; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -38,7 +38,7 @@ public class MetaTableResponse extends Response { } @Override - public void writeTo(int clientVersion, DataOutput out) throws IOException { + public void writeTo(SqlDataOutput out) throws IOException { out.writeInt(tables.size()); for (String t : tables) { out.writeUTF(t); diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Page.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Page.java index f566ab2432d..e1244270660 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Page.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Page.java @@ -5,8 +5,9 @@ */ package org.elasticsearch.xpack.sql.jdbc.net.protocol; -import java.io.DataInput; -import java.io.DataOutput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; + import java.io.IOException; import java.lang.reflect.Array; import java.sql.JDBCType; @@ -37,7 +38,7 @@ public class Page implements Payload { private int maxRows; /** - * Build empty, call {@link #readFrom(DataInput)} after to fill it. + * Build empty, call {@link #readFrom(SqlDataInput)} after to fill it. */ Page(List columnInfo) { this.columnInfo = columnInfo; @@ -89,10 +90,8 @@ public class Page implements Payload { return column(column)[row]; } - /** - * Read a value from the stream - */ - public void readFrom(DataInput in) throws IOException { + @Override + public void readFrom(SqlDataInput in) throws IOException { int rows = in.readInt(); // this.rows may be less than the number of rows we have space for if (rows > maxRows) { @@ -107,7 +106,8 @@ public class Page implements Payload { } } - public void writeTo(DataOutput out) throws IOException { + @Override + public void writeTo(SqlDataOutput out) throws IOException { int rows = rows(); out.writeInt(rows); for (int row = 0; row < rows; row++) { diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Payload.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Payload.java index acc86c40464..73405ba9d36 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Payload.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/Payload.java @@ -5,13 +5,14 @@ */ package org.elasticsearch.xpack.sql.jdbc.net.protocol; -import java.io.DataInput; -import java.io.DataOutput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; + import java.io.IOException; public interface Payload { - void readFrom(DataInput in) throws IOException; + void readFrom(SqlDataInput in) throws IOException; - void writeTo(DataOutput out) throws IOException; + void writeTo(SqlDataOutput out) throws IOException; } diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitRequest.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitRequest.java index f1b724836a1..c9748aae152 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitRequest.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitRequest.java @@ -8,8 +8,8 @@ package org.elasticsearch.xpack.sql.jdbc.net.protocol; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryInitRequest; import org.elasticsearch.xpack.sql.protocol.shared.TimeoutInfo; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; -import java.io.DataInput; import java.io.IOException; import java.util.TimeZone; @@ -18,8 +18,8 @@ public class QueryInitRequest extends AbstractQueryInitRequest { super(query, fetchSize, timeZone, timeout); } - QueryInitRequest(int clientVersion, DataInput in) throws IOException { - super(clientVersion, in); + QueryInitRequest(SqlDataInput in) throws IOException { + super(in); } @Override diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitResponse.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitResponse.java index 4bbecbfe9ce..31df7190efc 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitResponse.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryInitResponse.java @@ -9,9 +9,9 @@ import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.ResponseType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryResponse; import org.elasticsearch.xpack.sql.protocol.shared.Request; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -29,7 +29,7 @@ public class QueryInitResponse extends AbstractQueryResponse { this.data = data; } - QueryInitResponse(Request request, DataInput in) throws IOException { + QueryInitResponse(Request request, SqlDataInput in) throws IOException { super(request, in); int size = in.readInt(); List columns = new ArrayList<>(size); @@ -44,8 +44,8 @@ public class QueryInitResponse extends AbstractQueryResponse { } @Override - public void writeTo(int clientVersion, DataOutput out) throws IOException { - super.writeTo(clientVersion, out); + public void writeTo(SqlDataOutput out) throws IOException { + super.writeTo(out); out.writeInt(columns.size()); for (ColumnInfo c : columns) { c.writeTo(out); diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageRequest.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageRequest.java index 4064da1ae72..16ece0cb961 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageRequest.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageRequest.java @@ -9,8 +9,8 @@ import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryPageRequest; import org.elasticsearch.xpack.sql.protocol.shared.Nullable; import org.elasticsearch.xpack.sql.protocol.shared.TimeoutInfo; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; -import java.io.DataInput; import java.io.IOException; public class QueryPageRequest extends AbstractQueryPageRequest { @@ -21,8 +21,8 @@ public class QueryPageRequest extends AbstractQueryPageRequest { this.data = data; } - QueryPageRequest(int clientVersion, DataInput in) throws IOException { - super(clientVersion, in); + QueryPageRequest(SqlDataInput in) throws IOException { + super(in); this.data = null; // data isn't used on the server side } diff --git a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageResponse.java b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageResponse.java index 368366f24b5..9e7040ba41d 100644 --- a/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageResponse.java +++ b/sql/jdbc-proto/src/main/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/QueryPageResponse.java @@ -9,9 +9,9 @@ import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.RequestType; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Proto.ResponseType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractQueryResponse; import org.elasticsearch.xpack.sql.protocol.shared.Request; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; @@ -23,7 +23,7 @@ public class QueryPageResponse extends AbstractQueryResponse { this.data = data; } - QueryPageResponse(Request request, DataInput in) throws IOException { + QueryPageResponse(Request request, SqlDataInput in) throws IOException { super(request, in); QueryPageRequest queryPageRequest = (QueryPageRequest) request; data = queryPageRequest.data(); @@ -31,8 +31,8 @@ public class QueryPageResponse extends AbstractQueryResponse { } @Override - public void writeTo(int clientVersion, DataOutput out) throws IOException { - super.writeTo(clientVersion, out); + public void writeTo(SqlDataOutput out) throws IOException { + super.writeTo(out); data.writeTo(out); } diff --git a/sql/jdbc-proto/src/test/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/PageTests.java b/sql/jdbc-proto/src/test/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/PageTests.java index 1a91ba21538..6f493c17f34 100644 --- a/sql/jdbc-proto/src/test/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/PageTests.java +++ b/sql/jdbc-proto/src/test/java/org/elasticsearch/xpack/sql/jdbc/net/protocol/PageTests.java @@ -5,8 +5,15 @@ */ package org.elasticsearch.xpack.sql.jdbc.net.protocol; +import org.elasticsearch.common.CheckedBiConsumer; +import org.elasticsearch.common.CheckedFunction; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.sql.protocol.shared.AbstractProto; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; +import java.io.DataInput; +import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -50,9 +57,9 @@ public class PageTests extends ESTestCase { public void testRoundTripNoReuse() throws IOException { Page example = randomPage(); - assertRoundTrip(example, Page::writeTo, in -> { + assertRoundTrip(example, writeTo(AbstractProto.CURRENT_VERSION), in -> { Page page = new Page(example.columnInfo()); - page.readFrom(in); + page.readFrom(new SqlDataInput(in, AbstractProto.CURRENT_VERSION)); return page; }); } @@ -60,11 +67,15 @@ public class PageTests extends ESTestCase { public void testRoundTripReuse() throws IOException { Page example = randomPage(); Page target = new Page(example.columnInfo()); - roundTrip(example, Page::writeTo, in -> {target.readFrom(in); return null;}); + CheckedFunction readFrom = in -> { + target.readFrom(new SqlDataInput(in, AbstractProto.CURRENT_VERSION)); + return null; + }; + roundTrip(example, writeTo(AbstractProto.CURRENT_VERSION), readFrom); assertEquals(example, target); example = randomPageContents(example.columnInfo()); - roundTrip(example, Page::writeTo, in -> {target.readFrom(in); return null;}); + roundTrip(example, writeTo(AbstractProto.CURRENT_VERSION), readFrom); assertEquals(example, target); } @@ -89,4 +100,9 @@ public class PageTests extends ESTestCase { }).toString()); } + + private static CheckedBiConsumer writeTo(int version) { + return (page, in) -> + page.writeTo(new SqlDataOutput(in, version)); + } } diff --git a/sql/server/src/main/java/org/elasticsearch/xpack/sql/plugin/jdbc/RowSetPayload.java b/sql/server/src/main/java/org/elasticsearch/xpack/sql/plugin/jdbc/RowSetPayload.java index 087476718e4..7d7e9adcc41 100644 --- a/sql/server/src/main/java/org/elasticsearch/xpack/sql/plugin/jdbc/RowSetPayload.java +++ b/sql/server/src/main/java/org/elasticsearch/xpack/sql/plugin/jdbc/RowSetPayload.java @@ -7,12 +7,12 @@ package org.elasticsearch.xpack.sql.plugin.jdbc; import org.elasticsearch.xpack.sql.jdbc.net.protocol.Payload; import org.elasticsearch.xpack.sql.jdbc.net.protocol.ProtoUtils; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataInput; +import org.elasticsearch.xpack.sql.protocol.shared.SqlDataOutput; import org.elasticsearch.xpack.sql.session.RowSet; import org.elasticsearch.xpack.sql.type.DataType; import org.joda.time.ReadableInstant; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.sql.JDBCType; import java.util.List; @@ -25,12 +25,12 @@ public class RowSetPayload implements Payload { } @Override - public void readFrom(DataInput in) throws IOException { + public void readFrom(SqlDataInput in) throws IOException { throw new UnsupportedOperationException("This class can only be serialized"); } @Override - public void writeTo(DataOutput out) throws IOException { + public void writeTo(SqlDataOutput out) throws IOException { out.writeInt(rowSet.size()); List types = rowSet.schema().types(); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractErrorResponse.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractErrorResponse.java index 434eb8eeeca..505120f95ef 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractErrorResponse.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractErrorResponse.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.sql.protocol.shared; import org.elasticsearch.xpack.sql.protocol.shared.AbstractProto.RequestType; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; @@ -34,7 +33,7 @@ public abstract class AbstractErrorResponse extends Response { } @Override - protected final void writeTo(int clientVersion, DataOutput out) throws IOException { + protected final void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(message); out.writeUTF(cause); out.writeUTF(stack); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractExceptionResponse.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractExceptionResponse.java index c86261fa1b7..c639dd811f0 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractExceptionResponse.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractExceptionResponse.java @@ -9,7 +9,6 @@ import org.elasticsearch.xpack.sql.protocol.shared.AbstractProto.RequestType; import org.elasticsearch.xpack.sql.protocol.shared.AbstractProto.SqlExceptionType; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; import java.util.Objects; @@ -49,7 +48,7 @@ public abstract class AbstractExceptionResponse extends Response { } @Override - protected final void writeTo(int clientVersion, DataOutput out) throws IOException { + protected final void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(message); out.writeUTF(cause); exceptionType.writeTo(out); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoRequest.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoRequest.java index 1c25e10eb89..f70793ae464 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoRequest.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoRequest.java @@ -5,8 +5,6 @@ */ package org.elasticsearch.xpack.sql.protocol.shared; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; @@ -35,7 +33,7 @@ public abstract class AbstractInfoRequest extends Request { this.osVersion = osVersion; } - protected AbstractInfoRequest(int clientVersion, DataInput in) throws IOException { + protected AbstractInfoRequest(SqlDataInput in) throws IOException { jvmVersion = in.readUTF(); jvmVendor = in.readUTF(); jvmClassPath = in.readUTF(); @@ -44,7 +42,7 @@ public abstract class AbstractInfoRequest extends Request { } @Override - public final void writeTo(DataOutput out) throws IOException { + public final void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(jvmVersion); out.writeUTF(jvmVendor); out.writeUTF(jvmClassPath); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoResponse.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoResponse.java index 989470f3b87..bc4141adf3c 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoResponse.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractInfoResponse.java @@ -6,7 +6,6 @@ package org.elasticsearch.xpack.sql.protocol.shared; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; @@ -40,7 +39,7 @@ public abstract class AbstractInfoResponse extends Response { } @Override - protected final void writeTo(int clientVersion, DataOutput out) throws IOException { + protected final void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(node); out.writeUTF(cluster); out.writeByte(majorVersion); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractProto.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractProto.java index c57e3d68cc9..8573ef6674b 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractProto.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractProto.java @@ -32,7 +32,7 @@ public abstract class AbstractProto { public void writeRequest(Request request, DataOutput out) throws IOException { writeHeader(CURRENT_VERSION, out); request.requestType().writeTo(out); - request.writeTo(out); + request.writeTo(new SqlDataOutput(out, CURRENT_VERSION)); } public Request readRequest(DataInput in) throws IOException { @@ -40,13 +40,13 @@ public abstract class AbstractProto { if (clientVersion > CURRENT_VERSION) { throw new IOException("Unknown client version [" + clientVersion + "]. Always upgrade client last."); } - return readRequestType(in).reader().read(clientVersion, in); + return readRequestType(in).reader().read(new SqlDataInput(in, clientVersion)); } public void writeResponse(Response response, int clientVersion, DataOutput out) throws IOException { writeHeader(clientVersion, out); response.responseType().writeTo(out); - response.writeTo(clientVersion, out); + response.writeTo(new SqlDataOutput(out, clientVersion)); } public Response readResponse(Request request, DataInput in) throws IOException { @@ -56,7 +56,7 @@ public abstract class AbstractProto { + CURRENT_VERSION + "]. Server is busted."); } // TODO why do I need the response type at all? Just a byte for err/exception/normal, then get response type from request. - Response response = readResponseType(in).reader().read(request, in); + Response response = readResponseType(in).reader().read(request, new SqlDataInput(in, version)); if (response.requestType() != request.requestType()) { throw new IOException("Expected request type to be [" + request.requestType() + "] but was [" + response.requestType() + "]. Server is busted."); @@ -107,7 +107,7 @@ public abstract class AbstractProto { protected abstract ResponseType readResponseType(DataInput in) throws IOException; @FunctionalInterface protected interface RequestReader { - Request read(int clientVersion, DataInput in) throws IOException; + Request read(SqlDataInput in) throws IOException; } protected interface RequestType { void writeTo(DataOutput out) throws IOException; @@ -115,7 +115,7 @@ public abstract class AbstractProto { } @FunctionalInterface protected interface ResponseReader { - Response read(Request request, DataInput in) throws IOException; + Response read(Request request, SqlDataInput in) throws IOException; } protected interface ResponseType { void writeTo(DataOutput out) throws IOException; diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryInitRequest.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryInitRequest.java index f757be06d5b..34108571bac 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryInitRequest.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryInitRequest.java @@ -5,8 +5,6 @@ */ package org.elasticsearch.xpack.sql.protocol.shared; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Objects; import java.util.TimeZone; @@ -29,7 +27,7 @@ public abstract class AbstractQueryInitRequest extends Request { this.timeout = timeout; } - protected AbstractQueryInitRequest(int clientVersion, DataInput in) throws IOException { + protected AbstractQueryInitRequest(SqlDataInput in) throws IOException { query = in.readUTF(); fetchSize = in.readInt(); timeZone = TimeZone.getTimeZone(in.readUTF()); @@ -37,7 +35,7 @@ public abstract class AbstractQueryInitRequest extends Request { } @Override - public void writeTo(DataOutput out) throws IOException { + public void writeTo(SqlDataOutput out) throws IOException { out.writeUTF(query); out.writeInt(fetchSize); out.writeUTF(timeZone.getID()); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryPageRequest.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryPageRequest.java index ead37c9fbf1..f939ccb0fd8 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryPageRequest.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryPageRequest.java @@ -5,8 +5,6 @@ */ package org.elasticsearch.xpack.sql.protocol.shared; -import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Arrays; import java.util.Locale; @@ -27,14 +25,14 @@ public abstract class AbstractQueryPageRequest extends Request { this.timeout = timeout; } - protected AbstractQueryPageRequest(int clientVersion, DataInput in) throws IOException { + protected AbstractQueryPageRequest(SqlDataInput in) throws IOException { this.cursor = new byte[ProtoUtil.readArraySize(in)]; in.readFully(cursor); this.timeout = new TimeoutInfo(in); } @Override - public void writeTo(DataOutput out) throws IOException { + public void writeTo(SqlDataOutput out) throws IOException { out.writeInt(cursor.length); out.write(cursor); timeout.writeTo(out); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryResponse.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryResponse.java index fda0e53c3ce..126e8dd4641 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryResponse.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/AbstractQueryResponse.java @@ -6,7 +6,6 @@ package org.elasticsearch.xpack.sql.protocol.shared; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.Arrays; import java.util.Locale; @@ -35,7 +34,7 @@ public abstract class AbstractQueryResponse extends Response { } @Override - protected void writeTo(int clientVersion, DataOutput out) throws IOException { + protected void writeTo(SqlDataOutput out) throws IOException { out.writeLong(tookNanos); out.writeInt(cursor.length); out.write(cursor); diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Request.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Request.java index a6ae7308393..7bac068f9d2 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Request.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Request.java @@ -20,7 +20,7 @@ public abstract class Request { * Write this request to the {@link DataOutput}. Implementers should * be kind and stick this right under the ctor that reads the response. */ - protected abstract void writeTo(DataOutput out) throws IOException; + protected abstract void writeTo(SqlDataOutput out) throws IOException; /** * Body to go into the {@link #toString()} result. diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Response.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Response.java index 689091449d8..05d15c4adab 100644 --- a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Response.java +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/Response.java @@ -19,11 +19,8 @@ public abstract class Response { /** * Write this response to the {@link DataOutput}. - * @param clientVersion The version of the client that requested - * the message. This should be used to send a response compatible - * with the client. */ - protected abstract void writeTo(int clientVersion, DataOutput out) throws IOException; + protected abstract void writeTo(SqlDataOutput out) throws IOException; /** * Body to go into the {@link #toString()} result. diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataInput.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataInput.java new file mode 100644 index 00000000000..bfce72ab968 --- /dev/null +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataInput.java @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.protocol.shared; + +import java.io.DataInput; +import java.io.IOException; + +/** + * {@linkplain DataInput} customized for SQL. It has: + *
    + *
  • {@link #version}. This allows us to add new fields + * to the protocol in a backwards compatible way by bumping + * the version number.
  • + *
+ */public final class SqlDataInput implements DataInput { + private final DataInput delegate; + private final int version; + + public SqlDataInput(DataInput delegate, int version) { + this.delegate = delegate; + this.version = version; + } + + /** + * Version of the protocol to use. When new fields are added + * to the protocol we bump the maximum version. Requests and + * responses use the minimum version understood by both the + * client and the server. + */ + public int version() { + return version; + } + + @Override + public void readFully(byte[] b) throws IOException { + delegate.readFully(b); + } + + @Override + public void readFully(byte[] b, int off, int len) throws IOException { + delegate.readFully(b, off, len); + } + + @Override + public int skipBytes(int n) throws IOException { + return delegate.skipBytes(n); + } + + @Override + public boolean readBoolean() throws IOException { + return delegate.readBoolean(); + } + + @Override + public byte readByte() throws IOException { + return delegate.readByte(); + } + + @Override + public int readUnsignedByte() throws IOException { + return delegate.readUnsignedByte(); + } + + @Override + public short readShort() throws IOException { + return delegate.readShort(); + } + + @Override + public int readUnsignedShort() throws IOException { + return delegate.readUnsignedShort(); + } + + @Override + public char readChar() throws IOException { + return delegate.readChar(); + } + + @Override + public int readInt() throws IOException { + return delegate.readInt(); + } + + @Override + public long readLong() throws IOException { + return delegate.readLong(); + } + + @Override + public float readFloat() throws IOException { + return delegate.readFloat(); + } + + @Override + public double readDouble() throws IOException { + return delegate.readDouble(); + } + + @Override + public String readLine() throws IOException { + return delegate.readLine(); + } + + @Override + public String readUTF() throws IOException { + return delegate.readUTF(); + } +} diff --git a/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataOutput.java b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataOutput.java new file mode 100644 index 00000000000..a52afe21562 --- /dev/null +++ b/sql/shared-proto/src/main/java/org/elasticsearch/xpack/sql/protocol/shared/SqlDataOutput.java @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.protocol.shared; + +import java.io.DataOutput; +import java.io.IOException; + +/** + * {@linkplain DataOutput} customized for SQL. It has: + *
    + *
  • {@link #version}. This allows us to add new fields + * to the protocol in a backwards compatible way by bumping + * the version number.
  • + *
+ */ +public final class SqlDataOutput implements DataOutput { + private final DataOutput delegate; + private final int version; + + public SqlDataOutput(DataOutput delegate, int version) { + this.delegate = delegate; + this.version = version; + } + + /** + * Version of the protocol to use. When new fields are added + * to the protocol we bump the maximum version. Requests and + * responses use the minimum version understood by both the + * client and the server. + */ + public int version() { + return version; + } + + @Override + public void write(int b) throws IOException { + delegate.write(b); + } + + @Override + public void write(byte[] b) throws IOException { + delegate.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + delegate.write(b, off, len); + } + + @Override + public void writeBoolean(boolean v) throws IOException { + delegate.writeBoolean(v); + } + + @Override + public void writeByte(int v) throws IOException { + delegate.writeByte(v); + } + + @Override + public void writeShort(int v) throws IOException { + delegate.writeShort(v); + } + + @Override + public void writeChar(int v) throws IOException { + delegate.writeChar(v); + } + + @Override + public void writeInt(int v) throws IOException { + delegate.writeInt(v); + } + + @Override + public void writeLong(long v) throws IOException { + delegate.writeLong(v); + } + + @Override + public void writeFloat(float v) throws IOException { + delegate.writeFloat(v); + } + + @Override + public void writeDouble(double v) throws IOException { + delegate.writeDouble(v); + } + + @Override + public void writeBytes(String s) throws IOException { + delegate.writeBytes(s); + } + + @Override + public void writeChars(String s) throws IOException { + delegate.writeChars(s); + } + + @Override + public void writeUTF(String s) throws IOException { + delegate.writeUTF(s); + } +} diff --git a/sql/test-utils/src/main/java/org/elasticsearch/xpack/sql/test/RoundTripTestUtils.java b/sql/test-utils/src/main/java/org/elasticsearch/xpack/sql/test/RoundTripTestUtils.java index 9fab1e6b826..62b7fc1da5b 100644 --- a/sql/test-utils/src/main/java/org/elasticsearch/xpack/sql/test/RoundTripTestUtils.java +++ b/sql/test-utils/src/main/java/org/elasticsearch/xpack/sql/test/RoundTripTestUtils.java @@ -27,21 +27,21 @@ public abstract class RoundTripTestUtils { // Only static utilities here } - public static void assertRoundTrip(T example, CheckedBiConsumer encode, - CheckedFunction decode) throws IOException { - T once = roundTrip(example, encode, decode); + public static void assertRoundTrip(T example, CheckedBiConsumer writeTo, + CheckedFunction readFrom) throws IOException { + T once = roundTrip(example, writeTo, readFrom); assertEquals(example, once); - T twice = roundTrip(once, encode, decode); + T twice = roundTrip(once, writeTo, readFrom); assertEquals(example, twice); assertEquals(once, twice); } - public static T roundTrip(T example, CheckedBiConsumer encode, - CheckedFunction decode) throws IOException { + public static T roundTrip(T example, CheckedBiConsumer writeTo, + CheckedFunction readFrom) throws IOException { try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { - encode.accept(example, new DataOutputStream(out)); + writeTo.accept(example, new DataOutputStream(out)); try (InputStream in = new ByteArrayInputStream(out.toByteArray())) { - T decoded = decode.apply(new DataInputStream(in)); + T decoded = readFrom.apply(new DataInputStream(in)); assertEquals("should have emptied the stream", 0, in.available()); return decoded; }