From 3b3d1f6ab9dc1043db726995b33207fe9f206db8 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 24 Sep 2026 12:29:35 +0300 Subject: [PATCH 01/33] Merge branch 'master' into rmv_th_loc_ign --- .../ignite/internal/binary/BinaryUtils.java | 166 ---------- .../internal/binary/BinaryWriterEx.java | 54 +--- .../cache}/odbc/SqlInputStreamWrapper.java | 2 +- .../internal/binary/BinaryWriterExImpl.java | 290 +++++++++++++++++- .../jdbc/thin/JdbcThinPreparedStatement.java | 2 +- .../processors/odbc/SqlListenerUtils.java | 126 +------- .../processors/odbc/jdbc/JdbcQuery.java | 2 +- .../processors/odbc/jdbc/JdbcUtils.java | 2 +- .../odbc/odbc/OdbcMessageParser.java | 6 +- .../processors/odbc/odbc/OdbcQuery.java | 2 +- 10 files changed, 301 insertions(+), 351 deletions(-) rename modules/{core/src/main/java/org/apache/ignite/internal/processors => binary/api/src/main/java/org/apache/ignite/internal/processors/cache}/odbc/SqlInputStreamWrapper.java (96%) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index cabf276f834e0..1b2147eb6aea7 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -417,172 +417,6 @@ public static String fieldTypeName(int typeId) { return FIELD_TYPE_NAMES[typeId]; } - /** - * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. - * - * @param writer W - * @param val Value. - */ - public static void writePlainObject(BinaryWriterEx writer, Object val) { - Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); - - if (flag == null) - throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); - - switch (flag) { - case GridBinaryMarshaller.BYTE: - writer.writeByte(flag); - writer.writeByte((Byte)val); - - break; - - case GridBinaryMarshaller.SHORT: - writer.writeByte(flag); - writer.writeShort((Short)val); - - break; - - case GridBinaryMarshaller.INT: - writer.writeByte(flag); - writer.writeInt((Integer)val); - - break; - - case GridBinaryMarshaller.LONG: - writer.writeByte(flag); - writer.writeLong((Long)val); - - break; - - case GridBinaryMarshaller.FLOAT: - writer.writeByte(flag); - writer.writeFloat((Float)val); - - break; - - case GridBinaryMarshaller.DOUBLE: - writer.writeByte(flag); - writer.writeDouble((Double)val); - - break; - - case GridBinaryMarshaller.CHAR: - writer.writeByte(flag); - writer.writeChar((Character)val); - - break; - - case GridBinaryMarshaller.BOOLEAN: - writer.writeByte(flag); - writer.writeBoolean((Boolean)val); - - break; - - case GridBinaryMarshaller.DECIMAL: - writer.writeDecimal((BigDecimal)val); - - break; - - case GridBinaryMarshaller.STRING: - writer.writeString((String)val); - - break; - - case GridBinaryMarshaller.UUID: - writer.writeUuid((UUID)val); - - break; - - case GridBinaryMarshaller.DATE: - writer.writeDate((Date)val); - - break; - - case GridBinaryMarshaller.TIMESTAMP: - writer.writeTimestamp((Timestamp)val); - - break; - - case GridBinaryMarshaller.TIME: - writer.writeTime((Time)val); - - break; - - case GridBinaryMarshaller.BYTE_ARR: - writer.writeByteArray((byte[])val); - - break; - - case GridBinaryMarshaller.SHORT_ARR: - writer.writeShortArray((short[])val); - - break; - - case GridBinaryMarshaller.INT_ARR: - writer.writeIntArray((int[])val); - - break; - - case GridBinaryMarshaller.LONG_ARR: - writer.writeLongArray((long[])val); - - break; - - case GridBinaryMarshaller.FLOAT_ARR: - writer.writeFloatArray((float[])val); - - break; - - case GridBinaryMarshaller.DOUBLE_ARR: - writer.writeDoubleArray((double[])val); - - break; - - case GridBinaryMarshaller.CHAR_ARR: - writer.writeCharArray((char[])val); - - break; - - case GridBinaryMarshaller.BOOLEAN_ARR: - writer.writeBooleanArray((boolean[])val); - - break; - - case GridBinaryMarshaller.DECIMAL_ARR: - writer.writeDecimalArray((BigDecimal[])val); - - break; - - case GridBinaryMarshaller.STRING_ARR: - writer.writeStringArray((String[])val); - - break; - - case GridBinaryMarshaller.UUID_ARR: - writer.writeUuidArray((UUID[])val); - - break; - - case GridBinaryMarshaller.DATE_ARR: - writer.writeDateArray((Date[])val); - - break; - - case GridBinaryMarshaller.TIMESTAMP_ARR: - writer.writeTimestampArray((Timestamp[])val); - - break; - - case GridBinaryMarshaller.TIME_ARR: - writer.writeTimeArray((Time[])val); - - break; - - default: - throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); - } - } - /** * @param obj Value to unwrap. * @return Unwrapped value. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java index a382361432be0..b5d6cdbc342b4 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java @@ -142,46 +142,6 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut */ public BinaryContext context(); - /** - * @param val Value. - */ - public void writeBooleanFieldPrimitive(boolean val); - - /** - * @param val Value. - */ - public void writeByteFieldPrimitive(byte val); - - /** - * @param val Value. - */ - public void writeCharFieldPrimitive(char val); - - /** - * @param val Value. - */ - public void writeShortFieldPrimitive(short val); - - /** - * @param val Value. - */ - public void writeIntFieldPrimitive(int val); - - /** - * @param val Value. - */ - public void writeLongFieldPrimitive(long val); - - /** - * @param val Value. - */ - public void writeFloatFieldPrimitive(float val); - - /** - * @param val Value. - */ - public void writeDoubleFieldPrimitive(double val); - /** * Write byte array from the InputStream. * @@ -251,4 +211,18 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut * @param proxy Proxy. */ public void writeProxy(Proxy proxy, Class[] intfs); + + /** + * @param obj Object to write. + * @param binObjAllow Allow to write non plain objects. + * @throws BinaryObjectException On error. + */ + public void writeJdbcObject(@Nullable Object obj, boolean binObjAllow); + + /** + * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. + * + * @param val Value. + */ + public void writePlainObject(Object val); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlInputStreamWrapper.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/odbc/SqlInputStreamWrapper.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlInputStreamWrapper.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/odbc/SqlInputStreamWrapper.java index 0cb58237633d1..739ea5c479098 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlInputStreamWrapper.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/odbc/SqlInputStreamWrapper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.ignite.internal.processors.odbc; +package org.apache.ignite.internal.processors.cache.odbc; import java.io.InputStream; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 9f36b6d748932..b1ab9776763c2 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -23,6 +23,8 @@ import java.lang.reflect.Proxy; import java.math.BigDecimal; import java.math.BigInteger; +import java.sql.Blob; +import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Collection; @@ -39,6 +41,7 @@ import org.apache.ignite.internal.UnregisteredClassException; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.processors.cache.CacheObject; +import org.apache.ignite.internal.processors.cache.odbc.SqlInputStreamWrapper; import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.F; @@ -49,6 +52,7 @@ import static org.apache.ignite.IgniteCommonsSystemProperties.DFLT_ZERO_COPY; import static org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_BINARY_STRING_ZERO_COPY; +import static org.apache.ignite.internal.binary.BinaryUtils.PLAIN_CLASS_TO_FLAG; import static org.apache.ignite.internal.util.CommonUtils.MAX_ARRAY_SIZE; /** @@ -431,8 +435,8 @@ else if (offsetByteCnt == BinaryUtils.OFFSET_2) } } - /** {@inheritDoc} */ - @Override public void writeByteFieldPrimitive(byte val) { + /** @param val Value. */ + private void writeByteFieldPrimitive(byte val) { out.unsafeEnsure(1 + 1); out.unsafeWriteByte(GridBinaryMarshaller.BYTE); @@ -470,8 +474,8 @@ void writeByteField(@Nullable Byte val) { } } - /** {@inheritDoc} */ - @Override public void writeShortFieldPrimitive(short val) { + /** @param val Value. */ + private void writeShortFieldPrimitive(short val) { out.unsafeEnsure(1 + 2); out.unsafeWriteByte(GridBinaryMarshaller.SHORT); @@ -488,8 +492,8 @@ void writeShortField(@Nullable Short val) { writeShortFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeIntFieldPrimitive(int val) { + /** @param val Value. */ + private void writeIntFieldPrimitive(int val) { out.unsafeEnsure(1 + 4); out.unsafeWriteByte(GridBinaryMarshaller.INT); @@ -506,8 +510,8 @@ void writeIntField(@Nullable Integer val) { writeIntFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeLongFieldPrimitive(long val) { + /** @param val Value. */ + private void writeLongFieldPrimitive(long val) { out.unsafeEnsure(1 + 8); out.unsafeWriteByte(GridBinaryMarshaller.LONG); @@ -524,8 +528,8 @@ void writeLongField(@Nullable Long val) { writeLongFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeFloatFieldPrimitive(float val) { + /** @param val Value. */ + private void writeFloatFieldPrimitive(float val) { out.unsafeEnsure(1 + 4); out.unsafeWriteByte(GridBinaryMarshaller.FLOAT); @@ -542,8 +546,8 @@ void writeFloatField(@Nullable Float val) { writeFloatFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeDoubleFieldPrimitive(double val) { + /** @param val Value. */ + private void writeDoubleFieldPrimitive(double val) { out.unsafeEnsure(1 + 8); out.unsafeWriteByte(GridBinaryMarshaller.DOUBLE); @@ -560,8 +564,8 @@ void writeDoubleField(@Nullable Double val) { writeDoubleFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeCharFieldPrimitive(char val) { + /** @param val Value. */ + private void writeCharFieldPrimitive(char val) { out.unsafeEnsure(1 + 2); out.unsafeWriteByte(GridBinaryMarshaller.CHAR); @@ -578,8 +582,8 @@ void writeCharField(@Nullable Character val) { writeCharFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeBooleanFieldPrimitive(boolean val) { + /** @param val Value. */ + private void writeBooleanFieldPrimitive(boolean val) { out.unsafeEnsure(1 + 1); out.unsafeWriteByte(GridBinaryMarshaller.BOOLEAN); @@ -1852,6 +1856,260 @@ private void clearState(boolean clearHandler) { } } + /** {@inheritDoc} */ + @Override public void writeJdbcObject(@Nullable Object obj, boolean binObjAllow) throws BinaryObjectException { + if (obj == null) { + writeByte(GridBinaryMarshaller.NULL); + + return; + } + + Class cls = obj.getClass(); + + if (cls == Boolean.class) + writeBooleanFieldPrimitive((Boolean)obj); + else if (cls == Byte.class) + writeByteFieldPrimitive((Byte)obj); + else if (cls == Character.class) + writeCharFieldPrimitive((Character)obj); + else if (cls == Short.class) + writeShortFieldPrimitive((Short)obj); + else if (cls == Integer.class) + writeIntFieldPrimitive((Integer)obj); + else if (cls == Long.class) + writeLongFieldPrimitive((Long)obj); + else if (cls == Float.class) + writeFloatFieldPrimitive((Float)obj); + else if (cls == Double.class) + writeDoubleFieldPrimitive((Double)obj); + else if (cls == String.class) + writeString((String)obj); + else if (cls == BigDecimal.class) + writeDecimal((BigDecimal)obj); + else if (cls == UUID.class) + writeUuid((UUID)obj); + else if (cls == Time.class) + writeTime((Time)obj); + else if (cls == Timestamp.class) + writeTimestamp((Timestamp)obj); + else if (cls == java.sql.Date.class || cls == java.util.Date.class) + writeDate((java.util.Date)obj); + else if (cls == boolean[].class) + writeBooleanArray((boolean[])obj); + else if (cls == byte[].class) + writeByteArray((byte[])obj); + else if (cls == char[].class) + writeCharArray((char[])obj); + else if (cls == short[].class) + writeShortArray((short[])obj); + else if (cls == int[].class) + writeIntArray((int[])obj); + else if (cls == long[].class) + writeLongArray((long[])obj); + else if (cls == float[].class) + writeFloatArray((float[])obj); + else if (cls == double[].class) + writeDoubleArray((double[])obj); + else if (cls == String[].class) + writeStringArray((String[])obj); + else if (cls == BigDecimal[].class) + writeDecimalArray((BigDecimal[])obj); + else if (cls == UUID[].class) + writeUuidArray((UUID[])obj); + else if (cls == Time[].class) + writeTimeArray((Time[])obj); + else if (cls == Timestamp[].class) + writeTimestampArray((Timestamp[])obj); + else if (cls == java.util.Date[].class || cls == java.sql.Date[].class) + writeDateArray((java.util.Date[])obj); + else if (obj instanceof SqlInputStreamWrapper wrapper) { + int written = writeByteArray(wrapper.inputStream(), wrapper.length()); + + if (wrapper.length() != -1 && wrapper.length() != written) { + throw new BinaryObjectException("Input stream length mismatch. [declaredLength=" + wrapper.length() + ", " + + "actualLength=" + written + "]"); + } + } + else if (obj instanceof Blob blob) + try { + int written = writeByteArray(blob.getBinaryStream(), (int)blob.length()); + + if ((int)blob.length() != written) { + throw new BinaryObjectException("Blob length mismatch. [declaredLength=" + (int)blob.length() + ", " + + "actualLength=" + written + "]"); + } + } + catch (SQLException e) { + throw new BinaryObjectException(e); + } + else if (binObjAllow) + writeObjectDetached(obj); + else + throw new BinaryObjectException("Custom objects are not supported"); + } + + /** {@inheritDoc} */ + // TODO: check all methods to make private. + @Override public void writePlainObject(Object val) { + Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); + + if (flag == null) + throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); + + switch (flag) { + case GridBinaryMarshaller.BYTE: + writeByte(flag); + writeByte((Byte)val); + + break; + + case GridBinaryMarshaller.SHORT: + writeByte(flag); + writeShort((Short)val); + + break; + + case GridBinaryMarshaller.INT: + writeByte(flag); + writeInt((Integer)val); + + break; + + case GridBinaryMarshaller.LONG: + writeByte(flag); + writeLong((Long)val); + + break; + + case GridBinaryMarshaller.FLOAT: + writeByte(flag); + writeFloat((Float)val); + + break; + + case GridBinaryMarshaller.DOUBLE: + writeByte(flag); + writeDouble((Double)val); + + break; + + case GridBinaryMarshaller.CHAR: + writeByte(flag); + writeChar((Character)val); + + break; + + case GridBinaryMarshaller.BOOLEAN: + writeByte(flag); + writeBoolean((Boolean)val); + + break; + + case GridBinaryMarshaller.DECIMAL: + writeDecimal((BigDecimal)val); + + break; + + case GridBinaryMarshaller.STRING: + writeString((String)val); + + break; + + case GridBinaryMarshaller.UUID: + writeUuid((UUID)val); + + break; + + case GridBinaryMarshaller.DATE: + writeDate((Date)val); + + break; + + case GridBinaryMarshaller.TIMESTAMP: + writeTimestamp((Timestamp)val); + + break; + + case GridBinaryMarshaller.TIME: + writeTime((Time)val); + + break; + + case GridBinaryMarshaller.BYTE_ARR: + writeByteArray((byte[])val); + + break; + + case GridBinaryMarshaller.SHORT_ARR: + writeShortArray((short[])val); + + break; + + case GridBinaryMarshaller.INT_ARR: + writeIntArray((int[])val); + + break; + + case GridBinaryMarshaller.LONG_ARR: + writeLongArray((long[])val); + + break; + + case GridBinaryMarshaller.FLOAT_ARR: + writeFloatArray((float[])val); + + break; + + case GridBinaryMarshaller.DOUBLE_ARR: + writeDoubleArray((double[])val); + + break; + + case GridBinaryMarshaller.CHAR_ARR: + writeCharArray((char[])val); + + break; + + case GridBinaryMarshaller.BOOLEAN_ARR: + writeBooleanArray((boolean[])val); + + break; + + case GridBinaryMarshaller.DECIMAL_ARR: + writeDecimalArray((BigDecimal[])val); + + break; + + case GridBinaryMarshaller.STRING_ARR: + writeStringArray((String[])val); + + break; + + case GridBinaryMarshaller.UUID_ARR: + writeUuidArray((UUID[])val); + + break; + + case GridBinaryMarshaller.DATE_ARR: + writeDateArray((Date[])val); + + break; + + case GridBinaryMarshaller.TIMESTAMP_ARR: + writeTimestampArray((Timestamp[])val); + + break; + + case GridBinaryMarshaller.TIME_ARR: + writeTimeArray((Time[])val); + + break; + + default: + throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); + } + } + /** * @param fld Field. * @param val Val to get write mode for. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java index 2d8e70b5de545..b1af1236fe078 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java @@ -39,7 +39,7 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; -import org.apache.ignite.internal.processors.odbc.SqlInputStreamWrapper; +import org.apache.ignite.internal.processors.cache.odbc.SqlInputStreamWrapper; import org.apache.ignite.internal.processors.odbc.SqlListenerUtils; import org.apache.ignite.internal.processors.odbc.SqlStateCode; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsRequest; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java index 86b0697d664b1..42f8b75c93d90 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java @@ -19,7 +19,6 @@ import java.math.BigDecimal; import java.sql.Blob; -import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.UUID; @@ -27,9 +26,9 @@ import org.apache.ignite.cache.query.QueryCancelledException; import org.apache.ignite.internal.binary.BinaryReaderEx; import org.apache.ignite.internal.binary.BinaryUtils; -import org.apache.ignite.internal.binary.BinaryWriterEx; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.jdbc2.JdbcBinaryBuffer; +import org.apache.ignite.internal.processors.cache.odbc.SqlInputStreamWrapper; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.query.IgniteSQLException; import org.apache.ignite.internal.util.typedef.F; @@ -113,123 +112,6 @@ private static Object readJdbcByteArray(BinaryReaderEx reader) { return JdbcBinaryBuffer.createReadOnly(reader.in().array(), position, len); } - /** - * @param writer Writer. - * @param obj Object to write. - * @param binObjAllow Allow to write non plain objects. - * @throws BinaryObjectException On error. - */ - public static void writeObject(BinaryWriterEx writer, @Nullable Object obj, boolean binObjAllow) - throws BinaryObjectException { - if (obj == null) { - writer.writeByte(GridBinaryMarshaller.NULL); - - return; - } - - Class cls = obj.getClass(); - - if (cls == Boolean.class) - writer.writeBooleanFieldPrimitive((Boolean)obj); - else if (cls == Byte.class) - writer.writeByteFieldPrimitive((Byte)obj); - else if (cls == Character.class) - writer.writeCharFieldPrimitive((Character)obj); - else if (cls == Short.class) - writer.writeShortFieldPrimitive((Short)obj); - else if (cls == Integer.class) - writer.writeIntFieldPrimitive((Integer)obj); - else if (cls == Long.class) - writer.writeLongFieldPrimitive((Long)obj); - else if (cls == Float.class) - writer.writeFloatFieldPrimitive((Float)obj); - else if (cls == Double.class) - writer.writeDoubleFieldPrimitive((Double)obj); - else if (cls == String.class) - writer.writeString((String)obj); - else if (cls == BigDecimal.class) - writer.writeDecimal((BigDecimal)obj); - else if (cls == UUID.class) - writer.writeUuid((UUID)obj); - else if (cls == Time.class) - writer.writeTime((Time)obj); - else if (cls == Timestamp.class) - writer.writeTimestamp((Timestamp)obj); - else if (cls == java.sql.Date.class || cls == java.util.Date.class) - writer.writeDate((java.util.Date)obj); - else if (cls == boolean[].class) - writer.writeBooleanArray((boolean[])obj); - else if (cls == byte[].class) - writer.writeByteArray((byte[])obj); - else if (cls == char[].class) - writer.writeCharArray((char[])obj); - else if (cls == short[].class) - writer.writeShortArray((short[])obj); - else if (cls == int[].class) - writer.writeIntArray((int[])obj); - else if (cls == long[].class) - writer.writeLongArray((long[])obj); - else if (cls == float[].class) - writer.writeFloatArray((float[])obj); - else if (cls == double[].class) - writer.writeDoubleArray((double[])obj); - else if (cls == String[].class) - writer.writeStringArray((String[])obj); - else if (cls == BigDecimal[].class) - writer.writeDecimalArray((BigDecimal[])obj); - else if (cls == UUID[].class) - writer.writeUuidArray((UUID[])obj); - else if (cls == Time[].class) - writer.writeTimeArray((Time[])obj); - else if (cls == Timestamp[].class) - writer.writeTimestampArray((Timestamp[])obj); - else if (cls == java.util.Date[].class || cls == java.sql.Date[].class) - writer.writeDateArray((java.util.Date[])obj); - else if (obj instanceof SqlInputStreamWrapper) - writeByteArray(writer, (SqlInputStreamWrapper)obj); - else if (obj instanceof Blob) - writeByteArray(writer, (Blob)obj); - else if (binObjAllow) - writer.writeObjectDetached(obj); - else - throw new BinaryObjectException("Custom objects are not supported"); - } - - /** - * Write byte array from the InputStream enclosed in the stream wrapper. - * - * @param writer Writer. - * @param wrapper stream wrapper - */ - private static void writeByteArray(BinaryWriterEx writer, SqlInputStreamWrapper wrapper) throws BinaryObjectException { - int written = writer.writeByteArray(wrapper.inputStream(), wrapper.length()); - - if (wrapper.length() != -1 && wrapper.length() != written) { - throw new BinaryObjectException("Input stream length mismatch. [declaredLength=" + wrapper.length() + ", " + - "actualLength=" + written + "]"); - } - } - - /** - * Write byte array from the Blob instance. - * - * @param writer Writer. - * @param blob Blob. - */ - private static void writeByteArray(BinaryWriterEx writer, Blob blob) throws BinaryObjectException { - try { - int written = writer.writeByteArray(blob.getBinaryStream(), (int)blob.length()); - - if ((int)blob.length() != written) { - throw new BinaryObjectException("Blob length mismatch. [declaredLength=" + (int)blob.length() + ", " + - "actualLength=" + written + "]"); - } - } - catch (SQLException e) { - throw new BinaryObjectException(e); - } - } - /** * @param cls Class. * @return {@code true} is the type is plain (not user's custom class). @@ -248,7 +130,8 @@ public static boolean isPlainType(Class cls) { || cls == UUID.class || cls == Time.class || cls == Timestamp.class - || cls == java.sql.Date.class || cls == java.util.Date.class + || cls == java.sql.Date.class + || cls == java.util.Date.class || cls == boolean[].class || cls == byte[].class || cls == char[].class @@ -262,7 +145,8 @@ public static boolean isPlainType(Class cls) { || cls == UUID[].class || cls == Time[].class || cls == Timestamp[].class - || cls == java.util.Date[].class || cls == java.sql.Date[].class + || cls == java.util.Date[].class + || cls == java.sql.Date[].class || cls == SqlInputStreamWrapper.class || cls == Blob.class; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQuery.java index 12688e5517b22..af1483ba5159c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQuery.java @@ -75,7 +75,7 @@ public Object[] args() { writer.writeInt(args.length); for (Object arg : args) - SqlListenerUtils.writeObject(writer, arg, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); + writer.writeJdbcObject(arg, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java index d866aaa1b95f8..f6770751c6ea9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java @@ -179,6 +179,6 @@ public static void writeObject( return; } - SqlListenerUtils.writeObject(writer, obj, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); + writer.writeJdbcObject(obj, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java index 4251bffd5e941..d135be97519ae 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java @@ -338,7 +338,7 @@ else if (res0 instanceof OdbcQueryFetchResult) { writer.writeInt(row.size()); for (Object obj : row) - SqlListenerUtils.writeObject(writer, obj, true); + writer.writeJdbcObject(obj, true); } } } @@ -365,7 +365,7 @@ else if (res0 instanceof OdbcQueryMoreResultsResult) { writer.writeInt(row.size()); for (Object obj : row) - SqlListenerUtils.writeObject(writer, obj, true); + writer.writeJdbcObject(obj, true); } } } @@ -401,7 +401,7 @@ else if (res0 instanceof OdbcQueryGetParamsMetaResult) { byte[] typeIds = res.typeIds(); - SqlListenerUtils.writeObject(writer, typeIds, true); + writer.writeJdbcObject(typeIds, true); } else if (res0 instanceof OdbcQueryGetResultsetMetaResult) { OdbcQueryGetResultsetMetaResult res = (OdbcQueryGetResultsetMetaResult)res0; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcQuery.java index a1c45c00df8e4..448db7787fe98 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcQuery.java @@ -67,7 +67,7 @@ public void writeBinary(BinaryWriterEx writer) { writer.writeInt(args.length); for (Object arg : args) - SqlListenerUtils.writeObject(writer, arg, false); + writer.writeJdbcObject(arg, false); } } From 31f2763aaf6b111f55d6dab10a7095760561053e Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 24 Sep 2026 15:31:26 +0300 Subject: [PATCH 02/33] WIP --- .../internal/binary/BinaryWriterEx.java | 66 ------- .../odbc/SqlInputStreamWrapper.java | 2 +- .../internal/binary/BinaryImplUtils.java | 172 ------------------ .../internal/binary/BinaryWriterExImpl.java | 70 ++++--- .../builder/BinaryBuilderSerializer.java | 2 +- .../jdbc/thin/JdbcThinPreparedStatement.java | 2 +- .../processors/odbc/SqlListenerUtils.java | 7 +- 7 files changed, 51 insertions(+), 270 deletions(-) rename modules/binary/api/src/main/java/org/apache/ignite/internal/processors/{cache => }/odbc/SqlInputStreamWrapper.java (96%) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java index b5d6cdbc342b4..1ec84e743773c 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java @@ -17,9 +17,7 @@ package org.apache.ignite.internal.binary; -import java.io.InputStream; import java.io.ObjectOutput; -import java.lang.reflect.Proxy; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.binary.BinaryRawWriter; import org.apache.ignite.binary.BinaryWriter; @@ -132,86 +130,22 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut */ public int schemaId(); - /** - * @param schemaId Schema ID. - */ - public void schemaId(int schemaId); - /** * @return Binary context. */ public BinaryContext context(); - /** - * Write byte array from the InputStream. - * - *

If {@code limit} > 0 than no more than {@code limit} bytes will be read and written. - * If {@code limit} == -1 than it will try to read and write all bytes. - * - *

In any case if actual number of bytes is greater than {@code MAX_ARRAY_SIZE} - * than exception will be thrown. - * - * @param in InputStream. - * @param limit Max length of data to be read from the stream or -1 if all data should be read. - * @return Number of bytes written. - * @throws BinaryObjectException If an I/O error occurs or stream contains more than {@code MAX_ARRAY_SIZE} bytes. - */ - public int writeByteArray(InputStream in, int limit) throws BinaryObjectException; - /** * @param po Binary object. * @throws org.apache.ignite.binary.BinaryObjectException In case of error. */ public void writeBinaryObject(@Nullable BinaryObjectEx po) throws BinaryObjectException; - /** - * Write field. - * - * @param obj Object. - * @param fld Field. - * @throws BinaryObjectException If failed. - */ - public void writeField(Object obj, BinaryFieldDescriptor fld) throws BinaryObjectException; - /** * @return Current writer's schema. */ public BinarySchema currentSchema(); - /** - * Attempts to write the object as a handle. - * - * @param obj Object to write. - * @return {@code true} if the object has been written as a handle. - */ - public boolean tryWriteAsHandle(Object obj); - - /** - * @param val Array wrapper. - * @throws BinaryObjectException In case of error. - */ - public void writeBinaryArray(BinaryArray val); - - /** - * @param val Array. - */ - public void doWriteEnumArray(Object[] val); - - /** - * @param val Value. - */ - public void writeBinaryEnum(BinaryObjectEx val); - - /** - * @param val Class. - */ - public void writeClass(Class val); - - /** - * @param proxy Proxy. - */ - public void writeProxy(Proxy proxy, Class[] intfs); - /** * @param obj Object to write. * @param binObjAllow Allow to write non plain objects. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/odbc/SqlInputStreamWrapper.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/odbc/SqlInputStreamWrapper.java similarity index 96% rename from modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/odbc/SqlInputStreamWrapper.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/processors/odbc/SqlInputStreamWrapper.java index 739ea5c479098..0cb58237633d1 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/cache/odbc/SqlInputStreamWrapper.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/processors/odbc/SqlInputStreamWrapper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.ignite.internal.processors.cache.odbc; +package org.apache.ignite.internal.processors.odbc; import java.io.InputStream; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index 6d59f0519b52f..d70afe87add54 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -16,16 +16,10 @@ */ package org.apache.ignite.internal.binary; -import java.math.BigDecimal; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.Date; -import java.util.UUID; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; -import static org.apache.ignite.internal.binary.BinaryUtils.PLAIN_CLASS_TO_FLAG; import static org.apache.ignite.internal.binary.BinaryUtils.length; /** @@ -307,172 +301,6 @@ public static boolean isPlainArrayType(int type) { || type == GridBinaryMarshaller.TIMESTAMP_ARR || type == GridBinaryMarshaller.TIME_ARR; } - /** - * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. - * - * @param writer W - * @param val Value. - */ - public static void writePlainObject(BinaryWriterEx writer, Object val) { - Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); - - if (flag == null) - throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); - - switch (flag) { - case GridBinaryMarshaller.BYTE: - writer.writeByte(flag); - writer.writeByte((Byte)val); - - break; - - case GridBinaryMarshaller.SHORT: - writer.writeByte(flag); - writer.writeShort((Short)val); - - break; - - case GridBinaryMarshaller.INT: - writer.writeByte(flag); - writer.writeInt((Integer)val); - - break; - - case GridBinaryMarshaller.LONG: - writer.writeByte(flag); - writer.writeLong((Long)val); - - break; - - case GridBinaryMarshaller.FLOAT: - writer.writeByte(flag); - writer.writeFloat((Float)val); - - break; - - case GridBinaryMarshaller.DOUBLE: - writer.writeByte(flag); - writer.writeDouble((Double)val); - - break; - - case GridBinaryMarshaller.CHAR: - writer.writeByte(flag); - writer.writeChar((Character)val); - - break; - - case GridBinaryMarshaller.BOOLEAN: - writer.writeByte(flag); - writer.writeBoolean((Boolean)val); - - break; - - case GridBinaryMarshaller.DECIMAL: - writer.writeDecimal((BigDecimal)val); - - break; - - case GridBinaryMarshaller.STRING: - writer.writeString((String)val); - - break; - - case GridBinaryMarshaller.UUID: - writer.writeUuid((UUID)val); - - break; - - case GridBinaryMarshaller.DATE: - writer.writeDate((Date)val); - - break; - - case GridBinaryMarshaller.TIMESTAMP: - writer.writeTimestamp((Timestamp)val); - - break; - - case GridBinaryMarshaller.TIME: - writer.writeTime((Time)val); - - break; - - case GridBinaryMarshaller.BYTE_ARR: - writer.writeByteArray((byte[])val); - - break; - - case GridBinaryMarshaller.SHORT_ARR: - writer.writeShortArray((short[])val); - - break; - - case GridBinaryMarshaller.INT_ARR: - writer.writeIntArray((int[])val); - - break; - - case GridBinaryMarshaller.LONG_ARR: - writer.writeLongArray((long[])val); - - break; - - case GridBinaryMarshaller.FLOAT_ARR: - writer.writeFloatArray((float[])val); - - break; - - case GridBinaryMarshaller.DOUBLE_ARR: - writer.writeDoubleArray((double[])val); - - break; - - case GridBinaryMarshaller.CHAR_ARR: - writer.writeCharArray((char[])val); - - break; - - case GridBinaryMarshaller.BOOLEAN_ARR: - writer.writeBooleanArray((boolean[])val); - - break; - - case GridBinaryMarshaller.DECIMAL_ARR: - writer.writeDecimalArray((BigDecimal[])val); - - break; - - case GridBinaryMarshaller.STRING_ARR: - writer.writeStringArray((String[])val); - - break; - - case GridBinaryMarshaller.UUID_ARR: - writer.writeUuidArray((UUID[])val); - - break; - - case GridBinaryMarshaller.DATE_ARR: - writer.writeDateArray((Date[])val); - - break; - - case GridBinaryMarshaller.TIMESTAMP_ARR: - writer.writeTimestampArray((Timestamp[])val); - - break; - - case GridBinaryMarshaller.TIME_ARR: - writer.writeTimeArray((Time[])val); - - break; - - default: - throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); - } - } - /** * @param val Value to check. * @return {@code True} if {@code val} instance of {@link BinaryEnumArray}. diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 72f4954af3d68..cc868f29f71b5 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -41,7 +41,7 @@ import org.apache.ignite.internal.UnregisteredClassException; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.processors.cache.CacheObject; -import org.apache.ignite.internal.processors.cache.odbc.SqlInputStreamWrapper; +import org.apache.ignite.internal.processors.odbc.SqlInputStreamWrapper; import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.F; @@ -355,8 +355,11 @@ else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) out.write(val, off, len); } - /** {@inheritDoc} */ - @Override public void writeBinaryArray(BinaryArray val) throws BinaryObjectException { + /** + * @param val Array wrapper. + * @throws BinaryObjectException In case of error. + */ + private void writeBinaryArray(BinaryArray val) { if (val.array() == null) out.writeByte(GridBinaryMarshaller.NULL); else { @@ -380,8 +383,8 @@ else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) } } - /** {@inheritDoc} */ - @Override public void writeBinaryEnum(BinaryObjectEx val) { + /** @param val Value. */ + private void writeBinaryEnum(BinaryObjectEx val) { assert val instanceof BinaryEnumObjectImpl; int typeId = val.typeId(); @@ -405,8 +408,8 @@ else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) } } - /** {@inheritDoc} */ - @Override public void writeProxy(Proxy proxy, Class[] intfs) { + /** @param proxy Proxy. */ + private void writeProxy(Proxy proxy, Class[] intfs) { if (proxy == null) out.writeByte(GridBinaryMarshaller.NULL); else { @@ -453,8 +456,8 @@ void writeByteField(@Nullable Byte val) { writeByteFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeClass(@Nullable Class val) { + /** @param val Class. */ + private void writeClass(@Nullable Class val) { if (val == null) out.writeByte(GridBinaryMarshaller.NULL); else { @@ -1294,8 +1297,8 @@ else if (ZERO_COPY && !BinaryUtils.USE_STR_SERIALIZATION_VER_2) doWriteEnumArray(val); } - /** {@inheritDoc} */ - @Override public void doWriteEnumArray(@Nullable Object[] val) { + /** @param val Array. */ + private void doWriteEnumArray(@Nullable Object[] val) { assert val == null || val.getClass().getComponentType().isEnum(); if (val == null) @@ -1449,8 +1452,22 @@ public void writeFieldIdNoSchemaUpdate(int fieldId) { fieldCnt++; } - /** {@inheritDoc} */ - @Override public int writeByteArray(InputStream in, int limit) throws BinaryObjectException { + + /** + * Write byte array from the InputStream. + * + *

If {@code limit} > 0 than no more than {@code limit} bytes will be read and written. + * If {@code limit} == -1 than it will try to read and write all bytes. + * + *

In any case if actual number of bytes is greater than {@code MAX_ARRAY_SIZE} + * than exception will be thrown. + * + * @param in InputStream. + * @param limit Max length of data to be read from the stream or -1 if all data should be read. + * @return Number of bytes written. + * @throws BinaryObjectException If an I/O error occurs or stream contains more than {@code MAX_ARRAY_SIZE} bytes. + */ + private int writeByteArray(InputStream in, int limit) throws BinaryObjectException { if (limit != -1) out.unsafeEnsure(1 + 4 + limit); else @@ -1495,11 +1512,6 @@ public void writeFieldIdNoSchemaUpdate(int fieldId) { return written; } - /** {@inheritDoc} */ - @Override public void schemaId(int schemaId) { - this.schemaId = schemaId; - } - /** {@inheritDoc} */ @Override public int schemaId() { return schemaId; @@ -1528,8 +1540,13 @@ private BinaryWriterHandles handles() { return handles; } - /** {@inheritDoc} */ - @Override public boolean tryWriteAsHandle(Object obj) { + /** + * Attempts to write the object as a handle. + * + * @param obj Object to write. + * @return {@code true} if the object has been written as a handle. + */ + private boolean tryWriteAsHandle(Object obj) { assert obj != null; int pos = out.position(); @@ -1573,8 +1590,14 @@ private void clearState(boolean clearHandler) { this.handles = null; } - /** {@inheritDoc} */ - @Override public void writeField(Object obj, BinaryFieldDescriptor fld) throws BinaryObjectException { + /** + * Write field. + * + * @param obj Object. + * @param fld Field. + * @throws BinaryObjectException If failed. + */ + private void writeField(Object obj, BinaryFieldDescriptor fld) throws BinaryObjectException { writeFieldIdNoSchemaUpdate(fld.id); switch (fld.mode) { @@ -1949,7 +1972,6 @@ else if (binObjAllow) } /** {@inheritDoc} */ - // TODO: check all methods to make private. @Override public void writePlainObject(Object val) { Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); @@ -2408,7 +2430,7 @@ private void write(Object obj, BinaryClassDescriptor desc) throws BinaryObjectEx } } - schemaId(desc.stableSchema.schemaId()); + schemaId = desc.stableSchema.schemaId(); postWrite(desc.userType, desc.registered); postWriteHashCode(obj, desc); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java index f2e1926a30d1a..87109a09e69ec 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java @@ -175,7 +175,7 @@ public void writeValue(BinaryWriterEx writer, Object val, boolean forceCol, bool Byte flag = BinaryUtils.PLAIN_CLASS_TO_FLAG.get(val.getClass()); if (flag != null) { - BinaryImplUtils.writePlainObject(writer, val); + writer.writePlainObject(val); return; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java index b1af1236fe078..2d8e70b5de545 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java @@ -39,7 +39,7 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; -import org.apache.ignite.internal.processors.cache.odbc.SqlInputStreamWrapper; +import org.apache.ignite.internal.processors.odbc.SqlInputStreamWrapper; import org.apache.ignite.internal.processors.odbc.SqlListenerUtils; import org.apache.ignite.internal.processors.odbc.SqlStateCode; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsRequest; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java index 42f8b75c93d90..cdd3d74c2d340 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java @@ -28,7 +28,6 @@ import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.jdbc2.JdbcBinaryBuffer; -import org.apache.ignite.internal.processors.cache.odbc.SqlInputStreamWrapper; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.query.IgniteSQLException; import org.apache.ignite.internal.util.typedef.F; @@ -130,8 +129,7 @@ public static boolean isPlainType(Class cls) { || cls == UUID.class || cls == Time.class || cls == Timestamp.class - || cls == java.sql.Date.class - || cls == java.util.Date.class + || cls == java.sql.Date.class || cls == java.util.Date.class || cls == boolean[].class || cls == byte[].class || cls == char[].class @@ -145,8 +143,7 @@ public static boolean isPlainType(Class cls) { || cls == UUID[].class || cls == Time[].class || cls == Timestamp[].class - || cls == java.util.Date[].class - || cls == java.sql.Date[].class + || cls == java.util.Date[].class || cls == java.sql.Date[].class || cls == SqlInputStreamWrapper.class || cls == Blob.class; } From 3e7a4d2721b98bb7fe00bbdf164a3d7d1d30f317 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 24 Sep 2026 17:22:14 +0300 Subject: [PATCH 03/33] WIP --- .../org/apache/ignite/internal/binary/BinaryWriterExImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index cc868f29f71b5..e98e898007034 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -1452,7 +1452,6 @@ public void writeFieldIdNoSchemaUpdate(int fieldId) { fieldCnt++; } - /** * Write byte array from the InputStream. * From a8a61bb931189695e09ff530a3fc759a7c7255be Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 25 Sep 2026 13:45:11 +0300 Subject: [PATCH 04/33] WIP --- .../internal/binary/BinaryReaderEx.java | 9 ++ .../ignite/internal/binary/BinaryUtils.java | 148 +++++++----------- .../internal/binary/BinaryReaderExImpl.java | 104 ++++++++++++ .../CacheObjectBinaryProcessorImpl.java | 5 +- .../processors/odbc/SqlListenerUtils.java | 28 +--- .../odbc/jdbc/JdbcQueryExecuteRequest.java | 2 +- .../processors/odbc/jdbc/JdbcUtils.java | 23 +-- .../processors/odbc/odbc/OdbcColumnMeta.java | 18 +-- .../odbc/odbc/OdbcRequestHandler.java | 62 +------- 9 files changed, 183 insertions(+), 216 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java index 1b1911297e857..20b98c446ab04 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java @@ -92,4 +92,13 @@ public interface BinaryReaderEx extends BinaryReader, BinaryRawReader, BinaryRea * @return Schema. */ public BinarySchema getOrCreateSchema(); + + /** + * Unmarshall JDBC supported type. + * @param type Type. + * @param binObjAllow Allow to read non plaint objects. + * @param keepBinary Whether to deserialize objects or keep in binary format. + * @return Read object. + */ + public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean keepBinary); } diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index d3585cb869c35..fc156c95d892f 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -37,6 +37,7 @@ import java.nio.charset.StandardCharsets; import java.sql.Time; import java.sql.Timestamp; +import java.sql.Types; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -325,6 +326,18 @@ public static Object unwrapTemporary(Object obj) { return obj; } + /** + * Get ODBC type ID for the type. + * @param dataType Data type class. + * @return Type ID. + */ + static byte jdbcTypeByClass(Class dataType) { + if (dataType.equals(java.sql.Date.class)) + return GridBinaryMarshaller.DATE; + + return typeByClass(dataType); + } + /** * @param cls Class. * @return Binary field type. @@ -1510,114 +1523,61 @@ public static Object doReadOptimized(BinaryInputStream in, BinaryContext ctx, @N } /** - * Unmarshall JDBC supported type. - * @param type Type. - * @param reader Binary reader. - * @param binObjAllow Allow to read non plaint objects. - * @param keepBinary Whether to deserialize objects or keep in binary format. - * @return Read object. + * Convert {@link java.sql.Types} to binary type constant (See {@link GridBinaryMarshaller} constants). + * + * @param sqlType SQL type. + * @return Binary type. */ - public static Object unmarshallJdbc(byte type, BinaryReaderEx reader, boolean binObjAllow, boolean keepBinary) { - switch (type) { - case GridBinaryMarshaller.NULL: - return null; + public static byte sqlTypeToBinary(int sqlType) { + switch (sqlType) { + case Types.BIGINT: + return GridBinaryMarshaller.LONG; - case GridBinaryMarshaller.BOOLEAN: - return reader.readBoolean(); + case Types.BOOLEAN: + return GridBinaryMarshaller.BOOLEAN; - case GridBinaryMarshaller.BYTE: - return reader.readByte(); + case Types.DATE: + return GridBinaryMarshaller.DATE; - case GridBinaryMarshaller.CHAR: - return reader.readChar(); + case Types.DOUBLE: + return GridBinaryMarshaller.DOUBLE; - case GridBinaryMarshaller.SHORT: - return reader.readShort(); + case Types.FLOAT: + case Types.REAL: + return GridBinaryMarshaller.FLOAT; - case GridBinaryMarshaller.INT: - return reader.readInt(); + case Types.NUMERIC: + case Types.DECIMAL: + return GridBinaryMarshaller.DECIMAL; - case GridBinaryMarshaller.LONG: - return reader.readLong(); + case Types.INTEGER: + return GridBinaryMarshaller.INT; - case GridBinaryMarshaller.FLOAT: - return reader.readFloat(); - - case GridBinaryMarshaller.DOUBLE: - return reader.readDouble(); - - case GridBinaryMarshaller.STRING: - return doReadString(reader.in()); - - case GridBinaryMarshaller.DECIMAL: - return doReadDecimal(reader.in()); + case Types.SMALLINT: + return GridBinaryMarshaller.SHORT; - case GridBinaryMarshaller.UUID: - return doReadUuid(reader.in()); + case Types.TIME: + return GridBinaryMarshaller.TIME; - case GridBinaryMarshaller.TIME: - return doReadTime(reader.in()); + case Types.TIMESTAMP: + return GridBinaryMarshaller.TIMESTAMP; - case GridBinaryMarshaller.TIMESTAMP: - return doReadTimestamp(reader.in()); + case Types.TINYINT: + return GridBinaryMarshaller.BYTE; - case GridBinaryMarshaller.DATE: - return doReadDate(reader.in()); + case Types.CHAR: + case Types.VARCHAR: + case Types.LONGNVARCHAR: + return GridBinaryMarshaller.STRING; - case GridBinaryMarshaller.BOOLEAN_ARR: - return doReadBooleanArray(reader.in()); - - case GridBinaryMarshaller.BYTE_ARR: - return doReadByteArray(reader.in()); - - case GridBinaryMarshaller.CHAR_ARR: - return doReadCharArray(reader.in()); - - case GridBinaryMarshaller.SHORT_ARR: - return doReadShortArray(reader.in()); - - case GridBinaryMarshaller.INT_ARR: - return doReadIntArray(reader.in()); - - case GridBinaryMarshaller.LONG_ARR: - return doReadLongArray(reader.in()); - - case GridBinaryMarshaller.FLOAT_ARR: - return doReadFloatArray(reader.in()); - - case GridBinaryMarshaller.DOUBLE_ARR: - return doReadDoubleArray(reader.in()); - - case GridBinaryMarshaller.STRING_ARR: - return doReadStringArray(reader.in()); - - case GridBinaryMarshaller.DECIMAL_ARR: - return doReadDecimalArray(reader.in()); - - case GridBinaryMarshaller.UUID_ARR: - return doReadUuidArray(reader.in()); - - case GridBinaryMarshaller.TIME_ARR: - return doReadTimeArray(reader.in()); - - case GridBinaryMarshaller.TIMESTAMP_ARR: - return doReadTimestampArray(reader.in()); - - case GridBinaryMarshaller.DATE_ARR: - return doReadDateArray(reader.in()); + case Types.NULL: + return GridBinaryMarshaller.NULL; + case Types.BINARY: + case Types.VARBINARY: + case Types.LONGVARBINARY: default: - reader.in().position(reader.in().position() - 1); - - if (binObjAllow) { - Object res = reader.readObjectDetached(); - - return !keepBinary && res instanceof BinaryObject - ? ((BinaryObject)res).deserialize() - : res; - } - else - throw new BinaryObjectException("Custom objects are not supported"); + return GridBinaryMarshaller.BYTE_ARR; } } @@ -2419,7 +2379,7 @@ public static void initUseBinaryArrays() { * @return {@link BinaryObjectExImpl#field(int)} value or {@code null} if object not instance of {@link BinaryObjectExImpl}. */ public static Object field(Object obj, int fieldId) { - if (!(obj instanceof BinaryObjectExImpl)) + if (!isBinaryObjectExImpl(obj)) return null; return ((BinaryObjectExImpl)obj).field(fieldId); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 8b0fe48dbb383..8733cef12cb3b 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -2032,6 +2032,110 @@ private int fieldId(String name) { return schema; } + /** {@inheritDoc} */ + @Override public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean keepBinary) { + switch (type) { + case GridBinaryMarshaller.NULL: + return null; + + case GridBinaryMarshaller.BOOLEAN: + return readBoolean(); + + case GridBinaryMarshaller.BYTE: + return readByte(); + + case GridBinaryMarshaller.CHAR: + return readChar(); + + case GridBinaryMarshaller.SHORT: + return readShort(); + + case GridBinaryMarshaller.INT: + return readInt(); + + case GridBinaryMarshaller.LONG: + return readLong(); + + case GridBinaryMarshaller.FLOAT: + return readFloat(); + + case GridBinaryMarshaller.DOUBLE: + return readDouble(); + + case GridBinaryMarshaller.STRING: + return BinaryUtils.doReadString(in()); + + case GridBinaryMarshaller.DECIMAL: + return BinaryUtils.doReadDecimal(in()); + + case GridBinaryMarshaller.UUID: + return BinaryUtils.doReadUuid(in()); + + case GridBinaryMarshaller.TIME: + return BinaryUtils.doReadTime(in()); + + case GridBinaryMarshaller.TIMESTAMP: + return BinaryUtils.doReadTimestamp(in()); + + case GridBinaryMarshaller.DATE: + return BinaryUtils.doReadDate(in()); + + case GridBinaryMarshaller.BOOLEAN_ARR: + return BinaryUtils.doReadBooleanArray(in()); + + case GridBinaryMarshaller.BYTE_ARR: + return BinaryUtils.doReadByteArray(in()); + + case GridBinaryMarshaller.CHAR_ARR: + return BinaryUtils.doReadCharArray(in()); + + case GridBinaryMarshaller.SHORT_ARR: + return BinaryUtils.doReadShortArray(in()); + + case GridBinaryMarshaller.INT_ARR: + return BinaryUtils.doReadIntArray(in()); + + case GridBinaryMarshaller.LONG_ARR: + return BinaryUtils.doReadLongArray(in()); + + case GridBinaryMarshaller.FLOAT_ARR: + return BinaryUtils.doReadFloatArray(in()); + + case GridBinaryMarshaller.DOUBLE_ARR: + return BinaryUtils.doReadDoubleArray(in()); + + case GridBinaryMarshaller.STRING_ARR: + return BinaryUtils.doReadStringArray(in()); + + case GridBinaryMarshaller.DECIMAL_ARR: + return BinaryUtils.doReadDecimalArray(in()); + + case GridBinaryMarshaller.UUID_ARR: + return BinaryUtils.doReadUuidArray(in()); + + case GridBinaryMarshaller.TIME_ARR: + return BinaryUtils.doReadTimeArray(in()); + + case GridBinaryMarshaller.TIMESTAMP_ARR: + return BinaryUtils.doReadTimestampArray(in()); + + case GridBinaryMarshaller.DATE_ARR: + return BinaryUtils.doReadDateArray(in()); + + default: + in().position(in().position() - 1); + + if (binObjAllow) { + Object res = readObjectDetached(); + + return !keepBinary && res instanceof BinaryObject + ? ((BinaryObject)res).deserialize() + : res; + } + else + throw new BinaryObjectException("Custom objects are not supported"); + } + } /** * Create schema. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java index 2e44c95fe2533..aaf1565663df6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java @@ -116,6 +116,7 @@ import static org.apache.ignite.IgniteSystemProperties.getBoolean; import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.BINARY_PROC; import static org.apache.ignite.internal.binary.BinaryUtils.affinityFieldName; +import static org.apache.ignite.internal.binary.BinaryUtils.isBinaryObjectImpl; import static org.apache.ignite.internal.binary.BinaryUtils.mergeMetadata; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; @@ -1155,7 +1156,7 @@ public BinaryField affinityKeyField(int typeId) { if (obj instanceof KeyCacheObject) { KeyCacheObject key = (KeyCacheObject)obj; - if (BinaryUtils.isBinaryObjectImpl(key)) { + if (isBinaryObjectImpl(key)) { // Need to create a copy because the key can be reused at the application layer after that (IGNITE-3505). key = key.copy(partition(ctx, cctx, key)); } @@ -1168,7 +1169,7 @@ else if (key.partition() == -1) obj = toBinary(obj, false); - if (BinaryUtils.isBinaryObjectImpl(obj)) { + if (isBinaryObjectImpl(obj)) { ((KeyCacheObject)obj).partition(partition(ctx, cctx, obj)); return (KeyCacheObject)obj; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java index cdd3d74c2d340..8b4e5f4d836d9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java @@ -25,7 +25,6 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.cache.query.QueryCancelledException; import org.apache.ignite.internal.binary.BinaryReaderEx; -import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.jdbc2.JdbcBinaryBuffer; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; @@ -85,30 +84,17 @@ public abstract class SqlListenerUtils { */ @Nullable public static Object readObject(byte type, BinaryReaderEx reader, boolean binObjAllow, boolean keepBinary, boolean createByteArrayCopy) throws BinaryObjectException { - if (type == GridBinaryMarshaller.BYTE_ARR && !createByteArrayCopy && reader.in().hasArray()) - return readJdbcByteArray(reader); + if (type == GridBinaryMarshaller.BYTE_ARR && !createByteArrayCopy && reader.in().hasArray()) { + int len = reader.in().readInt(); - return BinaryUtils.unmarshallJdbc(type, reader, binObjAllow, keepBinary); - } - - /** - * Read byte array using the reader. - * - *

Returns either (eagerly) new instance of the byte array with all data materialized, - * or {@link JdbcBinaryBuffer} which wraps part of the array enclosed in - * the reader's input stream in a copy-on-write manner. - * - * @param reader Reader. - * @return Either byte[] or {@link JdbcBinaryBuffer}. - */ - private static Object readJdbcByteArray(BinaryReaderEx reader) { - int len = reader.in().readInt(); + int position = reader.in().position(); - int position = reader.in().position(); + reader.in().position(position + len); - reader.in().position(position + len); + return JdbcBinaryBuffer.createReadOnly(reader.in().array(), position, len); + } - return JdbcBinaryBuffer.createReadOnly(reader.in().array(), position, len); + return reader.unmarshallJdbc(type, binObjAllow, keepBinary); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java index 99bc5a5c4ef25..e845999c7eaeb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java @@ -160,7 +160,7 @@ boolean autoCommit() { if (args != null) { for (Object arg : args) - JdbcUtils.writeObject(writer, arg, protoCtx); + writer.writeJdbcObject(arg, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); } if (protoCtx.isAutoCommitSupported()) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java index f6770751c6ea9..4f288a5ec5eb3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java @@ -24,7 +24,6 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderEx; import org.apache.ignite.internal.binary.BinaryWriterEx; -import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.odbc.SqlListenerUtils; import org.jetbrains.annotations.Nullable; @@ -44,7 +43,7 @@ public static void writeItems(BinaryWriterEx writer, List> items, J writer.writeInt(row.size()); for (Object obj : row) - writeObject(writer, obj, protoCtx); + writer.writeJdbcObject(obj, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); } } } @@ -161,24 +160,4 @@ public static void writeNullableInteger(BinaryWriterEx writer, @Nullable Integer ) throws BinaryObjectException { return readObject(reader, protoCtx, true); } - - /** - * @param writer Writer. - * @param obj Object to write. - * @param protoCtx Protocol context. - * @throws BinaryObjectException On error. - */ - public static void writeObject( - BinaryWriterEx writer, - @Nullable Object obj, - JdbcProtocolContext protoCtx - ) throws BinaryObjectException { - if (obj == null) { - writer.writeByte(GridBinaryMarshaller.NULL); - - return; - } - - writer.writeJdbcObject(obj, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT)); - } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcColumnMeta.java index 62212eae64781..a8e0a502a4dea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcColumnMeta.java @@ -18,12 +18,12 @@ package org.apache.ignite.internal.processors.odbc.odbc; import org.apache.ignite.binary.BinaryRawWriter; -import org.apache.ignite.internal.binary.BinaryUtils; -import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.odbc.ClientListenerProtocolVersion; import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; import org.apache.ignite.internal.util.typedef.internal.S; +import static org.apache.ignite.internal.binary.BinaryUtils.jdbcTypeByClass; + /** * SQL listener column metadata. */ @@ -130,7 +130,7 @@ public void write(BinaryRawWriter writer, ClientListenerProtocolVersion ver) { writer.writeString(tableName); writer.writeString(columnName); - byte typeId = getTypeId(dataType); + byte typeId = jdbcTypeByClass(dataType); writer.writeByte(typeId); @@ -144,18 +144,6 @@ public void write(BinaryRawWriter writer, ClientListenerProtocolVersion ver) { } } - /** - * Get ODBC type ID for the type. - * @param dataType Data type class. - * @return Type ID. - */ - private static byte getTypeId(Class dataType) { - if (dataType.equals(java.sql.Date.class)) - return GridBinaryMarshaller.DATE; - - return BinaryUtils.typeByClass(dataType); - } - /** {@inheritDoc} */ @Override public String toString() { return S.toString(OdbcColumnMeta.class, this); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java index 168205d136435..70927a99bf269 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.processors.odbc.odbc; import java.sql.BatchUpdateException; -import java.sql.Types; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -35,7 +34,6 @@ import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.binary.BinaryWriterEx; -import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.cache.query.SqlFieldsQueryEx; import org.apache.ignite.internal.processors.odbc.ClientListenerProtocolVersion; @@ -62,6 +60,7 @@ import static java.sql.ResultSetMetaData.columnNoNulls; import static java.sql.ResultSetMetaData.columnNullable; +import static org.apache.ignite.internal.binary.BinaryUtils.sqlTypeToBinary; import static org.apache.ignite.internal.processors.odbc.odbc.OdbcRequest.META_COLS; import static org.apache.ignite.internal.processors.odbc.odbc.OdbcRequest.META_PARAMS; import static org.apache.ignite.internal.processors.odbc.odbc.OdbcRequest.META_RESULTSET; @@ -818,65 +817,6 @@ private void CloseCursor(OdbcQueryResults results, long queryId) { qryResults.remove(queryId); } - /** - * Convert {@link java.sql.Types} to binary type constant (See {@link GridBinaryMarshaller} constants). - * - * @param sqlType SQL type. - * @return Binary type. - */ - private static byte sqlTypeToBinary(int sqlType) { - switch (sqlType) { - case Types.BIGINT: - return GridBinaryMarshaller.LONG; - - case Types.BOOLEAN: - return GridBinaryMarshaller.BOOLEAN; - - case Types.DATE: - return GridBinaryMarshaller.DATE; - - case Types.DOUBLE: - return GridBinaryMarshaller.DOUBLE; - - case Types.FLOAT: - case Types.REAL: - return GridBinaryMarshaller.FLOAT; - - case Types.NUMERIC: - case Types.DECIMAL: - return GridBinaryMarshaller.DECIMAL; - - case Types.INTEGER: - return GridBinaryMarshaller.INT; - - case Types.SMALLINT: - return GridBinaryMarshaller.SHORT; - - case Types.TIME: - return GridBinaryMarshaller.TIME; - - case Types.TIMESTAMP: - return GridBinaryMarshaller.TIMESTAMP; - - case Types.TINYINT: - return GridBinaryMarshaller.BYTE; - - case Types.CHAR: - case Types.VARCHAR: - case Types.LONGNVARCHAR: - return GridBinaryMarshaller.STRING; - - case Types.NULL: - return GridBinaryMarshaller.NULL; - - case Types.BINARY: - case Types.VARBINARY: - case Types.LONGVARBINARY: - default: - return GridBinaryMarshaller.BYTE_ARR; - } - } - /** * Checks whether string matches table type pattern. * From 48da14f4b85fd870ab23fd7962271690afa3f6e5 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 25 Sep 2026 14:47:28 +0300 Subject: [PATCH 05/33] WIP --- .../java/org/apache/ignite/internal/binary/BinaryUtils.java | 2 +- .../org/apache/ignite/internal/binary/BinaryReaderExImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index fc156c95d892f..a8eada1a50661 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -331,7 +331,7 @@ public static Object unwrapTemporary(Object obj) { * @param dataType Data type class. * @return Type ID. */ - static byte jdbcTypeByClass(Class dataType) { + public static byte jdbcTypeByClass(Class dataType) { if (dataType.equals(java.sql.Date.class)) return GridBinaryMarshaller.DATE; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 8733cef12cb3b..f98bc6c0894ba 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -2136,6 +2136,7 @@ private int fieldId(String name) { throw new BinaryObjectException("Custom objects are not supported"); } } + /** * Create schema. * From 085e6b85d24d4682b67ebf1629b605dbbffd4cea Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 10:01:01 +0300 Subject: [PATCH 06/33] WIP --- .../processors/odbc/SqlListenerUtils.java | 21 ++++--------------- .../processors/odbc/jdbc/JdbcUtils.java | 2 +- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java index 8b4e5f4d836d9..12a589323b236 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java @@ -56,25 +56,10 @@ public abstract class SqlListenerUtils { */ @Nullable public static Object readObject(BinaryReaderEx reader, boolean binObjAllow, boolean keepBinary) throws BinaryObjectException { - byte type = reader.readByte(); - - return readObject(type, reader, binObjAllow, keepBinary); - } - - /** - * @param type Object type. - * @param reader Reader. - * @param binObjAllow Allow to read non plaint objects. - * @return Read object. - * @throws BinaryObjectException On error. - */ - @Nullable public static Object readObject(byte type, BinaryReaderEx reader, boolean binObjAllow, - boolean keepBinary) throws BinaryObjectException { - return readObject(type, reader, binObjAllow, keepBinary, true); + return readObject(reader, binObjAllow, keepBinary, true); } /** - * @param type Object type. * @param reader Reader. * @param binObjAllow Allow to read non plaint objects. * @param keepBinary Whether to deserialize objects or keep in binary format. @@ -82,8 +67,10 @@ public abstract class SqlListenerUtils { * @return Read object. * @throws BinaryObjectException On error. */ - @Nullable public static Object readObject(byte type, BinaryReaderEx reader, boolean binObjAllow, + @Nullable public static Object readObject(BinaryReaderEx reader, boolean binObjAllow, boolean keepBinary, boolean createByteArrayCopy) throws BinaryObjectException { + byte type = reader.readByte(); + if (type == GridBinaryMarshaller.BYTE_ARR && !createByteArrayCopy && reader.in().hasArray()) { int len = reader.in().readInt(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java index 4f288a5ec5eb3..05e065eb6f360 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java @@ -144,7 +144,7 @@ public static void writeNullableInteger(BinaryWriterEx writer, @Nullable Integer JdbcProtocolContext protoCtx, boolean createByteArrayCopy ) throws BinaryObjectException { - return SqlListenerUtils.readObject(reader.readByte(), reader, + return SqlListenerUtils.readObject(reader, protoCtx.isFeatureSupported(JdbcThinFeature.CUSTOM_OBJECT), protoCtx.keepBinary(), createByteArrayCopy); } From d8a2193876ad33a190d23e0c3dd11131ddb0f26a Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 10:44:36 +0300 Subject: [PATCH 07/33] WIP --- .../apache/ignite/internal/binary/BinaryImplUtils.java | 10 ---------- .../binary/builder/BinaryObjectBuilderImpl.java | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index d70afe87add54..358d678c8593a 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -309,16 +309,6 @@ public static boolean isBinaryEnumArray(Object val) { return val instanceof BinaryEnumArray; } - /** - * Gets field by its order. - * - * @param reader Reader. - * @param order Order. - */ - public static int fieldId(BinaryReaderEx reader, int order) { - return reader.getOrCreateSchema().fieldId(order); - } - /** */ public static int hashCode(byte[] data, int startPos, int endPos) { int hash = 1; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 33d372f374181..815c0c74d3ba2 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -249,7 +249,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { int idx = 0; while (reader.position() < rawPos) { - int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++); + int fieldId = reader.reader().getOrCreateSchema().fieldId(idx++); int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen).get2(); @@ -475,7 +475,7 @@ private void ensureReadCacheInit() { int idx = 0; while (footerPos + fieldIdLen < footerEnd) { - int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++); + int fieldId = reader.reader().getOrCreateSchema().fieldId(idx++); IgniteBiTuple posAndLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen); From c6d28cf014e787ce9d074c649da179a461366998 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 11:02:23 +0300 Subject: [PATCH 08/33] WIP --- .../internal/binary/BinaryReaderEx.java | 41 ---------------- .../internal/binary/BinaryObjectImpl.java | 8 +-- .../binary/BinaryObjectOffheapImpl.java | 6 +-- .../internal/binary/BinaryReaderExImpl.java | 49 ++++++++++++++----- .../binary/builder/BinaryBuilderReader.java | 13 +++-- 5 files changed, 49 insertions(+), 68 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java index 20b98c446ab04..5dbc642459cd0 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java @@ -46,53 +46,12 @@ public interface BinaryReaderEx extends BinaryReader, BinaryRawReader, BinaryRea */ public BinaryInputStream in(); - /** - * @param offset Offset in the array. - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - public Object unmarshal(int offset); - /** * @return Deserialized object. * @throws BinaryObjectException If failed. */ public Object deserialize() throws BinaryObjectException; - /** - * @return Descriptor. - */ - public BinaryClassDescriptor descriptor(); - - /** - * @param fieldName Field name. - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - public Object unmarshalField(String fieldName) throws BinaryObjectException; - - /** - * @param fieldId Field ID. - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - public Object unmarshalField(int fieldId) throws BinaryObjectException; - - /** - * Try finding the field by name. - * - * @param name Field name. - * @return Offset. - */ - public boolean findFieldByName(String name); - - /** - * Get or create object schema. - * - * @return Schema. - */ - public BinarySchema getOrCreateSchema(); - /** * Unmarshall JDBC supported type. * @param type Type. diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index d41d6a3160d1a..4f625babc3768 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -781,7 +781,7 @@ else if (fieldOffsetLen == BinaryImplUtils.OFFSET_2) * @return Object. */ private Object deserializeValue(@Nullable CacheObjectValueContext coCtx) { - BinaryReaderEx reader = reader(null, coCtx != null ? coCtx.classLoader() : ctx.classLoader(), true); + BinaryReaderExImpl reader = reader(null, coCtx != null ? coCtx.classLoader() : ctx.classLoader(), true); Object obj0 = reader.deserialize(); @@ -811,12 +811,12 @@ private boolean needCopy(CacheObjectValueContext ctx) { * @param forUnmarshal {@code True} if reader is need to unmarshal object. * @return Reader. */ - private BinaryReaderEx reader(@Nullable BinaryReaderHandles rCtx, @Nullable ClassLoader ldr, + private BinaryReaderExImpl reader(@Nullable BinaryReaderHandles rCtx, @Nullable ClassLoader ldr, boolean forUnmarshal) { if (ldr == null) ldr = ctx.classLoader(); - return BinaryUtils.reader(ctx, + return new BinaryReaderExImpl(ctx, BinaryStreams.inputStream(arr, start), ldr, rCtx, @@ -831,7 +831,7 @@ private BinaryReaderEx reader(@Nullable BinaryReaderHandles rCtx, @Nullable Clas * @param forUnmarshal {@code True} if reader is need to unmarshal object. * @return Reader. */ - private BinaryReaderEx reader(@Nullable BinaryReaderHandles rCtx, boolean forUnmarshal) { + private BinaryReaderExImpl reader(@Nullable BinaryReaderHandles rCtx, boolean forUnmarshal) { return reader(rCtx, null, forUnmarshal); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java index 9ad6c06a605d4..dc439b77d11c6 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java @@ -497,7 +497,7 @@ private Object deserializeValue() { * @param forUnmarshal {@code True} if reader is needed to unmarshal object. * @return Reader. */ - private BinaryReaderEx reader(@Nullable BinaryReaderHandles rCtx, boolean forUnmarshal) { + private BinaryReaderExImpl reader(@Nullable BinaryReaderHandles rCtx, boolean forUnmarshal) { return reader(rCtx, ctx.classLoader(), forUnmarshal); } @@ -509,13 +509,13 @@ private BinaryReaderEx reader(@Nullable BinaryReaderHandles rCtx, boolean forUnm * @param forUnmarshal {@code True} if reader is needed to unmarshal object. * @return Reader. */ - private BinaryReaderEx reader(@Nullable BinaryReaderHandles rCtx, @Nullable ClassLoader ldr, + private BinaryReaderExImpl reader(@Nullable BinaryReaderHandles rCtx, @Nullable ClassLoader ldr, boolean forUnmarshal) { BinaryInputStream stream = BinaryStreams.inputStream(ptr, size); stream.position(start); - return BinaryUtils.reader(ctx, + return new BinaryReaderExImpl(ctx, stream, ldr, rCtx, diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index f98bc6c0894ba..7e746e67243bf 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -96,7 +96,7 @@ * Binary reader implementation. */ @SuppressWarnings("unchecked") -class BinaryReaderExImpl implements BinaryReaderEx { +public class BinaryReaderExImpl implements BinaryReaderEx { /** Binary context. */ private final BinaryContext ctx; @@ -312,23 +312,33 @@ public BinaryReaderExImpl(BinaryContext ctx, return in; } - /** {@inheritDoc} */ - @Override public BinaryClassDescriptor descriptor() { + /** + * @return Descriptor. + */ + public BinaryClassDescriptor descriptor() { if (desc == null) desc = ctx.descriptorForTypeId(userType, typeId, ldr, false); return desc; } - /** {@inheritDoc} */ - @Override public Object unmarshal(int offset) throws BinaryObjectException { + /** + * @param offset Offset in the array. + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + public Object unmarshal(int offset) throws BinaryObjectException { streamPosition(offset); return in.position() >= 0 ? BinaryUtils.unmarshal(in, ctx, ldr, this) : null; } - /** {@inheritDoc} */ - @Override public Object unmarshalField(String fieldName) throws BinaryObjectException { + /** + * @param fieldName Field name. + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + public Object unmarshalField(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? BinaryUtils.unmarshal(in, ctx, ldr, this) : null; } @@ -337,8 +347,12 @@ public BinaryReaderExImpl(BinaryContext ctx, } } - /** {@inheritDoc} */ - @Override public Object unmarshalField(int fieldId) throws BinaryObjectException { + /** + * @param fieldId Field ID. + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + public Object unmarshalField(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? BinaryUtils.unmarshal(in, ctx, ldr, this) : null; } @@ -1981,8 +1995,12 @@ private int fieldId(String name) { return mapper.fieldId(typeId, name); } - /** {@inheritDoc} */ - @Override public BinarySchema getOrCreateSchema() { + /** + * Get or create object schema. + * + * @return Schema. + */ + public BinarySchema getOrCreateSchema() { BinarySchema schema = ctx.schemaRegistry(typeId).schema(schemaId); if (schema == null) { @@ -2161,8 +2179,13 @@ private BinarySchema createSchema() { return builder.build(); } - /** {@inheritDoc} */ - @Override public boolean findFieldByName(String name) { + /** + * Try finding the field by name. + * + * @param name Field name. + * @return Offset. + */ + public boolean findFieldByName(String name) { if (raw) throw new BinaryObjectException("Failed to read named field because reader is in raw mode."); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java index 6f2a505f7b94f..0cb0c89e2bfb4 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java @@ -24,12 +24,11 @@ import java.util.Map; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryContext; -import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.binary.BinaryPositionReadable; import org.apache.ignite.internal.binary.BinaryPrimitives; -import org.apache.ignite.internal.binary.BinaryReaderEx; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.BinaryWriterEx; import org.apache.ignite.internal.binary.GridBinaryMarshaller; @@ -51,7 +50,7 @@ class BinaryBuilderReader implements BinaryPositionReadable { private final byte[] arr; /** */ - private final BinaryReaderEx reader; + private final BinaryReaderExImpl reader; /** */ private final Map objMap; @@ -69,7 +68,7 @@ class BinaryBuilderReader implements BinaryPositionReadable { arr = objImpl.bytes(); pos = objImpl.start(); - reader = BinaryUtils.reader(ctx, + reader = new BinaryReaderExImpl(ctx, BinaryStreams.inputStream(arr, pos), ctx.classLoader(), false); @@ -88,10 +87,10 @@ class BinaryBuilderReader implements BinaryPositionReadable { this.arr = other.arr; this.pos = start; - reader = BinaryImplUtils.reader(ctx, + reader = new BinaryReaderExImpl(ctx, BinaryStreams.inputStream(arr, start), null, - other.reader, + other.reader.handles(), false); this.objMap = other.objMap; @@ -899,7 +898,7 @@ public void skip(int n) { /** * @return Reader. */ - BinaryReaderEx reader() { + BinaryReaderExImpl reader() { return reader; } From 668f9a51e064a2d506c859bc9aee4284bc57ca35 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 11:14:56 +0300 Subject: [PATCH 09/33] WIP --- .../org/apache/ignite/internal/binary/BinaryWriterEx.java | 5 ----- .../apache/ignite/internal/binary/GridBinaryMarshaller.java | 2 +- .../internal/binary/builder/BinaryObjectBuilderImpl.java | 2 +- .../org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java | 6 +++--- .../internal/processors/odbc/ClientListenerNioListener.java | 2 +- .../internal/processors/odbc/jdbc/JdbcMessageParser.java | 2 +- .../internal/processors/odbc/odbc/OdbcMessageParser.java | 6 +++--- .../ignite/internal/binary/BinaryMarshallerSelfTest.java | 2 +- .../internal/binary/RawBinaryObjectExtractorTest.java | 2 +- 9 files changed, 12 insertions(+), 17 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java index 1ec84e743773c..69ed1baf974ef 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java @@ -71,11 +71,6 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut */ void marshal(Object obj) throws BinaryObjectException; - /** - * @return Array. - */ - public byte[] array(); - /** * Perform pre-write. Reserves space for header and writes class name if needed. * diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 75e5252f13065..ea72c9fad8dd8 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -255,7 +255,7 @@ public byte[] marshal(@Nullable Object obj, boolean failIfUnregistered) throws B try (BinaryWriterEx writer = BinaryUtils.writer(ctx, failIfUnregistered, UNREGISTERED_TYPE_ID)) { writer.marshal(obj); - return writer.array(); + return writer.out().arrayCopy(); } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 815c0c74d3ba2..2f6907637d8c4 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -188,7 +188,7 @@ public BinaryObjectBuilderImpl(BinaryObjectEx obj) { serializeTo(writer, serializationCtx); - byte[] arr = writer.array(); + byte[] arr = writer.out().arrayCopy(); return new BinaryObjectImpl(ctx, arr, 0); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index faa6d7a5c4c0a..0a7fc4f2a152e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -347,7 +347,7 @@ private HandshakeResult handshake(ClientListenerProtocolVersion ver) throws IOEx writer.writeString(connProps.getPassword()); } - send(writer.array()); + send(writer.out().arrayCopy()); BinaryReaderEx reader = BinaryUtils.reader(ctx, BinaryStreams.inputStream(read()), null, false); @@ -452,7 +452,7 @@ private HandshakeResult handshake_2_1_0() throws IOException, SQLException { writer.writeBoolean(connProps.isReplicatedOnly()); writer.writeBoolean(connProps.isAutoCloseServerCursor()); - send(writer.array()); + send(writer.out().arrayCopy()); BinaryReaderEx reader = BinaryUtils.reader(null, BinaryStreams.inputStream(read()), null, false); @@ -593,7 +593,7 @@ private void sendRequestRaw(JdbcRequest req) throws IOException { req.writeBinary(writer, protoCtx); synchronized (connMux) { - send(writer.array()); + send(writer.out().arrayCopy()); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java index b72125fad2625..7bc2f4cdb15c4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java @@ -458,7 +458,7 @@ private void onHandshake(GridNioSession ses, ClientMessage msg) { } } - ses.send(new ClientMessage(writer.array())); + ses.send(new ClientMessage(writer.out().arrayCopy())); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMessageParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMessageParser.java index 852fb6997bffa..26524a84ee785 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMessageParser.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMessageParser.java @@ -95,7 +95,7 @@ protected BinaryWriterEx createWriter(int cap) { res.writeBinary(writer, protoCtx); - return new ClientMessage(writer.array()); + return new ClientMessage(writer.out().arrayCopy()); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java index d135be97519ae..ee82742d4bbf2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcMessageParser.java @@ -273,13 +273,13 @@ public OdbcMessageParser(GridKernalContext ctx, ClientListenerProtocolVersion ve if (msg.status() != ClientListenerResponse.STATUS_SUCCESS) { writer.writeString(msg.error()); - return new ClientMessage(writer.array()); + return new ClientMessage(writer.out().arrayCopy()); } Object res0 = msg.response(); if (res0 == null) - return new ClientMessage(writer.array()); + return new ClientMessage(writer.out().arrayCopy()); else if (res0 instanceof OdbcQueryExecuteResult) { OdbcQueryExecuteResult res = (OdbcQueryExecuteResult)res0; @@ -411,7 +411,7 @@ else if (res0 instanceof OdbcQueryGetResultsetMetaResult) { else assert false : "Should not reach here."; - return new ClientMessage(writer.array()); + return new ClientMessage(writer.out().arrayCopy()); } /** diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java index cb53073815f3f..504868c0af647 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java @@ -3047,7 +3047,7 @@ public void testThreadLocalArrayReleased() throws Exception { writer.writeString("Thread local test"); - writer.array(); + writer.out().arrayCopy(); assertEquals(true, BinaryStreamsTestUtils.threadLocalIsAcquired()); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java index 8d3c9f7804bc0..a9b019df27f58 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java @@ -54,7 +54,7 @@ public void test() throws Exception { try (BinaryWriterEx writer = BinaryUtils.writer(ctx, false, UNREGISTERED_TYPE_ID)) { testObjects.forEach(writer::writeObject); - serializedTestObjectsBytes = writer.array(); + serializedTestObjectsBytes = writer.out().arrayCopy(); } RawBinaryObjectExtractor rawReader = new RawBinaryObjectExtractor(BinaryStreams.inputStream(serializedTestObjectsBytes)); From 0e793aeed1fb72769f4e053e2e9351e331e84c94 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 11:17:39 +0300 Subject: [PATCH 10/33] WIP --- .../apache/ignite/internal/binary/BinaryWriterExImpl.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index e98e898007034..3fd2477a1ce13 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -223,11 +223,6 @@ private void marshal0(Object obj, boolean enableReplace) throws BinaryObjectExce write(obj, desc); } - /** {@inheritDoc} */ - @Override public byte[] array() { - return out.arrayCopy(); - } - /** * @return Stream current position. */ From 00dfa8db513f560bd073ae639265174eedf15781 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 11:49:05 +0300 Subject: [PATCH 11/33] IGNITE-28207 Remove preWrite, postWrite, postWriteHashCode, popSchema, writeFieldId from BinaryWriterEx These methods are used only by BinaryObjectBuilderImpl in binary-impl. The builder now works with BinaryWriterExImpl directly, so the methods live on the implementation only. BinaryWriterExImpl is made public so the builder package can reference it; newWriter() gets a covariant return type. Co-Authored-By: Claude Fable 5.1 --- .../internal/binary/BinaryWriterEx.java | 41 ---------------- .../internal/binary/BinariesFactoryImpl.java | 5 ++ .../internal/binary/BinaryWriterExImpl.java | 49 ++++++++++++++----- .../binary/builder/BinaryBuilderEnum.java | 4 +- .../binary/builder/BinaryBuilderReader.java | 4 +- .../BinaryBuilderSerializationAware.java | 4 +- .../builder/BinaryBuilderSerializer.java | 10 ++-- .../builder/BinaryEnumArrayLazyValue.java | 4 +- .../binary/builder/BinaryLazyArrayList.java | 4 +- .../binary/builder/BinaryLazyLinkedList.java | 4 +- .../binary/builder/BinaryLazyMap.java | 4 +- .../binary/builder/BinaryLazySet.java | 4 +- .../builder/BinaryModifiableLazyValue.java | 4 +- .../builder/BinaryObjectArrayLazyValue.java | 4 +- .../builder/BinaryObjectBuilderImpl.java | 6 +-- .../builder/BinaryPlainBinaryObject.java | 4 +- .../binary/builder/BinaryPlainLazyValue.java | 4 +- .../binary/builder/BinaryValueWithType.java | 4 +- 18 files changed, 75 insertions(+), 88 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java index 69ed1baf974ef..92ba4a678bc1e 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java @@ -71,47 +71,6 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut */ void marshal(Object obj) throws BinaryObjectException; - /** - * Perform pre-write. Reserves space for header and writes class name if needed. - * - * @param clsName Class name (optional). - */ - public void preWrite(@Nullable String clsName); - - /** - * Perform post-write. Fills object header. - * - * @param userType User type flag. - * @param registered Whether type is registered. - */ - public void postWrite(boolean userType, boolean registered); - - /** - * Perform post-write hash code update if necessary. - * - * @param clsName Class name. Always null if class is registered. - */ - public void postWriteHashCode(@Nullable String clsName); - - /** - * Pop schema. - */ - public void popSchema(); - - /** - * Write field ID. - * @param fieldId Field ID. - */ - public void writeFieldId(int fieldId); - - /** - * Create new writer with same context. - * - * @param typeId type - * @return New writer. - */ - public BinaryWriterEx newWriter(int typeId); - /** * Writes a sub array of bytes. * @param b the data to be written diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index 35aacbae8a59a..ad01847b5c2cf 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -65,6 +65,11 @@ public class BinariesFactoryImpl implements BinariesFactory { /** {@inheritDoc} */ @Override public BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered, int typeId) { + return newWriter(ctx, failIfUnregistered, typeId); + } + + /** */ + public static BinaryWriterExImpl newWriter(BinaryContext ctx, boolean failIfUnregistered, int typeId) { BinaryThreadLocalContext locCtx = BinaryThreadLocalContext.get(); return new BinaryWriterExImpl( diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 3fd2477a1ce13..c834cd7b3fb70 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -58,7 +58,7 @@ /** * Binary writer implementation. */ -class BinaryWriterExImpl implements BinaryWriterEx { +public class BinaryWriterExImpl implements BinaryWriterEx { /** Zero-copy serialization enabled flag. */ static final boolean ZERO_COPY = IgniteCommonsSystemProperties.getBoolean(IGNITE_BINARY_STRING_ZERO_COPY, DFLT_ZERO_COPY); @@ -230,16 +230,25 @@ int position() { return out.position(); } - /** {@inheritDoc} */ - @Override public void preWrite(@Nullable String clsName) { + /** + * Perform pre-write. Reserves space for header and writes class name if needed. + * + * @param clsName Class name (optional). + */ + public void preWrite(@Nullable String clsName) { out.position(out.position() + GridBinaryMarshaller.DFLT_HDR_LEN); if (clsName != null) writeString(clsName); } - /** {@inheritDoc} */ - @Override public void postWrite(boolean userType, boolean registered) { + /** + * Perform post-write. Fills object header. + * + * @param userType User type flag. + * @param registered Whether type is registered. + */ + public void postWrite(boolean userType, boolean registered) { short flags; boolean useCompactFooter; @@ -308,8 +317,12 @@ else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) out.unsafePosition(retPos); } - /** {@inheritDoc} */ - @Override public void postWriteHashCode(@Nullable String clsName) { + /** + * Perform post-write hash code update if necessary. + * + * @param clsName Class name. Always null if class is registered. + */ + public void postWriteHashCode(@Nullable String clsName) { int typeId = clsName == null ? this.typeId : ctx.typeId(clsName); BinaryIdentityResolver identity = ctx.identity(typeId); @@ -334,8 +347,10 @@ else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) } } - /** {@inheritDoc} */ - @Override public void popSchema() { + /** + * Pop schema. + */ + public void popSchema() { if (fieldCnt > 0) schema.pop(fieldCnt); } @@ -1421,8 +1436,11 @@ private void writeFieldId(String fieldName) throws BinaryObjectException { writeFieldId(id); } - /** {@inheritDoc} */ - @Override public void writeFieldId(int fieldId) { + /** + * Write field ID. + * @param fieldId Field ID. + */ + public void writeFieldId(int fieldId) { int fieldOff = out.position() - start; // Advance schema hash. @@ -1561,8 +1579,13 @@ private boolean tryWriteAsHandle(Object obj) { } } - /** {@inheritDoc} */ - @Override public BinaryWriterEx newWriter(int typeId) { + /** + * Create new writer with same context. + * + * @param typeId type + * @return New writer. + */ + public BinaryWriterExImpl newWriter(int typeId) { return new BinaryWriterExImpl(ctx, out, schema, handles(), failIfUnregistered, typeId); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java index ee60218d0b140..e74f21a524ed5 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.binary.builder; import org.apache.ignite.binary.BinaryInvalidTypeException; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.marshaller.ClassLoaderUtils; @@ -81,7 +81,7 @@ public int getOrdinal() { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { writer.writeByte(GridBinaryMarshaller.ENUM); if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) { diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java index 0cb0c89e2bfb4..c6360be745b58 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java @@ -30,7 +30,7 @@ import org.apache.ignite.internal.binary.BinaryPrimitives; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryUtils; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryStreams; @@ -933,7 +933,7 @@ private Object wrappedCollection() { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { ctx.writeValue(writer, wrappedCollection()); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java index d89651e550706..7710ba3ce9dc2 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializationAware.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.binary.builder; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** * @@ -27,5 +27,5 @@ interface BinaryBuilderSerializationAware { * @param writer Writer. * @param ctx Context. */ - public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx); + public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java index 87109a09e69ec..1184e2453c01d 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java @@ -25,7 +25,7 @@ import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryUtils; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.util.CommonUtils; @@ -51,7 +51,7 @@ public void registerObjectWriting(BinaryObjectBuilderImpl obj, int posInResArr) * @param writer Writer. * @param val Value. */ - public void writeValue(BinaryWriterEx writer, Object val) { + public void writeValue(BinaryWriterExImpl writer, Object val) { writeValue(writer, val, false, false); } @@ -61,7 +61,7 @@ public void writeValue(BinaryWriterEx writer, Object val) { * @param forceCol Whether to force collection type. * @param forceMap Whether to force map type. */ - public void writeValue(BinaryWriterEx writer, Object val, boolean forceCol, boolean forceMap) { + public void writeValue(BinaryWriterExImpl writer, Object val, boolean forceCol, boolean forceMap) { assert !(forceCol && forceMap); if (val == null) { @@ -242,7 +242,7 @@ public void writeValue(BinaryWriterEx writer, Object val, boolean forceCol, bool * @param arr The array. * @param compTypeId Component type ID. */ - public void writeArray(BinaryWriterEx writer, byte elementType, Object[] arr, int compTypeId) { + public void writeArray(BinaryWriterExImpl writer, byte elementType, Object[] arr, int compTypeId) { writer.writeByte(elementType); writer.writeInt(compTypeId); writer.writeInt(arr.length); @@ -257,7 +257,7 @@ public void writeArray(BinaryWriterEx writer, byte elementType, Object[] arr, in * @param arr The array. * @param clsName Component class name. */ - public void writeArray(BinaryWriterEx writer, byte elementType, Object[] arr, String clsName) { + public void writeArray(BinaryWriterExImpl writer, byte elementType, Object[] arr, String clsName) { writer.writeByte(elementType); writer.writeInt(GridBinaryMarshaller.UNREGISTERED_TYPE_ID); writer.writeString(clsName); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java index 630ca685e80d9..53de9acfbf5c5 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java @@ -19,7 +19,7 @@ import org.apache.ignite.binary.BinaryInvalidTypeException; import org.apache.ignite.binary.BinaryObjectException; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.marshaller.ClassLoaderUtils; @@ -98,7 +98,7 @@ protected BinaryEnumArrayLazyValue(BinaryBuilderReader reader) { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (val != null) { if (clsName != null) ctx.writeArray(writer, GridBinaryMarshaller.ENUM_ARR, (Object[])val, clsName); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java index 1e7cdfe4af364..7881547856478 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyArrayList.java @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import static org.apache.ignite.internal.binary.builder.BinaryObjectBuildersFactoryImpl.unwrapLazy; @@ -133,7 +133,7 @@ private void ensureDelegateInit() { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (delegate == null) { int size = reader.readIntPositioned(off + 1); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java index c6b4a7f85312b..8a1284bbadafa 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyLinkedList.java @@ -23,7 +23,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import static org.apache.ignite.internal.binary.builder.BinaryObjectBuildersFactoryImpl.unwrapLazy; @@ -191,7 +191,7 @@ private void ensureDelegateInit() { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (delegate == null) { int size = reader.readIntPositioned(off + 1); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java index 4214f10daca9b..8bfa2e65912ed 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazyMap.java @@ -23,7 +23,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.jetbrains.annotations.Nullable; @@ -87,7 +87,7 @@ private void ensureDelegateInit() { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (delegate == null) { int size = reader.readIntPositioned(off + 1); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java index d4a1c8c06d952..d497194e3fad5 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryLazySet.java @@ -19,7 +19,7 @@ import java.util.Collection; import java.util.Set; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.util.CommonUtils; @@ -48,7 +48,7 @@ class BinaryLazySet extends BinaryAbstractLazyValue { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (val == null) { int size = reader.readIntPositioned(off + 1); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java index 0fac41bb6cc10..9eaa65ca5bb1a 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryModifiableLazyValue.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.binary.builder; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** * @@ -43,7 +43,7 @@ public BinaryModifiableLazyValue(BinaryBuilderReader reader, int valOff, int len } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (val == null) writer.write(reader.array(), valOff, len); else diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java index 008face8a81fd..4a19041de3fe1 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.binary.builder; import org.apache.ignite.binary.BinaryInvalidTypeException; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.marshaller.ClassLoaderUtils; @@ -81,7 +81,7 @@ protected BinaryObjectArrayLazyValue(BinaryBuilderReader reader) { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (clsName == null) ctx.writeArray(writer, GridBinaryMarshaller.OBJ_ARR, lazyValsArr, compTypeId); else diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 2f6907637d8c4..3b4451ec861a5 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -37,7 +37,7 @@ import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.binary.BinaryUtils; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.marshaller.ClassLoaderUtils; import org.apache.ignite.internal.util.CommonUtils; @@ -177,7 +177,7 @@ public BinaryObjectBuilderImpl(BinaryObjectEx obj) { @Override public BinaryObject build() { Thread curThread = Thread.currentThread(); - try (BinaryWriterEx writer = BinaryUtils.writer( + try (BinaryWriterExImpl writer = BinariesFactoryImpl.newWriter( ctx, curThread instanceof IgniteThread && ((IgniteThread)curThread).isForbiddenToRequestBinaryMetadata(), typeId) @@ -198,7 +198,7 @@ public BinaryObjectBuilderImpl(BinaryObjectEx obj) { * @param writer Writer. * @param serializer Serializer. */ - void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { + void serializeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer serializer) { try { writer.preWrite(registeredType ? null : clsNameToWrite); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java index 8de3514b8723a..dcc674964957c 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainBinaryObject.java @@ -20,7 +20,7 @@ import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryUtils; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** * @@ -42,7 +42,7 @@ public BinaryPlainBinaryObject(BinaryObject binaryObj) { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { writer.writeBinaryObject((BinaryObjectEx)BinaryUtils.unwrapTemporary(binaryObj)); } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java index 56cd5bd9c94e1..84e96d3e9e72c 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryPlainLazyValue.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.binary.builder; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** * @@ -43,7 +43,7 @@ protected BinaryPlainLazyValue(BinaryBuilderReader reader, int valOff, int len) } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { writer.write(reader.array(), valOff, len); } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java index 84364c0b04691..c5a3e0ad523e1 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryValueWithType.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.binary.builder; -import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.util.typedef.internal.S; @@ -41,7 +41,7 @@ class BinaryValueWithType implements BinaryLazyValue { } /** {@inheritDoc} */ - @Override public void writeTo(BinaryWriterEx writer, BinaryBuilderSerializer ctx) { + @Override public void writeTo(BinaryWriterExImpl writer, BinaryBuilderSerializer ctx) { if (val instanceof BinaryBuilderSerializationAware) ((BinaryBuilderSerializationAware)val).writeTo(writer, ctx); else From f49834fc62d956c86e1b7ecf6523eca2f8c09051 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 11:57:33 +0300 Subject: [PATCH 12/33] IGNITE-28207 Remove writePlainObject from BinaryWriterEx Used only by BinaryBuilderSerializer in binary-impl, which already works with BinaryWriterExImpl. Co-Authored-By: Claude Fable 5.1 --- .../org/apache/ignite/internal/binary/BinaryWriterEx.java | 7 ------- .../apache/ignite/internal/binary/BinaryWriterExImpl.java | 8 ++++++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java index 92ba4a678bc1e..5e24588985ac1 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java @@ -106,11 +106,4 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut * @throws BinaryObjectException On error. */ public void writeJdbcObject(@Nullable Object obj, boolean binObjAllow); - - /** - * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. - * - * @param val Value. - */ - public void writePlainObject(Object val); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index c834cd7b3fb70..04065ccdcaed2 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -1988,8 +1988,12 @@ else if (binObjAllow) throw new BinaryObjectException("Custom objects are not supported"); } - /** {@inheritDoc} */ - @Override public void writePlainObject(Object val) { + /** + * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. + * + * @param val Value. + */ + public void writePlainObject(Object val) { Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); if (flag == null) From 79a92939868805c66b20f48fc7dae3710876db86 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 11:58:48 +0300 Subject: [PATCH 13/33] IGNITE-28207 Remove writeBinaryObject from BinaryWriterEx Used only by BinaryPlainBinaryObject in binary-impl, which already works with BinaryWriterExImpl. Co-Authored-By: Claude Fable 5.1 --- .../org/apache/ignite/internal/binary/BinaryWriterEx.java | 6 ------ .../apache/ignite/internal/binary/BinaryWriterExImpl.java | 7 +++++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java index 5e24588985ac1..1ba862a8784d5 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterEx.java @@ -89,12 +89,6 @@ public interface BinaryWriterEx extends BinaryWriter, BinaryRawWriter, ObjectOut */ public BinaryContext context(); - /** - * @param po Binary object. - * @throws org.apache.ignite.binary.BinaryObjectException In case of error. - */ - public void writeBinaryObject(@Nullable BinaryObjectEx po) throws BinaryObjectException; - /** * @return Current writer's schema. */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 04065ccdcaed2..2e0dbd3621990 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -613,8 +613,11 @@ void writeBooleanField(@Nullable Boolean val) { writeBooleanFieldPrimitive(val); } - /** {@inheritDoc} */ - @Override public void writeBinaryObject(@Nullable BinaryObjectEx po) throws BinaryObjectException { + /** + * @param po Binary object. + * @throws org.apache.ignite.binary.BinaryObjectException In case of error. + */ + public void writeBinaryObject(@Nullable BinaryObjectEx po) throws BinaryObjectException { if (po == null) out.writeByte(GridBinaryMarshaller.NULL); else { From 5cc3a53e2f4220f057647ef4aef9fade85e08400 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 13:12:37 +0300 Subject: [PATCH 14/33] IGNITE-28207 Remove preWrite, postWrite, postWriteHashCode, popSchema, writeFieldId from BinaryWriterEx --- .../org/apache/ignite/internal/binary/BinaryReaderEx.java | 4 ++-- .../org/apache/ignite/internal/binary/BinaryReaderExImpl.java | 4 ++-- .../ignite/internal/processors/odbc/SqlListenerUtils.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java index 5dbc642459cd0..9b6c6688fb31d 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java @@ -56,8 +56,8 @@ public interface BinaryReaderEx extends BinaryReader, BinaryRawReader, BinaryRea * Unmarshall JDBC supported type. * @param type Type. * @param binObjAllow Allow to read non plaint objects. - * @param keepBinary Whether to deserialize objects or keep in binary format. + * @param deserialize {@code True} if object should be deserialized during reading. * @return Read object. */ - public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean keepBinary); + public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean deserialize); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 7e746e67243bf..d0f5e4a90cd63 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -2051,7 +2051,7 @@ public BinarySchema getOrCreateSchema() { } /** {@inheritDoc} */ - @Override public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean keepBinary) { + @Override public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean deserialize) { switch (type) { case GridBinaryMarshaller.NULL: return null; @@ -2146,7 +2146,7 @@ public BinarySchema getOrCreateSchema() { if (binObjAllow) { Object res = readObjectDetached(); - return !keepBinary && res instanceof BinaryObject + return deserialize && res instanceof BinaryObject ? ((BinaryObject)res).deserialize() : res; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java index 12a589323b236..2fdee612fd1fd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerUtils.java @@ -81,7 +81,7 @@ public abstract class SqlListenerUtils { return JdbcBinaryBuffer.createReadOnly(reader.in().array(), position, len); } - return reader.unmarshallJdbc(type, binObjAllow, keepBinary); + return reader.unmarshallJdbc(type, binObjAllow, !keepBinary); } /** From fa2c11f4e1c95fcd6d1e7912e793b77aa564a337 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 13:51:05 +0300 Subject: [PATCH 15/33] IGNITE-28207 Remove preWrite, postWrite, postWriteHashCode, popSchema, writeFieldId from BinaryWriterEx --- .../ignite/internal/binary/BinariesFactoryImpl.java | 4 +--- .../apache/ignite/internal/binary/BinaryWriterExImpl.java | 8 +++++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index ad01847b5c2cf..bdb6cbfa88494 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -76,7 +76,6 @@ public static BinaryWriterExImpl newWriter(BinaryContext ctx, boolean failIfUnre ctx, BinaryStreams.outputStream((int)CommonUtils.KB, locCtx.chunk()), locCtx.schemaHolder(), - null, failIfUnregistered, typeId ); @@ -88,7 +87,6 @@ public static BinaryWriterExImpl newWriter(BinaryContext ctx, boolean failIfUnre ctx, out, BinaryThreadLocalContext.get().schemaHolder(), - null, false, GridBinaryMarshaller.UNREGISTERED_TYPE_ID ); @@ -96,7 +94,7 @@ public static BinaryWriterExImpl newWriter(BinaryContext ctx, boolean failIfUnre /** {@inheritDoc} */ @Override public BinaryWriterEx writerWithoutSchema(BinaryContext ctx, BinaryOutputStream out) { - return new BinaryWriterExImpl(ctx, out, null, null, false, GridBinaryMarshaller.UNREGISTERED_TYPE_ID); + return new BinaryWriterExImpl(ctx, out, null, false, GridBinaryMarshaller.UNREGISTERED_TYPE_ID); } /** {@inheritDoc} */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 2e0dbd3621990..8022179204481 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -104,7 +104,6 @@ public class BinaryWriterExImpl implements BinaryWriterEx { /** * @param ctx Context. * @param out Output stream. - * @param handles Handles. * @param failIfUnregistered Flag to fail while writing object of unregistered type. * @param typeId Type id. */ @@ -112,7 +111,6 @@ public BinaryWriterExImpl( BinaryContext ctx, BinaryOutputStream out, @Nullable BinaryWriterSchemaHolder schema, - BinaryWriterHandles handles, boolean failIfUnregistered, int typeId ) { @@ -1589,7 +1587,11 @@ private boolean tryWriteAsHandle(Object obj) { * @return New writer. */ public BinaryWriterExImpl newWriter(int typeId) { - return new BinaryWriterExImpl(ctx, out, schema, handles(), failIfUnregistered, typeId); + BinaryWriterExImpl res = new BinaryWriterExImpl(ctx, out, schema, failIfUnregistered, typeId); + + res.handles = handles(); + + return res; } /** {@inheritDoc} */ From 1d8e9a91cdb81979f9ebed7b45bde4603c59a599 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 14:04:42 +0300 Subject: [PATCH 16/33] IGNITE-28207 Remove preWrite, postWrite, postWriteHashCode, popSchema, writeFieldId from BinaryWriterEx --- .../binary/streams/BinaryStreams.java | 11 ------ .../binary/streams/BinaryStreamsFactory.java | 9 ----- .../streams/BinaryOffheapInputStream.java | 18 +--------- .../streams/BinaryStreamsFactoryImpl.java | 5 --- .../CacheObjectBinaryProcessorImpl.java | 29 ---------------- ...ryObjectBuilderDefaultMappersSelfTest.java | 34 +++++++++++++++++-- 6 files changed, 33 insertions(+), 73 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java index 7aa287d2ccbaa..12bd66e164628 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java @@ -78,17 +78,6 @@ public static BinaryInputStream inputStream(long ptr, int cap) { return factory.inputStream(ptr, cap); } - /** - * @param ptr Pointer. - * @param cap Capacity. - * @param forceHeap If {@code true} method {@link BinaryInputStream#offheapPointer()} returns 0 and unmarshalling will - * create heap-based objects. - * @return Stream. - */ - public static BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap) { - return factory.inputStream(ptr, cap, forceHeap); - } - /** * @param cap Capacity. * @param disableAutoClose Whether to disable resource release in {@link BinaryOutputStream#close()} method diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java index ad4d7df2b26f7..95800f99bbf3e 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java @@ -59,15 +59,6 @@ public interface BinaryStreamsFactory { */ public BinaryInputStream inputStream(long ptr, int cap); - /** - * @param ptr Pointer. - * @param cap Capacity. - * @param forceHeap If {@code true} method {@link BinaryInputStream#offheapPointer()} returns 0 and unmarshalling will - * create heap-based objects. - * @return Stream. - */ - public BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap); - /** * @param cap Capacity. * @param disableAutoClose Whether to disable resource release in {@link BinaryOutputStream#close()} method diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java index b01f36193cacd..341a59c5f11fb 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java @@ -31,9 +31,6 @@ class BinaryOffheapInputStream extends BinaryAbstractInputStream { /** Capacity. */ private final int cap; - /** */ - private final boolean forceHeap; - /** * Constructor. * @@ -41,21 +38,8 @@ class BinaryOffheapInputStream extends BinaryAbstractInputStream { * @param cap Capacity. */ public BinaryOffheapInputStream(long ptr, int cap) { - this(ptr, cap, false); - } - - /** - * Constructor. - * - * @param ptr Pointer. - * @param cap Capacity. - * @param forceHeap If {@code true} method {@link #offheapPointer} returns 0 and unmarshalling will - * create heap-based objects. - */ - public BinaryOffheapInputStream(long ptr, int cap, boolean forceHeap) { this.ptr = ptr; this.cap = cap; - this.forceHeap = forceHeap; len = cap; } @@ -150,7 +134,7 @@ public BinaryOffheapInputStream(long ptr, int cap, boolean forceHeap) { /** {@inheritDoc} */ @Override public long offheapPointer() { - return forceHeap ? 0 : ptr; + return ptr; } /** {@inheritDoc} */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java index 40f0b9f111324..e91d0f4a3a51f 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java @@ -45,11 +45,6 @@ public class BinaryStreamsFactoryImpl implements BinaryStreamsFactory { return new BinaryOffheapInputStream(ptr, cap); } - /** {@inheritDoc} */ - @Override public BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap) { - return new BinaryOffheapInputStream(ptr, cap, forceHeap); - } - /** {@inheritDoc} */ @Override public BinaryOutputStream createPooledOutputStream(int cap, boolean disableAutoClose) { return new BinaryHeapOutputStream(cap, BinaryMemoryAllocator.POOLED.chunk(), disableAutoClose); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java index aaf1565663df6..70d92936709bc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java @@ -62,8 +62,6 @@ import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.binary.builder.BinaryObjectBuilders; -import org.apache.ignite.internal.binary.streams.BinaryInputStream; -import org.apache.ignite.internal.binary.streams.BinaryStreams; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper; import org.apache.ignite.internal.processors.cache.CacheObject; @@ -87,7 +85,6 @@ import org.apache.ignite.internal.processors.datastructures.CollocatedSetItemKey; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.systemview.BinaryMetadataViewWalker; -import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.MutableSingletonList; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.lang.GridMapEntry; @@ -385,32 +382,6 @@ public byte[] marshal(@Nullable Object obj) throws BinaryObjectException { return arr; } - /** - * @param ptr Off-heap pointer. - * @param forceHeap If {@code true} creates heap-based object. - * @return Object. - * @throws BinaryObjectException If failed. - */ - public Object unmarshal(long ptr, boolean forceHeap) throws BinaryObjectException { - assert ptr > 0 : ptr; - - int size = GridUnsafe.getInt(ptr); - - ptr += 4; - - byte type = GridUnsafe.getByte(ptr++); - - if (type != CacheObject.TYPE_BYTE_ARR) { - assert size > 0 : size; - - BinaryInputStream in = BinaryStreams.inputStream(ptr, size, forceHeap); - - return binaryMarsh.unmarshal(in); - } - else - return GridUnsafe.copyMemory(ptr, size); - } - /** {@inheritDoc} */ @Override public Object marshalToBinary( @Nullable Object obj, diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java index 5e0aedb6e3b90..6fcf5eed2915f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java @@ -34,11 +34,15 @@ import org.apache.ignite.binary.BinaryNameMapper; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.binary.BinaryObjectBuilder; +import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.binary.BinaryType; import org.apache.ignite.binary.BinaryTypeConfiguration; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses; +import org.apache.ignite.internal.binary.streams.BinaryInputStream; +import org.apache.ignite.internal.binary.streams.BinaryStreams; +import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.F; @@ -760,8 +764,9 @@ public void testOffheapBinary() throws Exception { GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr0 + 4, arr.length); - BinaryObject offheapObj = (BinaryObject) - ((CacheObjectBinaryProcessorImpl)(grid(0)).context().cacheObjects()).unmarshal(ptr, false); + CacheObjectBinaryProcessorImpl proc = ((CacheObjectBinaryProcessorImpl)(grid(0)).context().cacheObjects()); + + BinaryObject offheapObj = (BinaryObject)unmarshal(proc, ptr); assertEquals(BinaryObjectOffheapImpl.class, offheapObj.getClass()); @@ -788,6 +793,31 @@ public void testOffheapBinary() throws Exception { } } + /** + * @param ptr Off-heap pointer. + * @return Object. + * @throws BinaryObjectException If failed. + */ + private Object unmarshal(CacheObjectBinaryProcessorImpl proc, long ptr) throws BinaryObjectException { + assert ptr > 0 : ptr; + + int size = GridUnsafe.getInt(ptr); + + ptr += 4; + + byte type = GridUnsafe.getByte(ptr++); + + if (type != CacheObject.TYPE_BYTE_ARR) { + assert size > 0 : size; + + BinaryInputStream in = BinaryStreams.inputStream(ptr, size); + + return proc.marshaller().unmarshal(in); + } + else + return GridUnsafe.copyMemory(ptr, size); + } + /** * @throws Exception If failed. */ From f6ea008db10a0c33f0d9c94922f564e1fd60d0e8 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 15:47:56 +0300 Subject: [PATCH 17/33] IGNITE-28207 Remove preWrite, postWrite, postWriteHashCode, popSchema, writeFieldId from BinaryWriterEx --- .../apache/ignite/internal/binary/BinaryMarshaller.java | 9 ++++----- .../ignite/internal/binary/GridBinaryMarshaller.java | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java index 7411659d663eb..c1c35c3e7757e 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; @@ -77,13 +76,13 @@ public void setBinaryContext(BinaryContext ctx) { } /** {@inheritDoc} */ - @Override protected byte[] marshal0(@Nullable Object obj) throws IgniteCheckedException { + @Override protected byte[] marshal0(@Nullable Object obj) { return impl.marshal(obj, false); } /** {@inheritDoc} */ - @Override protected void marshal0(@Nullable Object obj, OutputStream out) throws IgniteCheckedException { - impl.marshal(obj, out, false); + @Override protected void marshal0(@Nullable Object obj, OutputStream out) { + impl.marshal(obj, out); } /** {@inheritDoc} */ @@ -92,7 +91,7 @@ public void setBinaryContext(BinaryContext ctx) { } /** {@inheritDoc} */ - @Override protected T unmarshal0(InputStream in, @Nullable ClassLoader clsLdr) throws IgniteCheckedException { + @Override protected T unmarshal0(InputStream in, @Nullable ClassLoader clsLdr) { ByteArrayOutputStream buf = new ByteArrayOutputStream(); // we have to fully read the InputStream because GridBinaryMarshaller requires support of a method that diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index ea72c9fad8dd8..2356b0d6bcdf4 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -264,10 +264,9 @@ public byte[] marshal(@Nullable Object obj, boolean failIfUnregistered) throws B * * @param obj Object to marshal. * @param out Output stream. - * @param failIfUnregistered Throw exception if class isn't registered. * @throws BinaryObjectException In case of error. */ - public void marshal(@Nullable Object obj, OutputStream out, boolean failIfUnregistered) throws BinaryObjectException { + public void marshal(@Nullable Object obj, OutputStream out) throws BinaryObjectException { try { if (obj == null) { out.write(NULL); @@ -275,7 +274,7 @@ public void marshal(@Nullable Object obj, OutputStream out, boolean failIfUnregi return; } - try (BinaryWriterEx writer = BinaryUtils.writer(ctx, failIfUnregistered, UNREGISTERED_TYPE_ID)) { + try (BinaryWriterEx writer = BinaryUtils.writer(ctx, false, UNREGISTERED_TYPE_ID)) { writer.marshal(obj); BinaryOutputStream s = writer.out(); From d59fde2fa8ebf99bb85d0a4e5ad10cc00a327734 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 28 Sep 2026 16:29:10 +0300 Subject: [PATCH 18/33] IGNITE-28207 Remove preWrite, postWrite, postWriteHashCode, popSchema, writeFieldId from BinaryWriterEx --- .../processors/cache/binary/CacheObjectBinaryProcessorImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java index 70d92936709bc..35d1b06e1a7e3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java @@ -262,7 +262,7 @@ public CacheObjectBinaryProcessorImpl(GridKernalContext ctx) { transport = new BinaryMetadataTransport(metadataLocCache, metadataFileStore, binaryCtx, ctx, log); - binaryMarsh = new GridBinaryMarshaller(binaryCtx); + binaryMarsh = marsh.binaryMarshaller(); binaries = new IgniteBinaryImpl(ctx, this); From b4e5c7c4a75ff740f7b59be1074e8caf45ccfafa Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 13:38:28 +0300 Subject: [PATCH 19/33] Remove BinaryContext thread local to see what will fail. --- .../ignite/internal/binary/BinariesFactory.java | 3 +-- .../apache/ignite/internal/binary/BinaryUtils.java | 12 +----------- .../ignite/internal/binary/GridBinaryMarshaller.java | 4 ++-- .../ignite/internal/binary/BinariesFactoryImpl.java | 4 ++-- .../ignite/internal/binary/BinaryReaderExImpl.java | 4 +--- .../internal/binary/BinaryMarshallerSelfTest.java | 2 +- .../binary/RawBinaryObjectExtractorTest.java | 4 +--- 7 files changed, 9 insertions(+), 24 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java index fa422f19dfd57..5b3462941be6f 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java @@ -75,10 +75,9 @@ public BinaryReaderEx reader(BinaryContext ctx, /** * @param ctx Context. * @param failIfUnregistered Flag to fail while writing object of unregistered type. - * @param typeId Type id. * @return Writer instance. */ - public BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered, int typeId); + public BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered); /** * @param ctx Context. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index a8eada1a50661..2fceaa4d4319c 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -2297,16 +2297,6 @@ static BinaryReaderEx reader(BinaryContext ctx, return binariesFactory.reader(ctx, in, ldr, hnds, skipHdrCheck, forUnmarshal); } - /** - * @param ctx Context. - * @param failIfUnregistered Flag to fail while writing object of unregistered type. - * @param typeId Type id. - * @return Writer instance. - */ - public static BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered, int typeId) { - return binariesFactory.writer(ctx, failIfUnregistered, typeId); - } - /** * @param ctx Context. * @param out Output stream. @@ -2379,7 +2369,7 @@ public static void initUseBinaryArrays() { * @return {@link BinaryObjectExImpl#field(int)} value or {@code null} if object not instance of {@link BinaryObjectExImpl}. */ public static Object field(Object obj, int fieldId) { - if (!isBinaryObjectExImpl(obj)) + if (!(obj instanceof BinaryObjectExImpl)) return null; return ((BinaryObjectExImpl)obj).field(fieldId); diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 2356b0d6bcdf4..d1ce65426ae4d 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -252,7 +252,7 @@ public byte[] marshal(@Nullable Object obj, boolean failIfUnregistered) throws B if (obj == null) return new byte[] { NULL }; - try (BinaryWriterEx writer = BinaryUtils.writer(ctx, failIfUnregistered, UNREGISTERED_TYPE_ID)) { + try (BinaryWriterEx writer = BinaryUtils.binariesFactory.writer(ctx, failIfUnregistered)) { writer.marshal(obj); return writer.out().arrayCopy(); @@ -274,7 +274,7 @@ public void marshal(@Nullable Object obj, OutputStream out) throws BinaryObjectE return; } - try (BinaryWriterEx writer = BinaryUtils.writer(ctx, false, UNREGISTERED_TYPE_ID)) { + try (BinaryWriterEx writer = BinaryUtils.binariesFactory.writer(ctx, false)) { writer.marshal(obj); BinaryOutputStream s = writer.out(); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index bdb6cbfa88494..f9985792e930d 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -64,8 +64,8 @@ public class BinariesFactoryImpl implements BinariesFactory { } /** {@inheritDoc} */ - @Override public BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered, int typeId) { - return newWriter(ctx, failIfUnregistered, typeId); + @Override public BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered) { + return newWriter(ctx, failIfUnregistered, GridBinaryMarshaller.UNREGISTERED_TYPE_ID); } /** */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index d0f5e4a90cd63..7b49c16aa095c 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -312,9 +312,7 @@ public BinaryReaderExImpl(BinaryContext ctx, return in; } - /** - * @return Descriptor. - */ + /** @return Descriptor. */ public BinaryClassDescriptor descriptor() { if (desc == null) desc = ctx.descriptorForTypeId(userType, typeId, ldr, false); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java index 504868c0af647..32c4cbc9b51d6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java @@ -3042,7 +3042,7 @@ public void testThreadLocalArrayReleased() throws Exception { BinaryMarshaller marsh = binaryMarshaller(); - try (BinaryWriterEx writer = BinaryUtils.writer(binaryContext(marsh), false, GridBinaryMarshaller.UNREGISTERED_TYPE_ID)) { + try (BinaryWriterEx writer = BinaryUtils.binariesFactory.writer(binaryContext(marsh), false)) { assertEquals(true, BinaryStreamsTestUtils.threadLocalIsAcquired()); writer.writeString("Thread local test"); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java index a9b019df27f58..63f608883840d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java @@ -38,8 +38,6 @@ import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; -import static org.apache.ignite.internal.binary.GridBinaryMarshaller.UNREGISTERED_TYPE_ID; - /** */ public class RawBinaryObjectExtractorTest extends GridCommonAbstractTest { /** */ @@ -51,7 +49,7 @@ public void test() throws Exception { byte[] serializedTestObjectsBytes; - try (BinaryWriterEx writer = BinaryUtils.writer(ctx, false, UNREGISTERED_TYPE_ID)) { + try (BinaryWriterEx writer = BinaryUtils.binariesFactory.writer(ctx, false)) { testObjects.forEach(writer::writeObject); serializedTestObjectsBytes = writer.out().arrayCopy(); From f1c61c1a9eab878d46f65b165f73cf41fee00b1d Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 14:20:28 +0300 Subject: [PATCH 20/33] Remove BinaryContext thread local to see what will fail. --- .../internal/binary/streams/BinaryStreams.java | 16 ---------------- .../binary/streams/BinaryStreamsFactory.java | 12 ------------ .../internal/binary/BinariesFactoryImpl.java | 4 ++-- .../binary/BinaryThreadLocalContext.java | 4 ++-- .../binary/streams/BinaryHeapOutputStream.java | 2 +- .../binary/streams/BinaryMemoryAllocator.java | 2 +- .../binary/streams/BinaryStreamsFactoryImpl.java | 10 ---------- 7 files changed, 6 insertions(+), 44 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java index 12bd66e164628..e8d380bfb20c3 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java @@ -95,20 +95,4 @@ public static BinaryOutputStream createPooledOutputStream(int cap, boolean disab public static BinaryOutputStream outputStream(int cap) { return factory.outputStream(cap); } - - /** - * @param cap Capacity. - * @param chunk Memory allocator chunk. - * @return Binary output stream. - */ - public static BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk) { - return factory.outputStream(cap, chunk); - } - - /** - * @return Thread local binary memory allocator. - */ - public static BinaryMemoryAllocatorChunk threadLocalChunk() { - return factory.threadLocalChunk(); - } } diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java index 95800f99bbf3e..ceac87e1c4209 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java @@ -72,16 +72,4 @@ public interface BinaryStreamsFactory { * @return Binary output stream data. */ public BinaryOutputStream outputStream(int cap); - - /** - * @param cap Capacity. - * @param chunk Memory allocator chunk. - * @return Binary output stream. - */ - public BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk); - - /** - * @return Thread local binary memory allocator. - */ - public BinaryMemoryAllocatorChunk threadLocalChunk(); } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index f9985792e930d..0740a3b343688 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -22,9 +22,9 @@ import java.util.Map; import java.util.function.ToIntFunction; import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.internal.binary.streams.BinaryHeapOutputStream; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; -import org.apache.ignite.internal.binary.streams.BinaryStreams; import org.apache.ignite.internal.processors.cache.CacheObjectValueContext; import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridUnsafe; @@ -74,7 +74,7 @@ public static BinaryWriterExImpl newWriter(BinaryContext ctx, boolean failIfUnre return new BinaryWriterExImpl( ctx, - BinaryStreams.outputStream((int)CommonUtils.KB, locCtx.chunk()), + new BinaryHeapOutputStream((int)CommonUtils.KB, locCtx.chunk()), locCtx.schemaHolder(), failIfUnregistered, typeId diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java index 3611d3fc6ab50..4462acbf019cc 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryThreadLocalContext.java @@ -17,8 +17,8 @@ package org.apache.ignite.internal.binary; +import org.apache.ignite.internal.binary.streams.BinaryMemoryAllocator; import org.apache.ignite.internal.binary.streams.BinaryMemoryAllocatorChunk; -import org.apache.ignite.internal.binary.streams.BinaryStreams; /** * Contains thread-local data for binary marshalling. @@ -32,7 +32,7 @@ class BinaryThreadLocalContext { }; /** Memory chunk. */ - private final BinaryMemoryAllocatorChunk chunk = BinaryStreams.threadLocalChunk(); + private final BinaryMemoryAllocatorChunk chunk = BinaryMemoryAllocator.THREAD_LOCAL.chunk(); /** Schema holder. */ private final BinaryWriterSchemaHolder schema = new BinaryWriterSchemaHolder(); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java index 3ed5120c50d6a..f9618618115e6 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java @@ -24,7 +24,7 @@ /** * Binary heap output stream. */ -final class BinaryHeapOutputStream extends BinaryAbstractOutputStream { +public final class BinaryHeapOutputStream extends BinaryAbstractOutputStream { /** Allocator. */ private final BinaryMemoryAllocatorChunk chunk; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java index f32be3bd9fac0..179ee18b3f4a2 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java @@ -29,7 +29,7 @@ /** * On-heap memory allocator. */ -abstract class BinaryMemoryAllocator { +public abstract class BinaryMemoryAllocator { /** Buffer size re-check frequency. */ private static final Long CHECK_FREQ = Long.getLong(IGNITE_MARSHAL_BUFFERS_RECHECK, DFLT_MARSHAL_BUFFERS_RECHECK); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java index e91d0f4a3a51f..5d8937560eaa1 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java @@ -54,14 +54,4 @@ public class BinaryStreamsFactoryImpl implements BinaryStreamsFactory { @Override public BinaryOutputStream outputStream(int cap) { return new BinaryHeapOutputStream(cap); } - - /** {@inheritDoc} */ - @Override public BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk) { - return new BinaryHeapOutputStream(cap, chunk); - } - - /** {@inheritDoc} */ - @Override public BinaryMemoryAllocatorChunk threadLocalChunk() { - return BinaryMemoryAllocator.THREAD_LOCAL.chunk(); - } } From 2f2f8a437bc8814db7ada06998e28a051815dcb1 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 14:32:14 +0300 Subject: [PATCH 21/33] Remove BinaryContext thread local to see what will fail. --- .../apache/ignite/internal/binary/GridBinaryMarshaller.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index d1ce65426ae4d..8f483d7b7be13 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -298,7 +298,7 @@ public void marshal(@Nullable Object obj, OutputStream out) throws BinaryObjectE BinaryContext oldCtx = pushContext(ctx); try { - return (T)BinaryUtils.unmarshal(BinaryStreams.inputStream(bytes, 0), ctx, clsLdr); + return (T)BinaryUtils.unmarshal(BinaryStreams.inputStream(bytes), ctx, clsLdr); } finally { popContext(oldCtx); @@ -412,7 +412,7 @@ private Object[] unwrapArray(Object[] arr, BinaryReaderHandles hnds, Class ar if (arr[0] == NULL) return null; - return deserialize(BinaryStreams.inputStream(arr, 0), ldr, null); + return deserialize(BinaryStreams.inputStream(arr), ldr, null); } /** From 038543445f4b97588b6857485186871fe363f2f9 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 14:54:28 +0300 Subject: [PATCH 22/33] Remove BinaryContext thread local to see what will fail. --- .../apache/ignite/internal/binary/streams/BinaryStream.java | 2 +- .../apache/ignite/internal/binary/BinaryWriterExImpl.java | 4 ++-- .../cache/binary/CacheObjectBinaryProcessorImpl.java | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java index 56a905f0592a7..218efeed97515 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java @@ -42,7 +42,7 @@ interface BinaryStream { public byte[] arrayCopy(); /** - * @return Offheap pointer if stream is offheap based and "forceHeap" flag is not set; otherwise {@code 0}. + * @return Offheap pointer if stream is offheap based; otherwise {@code 0}. */ public long offheapPointer(); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 8022179204481..1356fe89f2c43 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -117,7 +117,6 @@ public BinaryWriterExImpl( this.ctx = ctx; this.out = out; this.schema = schema; - this.handles = handles; this.failIfUnregistered = failIfUnregistered; this.typeId = typeId; @@ -1975,7 +1974,7 @@ else if (obj instanceof SqlInputStreamWrapper wrapper) { "actualLength=" + written + "]"); } } - else if (obj instanceof Blob blob) + else if (obj instanceof Blob blob) { try { int written = writeByteArray(blob.getBinaryStream(), (int)blob.length()); @@ -1987,6 +1986,7 @@ else if (obj instanceof Blob blob) catch (SQLException e) { throw new BinaryObjectException(e); } + } else if (binObjAllow) writeObjectDetached(obj); else diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java index 35d1b06e1a7e3..f9ccc8e3eb2a6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java @@ -113,7 +113,6 @@ import static org.apache.ignite.IgniteSystemProperties.getBoolean; import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.BINARY_PROC; import static org.apache.ignite.internal.binary.BinaryUtils.affinityFieldName; -import static org.apache.ignite.internal.binary.BinaryUtils.isBinaryObjectImpl; import static org.apache.ignite.internal.binary.BinaryUtils.mergeMetadata; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; @@ -1127,7 +1126,7 @@ public BinaryField affinityKeyField(int typeId) { if (obj instanceof KeyCacheObject) { KeyCacheObject key = (KeyCacheObject)obj; - if (isBinaryObjectImpl(key)) { + if (BinaryUtils.isBinaryObjectImpl(key)) { // Need to create a copy because the key can be reused at the application layer after that (IGNITE-3505). key = key.copy(partition(ctx, cctx, key)); } @@ -1140,7 +1139,7 @@ else if (key.partition() == -1) obj = toBinary(obj, false); - if (isBinaryObjectImpl(obj)) { + if (BinaryUtils.isBinaryObjectImpl(obj)) { ((KeyCacheObject)obj).partition(partition(ctx, cctx, obj)); return (KeyCacheObject)obj; From 93c2e37ad500a59450e146f4a3a3251f0cc6982b Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 16:41:13 +0300 Subject: [PATCH 23/33] Remove BinaryContext thread local to see what will fail. --- .../internal/binary/BinaryImplUtils.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index 358d678c8593a..f97c931555f5f 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -16,7 +16,6 @@ */ package org.apache.ignite.internal.binary; -import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; @@ -318,21 +317,4 @@ public static int hashCode(byte[] data, int startPos, int endPos) { return hash; } - - /** - * Creates reader instance. - * - * @param ctx Context. - * @param in Input stream. - * @param ldr Class loader. - * @param reader BinaryReaderEx. - * @param forUnmarshal {@code True} if reader is need to unmarshal object. - */ - public static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - BinaryReaderEx reader, - boolean forUnmarshal) { - return BinaryUtils.binariesFactory.reader(ctx, in, ldr, reader.handles(), forUnmarshal); - } } From 4015d2cad54a8d073076ac446b1a619bae52f0c7 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 16:53:12 +0300 Subject: [PATCH 24/33] Remove BinaryContext thread local to see what will fail. --- ...ryObjectBuilderDefaultMappersSelfTest.java | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java index 6fcf5eed2915f..3eb0ed1620d3f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java @@ -34,15 +34,12 @@ import org.apache.ignite.binary.BinaryNameMapper; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.binary.BinaryObjectBuilder; -import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.binary.BinaryType; import org.apache.ignite.binary.BinaryTypeConfiguration; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses; -import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryStreams; -import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.F; @@ -764,11 +761,8 @@ public void testOffheapBinary() throws Exception { GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr0 + 4, arr.length); - CacheObjectBinaryProcessorImpl proc = ((CacheObjectBinaryProcessorImpl)(grid(0)).context().cacheObjects()); - - BinaryObject offheapObj = (BinaryObject)unmarshal(proc, ptr); - - assertEquals(BinaryObjectOffheapImpl.class, offheapObj.getClass()); + BinaryObjectOffheapImpl offheapObj = ((CacheObjectBinaryProcessorImpl)(grid(0)).context().cacheObjects()).marshaller(). + unmarshal(BinaryStreams.inputStream(ptr + 5, len)); assertEquals(expectedHashCode("Class"), offheapObj.type().typeId()); assertEquals(BinaryArrayIdentityResolver.instance().hashCode(po), offheapObj.hashCode()); @@ -793,31 +787,6 @@ public void testOffheapBinary() throws Exception { } } - /** - * @param ptr Off-heap pointer. - * @return Object. - * @throws BinaryObjectException If failed. - */ - private Object unmarshal(CacheObjectBinaryProcessorImpl proc, long ptr) throws BinaryObjectException { - assert ptr > 0 : ptr; - - int size = GridUnsafe.getInt(ptr); - - ptr += 4; - - byte type = GridUnsafe.getByte(ptr++); - - if (type != CacheObject.TYPE_BYTE_ARR) { - assert size > 0 : size; - - BinaryInputStream in = BinaryStreams.inputStream(ptr, size); - - return proc.marshaller().unmarshal(in); - } - else - return GridUnsafe.copyMemory(ptr, size); - } - /** * @throws Exception If failed. */ From 9b91f33a9d0726dbb4fb8b93c4c03073024becc5 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 29 Sep 2026 21:41:57 +0300 Subject: [PATCH 25/33] Move read methods into implementaion. --- .../internal/binary/BinariesFactory.java | 13 + .../internal/binary/BinaryReaderEx.java | 2 +- .../ignite/internal/binary/BinaryUtils.java | 947 +---------------- .../internal/binary/GridBinaryMarshaller.java | 4 +- .../internal/binary/BinariesFactoryImpl.java | 7 + .../internal/binary/BinaryImplUtils.java | 956 +++++++++++++++++- .../internal/binary/BinaryObjectImpl.java | 2 +- .../binary/BinaryObjectOffheapImpl.java | 4 +- .../internal/binary/BinaryReaderExImpl.java | 172 ++-- .../binary/BinaryReaderHandlesHolder.java | 0 .../binary/BinaryReaderHandlesHolderImpl.java | 0 .../binary/CrossObjectReferenceResolver.java | 2 +- .../internal/binary/ObjectDetachHelper.java | 2 +- .../binary/RawBinaryObjectExtractor.java | 2 +- .../binary/builder/BinaryBuilderReader.java | 6 +- .../builder/BinaryObjectBuilderImpl.java | 4 +- 16 files changed, 1080 insertions(+), 1043 deletions(-) rename modules/binary/{api => impl}/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java (100%) rename modules/binary/{api => impl}/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java (100%) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java index 5b3462941be6f..c64fae56ccf8e 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.function.ToIntFunction; import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.processors.cache.CacheObjectValueContext; @@ -72,6 +73,18 @@ public BinaryReaderEx reader(BinaryContext ctx, boolean skipHdrCheck, boolean forUnmarshal); + /** + * Unmarshals object from the input stream without deserialization of user types. + * + * @param in Input stream. + * @param ctx Context. + * @param ldr Class loader. + * @return Unmarshalled object. + * @throws BinaryObjectException In case of error. + */ + @Nullable public Object unmarshal(BinaryInputStream in, BinaryContext ctx, @Nullable ClassLoader ldr) + throws BinaryObjectException; + /** * @param ctx Context. * @param failIfUnregistered Flag to fail while writing object of unregistered type. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java index 9b6c6688fb31d..8cf141fbd3839 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderEx.java @@ -27,7 +27,7 @@ /** * Extended reader interface. */ -public interface BinaryReaderEx extends BinaryReader, BinaryRawReader, BinaryReaderHandlesHolder, ObjectInput { +public interface BinaryReaderEx extends BinaryReader, BinaryRawReader, ObjectInput { /** * @return Object. * @throws org.apache.ignite.binary.BinaryObjectException In case of error. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index 2fceaa4d4319c..ba09c6e70743a 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.binary; import java.io.BufferedReader; -import java.io.ByteArrayInputStream; import java.io.Externalizable; import java.io.File; import java.io.FileInputStream; @@ -26,14 +25,11 @@ import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.lang.reflect.Array; import java.lang.reflect.Field; -import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.math.BigDecimal; -import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.sql.Time; import java.sql.Timestamp; @@ -60,14 +56,11 @@ import java.util.function.Function; import java.util.function.IntFunction; import java.util.stream.Collectors; -import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.binary.BinaryCollectionFactory; import org.apache.ignite.binary.BinaryIdMapper; import org.apache.ignite.binary.BinaryInvalidTypeException; -import org.apache.ignite.binary.BinaryMapFactory; import org.apache.ignite.binary.BinaryNameMapper; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.binary.BinaryObjectException; @@ -88,7 +81,6 @@ import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.logger.NullLogger; -import org.apache.ignite.marshaller.Marshallers; import org.apache.ignite.platform.PlatformType; import org.jetbrains.annotations.Nullable; @@ -489,27 +481,6 @@ else if (cls == SINGLETON_LIST_CLS) return null; } - /** - * Check protocol version. - * - * @param protoVer Protocol version. - */ - public static void checkProtocolVersion(byte protoVer) { - if (GridBinaryMarshaller.PROTO_VER != protoVer) - throw new BinaryObjectException("Unsupported protocol version: " + protoVer); - } - - /** - * Get binary object length. - * - * @param in Input stream. - * @param start Start position. - * @return Length. - */ - public static int length(BinaryPositionReadable in, int start) { - return in.readIntPositioned(start + GridBinaryMarshaller.TOTAL_LEN_POS); - } - /** * Merge old and new metas. * @@ -775,89 +746,6 @@ static byte[] doReadByteArray(BinaryInputStream in) { return in.readByteArray(len); } - /** - * @return Value. - */ - static boolean[] doReadBooleanArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readBooleanArray(len); - } - - /** - * @return Value. - */ - static short[] doReadShortArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readShortArray(len); - } - - /** - * @return Value. - */ - static char[] doReadCharArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readCharArray(len); - } - - /** - * @return Value. - */ - static int[] doReadIntArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readIntArray(len); - } - - /** - * @return Value. - */ - static long[] doReadLongArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readLongArray(len); - } - - /** - * @return Value. - */ - static float[] doReadFloatArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readFloatArray(len); - } - - /** - * @return Value. - */ - static double[] doReadDoubleArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readDoubleArray(len); - } - - /** - * @return Value. - */ - static BigDecimal doReadDecimal(BinaryInputStream in) { - int scale = in.readInt(); - byte[] mag = doReadByteArray(in); - - boolean negative = mag[0] < 0; - - if (negative) - mag[0] &= 0x7F; - - BigInteger intVal = new BigInteger(mag); - - if (negative) - intVal = intVal.negate(); - - return new BigDecimal(intVal, scale); - } - /** * @return Value. */ @@ -890,70 +778,6 @@ static String doReadString(BinaryInputStream in) { return res; } - /** - * @return Value. - */ - static UUID doReadUuid(BinaryInputStream in) { - return new UUID(in.readLong(), in.readLong()); - } - - /** - * @return Value. - */ - static Date doReadDate(BinaryInputStream in) { - long time = in.readLong(); - - return new Date(time); - } - - /** - * @return Value. - */ - static Timestamp doReadTimestamp(BinaryInputStream in) { - long time = in.readLong(); - int nanos = in.readInt(); - - Timestamp ts = new Timestamp(time); - - ts.setNanos(ts.getNanos() + nanos); - - return ts; - } - - /** - * @return Value. - */ - static Time doReadTime(BinaryInputStream in) { - long time = in.readLong(); - - return new Time(time); - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - BigDecimal[] arr = new BigDecimal[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.DECIMAL) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadDecimal(in); - } - } - - return arr; - } - /** * @return Value. * @throws BinaryObjectException In case of error. @@ -968,257 +792,15 @@ public static String[] doReadStringArray(BinaryInputStream in) throws BinaryObje if (flag == GridBinaryMarshaller.NULL) arr[i] = null; - else { - if (flag != GridBinaryMarshaller.STRING) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadString(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - UUID[] arr = new UUID[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.UUID) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadUuid(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - Date[] arr = new Date[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.DATE) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadDate(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - Timestamp[] arr = new Timestamp[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.TIMESTAMP) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadTimestamp(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - Time[] arr = new Time[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.TIME) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadTime(in); - } - } - - return arr; - } - - /** - * @return Value. - */ - static BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { - if (in.offheapPointer() > 0) { - int len = in.readInt(); - - int pos = in.position(); - - in.position(in.position() + len); - - int start = in.readInt(); - - return binariesFactory.binaryOffheapObject(ctx, in.offheapPointer() + pos, start, len); - } - else { - byte[] arr = doReadByteArray(in); - int start = in.readInt(); - - BinaryObject binO = binariesFactory.binaryObject(ctx, arr, start); - - if (detach) - return detach(binO); - - return binO; - } - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @return Class object specified at the input stream. - * @throws BinaryObjectException If failed. - */ - static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) - throws BinaryObjectException { - return doReadClass(in, ctx, ldr, true); - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param deserialize Doesn't load the class when the flag is {@code false}. Class information is skipped. - * @return Class object specified at the input stream if {@code deserialize == true}. Otherwise returns {@code null} - * @throws BinaryObjectException If failed. - */ - private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) - throws BinaryObjectException { - int typeId = in.readInt(); - - if (!deserialize) { - // Skip class name at the stream. - if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - doReadClassName(in); - - return null; - } - - return doReadClass(in, ctx, ldr, typeId); - } - - /** - * @return Value. - */ - @SuppressWarnings("ConstantConditions") - static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) { - Class[] intfs = new Class[in.readInt()]; - - for (int i = 0; i < intfs.length; i++) - intfs[i] = doReadClass(in, ctx, ldr); - - InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr, handles); - - return Proxy.newProxyInstance(ldr != null ? ldr : CommonUtils.gridClassLoader(), intfs, ih); - } - - /** - * Read plain type. - * - * @param in Input stream. - * @return Plain type. - */ - static EnumType doReadEnumType(BinaryInputStream in) { - int typeId = in.readInt(); - - if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - return new EnumType(typeId, null); - else { - String clsName = doReadClassName(in); - - return new EnumType(GridBinaryMarshaller.UNREGISTERED_TYPE_ID, clsName); - } - } - - /** - * @param in Input stream. - * @return Class name. - */ - static String doReadClassName(BinaryInputStream in) { - byte flag = in.readByte(); - - if (flag != GridBinaryMarshaller.STRING) - throw new BinaryObjectException("Failed to read class name [position=" + (in.position() - 1) + ']'); - - return doReadString(in); - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param typeId Type id. - * @return Class object specified at the input stream. - * @throws BinaryObjectException If failed. - */ - static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) - throws BinaryObjectException { - Class cls; - - if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - cls = ctx.descriptorForTypeId(true, typeId, ldr, false).describedClass(); - else { - String clsName = doReadClassName(in); - - try { - cls = ClassLoaderUtils.forName(clsName, ldr); - } - catch (ClassNotFoundException e) { - throw new BinaryInvalidTypeException("Failed to load the class: " + clsName, e); - } + else { + if (flag != GridBinaryMarshaller.STRING) + throw new BinaryObjectException("Invalid flag value: " + flag); - // forces registering of class by type id, at least locally - if (Marshallers.USE_CACHE.get()) - ctx.registerType(cls, false, false); + arr[i] = doReadString(in); + } } - return cls; + return arr; } /** @@ -1250,278 +832,6 @@ static Class resolveClass(BinaryContext ctx, int typeId, @Nullable String clsNam return cls; } - /** - * Read binary enum. - * - * @param in Input stream. - * @param ctx Binary context. - * @param type Plain type. - * @return Enum. - */ - static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, - EnumType type) { - return binariesFactory.binaryEnum(ctx, type.typeId, type.clsName, in.readInt()); - } - - /** - * Read binary enum array. - * - * @param in Input stream. - * @param ctx Binary context. - * @return Enum array. - */ - private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { - int len = in.readInt(); - - Object[] arr = (Object[])Array.newInstance(binariesFactory.binaryEnumClass(), len); - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else - arr[i] = doReadBinaryEnum(in, ctx, doReadEnumType(in)); - } - - return arr; - } - - /** - * Read object serialized using optimized marshaller. - * - * @return Result. - */ - public static Object doReadOptimized(BinaryInputStream in, BinaryContext ctx, @Nullable ClassLoader clsLdr) { - int len = in.readInt(); - - ByteArrayInputStream input = new ByteArrayInputStream(in.array(), in.position(), len); - - try { - return ctx.optimizedMarsh().unmarshal(input, CommonUtils.resolveClassLoader(clsLdr, ctx.classLoader())); - } - catch (IgniteCheckedException e) { - throw new BinaryObjectException("Failed to unmarshal object with optimized marshaller", e); - } - finally { - in.position(in.position() + len); - } - } - - /** - * @return Object. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) throws BinaryObjectException { - return reader(ctx, in, ldr, handles.handles(), false, true).deserialize(); - } - - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) - throws BinaryObjectException { - return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl()); - } - - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) throws BinaryObjectException { - return unmarshal(in, ctx, ldr, handles, false, false); - } - - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { - int start = in.position(); - - byte flag = in.readByte(); - - switch (flag) { - case GridBinaryMarshaller.NULL: - return null; - - case GridBinaryMarshaller.HANDLE: { - int handlePos = start - in.readInt(); - - Object obj = handles.getHandle(handlePos); - - if (obj == null) { - int retPos = in.position(); - - in.position(handlePos); - - obj = unmarshal(in, ctx, ldr, handles, detach, deserialize); - - in.position(retPos); - } - - return obj; - } - - case GridBinaryMarshaller.OBJ: { - checkProtocolVersion(in.readByte()); - - int len = length(in, start); - - BinaryObjectEx po; - - if (detach) { - BinaryObjectEx binObj = binariesFactory.binaryObject(ctx, in.array(), start); - - binObj.detachAllowed(true); - - po = binObj.detach(!handles.isEmpty()); - } - else { - if (in.offheapPointer() == 0) - po = binariesFactory.binaryObject(ctx, in.array(), start); - else - po = binariesFactory.binaryOffheapObject(ctx, in.offheapPointer(), start, - in.remaining() + in.position()); - } - - in.position(start + len); - - handles.setHandle(po, start); - - return po; - } - - case GridBinaryMarshaller.BYTE: - return in.readByte(); - - case GridBinaryMarshaller.SHORT: - return in.readShort(); - - case GridBinaryMarshaller.INT: - return in.readInt(); - - case GridBinaryMarshaller.LONG: - return in.readLong(); - - case GridBinaryMarshaller.FLOAT: - return in.readFloat(); - - case GridBinaryMarshaller.DOUBLE: - return in.readDouble(); - - case GridBinaryMarshaller.CHAR: - return in.readChar(); - - case GridBinaryMarshaller.BOOLEAN: - return in.readBoolean(); - - case GridBinaryMarshaller.DECIMAL: - return doReadDecimal(in); - - case GridBinaryMarshaller.STRING: - return doReadString(in); - - case GridBinaryMarshaller.UUID: - return doReadUuid(in); - - case GridBinaryMarshaller.DATE: - return doReadDate(in); - - case GridBinaryMarshaller.TIMESTAMP: - return doReadTimestamp(in); - - case GridBinaryMarshaller.TIME: - return doReadTime(in); - - case GridBinaryMarshaller.BYTE_ARR: - return doReadByteArray(in); - - case GridBinaryMarshaller.SHORT_ARR: - return doReadShortArray(in); - - case GridBinaryMarshaller.INT_ARR: - return doReadIntArray(in); - - case GridBinaryMarshaller.LONG_ARR: - return doReadLongArray(in); - - case GridBinaryMarshaller.FLOAT_ARR: - return doReadFloatArray(in); - - case GridBinaryMarshaller.DOUBLE_ARR: - return doReadDoubleArray(in); - - case GridBinaryMarshaller.CHAR_ARR: - return doReadCharArray(in); - - case GridBinaryMarshaller.BOOLEAN_ARR: - return doReadBooleanArray(in); - - case GridBinaryMarshaller.DECIMAL_ARR: - return doReadDecimalArray(in); - - case GridBinaryMarshaller.STRING_ARR: - return doReadStringArray(in); - - case GridBinaryMarshaller.UUID_ARR: - return doReadUuidArray(in); - - case GridBinaryMarshaller.DATE_ARR: - return doReadDateArray(in); - - case GridBinaryMarshaller.TIMESTAMP_ARR: - return doReadTimestampArray(in); - - case GridBinaryMarshaller.TIME_ARR: - return doReadTimeArray(in); - - case GridBinaryMarshaller.OBJ_ARR: - if (useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, false); - else - return doReadObjectArray(in, ctx, ldr, handles, detach, deserialize); - - case GridBinaryMarshaller.COL: - return doReadCollection(in, ctx, ldr, handles, detach, deserialize, null); - - case GridBinaryMarshaller.MAP: - return doReadMap(in, ctx, ldr, handles, detach, deserialize, null); - - case GridBinaryMarshaller.BINARY_OBJ: - return doReadBinaryObject(in, ctx, detach); - - case GridBinaryMarshaller.ENUM: - case GridBinaryMarshaller.BINARY_ENUM: - return doReadBinaryEnum(in, ctx, doReadEnumType(in)); - - case GridBinaryMarshaller.ENUM_ARR: - if (useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, true); - else { - doReadEnumType(in); // Simply skip this part as we do not need it. - - return doReadBinaryEnumArray(in, ctx); - } - - case GridBinaryMarshaller.CLASS: - return doReadClass(in, ctx, ldr); - - case GridBinaryMarshaller.PROXY: - return doReadProxy(in, ctx, ldr, handles); - - case GridBinaryMarshaller.OPTM_MARSH: - return doReadOptimized(in, ctx, ldr); - - default: - throw new BinaryObjectException("Invalid flag value: " + flag); - } - } - /** * Convert {@link java.sql.Types} to binary type constant (See {@link GridBinaryMarshaller} constants). * @@ -1581,226 +891,6 @@ public static byte sqlTypeToBinary(int sqlType) { } } - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param handles Holder for handles. - * @param detach Detach flag. - * @param deserialize Deep flag. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { - int hPos = positionForHandle(in); - - Class compType = doReadClass(in, ctx, ldr, deserialize); - - int len = in.readInt(); - - Object[] arr = (deserialize && !BinaryObject.class.isAssignableFrom(compType)) - ? (Object[])Array.newInstance(compType, len) - : new Object[len]; - - handles.setHandle(arr, hPos); - - for (int i = 0; i < len; i++) { - Object res = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - - if (deserialize && useBinaryArrays() && res instanceof BinaryObject) - arr[i] = ((BinaryObject)res).deserialize(ldr); - else - arr[i] = res; - } - - return arr; - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param handles Holder for handles. - * @param detach Detach flag. - * @param deserialize Deep flag. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - private static BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, boolean isEnumArray) { - int hPos = positionForHandle(in); - - int compTypeId = in.readInt(); - String compClsName = null; - - if (compTypeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - compClsName = doReadClassName(in); - - int len = in.readInt(); - - Object[] arr = new Object[len]; - - BinaryArray res = isEnumArray - ? new BinaryEnumArray(ctx, compTypeId, compClsName, arr) - : new BinaryArray(ctx, compTypeId, compClsName, arr); - - handles.setHandle(res, hPos); - - for (int i = 0; i < len; i++) - arr[i] = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - - return res; - } - - /** - * @param deserialize Deep flag. - * @param factory Collection factory. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - @SuppressWarnings("unchecked") - static Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryCollectionFactory factory) - throws BinaryObjectException { - int hPos = positionForHandle(in); - - int size = in.readInt(); - - assert size >= 0; - - byte colType = in.readByte(); - - Collection col; - - if (factory != null) - col = factory.create(size); - else { - switch (colType) { - case GridBinaryMarshaller.ARR_LIST: - col = new ArrayList<>(size); - - break; - - case GridBinaryMarshaller.LINKED_LIST: - col = new LinkedList<>(); - - break; - - case GridBinaryMarshaller.SINGLETON_LIST: - col = new MutableSingletonList<>(); - - break; - - case GridBinaryMarshaller.HASH_SET: - col = CommonUtils.newHashSet(size); - - break; - - case GridBinaryMarshaller.LINKED_HASH_SET: - col = CommonUtils.newLinkedHashSet(size); - - break; - - case GridBinaryMarshaller.USER_SET: - col = CommonUtils.newHashSet(size); - - break; - - case GridBinaryMarshaller.USER_COL: - col = new ArrayList<>(size); - - break; - - default: - throw new BinaryObjectException("Invalid collection type: " + colType); - } - } - - handles.setHandle(col, hPos); - - for (int i = 0; i < size; i++) - col.add(deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize)); - - return colType == GridBinaryMarshaller.SINGLETON_LIST ? CommonUtils.convertToSingletonList(col) : col; - } - - /** - * @param deserialize Deep flag. - * @param factory Map factory. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - @SuppressWarnings("unchecked") - static Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryMapFactory factory) - throws BinaryObjectException { - int hPos = positionForHandle(in); - - int size = in.readInt(); - - assert size >= 0; - - byte mapType = in.readByte(); - - Map map; - - if (factory != null) - map = factory.create(size); - else { - switch (mapType) { - case GridBinaryMarshaller.HASH_MAP: - map = CommonUtils.newHashMap(size); - - break; - - case GridBinaryMarshaller.LINKED_HASH_MAP: - map = CommonUtils.newLinkedHashMap(size); - - break; - - case GridBinaryMarshaller.USER_COL: - map = CommonUtils.newHashMap(size); - - break; - - default: - throw new BinaryObjectException("Invalid map type: " + mapType); - } - } - - handles.setHandle(map, hPos); - - for (int i = 0; i < size; i++) { - Object key = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - Object val = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - - map.put(key, val); - } - - return map; - } - - /** - * Deserialize or unmarshal the object. - * - * @param deserialize Deserialize. - * @return Result. - */ - private static Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) { - return deserialize ? doReadObject(in, ctx, ldr, handles) : unmarshal(in, ctx, ldr, handles, detach, deserialize); - } - - /** - * Get position to be used for handle. We assume here that the hdr byte was read, hence subtract -1. - * - * @return Position for handle. - */ - static int positionForHandle(BinaryInputStream in) { - return in.position() - 1; - } - /** * Check if class is binarylizable. * @@ -2435,31 +1525,6 @@ public static BinaryMetadata binaryMetadata( return new BinaryMetadata(typeId, typeName, fields, affKeyFieldName, schemas, isEnum, enumMap); } - /** - * Enum type. - */ - private static class EnumType { - /** Type ID. */ - private final int typeId; - - /** Class name. */ - private final String clsName; - - /** - * Constructor. - * - * @param typeId Type ID. - * @param clsName Class name. - */ - public EnumType(int typeId, @Nullable String clsName) { - assert typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName == null || - typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName != null; - - this.typeId = typeId; - this.clsName = clsName; - } - } - /** * @param cls Class to get affinity field for. * @return Affinity field name or {@code null} if field name was not found. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 8f483d7b7be13..594b7ed0f028e 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -298,7 +298,7 @@ public void marshal(@Nullable Object obj, OutputStream out) throws BinaryObjectE BinaryContext oldCtx = pushContext(ctx); try { - return (T)BinaryUtils.unmarshal(BinaryStreams.inputStream(bytes), ctx, clsLdr); + return (T)BinaryUtils.binariesFactory.unmarshal(BinaryStreams.inputStream(bytes), ctx, clsLdr); } finally { popContext(oldCtx); @@ -314,7 +314,7 @@ public void marshal(@Nullable Object obj, OutputStream out) throws BinaryObjectE BinaryContext oldCtx = pushContext(ctx); try { - return (T)BinaryUtils.unmarshal(in, ctx, null); + return (T)BinaryUtils.binariesFactory.unmarshal(in, ctx, null); } finally { popContext(oldCtx); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index 0740a3b343688..6dd2d1c0ebd87 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.function.ToIntFunction; import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.streams.BinaryHeapOutputStream; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; @@ -63,6 +64,12 @@ public class BinariesFactoryImpl implements BinariesFactory { return new BinaryReaderExImpl(ctx, in, ldr, hnds, skipHdrCheck, forUnmarshal); } + /** {@inheritDoc} */ + @Override public @Nullable Object unmarshal(BinaryInputStream in, BinaryContext ctx, @Nullable ClassLoader ldr) + throws BinaryObjectException { + return BinaryImplUtils.unmarshal(in, ctx, ldr); + } + /** {@inheritDoc} */ @Override public BinaryWriterEx writer(BinaryContext ctx, boolean failIfUnregistered) { return newWriter(ctx, failIfUnregistered, GridBinaryMarshaller.UNREGISTERED_TYPE_ID); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index f97c931555f5f..bfbcdfe21e20a 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -16,10 +16,35 @@ */ package org.apache.ignite.internal.binary; +import java.io.ByteArrayInputStream; +import java.lang.reflect.Array; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.LinkedList; +import java.util.Map; +import java.util.UUID; + +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.binary.BinaryCollectionFactory; +import org.apache.ignite.binary.BinaryInvalidTypeException; +import org.apache.ignite.binary.BinaryMapFactory; +import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.streams.BinaryInputStream; +import org.apache.ignite.internal.marshaller.ClassLoaderUtils; +import org.apache.ignite.internal.util.CommonUtils; +import org.apache.ignite.internal.util.MutableSingletonList; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; - -import static org.apache.ignite.internal.binary.BinaryUtils.length; +import org.apache.ignite.marshaller.Marshallers; +import org.jetbrains.annotations.Nullable; /** * Binary utils used only in implementation. @@ -317,4 +342,931 @@ public static int hashCode(byte[] data, int startPos, int endPos) { return hash; } + + /** + * Check protocol version. + * + * @param protoVer Protocol version. + */ + public static void checkProtocolVersion(byte protoVer) { + if (GridBinaryMarshaller.PROTO_VER != protoVer) + throw new BinaryObjectException("Unsupported protocol version: " + protoVer); + } + + /** + * Get binary object length. + * + * @param in Input stream. + * @param start Start position. + * @return Length. + */ + public static int length(BinaryPositionReadable in, int start) { + return in.readIntPositioned(start + GridBinaryMarshaller.TOTAL_LEN_POS); + } + + /** + * @return Value. + */ + static boolean[] doReadBooleanArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readBooleanArray(len); + } + + /** + * @return Value. + */ + static short[] doReadShortArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readShortArray(len); + } + + /** + * @return Value. + */ + static char[] doReadCharArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readCharArray(len); + } + + /** + * @return Value. + */ + static int[] doReadIntArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readIntArray(len); + } + + /** + * @return Value. + */ + static long[] doReadLongArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readLongArray(len); + } + + /** + * @return Value. + */ + static float[] doReadFloatArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readFloatArray(len); + } + + /** + * @return Value. + */ + static double[] doReadDoubleArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readDoubleArray(len); + } + + /** + * @return Value. + */ + static BigDecimal doReadDecimal(BinaryInputStream in) { + int scale = in.readInt(); + byte[] mag = BinaryUtils.doReadByteArray(in); + + boolean negative = mag[0] < 0; + + if (negative) + mag[0] &= 0x7F; + + BigInteger intVal = new BigInteger(mag); + + if (negative) + intVal = intVal.negate(); + + return new BigDecimal(intVal, scale); + } + + /** + * @return Value. + */ + static UUID doReadUuid(BinaryInputStream in) { + return new UUID(in.readLong(), in.readLong()); + } + + /** + * @return Value. + */ + static Date doReadDate(BinaryInputStream in) { + long time = in.readLong(); + + return new Date(time); + } + + /** + * @return Value. + */ + static Timestamp doReadTimestamp(BinaryInputStream in) { + long time = in.readLong(); + int nanos = in.readInt(); + + Timestamp ts = new Timestamp(time); + + ts.setNanos(ts.getNanos() + nanos); + + return ts; + } + + /** + * @return Value. + */ + static Time doReadTime(BinaryInputStream in) { + long time = in.readLong(); + + return new Time(time); + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + static BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + BigDecimal[] arr = new BigDecimal[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.DECIMAL) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadDecimal(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + static UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + UUID[] arr = new UUID[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.UUID) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadUuid(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + static Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + Date[] arr = new Date[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.DATE) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadDate(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + static Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + Timestamp[] arr = new Timestamp[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.TIMESTAMP) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadTimestamp(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + static Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + Time[] arr = new Time[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.TIME) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadTime(in); + } + } + + return arr; + } + + /** + * @return Value. + */ + static BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { + if (in.offheapPointer() > 0) { + int len = in.readInt(); + + int pos = in.position(); + + in.position(in.position() + len); + + int start = in.readInt(); + + return BinaryUtils.binariesFactory.binaryOffheapObject(ctx, in.offheapPointer() + pos, start, len); + } + else { + byte[] arr = BinaryUtils.doReadByteArray(in); + int start = in.readInt(); + + BinaryObject binO = BinaryUtils.binariesFactory.binaryObject(ctx, arr, start); + + if (detach) + return BinaryUtils.detach(binO); + + return binO; + } + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @return Class object specified at the input stream. + * @throws BinaryObjectException If failed. + */ + static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) + throws BinaryObjectException { + return doReadClass(in, ctx, ldr, true); + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param deserialize Doesn't load the class when the flag is {@code false}. Class information is skipped. + * @return Class object specified at the input stream if {@code deserialize == true}. Otherwise returns {@code null} + * @throws BinaryObjectException If failed. + */ + private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) + throws BinaryObjectException { + int typeId = in.readInt(); + + if (!deserialize) { + // Skip class name at the stream. + if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + doReadClassName(in); + + return null; + } + + return doReadClass(in, ctx, ldr, typeId); + } + + /** + * @return Value. + */ + @SuppressWarnings("ConstantConditions") + static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) { + Class[] intfs = new Class[in.readInt()]; + + for (int i = 0; i < intfs.length; i++) + intfs[i] = doReadClass(in, ctx, ldr); + + InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr, handles); + + return Proxy.newProxyInstance(ldr != null ? ldr : CommonUtils.gridClassLoader(), intfs, ih); + } + + /** + * Read plain type. + * + * @param in Input stream. + * @return Plain type. + */ + static EnumType doReadEnumType(BinaryInputStream in) { + int typeId = in.readInt(); + + if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + return new EnumType(typeId, null); + else { + String clsName = doReadClassName(in); + + return new EnumType(GridBinaryMarshaller.UNREGISTERED_TYPE_ID, clsName); + } + } + + /** + * @param in Input stream. + * @return Class name. + */ + static String doReadClassName(BinaryInputStream in) { + byte flag = in.readByte(); + + if (flag != GridBinaryMarshaller.STRING) + throw new BinaryObjectException("Failed to read class name [position=" + (in.position() - 1) + ']'); + + return BinaryUtils.doReadString(in); + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param typeId Type id. + * @return Class object specified at the input stream. + * @throws BinaryObjectException If failed. + */ + static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) + throws BinaryObjectException { + Class cls; + + if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + cls = ctx.descriptorForTypeId(true, typeId, ldr, false).describedClass(); + else { + String clsName = doReadClassName(in); + + try { + cls = ClassLoaderUtils.forName(clsName, ldr); + } + catch (ClassNotFoundException e) { + throw new BinaryInvalidTypeException("Failed to load the class: " + clsName, e); + } + + // forces registering of class by type id, at least locally + if (Marshallers.USE_CACHE.get()) + ctx.registerType(cls, false, false); + } + + return cls; + } + + /** + * Read binary enum. + * + * @param in Input stream. + * @param ctx Binary context. + * @param type Plain type. + * @return Enum. + */ + static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, + EnumType type) { + return BinaryUtils.binariesFactory.binaryEnum(ctx, type.typeId, type.clsName, in.readInt()); + } + + /** + * Read binary enum array. + * + * @param in Input stream. + * @param ctx Binary context. + * @return Enum array. + */ + private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { + int len = in.readInt(); + + Object[] arr = (Object[])Array.newInstance(BinaryUtils.binariesFactory.binaryEnumClass(), len); + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else + arr[i] = doReadBinaryEnum(in, ctx, doReadEnumType(in)); + } + + return arr; + } + + /** + * Read object serialized using optimized marshaller. + * + * @return Result. + */ + public static Object doReadOptimized(BinaryInputStream in, BinaryContext ctx, @Nullable ClassLoader clsLdr) { + int len = in.readInt(); + + ByteArrayInputStream input = new ByteArrayInputStream(in.array(), in.position(), len); + + try { + return ctx.optimizedMarsh().unmarshal(input, CommonUtils.resolveClassLoader(clsLdr, ctx.classLoader())); + } + catch (IgniteCheckedException e) { + throw new BinaryObjectException("Failed to unmarshal object with optimized marshaller", e); + } + finally { + in.position(in.position() + len); + } + } + + /** + * @return Object. + * @throws BinaryObjectException In case of error. + */ + @Nullable static Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) throws BinaryObjectException { + return BinaryUtils.reader(ctx, in, ldr, handles.handles(), false, true).deserialize(); + } + + /** + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) + throws BinaryObjectException { + return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl()); + } + + /** + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) throws BinaryObjectException { + return unmarshal(in, ctx, ldr, handles, false, false); + } + + /** + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { + int start = in.position(); + + byte flag = in.readByte(); + + switch (flag) { + case GridBinaryMarshaller.NULL: + return null; + + case GridBinaryMarshaller.HANDLE: { + int handlePos = start - in.readInt(); + + Object obj = handles.getHandle(handlePos); + + if (obj == null) { + int retPos = in.position(); + + in.position(handlePos); + + obj = unmarshal(in, ctx, ldr, handles, detach, deserialize); + + in.position(retPos); + } + + return obj; + } + + case GridBinaryMarshaller.OBJ: { + checkProtocolVersion(in.readByte()); + + int len = length(in, start); + + BinaryObjectEx po; + + if (detach) { + BinaryObjectEx binObj = BinaryUtils.binariesFactory.binaryObject(ctx, in.array(), start); + + binObj.detachAllowed(true); + + po = binObj.detach(!handles.isEmpty()); + } + else { + if (in.offheapPointer() == 0) + po = BinaryUtils.binariesFactory.binaryObject(ctx, in.array(), start); + else + po = BinaryUtils.binariesFactory.binaryOffheapObject(ctx, in.offheapPointer(), start, + in.remaining() + in.position()); + } + + in.position(start + len); + + handles.setHandle(po, start); + + return po; + } + + case GridBinaryMarshaller.BYTE: + return in.readByte(); + + case GridBinaryMarshaller.SHORT: + return in.readShort(); + + case GridBinaryMarshaller.INT: + return in.readInt(); + + case GridBinaryMarshaller.LONG: + return in.readLong(); + + case GridBinaryMarshaller.FLOAT: + return in.readFloat(); + + case GridBinaryMarshaller.DOUBLE: + return in.readDouble(); + + case GridBinaryMarshaller.CHAR: + return in.readChar(); + + case GridBinaryMarshaller.BOOLEAN: + return in.readBoolean(); + + case GridBinaryMarshaller.DECIMAL: + return doReadDecimal(in); + + case GridBinaryMarshaller.STRING: + return BinaryUtils.doReadString(in); + + case GridBinaryMarshaller.UUID: + return doReadUuid(in); + + case GridBinaryMarshaller.DATE: + return doReadDate(in); + + case GridBinaryMarshaller.TIMESTAMP: + return doReadTimestamp(in); + + case GridBinaryMarshaller.TIME: + return doReadTime(in); + + case GridBinaryMarshaller.BYTE_ARR: + return BinaryUtils.doReadByteArray(in); + + case GridBinaryMarshaller.SHORT_ARR: + return doReadShortArray(in); + + case GridBinaryMarshaller.INT_ARR: + return doReadIntArray(in); + + case GridBinaryMarshaller.LONG_ARR: + return doReadLongArray(in); + + case GridBinaryMarshaller.FLOAT_ARR: + return doReadFloatArray(in); + + case GridBinaryMarshaller.DOUBLE_ARR: + return doReadDoubleArray(in); + + case GridBinaryMarshaller.CHAR_ARR: + return doReadCharArray(in); + + case GridBinaryMarshaller.BOOLEAN_ARR: + return doReadBooleanArray(in); + + case GridBinaryMarshaller.DECIMAL_ARR: + return doReadDecimalArray(in); + + case GridBinaryMarshaller.STRING_ARR: + return BinaryUtils.doReadStringArray(in); + + case GridBinaryMarshaller.UUID_ARR: + return doReadUuidArray(in); + + case GridBinaryMarshaller.DATE_ARR: + return doReadDateArray(in); + + case GridBinaryMarshaller.TIMESTAMP_ARR: + return doReadTimestampArray(in); + + case GridBinaryMarshaller.TIME_ARR: + return doReadTimeArray(in); + + case GridBinaryMarshaller.OBJ_ARR: + if (BinaryUtils.useBinaryArrays() && !deserialize) + return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, false); + else + return doReadObjectArray(in, ctx, ldr, handles, detach, deserialize); + + case GridBinaryMarshaller.COL: + return doReadCollection(in, ctx, ldr, handles, detach, deserialize, null); + + case GridBinaryMarshaller.MAP: + return doReadMap(in, ctx, ldr, handles, detach, deserialize, null); + + case GridBinaryMarshaller.BINARY_OBJ: + return doReadBinaryObject(in, ctx, detach); + + case GridBinaryMarshaller.ENUM: + case GridBinaryMarshaller.BINARY_ENUM: + return doReadBinaryEnum(in, ctx, doReadEnumType(in)); + + case GridBinaryMarshaller.ENUM_ARR: + if (BinaryUtils.useBinaryArrays() && !deserialize) + return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, true); + else { + doReadEnumType(in); // Simply skip this part as we do not need it. + + return doReadBinaryEnumArray(in, ctx); + } + + case GridBinaryMarshaller.CLASS: + return doReadClass(in, ctx, ldr); + + case GridBinaryMarshaller.PROXY: + return doReadProxy(in, ctx, ldr, handles); + + case GridBinaryMarshaller.OPTM_MARSH: + return doReadOptimized(in, ctx, ldr); + + default: + throw new BinaryObjectException("Invalid flag value: " + flag); + } + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param handles Holder for handles. + * @param detach Detach flag. + * @param deserialize Deep flag. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + static Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { + int hPos = positionForHandle(in); + + Class compType = doReadClass(in, ctx, ldr, deserialize); + + int len = in.readInt(); + + Object[] arr = (deserialize && !BinaryObject.class.isAssignableFrom(compType)) + ? (Object[])Array.newInstance(compType, len) + : new Object[len]; + + handles.setHandle(arr, hPos); + + for (int i = 0; i < len; i++) { + Object res = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + + if (deserialize && BinaryUtils.useBinaryArrays() && res instanceof BinaryObject) + arr[i] = ((BinaryObject)res).deserialize(ldr); + else + arr[i] = res; + } + + return arr; + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param handles Holder for handles. + * @param detach Detach flag. + * @param deserialize Deep flag. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, boolean isEnumArray) { + int hPos = positionForHandle(in); + + int compTypeId = in.readInt(); + String compClsName = null; + + if (compTypeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + compClsName = doReadClassName(in); + + int len = in.readInt(); + + Object[] arr = new Object[len]; + + BinaryArray res = isEnumArray + ? new BinaryEnumArray(ctx, compTypeId, compClsName, arr) + : new BinaryArray(ctx, compTypeId, compClsName, arr); + + handles.setHandle(res, hPos); + + for (int i = 0; i < len; i++) + arr[i] = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + + return res; + } + + /** + * @param deserialize Deep flag. + * @param factory Collection factory. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + @SuppressWarnings("unchecked") + static Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryCollectionFactory factory) + throws BinaryObjectException { + int hPos = positionForHandle(in); + + int size = in.readInt(); + + assert size >= 0; + + byte colType = in.readByte(); + + Collection col; + + if (factory != null) + col = factory.create(size); + else { + switch (colType) { + case GridBinaryMarshaller.ARR_LIST: + col = new ArrayList<>(size); + + break; + + case GridBinaryMarshaller.LINKED_LIST: + col = new LinkedList<>(); + + break; + + case GridBinaryMarshaller.SINGLETON_LIST: + col = new MutableSingletonList<>(); + + break; + + case GridBinaryMarshaller.HASH_SET: + col = CommonUtils.newHashSet(size); + + break; + + case GridBinaryMarshaller.LINKED_HASH_SET: + col = CommonUtils.newLinkedHashSet(size); + + break; + + case GridBinaryMarshaller.USER_SET: + col = CommonUtils.newHashSet(size); + + break; + + case GridBinaryMarshaller.USER_COL: + col = new ArrayList<>(size); + + break; + + default: + throw new BinaryObjectException("Invalid collection type: " + colType); + } + } + + handles.setHandle(col, hPos); + + for (int i = 0; i < size; i++) + col.add(deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize)); + + return colType == GridBinaryMarshaller.SINGLETON_LIST ? CommonUtils.convertToSingletonList(col) : col; + } + + /** + * @param deserialize Deep flag. + * @param factory Map factory. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + @SuppressWarnings("unchecked") + static Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryMapFactory factory) + throws BinaryObjectException { + int hPos = positionForHandle(in); + + int size = in.readInt(); + + assert size >= 0; + + byte mapType = in.readByte(); + + Map map; + + if (factory != null) + map = factory.create(size); + else { + switch (mapType) { + case GridBinaryMarshaller.HASH_MAP: + map = CommonUtils.newHashMap(size); + + break; + + case GridBinaryMarshaller.LINKED_HASH_MAP: + map = CommonUtils.newLinkedHashMap(size); + + break; + + case GridBinaryMarshaller.USER_COL: + map = CommonUtils.newHashMap(size); + + break; + + default: + throw new BinaryObjectException("Invalid map type: " + mapType); + } + } + + handles.setHandle(map, hPos); + + for (int i = 0; i < size; i++) { + Object key = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + Object val = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + + map.put(key, val); + } + + return map; + } + + /** + * Deserialize or unmarshal the object. + * + * @param deserialize Deserialize. + * @return Result. + */ + private static Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) { + return deserialize ? doReadObject(in, ctx, ldr, handles) : unmarshal(in, ctx, ldr, handles, detach, deserialize); + } + + /** + * Get position to be used for handle. We assume here that the hdr byte was read, hence subtract -1. + * + * @return Position for handle. + */ + static int positionForHandle(BinaryInputStream in) { + return in.position() - 1; + } + + /** + * Enum type. + */ + private static class EnumType { + /** Type ID. */ + private final int typeId; + + /** Class name. */ + private final String clsName; + + /** + * Constructor. + * + * @param typeId Type ID. + * @param clsName Class name. + */ + public EnumType(int typeId, @Nullable String clsName) { + assert typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName == null || + typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName != null; + + this.typeId = typeId; + this.clsName = clsName; + } + } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index 4f625babc3768..4193270e3fb1e 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -561,7 +561,7 @@ else if (fieldOffLen == BinaryImplUtils.OFFSET_2) break; default: - val = BinaryUtils.unmarshal(BinaryStreams.inputStream(arr, fieldPos), ctx, null); + val = BinaryImplUtils.unmarshal(BinaryStreams.inputStream(arr, fieldPos), ctx, null); break; } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java index dc439b77d11c6..284a57aec4cd6 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java @@ -96,7 +96,7 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) { int off = start + GridBinaryMarshaller.DFLT_HDR_LEN; - String clsName = BinaryUtils.doReadClassName(BinaryStreams.inputStream(ptr + off, size)); + String clsName = BinaryImplUtils.doReadClassName(BinaryStreams.inputStream(ptr + off, size)); typeId = ctx.typeId(clsName); } @@ -375,7 +375,7 @@ else if (fieldOffLen == BinaryImplUtils.OFFSET_2) stream.position(fieldPos); - val = BinaryUtils.unmarshal(stream, ctx, null); + val = BinaryImplUtils.unmarshal(stream, ctx, null); break; } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 7b49c16aa095c..7d444ca4a4397 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -96,7 +96,7 @@ * Binary reader implementation. */ @SuppressWarnings("unchecked") -public class BinaryReaderExImpl implements BinaryReaderEx { +public class BinaryReaderExImpl implements BinaryReaderEx, BinaryReaderHandlesHolder { /** Binary context. */ private final BinaryContext ctx; @@ -222,7 +222,7 @@ public BinaryReaderExImpl(BinaryContext ctx, // Perform full header parsing in case of binary object. if (!skipHdrCheck && (in.readByte() == GridBinaryMarshaller.OBJ)) { // Ensure protocol is fine. - BinaryUtils.checkProtocolVersion(in.readByte()); + BinaryImplUtils.checkProtocolVersion(in.readByte()); // Read header content. short flags = in.readShort(); @@ -270,12 +270,12 @@ public BinaryReaderExImpl(BinaryContext ctx, if (forUnmarshal) { // Registers class by type ID, at least locally if the cache is not ready yet. - desc = ctx.registerClass(BinaryUtils.doReadClass(in, ctx, ldr, typeId0), true, false); + desc = ctx.registerClass(BinaryImplUtils.doReadClass(in, ctx, ldr, typeId0), true, false); typeId = desc.typeId(); } else - typeId = ctx.typeId(BinaryUtils.doReadClassName(in)); + typeId = ctx.typeId(BinaryImplUtils.doReadClassName(in)); int clsNameLen = in.position() - off; @@ -328,7 +328,7 @@ public BinaryClassDescriptor descriptor() { public Object unmarshal(int offset) throws BinaryObjectException { streamPosition(offset); - return in.position() >= 0 ? BinaryUtils.unmarshal(in, ctx, ldr, this) : null; + return in.position() >= 0 ? BinaryImplUtils.unmarshal(in, ctx, ldr, this) : null; } /** @@ -338,7 +338,7 @@ public Object unmarshal(int offset) throws BinaryObjectException { */ public Object unmarshalField(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? BinaryUtils.unmarshal(in, ctx, ldr, this) : null; + return findFieldByName(fieldName) ? BinaryImplUtils.unmarshal(in, ctx, ldr, this) : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -351,7 +351,7 @@ public Object unmarshalField(String fieldName) throws BinaryObjectException { * @throws BinaryObjectException In case of error. */ public Object unmarshalField(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? BinaryUtils.unmarshal(in, ctx, ldr, this) : null; + return findFieldById(fieldId) ? BinaryImplUtils.unmarshal(in, ctx, ldr, this) : null; } /** @@ -380,7 +380,7 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { if (checkFlag(CLASS) == Flag.NULL) return null; - return BinaryUtils.doReadClass(in, ctx, ldr); + return BinaryImplUtils.doReadClass(in, ctx, ldr); } return null; @@ -411,7 +411,7 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { * @return Field. */ private T readHandleField() { - int handlePos = BinaryUtils.positionForHandle(in) - in.readInt(); + int handlePos = BinaryImplUtils.positionForHandle(in) - in.readInt(); Object obj = getHandle(handlePos); @@ -420,7 +420,7 @@ private T readHandleField() { streamPosition(handlePos); - obj = BinaryUtils.doReadObject(in, ctx, ldr, this); + obj = BinaryImplUtils.doReadObject(in, ctx, ldr, this); streamPosition(retPos); } @@ -564,7 +564,7 @@ boolean readBoolean(int fieldId) throws BinaryObjectException { @Nullable @Override public boolean[] readBooleanArray() throws BinaryObjectException { switch (checkFlag(BOOLEAN_ARR)) { case NORMAL: - return BinaryUtils.doReadBooleanArray(in); + return BinaryImplUtils.doReadBooleanArray(in); case HANDLE: return readHandleField(); @@ -630,7 +630,7 @@ short readShort(int fieldId) throws BinaryObjectException { @Nullable @Override public short[] readShortArray() throws BinaryObjectException { switch (checkFlag(SHORT_ARR)) { case NORMAL: - return BinaryUtils.doReadShortArray(in); + return BinaryImplUtils.doReadShortArray(in); case HANDLE: return readHandleField(); @@ -696,7 +696,7 @@ char readChar(int fieldId) throws BinaryObjectException { @Nullable @Override public char[] readCharArray() throws BinaryObjectException { switch (checkFlag(CHAR_ARR)) { case NORMAL: - return BinaryUtils.doReadCharArray(in); + return BinaryImplUtils.doReadCharArray(in); case HANDLE: return readHandleField(); @@ -762,7 +762,7 @@ int readInt(int fieldId) throws BinaryObjectException { @Nullable @Override public int[] readIntArray() throws BinaryObjectException { switch (checkFlag(INT_ARR)) { case NORMAL: - return BinaryUtils.doReadIntArray(in); + return BinaryImplUtils.doReadIntArray(in); case HANDLE: return readHandleField(); @@ -828,7 +828,7 @@ long readLong(int fieldId) throws BinaryObjectException { @Nullable @Override public long[] readLongArray() throws BinaryObjectException { switch (checkFlag(LONG_ARR)) { case NORMAL: - return BinaryUtils.doReadLongArray(in); + return BinaryImplUtils.doReadLongArray(in); case HANDLE: return readHandleField(); @@ -894,7 +894,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public float[] readFloatArray() throws BinaryObjectException { switch (checkFlag(FLOAT_ARR)) { case NORMAL: - return BinaryUtils.doReadFloatArray(in); + return BinaryImplUtils.doReadFloatArray(in); case HANDLE: return readHandleField(); @@ -960,7 +960,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public double[] readDoubleArray() throws BinaryObjectException { switch (checkFlag(DOUBLE_ARR)) { case NORMAL: - return BinaryUtils.doReadDoubleArray(in); + return BinaryImplUtils.doReadDoubleArray(in); case HANDLE: return readHandleField(); @@ -991,7 +991,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public BigDecimal readDecimal() throws BinaryObjectException { - return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? BinaryUtils.doReadDecimal(in) : null; + return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? BinaryImplUtils.doReadDecimal(in) : null; } /** {@inheritDoc} */ @@ -1017,7 +1017,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public BigDecimal[] readDecimalArray() throws BinaryObjectException { switch (checkFlag(DECIMAL_ARR)) { case NORMAL: - return BinaryUtils.doReadDecimalArray(in); + return BinaryImplUtils.doReadDecimalArray(in); case HANDLE: return readHandleField(); @@ -1105,7 +1105,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public UUID readUuid() throws BinaryObjectException { - return checkFlagNoHandles(UUID) == Flag.NORMAL ? BinaryUtils.doReadUuid(in) : null; + return checkFlagNoHandles(UUID) == Flag.NORMAL ? BinaryImplUtils.doReadUuid(in) : null; } /** {@inheritDoc} */ @@ -1131,7 +1131,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public UUID[] readUuidArray() throws BinaryObjectException { switch (checkFlag(UUID_ARR)) { case NORMAL: - return BinaryUtils.doReadUuidArray(in); + return BinaryImplUtils.doReadUuidArray(in); case HANDLE: return readHandleField(); @@ -1162,7 +1162,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public Date readDate() throws BinaryObjectException { - return checkFlagNoHandles(DATE) == Flag.NORMAL ? BinaryUtils.doReadDate(in) : null; + return checkFlagNoHandles(DATE) == Flag.NORMAL ? BinaryImplUtils.doReadDate(in) : null; } /** {@inheritDoc} */ @@ -1188,7 +1188,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public Date[] readDateArray() throws BinaryObjectException { switch (checkFlag(DATE_ARR)) { case NORMAL: - return BinaryUtils.doReadDateArray(in); + return BinaryImplUtils.doReadDateArray(in); case HANDLE: return readHandleField(); @@ -1219,7 +1219,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public Timestamp readTimestamp() throws BinaryObjectException { - return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? BinaryUtils.doReadTimestamp(in) : null; + return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? BinaryImplUtils.doReadTimestamp(in) : null; } /** {@inheritDoc} */ @@ -1245,7 +1245,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public Timestamp[] readTimestampArray() throws BinaryObjectException { switch (checkFlag(TIMESTAMP_ARR)) { case NORMAL: - return BinaryUtils.doReadTimestampArray(in); + return BinaryImplUtils.doReadTimestampArray(in); case HANDLE: return readHandleField(); @@ -1262,7 +1262,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public Time readTime() throws BinaryObjectException { - return checkFlagNoHandles(TIME) == Flag.NORMAL ? BinaryUtils.doReadTime(in) : null; + return checkFlagNoHandles(TIME) == Flag.NORMAL ? BinaryImplUtils.doReadTime(in) : null; } /** {@inheritDoc} */ @@ -1292,7 +1292,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public Time[] readTimeArray() throws BinaryObjectException { switch (checkFlag(TIME_ARR)) { case NORMAL: - return BinaryUtils.doReadTimeArray(in); + return BinaryImplUtils.doReadTimeArray(in); case HANDLE: return readHandleField(); default: @@ -1303,7 +1303,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public T readObject(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? (T)BinaryUtils.doReadObject(in, ctx, ldr, this) : null; + return findFieldByName(fieldName) ? (T)BinaryImplUtils.doReadObject(in, ctx, ldr, this) : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -1316,12 +1316,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @throws BinaryObjectException In case of error. */ @Nullable Object readObject(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? BinaryUtils.doReadObject(in, ctx, ldr, this) : null; + return findFieldById(fieldId) ? BinaryImplUtils.doReadObject(in, ctx, ldr, this) : null; } /** {@inheritDoc} */ @Override public Object readObject() throws BinaryObjectException { - return BinaryUtils.doReadObject(in, ctx, ldr, this); + return BinaryImplUtils.doReadObject(in, ctx, ldr, this); } /** {@inheritDoc} */ @@ -1331,7 +1331,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public Object readObjectDetached(boolean deserialize) throws BinaryObjectException { - return BinaryUtils.unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl(), true, deserialize); + return BinaryImplUtils.unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl(), true, deserialize); } /** {@inheritDoc} */ @@ -1357,7 +1357,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public Object[] readObjectArray() throws BinaryObjectException { switch (checkFlag(OBJ_ARR)) { case NORMAL: - return BinaryUtils.doReadObjectArray(in, ctx, ldr, this, false, true); + return BinaryImplUtils.doReadObjectArray(in, ctx, ldr, this, false, true); case HANDLE: Object arr = readHandleField(); @@ -1407,7 +1407,7 @@ float readFloat(int fieldId) throws BinaryObjectException { private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { if (checkFlagNoHandles(ENUM) == Flag.NORMAL) { // Read class even if we know it in advance to set correct stream position. - Class cls0 = BinaryUtils.doReadClass(in, ctx, ldr); + Class cls0 = BinaryImplUtils.doReadClass(in, ctx, ldr); if (cls == null) cls = cls0; @@ -1465,7 +1465,7 @@ private Object[] readEnumArray0(@Nullable Class cls) throws BinaryObjectExcep switch (checkFlag(ENUM_ARR)) { case NORMAL: // Read class even if we know it in advance to set correct stream position. - Class cls0 = BinaryUtils.doReadClass(in, ctx, ldr); + Class cls0 = BinaryImplUtils.doReadClass(in, ctx, ldr); if (cls == null) cls = cls0; @@ -1540,10 +1540,10 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) throws BinaryObjectException { switch (checkFlag(COL)) { case NORMAL: - return (Collection)BinaryUtils.doReadCollection(in, ctx, ldr, this, false, true, factory); + return (Collection)BinaryImplUtils.doReadCollection(in, ctx, ldr, this, false, true, factory); case HANDLE: { - int handlePos = BinaryUtils.positionForHandle(in) - in.readInt(); + int handlePos = BinaryImplUtils.positionForHandle(in) - in.readInt(); Object obj = getHandle(handlePos); @@ -1618,10 +1618,10 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) private Map readMap0(@Nullable BinaryMapFactory factory) throws BinaryObjectException { switch (checkFlag(MAP)) { case NORMAL: - return (Map)BinaryUtils.doReadMap(in, ctx, ldr, this, false, true, factory); + return (Map)BinaryImplUtils.doReadMap(in, ctx, ldr, this, false, true, factory); case HANDLE: { - int handlePos = BinaryUtils.positionForHandle(in) - in.readInt(); + int handlePos = BinaryImplUtils.positionForHandle(in) - in.readInt(); Object obj = getHandle(handlePos); @@ -1660,7 +1660,7 @@ else if (flag == NULL) else if (flag == HANDLE) return Flag.HANDLE; - int pos = BinaryUtils.positionForHandle(in); + int pos = BinaryImplUtils.positionForHandle(in); throw new BinaryObjectException("Unexpected field type [pos=" + pos + ", expected=" + fieldFlagName(expFlag) + ", actual=" + fieldFlagName(flag) + ']'); @@ -1681,7 +1681,7 @@ private Flag checkFlagNoHandles(byte expFlag) { else if (flag == NULL) return Flag.NULL; - int pos = BinaryUtils.positionForHandle(in); + int pos = BinaryImplUtils.positionForHandle(in); throw new BinaryObjectException("Unexpected field type [pos=" + pos + ", expected=" + fieldFlagName(expFlag) + ", actual=" + fieldFlagName(flag) + ']'); @@ -1750,7 +1750,7 @@ private String fieldFlagName(byte flag) { streamPosition(handlePos); - obj = BinaryUtils.doReadObject(in, ctx, ldr, this); + obj = BinaryImplUtils.doReadObject(in, ctx, ldr, this); streamPosition(retPos); } @@ -1813,7 +1813,7 @@ private String fieldFlagName(byte flag) { break; case DECIMAL: - obj = BinaryUtils.doReadDecimal(in); + obj = BinaryImplUtils.doReadDecimal(in); break; @@ -1823,22 +1823,22 @@ private String fieldFlagName(byte flag) { break; case UUID: - obj = BinaryUtils.doReadUuid(in); + obj = BinaryImplUtils.doReadUuid(in); break; case DATE: - obj = BinaryUtils.doReadDate(in); + obj = BinaryImplUtils.doReadDate(in); break; case TIMESTAMP: - obj = BinaryUtils.doReadTimestamp(in); + obj = BinaryImplUtils.doReadTimestamp(in); break; case TIME: - obj = BinaryUtils.doReadTime(in); + obj = BinaryImplUtils.doReadTime(in); break; @@ -1848,42 +1848,42 @@ private String fieldFlagName(byte flag) { break; case SHORT_ARR: - obj = BinaryUtils.doReadShortArray(in); + obj = BinaryImplUtils.doReadShortArray(in); break; case INT_ARR: - obj = BinaryUtils.doReadIntArray(in); + obj = BinaryImplUtils.doReadIntArray(in); break; case LONG_ARR: - obj = BinaryUtils.doReadLongArray(in); + obj = BinaryImplUtils.doReadLongArray(in); break; case FLOAT_ARR: - obj = BinaryUtils.doReadFloatArray(in); + obj = BinaryImplUtils.doReadFloatArray(in); break; case DOUBLE_ARR: - obj = BinaryUtils.doReadDoubleArray(in); + obj = BinaryImplUtils.doReadDoubleArray(in); break; case CHAR_ARR: - obj = BinaryUtils.doReadCharArray(in); + obj = BinaryImplUtils.doReadCharArray(in); break; case BOOLEAN_ARR: - obj = BinaryUtils.doReadBooleanArray(in); + obj = BinaryImplUtils.doReadBooleanArray(in); break; case DECIMAL_ARR: - obj = BinaryUtils.doReadDecimalArray(in); + obj = BinaryImplUtils.doReadDecimalArray(in); break; @@ -1893,54 +1893,54 @@ private String fieldFlagName(byte flag) { break; case UUID_ARR: - obj = BinaryUtils.doReadUuidArray(in); + obj = BinaryImplUtils.doReadUuidArray(in); break; case DATE_ARR: - obj = BinaryUtils.doReadDateArray(in); + obj = BinaryImplUtils.doReadDateArray(in); break; case TIMESTAMP_ARR: - obj = BinaryUtils.doReadTimestampArray(in); + obj = BinaryImplUtils.doReadTimestampArray(in); break; case TIME_ARR: - obj = BinaryUtils.doReadTimeArray(in); + obj = BinaryImplUtils.doReadTimeArray(in); break; case OBJ_ARR: - obj = BinaryUtils.doReadObjectArray(in, ctx, ldr, this, false, true); + obj = BinaryImplUtils.doReadObjectArray(in, ctx, ldr, this, false, true); break; case COL: - obj = BinaryUtils.doReadCollection(in, ctx, ldr, this, false, true, null); + obj = BinaryImplUtils.doReadCollection(in, ctx, ldr, this, false, true, null); break; case MAP: - obj = BinaryUtils.doReadMap(in, ctx, ldr, this, false, true, null); + obj = BinaryImplUtils.doReadMap(in, ctx, ldr, this, false, true, null); break; case BINARY_OBJ: - obj = BinaryUtils.doReadBinaryObject(in, ctx, false); + obj = BinaryImplUtils.doReadBinaryObject(in, ctx, false); ((BinaryObjectImpl)obj).context(ctx); break; case ENUM: - obj = doReadEnum(in, BinaryUtils.doReadClass(in, ctx, ldr)); + obj = doReadEnum(in, BinaryImplUtils.doReadClass(in, ctx, ldr)); break; case ENUM_ARR: - obj = doReadEnumArray(in, ctx, ldr, BinaryUtils.doReadClass(in, ctx, ldr)); + obj = doReadEnumArray(in, ctx, ldr, BinaryImplUtils.doReadClass(in, ctx, ldr)); break; @@ -1950,17 +1950,17 @@ private String fieldFlagName(byte flag) { break; case CLASS: - obj = BinaryUtils.doReadClass(in, ctx, ldr); + obj = BinaryImplUtils.doReadClass(in, ctx, ldr); break; case PROXY: - obj = BinaryUtils.doReadProxy(in, ctx, ldr, this); + obj = BinaryImplUtils.doReadProxy(in, ctx, ldr, this); break; case OPTM_MARSH: - obj = BinaryUtils.doReadOptimized(in, ctx, ldr); + obj = BinaryImplUtils.doReadOptimized(in, ctx, ldr); break; @@ -2082,61 +2082,61 @@ public BinarySchema getOrCreateSchema() { return BinaryUtils.doReadString(in()); case GridBinaryMarshaller.DECIMAL: - return BinaryUtils.doReadDecimal(in()); + return BinaryImplUtils.doReadDecimal(in()); case GridBinaryMarshaller.UUID: - return BinaryUtils.doReadUuid(in()); + return BinaryImplUtils.doReadUuid(in()); case GridBinaryMarshaller.TIME: - return BinaryUtils.doReadTime(in()); + return BinaryImplUtils.doReadTime(in()); case GridBinaryMarshaller.TIMESTAMP: - return BinaryUtils.doReadTimestamp(in()); + return BinaryImplUtils.doReadTimestamp(in()); case GridBinaryMarshaller.DATE: - return BinaryUtils.doReadDate(in()); + return BinaryImplUtils.doReadDate(in()); case GridBinaryMarshaller.BOOLEAN_ARR: - return BinaryUtils.doReadBooleanArray(in()); + return BinaryImplUtils.doReadBooleanArray(in()); case GridBinaryMarshaller.BYTE_ARR: return BinaryUtils.doReadByteArray(in()); case GridBinaryMarshaller.CHAR_ARR: - return BinaryUtils.doReadCharArray(in()); + return BinaryImplUtils.doReadCharArray(in()); case GridBinaryMarshaller.SHORT_ARR: - return BinaryUtils.doReadShortArray(in()); + return BinaryImplUtils.doReadShortArray(in()); case GridBinaryMarshaller.INT_ARR: - return BinaryUtils.doReadIntArray(in()); + return BinaryImplUtils.doReadIntArray(in()); case GridBinaryMarshaller.LONG_ARR: - return BinaryUtils.doReadLongArray(in()); + return BinaryImplUtils.doReadLongArray(in()); case GridBinaryMarshaller.FLOAT_ARR: - return BinaryUtils.doReadFloatArray(in()); + return BinaryImplUtils.doReadFloatArray(in()); case GridBinaryMarshaller.DOUBLE_ARR: - return BinaryUtils.doReadDoubleArray(in()); + return BinaryImplUtils.doReadDoubleArray(in()); case GridBinaryMarshaller.STRING_ARR: return BinaryUtils.doReadStringArray(in()); case GridBinaryMarshaller.DECIMAL_ARR: - return BinaryUtils.doReadDecimalArray(in()); + return BinaryImplUtils.doReadDecimalArray(in()); case GridBinaryMarshaller.UUID_ARR: - return BinaryUtils.doReadUuidArray(in()); + return BinaryImplUtils.doReadUuidArray(in()); case GridBinaryMarshaller.TIME_ARR: - return BinaryUtils.doReadTimeArray(in()); + return BinaryImplUtils.doReadTimeArray(in()); case GridBinaryMarshaller.TIMESTAMP_ARR: - return BinaryUtils.doReadTimestampArray(in()); + return BinaryImplUtils.doReadTimestampArray(in()); case GridBinaryMarshaller.DATE_ARR: - return BinaryUtils.doReadDateArray(in()); + return BinaryImplUtils.doReadDateArray(in()); default: in().position(in().position() - 1); @@ -2869,7 +2869,7 @@ protected Object readFixedType(BinaryFieldDescriptor fld) throws BinaryObjectExc * @return Enum. */ private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx) { - return BinaryUtils.doReadBinaryEnum(in, ctx, BinaryUtils.doReadEnumType(in)); + return BinaryImplUtils.doReadBinaryEnum(in, ctx, BinaryImplUtils.doReadEnumType(in)); } /** @@ -2888,7 +2888,7 @@ private static Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, if (flag == GridBinaryMarshaller.NULL) arr[i] = null; else - arr[i] = doReadEnum(in, BinaryUtils.doReadClass(in, ctx, ldr)); + arr[i] = doReadEnum(in, BinaryImplUtils.doReadClass(in, ctx, ldr)); } return arr; diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java similarity index 100% rename from modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java similarity index 100% rename from modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java index d5c06d7032e44..5e55c55de901f 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java @@ -31,8 +31,8 @@ import static org.apache.ignite.internal.binary.BinaryImplUtils.hasRaw; import static org.apache.ignite.internal.binary.BinaryImplUtils.hasSchema; import static org.apache.ignite.internal.binary.BinaryImplUtils.isCompactFooter; +import static org.apache.ignite.internal.binary.BinaryImplUtils.length; import static org.apache.ignite.internal.binary.BinaryImplUtils.rawOffsetAbsolute; -import static org.apache.ignite.internal.binary.BinaryUtils.length; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.DFLT_HDR_LEN; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.FLAGS_POS; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.HASH_CODE_POS; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java index d5e40860186e0..75f925b28d5c1 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java @@ -22,8 +22,8 @@ import org.apache.ignite.internal.binary.streams.BinaryStreams; import static org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative; +import static org.apache.ignite.internal.binary.BinaryImplUtils.length; import static org.apache.ignite.internal.binary.BinaryImplUtils.rawOffsetAbsolute; -import static org.apache.ignite.internal.binary.BinaryUtils.length; /** */ class ObjectDetachHelper { diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java index b75f6a53d9c1e..d8d4fb9231770 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractor.java @@ -90,7 +90,7 @@ void skipObject() { break; case GridBinaryMarshaller.OBJ: - skipBytes(BinaryUtils.length(in, objStartPos) - /** Object type. */ Byte.BYTES); + skipBytes(BinaryImplUtils.length(in, objStartPos) - /** Object type. */ Byte.BYTES); break; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java index c6360be745b58..f88972bffa3a3 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java @@ -24,12 +24,12 @@ import java.util.Map; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryContext; +import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.binary.BinaryPositionReadable; import org.apache.ignite.internal.binary.BinaryPrimitives; import org.apache.ignite.internal.binary.BinaryReaderExImpl; -import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.binary.streams.BinaryInputStream; @@ -492,7 +492,7 @@ public Object getValueQuickly(int pos, int len) { case GridBinaryMarshaller.OPTM_MARSH: { final BinaryInputStream bin = BinaryStreams.inputStream(arr, pos + 1); - final Object obj = BinaryUtils.doReadOptimized(bin, ctx, CommonUtils.resolveClassLoader(null, ctx.classLoader())); + final Object obj = BinaryImplUtils.doReadOptimized(bin, ctx, CommonUtils.resolveClassLoader(null, ctx.classLoader())); return obj; } @@ -844,7 +844,7 @@ else if (flag == GridBinaryMarshaller.DECIMAL) { case GridBinaryMarshaller.OPTM_MARSH: { final BinaryInputStream bin = BinaryStreams.inputStream(arr, pos); - final Object obj = BinaryUtils.doReadOptimized(bin, ctx, CommonUtils.resolveClassLoader(null, ctx.classLoader())); + final Object obj = BinaryImplUtils.doReadOptimized(bin, ctx, CommonUtils.resolveClassLoader(null, ctx.classLoader())); pos = bin.position(); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 3b4451ec861a5..c0a66261d5b65 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -138,7 +138,7 @@ public BinaryObjectBuilderImpl(BinaryObjectEx obj) { byte ver = reader.readBytePositioned(start + GridBinaryMarshaller.PROTO_VER_POS); - BinaryUtils.checkProtocolVersion(ver); + BinaryImplUtils.checkProtocolVersion(ver); int typeId = reader.readIntPositioned(start + GridBinaryMarshaller.TYPE_ID_POS); ctx = reader.binaryContext(); @@ -333,7 +333,7 @@ else if (readCache == null) { } // Shift reader to the end of the object. - reader.position(start + BinaryUtils.length(reader, start)); + reader.position(start + BinaryImplUtils.length(reader, start)); } writer.postWrite(true, registeredType); From cfb0231d56398b02956dcdb8c33a8f85a870ffe9 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 30 Sep 2026 15:07:14 +0300 Subject: [PATCH 26/33] Move read methods into implementaion. --- .../internal/binary/GridBinaryMarshaller.java | 23 +++++++++++++++++++ .../client/thin/ClientBinaryMarshaller.java | 8 +++++++ .../internal/client/thin/ClientUtils.java | 8 ++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 594b7ed0f028e..1489a11c1d508 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -287,6 +287,29 @@ public void marshal(@Nullable Object obj, OutputStream out) throws BinaryObjectE } } + /** + * Marshals the object directly into the given stream, without allocating a trimmed copy of the whole result. + * + * @param obj Object to marshal. + * @param out Output stream. + * @throws BinaryObjectException In case of error. + */ + public void marshal(Object obj, BinaryOutputStream out) { + if (obj == null) { + out.writeByte(NULL); + + return; + } + + try (BinaryWriterEx writer = BinaryUtils.binariesFactory.writer(ctx, false)) { + writer.marshal(obj); + + BinaryOutputStream s = writer.out(); + + out.write(s.array(), 0, s.position()); + } + } + /** * @param bytes Bytes array. * @return Binary object. diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java index 671e1a2c869b9..ba0ccd9240c0b 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.binary.streams.BinaryInputStream; +import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.MarshallerContext; @@ -82,6 +83,13 @@ public byte[] marshal(Object obj) { return impl.marshal(obj, false); } + /** + * Serializes Java object into a byte array. + */ + public void marshal(Object obj, BinaryOutputStream out) { + impl.marshal(obj, out); + } + /** * Configure marshaller with custom Ignite Binary Object configuration. */ diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java index c6d720c5565ce..5ec2926c2a73d 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java @@ -84,6 +84,9 @@ public final class ClientUtils { /** Marshaller. */ private final ClientBinaryMarshaller marsh; + /** Use new marshaller. */ + private static final boolean USE_NEW_MARSHALL = System.getProperty("USE_NEW_MARSHALL") != null; + /** * Constructor. */ @@ -602,7 +605,10 @@ void write(SqlFieldsQuery qry, BinaryOutputStream out, ProtocolContext protocolC /** Write Ignite binary object to output stream. */ void writeObject(BinaryOutputStream out, Object obj) { - out.writeByteArray(marsh.marshal(obj)); + if (USE_NEW_MARSHALL) + marsh.marshal(obj, out); + else + out.writeByteArray(marsh.marshal(obj)); } /** From 6a4da907280d3c10899c7d99e25b7215cc98ed7b Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 1 Oct 2026 13:19:08 +0300 Subject: [PATCH 27/33] IGNITE-29094 Remove useless byte array creation --- .../ignite/internal/binary/builder/BinaryBuilderReader.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java index 7ec28458deaed..f88972bffa3a3 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryContext; +import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.binary.BinaryPositionReadable; From 17e761878e321daccbe47bdfaae6280d58c05273 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 1 Oct 2026 16:29:31 +0300 Subject: [PATCH 28/33] IGNITE-29094 Remove useless byte array creation --- .../ignite/internal/binary/BinaryUtils.java | 33 +++++-------------- .../internal/binary/BinaryImplUtils.java | 2 +- .../internal/binary/BinaryReaderExImpl.java | 2 +- 3 files changed, 10 insertions(+), 27 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index ba09c6e70743a..4fe26c63ecf44 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -1343,11 +1343,13 @@ public static BinaryReaderEx reader(BinaryContext ctx, BinaryInputStream in, Cla * @param hnds Context. * @param forUnmarshal {@code True} if reader is need to unmarshal object. */ - static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - @Nullable BinaryReaderHandles hnds, - boolean forUnmarshal) { + static BinaryReaderEx reader( + BinaryContext ctx, + BinaryInputStream in, + ClassLoader ldr, + @Nullable BinaryReaderHandles hnds, + boolean forUnmarshal + ) { return binariesFactory.reader(ctx, in, ldr, hnds, forUnmarshal); } @@ -1365,26 +1367,7 @@ public static BinaryReaderEx reader(BinaryContext ctx, ClassLoader ldr, boolean skipHdrCheck, boolean forUnmarshal) { - return reader(ctx, in, ldr, null, skipHdrCheck, forUnmarshal); - } - - /** - * Constructor. - * - * @param ctx Context. - * @param in Input stream. - * @param ldr Class loader. - * @param hnds Context. - * @param skipHdrCheck Whether to skip header check. - * @param forUnmarshal {@code True} if reader is need to unmarshal object. - */ - static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - @Nullable BinaryReaderHandles hnds, - boolean skipHdrCheck, - boolean forUnmarshal) { - return binariesFactory.reader(ctx, in, ldr, hnds, skipHdrCheck, forUnmarshal); + return binariesFactory.reader(ctx, in, ldr, null, skipHdrCheck, forUnmarshal); } /** diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index bfbcdfe21e20a..6f1ab361311dd 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -817,7 +817,7 @@ public static Object doReadOptimized(BinaryInputStream in, BinaryContext ctx, @N */ @Nullable static Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles) throws BinaryObjectException { - return BinaryUtils.reader(ctx, in, ldr, handles.handles(), false, true).deserialize(); + return new BinaryReaderExImpl(ctx, in, ldr, handles.handles(), false, true).deserialize(); } /** diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 7d444ca4a4397..ea784a8358910 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -1980,7 +1980,7 @@ private String fieldFlagName(byte flag) { if (!findFieldById(fieldId)) return null; - return BinaryUtils.reader(ctx, in, ldr, hnds, false, true).deserialize(); + return new BinaryReaderExImpl(ctx, in, ldr, hnds, false, true).deserialize(); } /** From a3e44c071a2595890fe2ee3ac4a063a5ce684328 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 2 Oct 2026 15:36:12 +0300 Subject: [PATCH 29/33] IGNITE-29094 Remove useless byte array creation --- .../internal/binary/BinariesFactoryImpl.java | 2 +- .../internal/binary/BinaryImplUtils.java | 891 -------------- .../internal/binary/BinaryObjectImpl.java | 2 +- .../binary/BinaryObjectOffheapImpl.java | 2 +- .../internal/binary/BinaryReaderExImpl.java | 1043 +++++++++++++++-- 5 files changed, 964 insertions(+), 976 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index 6dd2d1c0ebd87..ee0aab71442a2 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -67,7 +67,7 @@ public class BinariesFactoryImpl implements BinariesFactory { /** {@inheritDoc} */ @Override public @Nullable Object unmarshal(BinaryInputStream in, BinaryContext ctx, @Nullable ClassLoader ldr) throws BinaryObjectException { - return BinaryImplUtils.unmarshal(in, ctx, ldr); + return BinaryReaderExImpl.unmarshal(in, ctx, ldr); } /** {@inheritDoc} */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index 6f1ab361311dd..fcbfa21aa4b2e 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -17,33 +17,13 @@ package org.apache.ignite.internal.binary; import java.io.ByteArrayInputStream; -import java.lang.reflect.Array; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Proxy; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.LinkedList; -import java.util.Map; -import java.util.UUID; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.binary.BinaryCollectionFactory; -import org.apache.ignite.binary.BinaryInvalidTypeException; -import org.apache.ignite.binary.BinaryMapFactory; -import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.streams.BinaryInputStream; -import org.apache.ignite.internal.marshaller.ClassLoaderUtils; import org.apache.ignite.internal.util.CommonUtils; -import org.apache.ignite.internal.util.MutableSingletonList; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; -import org.apache.ignite.marshaller.Marshallers; import org.jetbrains.annotations.Nullable; /** @@ -364,350 +344,6 @@ public static int length(BinaryPositionReadable in, int start) { return in.readIntPositioned(start + GridBinaryMarshaller.TOTAL_LEN_POS); } - /** - * @return Value. - */ - static boolean[] doReadBooleanArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readBooleanArray(len); - } - - /** - * @return Value. - */ - static short[] doReadShortArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readShortArray(len); - } - - /** - * @return Value. - */ - static char[] doReadCharArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readCharArray(len); - } - - /** - * @return Value. - */ - static int[] doReadIntArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readIntArray(len); - } - - /** - * @return Value. - */ - static long[] doReadLongArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readLongArray(len); - } - - /** - * @return Value. - */ - static float[] doReadFloatArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readFloatArray(len); - } - - /** - * @return Value. - */ - static double[] doReadDoubleArray(BinaryInputStream in) { - int len = in.readInt(); - - return in.readDoubleArray(len); - } - - /** - * @return Value. - */ - static BigDecimal doReadDecimal(BinaryInputStream in) { - int scale = in.readInt(); - byte[] mag = BinaryUtils.doReadByteArray(in); - - boolean negative = mag[0] < 0; - - if (negative) - mag[0] &= 0x7F; - - BigInteger intVal = new BigInteger(mag); - - if (negative) - intVal = intVal.negate(); - - return new BigDecimal(intVal, scale); - } - - /** - * @return Value. - */ - static UUID doReadUuid(BinaryInputStream in) { - return new UUID(in.readLong(), in.readLong()); - } - - /** - * @return Value. - */ - static Date doReadDate(BinaryInputStream in) { - long time = in.readLong(); - - return new Date(time); - } - - /** - * @return Value. - */ - static Timestamp doReadTimestamp(BinaryInputStream in) { - long time = in.readLong(); - int nanos = in.readInt(); - - Timestamp ts = new Timestamp(time); - - ts.setNanos(ts.getNanos() + nanos); - - return ts; - } - - /** - * @return Value. - */ - static Time doReadTime(BinaryInputStream in) { - long time = in.readLong(); - - return new Time(time); - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - BigDecimal[] arr = new BigDecimal[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.DECIMAL) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadDecimal(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - UUID[] arr = new UUID[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.UUID) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadUuid(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - Date[] arr = new Date[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.DATE) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadDate(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - Timestamp[] arr = new Timestamp[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.TIMESTAMP) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadTimestamp(in); - } - } - - return arr; - } - - /** - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { - int len = in.readInt(); - - Time[] arr = new Time[len]; - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else { - if (flag != GridBinaryMarshaller.TIME) - throw new BinaryObjectException("Invalid flag value: " + flag); - - arr[i] = doReadTime(in); - } - } - - return arr; - } - - /** - * @return Value. - */ - static BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { - if (in.offheapPointer() > 0) { - int len = in.readInt(); - - int pos = in.position(); - - in.position(in.position() + len); - - int start = in.readInt(); - - return BinaryUtils.binariesFactory.binaryOffheapObject(ctx, in.offheapPointer() + pos, start, len); - } - else { - byte[] arr = BinaryUtils.doReadByteArray(in); - int start = in.readInt(); - - BinaryObject binO = BinaryUtils.binariesFactory.binaryObject(ctx, arr, start); - - if (detach) - return BinaryUtils.detach(binO); - - return binO; - } - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @return Class object specified at the input stream. - * @throws BinaryObjectException If failed. - */ - static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) - throws BinaryObjectException { - return doReadClass(in, ctx, ldr, true); - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param deserialize Doesn't load the class when the flag is {@code false}. Class information is skipped. - * @return Class object specified at the input stream if {@code deserialize == true}. Otherwise returns {@code null} - * @throws BinaryObjectException If failed. - */ - private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) - throws BinaryObjectException { - int typeId = in.readInt(); - - if (!deserialize) { - // Skip class name at the stream. - if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - doReadClassName(in); - - return null; - } - - return doReadClass(in, ctx, ldr, typeId); - } - - /** - * @return Value. - */ - @SuppressWarnings("ConstantConditions") - static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) { - Class[] intfs = new Class[in.readInt()]; - - for (int i = 0; i < intfs.length; i++) - intfs[i] = doReadClass(in, ctx, ldr); - - InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr, handles); - - return Proxy.newProxyInstance(ldr != null ? ldr : CommonUtils.gridClassLoader(), intfs, ih); - } - - /** - * Read plain type. - * - * @param in Input stream. - * @return Plain type. - */ - static EnumType doReadEnumType(BinaryInputStream in) { - int typeId = in.readInt(); - - if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - return new EnumType(typeId, null); - else { - String clsName = doReadClassName(in); - - return new EnumType(GridBinaryMarshaller.UNREGISTERED_TYPE_ID, clsName); - } - } - /** * @param in Input stream. * @return Class name. @@ -721,75 +357,6 @@ static String doReadClassName(BinaryInputStream in) { return BinaryUtils.doReadString(in); } - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param typeId Type id. - * @return Class object specified at the input stream. - * @throws BinaryObjectException If failed. - */ - static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) - throws BinaryObjectException { - Class cls; - - if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - cls = ctx.descriptorForTypeId(true, typeId, ldr, false).describedClass(); - else { - String clsName = doReadClassName(in); - - try { - cls = ClassLoaderUtils.forName(clsName, ldr); - } - catch (ClassNotFoundException e) { - throw new BinaryInvalidTypeException("Failed to load the class: " + clsName, e); - } - - // forces registering of class by type id, at least locally - if (Marshallers.USE_CACHE.get()) - ctx.registerType(cls, false, false); - } - - return cls; - } - - /** - * Read binary enum. - * - * @param in Input stream. - * @param ctx Binary context. - * @param type Plain type. - * @return Enum. - */ - static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, - EnumType type) { - return BinaryUtils.binariesFactory.binaryEnum(ctx, type.typeId, type.clsName, in.readInt()); - } - - /** - * Read binary enum array. - * - * @param in Input stream. - * @param ctx Binary context. - * @return Enum array. - */ - private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { - int len = in.readInt(); - - Object[] arr = (Object[])Array.newInstance(BinaryUtils.binariesFactory.binaryEnumClass(), len); - - for (int i = 0; i < len; i++) { - byte flag = in.readByte(); - - if (flag == GridBinaryMarshaller.NULL) - arr[i] = null; - else - arr[i] = doReadBinaryEnum(in, ctx, doReadEnumType(in)); - } - - return arr; - } - /** * Read object serialized using optimized marshaller. * @@ -811,462 +378,4 @@ public static Object doReadOptimized(BinaryInputStream in, BinaryContext ctx, @N } } - /** - * @return Object. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) throws BinaryObjectException { - return new BinaryReaderExImpl(ctx, in, ldr, handles.handles(), false, true).deserialize(); - } - - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) - throws BinaryObjectException { - return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl()); - } - - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) throws BinaryObjectException { - return unmarshal(in, ctx, ldr, handles, false, false); - } - - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { - int start = in.position(); - - byte flag = in.readByte(); - - switch (flag) { - case GridBinaryMarshaller.NULL: - return null; - - case GridBinaryMarshaller.HANDLE: { - int handlePos = start - in.readInt(); - - Object obj = handles.getHandle(handlePos); - - if (obj == null) { - int retPos = in.position(); - - in.position(handlePos); - - obj = unmarshal(in, ctx, ldr, handles, detach, deserialize); - - in.position(retPos); - } - - return obj; - } - - case GridBinaryMarshaller.OBJ: { - checkProtocolVersion(in.readByte()); - - int len = length(in, start); - - BinaryObjectEx po; - - if (detach) { - BinaryObjectEx binObj = BinaryUtils.binariesFactory.binaryObject(ctx, in.array(), start); - - binObj.detachAllowed(true); - - po = binObj.detach(!handles.isEmpty()); - } - else { - if (in.offheapPointer() == 0) - po = BinaryUtils.binariesFactory.binaryObject(ctx, in.array(), start); - else - po = BinaryUtils.binariesFactory.binaryOffheapObject(ctx, in.offheapPointer(), start, - in.remaining() + in.position()); - } - - in.position(start + len); - - handles.setHandle(po, start); - - return po; - } - - case GridBinaryMarshaller.BYTE: - return in.readByte(); - - case GridBinaryMarshaller.SHORT: - return in.readShort(); - - case GridBinaryMarshaller.INT: - return in.readInt(); - - case GridBinaryMarshaller.LONG: - return in.readLong(); - - case GridBinaryMarshaller.FLOAT: - return in.readFloat(); - - case GridBinaryMarshaller.DOUBLE: - return in.readDouble(); - - case GridBinaryMarshaller.CHAR: - return in.readChar(); - - case GridBinaryMarshaller.BOOLEAN: - return in.readBoolean(); - - case GridBinaryMarshaller.DECIMAL: - return doReadDecimal(in); - - case GridBinaryMarshaller.STRING: - return BinaryUtils.doReadString(in); - - case GridBinaryMarshaller.UUID: - return doReadUuid(in); - - case GridBinaryMarshaller.DATE: - return doReadDate(in); - - case GridBinaryMarshaller.TIMESTAMP: - return doReadTimestamp(in); - - case GridBinaryMarshaller.TIME: - return doReadTime(in); - - case GridBinaryMarshaller.BYTE_ARR: - return BinaryUtils.doReadByteArray(in); - - case GridBinaryMarshaller.SHORT_ARR: - return doReadShortArray(in); - - case GridBinaryMarshaller.INT_ARR: - return doReadIntArray(in); - - case GridBinaryMarshaller.LONG_ARR: - return doReadLongArray(in); - - case GridBinaryMarshaller.FLOAT_ARR: - return doReadFloatArray(in); - - case GridBinaryMarshaller.DOUBLE_ARR: - return doReadDoubleArray(in); - - case GridBinaryMarshaller.CHAR_ARR: - return doReadCharArray(in); - - case GridBinaryMarshaller.BOOLEAN_ARR: - return doReadBooleanArray(in); - - case GridBinaryMarshaller.DECIMAL_ARR: - return doReadDecimalArray(in); - - case GridBinaryMarshaller.STRING_ARR: - return BinaryUtils.doReadStringArray(in); - - case GridBinaryMarshaller.UUID_ARR: - return doReadUuidArray(in); - - case GridBinaryMarshaller.DATE_ARR: - return doReadDateArray(in); - - case GridBinaryMarshaller.TIMESTAMP_ARR: - return doReadTimestampArray(in); - - case GridBinaryMarshaller.TIME_ARR: - return doReadTimeArray(in); - - case GridBinaryMarshaller.OBJ_ARR: - if (BinaryUtils.useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, false); - else - return doReadObjectArray(in, ctx, ldr, handles, detach, deserialize); - - case GridBinaryMarshaller.COL: - return doReadCollection(in, ctx, ldr, handles, detach, deserialize, null); - - case GridBinaryMarshaller.MAP: - return doReadMap(in, ctx, ldr, handles, detach, deserialize, null); - - case GridBinaryMarshaller.BINARY_OBJ: - return doReadBinaryObject(in, ctx, detach); - - case GridBinaryMarshaller.ENUM: - case GridBinaryMarshaller.BINARY_ENUM: - return doReadBinaryEnum(in, ctx, doReadEnumType(in)); - - case GridBinaryMarshaller.ENUM_ARR: - if (BinaryUtils.useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, true); - else { - doReadEnumType(in); // Simply skip this part as we do not need it. - - return doReadBinaryEnumArray(in, ctx); - } - - case GridBinaryMarshaller.CLASS: - return doReadClass(in, ctx, ldr); - - case GridBinaryMarshaller.PROXY: - return doReadProxy(in, ctx, ldr, handles); - - case GridBinaryMarshaller.OPTM_MARSH: - return doReadOptimized(in, ctx, ldr); - - default: - throw new BinaryObjectException("Invalid flag value: " + flag); - } - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param handles Holder for handles. - * @param detach Detach flag. - * @param deserialize Deep flag. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - static Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { - int hPos = positionForHandle(in); - - Class compType = doReadClass(in, ctx, ldr, deserialize); - - int len = in.readInt(); - - Object[] arr = (deserialize && !BinaryObject.class.isAssignableFrom(compType)) - ? (Object[])Array.newInstance(compType, len) - : new Object[len]; - - handles.setHandle(arr, hPos); - - for (int i = 0; i < len; i++) { - Object res = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - - if (deserialize && BinaryUtils.useBinaryArrays() && res instanceof BinaryObject) - arr[i] = ((BinaryObject)res).deserialize(ldr); - else - arr[i] = res; - } - - return arr; - } - - /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. - * @param handles Holder for handles. - * @param detach Detach flag. - * @param deserialize Deep flag. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - private static BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, boolean isEnumArray) { - int hPos = positionForHandle(in); - - int compTypeId = in.readInt(); - String compClsName = null; - - if (compTypeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) - compClsName = doReadClassName(in); - - int len = in.readInt(); - - Object[] arr = new Object[len]; - - BinaryArray res = isEnumArray - ? new BinaryEnumArray(ctx, compTypeId, compClsName, arr) - : new BinaryArray(ctx, compTypeId, compClsName, arr); - - handles.setHandle(res, hPos); - - for (int i = 0; i < len; i++) - arr[i] = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - - return res; - } - - /** - * @param deserialize Deep flag. - * @param factory Collection factory. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - @SuppressWarnings("unchecked") - static Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryCollectionFactory factory) - throws BinaryObjectException { - int hPos = positionForHandle(in); - - int size = in.readInt(); - - assert size >= 0; - - byte colType = in.readByte(); - - Collection col; - - if (factory != null) - col = factory.create(size); - else { - switch (colType) { - case GridBinaryMarshaller.ARR_LIST: - col = new ArrayList<>(size); - - break; - - case GridBinaryMarshaller.LINKED_LIST: - col = new LinkedList<>(); - - break; - - case GridBinaryMarshaller.SINGLETON_LIST: - col = new MutableSingletonList<>(); - - break; - - case GridBinaryMarshaller.HASH_SET: - col = CommonUtils.newHashSet(size); - - break; - - case GridBinaryMarshaller.LINKED_HASH_SET: - col = CommonUtils.newLinkedHashSet(size); - - break; - - case GridBinaryMarshaller.USER_SET: - col = CommonUtils.newHashSet(size); - - break; - - case GridBinaryMarshaller.USER_COL: - col = new ArrayList<>(size); - - break; - - default: - throw new BinaryObjectException("Invalid collection type: " + colType); - } - } - - handles.setHandle(col, hPos); - - for (int i = 0; i < size; i++) - col.add(deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize)); - - return colType == GridBinaryMarshaller.SINGLETON_LIST ? CommonUtils.convertToSingletonList(col) : col; - } - - /** - * @param deserialize Deep flag. - * @param factory Map factory. - * @return Value. - * @throws BinaryObjectException In case of error. - */ - @SuppressWarnings("unchecked") - static Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryMapFactory factory) - throws BinaryObjectException { - int hPos = positionForHandle(in); - - int size = in.readInt(); - - assert size >= 0; - - byte mapType = in.readByte(); - - Map map; - - if (factory != null) - map = factory.create(size); - else { - switch (mapType) { - case GridBinaryMarshaller.HASH_MAP: - map = CommonUtils.newHashMap(size); - - break; - - case GridBinaryMarshaller.LINKED_HASH_MAP: - map = CommonUtils.newLinkedHashMap(size); - - break; - - case GridBinaryMarshaller.USER_COL: - map = CommonUtils.newHashMap(size); - - break; - - default: - throw new BinaryObjectException("Invalid map type: " + mapType); - } - } - - handles.setHandle(map, hPos); - - for (int i = 0; i < size; i++) { - Object key = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - Object val = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - - map.put(key, val); - } - - return map; - } - - /** - * Deserialize or unmarshal the object. - * - * @param deserialize Deserialize. - * @return Result. - */ - private static Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) { - return deserialize ? doReadObject(in, ctx, ldr, handles) : unmarshal(in, ctx, ldr, handles, detach, deserialize); - } - - /** - * Get position to be used for handle. We assume here that the hdr byte was read, hence subtract -1. - * - * @return Position for handle. - */ - static int positionForHandle(BinaryInputStream in) { - return in.position() - 1; - } - - /** - * Enum type. - */ - private static class EnumType { - /** Type ID. */ - private final int typeId; - - /** Class name. */ - private final String clsName; - - /** - * Constructor. - * - * @param typeId Type ID. - * @param clsName Class name. - */ - public EnumType(int typeId, @Nullable String clsName) { - assert typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName == null || - typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName != null; - - this.typeId = typeId; - this.clsName = clsName; - } - } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index 4193270e3fb1e..39c4278e6364d 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -561,7 +561,7 @@ else if (fieldOffLen == BinaryImplUtils.OFFSET_2) break; default: - val = BinaryImplUtils.unmarshal(BinaryStreams.inputStream(arr, fieldPos), ctx, null); + val = BinaryReaderExImpl.unmarshal(BinaryStreams.inputStream(arr, fieldPos), ctx, null); break; } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java index 284a57aec4cd6..3c3f2289b175f 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java @@ -375,7 +375,7 @@ else if (fieldOffLen == BinaryImplUtils.OFFSET_2) stream.position(fieldPos); - val = BinaryImplUtils.unmarshal(stream, ctx, null); + val = BinaryReaderExImpl.unmarshal(stream, ctx, null); break; } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index ea784a8358910..93cff8cbcf829 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -21,16 +21,21 @@ import java.io.IOException; import java.lang.reflect.Array; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Proxy; import java.math.BigDecimal; +import java.math.BigInteger; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; + import org.apache.ignite.binary.BinaryCollectionFactory; import org.apache.ignite.binary.BinaryInvalidTypeException; import org.apache.ignite.binary.BinaryMapFactory; @@ -39,8 +44,10 @@ import org.apache.ignite.binary.BinaryRawReader; import org.apache.ignite.binary.Binarylizable; import org.apache.ignite.internal.binary.streams.BinaryInputStream; +import org.apache.ignite.internal.marshaller.ClassLoaderUtils; import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridUnsafe; +import org.apache.ignite.internal.util.MutableSingletonList; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.SB; @@ -270,7 +277,7 @@ public BinaryReaderExImpl(BinaryContext ctx, if (forUnmarshal) { // Registers class by type ID, at least locally if the cache is not ready yet. - desc = ctx.registerClass(BinaryImplUtils.doReadClass(in, ctx, ldr, typeId0), true, false); + desc = ctx.registerClass(doReadClass(in, ctx, ldr, typeId0), true, false); typeId = desc.typeId(); } @@ -307,6 +314,15 @@ public BinaryReaderExImpl(BinaryContext ctx, streamPosition(start); } + /** + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) + throws BinaryObjectException { + return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl()); + } + /** {@inheritDoc} */ @Override public BinaryInputStream in() { return in; @@ -328,7 +344,7 @@ public BinaryClassDescriptor descriptor() { public Object unmarshal(int offset) throws BinaryObjectException { streamPosition(offset); - return in.position() >= 0 ? BinaryImplUtils.unmarshal(in, ctx, ldr, this) : null; + return in.position() >= 0 ? unmarshal(in, ctx, ldr, this) : null; } /** @@ -338,7 +354,7 @@ public Object unmarshal(int offset) throws BinaryObjectException { */ public Object unmarshalField(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? BinaryImplUtils.unmarshal(in, ctx, ldr, this) : null; + return findFieldByName(fieldName) ? unmarshal(in, ctx, ldr, this) : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -351,7 +367,7 @@ public Object unmarshalField(String fieldName) throws BinaryObjectException { * @throws BinaryObjectException In case of error. */ public Object unmarshalField(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? BinaryImplUtils.unmarshal(in, ctx, ldr, this) : null; + return findFieldById(fieldId) ? unmarshal(in, ctx, ldr, this) : null; } /** @@ -380,7 +396,7 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { if (checkFlag(CLASS) == Flag.NULL) return null; - return BinaryImplUtils.doReadClass(in, ctx, ldr); + return doReadClass(in, ctx, ldr); } return null; @@ -411,7 +427,7 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { * @return Field. */ private T readHandleField() { - int handlePos = BinaryImplUtils.positionForHandle(in) - in.readInt(); + int handlePos = positionForHandle(in) - in.readInt(); Object obj = getHandle(handlePos); @@ -420,7 +436,7 @@ private T readHandleField() { streamPosition(handlePos); - obj = BinaryImplUtils.doReadObject(in, ctx, ldr, this); + obj = doReadObject(in, ctx, ldr, this); streamPosition(retPos); } @@ -564,7 +580,7 @@ boolean readBoolean(int fieldId) throws BinaryObjectException { @Nullable @Override public boolean[] readBooleanArray() throws BinaryObjectException { switch (checkFlag(BOOLEAN_ARR)) { case NORMAL: - return BinaryImplUtils.doReadBooleanArray(in); + return doReadBooleanArray(in); case HANDLE: return readHandleField(); @@ -630,7 +646,7 @@ short readShort(int fieldId) throws BinaryObjectException { @Nullable @Override public short[] readShortArray() throws BinaryObjectException { switch (checkFlag(SHORT_ARR)) { case NORMAL: - return BinaryImplUtils.doReadShortArray(in); + return doReadShortArray(in); case HANDLE: return readHandleField(); @@ -696,7 +712,7 @@ char readChar(int fieldId) throws BinaryObjectException { @Nullable @Override public char[] readCharArray() throws BinaryObjectException { switch (checkFlag(CHAR_ARR)) { case NORMAL: - return BinaryImplUtils.doReadCharArray(in); + return doReadCharArray(in); case HANDLE: return readHandleField(); @@ -762,7 +778,7 @@ int readInt(int fieldId) throws BinaryObjectException { @Nullable @Override public int[] readIntArray() throws BinaryObjectException { switch (checkFlag(INT_ARR)) { case NORMAL: - return BinaryImplUtils.doReadIntArray(in); + return doReadIntArray(in); case HANDLE: return readHandleField(); @@ -828,7 +844,7 @@ long readLong(int fieldId) throws BinaryObjectException { @Nullable @Override public long[] readLongArray() throws BinaryObjectException { switch (checkFlag(LONG_ARR)) { case NORMAL: - return BinaryImplUtils.doReadLongArray(in); + return doReadLongArray(in); case HANDLE: return readHandleField(); @@ -894,7 +910,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public float[] readFloatArray() throws BinaryObjectException { switch (checkFlag(FLOAT_ARR)) { case NORMAL: - return BinaryImplUtils.doReadFloatArray(in); + return doReadFloatArray(in); case HANDLE: return readHandleField(); @@ -960,7 +976,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public double[] readDoubleArray() throws BinaryObjectException { switch (checkFlag(DOUBLE_ARR)) { case NORMAL: - return BinaryImplUtils.doReadDoubleArray(in); + return doReadDoubleArray(in); case HANDLE: return readHandleField(); @@ -991,7 +1007,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public BigDecimal readDecimal() throws BinaryObjectException { - return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? BinaryImplUtils.doReadDecimal(in) : null; + return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? doReadDecimal(in) : null; } /** {@inheritDoc} */ @@ -1017,7 +1033,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public BigDecimal[] readDecimalArray() throws BinaryObjectException { switch (checkFlag(DECIMAL_ARR)) { case NORMAL: - return BinaryImplUtils.doReadDecimalArray(in); + return doReadDecimalArray(in); case HANDLE: return readHandleField(); @@ -1105,7 +1121,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public UUID readUuid() throws BinaryObjectException { - return checkFlagNoHandles(UUID) == Flag.NORMAL ? BinaryImplUtils.doReadUuid(in) : null; + return checkFlagNoHandles(UUID) == Flag.NORMAL ? doReadUuid(in) : null; } /** {@inheritDoc} */ @@ -1131,7 +1147,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public UUID[] readUuidArray() throws BinaryObjectException { switch (checkFlag(UUID_ARR)) { case NORMAL: - return BinaryImplUtils.doReadUuidArray(in); + return doReadUuidArray(in); case HANDLE: return readHandleField(); @@ -1162,7 +1178,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public Date readDate() throws BinaryObjectException { - return checkFlagNoHandles(DATE) == Flag.NORMAL ? BinaryImplUtils.doReadDate(in) : null; + return checkFlagNoHandles(DATE) == Flag.NORMAL ? doReadDate(in) : null; } /** {@inheritDoc} */ @@ -1188,7 +1204,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public Date[] readDateArray() throws BinaryObjectException { switch (checkFlag(DATE_ARR)) { case NORMAL: - return BinaryImplUtils.doReadDateArray(in); + return doReadDateArray(in); case HANDLE: return readHandleField(); @@ -1219,7 +1235,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public Timestamp readTimestamp() throws BinaryObjectException { - return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? BinaryImplUtils.doReadTimestamp(in) : null; + return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? doReadTimestamp(in) : null; } /** {@inheritDoc} */ @@ -1245,7 +1261,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public Timestamp[] readTimestampArray() throws BinaryObjectException { switch (checkFlag(TIMESTAMP_ARR)) { case NORMAL: - return BinaryImplUtils.doReadTimestampArray(in); + return doReadTimestampArray(in); case HANDLE: return readHandleField(); @@ -1262,7 +1278,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public Time readTime() throws BinaryObjectException { - return checkFlagNoHandles(TIME) == Flag.NORMAL ? BinaryImplUtils.doReadTime(in) : null; + return checkFlagNoHandles(TIME) == Flag.NORMAL ? doReadTime(in) : null; } /** {@inheritDoc} */ @@ -1292,7 +1308,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Override @Nullable public Time[] readTimeArray() throws BinaryObjectException { switch (checkFlag(TIME_ARR)) { case NORMAL: - return BinaryImplUtils.doReadTimeArray(in); + return doReadTimeArray(in); case HANDLE: return readHandleField(); default: @@ -1303,7 +1319,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public T readObject(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? (T)BinaryImplUtils.doReadObject(in, ctx, ldr, this) : null; + return findFieldByName(fieldName) ? (T)doReadObject(in, ctx, ldr, this) : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -1316,12 +1332,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @throws BinaryObjectException In case of error. */ @Nullable Object readObject(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? BinaryImplUtils.doReadObject(in, ctx, ldr, this) : null; + return findFieldById(fieldId) ? doReadObject(in, ctx, ldr, this) : null; } /** {@inheritDoc} */ @Override public Object readObject() throws BinaryObjectException { - return BinaryImplUtils.doReadObject(in, ctx, ldr, this); + return doReadObject(in, ctx, ldr, this); } /** {@inheritDoc} */ @@ -1331,7 +1347,7 @@ float readFloat(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public Object readObjectDetached(boolean deserialize) throws BinaryObjectException { - return BinaryImplUtils.unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl(), true, deserialize); + return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl(), true, deserialize); } /** {@inheritDoc} */ @@ -1357,7 +1373,7 @@ float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public Object[] readObjectArray() throws BinaryObjectException { switch (checkFlag(OBJ_ARR)) { case NORMAL: - return BinaryImplUtils.doReadObjectArray(in, ctx, ldr, this, false, true); + return doReadObjectArray(in, ctx, ldr, this, false, true); case HANDLE: Object arr = readHandleField(); @@ -1407,7 +1423,7 @@ float readFloat(int fieldId) throws BinaryObjectException { private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { if (checkFlagNoHandles(ENUM) == Flag.NORMAL) { // Read class even if we know it in advance to set correct stream position. - Class cls0 = BinaryImplUtils.doReadClass(in, ctx, ldr); + Class cls0 = doReadClass(in, ctx, ldr); if (cls == null) cls = cls0; @@ -1465,7 +1481,7 @@ private Object[] readEnumArray0(@Nullable Class cls) throws BinaryObjectExcep switch (checkFlag(ENUM_ARR)) { case NORMAL: // Read class even if we know it in advance to set correct stream position. - Class cls0 = BinaryImplUtils.doReadClass(in, ctx, ldr); + Class cls0 = doReadClass(in, ctx, ldr); if (cls == null) cls = cls0; @@ -1540,10 +1556,10 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) throws BinaryObjectException { switch (checkFlag(COL)) { case NORMAL: - return (Collection)BinaryImplUtils.doReadCollection(in, ctx, ldr, this, false, true, factory); + return (Collection)doReadCollection(in, ctx, ldr, this, false, true, factory); case HANDLE: { - int handlePos = BinaryImplUtils.positionForHandle(in) - in.readInt(); + int handlePos = positionForHandle(in) - in.readInt(); Object obj = getHandle(handlePos); @@ -1618,10 +1634,10 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) private Map readMap0(@Nullable BinaryMapFactory factory) throws BinaryObjectException { switch (checkFlag(MAP)) { case NORMAL: - return (Map)BinaryImplUtils.doReadMap(in, ctx, ldr, this, false, true, factory); + return (Map)doReadMap(in, ctx, ldr, this, false, true, factory); case HANDLE: { - int handlePos = BinaryImplUtils.positionForHandle(in) - in.readInt(); + int handlePos = positionForHandle(in) - in.readInt(); Object obj = getHandle(handlePos); @@ -1660,7 +1676,7 @@ else if (flag == NULL) else if (flag == HANDLE) return Flag.HANDLE; - int pos = BinaryImplUtils.positionForHandle(in); + int pos = positionForHandle(in); throw new BinaryObjectException("Unexpected field type [pos=" + pos + ", expected=" + fieldFlagName(expFlag) + ", actual=" + fieldFlagName(flag) + ']'); @@ -1681,7 +1697,7 @@ private Flag checkFlagNoHandles(byte expFlag) { else if (flag == NULL) return Flag.NULL; - int pos = BinaryImplUtils.positionForHandle(in); + int pos = positionForHandle(in); throw new BinaryObjectException("Unexpected field type [pos=" + pos + ", expected=" + fieldFlagName(expFlag) + ", actual=" + fieldFlagName(flag) + ']'); @@ -1750,7 +1766,7 @@ private String fieldFlagName(byte flag) { streamPosition(handlePos); - obj = BinaryImplUtils.doReadObject(in, ctx, ldr, this); + obj = doReadObject(in, ctx, ldr, this); streamPosition(retPos); } @@ -1813,7 +1829,7 @@ private String fieldFlagName(byte flag) { break; case DECIMAL: - obj = BinaryImplUtils.doReadDecimal(in); + obj = doReadDecimal(in); break; @@ -1823,22 +1839,22 @@ private String fieldFlagName(byte flag) { break; case UUID: - obj = BinaryImplUtils.doReadUuid(in); + obj = doReadUuid(in); break; case DATE: - obj = BinaryImplUtils.doReadDate(in); + obj = doReadDate(in); break; case TIMESTAMP: - obj = BinaryImplUtils.doReadTimestamp(in); + obj = doReadTimestamp(in); break; case TIME: - obj = BinaryImplUtils.doReadTime(in); + obj = doReadTime(in); break; @@ -1848,42 +1864,42 @@ private String fieldFlagName(byte flag) { break; case SHORT_ARR: - obj = BinaryImplUtils.doReadShortArray(in); + obj = doReadShortArray(in); break; case INT_ARR: - obj = BinaryImplUtils.doReadIntArray(in); + obj = doReadIntArray(in); break; case LONG_ARR: - obj = BinaryImplUtils.doReadLongArray(in); + obj = doReadLongArray(in); break; case FLOAT_ARR: - obj = BinaryImplUtils.doReadFloatArray(in); + obj = doReadFloatArray(in); break; case DOUBLE_ARR: - obj = BinaryImplUtils.doReadDoubleArray(in); + obj = doReadDoubleArray(in); break; case CHAR_ARR: - obj = BinaryImplUtils.doReadCharArray(in); + obj = doReadCharArray(in); break; case BOOLEAN_ARR: - obj = BinaryImplUtils.doReadBooleanArray(in); + obj = doReadBooleanArray(in); break; case DECIMAL_ARR: - obj = BinaryImplUtils.doReadDecimalArray(in); + obj = doReadDecimalArray(in); break; @@ -1893,54 +1909,54 @@ private String fieldFlagName(byte flag) { break; case UUID_ARR: - obj = BinaryImplUtils.doReadUuidArray(in); + obj = doReadUuidArray(in); break; case DATE_ARR: - obj = BinaryImplUtils.doReadDateArray(in); + obj = doReadDateArray(in); break; case TIMESTAMP_ARR: - obj = BinaryImplUtils.doReadTimestampArray(in); + obj = doReadTimestampArray(in); break; case TIME_ARR: - obj = BinaryImplUtils.doReadTimeArray(in); + obj = doReadTimeArray(in); break; case OBJ_ARR: - obj = BinaryImplUtils.doReadObjectArray(in, ctx, ldr, this, false, true); + obj = doReadObjectArray(in, ctx, ldr, this, false, true); break; case COL: - obj = BinaryImplUtils.doReadCollection(in, ctx, ldr, this, false, true, null); + obj = doReadCollection(in, ctx, ldr, this, false, true, null); break; case MAP: - obj = BinaryImplUtils.doReadMap(in, ctx, ldr, this, false, true, null); + obj = doReadMap(in, ctx, ldr, this, false, true, null); break; case BINARY_OBJ: - obj = BinaryImplUtils.doReadBinaryObject(in, ctx, false); + obj = doReadBinaryObject(in, ctx, false); ((BinaryObjectImpl)obj).context(ctx); break; case ENUM: - obj = doReadEnum(in, BinaryImplUtils.doReadClass(in, ctx, ldr)); + obj = doReadEnum(in, doReadClass(in, ctx, ldr)); break; case ENUM_ARR: - obj = doReadEnumArray(in, ctx, ldr, BinaryImplUtils.doReadClass(in, ctx, ldr)); + obj = doReadEnumArray(in, ctx, ldr, doReadClass(in, ctx, ldr)); break; @@ -1950,12 +1966,12 @@ private String fieldFlagName(byte flag) { break; case CLASS: - obj = BinaryImplUtils.doReadClass(in, ctx, ldr); + obj = doReadClass(in, ctx, ldr); break; case PROXY: - obj = BinaryImplUtils.doReadProxy(in, ctx, ldr, this); + obj = doReadProxy(in, ctx, ldr, this); break; @@ -2082,61 +2098,61 @@ public BinarySchema getOrCreateSchema() { return BinaryUtils.doReadString(in()); case GridBinaryMarshaller.DECIMAL: - return BinaryImplUtils.doReadDecimal(in()); + return doReadDecimal(in()); case GridBinaryMarshaller.UUID: - return BinaryImplUtils.doReadUuid(in()); + return doReadUuid(in()); case GridBinaryMarshaller.TIME: - return BinaryImplUtils.doReadTime(in()); + return doReadTime(in()); case GridBinaryMarshaller.TIMESTAMP: - return BinaryImplUtils.doReadTimestamp(in()); + return doReadTimestamp(in()); case GridBinaryMarshaller.DATE: - return BinaryImplUtils.doReadDate(in()); + return doReadDate(in()); case GridBinaryMarshaller.BOOLEAN_ARR: - return BinaryImplUtils.doReadBooleanArray(in()); + return doReadBooleanArray(in()); case GridBinaryMarshaller.BYTE_ARR: return BinaryUtils.doReadByteArray(in()); case GridBinaryMarshaller.CHAR_ARR: - return BinaryImplUtils.doReadCharArray(in()); + return doReadCharArray(in()); case GridBinaryMarshaller.SHORT_ARR: - return BinaryImplUtils.doReadShortArray(in()); + return doReadShortArray(in()); case GridBinaryMarshaller.INT_ARR: - return BinaryImplUtils.doReadIntArray(in()); + return doReadIntArray(in()); case GridBinaryMarshaller.LONG_ARR: - return BinaryImplUtils.doReadLongArray(in()); + return doReadLongArray(in()); case GridBinaryMarshaller.FLOAT_ARR: - return BinaryImplUtils.doReadFloatArray(in()); + return doReadFloatArray(in()); case GridBinaryMarshaller.DOUBLE_ARR: - return BinaryImplUtils.doReadDoubleArray(in()); + return doReadDoubleArray(in()); case GridBinaryMarshaller.STRING_ARR: return BinaryUtils.doReadStringArray(in()); case GridBinaryMarshaller.DECIMAL_ARR: - return BinaryImplUtils.doReadDecimalArray(in()); + return doReadDecimalArray(in()); case GridBinaryMarshaller.UUID_ARR: - return BinaryImplUtils.doReadUuidArray(in()); + return doReadUuidArray(in()); case GridBinaryMarshaller.TIME_ARR: - return BinaryImplUtils.doReadTimeArray(in()); + return doReadTimeArray(in()); case GridBinaryMarshaller.TIMESTAMP_ARR: - return BinaryImplUtils.doReadTimestampArray(in()); + return doReadTimestampArray(in()); case GridBinaryMarshaller.DATE_ARR: - return BinaryImplUtils.doReadDateArray(in()); + return doReadDateArray(in()); default: in().position(in().position() - 1); @@ -2869,7 +2885,7 @@ protected Object readFixedType(BinaryFieldDescriptor fld) throws BinaryObjectExc * @return Enum. */ private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx) { - return BinaryImplUtils.doReadBinaryEnum(in, ctx, BinaryImplUtils.doReadEnumType(in)); + return doReadBinaryEnum(in, ctx, doReadEnumType(in)); } /** @@ -2888,7 +2904,7 @@ private static Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, if (flag == GridBinaryMarshaller.NULL) arr[i] = null; else - arr[i] = doReadEnum(in, BinaryImplUtils.doReadClass(in, ctx, ldr)); + arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr)); } return arr; @@ -2963,4 +2979,867 @@ private enum Flag { /** Null. */ NULL } + + /** + * @return Value. + */ + private static boolean[] doReadBooleanArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readBooleanArray(len); + } + + /** + * @return Value. + */ + private static short[] doReadShortArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readShortArray(len); + } + + /** + * @return Value. + */ + private static char[] doReadCharArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readCharArray(len); + } + + /** + * @return Value. + */ + private static int[] doReadIntArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readIntArray(len); + } + + /** + * @return Value. + */ + private static long[] doReadLongArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readLongArray(len); + } + + /** + * @return Value. + */ + private static float[] doReadFloatArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readFloatArray(len); + } + + /** + * @return Value. + */ + private static double[] doReadDoubleArray(BinaryInputStream in) { + int len = in.readInt(); + + return in.readDoubleArray(len); + } + + /** + * @return Value. + */ + private static BigDecimal doReadDecimal(BinaryInputStream in) { + int scale = in.readInt(); + byte[] mag = BinaryUtils.doReadByteArray(in); + + boolean negative = mag[0] < 0; + + if (negative) + mag[0] &= 0x7F; + + BigInteger intVal = new BigInteger(mag); + + if (negative) + intVal = intVal.negate(); + + return new BigDecimal(intVal, scale); + } + + /** + * @return Value. + */ + private static UUID doReadUuid(BinaryInputStream in) { + return new UUID(in.readLong(), in.readLong()); + } + + /** + * @return Value. + */ + private static Date doReadDate(BinaryInputStream in) { + long time = in.readLong(); + + return new Date(time); + } + + /** + * @return Value. + */ + private static Timestamp doReadTimestamp(BinaryInputStream in) { + long time = in.readLong(); + int nanos = in.readInt(); + + Timestamp ts = new Timestamp(time); + + ts.setNanos(ts.getNanos() + nanos); + + return ts; + } + + /** + * @return Value. + */ + private static Time doReadTime(BinaryInputStream in) { + long time = in.readLong(); + + return new Time(time); + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + BigDecimal[] arr = new BigDecimal[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.DECIMAL) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadDecimal(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + UUID[] arr = new UUID[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.UUID) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadUuid(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + Date[] arr = new Date[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.DATE) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadDate(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + Timestamp[] arr = new Timestamp[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.TIMESTAMP) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadTimestamp(in); + } + } + + return arr; + } + + /** + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { + int len = in.readInt(); + + Time[] arr = new Time[len]; + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else { + if (flag != GridBinaryMarshaller.TIME) + throw new BinaryObjectException("Invalid flag value: " + flag); + + arr[i] = doReadTime(in); + } + } + + return arr; + } + + /** + * @return Value. + */ + private static BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { + if (in.offheapPointer() > 0) { + int len = in.readInt(); + + int pos = in.position(); + + in.position(in.position() + len); + + int start = in.readInt(); + + return BinaryUtils.binariesFactory.binaryOffheapObject(ctx, in.offheapPointer() + pos, start, len); + } + else { + byte[] arr = BinaryUtils.doReadByteArray(in); + int start = in.readInt(); + + BinaryObject binO = BinaryUtils.binariesFactory.binaryObject(ctx, arr, start); + + if (detach) + return BinaryUtils.detach(binO); + + return binO; + } + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @return Class object specified at the input stream. + * @throws BinaryObjectException If failed. + */ + private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) + throws BinaryObjectException { + return doReadClass(in, ctx, ldr, true); + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param deserialize Doesn't load the class when the flag is {@code false}. Class information is skipped. + * @return Class object specified at the input stream if {@code deserialize == true}. Otherwise returns {@code null} + * @throws BinaryObjectException If failed. + */ + private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) + throws BinaryObjectException { + int typeId = in.readInt(); + + if (!deserialize) { + // Skip class name at the stream. + if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + BinaryImplUtils.doReadClassName(in); + + return null; + } + + return doReadClass(in, ctx, ldr, typeId); + } + + /** + * @return Value. + */ + @SuppressWarnings("ConstantConditions") + private static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) { + Class[] intfs = new Class[in.readInt()]; + + for (int i = 0; i < intfs.length; i++) + intfs[i] = doReadClass(in, ctx, ldr); + + InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr, handles); + + return Proxy.newProxyInstance(ldr != null ? ldr : CommonUtils.gridClassLoader(), intfs, ih); + } + + /** + * Read plain type. + * + * @param in Input stream. + * @return Plain type. + */ + private static EnumType doReadEnumType(BinaryInputStream in) { + int typeId = in.readInt(); + + if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + return new EnumType(typeId, null); + else { + String clsName = BinaryImplUtils.doReadClassName(in); + + return new EnumType(GridBinaryMarshaller.UNREGISTERED_TYPE_ID, clsName); + } + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param typeId Type id. + * @return Class object specified at the input stream. + * @throws BinaryObjectException If failed. + */ + private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) + throws BinaryObjectException { + Class cls; + + if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + cls = ctx.descriptorForTypeId(true, typeId, ldr, false).describedClass(); + else { + String clsName = BinaryImplUtils.doReadClassName(in); + + try { + cls = ClassLoaderUtils.forName(clsName, ldr); + } + catch (ClassNotFoundException e) { + throw new BinaryInvalidTypeException("Failed to load the class: " + clsName, e); + } + + // forces registering of class by type id, at least locally + if (Marshallers.USE_CACHE.get()) + ctx.registerType(cls, false, false); + } + + return cls; + } + + /** + * Read binary enum. + * + * @param in Input stream. + * @param ctx Binary context. + * @param type Plain type. + * @return Enum. + */ + private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, + EnumType type) { + return BinaryUtils.binariesFactory.binaryEnum(ctx, type.typeId, type.clsName, in.readInt()); + } + + /** + * Read binary enum array. + * + * @param in Input stream. + * @param ctx Binary context. + * @return Enum array. + */ + private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { + int len = in.readInt(); + + Object[] arr = (Object[])Array.newInstance(BinaryUtils.binariesFactory.binaryEnumClass(), len); + + for (int i = 0; i < len; i++) { + byte flag = in.readByte(); + + if (flag == GridBinaryMarshaller.NULL) + arr[i] = null; + else + arr[i] = doReadBinaryEnum(in, ctx, doReadEnumType(in)); + } + + return arr; + } + + /** + * @return Object. + * @throws BinaryObjectException In case of error. + */ + @Nullable private static Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) throws BinaryObjectException { + return new BinaryReaderExImpl(ctx, in, ldr, handles.handles(), false, true).deserialize(); + } + + /** + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + @Nullable private static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) throws BinaryObjectException { + return unmarshal(in, ctx, ldr, handles, false, false); + } + + /** + * @return Unmarshalled value. + * @throws BinaryObjectException In case of error. + */ + @Nullable private static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { + int start = in.position(); + + byte flag = in.readByte(); + + switch (flag) { + case GridBinaryMarshaller.NULL: + return null; + + case GridBinaryMarshaller.HANDLE: { + int handlePos = start - in.readInt(); + + Object obj = handles.getHandle(handlePos); + + if (obj == null) { + int retPos = in.position(); + + in.position(handlePos); + + obj = unmarshal(in, ctx, ldr, handles, detach, deserialize); + + in.position(retPos); + } + + return obj; + } + + case GridBinaryMarshaller.OBJ: { + BinaryImplUtils.checkProtocolVersion(in.readByte()); + + int len = BinaryImplUtils.length(in, start); + + BinaryObjectEx po; + + if (detach) { + BinaryObjectEx binObj = BinaryUtils.binariesFactory.binaryObject(ctx, in.array(), start); + + binObj.detachAllowed(true); + + po = binObj.detach(!handles.isEmpty()); + } + else { + if (in.offheapPointer() == 0) + po = BinaryUtils.binariesFactory.binaryObject(ctx, in.array(), start); + else + po = BinaryUtils.binariesFactory.binaryOffheapObject(ctx, in.offheapPointer(), start, + in.remaining() + in.position()); + } + + in.position(start + len); + + handles.setHandle(po, start); + + return po; + } + + case GridBinaryMarshaller.BYTE: + return in.readByte(); + + case GridBinaryMarshaller.SHORT: + return in.readShort(); + + case GridBinaryMarshaller.INT: + return in.readInt(); + + case GridBinaryMarshaller.LONG: + return in.readLong(); + + case GridBinaryMarshaller.FLOAT: + return in.readFloat(); + + case GridBinaryMarshaller.DOUBLE: + return in.readDouble(); + + case GridBinaryMarshaller.CHAR: + return in.readChar(); + + case GridBinaryMarshaller.BOOLEAN: + return in.readBoolean(); + + case GridBinaryMarshaller.DECIMAL: + return doReadDecimal(in); + + case GridBinaryMarshaller.STRING: + return BinaryUtils.doReadString(in); + + case GridBinaryMarshaller.UUID: + return doReadUuid(in); + + case GridBinaryMarshaller.DATE: + return doReadDate(in); + + case GridBinaryMarshaller.TIMESTAMP: + return doReadTimestamp(in); + + case GridBinaryMarshaller.TIME: + return doReadTime(in); + + case GridBinaryMarshaller.BYTE_ARR: + return BinaryUtils.doReadByteArray(in); + + case GridBinaryMarshaller.SHORT_ARR: + return doReadShortArray(in); + + case GridBinaryMarshaller.INT_ARR: + return doReadIntArray(in); + + case GridBinaryMarshaller.LONG_ARR: + return doReadLongArray(in); + + case GridBinaryMarshaller.FLOAT_ARR: + return doReadFloatArray(in); + + case GridBinaryMarshaller.DOUBLE_ARR: + return doReadDoubleArray(in); + + case GridBinaryMarshaller.CHAR_ARR: + return doReadCharArray(in); + + case GridBinaryMarshaller.BOOLEAN_ARR: + return doReadBooleanArray(in); + + case GridBinaryMarshaller.DECIMAL_ARR: + return doReadDecimalArray(in); + + case GridBinaryMarshaller.STRING_ARR: + return BinaryUtils.doReadStringArray(in); + + case GridBinaryMarshaller.UUID_ARR: + return doReadUuidArray(in); + + case GridBinaryMarshaller.DATE_ARR: + return doReadDateArray(in); + + case GridBinaryMarshaller.TIMESTAMP_ARR: + return doReadTimestampArray(in); + + case GridBinaryMarshaller.TIME_ARR: + return doReadTimeArray(in); + + case GridBinaryMarshaller.OBJ_ARR: + if (BinaryUtils.useBinaryArrays() && !deserialize) + return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, false); + else + return doReadObjectArray(in, ctx, ldr, handles, detach, deserialize); + + case GridBinaryMarshaller.COL: + return doReadCollection(in, ctx, ldr, handles, detach, deserialize, null); + + case GridBinaryMarshaller.MAP: + return doReadMap(in, ctx, ldr, handles, detach, deserialize, null); + + case GridBinaryMarshaller.BINARY_OBJ: + return doReadBinaryObject(in, ctx, detach); + + case GridBinaryMarshaller.ENUM: + case GridBinaryMarshaller.BINARY_ENUM: + return doReadBinaryEnum(in, ctx, doReadEnumType(in)); + + case GridBinaryMarshaller.ENUM_ARR: + if (BinaryUtils.useBinaryArrays() && !deserialize) + return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, true); + else { + doReadEnumType(in); // Simply skip this part as we do not need it. + + return doReadBinaryEnumArray(in, ctx); + } + + case GridBinaryMarshaller.CLASS: + return doReadClass(in, ctx, ldr); + + case GridBinaryMarshaller.PROXY: + return doReadProxy(in, ctx, ldr, handles); + + case GridBinaryMarshaller.OPTM_MARSH: + return BinaryImplUtils.doReadOptimized(in, ctx, ldr); + + default: + throw new BinaryObjectException("Invalid flag value: " + flag); + } + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param handles Holder for handles. + * @param detach Detach flag. + * @param deserialize Deep flag. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { + int hPos = positionForHandle(in); + + Class compType = doReadClass(in, ctx, ldr, deserialize); + + int len = in.readInt(); + + Object[] arr = (deserialize && !BinaryObject.class.isAssignableFrom(compType)) + ? (Object[])Array.newInstance(compType, len) + : new Object[len]; + + handles.setHandle(arr, hPos); + + for (int i = 0; i < len; i++) { + Object res = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + + if (deserialize && BinaryUtils.useBinaryArrays() && res instanceof BinaryObject) + arr[i] = ((BinaryObject)res).deserialize(ldr); + else + arr[i] = res; + } + + return arr; + } + + /** + * @param in Binary input stream. + * @param ctx Binary context. + * @param ldr Class loader. + * @param handles Holder for handles. + * @param detach Detach flag. + * @param deserialize Deep flag. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + private static BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, boolean isEnumArray) { + int hPos = positionForHandle(in); + + int compTypeId = in.readInt(); + String compClsName = null; + + if (compTypeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) + compClsName = BinaryImplUtils.doReadClassName(in); + + int len = in.readInt(); + + Object[] arr = new Object[len]; + + BinaryArray res = isEnumArray + ? new BinaryEnumArray(ctx, compTypeId, compClsName, arr) + : new BinaryArray(ctx, compTypeId, compClsName, arr); + + handles.setHandle(res, hPos); + + for (int i = 0; i < len; i++) + arr[i] = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + + return res; + } + + /** + * @param deserialize Deep flag. + * @param factory Collection factory. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + @SuppressWarnings("unchecked") + private static Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryCollectionFactory factory) + throws BinaryObjectException { + int hPos = positionForHandle(in); + + int size = in.readInt(); + + assert size >= 0; + + byte colType = in.readByte(); + + Collection col; + + if (factory != null) + col = factory.create(size); + else { + switch (colType) { + case GridBinaryMarshaller.ARR_LIST: + col = new ArrayList<>(size); + + break; + + case GridBinaryMarshaller.LINKED_LIST: + col = new LinkedList<>(); + + break; + + case GridBinaryMarshaller.SINGLETON_LIST: + col = new MutableSingletonList<>(); + + break; + + case GridBinaryMarshaller.HASH_SET: + col = CommonUtils.newHashSet(size); + + break; + + case GridBinaryMarshaller.LINKED_HASH_SET: + col = CommonUtils.newLinkedHashSet(size); + + break; + + case GridBinaryMarshaller.USER_SET: + col = CommonUtils.newHashSet(size); + + break; + + case GridBinaryMarshaller.USER_COL: + col = new ArrayList<>(size); + + break; + + default: + throw new BinaryObjectException("Invalid collection type: " + colType); + } + } + + handles.setHandle(col, hPos); + + for (int i = 0; i < size; i++) + col.add(deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize)); + + return colType == GridBinaryMarshaller.SINGLETON_LIST ? CommonUtils.convertToSingletonList(col) : col; + } + + /** + * @param deserialize Deep flag. + * @param factory Map factory. + * @return Value. + * @throws BinaryObjectException In case of error. + */ + @SuppressWarnings("unchecked") + private static Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryMapFactory factory) + throws BinaryObjectException { + int hPos = positionForHandle(in); + + int size = in.readInt(); + + assert size >= 0; + + byte mapType = in.readByte(); + + Map map; + + if (factory != null) + map = factory.create(size); + else { + switch (mapType) { + case GridBinaryMarshaller.HASH_MAP: + map = CommonUtils.newHashMap(size); + + break; + + case GridBinaryMarshaller.LINKED_HASH_MAP: + map = CommonUtils.newLinkedHashMap(size); + + break; + + case GridBinaryMarshaller.USER_COL: + map = CommonUtils.newHashMap(size); + + break; + + default: + throw new BinaryObjectException("Invalid map type: " + mapType); + } + } + + handles.setHandle(map, hPos); + + for (int i = 0; i < size; i++) { + Object key = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + Object val = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + + map.put(key, val); + } + + return map; + } + + /** + * Deserialize or unmarshal the object. + * + * @param deserialize Deserialize. + * @return Result. + */ + private static Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) { + return deserialize ? doReadObject(in, ctx, ldr, handles) : unmarshal(in, ctx, ldr, handles, detach, deserialize); + } + + /** + * Get position to be used for handle. We assume here that the hdr byte was read, hence subtract -1. + * + * @return Position for handle. + */ + private static int positionForHandle(BinaryInputStream in) { + return in.position() - 1; + } + + /** + * Enum type. + */ + private static class EnumType { + /** Type ID. */ + private final int typeId; + + /** Class name. */ + private final String clsName; + + /** + * Constructor. + * + * @param typeId Type ID. + * @param clsName Class name. + */ + public EnumType(int typeId, @Nullable String clsName) { + assert typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName == null || + typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID && clsName != null; + + this.typeId = typeId; + this.clsName = clsName; + } + } } From 38a84af487d62e7ed89b42b02f218fa8d6787680 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 2 Oct 2026 17:02:13 +0300 Subject: [PATCH 30/33] IGNITE-29094 Remove useless byte array creation --- .../internal/binary/BinariesFactoryImpl.java | 2 +- .../internal/binary/BinaryObjectImpl.java | 2 +- .../binary/BinaryObjectOffheapImpl.java | 2 +- .../internal/binary/BinaryReaderExImpl.java | 389 +++++++++--------- 4 files changed, 195 insertions(+), 200 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index ee0aab71442a2..53905325d9eab 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -67,7 +67,7 @@ public class BinariesFactoryImpl implements BinariesFactory { /** {@inheritDoc} */ @Override public @Nullable Object unmarshal(BinaryInputStream in, BinaryContext ctx, @Nullable ClassLoader ldr) throws BinaryObjectException { - return BinaryReaderExImpl.unmarshal(in, ctx, ldr); + return new BinaryReaderExImpl(ctx, in, ldr, null, true, true).unmarshal(in.position()); } /** {@inheritDoc} */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index 39c4278e6364d..fcd591964adee 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -561,7 +561,7 @@ else if (fieldOffLen == BinaryImplUtils.OFFSET_2) break; default: - val = BinaryReaderExImpl.unmarshal(BinaryStreams.inputStream(arr, fieldPos), ctx, null); + val = new BinaryReaderExImpl(ctx, BinaryStreams.inputStream(arr, fieldPos), null, null, true, true).unmarshal(fieldPos); break; } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java index 3c3f2289b175f..79de79461f6c5 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java @@ -375,7 +375,7 @@ else if (fieldOffLen == BinaryImplUtils.OFFSET_2) stream.position(fieldPos); - val = BinaryReaderExImpl.unmarshal(stream, ctx, null); + val = new BinaryReaderExImpl(ctx, stream, null, null, true, true).unmarshal(fieldPos); break; } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 93cff8cbcf829..8aee211e290c4 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -314,22 +314,13 @@ public BinaryReaderExImpl(BinaryContext ctx, streamPosition(start); } - /** - * @return Unmarshalled value. - * @throws BinaryObjectException In case of error. - */ - @Nullable static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) - throws BinaryObjectException { - return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl()); - } - /** {@inheritDoc} */ - @Override public BinaryInputStream in() { + @Override public final BinaryInputStream in() { return in; } /** @return Descriptor. */ - public BinaryClassDescriptor descriptor() { + public final BinaryClassDescriptor descriptor() { if (desc == null) desc = ctx.descriptorForTypeId(userType, typeId, ldr, false); @@ -341,7 +332,7 @@ public BinaryClassDescriptor descriptor() { * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - public Object unmarshal(int offset) throws BinaryObjectException { + public final Object unmarshal(int offset) throws BinaryObjectException { streamPosition(offset); return in.position() >= 0 ? unmarshal(in, ctx, ldr, this) : null; @@ -352,7 +343,7 @@ public Object unmarshal(int offset) throws BinaryObjectException { * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - public Object unmarshalField(String fieldName) throws BinaryObjectException { + public final Object unmarshalField(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? unmarshal(in, ctx, ldr, this) : null; } @@ -366,7 +357,7 @@ public Object unmarshalField(String fieldName) throws BinaryObjectException { * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - public Object unmarshalField(int fieldId) throws BinaryObjectException { + public final Object unmarshalField(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? unmarshal(in, ctx, ldr, this) : null; } @@ -375,7 +366,7 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { * @return Binary object. * @throws BinaryObjectException In case of error. */ - @Nullable BinaryObject readBinaryObject(int fieldId) throws BinaryObjectException { + @Nullable final BinaryObject readBinaryObject(int fieldId) throws BinaryObjectException { if (findFieldById(fieldId)) { if (checkFlag(BINARY_OBJ) == Flag.NULL) return null; @@ -391,7 +382,7 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { * @return Field class. * @throws BinaryObjectException In case of error. */ - @Nullable Class readClass(int fieldId) throws BinaryObjectException { + @Nullable final Class readClass(int fieldId) throws BinaryObjectException { if (findFieldById(fieldId)) { if (checkFlag(CLASS) == Flag.NULL) return null; @@ -403,17 +394,17 @@ public Object unmarshalField(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public void setHandle(Object obj, int pos) { + @Override public final void setHandle(Object obj, int pos) { handles().put(pos, obj); } /** {@inheritDoc} */ - @Override public Object getHandle(int pos) { + @Override public final Object getHandle(int pos) { return hnds != null ? hnds.get(pos) : null; } /** {@inheritDoc} */ - @Override public BinaryReaderHandles handles() { + @Override public final BinaryReaderHandles handles() { if (hnds == null) hnds = new BinaryReaderHandles(); @@ -459,7 +450,7 @@ private BinaryObjectException wrapFieldException(String fieldName, Exception e) } /** {@inheritDoc} */ - @Override public byte readByte(String fieldName) throws BinaryObjectException { + @Override public final byte readByte(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(BYTE) == Flag.NORMAL ? in.readByte() : 0; } @@ -473,7 +464,7 @@ private BinaryObjectException wrapFieldException(String fieldName, Exception e) * @return Value. * @throws BinaryObjectException If failed. */ - byte readByte(int fieldId) throws BinaryObjectException { + final byte readByte(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(BYTE) == Flag.NORMAL ? in.readByte() : 0; } @@ -482,17 +473,17 @@ byte readByte(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Byte readByteNullable(int fieldId) throws BinaryObjectException { + @Nullable final Byte readByteNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(BYTE) == Flag.NORMAL ? in.readByte() : null; } /** {@inheritDoc} */ - @Override public byte readByte() throws BinaryObjectException { + @Override public final byte readByte() throws BinaryObjectException { return in.readByte(); } /** {@inheritDoc} */ - @Nullable @Override public byte[] readByteArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final byte[] readByteArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readByteArray() : null; } @@ -506,12 +497,12 @@ byte readByte(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable byte[] readByteArray(int fieldId) throws BinaryObjectException { + @Nullable final byte[] readByteArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readByteArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public byte[] readByteArray() throws BinaryObjectException { + @Nullable @Override public final byte[] readByteArray() throws BinaryObjectException { switch (checkFlag(BYTE_ARR)) { case NORMAL: return BinaryUtils.doReadByteArray(in); @@ -525,7 +516,7 @@ byte readByte(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public boolean readBoolean(String fieldName) throws BinaryObjectException { + @Override public final boolean readBoolean(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(BOOLEAN) == Flag.NORMAL && in.readBoolean(); } @@ -539,7 +530,7 @@ byte readByte(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - boolean readBoolean(int fieldId) throws BinaryObjectException { + final boolean readBoolean(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(BOOLEAN) == Flag.NORMAL && in.readBoolean(); } @@ -548,17 +539,17 @@ boolean readBoolean(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Boolean readBooleanNullable(int fieldId) throws BinaryObjectException { + @Nullable final Boolean readBooleanNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(BOOLEAN) == Flag.NORMAL ? in.readBoolean() : null; } /** {@inheritDoc} */ - @Override public boolean readBoolean() throws BinaryObjectException { + @Override public final boolean readBoolean() throws BinaryObjectException { return in.readBoolean(); } /** {@inheritDoc} */ - @Nullable @Override public boolean[] readBooleanArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final boolean[] readBooleanArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readBooleanArray() : null; } @@ -572,12 +563,12 @@ boolean readBoolean(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable boolean[] readBooleanArray(int fieldId) throws BinaryObjectException { + @Nullable final boolean[] readBooleanArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readBooleanArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public boolean[] readBooleanArray() throws BinaryObjectException { + @Nullable @Override public final boolean[] readBooleanArray() throws BinaryObjectException { switch (checkFlag(BOOLEAN_ARR)) { case NORMAL: return doReadBooleanArray(in); @@ -591,7 +582,7 @@ boolean readBoolean(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public short readShort(String fieldName) throws BinaryObjectException { + @Override public final short readShort(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(SHORT) == Flag.NORMAL ? in.readShort() : 0; } @@ -605,7 +596,7 @@ boolean readBoolean(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - short readShort(int fieldId) throws BinaryObjectException { + final short readShort(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(SHORT) == Flag.NORMAL ? in.readShort() : 0; } @@ -614,17 +605,17 @@ short readShort(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Short readShortNullable(int fieldId) throws BinaryObjectException { + @Nullable final Short readShortNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(SHORT) == Flag.NORMAL ? in.readShort() : null; } /** {@inheritDoc} */ - @Override public short readShort() throws BinaryObjectException { + @Override public final short readShort() throws BinaryObjectException { return in.readShort(); } /** {@inheritDoc} */ - @Nullable @Override public short[] readShortArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final short[] readShortArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readShortArray() : null; } @@ -638,12 +629,12 @@ short readShort(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable short[] readShortArray(int fieldId) throws BinaryObjectException { + @Nullable final short[] readShortArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readShortArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public short[] readShortArray() throws BinaryObjectException { + @Nullable @Override public final short[] readShortArray() throws BinaryObjectException { switch (checkFlag(SHORT_ARR)) { case NORMAL: return doReadShortArray(in); @@ -657,7 +648,7 @@ short readShort(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public char readChar(String fieldName) throws BinaryObjectException { + @Override public final char readChar(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(CHAR) == Flag.NORMAL ? in.readChar() : 0; } @@ -671,7 +662,7 @@ short readShort(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - char readChar(int fieldId) throws BinaryObjectException { + final char readChar(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(CHAR) == Flag.NORMAL ? in.readChar() : 0; } @@ -680,17 +671,17 @@ char readChar(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Character readCharNullable(int fieldId) throws BinaryObjectException { + @Nullable final Character readCharNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(CHAR) == Flag.NORMAL ? in.readChar() : null; } /** {@inheritDoc} */ - @Override public char readChar() throws BinaryObjectException { + @Override public final char readChar() throws BinaryObjectException { return in.readChar(); } /** {@inheritDoc} */ - @Nullable @Override public char[] readCharArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final char[] readCharArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readCharArray() : null; } @@ -704,12 +695,12 @@ char readChar(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable char[] readCharArray(int fieldId) throws BinaryObjectException { + @Nullable final char[] readCharArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readCharArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public char[] readCharArray() throws BinaryObjectException { + @Nullable @Override public final char[] readCharArray() throws BinaryObjectException { switch (checkFlag(CHAR_ARR)) { case NORMAL: return doReadCharArray(in); @@ -723,7 +714,7 @@ char readChar(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public int readInt(String fieldName) throws BinaryObjectException { + @Override public final int readInt(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(INT) == Flag.NORMAL ? in.readInt() : 0; } @@ -737,7 +728,7 @@ char readChar(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - int readInt(int fieldId) throws BinaryObjectException { + final int readInt(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(INT) == Flag.NORMAL ? in.readInt() : 0; } @@ -746,17 +737,17 @@ int readInt(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Integer readIntNullable(int fieldId) throws BinaryObjectException { + @Nullable final Integer readIntNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(INT) == Flag.NORMAL ? in.readInt() : null; } /** {@inheritDoc} */ - @Override public int readInt() throws BinaryObjectException { + @Override public final int readInt() throws BinaryObjectException { return in.readInt(); } /** {@inheritDoc} */ - @Nullable @Override public int[] readIntArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final int[] readIntArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readIntArray() : null; } @@ -770,12 +761,12 @@ int readInt(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable int[] readIntArray(int fieldId) throws BinaryObjectException { + @Nullable final int[] readIntArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readIntArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public int[] readIntArray() throws BinaryObjectException { + @Nullable @Override public final int[] readIntArray() throws BinaryObjectException { switch (checkFlag(INT_ARR)) { case NORMAL: return doReadIntArray(in); @@ -789,7 +780,7 @@ int readInt(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public long readLong(String fieldName) throws BinaryObjectException { + @Override public final long readLong(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(LONG) == Flag.NORMAL ? in.readLong() : 0; } @@ -803,7 +794,7 @@ int readInt(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - long readLong(int fieldId) throws BinaryObjectException { + final long readLong(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(LONG) == Flag.NORMAL ? in.readLong() : 0; } @@ -812,17 +803,17 @@ long readLong(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Long readLongNullable(int fieldId) throws BinaryObjectException { + @Nullable final Long readLongNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(LONG) == Flag.NORMAL ? in.readLong() : null; } /** {@inheritDoc} */ - @Override public long readLong() throws BinaryObjectException { + @Override public final long readLong() throws BinaryObjectException { return in.readLong(); } /** {@inheritDoc} */ - @Nullable @Override public long[] readLongArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final long[] readLongArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readLongArray() : null; } @@ -836,12 +827,12 @@ long readLong(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable long[] readLongArray(int fieldId) throws BinaryObjectException { + @Nullable final long[] readLongArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readLongArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public long[] readLongArray() throws BinaryObjectException { + @Nullable @Override public final long[] readLongArray() throws BinaryObjectException { switch (checkFlag(LONG_ARR)) { case NORMAL: return doReadLongArray(in); @@ -855,7 +846,7 @@ long readLong(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public float readFloat(String fieldName) throws BinaryObjectException { + @Override public final float readFloat(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(FLOAT) == Flag.NORMAL ? in.readFloat() : 0; } @@ -869,7 +860,7 @@ long readLong(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - float readFloat(int fieldId) throws BinaryObjectException { + final float readFloat(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(FLOAT) == Flag.NORMAL ? in.readFloat() : 0; } @@ -878,17 +869,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Float readFloatNullable(int fieldId) throws BinaryObjectException { + @Nullable final Float readFloatNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(FLOAT) == Flag.NORMAL ? in.readFloat() : null; } /** {@inheritDoc} */ - @Override public float readFloat() throws BinaryObjectException { + @Override public final float readFloat() throws BinaryObjectException { return in.readFloat(); } /** {@inheritDoc} */ - @Nullable @Override public float[] readFloatArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final float[] readFloatArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readFloatArray() : null; } @@ -902,12 +893,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable float[] readFloatArray(int fieldId) throws BinaryObjectException { + @Nullable final float[] readFloatArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readFloatArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public float[] readFloatArray() throws BinaryObjectException { + @Nullable @Override public final float[] readFloatArray() throws BinaryObjectException { switch (checkFlag(FLOAT_ARR)) { case NORMAL: return doReadFloatArray(in); @@ -921,7 +912,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override public double readDouble(String fieldName) throws BinaryObjectException { + @Override public final double readDouble(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) && checkFlagNoHandles(DOUBLE) == Flag.NORMAL ? in.readDouble() : 0; } @@ -935,7 +926,7 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException If failed. */ - double readDouble(int fieldId) throws BinaryObjectException { + final double readDouble(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(DOUBLE) == Flag.NORMAL ? in.readDouble() : 0; } @@ -944,17 +935,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Double readDoubleNullable(int fieldId) throws BinaryObjectException { + @Nullable final Double readDoubleNullable(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) && checkFlagNoHandles(DOUBLE) == Flag.NORMAL ? in.readDouble() : null; } /** {@inheritDoc} */ - @Override public double readDouble() throws BinaryObjectException { + @Override public final double readDouble() throws BinaryObjectException { return in.readDouble(); } /** {@inheritDoc} */ - @Nullable @Override public double[] readDoubleArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final double[] readDoubleArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readDoubleArray() : null; } @@ -968,12 +959,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable double[] readDoubleArray(int fieldId) throws BinaryObjectException { + @Nullable final double[] readDoubleArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readDoubleArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public double[] readDoubleArray() throws BinaryObjectException { + @Nullable @Override public final double[] readDoubleArray() throws BinaryObjectException { switch (checkFlag(DOUBLE_ARR)) { case NORMAL: return doReadDoubleArray(in); @@ -987,7 +978,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override @Nullable public BigDecimal readDecimal(String fieldName) throws BinaryObjectException { + @Override @Nullable public final BigDecimal readDecimal(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readDecimal() : null; } @@ -1001,17 +992,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable BigDecimal readDecimal(int fieldId) throws BinaryObjectException { + @Nullable final BigDecimal readDecimal(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readDecimal() : null; } /** {@inheritDoc} */ - @Override @Nullable public BigDecimal readDecimal() throws BinaryObjectException { + @Override @Nullable public final BigDecimal readDecimal() throws BinaryObjectException { return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? doReadDecimal(in) : null; } /** {@inheritDoc} */ - @Override @Nullable public BigDecimal[] readDecimalArray(String fieldName) throws BinaryObjectException { + @Override @Nullable public final BigDecimal[] readDecimalArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readDecimalArray() : null; } @@ -1025,12 +1016,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable BigDecimal[] readDecimalArray(int fieldId) throws BinaryObjectException { + @Nullable final BigDecimal[] readDecimalArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readDecimalArray() : null; } /** {@inheritDoc} */ - @Override @Nullable public BigDecimal[] readDecimalArray() throws BinaryObjectException { + @Override @Nullable public final BigDecimal[] readDecimalArray() throws BinaryObjectException { switch (checkFlag(DECIMAL_ARR)) { case NORMAL: return doReadDecimalArray(in); @@ -1044,7 +1035,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override @Nullable public String readString(String fieldName) throws BinaryObjectException { + @Override @Nullable public final String readString(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readString() : null; } @@ -1058,17 +1049,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable String readString(int fieldId) throws BinaryObjectException { + @Nullable final String readString(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readString() : null; } /** {@inheritDoc} */ - @Override @Nullable public String readString() throws BinaryObjectException { + @Override @Nullable public final String readString() throws BinaryObjectException { return checkFlagNoHandles(STRING) == Flag.NORMAL ? BinaryUtils.doReadString(in) : null; } /** {@inheritDoc} */ - @Override @Nullable public String[] readStringArray(String fieldName) throws BinaryObjectException { + @Override @Nullable public final String[] readStringArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readStringArray() : null; } @@ -1082,12 +1073,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable String[] readStringArray(int fieldId) throws BinaryObjectException { + @Nullable final String[] readStringArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readStringArray() : null; } /** {@inheritDoc} */ - @Override @Nullable public String[] readStringArray() throws BinaryObjectException { + @Override @Nullable public final String[] readStringArray() throws BinaryObjectException { switch (checkFlag(STRING_ARR)) { case NORMAL: return BinaryUtils.doReadStringArray(in); @@ -1101,7 +1092,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override @Nullable public UUID readUuid(String fieldName) throws BinaryObjectException { + @Override @Nullable public final UUID readUuid(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readUuid() : null; } @@ -1115,17 +1106,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable UUID readUuid(int fieldId) throws BinaryObjectException { + @Nullable final UUID readUuid(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readUuid() : null; } /** {@inheritDoc} */ - @Override @Nullable public UUID readUuid() throws BinaryObjectException { + @Override @Nullable public final UUID readUuid() throws BinaryObjectException { return checkFlagNoHandles(UUID) == Flag.NORMAL ? doReadUuid(in) : null; } /** {@inheritDoc} */ - @Override @Nullable public UUID[] readUuidArray(String fieldName) throws BinaryObjectException { + @Override @Nullable public final UUID[] readUuidArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readUuidArray() : null; } @@ -1139,12 +1130,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable UUID[] readUuidArray(int fieldId) throws BinaryObjectException { + @Nullable final UUID[] readUuidArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readUuidArray() : null; } /** {@inheritDoc} */ - @Override @Nullable public UUID[] readUuidArray() throws BinaryObjectException { + @Override @Nullable public final UUID[] readUuidArray() throws BinaryObjectException { switch (checkFlag(UUID_ARR)) { case NORMAL: return doReadUuidArray(in); @@ -1158,7 +1149,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override @Nullable public Date readDate(String fieldName) throws BinaryObjectException { + @Override @Nullable public final Date readDate(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readDate() : null; } @@ -1172,17 +1163,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Date readDate(int fieldId) throws BinaryObjectException { + @Nullable final Date readDate(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readDate() : null; } /** {@inheritDoc} */ - @Override @Nullable public Date readDate() throws BinaryObjectException { + @Override @Nullable public final Date readDate() throws BinaryObjectException { return checkFlagNoHandles(DATE) == Flag.NORMAL ? doReadDate(in) : null; } /** {@inheritDoc} */ - @Override @Nullable public Date[] readDateArray(String fieldName) throws BinaryObjectException { + @Override @Nullable public final Date[] readDateArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readDateArray() : null; } @@ -1196,12 +1187,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Date[] readDateArray(int fieldId) throws BinaryObjectException { + @Nullable final Date[] readDateArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readDateArray() : null; } /** {@inheritDoc} */ - @Override @Nullable public Date[] readDateArray() throws BinaryObjectException { + @Override @Nullable public final Date[] readDateArray() throws BinaryObjectException { switch (checkFlag(DATE_ARR)) { case NORMAL: return doReadDateArray(in); @@ -1215,7 +1206,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override @Nullable public Timestamp readTimestamp(String fieldName) throws BinaryObjectException { + @Override @Nullable public final Timestamp readTimestamp(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readTimestamp() : null; } @@ -1229,17 +1220,17 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Timestamp readTimestamp(int fieldId) throws BinaryObjectException { + @Nullable final Timestamp readTimestamp(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readTimestamp() : null; } /** {@inheritDoc} */ - @Override @Nullable public Timestamp readTimestamp() throws BinaryObjectException { + @Override @Nullable public final Timestamp readTimestamp() throws BinaryObjectException { return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? doReadTimestamp(in) : null; } /** {@inheritDoc} */ - @Override @Nullable public Timestamp[] readTimestampArray(String fieldName) throws BinaryObjectException { + @Override @Nullable public final Timestamp[] readTimestampArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readTimestampArray() : null; } @@ -1253,12 +1244,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Timestamp[] readTimestampArray(int fieldId) throws BinaryObjectException { + @Nullable final Timestamp[] readTimestampArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readTimestampArray() : null; } /** {@inheritDoc} */ - @Override @Nullable public Timestamp[] readTimestampArray() throws BinaryObjectException { + @Override @Nullable public final Timestamp[] readTimestampArray() throws BinaryObjectException { switch (checkFlag(TIMESTAMP_ARR)) { case NORMAL: return doReadTimestampArray(in); @@ -1272,17 +1263,17 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Override @Nullable public Time readTime(String fieldName) throws BinaryObjectException { + @Override @Nullable public final Time readTime(String fieldName) throws BinaryObjectException { return findFieldByName(fieldName) ? this.readTime() : null; } /** {@inheritDoc} */ - @Override @Nullable public Time readTime() throws BinaryObjectException { + @Override @Nullable public final Time readTime() throws BinaryObjectException { return checkFlagNoHandles(TIME) == Flag.NORMAL ? doReadTime(in) : null; } /** {@inheritDoc} */ - @Override @Nullable public Time[] readTimeArray(String fieldName) throws BinaryObjectException { + @Override @Nullable public final Time[] readTimeArray(String fieldName) throws BinaryObjectException { return findFieldByName(fieldName) ? this.readTimeArray() : null; } @@ -1291,7 +1282,7 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Time readTime(int fieldId) throws BinaryObjectException { + @Nullable final Time readTime(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readTime() : null; } @@ -1300,12 +1291,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Time[] readTimeArray(int fieldId) throws BinaryObjectException { + @Nullable final Time[] readTimeArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readTimeArray() : null; } /** {@inheritDoc} */ - @Override @Nullable public Time[] readTimeArray() throws BinaryObjectException { + @Override @Nullable public final Time[] readTimeArray() throws BinaryObjectException { switch (checkFlag(TIME_ARR)) { case NORMAL: return doReadTimeArray(in); @@ -1317,7 +1308,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Nullable @Override public T readObject(String fieldName) throws BinaryObjectException { + @Nullable @Override public final T readObject(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? (T)doReadObject(in, ctx, ldr, this) : null; } @@ -1331,27 +1322,27 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Object readObject(int fieldId) throws BinaryObjectException { + @Nullable final Object readObject(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? doReadObject(in, ctx, ldr, this) : null; } /** {@inheritDoc} */ - @Override public Object readObject() throws BinaryObjectException { + @Override public final Object readObject() throws BinaryObjectException { return doReadObject(in, ctx, ldr, this); } /** {@inheritDoc} */ - @Nullable @Override public Object readObjectDetached() throws BinaryObjectException { + @Nullable @Override public final Object readObjectDetached() throws BinaryObjectException { return readObjectDetached(false); } /** {@inheritDoc} */ - @Nullable @Override public Object readObjectDetached(boolean deserialize) throws BinaryObjectException { + @Nullable @Override public final Object readObjectDetached(boolean deserialize) throws BinaryObjectException { return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl(), true, deserialize); } /** {@inheritDoc} */ - @Nullable @Override public Object[] readObjectArray(String fieldName) throws BinaryObjectException { + @Nullable @Override public final Object[] readObjectArray(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? this.readObjectArray() : null; } @@ -1365,12 +1356,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Object[] readObjectArray(int fieldId) throws BinaryObjectException { + @Nullable final Object[] readObjectArray(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? this.readObjectArray() : null; } /** {@inheritDoc} */ - @Nullable @Override public Object[] readObjectArray() throws BinaryObjectException { + @Nullable @Override public final Object[] readObjectArray() throws BinaryObjectException { switch (checkFlag(OBJ_ARR)) { case NORMAL: return doReadObjectArray(in, ctx, ldr, this, false, true); @@ -1389,7 +1380,7 @@ float readFloat(int fieldId) throws BinaryObjectException { } /** {@inheritDoc} */ - @Nullable @Override public > T readEnum(String fieldName) throws BinaryObjectException { + @Nullable @Override public final > T readEnum(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? (T)readEnum0(null) : null; } @@ -1404,12 +1395,12 @@ float readFloat(int fieldId) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Enum readEnum(int fieldId, @Nullable Class cls) throws BinaryObjectException { + @Nullable final Enum readEnum(int fieldId, @Nullable Class cls) throws BinaryObjectException { return findFieldById(fieldId) ? readEnum0(cls) : null; } /** {@inheritDoc} */ - @Nullable @Override public > T readEnum() throws BinaryObjectException { + @Nullable @Override public final > T readEnum() throws BinaryObjectException { return (T)readEnum0(null); } @@ -1435,7 +1426,7 @@ private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { } /** {@inheritDoc} */ - @Nullable @Override public > T[] readEnumArray(String fieldName) + @Nullable @Override public final > T[] readEnumArray(String fieldName) throws BinaryObjectException { try { @@ -1451,7 +1442,7 @@ private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { * @return Binary Enum * @throws BinaryObjectException If failed. */ - @Nullable BinaryObjectEx readBinaryEnum(int fieldId) throws BinaryObjectException { + @Nullable final BinaryObjectEx readBinaryEnum(int fieldId) throws BinaryObjectException { return findFieldById(fieldId) ? doReadBinaryEnum(in, ctx) : null; } @@ -1461,12 +1452,12 @@ private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Object[] readEnumArray(int fieldId, @Nullable Class cls) throws BinaryObjectException { + @Nullable final Object[] readEnumArray(int fieldId, @Nullable Class cls) throws BinaryObjectException { return findFieldById(fieldId) ? readEnumArray0(cls) : null; } /** {@inheritDoc} */ - @Nullable @Override public > T[] readEnumArray() throws BinaryObjectException { + @Nullable @Override public final > T[] readEnumArray() throws BinaryObjectException { return (T[])readEnumArray0(null); } @@ -1502,7 +1493,7 @@ private Object[] readEnumArray0(@Nullable Class cls) throws BinaryObjectExcep } /** {@inheritDoc} */ - @Nullable @Override public Collection readCollection(String fieldName) throws BinaryObjectException { + @Nullable @Override public final Collection readCollection(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? (Collection)readCollection0(null) : null; } @@ -1512,7 +1503,7 @@ private Object[] readEnumArray0(@Nullable Class cls) throws BinaryObjectExcep } /** {@inheritDoc} */ - @Nullable @Override public Collection readCollection(String fieldName, BinaryCollectionFactory factory) + @Nullable @Override public final Collection readCollection(String fieldName, BinaryCollectionFactory factory) throws BinaryObjectException { try { @@ -1529,18 +1520,18 @@ private Object[] readEnumArray0(@Nullable Class cls) throws BinaryObjectExcep * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Collection readCollection(int fieldId, @Nullable BinaryCollectionFactory factory) + @Nullable final Collection readCollection(int fieldId, @Nullable BinaryCollectionFactory factory) throws BinaryObjectException { return findFieldById(fieldId) ? (Collection)readCollection0(factory) : null; } /** {@inheritDoc} */ - @Nullable @Override public Collection readCollection() throws BinaryObjectException { + @Nullable @Override public final Collection readCollection() throws BinaryObjectException { return readCollection0(null); } /** {@inheritDoc} */ - @Nullable @Override public Collection readCollection(BinaryCollectionFactory factory) + @Nullable @Override public final Collection readCollection(BinaryCollectionFactory factory) throws BinaryObjectException { return readCollection0(factory); } @@ -1582,7 +1573,7 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) } /** {@inheritDoc} */ - @Nullable @Override public Map readMap(String fieldName) throws BinaryObjectException { + @Nullable @Override public final Map readMap(String fieldName) throws BinaryObjectException { try { return findFieldByName(fieldName) ? (Map)readMap0(null) : null; } @@ -1592,7 +1583,7 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) } /** {@inheritDoc} */ - @Nullable @Override public Map readMap(String fieldName, BinaryMapFactory factory) + @Nullable @Override public final Map readMap(String fieldName, BinaryMapFactory factory) throws BinaryObjectException { try { @@ -1609,17 +1600,17 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) * @return Value. * @throws BinaryObjectException In case of error. */ - @Nullable Map readMap(int fieldId, @Nullable BinaryMapFactory factory) throws BinaryObjectException { + @Nullable final Map readMap(int fieldId, @Nullable BinaryMapFactory factory) throws BinaryObjectException { return findFieldById(fieldId) ? readMap0(factory) : null; } /** {@inheritDoc} */ - @Nullable @Override public Map readMap() throws BinaryObjectException { + @Nullable @Override public final Map readMap() throws BinaryObjectException { return readMap0(null); } /** {@inheritDoc} */ - @Nullable @Override public Map readMap(BinaryMapFactory factory) + @Nullable @Override public final Map readMap(BinaryMapFactory factory) throws BinaryObjectException { return readMap0(factory); } @@ -1716,7 +1707,7 @@ private String fieldFlagName(byte flag) { } /** {@inheritDoc} */ - @Override public BinaryRawReader rawReader() { + @Override public final BinaryRawReader rawReader() { if (!raw) { streamPositionRandom(rawOff); @@ -1992,7 +1983,7 @@ private String fieldFlagName(byte flag) { * @return Deserialized object. * @throws BinaryObjectException If failed. */ - @Nullable Object readField(int fieldId) throws BinaryObjectException { + @Nullable final Object readField(int fieldId) throws BinaryObjectException { if (!findFieldById(fieldId)) return null; @@ -2014,7 +2005,7 @@ private int fieldId(String name) { * * @return Schema. */ - public BinarySchema getOrCreateSchema() { + public final BinarySchema getOrCreateSchema() { BinarySchema schema = ctx.schemaRegistry(typeId).schema(schemaId); if (schema == null) { @@ -2065,7 +2056,7 @@ public BinarySchema getOrCreateSchema() { } /** {@inheritDoc} */ - @Override public Object unmarshallJdbc(byte type, boolean binObjAllow, boolean deserialize) { + @Override public final Object unmarshallJdbc(byte type, boolean binObjAllow, boolean deserialize) { switch (type) { case GridBinaryMarshaller.NULL: return null; @@ -2199,7 +2190,7 @@ private BinarySchema createSchema() { * @param name Field name. * @return Offset. */ - public boolean findFieldByName(String name) { + public final boolean findFieldByName(String name) { if (raw) throw new BinaryObjectException("Failed to read named field because reader is in raw mode."); @@ -2386,17 +2377,17 @@ private void streamPositionRandom(int pos) { } /** {@inheritDoc} */ - @Override public int readUnsignedByte() throws IOException { + @Override public final int readUnsignedByte() throws IOException { return readByte() & 0xff; } /** {@inheritDoc} */ - @Override public int readUnsignedShort() throws IOException { + @Override public final int readUnsignedShort() throws IOException { return readShort() & 0xffff; } /** {@inheritDoc} */ - @Override public String readLine() throws IOException { + @Override public final String readLine() throws IOException { SB sb = new SB(); int b; @@ -2428,17 +2419,17 @@ private void streamPositionRandom(int pos) { /** {@inheritDoc} */ @SuppressWarnings("ConstantConditions") - @NotNull @Override public String readUTF() throws IOException { + @NotNull @Override public final String readUTF() throws IOException { return readString(); } /** {@inheritDoc} */ - @Override public void readFully(byte[] b) throws IOException { + @Override public final void readFully(byte[] b) throws IOException { readFully(b, 0, b.length); } /** {@inheritDoc} */ - @Override public void readFully(byte[] b, int off, int len) throws IOException { + @Override public final void readFully(byte[] b, int off, int len) throws IOException { int cnt = in.read(b, off, len); if (cnt < len) @@ -2446,7 +2437,7 @@ private void streamPositionRandom(int pos) { } /** {@inheritDoc} */ - @Override public int skipBytes(int n) throws IOException { + @Override public final int skipBytes(int n) throws IOException { int toSkip = Math.min(in.remaining(), n); streamPositionRandom(in.position() + toSkip); @@ -2455,44 +2446,44 @@ private void streamPositionRandom(int pos) { } /** {@inheritDoc} */ - @Override public int read() throws IOException { + @Override public final int read() throws IOException { return readByte(); } /** {@inheritDoc} */ - @Override public int read(byte[] b) throws IOException { + @Override public final int read(byte[] b) throws IOException { return read(b, 0, b.length); } /** {@inheritDoc} */ - @Override public int read(byte[] b, int off, int len) throws IOException { + @Override public final int read(byte[] b, int off, int len) throws IOException { return in.read(b, off, len); } /** {@inheritDoc} */ - @Override public long skip(long n) throws IOException { + @Override public final long skip(long n) throws IOException { return skipBytes((int)n); } /** {@inheritDoc} */ - @Override public int available() throws IOException { + @Override public final int available() throws IOException { return in.remaining(); } /** {@inheritDoc} */ - @Override public boolean isEmpty() { + @Override public final boolean isEmpty() { return hnds == null || hnds.isEmpty(); } /** {@inheritDoc} */ - @Override public void close() throws IOException { + @Override public final void close() throws IOException { // No-op. } /** * @return Binary context. */ - public BinaryContext context() { + public final BinaryContext context() { return ctx; } @@ -2680,7 +2671,7 @@ private void readField(Object obj, BinaryFieldDescriptor fld) { * @return Read value. * @throws BinaryObjectException If failed to read value from the stream. */ - protected Object readFixedType(BinaryFieldDescriptor fld) throws BinaryObjectException { + protected final Object readFixedType(BinaryFieldDescriptor fld) throws BinaryObjectException { Object val = null; switch (fld.mode) { @@ -2884,7 +2875,7 @@ protected Object readFixedType(BinaryFieldDescriptor fld) throws BinaryObjectExc * @param ctx Binary context. * @return Enum. */ - private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx) { + private BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx) { return doReadBinaryEnum(in, ctx, doReadEnumType(in)); } @@ -2892,7 +2883,7 @@ private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryConte * @param cls Enum class. * @return Value. */ - private static Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, Class cls) + private Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, Class cls) throws BinaryObjectException { int len = in.readInt(); @@ -2916,7 +2907,7 @@ private static Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, * @param cls Enum class. * @return Value. */ - private static Enum doReadEnum(BinaryInputStream in, Class cls) throws BinaryObjectException { + private Enum doReadEnum(BinaryInputStream in, Class cls) throws BinaryObjectException { assert cls != null; if (!cls.isEnum()) @@ -2935,7 +2926,7 @@ private static Enum doReadEnum(BinaryInputStream in, Class cls) throws Bin * * @param cls Class. */ - private static T uncachedEnumValue(Class cls, int ord) throws BinaryObjectException { + private T uncachedEnumValue(Class cls, int ord) throws BinaryObjectException { assert cls != null; if (ord >= 0) { @@ -2957,7 +2948,7 @@ private static T uncachedEnumValue(Class cls, int ord) throws BinaryObjec * @return Instance. * @throws BinaryObjectException In case of error. */ - private static Object newInstance(@Nullable Constructor ctor, Class cls) throws BinaryObjectException { + private Object newInstance(@Nullable Constructor ctor, Class cls) throws BinaryObjectException { try { return ctor != null ? ctor.newInstance() : GridUnsafe.allocateInstance(cls); } @@ -2983,7 +2974,7 @@ private enum Flag { /** * @return Value. */ - private static boolean[] doReadBooleanArray(BinaryInputStream in) { + private boolean[] doReadBooleanArray(BinaryInputStream in) { int len = in.readInt(); return in.readBooleanArray(len); @@ -2992,7 +2983,7 @@ private static boolean[] doReadBooleanArray(BinaryInputStream in) { /** * @return Value. */ - private static short[] doReadShortArray(BinaryInputStream in) { + private short[] doReadShortArray(BinaryInputStream in) { int len = in.readInt(); return in.readShortArray(len); @@ -3001,7 +2992,7 @@ private static short[] doReadShortArray(BinaryInputStream in) { /** * @return Value. */ - private static char[] doReadCharArray(BinaryInputStream in) { + private char[] doReadCharArray(BinaryInputStream in) { int len = in.readInt(); return in.readCharArray(len); @@ -3010,7 +3001,7 @@ private static char[] doReadCharArray(BinaryInputStream in) { /** * @return Value. */ - private static int[] doReadIntArray(BinaryInputStream in) { + private int[] doReadIntArray(BinaryInputStream in) { int len = in.readInt(); return in.readIntArray(len); @@ -3019,7 +3010,7 @@ private static int[] doReadIntArray(BinaryInputStream in) { /** * @return Value. */ - private static long[] doReadLongArray(BinaryInputStream in) { + private long[] doReadLongArray(BinaryInputStream in) { int len = in.readInt(); return in.readLongArray(len); @@ -3028,7 +3019,7 @@ private static long[] doReadLongArray(BinaryInputStream in) { /** * @return Value. */ - private static float[] doReadFloatArray(BinaryInputStream in) { + private float[] doReadFloatArray(BinaryInputStream in) { int len = in.readInt(); return in.readFloatArray(len); @@ -3037,7 +3028,7 @@ private static float[] doReadFloatArray(BinaryInputStream in) { /** * @return Value. */ - private static double[] doReadDoubleArray(BinaryInputStream in) { + private double[] doReadDoubleArray(BinaryInputStream in) { int len = in.readInt(); return in.readDoubleArray(len); @@ -3046,7 +3037,7 @@ private static double[] doReadDoubleArray(BinaryInputStream in) { /** * @return Value. */ - private static BigDecimal doReadDecimal(BinaryInputStream in) { + private BigDecimal doReadDecimal(BinaryInputStream in) { int scale = in.readInt(); byte[] mag = BinaryUtils.doReadByteArray(in); @@ -3066,14 +3057,14 @@ private static BigDecimal doReadDecimal(BinaryInputStream in) { /** * @return Value. */ - private static UUID doReadUuid(BinaryInputStream in) { + private UUID doReadUuid(BinaryInputStream in) { return new UUID(in.readLong(), in.readLong()); } /** * @return Value. */ - private static Date doReadDate(BinaryInputStream in) { + private Date doReadDate(BinaryInputStream in) { long time = in.readLong(); return new Date(time); @@ -3082,7 +3073,7 @@ private static Date doReadDate(BinaryInputStream in) { /** * @return Value. */ - private static Timestamp doReadTimestamp(BinaryInputStream in) { + private Timestamp doReadTimestamp(BinaryInputStream in) { long time = in.readLong(); int nanos = in.readInt(); @@ -3096,7 +3087,7 @@ private static Timestamp doReadTimestamp(BinaryInputStream in) { /** * @return Value. */ - private static Time doReadTime(BinaryInputStream in) { + private Time doReadTime(BinaryInputStream in) { long time = in.readLong(); return new Time(time); @@ -3106,7 +3097,7 @@ private static Time doReadTime(BinaryInputStream in) { * @return Value. * @throws BinaryObjectException In case of error. */ - private static BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { + private BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { int len = in.readInt(); BigDecimal[] arr = new BigDecimal[len]; @@ -3131,7 +3122,7 @@ private static BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws Bina * @return Value. * @throws BinaryObjectException In case of error. */ - private static UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { + private UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { int len = in.readInt(); UUID[] arr = new UUID[len]; @@ -3156,7 +3147,7 @@ private static UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectE * @return Value. * @throws BinaryObjectException In case of error. */ - private static Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { + private Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { int len = in.readInt(); Date[] arr = new Date[len]; @@ -3181,7 +3172,7 @@ private static Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectE * @return Value. * @throws BinaryObjectException In case of error. */ - private static Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { + private Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { int len = in.readInt(); Timestamp[] arr = new Timestamp[len]; @@ -3206,7 +3197,7 @@ private static Timestamp[] doReadTimestampArray(BinaryInputStream in) throws Bin * @return Value. * @throws BinaryObjectException In case of error. */ - private static Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { + private Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { int len = in.readInt(); Time[] arr = new Time[len]; @@ -3230,7 +3221,7 @@ private static Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectE /** * @return Value. */ - private static BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { + private BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { if (in.offheapPointer() > 0) { int len = in.readInt(); @@ -3262,7 +3253,7 @@ private static BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryConte * @return Class object specified at the input stream. * @throws BinaryObjectException If failed. */ - private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) + private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) throws BinaryObjectException { return doReadClass(in, ctx, ldr, true); } @@ -3275,7 +3266,7 @@ private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassL * @return Class object specified at the input stream if {@code deserialize == true}. Otherwise returns {@code null} * @throws BinaryObjectException If failed. */ - private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) + private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) throws BinaryObjectException { int typeId = in.readInt(); @@ -3294,7 +3285,7 @@ private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassL * @return Value. */ @SuppressWarnings("ConstantConditions") - private static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + private Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles) { Class[] intfs = new Class[in.readInt()]; @@ -3312,7 +3303,7 @@ private static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, Class * @param in Input stream. * @return Plain type. */ - private static EnumType doReadEnumType(BinaryInputStream in) { + private EnumType doReadEnumType(BinaryInputStream in) { int typeId = in.readInt(); if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) @@ -3332,7 +3323,7 @@ private static EnumType doReadEnumType(BinaryInputStream in) { * @return Class object specified at the input stream. * @throws BinaryObjectException If failed. */ - private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) + private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) throws BinaryObjectException { Class cls; @@ -3364,7 +3355,7 @@ private static Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassL * @param type Plain type. * @return Enum. */ - private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, + private BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, EnumType type) { return BinaryUtils.binariesFactory.binaryEnum(ctx, type.typeId, type.clsName, in.readInt()); } @@ -3376,7 +3367,7 @@ private static BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryConte * @param ctx Binary context. * @return Enum array. */ - private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { + private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { int len = in.readInt(); Object[] arr = (Object[])Array.newInstance(BinaryUtils.binariesFactory.binaryEnumClass(), len); @@ -3397,7 +3388,7 @@ private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContex * @return Object. * @throws BinaryObjectException In case of error. */ - @Nullable private static Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + @Nullable private Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles) throws BinaryObjectException { return new BinaryReaderExImpl(ctx, in, ldr, handles.handles(), false, true).deserialize(); } @@ -3406,8 +3397,12 @@ private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContex * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - @Nullable private static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) throws BinaryObjectException { + @Nullable private Object unmarshal( + BinaryInputStream in, + BinaryContext ctx, + ClassLoader ldr, + BinaryReaderHandlesHolder handles + ) throws BinaryObjectException { return unmarshal(in, ctx, ldr, handles, false, false); } @@ -3415,7 +3410,7 @@ private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContex * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - @Nullable private static Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + @Nullable private Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { int start = in.position(); @@ -3608,7 +3603,7 @@ private static Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContex * @return Value. * @throws BinaryObjectException In case of error. */ - private static Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { int hPos = positionForHandle(in); @@ -3644,7 +3639,7 @@ private static Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ct * @return Value. * @throws BinaryObjectException In case of error. */ - private static BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, boolean isEnumArray) { int hPos = positionForHandle(in); @@ -3677,7 +3672,7 @@ private static BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext * @throws BinaryObjectException In case of error. */ @SuppressWarnings("unchecked") - private static Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryCollectionFactory factory) throws BinaryObjectException { int hPos = positionForHandle(in); @@ -3749,7 +3744,7 @@ private static Collection doReadCollection(BinaryInputStream in, BinaryContex * @throws BinaryObjectException In case of error. */ @SuppressWarnings("unchecked") - private static Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + private Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryMapFactory factory) throws BinaryObjectException { int hPos = positionForHandle(in); @@ -3804,7 +3799,7 @@ private static Collection doReadCollection(BinaryInputStream in, BinaryContex * @param deserialize Deserialize. * @return Result. */ - private static Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + private Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) { return deserialize ? doReadObject(in, ctx, ldr, handles) : unmarshal(in, ctx, ldr, handles, detach, deserialize); } @@ -3814,7 +3809,7 @@ private static Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext * * @return Position for handle. */ - private static int positionForHandle(BinaryInputStream in) { + private int positionForHandle(BinaryInputStream in) { return in.position() - 1; } From 9d793bc395da1f779de12e290d92a5025ffcf92c Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 2 Oct 2026 18:16:06 +0300 Subject: [PATCH 31/33] IGNITE-29094 Remove useless byte array creation --- .../internal/binary/BinaryReaderExImpl.java | 145 ++++++++++-------- .../binary/BinaryReaderHandlesHolder.java | 49 ------ .../binary/BinaryReaderHandlesHolderImpl.java | 49 ------ 3 files changed, 78 insertions(+), 165 deletions(-) delete mode 100644 modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java delete mode 100644 modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 8aee211e290c4..0140da3308248 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -35,7 +35,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; - import org.apache.ignite.binary.BinaryCollectionFactory; import org.apache.ignite.binary.BinaryInvalidTypeException; import org.apache.ignite.binary.BinaryMapFactory; @@ -103,7 +102,7 @@ * Binary reader implementation. */ @SuppressWarnings("unchecked") -public class BinaryReaderExImpl implements BinaryReaderEx, BinaryReaderHandlesHolder { +public class BinaryReaderExImpl implements BinaryReaderEx { /** Binary context. */ private final BinaryContext ctx; @@ -335,7 +334,7 @@ public final BinaryClassDescriptor descriptor() { public final Object unmarshal(int offset) throws BinaryObjectException { streamPosition(offset); - return in.position() >= 0 ? unmarshal(in, ctx, ldr, this) : null; + return in.position() >= 0 ? unmarshal(in, ctx, ldr) : null; } /** @@ -345,7 +344,7 @@ public final Object unmarshal(int offset) throws BinaryObjectException { */ public final Object unmarshalField(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? unmarshal(in, ctx, ldr, this) : null; + return findFieldByName(fieldName) ? unmarshal(in, ctx, ldr) : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -358,7 +357,7 @@ public final Object unmarshalField(String fieldName) throws BinaryObjectExceptio * @throws BinaryObjectException In case of error. */ public final Object unmarshalField(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? unmarshal(in, ctx, ldr, this) : null; + return findFieldById(fieldId) ? unmarshal(in, ctx, ldr) : null; } /** @@ -393,18 +392,32 @@ public final Object unmarshalField(int fieldId) throws BinaryObjectException { return null; } - /** {@inheritDoc} */ - @Override public final void setHandle(Object obj, int pos) { + /** + * Set handle. + * + * @param obj Object. + * @param pos Position. + */ + public final void setHandle(Object obj, int pos) { handles().put(pos, obj); } - /** {@inheritDoc} */ - @Override public final Object getHandle(int pos) { + /** + * Get handle. + * + * @param pos Position. + * @return Handle. + */ + public final Object getHandle(int pos) { return hnds != null ? hnds.get(pos) : null; } - /** {@inheritDoc} */ - @Override public final BinaryReaderHandles handles() { + /** + * Get all handles. + * + * @return Handles. + */ + public final BinaryReaderHandles handles() { if (hnds == null) hnds = new BinaryReaderHandles(); @@ -427,7 +440,7 @@ private T readHandleField() { streamPosition(handlePos); - obj = doReadObject(in, ctx, ldr, this); + obj = doReadObject(in, ctx, ldr); streamPosition(retPos); } @@ -1310,7 +1323,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public final T readObject(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? (T)doReadObject(in, ctx, ldr, this) : null; + return findFieldByName(fieldName) ? (T)doReadObject(in, ctx, ldr) : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -1323,12 +1336,12 @@ final double readDouble(int fieldId) throws BinaryObjectException { * @throws BinaryObjectException In case of error. */ @Nullable final Object readObject(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? doReadObject(in, ctx, ldr, this) : null; + return findFieldById(fieldId) ? doReadObject(in, ctx, ldr) : null; } /** {@inheritDoc} */ @Override public final Object readObject() throws BinaryObjectException { - return doReadObject(in, ctx, ldr, this); + return doReadObject(in, ctx, ldr); } /** {@inheritDoc} */ @@ -1338,7 +1351,16 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public final Object readObjectDetached(boolean deserialize) throws BinaryObjectException { - return unmarshal(in, ctx, ldr, new BinaryReaderHandlesHolderImpl(), true, deserialize); + BinaryReaderHandles hnds = this.hnds; + + this.hnds = null; + + try { + return unmarshal(in, ctx, ldr, true, deserialize); + } + finally { + this.hnds = hnds; + } } /** {@inheritDoc} */ @@ -1364,7 +1386,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Nullable @Override public final Object[] readObjectArray() throws BinaryObjectException { switch (checkFlag(OBJ_ARR)) { case NORMAL: - return doReadObjectArray(in, ctx, ldr, this, false, true); + return doReadObjectArray(in, ctx, ldr, false, true); case HANDLE: Object arr = readHandleField(); @@ -1547,7 +1569,7 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) throws BinaryObjectException { switch (checkFlag(COL)) { case NORMAL: - return (Collection)doReadCollection(in, ctx, ldr, this, false, true, factory); + return doReadCollection(in, ctx, ldr, false, true, factory); case HANDLE: { int handlePos = positionForHandle(in) - in.readInt(); @@ -1625,7 +1647,7 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) private Map readMap0(@Nullable BinaryMapFactory factory) throws BinaryObjectException { switch (checkFlag(MAP)) { case NORMAL: - return (Map)doReadMap(in, ctx, ldr, this, false, true, factory); + return doReadMap(in, ctx, ldr, false, true, factory); case HANDLE: { int handlePos = positionForHandle(in) - in.readInt(); @@ -1757,7 +1779,7 @@ private String fieldFlagName(byte flag) { streamPosition(handlePos); - obj = doReadObject(in, ctx, ldr, this); + obj = doReadObject(in, ctx, ldr); streamPosition(retPos); } @@ -1920,17 +1942,17 @@ private String fieldFlagName(byte flag) { break; case OBJ_ARR: - obj = doReadObjectArray(in, ctx, ldr, this, false, true); + obj = doReadObjectArray(in, ctx, ldr, false, true); break; case COL: - obj = doReadCollection(in, ctx, ldr, this, false, true, null); + obj = doReadCollection(in, ctx, ldr, false, true, null); break; case MAP: - obj = doReadMap(in, ctx, ldr, this, false, true, null); + obj = doReadMap(in, ctx, ldr, false, true, null); break; @@ -1962,7 +1984,7 @@ private String fieldFlagName(byte flag) { break; case PROXY: - obj = doReadProxy(in, ctx, ldr, this); + obj = doReadProxy(in, ctx, ldr); break; @@ -2470,11 +2492,6 @@ private void streamPositionRandom(int pos) { return in.remaining(); } - /** {@inheritDoc} */ - @Override public final boolean isEmpty() { - return hnds == null || hnds.isEmpty(); - } - /** {@inheritDoc} */ @Override public final void close() throws IOException { // No-op. @@ -3285,14 +3302,13 @@ private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader l * @return Value. */ @SuppressWarnings("ConstantConditions") - private Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) { + private Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) { Class[] intfs = new Class[in.readInt()]; for (int i = 0; i < intfs.length; i++) intfs[i] = doReadClass(in, ctx, ldr); - InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr, handles); + InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr); return Proxy.newProxyInstance(ldr != null ? ldr : CommonUtils.gridClassLoader(), intfs, ih); } @@ -3388,9 +3404,8 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) * @return Object. * @throws BinaryObjectException In case of error. */ - @Nullable private Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles) throws BinaryObjectException { - return new BinaryReaderExImpl(ctx, in, ldr, handles.handles(), false, true).deserialize(); + @Nullable private Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) throws BinaryObjectException { + return new BinaryReaderExImpl(ctx, in, ldr, handles(), false, true).deserialize(); } /** @@ -3400,18 +3415,16 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) @Nullable private Object unmarshal( BinaryInputStream in, BinaryContext ctx, - ClassLoader ldr, - BinaryReaderHandlesHolder handles + ClassLoader ldr ) throws BinaryObjectException { - return unmarshal(in, ctx, ldr, handles, false, false); + return unmarshal(in, ctx, ldr, false, false); } /** * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - @Nullable private Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { + @Nullable private Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean detach, boolean deserialize) throws BinaryObjectException { int start = in.position(); byte flag = in.readByte(); @@ -3423,14 +3436,14 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) case GridBinaryMarshaller.HANDLE: { int handlePos = start - in.readInt(); - Object obj = handles.getHandle(handlePos); + Object obj = getHandle(handlePos); if (obj == null) { int retPos = in.position(); in.position(handlePos); - obj = unmarshal(in, ctx, ldr, handles, detach, deserialize); + obj = unmarshal(in, ctx, ldr, detach, deserialize); in.position(retPos); } @@ -3450,7 +3463,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) binObj.detachAllowed(true); - po = binObj.detach(!handles.isEmpty()); + po = binObj.detach(hnds != null && !hnds.isEmpty()); } else { if (in.offheapPointer() == 0) @@ -3462,7 +3475,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) in.position(start + len); - handles.setHandle(po, start); + setHandle(po, start); return po; } @@ -3553,15 +3566,15 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) case GridBinaryMarshaller.OBJ_ARR: if (BinaryUtils.useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, false); + return doReadBinaryArray(in, ctx, ldr, detach, deserialize, false); else - return doReadObjectArray(in, ctx, ldr, handles, detach, deserialize); + return doReadObjectArray(in, ctx, ldr, detach, deserialize); case GridBinaryMarshaller.COL: - return doReadCollection(in, ctx, ldr, handles, detach, deserialize, null); + return doReadCollection(in, ctx, ldr, detach, deserialize, null); case GridBinaryMarshaller.MAP: - return doReadMap(in, ctx, ldr, handles, detach, deserialize, null); + return doReadMap(in, ctx, ldr, detach, deserialize, null); case GridBinaryMarshaller.BINARY_OBJ: return doReadBinaryObject(in, ctx, detach); @@ -3572,7 +3585,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) case GridBinaryMarshaller.ENUM_ARR: if (BinaryUtils.useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, handles, detach, deserialize, true); + return doReadBinaryArray(in, ctx, ldr, detach, deserialize, true); else { doReadEnumType(in); // Simply skip this part as we do not need it. @@ -3583,7 +3596,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) return doReadClass(in, ctx, ldr); case GridBinaryMarshaller.PROXY: - return doReadProxy(in, ctx, ldr, handles); + return doReadProxy(in, ctx, ldr); case GridBinaryMarshaller.OPTM_MARSH: return BinaryImplUtils.doReadOptimized(in, ctx, ldr); @@ -3597,14 +3610,13 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) * @param in Binary input stream. * @param ctx Binary context. * @param ldr Class loader. - * @param handles Holder for handles. * @param detach Detach flag. * @param deserialize Deep flag. * @return Value. * @throws BinaryObjectException In case of error. */ private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) throws BinaryObjectException { + boolean detach, boolean deserialize) throws BinaryObjectException { int hPos = positionForHandle(in); Class compType = doReadClass(in, ctx, ldr, deserialize); @@ -3615,10 +3627,10 @@ private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, Clas ? (Object[])Array.newInstance(compType, len) : new Object[len]; - handles.setHandle(arr, hPos); + setHandle(arr, hPos); for (int i = 0; i < len; i++) { - Object res = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + Object res = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); if (deserialize && BinaryUtils.useBinaryArrays() && res instanceof BinaryObject) arr[i] = ((BinaryObject)res).deserialize(ldr); @@ -3633,14 +3645,13 @@ private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, Clas * @param in Binary input stream. * @param ctx Binary context. * @param ldr Class loader. - * @param handles Holder for handles. * @param detach Detach flag. * @param deserialize Deep flag. * @return Value. * @throws BinaryObjectException In case of error. */ private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, boolean isEnumArray) { + boolean detach, boolean deserialize, boolean isEnumArray) { int hPos = positionForHandle(in); int compTypeId = in.readInt(); @@ -3657,10 +3668,10 @@ private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, C ? new BinaryEnumArray(ctx, compTypeId, compClsName, arr) : new BinaryArray(ctx, compTypeId, compClsName, arr); - handles.setHandle(res, hPos); + setHandle(res, hPos); for (int i = 0; i < len; i++) - arr[i] = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + arr[i] = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); return res; } @@ -3673,7 +3684,7 @@ private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, C */ @SuppressWarnings("unchecked") private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryCollectionFactory factory) + boolean detach, boolean deserialize, BinaryCollectionFactory factory) throws BinaryObjectException { int hPos = positionForHandle(in); @@ -3729,10 +3740,10 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, } } - handles.setHandle(col, hPos); + setHandle(col, hPos); for (int i = 0; i < size; i++) - col.add(deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize)); + col.add(deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize)); return colType == GridBinaryMarshaller.SINGLETON_LIST ? CommonUtils.convertToSingletonList(col) : col; } @@ -3745,7 +3756,7 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, */ @SuppressWarnings("unchecked") private Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize, BinaryMapFactory factory) + boolean detach, boolean deserialize, BinaryMapFactory factory) throws BinaryObjectException { int hPos = positionForHandle(in); @@ -3781,11 +3792,11 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, } } - handles.setHandle(map, hPos); + setHandle(map, hPos); for (int i = 0; i < size; i++) { - Object key = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); - Object val = deserializeOrUnmarshal(in, ctx, ldr, handles, detach, deserialize); + Object key = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); + Object val = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); map.put(key, val); } @@ -3800,8 +3811,8 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, * @return Result. */ private Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - BinaryReaderHandlesHolder handles, boolean detach, boolean deserialize) { - return deserialize ? doReadObject(in, ctx, ldr, handles) : unmarshal(in, ctx, ldr, handles, detach, deserialize); + boolean detach, boolean deserialize) { + return deserialize ? doReadObject(in, ctx, ldr) : unmarshal(in, ctx, ldr, detach, deserialize); } /** diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java deleted file mode 100644 index 5308d9e0766c4..0000000000000 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.binary; - -/** - * Holder for handles. - */ -interface BinaryReaderHandlesHolder { - /** - * Set handle. - * - * @param obj Object. - * @param pos Position. - */ - public void setHandle(Object obj, int pos); - - /** - * Get handle. - * - * @param pos Position. - * @return Handle. - */ - public Object getHandle(int pos); - - /** - * Get all handles. - * - * @return Handles. - */ - public BinaryReaderHandles handles(); - - /** */ - public boolean isEmpty(); -} diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java deleted file mode 100644 index 6adb2f2f1a747..0000000000000 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.binary; - -/** - * Simple holder for handles. - */ -class BinaryReaderHandlesHolderImpl implements BinaryReaderHandlesHolder { - /** Handles. */ - private BinaryReaderHandles hnds; - - /** {@inheritDoc} */ - @Override public void setHandle(Object obj, int pos) { - handles().put(pos, obj); - } - - /** {@inheritDoc} */ - @Override public Object getHandle(int pos) { - return hnds != null ? hnds.get(pos) : null; - } - - /** {@inheritDoc} */ - @Override public BinaryReaderHandles handles() { - if (hnds == null) - hnds = new BinaryReaderHandles(); - - return hnds; - } - - /** {@inheritDoc} */ - @Override public boolean isEmpty() { - return hnds == null || hnds.isEmpty(); - } -} From d02dc5083576bf3ad7d626358a9ca3183f3e292a Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 2 Oct 2026 18:17:01 +0300 Subject: [PATCH 32/33] IGNITE-29094 Remove useless byte array creation --- .../apache/ignite/internal/binary/BinaryReaderExImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 0140da3308248..093643098869e 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -3424,7 +3424,13 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - @Nullable private Object unmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean detach, boolean deserialize) throws BinaryObjectException { + @Nullable private Object unmarshal( + BinaryInputStream in, + BinaryContext ctx, + ClassLoader ldr, + boolean detach, + boolean deserialize + ) throws BinaryObjectException { int start = in.position(); byte flag = in.readByte(); From 3a5b104c5e16cec552fea7ad3b45db7d1df9e7b5 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 2 Oct 2026 18:55:52 +0300 Subject: [PATCH 33/33] IGNITE-29094 Remove useless byte array creation --- .../internal/binary/BinaryReaderExImpl.java | 386 ++++++++---------- 1 file changed, 174 insertions(+), 212 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 093643098869e..1160a79de14d4 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -276,7 +276,7 @@ public BinaryReaderExImpl(BinaryContext ctx, if (forUnmarshal) { // Registers class by type ID, at least locally if the cache is not ready yet. - desc = ctx.registerClass(doReadClass(in, ctx, ldr, typeId0), true, false); + desc = ctx.registerClass(doReadClass(typeId0), true, false); typeId = desc.typeId(); } @@ -334,7 +334,7 @@ public final BinaryClassDescriptor descriptor() { public final Object unmarshal(int offset) throws BinaryObjectException { streamPosition(offset); - return in.position() >= 0 ? unmarshal(in, ctx, ldr) : null; + return in.position() >= 0 ? unmarshal() : null; } /** @@ -344,7 +344,7 @@ public final Object unmarshal(int offset) throws BinaryObjectException { */ public final Object unmarshalField(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? unmarshal(in, ctx, ldr) : null; + return findFieldByName(fieldName) ? unmarshal() : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -357,7 +357,7 @@ public final Object unmarshalField(String fieldName) throws BinaryObjectExceptio * @throws BinaryObjectException In case of error. */ public final Object unmarshalField(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? unmarshal(in, ctx, ldr) : null; + return findFieldById(fieldId) ? unmarshal() : null; } /** @@ -386,7 +386,7 @@ public final Object unmarshalField(int fieldId) throws BinaryObjectException { if (checkFlag(CLASS) == Flag.NULL) return null; - return doReadClass(in, ctx, ldr); + return doReadClass(); } return null; @@ -431,7 +431,7 @@ public final BinaryReaderHandles handles() { * @return Field. */ private T readHandleField() { - int handlePos = positionForHandle(in) - in.readInt(); + int handlePos = positionForHandle() - in.readInt(); Object obj = getHandle(handlePos); @@ -440,7 +440,7 @@ private T readHandleField() { streamPosition(handlePos); - obj = doReadObject(in, ctx, ldr); + obj = doReadObject(); streamPosition(retPos); } @@ -584,7 +584,7 @@ final boolean readBoolean(int fieldId) throws BinaryObjectException { @Nullable @Override public final boolean[] readBooleanArray() throws BinaryObjectException { switch (checkFlag(BOOLEAN_ARR)) { case NORMAL: - return doReadBooleanArray(in); + return doReadBooleanArray(); case HANDLE: return readHandleField(); @@ -650,7 +650,7 @@ final short readShort(int fieldId) throws BinaryObjectException { @Nullable @Override public final short[] readShortArray() throws BinaryObjectException { switch (checkFlag(SHORT_ARR)) { case NORMAL: - return doReadShortArray(in); + return doReadShortArray(); case HANDLE: return readHandleField(); @@ -716,7 +716,7 @@ final char readChar(int fieldId) throws BinaryObjectException { @Nullable @Override public final char[] readCharArray() throws BinaryObjectException { switch (checkFlag(CHAR_ARR)) { case NORMAL: - return doReadCharArray(in); + return doReadCharArray(); case HANDLE: return readHandleField(); @@ -782,7 +782,7 @@ final int readInt(int fieldId) throws BinaryObjectException { @Nullable @Override public final int[] readIntArray() throws BinaryObjectException { switch (checkFlag(INT_ARR)) { case NORMAL: - return doReadIntArray(in); + return doReadIntArray(); case HANDLE: return readHandleField(); @@ -848,7 +848,7 @@ final long readLong(int fieldId) throws BinaryObjectException { @Nullable @Override public final long[] readLongArray() throws BinaryObjectException { switch (checkFlag(LONG_ARR)) { case NORMAL: - return doReadLongArray(in); + return doReadLongArray(); case HANDLE: return readHandleField(); @@ -914,7 +914,7 @@ final float readFloat(int fieldId) throws BinaryObjectException { @Nullable @Override public final float[] readFloatArray() throws BinaryObjectException { switch (checkFlag(FLOAT_ARR)) { case NORMAL: - return doReadFloatArray(in); + return doReadFloatArray(); case HANDLE: return readHandleField(); @@ -980,7 +980,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Nullable @Override public final double[] readDoubleArray() throws BinaryObjectException { switch (checkFlag(DOUBLE_ARR)) { case NORMAL: - return doReadDoubleArray(in); + return doReadDoubleArray(); case HANDLE: return readHandleField(); @@ -1011,7 +1011,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public final BigDecimal readDecimal() throws BinaryObjectException { - return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? doReadDecimal(in) : null; + return checkFlagNoHandles(DECIMAL) == Flag.NORMAL ? doReadDecimal() : null; } /** {@inheritDoc} */ @@ -1037,7 +1037,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Override @Nullable public final BigDecimal[] readDecimalArray() throws BinaryObjectException { switch (checkFlag(DECIMAL_ARR)) { case NORMAL: - return doReadDecimalArray(in); + return doReadDecimalArray(); case HANDLE: return readHandleField(); @@ -1125,7 +1125,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public final UUID readUuid() throws BinaryObjectException { - return checkFlagNoHandles(UUID) == Flag.NORMAL ? doReadUuid(in) : null; + return checkFlagNoHandles(UUID) == Flag.NORMAL ? doReadUuid() : null; } /** {@inheritDoc} */ @@ -1151,7 +1151,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Override @Nullable public final UUID[] readUuidArray() throws BinaryObjectException { switch (checkFlag(UUID_ARR)) { case NORMAL: - return doReadUuidArray(in); + return doReadUuidArray(); case HANDLE: return readHandleField(); @@ -1182,7 +1182,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public final Date readDate() throws BinaryObjectException { - return checkFlagNoHandles(DATE) == Flag.NORMAL ? doReadDate(in) : null; + return checkFlagNoHandles(DATE) == Flag.NORMAL ? doReadDate() : null; } /** {@inheritDoc} */ @@ -1208,7 +1208,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Override @Nullable public final Date[] readDateArray() throws BinaryObjectException { switch (checkFlag(DATE_ARR)) { case NORMAL: - return doReadDateArray(in); + return doReadDateArray(); case HANDLE: return readHandleField(); @@ -1239,7 +1239,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public final Timestamp readTimestamp() throws BinaryObjectException { - return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? doReadTimestamp(in) : null; + return checkFlagNoHandles(TIMESTAMP) == Flag.NORMAL ? doReadTimestamp() : null; } /** {@inheritDoc} */ @@ -1265,7 +1265,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Override @Nullable public final Timestamp[] readTimestampArray() throws BinaryObjectException { switch (checkFlag(TIMESTAMP_ARR)) { case NORMAL: - return doReadTimestampArray(in); + return doReadTimestampArray(); case HANDLE: return readHandleField(); @@ -1282,7 +1282,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Override @Nullable public final Time readTime() throws BinaryObjectException { - return checkFlagNoHandles(TIME) == Flag.NORMAL ? doReadTime(in) : null; + return checkFlagNoHandles(TIME) == Flag.NORMAL ? doReadTime() : null; } /** {@inheritDoc} */ @@ -1312,7 +1312,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Override @Nullable public final Time[] readTimeArray() throws BinaryObjectException { switch (checkFlag(TIME_ARR)) { case NORMAL: - return doReadTimeArray(in); + return doReadTimeArray(); case HANDLE: return readHandleField(); default: @@ -1323,7 +1323,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { /** {@inheritDoc} */ @Nullable @Override public final T readObject(String fieldName) throws BinaryObjectException { try { - return findFieldByName(fieldName) ? (T)doReadObject(in, ctx, ldr) : null; + return findFieldByName(fieldName) ? (T)doReadObject() : null; } catch (Exception ex) { throw wrapFieldException(fieldName, ex); @@ -1336,12 +1336,12 @@ final double readDouble(int fieldId) throws BinaryObjectException { * @throws BinaryObjectException In case of error. */ @Nullable final Object readObject(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? doReadObject(in, ctx, ldr) : null; + return findFieldById(fieldId) ? doReadObject() : null; } /** {@inheritDoc} */ @Override public final Object readObject() throws BinaryObjectException { - return doReadObject(in, ctx, ldr); + return doReadObject(); } /** {@inheritDoc} */ @@ -1356,7 +1356,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { this.hnds = null; try { - return unmarshal(in, ctx, ldr, true, deserialize); + return unmarshal(true, deserialize); } finally { this.hnds = hnds; @@ -1386,7 +1386,7 @@ final double readDouble(int fieldId) throws BinaryObjectException { @Nullable @Override public final Object[] readObjectArray() throws BinaryObjectException { switch (checkFlag(OBJ_ARR)) { case NORMAL: - return doReadObjectArray(in, ctx, ldr, false, true); + return doReadObjectArray(false, true); case HANDLE: Object arr = readHandleField(); @@ -1436,12 +1436,12 @@ final double readDouble(int fieldId) throws BinaryObjectException { private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { if (checkFlagNoHandles(ENUM) == Flag.NORMAL) { // Read class even if we know it in advance to set correct stream position. - Class cls0 = doReadClass(in, ctx, ldr); + Class cls0 = doReadClass(); if (cls == null) cls = cls0; - return doReadEnum(in, cls); + return doReadEnum(cls); } else return null; @@ -1465,7 +1465,7 @@ private Enum readEnum0(@Nullable Class cls) throws BinaryObjectException { * @throws BinaryObjectException If failed. */ @Nullable final BinaryObjectEx readBinaryEnum(int fieldId) throws BinaryObjectException { - return findFieldById(fieldId) ? doReadBinaryEnum(in, ctx) : null; + return findFieldById(fieldId) ? doReadBinaryEnum() : null; } /** @@ -1494,12 +1494,12 @@ private Object[] readEnumArray0(@Nullable Class cls) throws BinaryObjectExcep switch (checkFlag(ENUM_ARR)) { case NORMAL: // Read class even if we know it in advance to set correct stream position. - Class cls0 = doReadClass(in, ctx, ldr); + Class cls0 = doReadClass(); if (cls == null) cls = cls0; - return doReadEnumArray(in, ctx, ldr, cls); + return doReadEnumArray(cls); case HANDLE: Object arr = readHandleField(); @@ -1569,10 +1569,10 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) throws BinaryObjectException { switch (checkFlag(COL)) { case NORMAL: - return doReadCollection(in, ctx, ldr, false, true, factory); + return doReadCollection(false, true, factory); case HANDLE: { - int handlePos = positionForHandle(in) - in.readInt(); + int handlePos = positionForHandle() - in.readInt(); Object obj = getHandle(handlePos); @@ -1647,10 +1647,10 @@ private Collection readCollection0(@Nullable BinaryCollectionFactory factory) private Map readMap0(@Nullable BinaryMapFactory factory) throws BinaryObjectException { switch (checkFlag(MAP)) { case NORMAL: - return doReadMap(in, ctx, ldr, false, true, factory); + return doReadMap(false, true, factory); case HANDLE: { - int handlePos = positionForHandle(in) - in.readInt(); + int handlePos = positionForHandle() - in.readInt(); Object obj = getHandle(handlePos); @@ -1689,7 +1689,7 @@ else if (flag == NULL) else if (flag == HANDLE) return Flag.HANDLE; - int pos = positionForHandle(in); + int pos = positionForHandle(); throw new BinaryObjectException("Unexpected field type [pos=" + pos + ", expected=" + fieldFlagName(expFlag) + ", actual=" + fieldFlagName(flag) + ']'); @@ -1710,7 +1710,7 @@ private Flag checkFlagNoHandles(byte expFlag) { else if (flag == NULL) return Flag.NULL; - int pos = positionForHandle(in); + int pos = positionForHandle(); throw new BinaryObjectException("Unexpected field type [pos=" + pos + ", expected=" + fieldFlagName(expFlag) + ", actual=" + fieldFlagName(flag) + ']'); @@ -1779,7 +1779,7 @@ private String fieldFlagName(byte flag) { streamPosition(handlePos); - obj = doReadObject(in, ctx, ldr); + obj = doReadObject(); streamPosition(retPos); } @@ -1842,7 +1842,7 @@ private String fieldFlagName(byte flag) { break; case DECIMAL: - obj = doReadDecimal(in); + obj = doReadDecimal(); break; @@ -1852,22 +1852,22 @@ private String fieldFlagName(byte flag) { break; case UUID: - obj = doReadUuid(in); + obj = doReadUuid(); break; case DATE: - obj = doReadDate(in); + obj = doReadDate(); break; case TIMESTAMP: - obj = doReadTimestamp(in); + obj = doReadTimestamp(); break; case TIME: - obj = doReadTime(in); + obj = doReadTime(); break; @@ -1877,42 +1877,42 @@ private String fieldFlagName(byte flag) { break; case SHORT_ARR: - obj = doReadShortArray(in); + obj = doReadShortArray(); break; case INT_ARR: - obj = doReadIntArray(in); + obj = doReadIntArray(); break; case LONG_ARR: - obj = doReadLongArray(in); + obj = doReadLongArray(); break; case FLOAT_ARR: - obj = doReadFloatArray(in); + obj = doReadFloatArray(); break; case DOUBLE_ARR: - obj = doReadDoubleArray(in); + obj = doReadDoubleArray(); break; case CHAR_ARR: - obj = doReadCharArray(in); + obj = doReadCharArray(); break; case BOOLEAN_ARR: - obj = doReadBooleanArray(in); + obj = doReadBooleanArray(); break; case DECIMAL_ARR: - obj = doReadDecimalArray(in); + obj = doReadDecimalArray(); break; @@ -1922,69 +1922,69 @@ private String fieldFlagName(byte flag) { break; case UUID_ARR: - obj = doReadUuidArray(in); + obj = doReadUuidArray(); break; case DATE_ARR: - obj = doReadDateArray(in); + obj = doReadDateArray(); break; case TIMESTAMP_ARR: - obj = doReadTimestampArray(in); + obj = doReadTimestampArray(); break; case TIME_ARR: - obj = doReadTimeArray(in); + obj = doReadTimeArray(); break; case OBJ_ARR: - obj = doReadObjectArray(in, ctx, ldr, false, true); + obj = doReadObjectArray(false, true); break; case COL: - obj = doReadCollection(in, ctx, ldr, false, true, null); + obj = doReadCollection(false, true, null); break; case MAP: - obj = doReadMap(in, ctx, ldr, false, true, null); + obj = doReadMap(false, true, null); break; case BINARY_OBJ: - obj = doReadBinaryObject(in, ctx, false); + obj = doReadBinaryObject(false); ((BinaryObjectImpl)obj).context(ctx); break; case ENUM: - obj = doReadEnum(in, doReadClass(in, ctx, ldr)); + obj = doReadEnum(doReadClass()); break; case ENUM_ARR: - obj = doReadEnumArray(in, ctx, ldr, doReadClass(in, ctx, ldr)); + obj = doReadEnumArray(doReadClass()); break; case BINARY_ENUM: - obj = doReadBinaryEnum(in, ctx); + obj = doReadBinaryEnum(); break; case CLASS: - obj = doReadClass(in, ctx, ldr); + obj = doReadClass(); break; case PROXY: - obj = doReadProxy(in, ctx, ldr); + obj = doReadProxy(); break; @@ -2111,61 +2111,61 @@ public final BinarySchema getOrCreateSchema() { return BinaryUtils.doReadString(in()); case GridBinaryMarshaller.DECIMAL: - return doReadDecimal(in()); + return doReadDecimal(); case GridBinaryMarshaller.UUID: - return doReadUuid(in()); + return doReadUuid(); case GridBinaryMarshaller.TIME: - return doReadTime(in()); + return doReadTime(); case GridBinaryMarshaller.TIMESTAMP: - return doReadTimestamp(in()); + return doReadTimestamp(); case GridBinaryMarshaller.DATE: - return doReadDate(in()); + return doReadDate(); case GridBinaryMarshaller.BOOLEAN_ARR: - return doReadBooleanArray(in()); + return doReadBooleanArray(); case GridBinaryMarshaller.BYTE_ARR: return BinaryUtils.doReadByteArray(in()); case GridBinaryMarshaller.CHAR_ARR: - return doReadCharArray(in()); + return doReadCharArray(); case GridBinaryMarshaller.SHORT_ARR: - return doReadShortArray(in()); + return doReadShortArray(); case GridBinaryMarshaller.INT_ARR: - return doReadIntArray(in()); + return doReadIntArray(); case GridBinaryMarshaller.LONG_ARR: - return doReadLongArray(in()); + return doReadLongArray(); case GridBinaryMarshaller.FLOAT_ARR: - return doReadFloatArray(in()); + return doReadFloatArray(); case GridBinaryMarshaller.DOUBLE_ARR: - return doReadDoubleArray(in()); + return doReadDoubleArray(); case GridBinaryMarshaller.STRING_ARR: return BinaryUtils.doReadStringArray(in()); case GridBinaryMarshaller.DECIMAL_ARR: - return doReadDecimalArray(in()); + return doReadDecimalArray(); case GridBinaryMarshaller.UUID_ARR: - return doReadUuidArray(in()); + return doReadUuidArray(); case GridBinaryMarshaller.TIME_ARR: - return doReadTimeArray(in()); + return doReadTimeArray(); case GridBinaryMarshaller.TIMESTAMP_ARR: - return doReadTimestampArray(in()); + return doReadTimestampArray(); case GridBinaryMarshaller.DATE_ARR: - return doReadDateArray(in()); + return doReadDateArray(); default: in().position(in().position() - 1); @@ -2888,19 +2888,17 @@ protected final Object readFixedType(BinaryFieldDescriptor fld) throws BinaryObj /** * Read binary enum. * - * @param in Input stream. - * @param ctx Binary context. * @return Enum. */ - private BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx) { - return doReadBinaryEnum(in, ctx, doReadEnumType(in)); + private BinaryObjectEx doReadBinaryEnum() { + return doReadBinaryEnum(doReadEnumType()); } /** * @param cls Enum class. * @return Value. */ - private Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, Class cls) + private Object[] doReadEnumArray(Class cls) throws BinaryObjectException { int len = in.readInt(); @@ -2912,7 +2910,7 @@ private Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, ClassL if (flag == GridBinaryMarshaller.NULL) arr[i] = null; else - arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr)); + arr[i] = doReadEnum(doReadClass()); } return arr; @@ -2924,7 +2922,7 @@ private Object[] doReadEnumArray(BinaryInputStream in, BinaryContext ctx, ClassL * @param cls Enum class. * @return Value. */ - private Enum doReadEnum(BinaryInputStream in, Class cls) throws BinaryObjectException { + private Enum doReadEnum(Class cls) throws BinaryObjectException { assert cls != null; if (!cls.isEnum()) @@ -2991,7 +2989,7 @@ private enum Flag { /** * @return Value. */ - private boolean[] doReadBooleanArray(BinaryInputStream in) { + private boolean[] doReadBooleanArray() { int len = in.readInt(); return in.readBooleanArray(len); @@ -3000,7 +2998,7 @@ private boolean[] doReadBooleanArray(BinaryInputStream in) { /** * @return Value. */ - private short[] doReadShortArray(BinaryInputStream in) { + private short[] doReadShortArray() { int len = in.readInt(); return in.readShortArray(len); @@ -3009,7 +3007,7 @@ private short[] doReadShortArray(BinaryInputStream in) { /** * @return Value. */ - private char[] doReadCharArray(BinaryInputStream in) { + private char[] doReadCharArray() { int len = in.readInt(); return in.readCharArray(len); @@ -3018,7 +3016,7 @@ private char[] doReadCharArray(BinaryInputStream in) { /** * @return Value. */ - private int[] doReadIntArray(BinaryInputStream in) { + private int[] doReadIntArray() { int len = in.readInt(); return in.readIntArray(len); @@ -3027,7 +3025,7 @@ private int[] doReadIntArray(BinaryInputStream in) { /** * @return Value. */ - private long[] doReadLongArray(BinaryInputStream in) { + private long[] doReadLongArray() { int len = in.readInt(); return in.readLongArray(len); @@ -3036,7 +3034,7 @@ private long[] doReadLongArray(BinaryInputStream in) { /** * @return Value. */ - private float[] doReadFloatArray(BinaryInputStream in) { + private float[] doReadFloatArray() { int len = in.readInt(); return in.readFloatArray(len); @@ -3045,7 +3043,7 @@ private float[] doReadFloatArray(BinaryInputStream in) { /** * @return Value. */ - private double[] doReadDoubleArray(BinaryInputStream in) { + private double[] doReadDoubleArray() { int len = in.readInt(); return in.readDoubleArray(len); @@ -3054,7 +3052,7 @@ private double[] doReadDoubleArray(BinaryInputStream in) { /** * @return Value. */ - private BigDecimal doReadDecimal(BinaryInputStream in) { + private BigDecimal doReadDecimal() { int scale = in.readInt(); byte[] mag = BinaryUtils.doReadByteArray(in); @@ -3074,14 +3072,14 @@ private BigDecimal doReadDecimal(BinaryInputStream in) { /** * @return Value. */ - private UUID doReadUuid(BinaryInputStream in) { + private UUID doReadUuid() { return new UUID(in.readLong(), in.readLong()); } /** * @return Value. */ - private Date doReadDate(BinaryInputStream in) { + private Date doReadDate() { long time = in.readLong(); return new Date(time); @@ -3090,7 +3088,7 @@ private Date doReadDate(BinaryInputStream in) { /** * @return Value. */ - private Timestamp doReadTimestamp(BinaryInputStream in) { + private Timestamp doReadTimestamp() { long time = in.readLong(); int nanos = in.readInt(); @@ -3104,7 +3102,7 @@ private Timestamp doReadTimestamp(BinaryInputStream in) { /** * @return Value. */ - private Time doReadTime(BinaryInputStream in) { + private Time doReadTime() { long time = in.readLong(); return new Time(time); @@ -3114,7 +3112,7 @@ private Time doReadTime(BinaryInputStream in) { * @return Value. * @throws BinaryObjectException In case of error. */ - private BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjectException { + private BigDecimal[] doReadDecimalArray() throws BinaryObjectException { int len = in.readInt(); BigDecimal[] arr = new BigDecimal[len]; @@ -3128,7 +3126,7 @@ private BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjec if (flag != GridBinaryMarshaller.DECIMAL) throw new BinaryObjectException("Invalid flag value: " + flag); - arr[i] = doReadDecimal(in); + arr[i] = doReadDecimal(); } } @@ -3139,7 +3137,7 @@ private BigDecimal[] doReadDecimalArray(BinaryInputStream in) throws BinaryObjec * @return Value. * @throws BinaryObjectException In case of error. */ - private UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectException { + private UUID[] doReadUuidArray() throws BinaryObjectException { int len = in.readInt(); UUID[] arr = new UUID[len]; @@ -3153,7 +3151,7 @@ private UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectExceptio if (flag != GridBinaryMarshaller.UUID) throw new BinaryObjectException("Invalid flag value: " + flag); - arr[i] = doReadUuid(in); + arr[i] = doReadUuid(); } } @@ -3164,7 +3162,7 @@ private UUID[] doReadUuidArray(BinaryInputStream in) throws BinaryObjectExceptio * @return Value. * @throws BinaryObjectException In case of error. */ - private Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectException { + private Date[] doReadDateArray() throws BinaryObjectException { int len = in.readInt(); Date[] arr = new Date[len]; @@ -3178,7 +3176,7 @@ private Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectExceptio if (flag != GridBinaryMarshaller.DATE) throw new BinaryObjectException("Invalid flag value: " + flag); - arr[i] = doReadDate(in); + arr[i] = doReadDate(); } } @@ -3189,7 +3187,7 @@ private Date[] doReadDateArray(BinaryInputStream in) throws BinaryObjectExceptio * @return Value. * @throws BinaryObjectException In case of error. */ - private Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObjectException { + private Timestamp[] doReadTimestampArray() throws BinaryObjectException { int len = in.readInt(); Timestamp[] arr = new Timestamp[len]; @@ -3203,7 +3201,7 @@ private Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObje if (flag != GridBinaryMarshaller.TIMESTAMP) throw new BinaryObjectException("Invalid flag value: " + flag); - arr[i] = doReadTimestamp(in); + arr[i] = doReadTimestamp(); } } @@ -3214,7 +3212,7 @@ private Timestamp[] doReadTimestampArray(BinaryInputStream in) throws BinaryObje * @return Value. * @throws BinaryObjectException In case of error. */ - private Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectException { + private Time[] doReadTimeArray() throws BinaryObjectException { int len = in.readInt(); Time[] arr = new Time[len]; @@ -3228,7 +3226,7 @@ private Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectExceptio if (flag != GridBinaryMarshaller.TIME) throw new BinaryObjectException("Invalid flag value: " + flag); - arr[i] = doReadTime(in); + arr[i] = doReadTime(); } } @@ -3238,7 +3236,7 @@ private Time[] doReadTimeArray(BinaryInputStream in) throws BinaryObjectExceptio /** * @return Value. */ - private BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, boolean detach) { + private BinaryObject doReadBinaryObject(boolean detach) { if (in.offheapPointer() > 0) { int len = in.readInt(); @@ -3264,26 +3262,20 @@ private BinaryObject doReadBinaryObject(BinaryInputStream in, BinaryContext ctx, } /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. * @return Class object specified at the input stream. * @throws BinaryObjectException If failed. */ - private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) + private Class doReadClass() throws BinaryObjectException { - return doReadClass(in, ctx, ldr, true); + return doReadClass(true); } /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. * @param deserialize Doesn't load the class when the flag is {@code false}. Class information is skipped. * @return Class object specified at the input stream if {@code deserialize == true}. Otherwise returns {@code null} * @throws BinaryObjectException If failed. */ - private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, boolean deserialize) + private Class doReadClass(boolean deserialize) throws BinaryObjectException { int typeId = in.readInt(); @@ -3295,20 +3287,20 @@ private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader l return null; } - return doReadClass(in, ctx, ldr, typeId); + return doReadClass(typeId); } /** * @return Value. */ @SuppressWarnings("ConstantConditions") - private Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) { + private Object doReadProxy() { Class[] intfs = new Class[in.readInt()]; for (int i = 0; i < intfs.length; i++) - intfs[i] = doReadClass(in, ctx, ldr); + intfs[i] = doReadClass(); - InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr); + InvocationHandler ih = (InvocationHandler)doReadObject(); return Proxy.newProxyInstance(ldr != null ? ldr : CommonUtils.gridClassLoader(), intfs, ih); } @@ -3316,10 +3308,9 @@ private Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader /** * Read plain type. * - * @param in Input stream. * @return Plain type. */ - private EnumType doReadEnumType(BinaryInputStream in) { + private EnumType doReadEnumType() { int typeId = in.readInt(); if (typeId != GridBinaryMarshaller.UNREGISTERED_TYPE_ID) @@ -3332,14 +3323,11 @@ private EnumType doReadEnumType(BinaryInputStream in) { } /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. * @param typeId Type id. * @return Class object specified at the input stream. * @throws BinaryObjectException If failed. */ - private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, int typeId) + private Class doReadClass(int typeId) throws BinaryObjectException { Class cls; @@ -3366,24 +3354,19 @@ private Class doReadClass(BinaryInputStream in, BinaryContext ctx, ClassLoader l /** * Read binary enum. * - * @param in Input stream. - * @param ctx Binary context. * @param type Plain type. * @return Enum. */ - private BinaryObjectEx doReadBinaryEnum(BinaryInputStream in, BinaryContext ctx, - EnumType type) { + private BinaryObjectEx doReadBinaryEnum(EnumType type) { return BinaryUtils.binariesFactory.binaryEnum(ctx, type.typeId, type.clsName, in.readInt()); } /** * Read binary enum array. * - * @param in Input stream. - * @param ctx Binary context. * @return Enum array. */ - private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) { + private Object[] doReadBinaryEnumArray() { int len = in.readInt(); Object[] arr = (Object[])Array.newInstance(BinaryUtils.binariesFactory.binaryEnumClass(), len); @@ -3394,7 +3377,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) if (flag == GridBinaryMarshaller.NULL) arr[i] = null; else - arr[i] = doReadBinaryEnum(in, ctx, doReadEnumType(in)); + arr[i] = doReadBinaryEnum(doReadEnumType()); } return arr; @@ -3404,7 +3387,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) * @return Object. * @throws BinaryObjectException In case of error. */ - @Nullable private Object doReadObject(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr) throws BinaryObjectException { + @Nullable private Object doReadObject() throws BinaryObjectException { return new BinaryReaderExImpl(ctx, in, ldr, handles(), false, true).deserialize(); } @@ -3412,25 +3395,15 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - @Nullable private Object unmarshal( - BinaryInputStream in, - BinaryContext ctx, - ClassLoader ldr - ) throws BinaryObjectException { - return unmarshal(in, ctx, ldr, false, false); + @Nullable private Object unmarshal() throws BinaryObjectException { + return unmarshal(false, false); } /** * @return Unmarshalled value. * @throws BinaryObjectException In case of error. */ - @Nullable private Object unmarshal( - BinaryInputStream in, - BinaryContext ctx, - ClassLoader ldr, - boolean detach, - boolean deserialize - ) throws BinaryObjectException { + @Nullable private Object unmarshal(boolean detach, boolean deserialize) throws BinaryObjectException { int start = in.position(); byte flag = in.readByte(); @@ -3449,7 +3422,7 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) in.position(handlePos); - obj = unmarshal(in, ctx, ldr, detach, deserialize); + obj = unmarshal(detach, deserialize); in.position(retPos); } @@ -3511,98 +3484,98 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) return in.readBoolean(); case GridBinaryMarshaller.DECIMAL: - return doReadDecimal(in); + return doReadDecimal(); case GridBinaryMarshaller.STRING: return BinaryUtils.doReadString(in); case GridBinaryMarshaller.UUID: - return doReadUuid(in); + return doReadUuid(); case GridBinaryMarshaller.DATE: - return doReadDate(in); + return doReadDate(); case GridBinaryMarshaller.TIMESTAMP: - return doReadTimestamp(in); + return doReadTimestamp(); case GridBinaryMarshaller.TIME: - return doReadTime(in); + return doReadTime(); case GridBinaryMarshaller.BYTE_ARR: return BinaryUtils.doReadByteArray(in); case GridBinaryMarshaller.SHORT_ARR: - return doReadShortArray(in); + return doReadShortArray(); case GridBinaryMarshaller.INT_ARR: - return doReadIntArray(in); + return doReadIntArray(); case GridBinaryMarshaller.LONG_ARR: - return doReadLongArray(in); + return doReadLongArray(); case GridBinaryMarshaller.FLOAT_ARR: - return doReadFloatArray(in); + return doReadFloatArray(); case GridBinaryMarshaller.DOUBLE_ARR: - return doReadDoubleArray(in); + return doReadDoubleArray(); case GridBinaryMarshaller.CHAR_ARR: - return doReadCharArray(in); + return doReadCharArray(); case GridBinaryMarshaller.BOOLEAN_ARR: - return doReadBooleanArray(in); + return doReadBooleanArray(); case GridBinaryMarshaller.DECIMAL_ARR: - return doReadDecimalArray(in); + return doReadDecimalArray(); case GridBinaryMarshaller.STRING_ARR: return BinaryUtils.doReadStringArray(in); case GridBinaryMarshaller.UUID_ARR: - return doReadUuidArray(in); + return doReadUuidArray(); case GridBinaryMarshaller.DATE_ARR: - return doReadDateArray(in); + return doReadDateArray(); case GridBinaryMarshaller.TIMESTAMP_ARR: - return doReadTimestampArray(in); + return doReadTimestampArray(); case GridBinaryMarshaller.TIME_ARR: - return doReadTimeArray(in); + return doReadTimeArray(); case GridBinaryMarshaller.OBJ_ARR: if (BinaryUtils.useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, detach, deserialize, false); + return doReadBinaryArray(detach, deserialize, false); else - return doReadObjectArray(in, ctx, ldr, detach, deserialize); + return doReadObjectArray(detach, deserialize); case GridBinaryMarshaller.COL: - return doReadCollection(in, ctx, ldr, detach, deserialize, null); + return doReadCollection(detach, deserialize, null); case GridBinaryMarshaller.MAP: - return doReadMap(in, ctx, ldr, detach, deserialize, null); + return doReadMap(detach, deserialize, null); case GridBinaryMarshaller.BINARY_OBJ: - return doReadBinaryObject(in, ctx, detach); + return doReadBinaryObject(detach); case GridBinaryMarshaller.ENUM: case GridBinaryMarshaller.BINARY_ENUM: - return doReadBinaryEnum(in, ctx, doReadEnumType(in)); + return doReadBinaryEnum(doReadEnumType()); case GridBinaryMarshaller.ENUM_ARR: if (BinaryUtils.useBinaryArrays() && !deserialize) - return doReadBinaryArray(in, ctx, ldr, detach, deserialize, true); + return doReadBinaryArray(detach, deserialize, true); else { - doReadEnumType(in); // Simply skip this part as we do not need it. + doReadEnumType(); // Simply skip this part as we do not need it. - return doReadBinaryEnumArray(in, ctx); + return doReadBinaryEnumArray(); } case GridBinaryMarshaller.CLASS: - return doReadClass(in, ctx, ldr); + return doReadClass(); case GridBinaryMarshaller.PROXY: - return doReadProxy(in, ctx, ldr); + return doReadProxy(); case GridBinaryMarshaller.OPTM_MARSH: return BinaryImplUtils.doReadOptimized(in, ctx, ldr); @@ -3613,19 +3586,15 @@ private Object[] doReadBinaryEnumArray(BinaryInputStream in, BinaryContext ctx) } /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. * @param detach Detach flag. * @param deserialize Deep flag. * @return Value. * @throws BinaryObjectException In case of error. */ - private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - boolean detach, boolean deserialize) throws BinaryObjectException { - int hPos = positionForHandle(in); + private Object[] doReadObjectArray(boolean detach, boolean deserialize) throws BinaryObjectException { + int hPos = positionForHandle(); - Class compType = doReadClass(in, ctx, ldr, deserialize); + Class compType = doReadClass(deserialize); int len = in.readInt(); @@ -3636,7 +3605,7 @@ private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, Clas setHandle(arr, hPos); for (int i = 0; i < len; i++) { - Object res = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); + Object res = deserializeOrUnmarshal(detach, deserialize); if (deserialize && BinaryUtils.useBinaryArrays() && res instanceof BinaryObject) arr[i] = ((BinaryObject)res).deserialize(ldr); @@ -3648,17 +3617,13 @@ private Object[] doReadObjectArray(BinaryInputStream in, BinaryContext ctx, Clas } /** - * @param in Binary input stream. - * @param ctx Binary context. - * @param ldr Class loader. * @param detach Detach flag. * @param deserialize Deep flag. * @return Value. * @throws BinaryObjectException In case of error. */ - private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - boolean detach, boolean deserialize, boolean isEnumArray) { - int hPos = positionForHandle(in); + private BinaryArray doReadBinaryArray(boolean detach, boolean deserialize, boolean isEnumArray) { + int hPos = positionForHandle(); int compTypeId = in.readInt(); String compClsName = null; @@ -3677,7 +3642,7 @@ private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, C setHandle(res, hPos); for (int i = 0; i < len; i++) - arr[i] = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); + arr[i] = deserializeOrUnmarshal(detach, deserialize); return res; } @@ -3689,10 +3654,9 @@ private BinaryArray doReadBinaryArray(BinaryInputStream in, BinaryContext ctx, C * @throws BinaryObjectException In case of error. */ @SuppressWarnings("unchecked") - private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - boolean detach, boolean deserialize, BinaryCollectionFactory factory) + private Collection doReadCollection(boolean detach, boolean deserialize, BinaryCollectionFactory factory) throws BinaryObjectException { - int hPos = positionForHandle(in); + int hPos = positionForHandle(); int size = in.readInt(); @@ -3749,7 +3713,7 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, setHandle(col, hPos); for (int i = 0; i < size; i++) - col.add(deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize)); + col.add(deserializeOrUnmarshal(detach, deserialize)); return colType == GridBinaryMarshaller.SINGLETON_LIST ? CommonUtils.convertToSingletonList(col) : col; } @@ -3761,10 +3725,9 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, * @throws BinaryObjectException In case of error. */ @SuppressWarnings("unchecked") - private Map doReadMap(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - boolean detach, boolean deserialize, BinaryMapFactory factory) + private Map doReadMap(boolean detach, boolean deserialize, BinaryMapFactory factory) throws BinaryObjectException { - int hPos = positionForHandle(in); + int hPos = positionForHandle(); int size = in.readInt(); @@ -3801,8 +3764,8 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, setHandle(map, hPos); for (int i = 0; i < size; i++) { - Object key = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); - Object val = deserializeOrUnmarshal(in, ctx, ldr, detach, deserialize); + Object key = deserializeOrUnmarshal(detach, deserialize); + Object val = deserializeOrUnmarshal(detach, deserialize); map.put(key, val); } @@ -3816,9 +3779,8 @@ private Collection doReadCollection(BinaryInputStream in, BinaryContext ctx, * @param deserialize Deserialize. * @return Result. */ - private Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, - boolean detach, boolean deserialize) { - return deserialize ? doReadObject(in, ctx, ldr) : unmarshal(in, ctx, ldr, detach, deserialize); + private Object deserializeOrUnmarshal(boolean detach, boolean deserialize) { + return deserialize ? doReadObject() : unmarshal(detach, deserialize); } /** @@ -3826,7 +3788,7 @@ private Object deserializeOrUnmarshal(BinaryInputStream in, BinaryContext ctx, C * * @return Position for handle. */ - private int positionForHandle(BinaryInputStream in) { + private int positionForHandle() { return in.position() - 1; }