diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java index f8e5c067810b0..f5d8d61d62e47 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java @@ -141,4 +141,9 @@ public default void detachAllowed(boolean detachAllowed) { public default boolean hasCircularReferences() { return false; } + + /** @return {@code true} if binary object has compact footer. */ + public default boolean isCompactFooter() { + return false; + } } 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 45146bb29d2fc..245ec20f67d11 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 @@ -38,7 +38,6 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -86,7 +85,6 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.T2; import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.Marshallers; @@ -140,40 +138,6 @@ TreeSet.class, new BinaryTreeSetWriteReplacer() /** Class for SingletonList obtained at runtime. */ static final Class SINGLETON_LIST_CLS = Collections.singletonList(null).getClass(); - /** Flag: user type. */ - static final short FLAG_USR_TYP = 0x0001; - - /** Flag: only raw data exists. */ - static final short FLAG_HAS_SCHEMA = 0x0002; - - /** Flag indicating that object has raw data. */ - static final short FLAG_HAS_RAW = 0x0004; - - /** Flag: offsets take 1 byte. */ - static final short FLAG_OFFSET_ONE_BYTE = 0x0008; - - /** Flag: offsets take 2 bytes. */ - static final short FLAG_OFFSET_TWO_BYTES = 0x0010; - - /** Flag: compact footer, no field IDs. */ - public static final short FLAG_COMPACT_FOOTER = 0x0020; - - /** Flag: raw data contains .NET type information. Always 0 in Java. Keep it here for information only. */ - @SuppressWarnings("unused") - public static final short FLAG_CUSTOM_DOTNET_TYPE = 0x0040; - - /** Offset which fits into 1 byte. */ - static final int OFFSET_1 = 1; - - /** Offset which fits into 2 bytes. */ - static final int OFFSET_2 = 2; - - /** Offset which fits into 4 bytes. */ - static final int OFFSET_4 = 4; - - /** Field ID length. */ - static final int FIELD_ID_LEN = 4; - /** Whether to sort field in binary objects (doesn't affect Binarylizable). */ public static boolean FIELDS_SORTED_ORDER = IgniteCommonsSystemProperties.getBoolean(IgniteCommonsSystemProperties.IGNITE_BINARY_SORT_OBJECT_FIELDS); @@ -326,57 +290,6 @@ TreeSet.class, new BinaryTreeSetWriteReplacer() FIELD_TYPE_NAMES[GridBinaryMarshaller.BINARY_ENUM] = "Enum"; } - /** - * Check if user type flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - static boolean isUserType(short flags) { - return isFlagSet(flags, FLAG_USR_TYP); - } - - /** - * Check if raw-only flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - public static boolean hasSchema(short flags) { - return isFlagSet(flags, FLAG_HAS_SCHEMA); - } - - /** - * Check if raw-only flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - static boolean hasRaw(short flags) { - return isFlagSet(flags, FLAG_HAS_RAW); - } - - /** - * Check if "no-field-ids" flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - static boolean isCompactFooter(short flags) { - return isFlagSet(flags, FLAG_COMPACT_FOOTER); - } - - /** - * Check whether particular flag is set. - * - * @param flags Flags. - * @param flag Flag. - * @return {@code True} if flag is set in flags. - */ - static boolean isFlagSet(short flags, short flag) { - return (flags & flag) == flag; - } - /** * Schema initial ID. * @@ -417,172 +330,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. @@ -784,160 +531,6 @@ public static int length(BinaryPositionReadable in, int start) { return in.readIntPositioned(start + GridBinaryMarshaller.TOTAL_LEN_POS); } - /** */ - static int dataStartRelative(BinaryPositionReadable in, int start) { - int typeId = in.readIntPositioned(start + GridBinaryMarshaller.TYPE_ID_POS); - - if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) { - // Gets the length of the type name which is stored as string. - int len = in.readIntPositioned(start + GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1); - - return GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1 + /** string length */ 4 + len; - } - else - return GridBinaryMarshaller.DFLT_HDR_LEN; - } - - /** - * Get footer start of the object. - * - * @param in Input stream. - * @param start Object start position inside the stream. - * @return Footer start. - */ - private static int footerStartRelative(BinaryPositionReadable in, int start) { - short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); - - if (hasSchema(flags)) - // Schema exists, use offset. - return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - else - // No schema, footer start equals to object end. - return length(in, start); - } - - /** - * Get object's footer. - * - * @param in Input stream. - * @param start Start position. - * @return Footer start. - */ - public static int footerStartAbsolute(BinaryPositionReadable in, int start) { - return footerStartRelative(in, start) + start; - } - - /** - * Get object's footer. - * - * @param in Input stream. - * @param start Start position. - * @return Footer. - */ - public static IgniteBiTuple footerAbsolute(BinaryPositionReadable in, int start) { - short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); - - int footerEnd = length(in, start); - - if (hasSchema(flags)) { - // Schema exists. - int footerStart = in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - - if (hasRaw(flags)) - footerEnd -= 4; - - assert footerStart <= footerEnd; - - return F.t(start + footerStart, start + footerEnd); - } - else - // No schema. - return F.t(start + footerEnd, start + footerEnd); - } - - /** - * Get relative raw offset of the object. - * - * @param in Input stream. - * @param start Object start position inside the stream. - * @return Raw offset. - */ - private static int rawOffsetRelative(BinaryPositionReadable in, int start) { - short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); - - int len = length(in, start); - - if (hasSchema(flags)) { - // Schema exists. - if (hasRaw(flags)) - // Raw offset is set, it is at the very end of the object. - return in.readIntPositioned(start + len - 4); - else - // Raw offset is not set, so just return schema offset. - return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - } - else - // No schema, raw offset is located on schema offset position. - return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - } - - /** - * Get absolute raw offset of the object. - * - * @param in Input stream. - * @param start Object start position inside the stream. - * @return Raw offset. - */ - public static int rawOffsetAbsolute(BinaryPositionReadable in, int start) { - return start + rawOffsetRelative(in, start); - } - - /** - * Get offset length for the given flags. - * - * @param flags Flags. - * @return Offset size. - */ - public static int fieldOffsetLength(short flags) { - if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE) - return OFFSET_1; - else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES) - return OFFSET_2; - else - return OFFSET_4; - } - - /** - * Get field ID length. - * - * @param flags Flags. - * @return Field ID length. - */ - public static int fieldIdLength(short flags) { - return isCompactFooter(flags) ? 0 : FIELD_ID_LEN; - } - - /** - * Get relative field offset. - * - * @param stream Stream. - * @param pos Position. - * @param fieldOffsetSize Field offset size. - * @return Relative field offset. - */ - public static int fieldOffsetRelative(BinaryPositionReadable stream, int pos, int fieldOffsetSize) { - int res; - - if (fieldOffsetSize == OFFSET_1) - res = (int)stream.readBytePositioned(pos) & 0xFF; - else if (fieldOffsetSize == OFFSET_2) - res = (int)stream.readShortPositioned(pos) & 0xFFFF; - else - res = stream.readIntPositioned(pos); - - return res; - } - /** * Merge old and new metas. * @@ -2775,14 +2368,6 @@ public static Map, Function> unwrapFuncForSizeCalc() { ); } - /** - * @param val Value to check. - * @return {@code True} if {@code val} instance of {@link BinaryEnumArray}. - */ - public static boolean isBinaryEnumArray(Object val) { - return val instanceof BinaryEnumArray; - } - /** * @param val Value to check. * @return {@code True} if {@code val} instance of binary Enum object. @@ -2803,23 +2388,6 @@ public static BinaryReaderEx reader(BinaryContext ctx, BinaryInputStream in, Cla return binariesFactory.reader(ctx, in, ldr, forUnmarshal); } - /** - * 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 reader(ctx, in, ldr, reader.handles(), forUnmarshal); - } - /** * Creates reader instance. * @@ -2830,10 +2398,10 @@ public static BinaryReaderEx reader(BinaryContext ctx, * @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) { + BinaryInputStream in, + ClassLoader ldr, + @Nullable BinaryReaderHandles hnds, + boolean forUnmarshal) { return binariesFactory.reader(ctx, in, ldr, hnds, forUnmarshal); } @@ -2847,10 +2415,10 @@ static BinaryReaderEx reader(BinaryContext ctx, * @param forUnmarshal {@code True} if reader is need to unmarshal object. */ public static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - boolean skipHdrCheck, - boolean forUnmarshal) { + BinaryInputStream in, + ClassLoader ldr, + boolean skipHdrCheck, + boolean forUnmarshal) { return reader(ctx, in, ldr, null, skipHdrCheck, forUnmarshal); } @@ -2865,11 +2433,11 @@ public static BinaryReaderEx reader(BinaryContext ctx, * @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) { + BinaryInputStream in, + ClassLoader ldr, + @Nullable BinaryReaderHandles hnds, + boolean skipHdrCheck, + boolean forUnmarshal) { return binariesFactory.reader(ctx, in, ldr, hnds, skipHdrCheck, forUnmarshal); } @@ -2961,45 +2529,6 @@ public static Object field(Object obj, int fieldId) { return ((BinaryObjectExImpl)obj).field(fieldId); } - /** - * Check for arrays equality. - * - * @param a1 Value 1. - * @param a2 Value 2. - * @return {@code True} if arrays equal. - */ - public static boolean arrayEq(Object a1, Object a2) { - if (a1 == a2) - return true; - - if (a1 == null || a2 == null) - return a1 != null || a2 != null; - - if (a1.getClass() != a2.getClass()) - return false; - - if (a1 instanceof byte[]) - return Arrays.equals((byte[])a1, (byte[])a2); - else if (a1 instanceof boolean[]) - return Arrays.equals((boolean[])a1, (boolean[])a2); - else if (a1 instanceof short[]) - return Arrays.equals((short[])a1, (short[])a2); - else if (a1 instanceof char[]) - return Arrays.equals((char[])a1, (char[])a2); - else if (a1 instanceof int[]) - return Arrays.equals((int[])a1, (int[])a2); - else if (a1 instanceof long[]) - return Arrays.equals((long[])a1, (long[])a2); - else if (a1 instanceof float[]) - return Arrays.equals((float[])a1, (float[])a2); - else if (a1 instanceof double[]) - return Arrays.equals((double[])a1, (double[])a2); - else if (isBinaryArray(a1)) - return a1.equals(a2); - - return Arrays.deepEquals((Object[])a1, (Object[])a2); - } - /** * @param o Object to detach. * @return Detached object. @@ -3025,16 +2554,6 @@ public static Collection> schemasAndFieldsIds(BinaryMetadata return F.viewReadOnly(meta.schemas(), s -> new T2<>(s.schemaId(), s.fieldIds())); } - /** - * Gets field by its order. - * - * @param reader Reader. - * @param order Order. - */ - public static int fieldId(BinaryReaderEx reader, int order) { - return reader.getOrCreateSchema().fieldId(order); - } - /** * @param obj Value. * @return {@code True} if object is of known immutable type. @@ -3070,16 +2589,6 @@ public static BinaryMetadata binaryMetadata( return new BinaryMetadata(typeId, typeName, fields, affKeyFieldName, schemas, isEnum, enumMap); } - /** */ - public static int hashCode(byte[] data, int startPos, int endPos) { - int hash = 1; - - for (int i = startPos; i < endPos; i++) - hash = 31 * hash + data[i]; - - return hash; - } - /** * Enum type. */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java index 86109b19b6264..3603a98c7bbe1 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java @@ -57,7 +57,7 @@ private BinaryArrayIdentityResolver() { int end = ex.footerStartOffset(); if (ex.hasBytes()) - return BinaryUtils.hashCode(ex.bytes(), start, end); + return BinaryImplUtils.hashCode(ex.bytes(), start, end); else { // Handle offheap object. int hash = 1; 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 new file mode 100644 index 0000000000000..6d59f0519b52f --- /dev/null +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -0,0 +1,520 @@ +/* + * 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; + +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; + +/** + * Binary utils used only in implementation. + */ +public class BinaryImplUtils { + /** Flag: user type. */ + static final short FLAG_USR_TYP = 0x0001; + + /** Flag: only raw data exists. */ + static final short FLAG_HAS_SCHEMA = 0x0002; + + /** Flag indicating that object has raw data. */ + static final short FLAG_HAS_RAW = 0x0004; + + /** Flag: offsets take 1 byte. */ + static final short FLAG_OFFSET_ONE_BYTE = 0x0008; + + /** Flag: offsets take 2 bytes. */ + static final short FLAG_OFFSET_TWO_BYTES = 0x0010; + + /** Flag: compact footer, no field IDs. */ + public static final short FLAG_COMPACT_FOOTER = 0x0020; + + /** Flag: raw data contains .NET type information. Always 0 in Java. Keep it here for information only. */ + @SuppressWarnings("unused") + public static final short FLAG_CUSTOM_DOTNET_TYPE = 0x0040; + + /** Offset which fits into 1 byte. */ + static final int OFFSET_1 = 1; + + /** Offset which fits into 2 bytes. */ + static final int OFFSET_2 = 2; + + /** Offset which fits into 4 bytes. */ + static final int OFFSET_4 = 4; + + /** Field ID length. */ + static final int FIELD_ID_LEN = 4; + + /** {@code true} if serialized value of this type cannot contain references to objects. */ + private static final boolean[] PLAIN_TYPE_FLAG = new boolean[102]; + + static { + for (byte b : new byte[] { + GridBinaryMarshaller.BYTE, GridBinaryMarshaller.SHORT, GridBinaryMarshaller.INT, GridBinaryMarshaller.LONG, + GridBinaryMarshaller.FLOAT, GridBinaryMarshaller.DOUBLE, GridBinaryMarshaller.CHAR, GridBinaryMarshaller.BOOLEAN, + GridBinaryMarshaller.DECIMAL, GridBinaryMarshaller.STRING, GridBinaryMarshaller.UUID, GridBinaryMarshaller.DATE, + GridBinaryMarshaller.TIMESTAMP, GridBinaryMarshaller.TIME, GridBinaryMarshaller.BYTE_ARR, GridBinaryMarshaller.SHORT_ARR, + GridBinaryMarshaller.INT_ARR, GridBinaryMarshaller.LONG_ARR, GridBinaryMarshaller.FLOAT_ARR, GridBinaryMarshaller.DOUBLE_ARR, + GridBinaryMarshaller.TIME_ARR, GridBinaryMarshaller.CHAR_ARR, GridBinaryMarshaller.BOOLEAN_ARR, + GridBinaryMarshaller.DECIMAL_ARR, GridBinaryMarshaller.STRING_ARR, GridBinaryMarshaller.UUID_ARR, GridBinaryMarshaller.DATE_ARR, + GridBinaryMarshaller.TIMESTAMP_ARR, GridBinaryMarshaller.ENUM, GridBinaryMarshaller.ENUM_ARR, GridBinaryMarshaller.NULL}) { + + PLAIN_TYPE_FLAG[b] = true; + } + } + + /** + * Check if user type flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + static boolean isUserType(short flags) { + return isFlagSet(flags, FLAG_USR_TYP); + } + + /** + * Check if raw-only flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + public static boolean hasSchema(short flags) { + return isFlagSet(flags, FLAG_HAS_SCHEMA); + } + + /** + * Check if raw-only flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + static boolean hasRaw(short flags) { + return isFlagSet(flags, FLAG_HAS_RAW); + } + + /** + * Check if "no-field-ids" flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + static boolean isCompactFooter(short flags) { + return isFlagSet(flags, FLAG_COMPACT_FOOTER); + } + + /** + * Check whether particular flag is set. + * + * @param flags Flags. + * @param flag Flag. + * @return {@code True} if flag is set in flags. + */ + static boolean isFlagSet(short flags, short flag) { + return (flags & flag) == flag; + } + + /** */ + static int dataStartRelative(BinaryPositionReadable in, int start) { + int typeId = in.readIntPositioned(start + GridBinaryMarshaller.TYPE_ID_POS); + + if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) { + // Gets the length of the type name which is stored as string. + int len = in.readIntPositioned(start + GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1); + + return GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1 + /** string length */ 4 + len; + } + else + return GridBinaryMarshaller.DFLT_HDR_LEN; + } + + /** + * Get footer start of the object. + * + * @param in Input stream. + * @param start Object start position inside the stream. + * @return Footer start. + */ + private static int footerStartRelative(BinaryPositionReadable in, int start) { + short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); + + if (hasSchema(flags)) + // Schema exists, use offset. + return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + else + // No schema, footer start equals to object end. + return length(in, start); + } + + /** + * Get object's footer. + * + * @param in Input stream. + * @param start Start position. + * @return Footer start. + */ + public static int footerStartAbsolute(BinaryPositionReadable in, int start) { + return footerStartRelative(in, start) + start; + } + + /** + * Get object's footer. + * + * @param in Input stream. + * @param start Start position. + * @return Footer. + */ + public static IgniteBiTuple footerAbsolute(BinaryPositionReadable in, int start) { + short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); + + int footerEnd = length(in, start); + + if (hasSchema(flags)) { + // Schema exists. + int footerStart = in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + + if (hasRaw(flags)) + footerEnd -= 4; + + assert footerStart <= footerEnd; + + return F.t(start + footerStart, start + footerEnd); + } + else + // No schema. + return F.t(start + footerEnd, start + footerEnd); + } + + /** + * Get relative raw offset of the object. + * + * @param in Input stream. + * @param start Object start position inside the stream. + * @return Raw offset. + */ + private static int rawOffsetRelative(BinaryPositionReadable in, int start) { + short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); + + int len = length(in, start); + + if (hasSchema(flags)) { + // Schema exists. + if (hasRaw(flags)) + // Raw offset is set, it is at the very end of the object. + return in.readIntPositioned(start + len - 4); + else + // Raw offset is not set, so just return schema offset. + return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + } + else + // No schema, raw offset is located on schema offset position. + return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + } + + /** + * Get absolute raw offset of the object. + * + * @param in Input stream. + * @param start Object start position inside the stream. + * @return Raw offset. + */ + public static int rawOffsetAbsolute(BinaryPositionReadable in, int start) { + return start + rawOffsetRelative(in, start); + } + + /** + * Get offset length for the given flags. + * + * @param flags Flags. + * @return Offset size. + */ + public static int fieldOffsetLength(short flags) { + if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE) + return OFFSET_1; + else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES) + return OFFSET_2; + else + return OFFSET_4; + } + + /** + * Get field ID length. + * + * @param flags Flags. + * @return Field ID length. + */ + public static int fieldIdLength(short flags) { + return isCompactFooter(flags) ? 0 : FIELD_ID_LEN; + } + + /** + * Get relative field offset. + * + * @param stream Stream. + * @param pos Position. + * @param fieldOffsetSize Field offset size. + * @return Relative field offset. + */ + public static int fieldOffsetRelative(BinaryPositionReadable stream, int pos, int fieldOffsetSize) { + int res; + + if (fieldOffsetSize == OFFSET_1) + res = (int)stream.readBytePositioned(pos) & 0xFF; + else if (fieldOffsetSize == OFFSET_2) + res = (int)stream.readShortPositioned(pos) & 0xFFFF; + else + res = stream.readIntPositioned(pos); + + return res; + } + + /** + * @return {@code true} if content of serialized value cannot contain references to other object. + */ + public static boolean isPlainType(int type) { + return type > 0 && type < PLAIN_TYPE_FLAG.length && PLAIN_TYPE_FLAG[type]; + } + + /** + * Checks whether an array type values can or can not contain references to other object. + * + * @param type Array type. + * @return {@code true} if content of serialized array value cannot contain references to other object. + */ + public static boolean isPlainArrayType(int type) { + return (type >= GridBinaryMarshaller.BYTE_ARR && type <= GridBinaryMarshaller.DATE_ARR) + || 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}. + */ + 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; + + for (int i = startPos; i < endPos; i++) + hash = 31 * hash + data[i]; + + 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); + } +} 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 7dd2bebdf86af..d41d6a3160d1a 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 @@ -45,6 +45,7 @@ import org.jetbrains.annotations.Nullable; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.TRANSFORMED; /** @@ -345,7 +346,12 @@ public void context(BinaryContext ctx) { @Override public boolean isFlagSet(short flag) { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.isFlagSet(flags, flag); + return BinaryImplUtils.isFlagSet(flags, flag); + } + + /** {@inheritDoc} */ + @Override public boolean isCompactFooter() { + return isFlagSet(FLAG_COMPACT_FOOTER); } /** {@inheritDoc} */ @@ -406,7 +412,7 @@ public void context(BinaryContext ctx) { @Override public int footerStartOffset() { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - if (!BinaryUtils.hasSchema(flags)) + if (!BinaryImplUtils.hasSchema(flags)) return start + length(); return start + BinaryPrimitives.readInt(arr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); @@ -424,16 +430,16 @@ public void context(BinaryContext ctx) { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int fieldOffsetPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen; int fieldPos; - if (fieldOffLen == BinaryUtils.OFFSET_1) + if (fieldOffLen == BinaryImplUtils.OFFSET_1) fieldPos = start + ((int)BinaryPrimitives.readByte(arr, fieldOffsetPos) & 0xFF); - else if (fieldOffLen == BinaryUtils.OFFSET_2) + else if (fieldOffLen == BinaryImplUtils.OFFSET_2) fieldPos = start + ((int)BinaryPrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF); else fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos); @@ -570,16 +576,16 @@ else if (fieldOffLen == BinaryUtils.OFFSET_2) short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags); int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen; int fieldPos; - if (fieldOffsetLen == BinaryUtils.OFFSET_1) + if (fieldOffsetLen == BinaryImplUtils.OFFSET_1) fieldPos = start + ((int)BinaryPrimitives.readByte(arr, fieldOffsetPos) & 0xFF); - else if (fieldOffsetLen == BinaryUtils.OFFSET_2) + else if (fieldOffsetLen == BinaryImplUtils.OFFSET_2) fieldPos = start + ((int)BinaryPrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF); else fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos); @@ -728,7 +734,7 @@ else if (fieldOffsetLen == BinaryUtils.OFFSET_2) @Override public boolean hasSchema() { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.hasSchema(flags); + return BinaryImplUtils.hasSchema(flags); } /** {@inheritDoc} */ 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 e2ac1b89b4e42..9ad6c06a605d4 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 @@ -43,6 +43,7 @@ import org.jetbrains.annotations.Nullable; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER; /** * Binary object implementation over offheap memory @@ -117,7 +118,7 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) @Override public boolean hasSchema() { short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.hasSchema(flags); + return BinaryImplUtils.hasSchema(flags); } /** {@inheritDoc} */ @@ -175,7 +176,12 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) @Override public boolean isFlagSet(short flag) { short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.isFlagSet(flags, flag); + return BinaryImplUtils.isFlagSet(flags, flag); + } + + /** {@inheritDoc} */ + @Override public boolean isCompactFooter() { + return isFlagSet(FLAG_COMPACT_FOOTER); } /** {@inheritDoc} */ @@ -215,7 +221,7 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) @Override public int footerStartOffset() { short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - if (!BinaryUtils.hasSchema(flags)) + if (!BinaryImplUtils.hasSchema(flags)) return start + length(); return start + BinaryPrimitives.readInt(ptr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); @@ -233,16 +239,16 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int fieldOffsetPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen; int fieldPos; - if (fieldOffLen == BinaryUtils.OFFSET_1) + if (fieldOffLen == BinaryImplUtils.OFFSET_1) fieldPos = start + ((int)BinaryPrimitives.readByte(ptr, fieldOffsetPos) & 0xFF); - else if (fieldOffLen == BinaryUtils.OFFSET_2) + else if (fieldOffLen == BinaryImplUtils.OFFSET_2) fieldPos = start + ((int)BinaryPrimitives.readShort(ptr, fieldOffsetPos) & 0xFFFF); else fieldPos = start + BinaryPrimitives.readInt(ptr, fieldOffsetPos); 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 888494a185c6e..1fe574d811e48 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 @@ -233,16 +233,16 @@ public BinaryReaderExImpl(BinaryContext ctx, int offset = in.readInt(); // Get trivial flag values. - userType = BinaryUtils.isUserType(flags); - fieldIdLen = BinaryUtils.fieldIdLength(flags); - fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + userType = BinaryImplUtils.isUserType(flags); + fieldIdLen = BinaryImplUtils.fieldIdLength(flags); + fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); // Calculate footer borders and raw offset. - if (BinaryUtils.hasSchema(flags)) { + if (BinaryImplUtils.hasSchema(flags)) { // Schema exists. footerStart = start + offset; - if (BinaryUtils.hasRaw(flags)) { + if (BinaryImplUtils.hasRaw(flags)) { footerLen = len - offset; rawOff = start + in.readIntPositioned(start + len - 4); } @@ -256,7 +256,7 @@ public BinaryReaderExImpl(BinaryContext ctx, footerStart = start + len; footerLen = 0; - if (BinaryUtils.hasRaw(flags)) + if (BinaryImplUtils.hasRaw(flags)) rawOff = start + offset; else rawOff = start + len; @@ -286,7 +286,7 @@ public BinaryReaderExImpl(BinaryContext ctx, } mapper = userType ? ctx.userTypeMapper(typeId) : BinaryContext.defaultMapper(); - schema = BinaryUtils.hasSchema(flags) ? getOrCreateSchema() : null; + schema = BinaryImplUtils.hasSchema(flags) ? getOrCreateSchema() : null; } else { dataStart = 0; @@ -1989,7 +1989,7 @@ private int fieldId(String name) { BinarySchema schema = ctx.schemaRegistry(typeId).schema(schemaId); if (schema == null) { - if (fieldIdLen != BinaryUtils.FIELD_ID_LEN) { + if (fieldIdLen != BinaryImplUtils.FIELD_ID_LEN) { BinaryTypeImpl type = (BinaryTypeImpl)ctx.metadata(typeId, schemaId); BinaryMetadata meta = type != null ? type.metadata() : null; @@ -2041,7 +2041,7 @@ private int fieldId(String name) { * @return Schema. */ private BinarySchema createSchema() { - assert fieldIdLen == BinaryUtils.FIELD_ID_LEN; + assert fieldIdLen == BinaryImplUtils.FIELD_ID_LEN; BinarySchema.Builder builder = BinarySchema.Builder.newBuilder(); @@ -2053,7 +2053,7 @@ private BinarySchema createSchema() { builder.addField(fieldId); - searchPos += BinaryUtils.FIELD_ID_LEN + fieldOffLen; + searchPos += BinaryImplUtils.FIELD_ID_LEN + fieldOffLen; } return builder.build(); @@ -2184,7 +2184,7 @@ private boolean trySetUserFieldPosition(int order) { if (order != BinarySchema.ORDER_NOT_FOUND) { int offsetPos = footerStart + order * (fieldIdLen + fieldOffLen) + fieldIdLen; - int pos = start + BinaryUtils.fieldOffsetRelative(in, offsetPos, fieldOffLen); + int pos = start + BinaryImplUtils.fieldOffsetRelative(in, offsetPos, fieldOffLen); streamPosition(pos); @@ -2202,7 +2202,7 @@ private boolean trySetUserFieldPosition(int order) { */ private boolean trySetSystemFieldPosition(int id) { // System types are never written with compact footers because they do not have metadata. - assert fieldIdLen == BinaryUtils.FIELD_ID_LEN; + assert fieldIdLen == BinaryImplUtils.FIELD_ID_LEN; int searchPos = footerStart; int searchTail = searchPos + footerLen; @@ -2214,7 +2214,7 @@ private boolean trySetSystemFieldPosition(int id) { int id0 = in.readIntPositioned(searchPos); if (id0 == id) { - int pos = start + BinaryUtils.fieldOffsetRelative(in, searchPos + BinaryUtils.FIELD_ID_LEN, + int pos = start + BinaryImplUtils.fieldOffsetRelative(in, searchPos + BinaryImplUtils.FIELD_ID_LEN, fieldOffLen); streamPosition(pos); @@ -2222,7 +2222,7 @@ private boolean trySetSystemFieldPosition(int id) { return true; } - searchPos += BinaryUtils.FIELD_ID_LEN + fieldOffLen; + searchPos += BinaryImplUtils.FIELD_ID_LEN + fieldOffLen; } } 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 176a1ec9eb155..8eb2efe962281 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 @@ -235,11 +235,11 @@ int position() { if (userType) { if (ctx.isCompactFooter()) { - flags = BinaryUtils.FLAG_USR_TYP | BinaryUtils.FLAG_COMPACT_FOOTER; + flags = BinaryImplUtils.FLAG_USR_TYP | BinaryImplUtils.FLAG_COMPACT_FOOTER; useCompactFooter = true; } else { - flags = BinaryUtils.FLAG_USR_TYP; + flags = BinaryImplUtils.FLAG_USR_TYP; useCompactFooter = false; } } @@ -254,18 +254,18 @@ int position() { offset = out.position() - start; // Write the schema. - flags |= BinaryUtils.FLAG_HAS_SCHEMA; + flags |= BinaryImplUtils.FLAG_HAS_SCHEMA; int offsetByteCnt = schema.write(out, fieldCnt, useCompactFooter); - if (offsetByteCnt == BinaryUtils.OFFSET_1) - flags |= BinaryUtils.FLAG_OFFSET_ONE_BYTE; - else if (offsetByteCnt == BinaryUtils.OFFSET_2) - flags |= BinaryUtils.FLAG_OFFSET_TWO_BYTES; + if (offsetByteCnt == BinaryImplUtils.OFFSET_1) + flags |= BinaryImplUtils.FLAG_OFFSET_ONE_BYTE; + else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) + flags |= BinaryImplUtils.FLAG_OFFSET_TWO_BYTES; // Write raw offset if needed. if (rawOffPos != 0) { - flags |= BinaryUtils.FLAG_HAS_RAW; + flags |= BinaryImplUtils.FLAG_HAS_RAW; out.writeInt(rawOffPos - start); } @@ -275,7 +275,7 @@ else if (offsetByteCnt == BinaryUtils.OFFSET_2) offset = rawOffPos - start; // If there is no schema, we are free to write raw offset to schema offset. - flags |= BinaryUtils.FLAG_HAS_RAW; + flags |= BinaryImplUtils.FLAG_HAS_RAW; } else offset = GridBinaryMarshaller.DFLT_HDR_LEN; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java index cd2d8c5d76124..fecb10aa23927 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java @@ -96,19 +96,19 @@ public int write(BinaryOutputStream out, int fieldCnt, boolean compactFooter) { for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2) out.unsafeWriteByte((byte)data[curIdx]); - res = BinaryUtils.OFFSET_1; + res = BinaryImplUtils.OFFSET_1; } else if (lastOffset < MAX_OFFSET_2) { for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2) out.unsafeWriteShort((short)data[curIdx]); - res = BinaryUtils.OFFSET_2; + res = BinaryImplUtils.OFFSET_2; } else { for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2) out.unsafeWriteInt(data[curIdx]); - res = BinaryUtils.OFFSET_4; + res = BinaryImplUtils.OFFSET_4; } } else { @@ -118,7 +118,7 @@ else if (lastOffset < MAX_OFFSET_2) { out.unsafeWriteByte((byte)data[curIdx++]); } - res = BinaryUtils.OFFSET_1; + res = BinaryImplUtils.OFFSET_1; } else if (lastOffset < MAX_OFFSET_2) { for (int curIdx = startIdx; curIdx < idx;) { @@ -126,7 +126,7 @@ else if (lastOffset < MAX_OFFSET_2) { out.unsafeWriteShort((short)data[curIdx++]); } - res = BinaryUtils.OFFSET_2; + res = BinaryImplUtils.OFFSET_2; } else { for (int curIdx = startIdx; curIdx < idx;) { @@ -134,7 +134,7 @@ else if (lastOffset < MAX_OFFSET_2) { out.unsafeWriteInt(data[curIdx++]); } - res = BinaryUtils.OFFSET_4; + res = BinaryImplUtils.OFFSET_4; } } 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 845f057fe8f3d..d5c06d7032e44 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 @@ -21,18 +21,18 @@ import java.util.Map; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_OFFSET_ONE_BYTE; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_OFFSET_TWO_BYTES; -import static org.apache.ignite.internal.binary.BinaryUtils.OFFSET_1; -import static org.apache.ignite.internal.binary.BinaryUtils.OFFSET_2; -import static org.apache.ignite.internal.binary.BinaryUtils.dataStartRelative; -import static org.apache.ignite.internal.binary.BinaryUtils.fieldOffsetLength; -import static org.apache.ignite.internal.binary.BinaryUtils.footerStartAbsolute; -import static org.apache.ignite.internal.binary.BinaryUtils.hasRaw; -import static org.apache.ignite.internal.binary.BinaryUtils.hasSchema; -import static org.apache.ignite.internal.binary.BinaryUtils.isCompactFooter; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_OFFSET_ONE_BYTE; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_OFFSET_TWO_BYTES; +import static org.apache.ignite.internal.binary.BinaryImplUtils.OFFSET_1; +import static org.apache.ignite.internal.binary.BinaryImplUtils.OFFSET_2; +import static org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative; +import static org.apache.ignite.internal.binary.BinaryImplUtils.fieldOffsetLength; +import static org.apache.ignite.internal.binary.BinaryImplUtils.footerStartAbsolute; +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.rawOffsetAbsolute; import static org.apache.ignite.internal.binary.BinaryUtils.length; -import static org.apache.ignite.internal.binary.BinaryUtils.rawOffsetAbsolute; 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; @@ -188,7 +188,7 @@ private void doObjectProcessing() { overrideHeader( outObjStartPos, /** flags */ setFieldOffsetFlag(inObjDesc.flags, footerFieldOffsetLen), - /** hash */ BinaryUtils.hashCode(out.array(), outObjStartPos + DFLT_HDR_LEN, outFooterStartPos), + /** hash */ BinaryImplUtils.hashCode(out.array(), outObjStartPos + DFLT_HDR_LEN, outFooterStartPos), /** total length */ out.position() - outObjStartPos, schemaOrRawOffsetPos ); 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 1c9edee42b18e..d5e40860186e0 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 @@ -21,9 +21,9 @@ import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.binary.streams.BinaryStreams; -import static org.apache.ignite.internal.binary.BinaryUtils.dataStartRelative; +import static org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative; +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.BinaryUtils.rawOffsetAbsolute; /** */ class ObjectDetachHelper { 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 cc5f6da0a1b3f..6f2a505f7b94f 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; @@ -87,7 +88,7 @@ class BinaryBuilderReader implements BinaryPositionReadable { this.arr = other.arr; this.pos = start; - reader = BinaryUtils.reader(ctx, + reader = BinaryImplUtils.reader(ctx, BinaryStreams.inputStream(arr, start), null, other.reader, 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 c30f1daf9a915..f2e1926a30d1a 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 @@ -22,6 +22,7 @@ import java.util.Map; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.internal.binary.BinariesFactoryImpl; +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; @@ -174,12 +175,12 @@ public void writeValue(BinaryWriterEx writer, Object val, boolean forceCol, bool Byte flag = BinaryUtils.PLAIN_CLASS_TO_FLAG.get(val.getClass()); if (flag != null) { - BinaryUtils.writePlainObject(writer, val); + BinaryImplUtils.writePlainObject(writer, val); return; } - if (BinaryUtils.isBinaryEnumArray(val)) { + if (BinaryImplUtils.isBinaryEnumArray(val)) { BinaryObjectEx val0 = (BinaryObjectEx)val; if (val0.componentTypeId() == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) 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 65c312283032b..33d372f374181 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 @@ -33,6 +33,7 @@ import org.apache.ignite.internal.binary.BinariesFactoryImpl; import org.apache.ignite.internal.binary.BinaryContext; import org.apache.ignite.internal.binary.BinaryFieldMetadata; +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.BinaryUtils; @@ -207,7 +208,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { Map fieldsMeta = null; - if (reader != null && BinaryUtils.hasSchema(flags)) { + if (reader != null && BinaryImplUtils.hasSchema(flags)) { Map assignedFldsById; if (assignedVals != null) { @@ -231,16 +232,16 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { assignedFldsById = Collections.emptyMap(); // Get footer details. - int fieldIdLen = BinaryUtils.fieldIdLength(flags); - int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.fieldIdLength(flags); + int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags); - IgniteBiTuple footer = BinaryUtils.footerAbsolute(reader, start); + IgniteBiTuple footer = BinaryImplUtils.footerAbsolute(reader, start); int footerPos = footer.get1(); int footerEnd = footer.get2(); // Get raw position. - int rawPos = BinaryUtils.rawOffsetAbsolute(reader, start); + int rawPos = BinaryImplUtils.rawOffsetAbsolute(reader, start); // Position reader on data. reader.position(start + hdrLen); @@ -248,7 +249,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { int idx = 0; while (reader.position() < rawPos) { - int fieldId = BinaryUtils.fieldId(reader.reader(), idx++); + int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++); int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen).get2(); @@ -268,7 +269,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { else { int type = fieldLen != 0 ? reader.readByte(0) : 0; - if (fieldLen != 0 && !BinaryUtils.isPlainArrayType(type) && BinaryUtils.isPlainType(type)) { + if (fieldLen != 0 && !BinaryImplUtils.isPlainArrayType(type) && BinaryImplUtils.isPlainType(type)) { writer.writeFieldId(fieldId); writer.write(reader.array(), reader.position(), fieldLen); @@ -322,8 +323,8 @@ else if (readCache == null) { if (reader != null) { // Write raw data if any. - int rawOff = BinaryUtils.rawOffsetAbsolute(reader, start); - int footerStart = BinaryUtils.footerStartAbsolute(reader, start); + int rawOff = BinaryImplUtils.rawOffsetAbsolute(reader, start); + int footerStart = BinaryImplUtils.footerStartAbsolute(reader, start); if (rawOff < footerStart) { writer.rawWriter(); @@ -381,7 +382,7 @@ else if (newVal.getClass().isArray() && else if (newVal.getClass().isArray() && BinaryObject.class.isAssignableFrom(newVal.getClass().getComponentType())) newFldTypeId = GridBinaryMarshaller.OBJ_ARR; - else if (BinaryUtils.isBinaryEnumArray(newVal)) + else if (BinaryImplUtils.isBinaryEnumArray(newVal)) newFldTypeId = GridBinaryMarshaller.ENUM_ARR; else if (BinaryUtils.isBinaryArray(newVal)) @@ -432,7 +433,7 @@ else if (!nullFieldVal) { private IgniteBiTuple fieldPositionAndLength(int footerPos, int footerEnd, int rawPos, int fieldIdLen, int fieldOffsetLen) { // Get field offset first. - int fieldOffset = BinaryUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen, fieldOffsetLen); + int fieldOffset = BinaryImplUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen, fieldOffsetLen); int fieldPos = start + fieldOffset; // Get field length. @@ -443,7 +444,7 @@ private IgniteBiTuple fieldPositionAndLength(int footerPos, in fieldLen = rawPos - fieldPos; else { // Field is somewhere in the middle, get difference with the next offset. - int nextFieldOffset = BinaryUtils.fieldOffsetRelative(reader, + int nextFieldOffset = BinaryImplUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen + fieldOffsetLen + fieldIdLen, fieldOffsetLen); fieldLen = nextFieldOffset - fieldOffset; @@ -459,22 +460,22 @@ private void ensureReadCacheInit() { assert reader != null; if (readCache == null) { - int fieldIdLen = BinaryUtils.fieldIdLength(flags); - int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.fieldIdLength(flags); + int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags); Map readCache = new HashMap<>(); - IgniteBiTuple footer = BinaryUtils.footerAbsolute(reader, start); + IgniteBiTuple footer = BinaryImplUtils.footerAbsolute(reader, start); int footerPos = footer.get1(); int footerEnd = footer.get2(); - int rawPos = BinaryUtils.rawOffsetAbsolute(reader, start); + int rawPos = BinaryImplUtils.rawOffsetAbsolute(reader, start); int idx = 0; while (footerPos + fieldIdLen < footerEnd) { - int fieldId = BinaryUtils.fieldId(reader.reader(), idx++); + int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++); IgniteBiTuple posAndLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java index 9e9b2b6a90ccb..3cccbb3e72a3a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java @@ -55,7 +55,6 @@ import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_COMPACT_FOOTER; import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_AUX; import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_DATA; import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_IDX; @@ -421,7 +420,7 @@ public void update( if (key.cacheObjectType() == TYPE_BINARY) { binary++; - if (((BinaryObjectEx)key).isFlagSet(FLAG_COMPACT_FOOTER)) + if (((BinaryObjectEx)key).isCompactFooter()) cf++; else noCf++; diff --git a/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java index 543e020ccddf2..965616d14db6d 100644 --- a/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java @@ -31,7 +31,7 @@ import org.apache.ignite.testframework.LogListener; import org.junit.Test; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_COMPACT_FOOTER; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER; /** * Tests binary configuration behavior. diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java index bacc6fb1e3490..1fafa4eaa3fb3 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java @@ -503,8 +503,8 @@ private BinarySerializedFieldComparator comparator(BinaryObjectExImpl obj) { ? BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS) : BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int orderBase = start + schemaOff + fieldIdLen; int orderMultiplier = fieldIdLen + fieldOffLen; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java index 150c1475bda26..b3421ba9416e0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java @@ -21,7 +21,7 @@ import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory; import org.apache.ignite.internal.util.typedef.F; -import static org.apache.ignite.internal.binary.BinaryUtils.arrayEq; +import static org.apache.ignite.testframework.GridTestUtils.arrayEq; /** * Compares fields in serialized form when possible. @@ -94,12 +94,12 @@ public void findField(int order) { else { int pos = orderBase + order * orderMultiplier; - if (fieldOffLen == BinaryUtils.OFFSET_1) { + if (fieldOffLen == BinaryImplUtils.OFFSET_1) { byte val = offheap() ? BinaryPrimitives.readByte(ptr, pos) : BinaryPrimitives.readByte(arr, pos); curFieldPos = startOff + ((int)val & 0xFF); } - else if (fieldOffLen == BinaryUtils.OFFSET_2) { + else if (fieldOffLen == BinaryImplUtils.OFFSET_2) { short val = offheap() ? BinaryPrimitives.readShort(ptr, pos) : BinaryPrimitives.readShort(arr, pos); curFieldPos = startOff + ((int)val & 0xFFFF); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java index 704907816c32a..9b4d472b58f0b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java @@ -37,7 +37,6 @@ import org.junit.Test; import static org.apache.ignite.configuration.WALMode.FSYNC; -import static org.apache.ignite.internal.binary.BinaryUtils.arrayEq; import static org.apache.ignite.internal.processors.cache.transactions.TransactionMetricsAdapter.METRIC_SYSTEM_TIME_HISTOGRAM; import static org.apache.ignite.internal.processors.metric.GridMetricManager.HISTOGRAM_CFG_PREFIX; import static org.apache.ignite.internal.processors.metric.GridMetricManager.HITRATE_CFG_PREFIX; @@ -47,6 +46,7 @@ import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; import static org.apache.ignite.internal.processors.pool.PoolProcessor.TASK_EXEC_TIME; import static org.apache.ignite.internal.processors.pool.PoolProcessor.THREAD_POOLS; +import static org.apache.ignite.testframework.GridTestUtils.arrayEq; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertNotEquals; diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index 02e9a4d21d250..6a8736060caf4 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -144,6 +144,7 @@ import static java.lang.Long.parseLong; import static java.util.Comparator.comparingLong; import static org.apache.ignite.IgniteSystemProperties.IGNITE_HOME; +import static org.apache.ignite.internal.binary.BinaryUtils.isBinaryArray; import static org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION; import static org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree.partitionFileName; import static org.apache.ignite.internal.util.lang.ClusterNodeFunc.nodeIds; @@ -2751,4 +2752,43 @@ public static long sizeOfDirectory(File dir) throws IOException { return size[0]; } + + /** + * Check for arrays equality. + * + * @param a1 Value 1. + * @param a2 Value 2. + * @return {@code True} if arrays equal. + */ + public static boolean arrayEq(Object a1, Object a2) { + if (a1 == a2) + return true; + + if (a1 == null || a2 == null) + return a1 != null || a2 != null; + + if (a1.getClass() != a2.getClass()) + return false; + + if (a1 instanceof byte[]) + return Arrays.equals((byte[])a1, (byte[])a2); + else if (a1 instanceof boolean[]) + return Arrays.equals((boolean[])a1, (boolean[])a2); + else if (a1 instanceof short[]) + return Arrays.equals((short[])a1, (short[])a2); + else if (a1 instanceof char[]) + return Arrays.equals((char[])a1, (char[])a2); + else if (a1 instanceof int[]) + return Arrays.equals((int[])a1, (int[])a2); + else if (a1 instanceof long[]) + return Arrays.equals((long[])a1, (long[])a2); + else if (a1 instanceof float[]) + return Arrays.equals((float[])a1, (float[])a2); + else if (a1 instanceof double[]) + return Arrays.equals((double[])a1, (double[])a2); + else if (isBinaryArray(a1)) + return a1.equals(a2); + + return Arrays.deepEquals((Object[])a1, (Object[])a2); + } }