IGNITE-19452 Forbid placing Marshallable on some standard types (#2135)
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index e64c4ce..dc1ec81 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -12,8 +12,8 @@
<inspection_tool class="AccessToStaticFieldLockedOnInstance" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredClasses">
<set>
- <option value="org.apache.ignite.lang.ByteArray" />
<option value="org.apache.ignite.internal.logger.IgniteLogger" />
+ <option value="org.apache.ignite.lang.ByteArray" />
</set>
</option>
</inspection_tool>
@@ -488,7 +488,6 @@
<inspection_tool class="CloneCallsConstructors" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CloneInNonCloneableClass" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CloneReturnsClassType" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="CollectionContainsUrl" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CollectionsFieldAccessReplaceableByMethodCall" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CommentAbsent" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="CommentedOutCode" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
@@ -512,11 +511,18 @@
<option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="true" />
</inspection_tool>
<inspection_tool class="ConstantMathCall" enabled="true" level="WARNING" enabled_by_default="true" />
+ <inspection_tool class="ConstantValue" enabled="true" level="WARNING" enabled_by_default="true">
+ <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="true" />
+ </inspection_tool>
<inspection_tool class="ConstantValueVariableUse" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="ContinueStatementWithLabel" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CovariantCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="CovariantEquals" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="DanglingJavadoc" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="DataFlowIssue" enabled="true" level="WARNING" enabled_by_default="true">
+ <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="true" />
+ <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
+ </inspection_tool>
<inspection_tool class="DataProviderReturnType" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="DelegatesTo" enabled="false" level="WARNING" enabled_by_default="false" />
@@ -543,8 +549,10 @@
<inspection_tool class="EnumerationCanBeIteration" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="EqualsAndHashcode" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="EqualsCalledOnEnumConstant" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="EqualsHashCodeCalledOnUrl" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="EqualsReplaceableByObjectsCall" enabled="true" level="INFORMATION" enabled_by_default="true" />
+ <inspection_tool class="EqualsWithItself" enabled="true" level="WARNING" enabled_by_default="true">
+ <option name="ignoreNonFinalClassesInTest" value="true" />
+ </inspection_tool>
<inspection_tool class="ExceptionFromCatchWhichDoesntWrap" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoreGetMessage" value="true" />
<option name="ignoreCantWrap" value="true" />
@@ -933,7 +941,6 @@
<inspection_tool class="RedundantImport" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="RedundantInnerClassModifier" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="RedundantLabelMigration" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
- <inspection_tool class="RedundantMethodOverride" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="RedundantNotNullExtensionReceiverOfInline" enabled="true" level="INFORMATION" enabled_by_default="true" />
<inspection_tool class="RedundantObjectTypeCheck" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
<inspection_tool class="RedundantStringOperation" enabled="false" level="WARNING" enabled_by_default="false" />
@@ -1032,13 +1039,11 @@
</option>
</inspection_tool>
<inspection_tool class="SuspiciousArrayCast" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="SuspiciousIndentAfterControlStatement" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SuspiciousLiteralUnderscore" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SuspiciousLocalesLanguages" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SwitchStatementDensity" enabled="true" level="WARNING" enabled_by_default="true">
<option name="m_limit" value="20" />
</inspection_tool>
- <inspection_tool class="SwitchStatementWithConfusingDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SynchronizationOnStaticField" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SynchronizeOnLock" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SynchronizedOnLiteralObject" enabled="true" level="WARNING" enabled_by_default="true" />
@@ -1070,7 +1075,6 @@
</inspection_tool>
<inspection_tool class="TransientFieldInNonSerializableClass" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="TransientFieldNotInitialized" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TrivialStringConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="TypeCustomizer" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="TypeParameterFindViewById" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="UElementAsPsi" enabled="false" level="WARNING" enabled_by_default="false" />
@@ -1172,7 +1176,7 @@
</value>
</option>
</inspection_tool>
- <inspection_tool class="unused" enabled="true" level="WARNING" enabled_by_default="true" checkParameterExcludingHierarchy="false" ignoreAccessors="true">
+ <inspection_tool class="unused" enabled="true" level="WARNING" enabled_by_default="true" ignoreAccessors="true" checkParameterExcludingHierarchy="false">
<option name="LOCAL_VARIABLE" value="true" />
<option name="FIELD" value="true" />
<option name="METHOD" value="true" />
@@ -1185,4 +1189,4 @@
<option name="ADD_NONJAVA_TO_ENTRIES" value="true" />
</inspection_tool>
</profile>
-</component>
+</component>
\ No newline at end of file
diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MarshallableTypesBlackList.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MarshallableTypesBlackList.java
new file mode 100644
index 0000000..a976b14
--- /dev/null
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MarshallableTypesBlackList.java
@@ -0,0 +1,107 @@
+/*
+ * 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.network.processor.messages;
+
+import java.nio.ByteBuffer;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import javax.lang.model.type.ArrayType;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.util.SimpleTypeVisitor9;
+import org.apache.ignite.internal.network.processor.TypeUtils;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.network.NetworkMessage;
+import org.apache.ignite.network.annotations.Marshallable;
+
+/**
+ * Class for checking that a given message field can be annotated as {@link Marshallable}. A message field can be annotated as
+ * {@code Marshallable} only if it is not supported by the Direct Marshaller natively.
+ */
+public class MarshallableTypesBlackList {
+ /** Types supported by the Direct Marshaller. */
+ public static final List<Class<?>> NATIVE_TYPES = List.of(
+ // Primitive type wrappers
+ Boolean.class,
+ Byte.class,
+ Character.class,
+ Short.class,
+ Integer.class,
+ Long.class,
+ Double.class,
+ Float.class,
+ Void.class,
+
+ // Other types
+ String.class,
+ UUID.class,
+ IgniteUuid.class,
+ BitSet.class,
+ ByteBuffer.class
+ );
+
+ private static final List<Class<?>> COLLECTION_TYPES = List.of(
+ Collection.class,
+ List.class,
+ Set.class,
+ Map.class
+ );
+
+ private final TypeVisitor typeVisitor;
+
+ MarshallableTypesBlackList(TypeUtils typeUtils) {
+ this.typeVisitor = new TypeVisitor(typeUtils);
+ }
+
+ boolean canBeMarshallable(TypeMirror type) {
+ return typeVisitor.visit(type);
+ }
+
+ private static class TypeVisitor extends SimpleTypeVisitor9<Boolean, Void> {
+ private final TypeUtils typeUtils;
+
+ TypeVisitor(TypeUtils typeUtils) {
+ super(false);
+
+ this.typeUtils = typeUtils;
+ }
+
+ @Override
+ public Boolean visitArray(ArrayType t, Void unused) {
+ return visit(t.getComponentType());
+ }
+
+ @Override
+ public Boolean visitDeclared(DeclaredType t, Void unused) {
+ // Check that nested collection types are also not supported by the Direct Marshaller.
+ if (isSameType(COLLECTION_TYPES, t)) {
+ return t.getTypeArguments().stream().anyMatch(this::visit);
+ }
+
+ return !isSameType(NATIVE_TYPES, t) && !typeUtils.isSubType(t, NetworkMessage.class);
+ }
+
+ private boolean isSameType(List<Class<?>> types, DeclaredType type) {
+ return types.stream().anyMatch(cls -> typeUtils.isSameType(type, cls));
+ }
+ }
+}
diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
index 826d988..a7693f4 100644
--- a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
@@ -75,6 +75,8 @@
private final TypeUtils typeUtils;
+ private final MarshallableTypesBlackList marshallableTypesBlackList;
+
/**
* Constructor.
*
@@ -85,6 +87,7 @@
this.processingEnv = processingEnv;
this.messageGroup = messageGroup;
this.typeUtils = new TypeUtils(processingEnv);
+ this.marshallableTypesBlackList = new MarshallableTypesBlackList(typeUtils);
}
/**
@@ -105,8 +108,8 @@
var fields = new ArrayList<FieldSpec>(getters.size());
var methodImpls = new ArrayList<MethodSpec>(getters.size());
- Set<String> notNullFieldNames = new HashSet<>();
- Set<String> marshallableFieldNames = new HashSet<>();
+ var notNullFieldNames = new HashSet<String>();
+ var marshallableFieldNames = new HashSet<String>();
// create a field and a getter implementation for every getter in the message interface
for (ExecutableElement getter : getters) {
@@ -115,39 +118,38 @@
String getterName = getter.getSimpleName().toString();
- FieldSpec.Builder fieldBuilder = FieldSpec.builder(getterReturnType, getterName)
- .addAnnotation(IgniteToStringInclude.class)
- .addModifiers(Modifier.PRIVATE);
-
boolean isMarshallable = getter.getAnnotation(Marshallable.class) != null;
- boolean isNotNull = shouldRequireNotNull(getter);
- boolean isNetworkMessage = typeUtils.isSubType(getterType, NetworkMessage.class);
- if (isMarshallable && isNetworkMessage) {
- String error =
- "Failed to process " + message.className() + ": " + getterName + " is both NetworkMessage and @Marshallable";
+ if (isMarshallable && !marshallableTypesBlackList.canBeMarshallable(getterType)) {
+ String error = String.format(
+ "\"%s\" field is marked as @Marshallable but this type is supported by native serialization, "
+ + "remove this annotation from the field",
+ getterName
+ );
throw new ProcessingException(error);
}
+ FieldSpec.Builder fieldBuilder = FieldSpec.builder(getterReturnType, getterName)
+ .addAnnotation(IgniteToStringInclude.class)
+ .addModifiers(Modifier.PRIVATE);
+
boolean generateSetter = getter.getAnnotation(WithSetter.class) != null;
if (!isMarshallable && !generateSetter) {
fieldBuilder.addModifiers(Modifier.FINAL);
}
- if (isNotNull) {
+ if (requiresNotNullCheck(getter)) {
notNullFieldNames.add(getterName);
}
- if (isMarshallable) {
- marshallableFieldNames.add(getterName);
- }
-
FieldSpec field = fieldBuilder.build();
fields.add(field);
if (isMarshallable) {
+ marshallableFieldNames.add(getterName);
+
String name = getByteArrayFieldName(getterName);
FieldSpec marshallableFieldArray = FieldSpec.builder(BYTE_ARRAY_TYPE, name)
.addModifiers(Modifier.PRIVATE)
@@ -758,7 +760,7 @@
.build();
}
- private static boolean shouldRequireNotNull(ExecutableElement el) {
+ private static boolean requiresNotNullCheck(ExecutableElement el) {
TypeMirror returnType = el.getReturnType();
TypeKind kind = returnType.getKind();
diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java
index 188aaa6..a9db7b7 100644
--- a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java
@@ -27,6 +27,7 @@
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.type.ArrayType;
import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import org.apache.ignite.internal.network.processor.ProcessingException;
@@ -115,10 +116,12 @@
private String resolveReferenceMethodName(DeclaredType parameterType) {
var typeUtils = new TypeUtils(processingEnvironment);
- if (typeUtils.isSameType(parameterType, String.class)) {
+ PrimitiveType unboxedType = typeUtils.unboxedType(parameterType);
+
+ if (unboxedType != null) {
+ return "Boxed" + resolvePrimitiveMethodName(unboxedType);
+ } else if (typeUtils.isSameType(parameterType, String.class)) {
return "String";
- } else if (typeUtils.isSameType(parameterType, Integer.class)) {
- return "BoxedInt";
} else if (typeUtils.isSameType(parameterType, UUID.class)) {
return "Uuid";
} else if (typeUtils.isSameType(parameterType, IgniteUuid.class)) {
diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java
index 6887f5e..279567f 100644
--- a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java
+++ b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java
@@ -39,21 +39,21 @@
*
* @param buf Byte buffer.
*/
- public void setBuffer(ByteBuffer buf);
+ void setBuffer(ByteBuffer buf);
/**
* Sets the type of the message that is currently being read.
*
* @param msgCls Message type.
*/
- public void setCurrentReadClass(Class<? extends NetworkMessage> msgCls);
+ void setCurrentReadClass(Class<? extends NetworkMessage> msgCls);
/**
* Callback that must be invoked by implementations of message serializers before they start decoding the message body.
*
* @return {@code True} if a read operation is allowed to proceed, {@code false} otherwise.
*/
- public boolean beforeMessageRead();
+ boolean beforeMessageRead();
/**
* Callback that must be invoked by implementations of message serializers after they finished decoding the message body.
@@ -61,7 +61,7 @@
* @param msgCls Class of the message that is finishing read stage.
* @return {@code True} if a read operation can be proceeded, {@code false} otherwise.
*/
- public boolean afterMessageRead(Class<? extends NetworkMessage> msgCls);
+ boolean afterMessageRead(Class<? extends NetworkMessage> msgCls);
/**
* Reads a {@code byte} value.
@@ -69,7 +69,15 @@
* @param name Field name.
* @return {@code byte} value.
*/
- public byte readByte(String name);
+ byte readByte(String name);
+
+ /**
+ * Reads a {@code Byte} value.
+ *
+ * @param name Field name.
+ * @return {@code Byte} value.
+ */
+ @Nullable Byte readBoxedByte(String name);
/**
* Reads a {@code short} value.
@@ -77,7 +85,15 @@
* @param name Field name.
* @return {@code short} value.
*/
- public short readShort(String name);
+ short readShort(String name);
+
+ /**
+ * Reads a {@code Short} value.
+ *
+ * @param name Field name.
+ * @return {@code Short} value.
+ */
+ @Nullable Short readBoxedShort(String name);
/**
* Reads an {@code int} value.
@@ -85,7 +101,7 @@
* @param name Field name.
* @return {@code int} value.
*/
- public int readInt(String name);
+ int readInt(String name);
/**
* Reads an {@code int} value.
@@ -94,7 +110,7 @@
* @param dflt A default value if the field is not found.
* @return {@code int} value.
*/
- public int readInt(String name, int dflt);
+ int readInt(String name, int dflt);
/**
* Reads an {@code Integer} value.
@@ -102,7 +118,7 @@
* @param name Field name.
* @return {@code Integer} value.
*/
- public @Nullable Integer readBoxedInt(String name);
+ @Nullable Integer readBoxedInt(String name);
/**
* Reads a {@code long} value.
@@ -110,7 +126,15 @@
* @param name Field name.
* @return {@code long} value.
*/
- public long readLong(String name);
+ long readLong(String name);
+
+ /**
+ * Reads a {@code Long} value.
+ *
+ * @param name Field name.
+ * @return {@code Long} value.
+ */
+ @Nullable Long readBoxedLong(String name);
/**
* Reads a {@code float} value.
@@ -118,7 +142,15 @@
* @param name Field name.
* @return {@code float} value.
*/
- public float readFloat(String name);
+ float readFloat(String name);
+
+ /**
+ * Reads a {@code Float} value.
+ *
+ * @param name Field name.
+ * @return {@code Float} value.
+ */
+ @Nullable Float readBoxedFloat(String name);
/**
* Reads a {@code double} value.
@@ -126,7 +158,15 @@
* @param name Field name.
* @return {@code double} value.
*/
- public double readDouble(String name);
+ double readDouble(String name);
+
+ /**
+ * Reads a {@code Double} value.
+ *
+ * @param name Field name.
+ * @return {@code Double} value.
+ */
+ @Nullable Double readBoxedDouble(String name);
/**
* Reads a {@code char} value.
@@ -134,7 +174,15 @@
* @param name Field name.
* @return {@code char} value.
*/
- public char readChar(String name);
+ char readChar(String name);
+
+ /**
+ * Reads a {@code Character} value.
+ *
+ * @param name Field name.
+ * @return {@code Character} value.
+ */
+ @Nullable Character readBoxedChar(String name);
/**
* Reads a {@code boolean} value.
@@ -142,7 +190,15 @@
* @param name Field name.
* @return {@code boolean} value.
*/
- public boolean readBoolean(String name);
+ boolean readBoolean(String name);
+
+ /**
+ * Reads a {@code Boolean} value.
+ *
+ * @param name Field name.
+ * @return {@code Boolean} value.
+ */
+ @Nullable Boolean readBoxedBoolean(String name);
/**
* Reads a {@code byte} array.
@@ -150,7 +206,7 @@
* @param name Field name.
* @return {@code byte} array.
*/
- public byte[] readByteArray(String name);
+ byte[] readByteArray(String name);
/**
* Reads a {@code short} array.
@@ -158,7 +214,7 @@
* @param name Field name.
* @return {@code short} array.
*/
- public short[] readShortArray(String name);
+ short[] readShortArray(String name);
/**
* Reads an {@code int} array.
@@ -166,7 +222,7 @@
* @param name Field name.
* @return {@code int} array.
*/
- public int[] readIntArray(String name);
+ int[] readIntArray(String name);
/**
* Reads a {@code long} array.
@@ -174,7 +230,7 @@
* @param name Field name.
* @return {@code long} array.
*/
- public long[] readLongArray(String name);
+ long[] readLongArray(String name);
/**
* Reads a {@code float} array.
@@ -182,7 +238,7 @@
* @param name Field name.
* @return {@code float} array.
*/
- public float[] readFloatArray(String name);
+ float[] readFloatArray(String name);
/**
* Reads a {@code double} array.
@@ -190,7 +246,7 @@
* @param name Field name.
* @return {@code double} array.
*/
- public double[] readDoubleArray(String name);
+ double[] readDoubleArray(String name);
/**
* Reads a {@code char} array.
@@ -198,7 +254,7 @@
* @param name Field name.
* @return {@code char} array.
*/
- public char[] readCharArray(String name);
+ char[] readCharArray(String name);
/**
* Reads a {@code boolean} array.
@@ -206,7 +262,7 @@
* @param name Field name.
* @return {@code boolean} array.
*/
- public boolean[] readBooleanArray(String name);
+ boolean[] readBooleanArray(String name);
/**
* Reads a {@link String}.
@@ -214,7 +270,7 @@
* @param name Field name.
* @return {@link String}.
*/
- public String readString(String name);
+ String readString(String name);
/**
* Reads a {@link BitSet}.
@@ -222,7 +278,7 @@
* @param name Field name.
* @return {@link BitSet}.
*/
- public BitSet readBitSet(String name);
+ BitSet readBitSet(String name);
/**
* Reads a {@link ByteBuffer}.
@@ -238,7 +294,7 @@
* @param name Field name.
* @return {@link UUID}.
*/
- public UUID readUuid(String name);
+ UUID readUuid(String name);
/**
* Reads an {@link IgniteUuid}.
@@ -246,69 +302,69 @@
* @param name Field name.
* @return {@link IgniteUuid}.
*/
- public IgniteUuid readIgniteUuid(String name);
+ IgniteUuid readIgniteUuid(String name);
/**
* Reads a nested message.
*
- * @param <T> Type of a message;
+ * @param <T> Type of a message;
* @param name Field name.
* @return Message.
*/
- public <T extends NetworkMessage> T readMessage(String name);
+ <T extends NetworkMessage> T readMessage(String name);
/**
* Reads an array of objects.
*
- * @param <T> Type of an array.
- * @param name Field name.
+ * @param <T> Type of an array.
+ * @param name Field name.
* @param itemType A component type of the array.
- * @param itemCls A component class of the array.
+ * @param itemCls A component class of the array.
* @return Array of objects.
*/
- public <T> T[] readObjectArray(String name, MessageCollectionItemType itemType, Class<T> itemCls);
+ <T> T[] readObjectArray(String name, MessageCollectionItemType itemType, Class<T> itemCls);
/**
* Reads a collection.
*
- * @param <C> Type of collection.
- * @param name Field name.
+ * @param <C> Type of collection.
+ * @param name Field name.
* @param itemType An item type of the collection.
* @return Collection.
*/
- public <C extends Collection<?>> C readCollection(String name, MessageCollectionItemType itemType);
+ <C extends Collection<?>> C readCollection(String name, MessageCollectionItemType itemType);
/**
* Reads a list.
*
- * @param <C> Type of list.
- * @param name Field name.
+ * @param <C> Type of list.
+ * @param name Field name.
* @param itemType An item type of the list.
* @return List.
*/
- public <C extends List<?>> C readList(String name, MessageCollectionItemType itemType);
+ <C extends List<?>> C readList(String name, MessageCollectionItemType itemType);
/**
* Reads a set.
*
- * @param <C> Type of set.
- * @param name Field name.
+ * @param <C> Type of set.
+ * @param name Field name.
* @param itemType An item type of the set.
* @return Set.
*/
- public <C extends Set<?>> C readSet(String name, MessageCollectionItemType itemType);
+ <C extends Set<?>> C readSet(String name, MessageCollectionItemType itemType);
/**
* Reads a map.
*
- * @param <M> Type of a map.
- * @param name Field name.
+ * @param <M> Type of a map.
+ * @param name Field name.
* @param keyType The type of the map's key.
* @param valType The type of the map's value.
- * @param linked Whether a {@link LinkedHashMap} should be created.
+ * @param linked Whether a {@link LinkedHashMap} should be created.
* @return Map.
*/
- public <M extends Map<?, ?>> M readMap(String name, MessageCollectionItemType keyType,
+ <M extends Map<?, ?>> M readMap(String name, MessageCollectionItemType keyType,
MessageCollectionItemType valType, boolean linked);
/**
@@ -317,34 +373,34 @@
*
* @return Whether the last value was fully read.
*/
- public boolean isLastRead();
+ boolean isLastRead();
/**
* Gets a current read state.
*
* @return Read state.
*/
- public int state();
+ int state();
/**
* Increments a read state.
*/
- public void incrementState();
+ void incrementState();
/**
* Callback called before an inner message is read.
*/
- public void beforeInnerMessageRead();
+ void beforeInnerMessageRead();
/**
* Callback called after an inner message is read.
*
* @param finished Whether a message was fully read.
*/
- public void afterInnerMessageRead(boolean finished);
+ void afterInnerMessageRead(boolean finished);
/**
* Resets this reader.
*/
- public void reset();
+ void reset();
}
diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java
index 776b369..ec133bb 100644
--- a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java
+++ b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java
@@ -38,216 +38,279 @@
*
* @param buf Byte buffer.
*/
- public void setBuffer(ByteBuffer buf);
+ void setBuffer(ByteBuffer buf);
/**
* Sets the type of the message that is currently being written.
*
* @param msgCls Message type.
*/
- public void setCurrentWriteClass(Class<? extends NetworkMessage> msgCls);
+ void setCurrentWriteClass(Class<? extends NetworkMessage> msgCls);
/**
* Writes the header of a message.
*
- * @param groupType Message group type.
+ * @param groupType Message group type.
* @param messageType Message type.
- * @param fieldCnt Fields count.
+ * @param fieldCnt Fields count.
* @return {@code true} if successfully. Otherwise returns {@code false}.
*/
- public boolean writeHeader(short groupType, short messageType, byte fieldCnt);
+ boolean writeHeader(short groupType, short messageType, byte fieldCnt);
/**
* Writes a {@code byte} value.
*
* @param name Field name.
- * @param val {@code byte} value.
+ * @param val {@code byte} value.
* @return Whether a value was fully written.
*/
- public boolean writeByte(String name, byte val);
+ boolean writeByte(String name, byte val);
+
+ /**
+ * Writes a {@code Byte} value.
+ *
+ * @param name Field name.
+ * @param val {@code Byte} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedByte(String name, @Nullable Byte val);
/**
* Writes a {@code short} value.
*
* @param name Field name.
- * @param val {@code short} value.
+ * @param val {@code short} value.
* @return Whether a value was fully written.
*/
- public boolean writeShort(String name, short val);
+ boolean writeShort(String name, short val);
+
+ /**
+ * Writes a {@code Short} value.
+ *
+ * @param name Field name.
+ * @param val {@code Short} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedShort(String name, @Nullable Short val);
/**
* Writes an {@code int} value.
*
* @param name Field name.
- * @param val {@code int} value.
+ * @param val {@code int} value.
* @return Whether a value was fully written.
*/
- public boolean writeInt(String name, int val);
+ boolean writeInt(String name, int val);
/**
* Writes an {@code Integer} value.
*
* @param name Field name.
- * @param val {@code Integer} value.
+ * @param val {@code Integer} value.
* @return Whether a value was fully written.
*/
- public boolean writeBoxedInt(String name, @Nullable Integer val);
+ boolean writeBoxedInt(String name, @Nullable Integer val);
/**
* Writes a {@code long} value.
*
* @param name Field name.
- * @param val {@code long} value.
+ * @param val {@code long} value.
* @return Whether a value was fully written.
*/
- public boolean writeLong(String name, long val);
+ boolean writeLong(String name, long val);
+
+ /**
+ * Writes a {@code Long} value.
+ *
+ * @param name Field name.
+ * @param val {@code Long} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedLong(String name, @Nullable Long val);
/**
* Writes a {@code float} value.
*
* @param name Field name.
- * @param val {@code float} value.
+ * @param val {@code float} value.
* @return Whether a value was fully written.
*/
- public boolean writeFloat(String name, float val);
+ boolean writeFloat(String name, float val);
+
+ /**
+ * Writes a {@code Float} value.
+ *
+ * @param name Field name.
+ * @param val {@code Float} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedFloat(String name, @Nullable Float val);
/**
* Writes a {@code double} value.
*
* @param name Field name.
- * @param val {@code double} value.
+ * @param val {@code double} value.
* @return Whether a value was fully written.
*/
- public boolean writeDouble(String name, double val);
+ boolean writeDouble(String name, double val);
+
+ /**
+ * Writes a {@code Double} value.
+ *
+ * @param name Field name.
+ * @param val {@code Short} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedDouble(String name, @Nullable Double val);
/**
* Writes a {@code char} value.
*
* @param name Field name.
- * @param val {@code char} value.
+ * @param val {@code char} value.
* @return Whether a value was fully written.
*/
- public boolean writeChar(String name, char val);
+ boolean writeChar(String name, char val);
+
+ /**
+ * Writes a {@code Character} value.
+ *
+ * @param name Field name.
+ * @param val {@code Character} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedChar(String name, @Nullable Character val);
/**
* Writes a {@code boolean} value.
*
* @param name Field name.
- * @param val {@code boolean} value.
+ * @param val {@code boolean} value.
* @return Whether a value was fully written.
*/
- public boolean writeBoolean(String name, boolean val);
+ boolean writeBoolean(String name, boolean val);
+
+ /**
+ * Writes a {@code Boolean} value.
+ *
+ * @param name Field name.
+ * @param val {@code Boolean} value.
+ * @return Whether a value was fully written.
+ */
+ boolean writeBoxedBoolean(String name, @Nullable Boolean val);
/**
* Writes a {@code byte} array.
*
* @param name Field name.
- * @param val {@code byte} array.
+ * @param val {@code byte} array.
* @return Whether an array was fully written.
*/
- public boolean writeByteArray(String name, byte[] val);
+ boolean writeByteArray(String name, byte[] val);
/**
* Writes a {@code byte} array.
*
* @param name Field name.
- * @param val {@code byte} array.
- * @param off Offset.
- * @param len Length.
+ * @param val {@code byte} array.
+ * @param off Offset.
+ * @param len Length.
* @return Whether an array was fully written.
*/
- public boolean writeByteArray(String name, byte[] val, long off, int len);
+ boolean writeByteArray(String name, byte[] val, long off, int len);
/**
* Writes a {@code short} array.
*
* @param name Field name.
- * @param val {@code short} array.
+ * @param val {@code short} array.
* @return Whether an array was fully written.
*/
- public boolean writeShortArray(String name, short[] val);
+ boolean writeShortArray(String name, short[] val);
/**
* Writes an {@code int} array.
*
* @param name Field name.
- * @param val {@code int} array.
+ * @param val {@code int} array.
* @return Whether an array was fully written.
*/
- public boolean writeIntArray(String name, int[] val);
+ boolean writeIntArray(String name, int[] val);
/**
* Writes a {@code long} array.
*
* @param name Field name.
- * @param val {@code long} array.
+ * @param val {@code long} array.
* @return Whether an array was fully written.
*/
- public boolean writeLongArray(String name, long[] val);
+ boolean writeLongArray(String name, long[] val);
/**
* Writes a {@code long} array.
*
* @param name Field name.
- * @param val {@code long} array.
- * @param len Length.
+ * @param val {@code long} array.
+ * @param len Length.
* @return Whether an array was fully written.
*/
- public boolean writeLongArray(String name, long[] val, int len);
+ boolean writeLongArray(String name, long[] val, int len);
/**
* Writes a {@code float} array.
*
* @param name Field name.
- * @param val {@code float} array.
+ * @param val {@code float} array.
* @return Whether an array was fully written.
*/
- public boolean writeFloatArray(String name, float[] val);
+ boolean writeFloatArray(String name, float[] val);
/**
* Writes a {@code double} array.
*
* @param name Field name.
- * @param val {@code double} array.
+ * @param val {@code double} array.
* @return Whether an array was fully written.
*/
- public boolean writeDoubleArray(String name, double[] val);
+ boolean writeDoubleArray(String name, double[] val);
/**
* Writes a {@code char} array.
*
* @param name Field name.
- * @param val {@code char} array.
+ * @param val {@code char} array.
* @return Whether an array was fully written.
*/
- public boolean writeCharArray(String name, char[] val);
+ boolean writeCharArray(String name, char[] val);
/**
* Writes a {@code boolean} array.
*
* @param name Field name.
- * @param val {@code boolean} array.
+ * @param val {@code boolean} array.
* @return Whether an array was fully written.
*/
- public boolean writeBooleanArray(String name, boolean[] val);
+ boolean writeBooleanArray(String name, boolean[] val);
/**
* Writes a {@link String}.
*
* @param name Field name.
- * @param val {@link String}.
+ * @param val {@link String}.
* @return Whether a value was fully written.
*/
- public boolean writeString(String name, String val);
+ boolean writeString(String name, String val);
/**
* Writes a {@link BitSet}.
*
* @param name Field name.
- * @param val {@link BitSet}.
+ * @param val {@link BitSet}.
* @return Whether a value was fully written.
*/
- public boolean writeBitSet(String name, BitSet val);
+ boolean writeBitSet(String name, BitSet val);
/**
* Writes a {@link ByteBuffer}.
@@ -262,85 +325,85 @@
* Writes an {@link UUID}.
*
* @param name Field name.
- * @param val {@link UUID}.
+ * @param val {@link UUID}.
* @return Whether a value was fully written.
*/
- public boolean writeUuid(String name, UUID val);
+ boolean writeUuid(String name, UUID val);
/**
* Writes an {@link IgniteUuid}.
*
* @param name Field name.
- * @param val {@link IgniteUuid}.
+ * @param val {@link IgniteUuid}.
* @return Whether a value was fully written.
*/
- public boolean writeIgniteUuid(String name, IgniteUuid val);
+ boolean writeIgniteUuid(String name, IgniteUuid val);
/**
* Writes a nested message.
*
* @param name Field name.
- * @param val Message.
+ * @param val Message.
* @return Whether a value was fully written.
*/
- public boolean writeMessage(String name, NetworkMessage val);
+ boolean writeMessage(String name, NetworkMessage val);
/**
* Writes an array of objects.
*
- * @param <T> Type of an array.
- * @param name Field name.
- * @param arr Array of objects.
+ * @param <T> Type of an array.
+ * @param name Field name.
+ * @param arr Array of objects.
* @param itemType A component type of the array.
* @return Whether an array was fully written.
*/
- public <T> boolean writeObjectArray(String name, T[] arr, MessageCollectionItemType itemType);
+ <T> boolean writeObjectArray(String name, T[] arr, MessageCollectionItemType itemType);
/**
* Writes collection.
*
- * @param <T> Type of a collection.
- * @param name Field name.
- * @param col Collection.
+ * @param <T> Type of a collection.
+ * @param name Field name.
+ * @param col Collection.
* @param itemType An item type of the collection.
* @return Whether a value was fully written.
*/
- public <T> boolean writeCollection(String name, Collection<T> col, MessageCollectionItemType itemType);
+ <T> boolean writeCollection(String name, Collection<T> col, MessageCollectionItemType itemType);
/**
* Writes a list.
*
- * @param <T> Type of list.
- * @param name Field name.
- * @param col Collection.
+ * @param <T> Type of list.
+ * @param name Field name.
+ * @param col Collection.
* @param itemType An item type of the list.
* @return Whether a value was fully written.
*/
- public <T> boolean writeList(String name, List<T> col, MessageCollectionItemType itemType);
+ <T> boolean writeList(String name, List<T> col, MessageCollectionItemType itemType);
/**
* Writes a set.
*
- * @param <T> Type of set.
- * @param name Field name.
- * @param col Collection.
+ * @param <T> Type of set.
+ * @param name Field name.
+ * @param col Collection.
* @param itemType An item type of the set.
* @return Whether a value was fully written.
*/
- public <T> boolean writeSet(String name, Set<T> col, MessageCollectionItemType itemType);
+ <T> boolean writeSet(String name, Set<T> col, MessageCollectionItemType itemType);
/**
* Writes a map.
*
- * @param <K> Type of the map's keys.
- * @param <V> Type of the map's values.
- * @param name Field name.
- * @param map Map.
+ * @param <K> Type of the map's keys.
+ * @param <V> Type of the map's values.
+ * @param name Field name.
+ * @param map Map.
* @param keyType The type of the map's key.
* @param valType The type of the map's value.
* @return Whether a value was fully written.
*/
- public <K, V> boolean writeMap(String name, Map<K, V> map, MessageCollectionItemType keyType,
+ <K, V> boolean writeMap(String name, Map<K, V> map, MessageCollectionItemType keyType,
MessageCollectionItemType valType);
/**
@@ -348,39 +411,39 @@
*
* @return Whether the message header has already been written.
*/
- public boolean isHeaderWritten();
+ boolean isHeaderWritten();
/**
* Callback called when the header of the message is written.
*/
- public void onHeaderWritten();
+ void onHeaderWritten();
/**
* Gets a current message state.
*
* @return State.
*/
- public int state();
+ int state();
/**
* Increments a state.
*/
- public void incrementState();
+ void incrementState();
/**
* Callback called before an inner message is written.
*/
- public void beforeInnerMessageWrite();
+ void beforeInnerMessageWrite();
/**
* Callback called after an inner message is written.
*
* @param finished Whether the message was fully written.
*/
- public void afterInnerMessageWrite(boolean finished);
+ void afterInnerMessageWrite(boolean finished);
/**
* Resets this writer.
*/
- public void reset();
+ void reset();
}
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java
index b42b8c0..e11b5a3 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java
@@ -94,6 +94,17 @@
return val;
}
+ @Override
+ public @Nullable Byte readBoxedByte(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Byte val = stream.readBoxedByte();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Override
public short readShort(String name) {
@@ -106,6 +117,17 @@
return val;
}
+ @Override
+ public @Nullable Short readBoxedShort(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Short val = stream.readBoxedShort();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Override
public int readInt(String name) {
@@ -125,7 +147,7 @@
}
@Override
- public Integer readBoxedInt(String name) {
+ public @Nullable Integer readBoxedInt(String name) {
DirectByteBufferStream stream = state.item().stream;
Integer val = stream.readBoxedInt();
@@ -147,6 +169,17 @@
return val;
}
+ @Override
+ public @Nullable Long readBoxedLong(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Long val = stream.readBoxedLong();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Override
public float readFloat(String name) {
@@ -159,6 +192,17 @@
return val;
}
+ @Override
+ public @Nullable Float readBoxedFloat(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Float val = stream.readBoxedFloat();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Override
public double readDouble(String name) {
@@ -171,6 +215,17 @@
return val;
}
+ @Override
+ public @Nullable Double readBoxedDouble(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Double val = stream.readBoxedDouble();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Override
public char readChar(String name) {
@@ -183,6 +238,17 @@
return val;
}
+ @Override
+ public @Nullable Character readBoxedChar(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Character val = stream.readBoxedChar();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Override
public boolean readBoolean(String name) {
@@ -195,6 +261,17 @@
return val;
}
+ @Override
+ public @Nullable Boolean readBoxedBoolean(String name) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ Boolean val = stream.readBoxedBoolean();
+
+ lastRead = stream.lastFinished();
+
+ return val;
+ }
+
/** {@inheritDoc} */
@Nullable
@Override
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
index 43bf3f1..cbc8798 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
@@ -96,6 +96,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedByte(String name, @Nullable Byte val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedByte(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeShort(String name, short val) {
@@ -106,6 +115,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedShort(String name, @Nullable Short val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedShort(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeInt(String name, int val) {
@@ -117,7 +135,7 @@
}
@Override
- public boolean writeBoxedInt(String name, Integer val) {
+ public boolean writeBoxedInt(String name, @Nullable Integer val) {
DirectByteBufferStream stream = state.item().stream;
stream.writeBoxedInt(val);
@@ -135,6 +153,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedLong(String name, @Nullable Long val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedLong(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeFloat(String name, float val) {
@@ -145,6 +172,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedFloat(String name, @Nullable Float val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedFloat(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeDouble(String name, double val) {
@@ -155,6 +191,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedDouble(String name, @Nullable Double val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedDouble(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeChar(String name, char val) {
@@ -165,6 +210,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedChar(String name, @Nullable Character val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedChar(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeBoolean(String name, boolean val) {
@@ -175,6 +229,15 @@
return stream.lastFinished();
}
+ @Override
+ public boolean writeBoxedBoolean(String name, @Nullable Boolean val) {
+ DirectByteBufferStream stream = state.item().stream;
+
+ stream.writeBoxedBoolean(val);
+
+ return stream.lastFinished();
+ }
+
/** {@inheritDoc} */
@Override
public boolean writeByteArray(String name, @Nullable byte[] val) {
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java
index fa5e097..b4af087 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java
@@ -63,6 +63,13 @@
void writeByte(byte val);
/**
+ * Writes {@code Byte}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedByte(@Nullable Byte val);
+
+ /**
* Writes {@code short}.
*
* @param val Value.
@@ -70,6 +77,13 @@
void writeShort(short val);
/**
+ * Writes {@code Short}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedShort(@Nullable Short val);
+
+ /**
* Writes {@code int}.
*
* @param val Value.
@@ -91,6 +105,13 @@
void writeLong(long val);
/**
+ * Writes {@code Long}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedLong(@Nullable Long val);
+
+ /**
* Writes {@code float}.
*
* @param val Value.
@@ -98,6 +119,13 @@
void writeFloat(float val);
/**
+ * Writes {@code Float}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedFloat(@Nullable Float val);
+
+ /**
* Writes {@code double}.
*
* @param val Value.
@@ -105,6 +133,13 @@
void writeDouble(double val);
/**
+ * Writes {@code Double}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedDouble(@Nullable Double val);
+
+ /**
* Writes {@code char}.
*
* @param val Value.
@@ -112,6 +147,13 @@
void writeChar(char val);
/**
+ * Writes {@code Character}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedChar(@Nullable Character val);
+
+ /**
* Writes {@code boolean}.
*
* @param val Value.
@@ -119,6 +161,13 @@
void writeBoolean(boolean val);
/**
+ * Writes {@code Boolean}.
+ *
+ * @param val Value.
+ */
+ void writeBoxedBoolean(@Nullable Boolean val);
+
+ /**
* Writes {@code byte} array.
*
* @param val Value.
@@ -285,6 +334,13 @@
byte readByte();
/**
+ * Reads {@code Byte}.
+ *
+ * @return Value.
+ */
+ @Nullable Byte readBoxedByte();
+
+ /**
* Reads {@code short}.
*
* @return Value.
@@ -292,6 +348,13 @@
short readShort();
/**
+ * Reads {@code Short}.
+ *
+ * @return Value.
+ */
+ @Nullable Short readBoxedShort();
+
+ /**
* Reads {@code int}.
*
* @return Value.
@@ -313,6 +376,13 @@
long readLong();
/**
+ * Reads {@code Long}.
+ *
+ * @return Value.
+ */
+ @Nullable Long readBoxedLong();
+
+ /**
* Reads {@code float}.
*
* @return Value.
@@ -320,6 +390,13 @@
float readFloat();
/**
+ * Reads {@code Float}.
+ *
+ * @return Value.
+ */
+ @Nullable Float readBoxedFloat();
+
+ /**
* Reads {@code double}.
*
* @return Value.
@@ -327,6 +404,13 @@
double readDouble();
/**
+ * Reads {@code Double}.
+ *
+ * @return Value.
+ */
+ @Nullable Double readBoxedDouble();
+
+ /**
* Reads {@code char}.
*
* @return Value.
@@ -334,6 +418,13 @@
char readChar();
/**
+ * Reads {@code Character}.
+ *
+ * @return Value.
+ */
+ @Nullable Character readBoxedChar();
+
+ /**
* Reads {@code boolean}.
*
* @return Value.
@@ -341,6 +432,13 @@
boolean readBoolean();
/**
+ * Reads {@code Boolean}.
+ *
+ * @return Value.
+ */
+ @Nullable Boolean readBoxedBoolean();
+
+ /**
* Reads {@code byte} array.
*
* @return Value.
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
index 069450d..0bf37f5 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
@@ -49,6 +49,7 @@
import java.util.Set;
import java.util.UUID;
import java.util.function.IntFunction;
+import java.util.function.Supplier;
import org.apache.ignite.internal.util.ArrayFactory;
import org.apache.ignite.internal.util.GridUnsafe;
import org.apache.ignite.internal.util.IgniteUtils;
@@ -109,6 +110,15 @@
*/
private short msgGroupType;
+ /**
+ * Flag needed for reading boxed primitives.
+ *
+ * <p>Boxed primitives are encoded as a boolean flag ({@code false} meaning that the boxed value is {@code null}), followed by the
+ * unboxed value (if not null). Therefore, this flag value must be cached between two unsuccessful read calls in case the received boxed
+ * primitive was not {@code null}.
+ */
+ private boolean boxedTypeNotNull;
+
@Nullable
private MessageDeserializer<NetworkMessage> msgDeserializer;
@@ -208,6 +218,21 @@
}
}
+ @Override
+ public void writeBoxedByte(@Nullable Byte val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 1;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeByte(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeShort(short val) {
@@ -228,6 +253,21 @@
}
}
+ @Override
+ public void writeBoxedShort(@Nullable Short val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 2;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeShort(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeInt(int val) {
@@ -253,7 +293,7 @@
}
@Override
- public void writeBoxedInt(Integer val) {
+ public void writeBoxedInt(@Nullable Integer val) {
if (val != null) {
lastFinished = buf.remaining() >= 1 + 5;
@@ -291,6 +331,21 @@
}
}
+ @Override
+ public void writeBoxedLong(@Nullable Long val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 10;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeLong(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeFloat(float val) {
@@ -311,6 +366,21 @@
}
}
+ @Override
+ public void writeBoxedFloat(@Nullable Float val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 4;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeFloat(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeDouble(double val) {
@@ -331,6 +401,21 @@
}
}
+ @Override
+ public void writeBoxedDouble(@Nullable Double val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 8;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeDouble(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeChar(char val) {
@@ -351,6 +436,21 @@
}
}
+ @Override
+ public void writeBoxedChar(@Nullable Character val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 2;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeChar(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeBoolean(boolean val) {
@@ -365,6 +465,21 @@
}
}
+ @Override
+ public void writeBoxedBoolean(@Nullable Boolean val) {
+ if (val != null) {
+ lastFinished = buf.remaining() >= 1 + 1;
+
+ if (lastFinished) {
+ writeBoolean(true);
+
+ writeBoolean(val);
+ }
+ } else {
+ writeBoolean(false);
+ }
+ }
+
/** {@inheritDoc} */
@Override
public void writeByteArray(byte[] val) {
@@ -869,6 +984,29 @@
}
}
+ @Override
+ public @Nullable Byte readBoxedByte() {
+ return readBoxedValue(this::readByte);
+ }
+
+ private <T> @Nullable T readBoxedValue(Supplier<T> valueReader) {
+ // First, check if we have read the null flag in a previous call.
+ if (boxedTypeNotNull || readBoolean()) {
+ boxedTypeNotNull = true;
+
+ T result = valueReader.get();
+
+ // If the whole value has been read successfully, reset the state.
+ if (lastFinished) {
+ boxedTypeNotNull = false;
+ }
+
+ return result;
+ } else {
+ return null;
+ }
+ }
+
/** {@inheritDoc} */
@Override
public short readShort() {
@@ -887,6 +1025,11 @@
}
}
+ @Override
+ public @Nullable Short readBoxedShort() {
+ return readBoxedValue(this::readShort);
+ }
+
/** {@inheritDoc} */
@Override
public int readInt() {
@@ -925,20 +1068,8 @@
}
@Override
- public Integer readBoxedInt() {
- int pos = buf.position();
-
- int limit = buf.limit();
-
- if (limit - pos >= 5) {
- if (readBoolean()) {
- return readInt();
- } else {
- return null;
- }
- }
-
- return null;
+ public @Nullable Integer readBoxedInt() {
+ return readBoxedValue(this::readInt);
}
/** {@inheritDoc} */
@@ -978,6 +1109,11 @@
return val;
}
+ @Override
+ public @Nullable Long readBoxedLong() {
+ return readBoxedValue(this::readLong);
+ }
+
/** {@inheritDoc} */
@Override
public float readFloat() {
@@ -996,6 +1132,11 @@
}
}
+ @Override
+ public @Nullable Float readBoxedFloat() {
+ return readBoxedValue(this::readFloat);
+ }
+
/** {@inheritDoc} */
@Override
public double readDouble() {
@@ -1014,6 +1155,11 @@
}
}
+ @Override
+ public @Nullable Double readBoxedDouble() {
+ return readBoxedValue(this::readDouble);
+ }
+
/** {@inheritDoc} */
@Override
public char readChar() {
@@ -1032,6 +1178,11 @@
}
}
+ @Override
+ public @Nullable Character readBoxedChar() {
+ return readBoxedValue(this::readChar);
+ }
+
/** {@inheritDoc} */
@Override
public boolean readBoolean() {
@@ -1048,6 +1199,11 @@
}
}
+ @Override
+ public @Nullable Boolean readBoxedBoolean() {
+ return readBoxedValue(this::readBoolean);
+ }
+
/** {@inheritDoc} */
@Override
public byte[] readByteArray() {
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java b/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java
index f27b3f8..afd799c 100644
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java
@@ -106,23 +106,27 @@
*/
@Nullable
private static Object randomValue(Random random, Field field, boolean nestedMsg) {
+ if (field.isAnnotationPresent(Nullable.class) && random.nextBoolean()) {
+ return null;
+ }
+
Class<?> type = field.getType();
- if (type == byte.class) {
+ if (type == byte.class || type == Byte.class) {
return (byte) random.nextInt();
- } else if (type == short.class) {
+ } else if (type == short.class || type == Short.class) {
return (short) random.nextInt();
- } else if (type == int.class) {
+ } else if (type == int.class || type == Integer.class) {
return random.nextInt();
- } else if (type == long.class) {
+ } else if (type == long.class || type == Long.class) {
return random.nextLong();
- } else if (type == float.class) {
+ } else if (type == float.class || type == Float.class) {
return random.nextFloat();
- } else if (type == double.class) {
+ } else if (type == double.class || type == Double.class) {
return random.nextDouble();
- } else if (type == char.class) {
+ } else if (type == char.class || type == Character.class) {
return (char) random.nextInt();
- } else if (type == boolean.class) {
+ } else if (type == boolean.class || type == Boolean.class) {
return random.nextBoolean();
} else if (type == byte[].class) {
int byteArrLen = random.nextInt(1024);
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/MarshallableBlacklistTest.java b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/MarshallableBlacklistTest.java
new file mode 100644
index 0000000..a2f0e99
--- /dev/null
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/MarshallableBlacklistTest.java
@@ -0,0 +1,174 @@
+/*
+ * 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.network.processor;
+
+import static com.google.testing.compile.CompilationSubject.assertThat;
+import static com.google.testing.compile.JavaFileObjects.forResource;
+import static com.google.testing.compile.JavaFileObjects.forSourceLines;
+import static org.junit.jupiter.params.provider.Arguments.arguments;
+
+import com.google.testing.compile.Compilation;
+import com.google.testing.compile.Compiler;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.stream.Stream;
+import javax.tools.JavaFileObject;
+import org.apache.ignite.internal.network.processor.messages.MarshallableTypesBlackList;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Test case for the marshallable types blacklist.
+ */
+public class MarshallableBlacklistTest {
+ private static final JavaFileObject MESSAGE_GROUP = forResource("org/apache/ignite/internal/network/processor/TestMessageGroup.java");
+
+ /**
+ * Compiler instance configured with the annotation processor being tested.
+ */
+ private final Compiler compiler = Compiler.javac().withProcessors(new TransferableObjectProcessor());
+
+ private static List<String> marshallableFieldSourceCode(Class<?> fieldType) {
+ return testMessageSourceCode(String.format("%s foo();", fieldType.getName()));
+ }
+
+ private static List<String> marshallableCollectionSourceCode(Class<?> collectionType, Class<?> fieldType) {
+ return testMessageSourceCode(String.format("%s<%s> foo();", collectionType.getName(), fieldType.getName()));
+ }
+
+ private static List<String> marshallableArraySourceCode(Class<?> fieldType) {
+ return testMessageSourceCode(String.format("%s[] foo();", fieldType.getName()));
+ }
+
+ private static List<String> marshallableMapSourceCode(Class<?> keyType, Class<?> valueType) {
+ return testMessageSourceCode(String.format("%s<%s, %s> foo();", Map.class.getName(), keyType.getName(), valueType.getName()));
+ }
+
+ private static List<String> marshallableNestedMapSourceCode(Class<?> keyType, Class<?> valueType) {
+ return testMessageSourceCode(String.format(
+ "%s<%s, %s<%s>> foo();",
+ Map.class.getName(), keyType.getName(), List.class.getName(), valueType.getName())
+ );
+ }
+
+ private static List<String> testMessageSourceCode(String fieldDeclaration) {
+ return List.of(
+ "package org.apache.ignite.internal.network.processor;",
+
+ "import org.apache.ignite.network.NetworkMessage;",
+ "import org.apache.ignite.network.annotations.Transferable;",
+ "import org.apache.ignite.network.annotations.Marshallable;",
+
+ "@Transferable(1)",
+ "public interface TestMessage extends NetworkMessage {",
+ " @Marshallable",
+ fieldDeclaration,
+ "}"
+ );
+ }
+
+ private static List<Class<?>> nativeTypes() {
+ return MarshallableTypesBlackList.NATIVE_TYPES;
+ }
+
+ private static Stream<Arguments> collectionTypes() {
+ return Stream.of(Collection.class, List.class, Set.class)
+ .flatMap(collectionType -> nativeTypes().stream().map(type -> arguments(collectionType, type)));
+ }
+
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("nativeTypes")
+ void testMessageWithNativeTypeField(Class<?> type) {
+ Compilation compilation = compile(marshallableFieldSourceCode(type));
+
+ assertThat(compilation).hadErrorContaining(
+ "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+ );
+ }
+
+ @ParameterizedTest(name = "{0}[]")
+ @MethodSource("nativeTypes")
+ void testMessageWithNativeArrayTypeField(Class<?> type) {
+ Compilation compilation = compile(marshallableArraySourceCode(type));
+
+ assertThat(compilation).hadErrorContaining(
+ "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+ );
+ }
+
+ @ParameterizedTest(name = "{0}<{1}>")
+ @MethodSource("collectionTypes")
+ void testMessageWithCollectionNativeTypeField(Class<?> collectionType, Class<?> type) {
+ Compilation compilation = compile(marshallableCollectionSourceCode(collectionType, type));
+
+ assertThat(compilation).hadErrorContaining(
+ "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+ );
+ }
+
+ @Test
+ void testMessageWithMarshallableMapNativeKey() {
+ Compilation compilation = compile(marshallableMapSourceCode(Integer.class, Lock.class));
+
+ assertThat(compilation).succeededWithoutWarnings();
+ }
+
+ @Test
+ void testMessageWithMarshallableMapNativeValue() {
+ Compilation compilation = compile(marshallableMapSourceCode(Lock.class, Integer.class));
+
+ assertThat(compilation).succeededWithoutWarnings();
+ }
+
+ @Test
+ void testMessageWithNativeTypeMap() {
+ Compilation compilation = compile(marshallableMapSourceCode(Integer.class, String.class));
+
+ assertThat(compilation).hadErrorContaining(
+ "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+ );
+ }
+
+ @Test
+ void testMessageWithNestedNativeTypeMap() {
+ Compilation compilation = compile(marshallableNestedMapSourceCode(Integer.class, String.class));
+
+ assertThat(compilation).hadErrorContaining(
+ "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+ );
+ }
+
+ @Test
+ void testMessageWithNestedMarshallableTypeMap() {
+ Compilation compilation = compile(marshallableNestedMapSourceCode(Integer.class, Lock.class));
+
+ assertThat(compilation).succeededWithoutWarnings();
+ }
+
+ private Compilation compile(List<String> code) {
+ return compiler.compile(
+ forSourceLines("org.apache.ignite.internal.network.processor.TestMessage", code),
+ MESSAGE_GROUP
+ );
+ }
+}
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
index bb7c034..56c5844 100644
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
@@ -257,7 +257,9 @@
void testFieldBothNetworkMessageAndMarkedMarshallable() {
Compilation compilation = compile("MessageWithMarshallableNetworkMessageField");
- assertThat(compilation).hadErrorContaining("msgField is both NetworkMessage and @Marshallable");
+ assertThat(compilation).hadErrorContaining(
+ "\"msgField\" field is marked as @Marshallable but this type is supported by native serialization"
+ );
}
/**
diff --git a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java
index ce36a76..16a7ba0 100644
--- a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java
+++ b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java
@@ -37,20 +37,36 @@
public interface AllTypesMessage extends NetworkMessage, Serializable {
byte byteA();
+ @Nullable Byte boxedByte();
+
short shortB();
+ @Nullable Short boxedShort();
+
int intC();
+ @Nullable Integer boxedInt();
+
long longD();
+ @Nullable Long boxedLong();
+
float floatE();
+ @Nullable Float boxedFloat();
+
double doubleF();
+ @Nullable Double boxedDouble();
+
char charG();
+ @Nullable Character boxedChar();
+
boolean booleanH();
+ @Nullable Boolean boxedBoolean();
+
byte @Nullable [] byteArrI();
short @Nullable [] shortArrJ();
diff --git a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java
index ef07f6e..669a152 100644
--- a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java
+++ b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java
@@ -22,7 +22,7 @@
/** Serializable class for marshallable test. */
public class SimpleSerializableObject implements Serializable {
- private static final long serialVersionUid = 0L;
+ private static final long serialVersionUID = 0L;
private final int val;
diff --git a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java
index 0abdea9..3aa59af 100644
--- a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java
+++ b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java
@@ -20,7 +20,6 @@
package org.apache.ignite.raft.jraft.entity;
import java.util.List;
-import org.apache.ignite.network.annotations.Marshallable;
import org.apache.ignite.network.annotations.Transferable;
import org.apache.ignite.raft.jraft.RaftMessageGroup;
import org.apache.ignite.raft.jraft.rpc.Message;
@@ -39,7 +38,6 @@
@Nullable
RaftOutter.SnapshotMeta meta();
- @Marshallable
List<LocalStorageOutter.LocalSnapshotPbMeta.File> filesList();
@Transferable(value = RaftMessageGroup.RaftOutterMessageGroup.LOCAL_SNAPSHOT_META_FILE)
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java
index 91316aa..cec5215 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java
@@ -20,7 +20,6 @@
import java.util.UUID;
import org.apache.ignite.internal.replicator.message.PrimaryReplicaRequest;
import org.apache.ignite.internal.replicator.message.TimestampAware;
-import org.apache.ignite.network.annotations.Marshallable;
import org.jetbrains.annotations.Nullable;
/**
@@ -39,6 +38,5 @@
// TODO: IGNITE-19457 Maybe not nullable.
@Deprecated
@Nullable
- @Marshallable
Long term();
}
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java
index cf67762..a0a8ebe 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java
@@ -83,6 +83,5 @@
* @return Bitset to include columns.
*/
@Nullable
- @Marshallable
BitSet columnsToInclude();
}
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java
index 12b1fcc..d5503e7 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java
@@ -23,7 +23,6 @@
import org.apache.ignite.internal.hlc.HybridTimestamp;
import org.apache.ignite.internal.replicator.message.ReplicaRequest;
import org.apache.ignite.internal.replicator.message.TimestampAware;
-import org.apache.ignite.network.annotations.Marshallable;
import org.apache.ignite.network.annotations.Transferable;
import org.jetbrains.annotations.Nullable;
@@ -74,6 +73,5 @@
* @return Raft term.
*/
@Deprecated
- @Marshallable
Long term();
}
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java
index 610a41e..208d8b4 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java
@@ -84,6 +84,5 @@
* @return Raft term.
*/
@Deprecated
- @Marshallable
Long term();
}