This is an automated email from the ASF dual-hosted git repository.
nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 141bbff8aa6 IGNITE-27733 Generate serdes code for BaselineNode (#12689)
141bbff8aa6 is described below
commit 141bbff8aa66638b9826b55a6564ba1d717df50e
Author: Nikolay <[email protected]>
AuthorDate: Wed Feb 4 14:56:47 2026 +0300
IGNITE-27733 Generate serdes code for BaselineNode (#12689)
---
.../internal/idto/IDTOSerializerGenerator.java | 103 +++++++++++++--------
.../idto/IgniteDataTransferObjectProcessor.java | 1 -
.../internal/management/baseline/BaselineNode.java | 32 +------
3 files changed, 69 insertions(+), 67 deletions(-)
diff --git
a/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IDTOSerializerGenerator.java
b/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IDTOSerializerGenerator.java
index f7fa1f034bf..92c622b5332 100644
---
a/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IDTOSerializerGenerator.java
+++
b/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IDTOSerializerGenerator.java
@@ -36,7 +36,7 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.UUID;
-import java.util.function.Function;
+import java.util.function.BiFunction;
import javax.annotation.processing.FilerException;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
@@ -55,6 +55,7 @@ import javax.tools.Diagnostic;
import javax.tools.JavaFileObject;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.lang.IgniteBiTuple;
+import org.jetbrains.annotations.NotNull;
import static org.apache.ignite.internal.MessageSerializerGenerator.NL;
import static org.apache.ignite.internal.MessageSerializerGenerator.TAB;
@@ -80,23 +81,23 @@ public class IDTOSerializerGenerator {
/** */
private static final IgniteBiTuple<String, String> OBJECT_SERDES =
- F.t("out.writeObject(obj.${f});", "obj.${f} = (${c})in.readObject();");
+ F.t("out.writeObject(obj.${f});", "(${c})in.readObject()");
/** */
private static final IgniteBiTuple<String, String> STR_STR_MAP =
- F.t("U.writeStringMap(out, obj.${f});", "obj.${f} =
U.readStringMap(in);");
+ F.t("U.writeStringMap(out, obj.${f});", "U.readStringMap(in)");
/** Type name to write/read code for the type. */
private static final Map<String, IgniteBiTuple<String, String>>
TYPE_SERDES = new HashMap<>();
{
- TYPE_SERDES.put(boolean.class.getName(),
F.t("out.writeBoolean(obj.${f});", "obj.${f} = in.readBoolean();"));
- TYPE_SERDES.put(byte.class.getName(), F.t("out.write(obj.${f});",
"obj.${f} = in.read();"));
- TYPE_SERDES.put(short.class.getName(),
F.t("out.writeShort(obj.${f});", "obj.${f} = in.readShort();"));
- TYPE_SERDES.put(int.class.getName(), F.t("out.writeInt(obj.${f});",
"obj.${f} = in.readInt();"));
- TYPE_SERDES.put(long.class.getName(), F.t("out.writeLong(obj.${f});",
"obj.${f} = in.readLong();"));
- TYPE_SERDES.put(float.class.getName(),
F.t("out.writeFloat(obj.${f});", "obj.${f} = in.readFloat();"));
- TYPE_SERDES.put(double.class.getName(),
F.t("out.writeDouble(obj.${f});", "obj.${f} = in.readDouble();"));
+ TYPE_SERDES.put(boolean.class.getName(),
F.t("out.writeBoolean(obj.${f});", "in.readBoolean()"));
+ TYPE_SERDES.put(byte.class.getName(), F.t("out.write(obj.${f});",
"in.read()"));
+ TYPE_SERDES.put(short.class.getName(),
F.t("out.writeShort(obj.${f});", "in.readShort()"));
+ TYPE_SERDES.put(int.class.getName(), F.t("out.writeInt(obj.${f});",
"in.readInt()"));
+ TYPE_SERDES.put(long.class.getName(), F.t("out.writeLong(obj.${f});",
"in.readLong()"));
+ TYPE_SERDES.put(float.class.getName(),
F.t("out.writeFloat(obj.${f});", "in.readFloat()"));
+ TYPE_SERDES.put(double.class.getName(),
F.t("out.writeDouble(obj.${f});", "in.readDouble()"));
TYPE_SERDES.put(Boolean.class.getName(), OBJECT_SERDES);
TYPE_SERDES.put(Byte.class.getName(), OBJECT_SERDES);
@@ -109,40 +110,40 @@ public class IDTOSerializerGenerator {
TYPE_SERDES.put(Exception.class.getName(), OBJECT_SERDES);
TYPE_SERDES.put(Object.class.getName(), OBJECT_SERDES);
- TYPE_SERDES.put(String.class.getName(), F.t("U.writeString(out,
obj.${f});", "obj.${f} = U.readString(in);"));
- TYPE_SERDES.put(UUID.class.getName(), F.t("U.writeUuid(out,
obj.${f});", "obj.${f} = U.readUuid(in);"));
- TYPE_SERDES.put("org.apache.ignite.lang.IgniteUuid",
F.t("U.writeIgniteUuid(out, obj.${f});", "obj.${f} = U.readIgniteUuid(in);"));
+ TYPE_SERDES.put(String.class.getName(), F.t("U.writeString(out,
obj.${f});", "U.readString(in)"));
+ TYPE_SERDES.put(UUID.class.getName(), F.t("U.writeUuid(out,
obj.${f});", "U.readUuid(in)"));
+ TYPE_SERDES.put("org.apache.ignite.lang.IgniteUuid",
F.t("U.writeIgniteUuid(out, obj.${f});", "U.readIgniteUuid(in)"));
TYPE_SERDES.put("org.apache.ignite.internal.processors.cache.version.GridCacheVersion",
OBJECT_SERDES);
TYPE_SERDES.put("org.apache.ignite.lang.IgniteProductVersion",
OBJECT_SERDES);
TYPE_SERDES.put("org.apache.ignite.internal.binary.BinaryMetadata",
OBJECT_SERDES);
TYPE_SERDES.put("org.apache.ignite.internal.management.cache.PartitionKey",
OBJECT_SERDES);
TYPE_SERDES.put("org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion",
OBJECT_SERDES);
TYPE_SERDES.put("org.apache.ignite.cache.CacheMode",
- F.t("out.writeByte(CacheMode.toCode(obj.${f}));", "obj.${f} =
CacheMode.fromCode(in.readByte());"));
-
- TYPE_SERDES.put(TreeMap.class.getName(), F.t("U.writeMap(out,
obj.${f});", "obj.${f} = U.readTreeMap(in);"));
- TYPE_SERDES.put(LinkedHashMap.class.getName(), F.t("U.writeMap(out,
obj.${f});", "obj.${f} = U.readLinkedMap(in);"));
- TYPE_SERDES.put(Map.class.getName(), F.t("U.writeMap(out, obj.${f});",
"obj.${f} = U.readMap(in);"));
- TYPE_SERDES.put(Collection.class.getName(),
F.t("U.writeCollection(out, obj.${f});", "obj.${f} = U.readCollection(in);"));
- TYPE_SERDES.put(List.class.getName(), F.t("U.writeCollection(out,
obj.${f});", "obj.${f} = U.readList(in);"));
- TYPE_SERDES.put(Set.class.getName(), F.t("U.writeCollection(out,
obj.${f});", "obj.${f} = U.readSet(in);"));
+ F.t("out.writeByte(CacheMode.toCode(obj.${f}));",
"CacheMode.fromCode(in.readByte())"));
+
+ TYPE_SERDES.put(TreeMap.class.getName(), F.t("U.writeMap(out,
obj.${f});", "U.readTreeMap(in)"));
+ TYPE_SERDES.put(LinkedHashMap.class.getName(), F.t("U.writeMap(out,
obj.${f});", "U.readLinkedMap(in)"));
+ TYPE_SERDES.put(Map.class.getName(), F.t("U.writeMap(out, obj.${f});",
"U.readMap(in)"));
+ TYPE_SERDES.put(Collection.class.getName(),
F.t("U.writeCollection(out, obj.${f});", "U.readCollection(in)"));
+ TYPE_SERDES.put(List.class.getName(), F.t("U.writeCollection(out,
obj.${f});", "U.readList(in)"));
+ TYPE_SERDES.put(Set.class.getName(), F.t("U.writeCollection(out,
obj.${f});", "U.readSet(in)"));
}
/** Write/Read code for enum. */
private static final IgniteBiTuple<String, String> ENUM_SERDES =
- F.t("U.writeEnum(out, obj.${f});", "obj.${f} = U.readEnum(in,
${c}.class);");
+ F.t("U.writeEnum(out, obj.${f});", "U.readEnum(in, ${c}.class)");
/** Write/Read code for array. */
private static final IgniteBiTuple<String, String> OBJ_ARRAY_SERDES =
- F.t("U.writeArray(out, obj.${f});", "obj.${f} = U.readArray(in,
${c}.class);");
+ F.t("U.writeArray(out, obj.${f});", "U.readArray(in, ${c}.class)");
/** Type name to write/read code for the array of type. */
private static final Map<String, IgniteBiTuple<String, String>>
ARRAY_TYPE_SERDES = new HashMap<>();
{
- ARRAY_TYPE_SERDES.put(byte.class.getName(), F.t("U.writeByteArray(out,
obj.${f});", "obj.${f} = U.readByteArray(in);"));
- ARRAY_TYPE_SERDES.put(int.class.getName(), F.t("U.writeIntArray(out,
obj.${f});", "obj.${f} = U.readIntArray(in);"));
- ARRAY_TYPE_SERDES.put(long.class.getName(), F.t("U.writeLongArray(out,
obj.${f});", "obj.${f} = U.readLongArray(in);"));
+ ARRAY_TYPE_SERDES.put(byte.class.getName(), F.t("U.writeByteArray(out,
obj.${f});", "U.readByteArray(in)"));
+ ARRAY_TYPE_SERDES.put(int.class.getName(), F.t("U.writeIntArray(out,
obj.${f});", "U.readIntArray(in)"));
+ ARRAY_TYPE_SERDES.put(long.class.getName(), F.t("U.writeLongArray(out,
obj.${f});", "U.readLongArray(in)"));
ARRAY_TYPE_SERDES.put(String.class.getName(), OBJ_ARRAY_SERDES);
ARRAY_TYPE_SERDES.put(UUID.class.getName(), OBJ_ARRAY_SERDES);
}
@@ -292,7 +293,7 @@ public class IDTOSerializerGenerator {
code.add("/** {@inheritDoc} */");
code.add("@Override public void writeExternal(" + clsName + " obj,
ObjectOutput out) throws IOException {");
- fieldsSerdes(flds, IgniteBiTuple::get1).forEach(line -> code.add(TAB +
line));
+ fieldsSerdes(flds, (t, noNull) -> t.get1()).forEach(line ->
code.add(TAB + line));
code.add("}");
@@ -305,7 +306,32 @@ public class IDTOSerializerGenerator {
code.add("/** {@inheritDoc} */");
code.add("@Override public void readExternal(" + clsName + " obj,
ObjectInput in) throws IOException, ClassNotFoundException {");
- fieldsSerdes(flds, IgniteBiTuple::get2).forEach(line -> code.add(TAB +
line));
+ fieldsSerdes(flds, (t, notNull) -> {
+ String pattern = "obj.${f} = " + t.get2() + ";";
+
+ if (notNull) {
+ /**
+ * Intention here to change `obj.field = U.readSomething();`
line to:
+ * ```
+ * Type field0 = U.readSomething();
+ * if (field0 != null)
+ * obj.field = field0;
+ * ```
+ * We want to respect @NotNull annotation and keep default
value.
+ */
+ pattern = pattern.replaceAll("obj.\\$\\{f}", "\\${c} \\${f}0");
+ pattern += "\nif (${f}0 != null)\n" + TAB + "obj.${f} =
${f}0;";
+ }
+
+ return pattern;
+ }).forEach(line -> {
+ if (line.indexOf('\n') != -1) {
+ for (String line0 : line.split("\n"))
+ code.add(TAB + line0);
+ }
+ else
+ code.add(TAB + line);
+ });
code.add("}");
return code;
@@ -318,7 +344,7 @@ public class IDTOSerializerGenerator {
*/
private List<String> fieldsSerdes(
List<VariableElement> flds,
- Function<IgniteBiTuple<String, String>, String> lineProvider
+ BiFunction<IgniteBiTuple<String, String>, Boolean, String> lineProvider
) {
TypeMirror dtoCls =
env.getElementUtils().getTypeElement(DTO_CLASS).asType();
@@ -328,12 +354,14 @@ public class IDTOSerializerGenerator {
TypeMirror type = fld.asType();
TypeMirror comp = null;
+ boolean notNull = type.toString().startsWith("@" +
NotNull.class.getName());
+
IgniteBiTuple<String, String> serDes = null;
if (env.getTypeUtils().isAssignable(type, dtoCls))
serDes = OBJECT_SERDES;
else if (type.getKind() == TypeKind.TYPEVAR)
- serDes = F.t("out.writeObject(obj.${f});", "obj.${f} =
in.readObject();");
+ serDes = F.t("out.writeObject(obj.${f});", "in.readObject()");
else if (type.getKind() == TypeKind.ARRAY) {
comp = ((ArrayType)type).getComponentType();
@@ -365,15 +393,14 @@ public class IDTOSerializerGenerator {
}
}
- if (serDes != null) {
- String pattern = lineProvider.apply(serDes);
-
- code.add(pattern
- .replaceAll("\\$\\{f}", fld.getSimpleName().toString())
- .replaceAll("\\$\\{c}", simpleClassName(comp == null ?
type : comp)));
- }
- else
+ if (serDes == null)
throw new IllegalStateException("Unsupported type: " + type);
+
+ String pattern = lineProvider.apply(serDes, notNull);
+
+ code.add(pattern
+ .replaceAll("\\$\\{f}", fld.getSimpleName().toString())
+ .replaceAll("\\$\\{c}", simpleClassName(comp == null ? type :
comp)));
}
return code;
diff --git
a/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IgniteDataTransferObjectProcessor.java
b/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IgniteDataTransferObjectProcessor.java
index 6756770d64b..5c830f1781d 100644
---
a/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IgniteDataTransferObjectProcessor.java
+++
b/modules/codegen2/src/main/java/org/apache/ignite/internal/idto/IgniteDataTransferObjectProcessor.java
@@ -72,7 +72,6 @@ public class IgniteDataTransferObjectProcessor extends
AbstractProcessor {
/** Currently unsupported classes. */
private static final Set<String> UNSUPPORTED = Set.of(
- "org.apache.ignite.internal.management.baseline.BaselineNode",
"org.apache.ignite.internal.processors.cache.CacheMetricsSnapshot",
"org.apache.ignite.internal.commandline.cache.check_indexes_inline_size.CheckIndexInlineSizesResult",
"org.apache.ignite.internal.management.cache.ContentionJobResult",
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/management/baseline/BaselineNode.java
b/modules/core/src/main/java/org/apache/ignite/internal/management/baseline/BaselineNode.java
index 574e449e0b8..3313f0dc31b 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/management/baseline/BaselineNode.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/management/baseline/BaselineNode.java
@@ -17,9 +17,6 @@
package org.apache.ignite.internal.management.baseline;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
import java.net.InetAddress;
import java.util.Collection;
import java.util.Collections;
@@ -27,7 +24,6 @@ import java.util.Map;
import org.apache.ignite.internal.dto.IgniteDataTransferObject;
import org.apache.ignite.internal.managers.discovery.IgniteClusterNode;
import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -39,19 +35,19 @@ public class BaselineNode extends IgniteDataTransferObject {
private static final long serialVersionUID = 0L;
/** */
- private String consistentId;
+ String consistentId;
/** */
- private Map<String, Object> attrs;
+ Map<String, Object> attrs;
/** */
- private @Nullable Long order;
+ @Nullable Long order;
/**
* Resolved list of (ip, hostname) pairs
* (if ip has no resolved host, hostname will be the string representation
of ip).
*/
- private @NotNull Collection<ResolvedAddresses> addrs =
Collections.emptyList();
+ @NotNull Collection<ResolvedAddresses> addrs = Collections.emptyList();
/**
* Default constructor.
@@ -106,26 +102,6 @@ public class BaselineNode extends IgniteDataTransferObject
{
return addrs;
}
- /** {@inheritDoc} */
- @Override protected void writeExternalData(ObjectOutput out) throws
IOException {
- U.writeString(out, consistentId);
- U.writeMap(out, attrs);
- out.writeObject(order);
- U.writeCollection(out, addrs);
- }
-
- /** {@inheritDoc} */
- @Override protected void readExternalData(ObjectInput in) throws
IOException, ClassNotFoundException {
- consistentId = U.readString(in);
- attrs = U.readMap(in);
- order = (Long)in.readObject();
-
- Collection<ResolvedAddresses> inputAddrs = U.readCollection(in);
-
- if (inputAddrs != null)
- addrs = inputAddrs;
- }
-
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(BaselineNode.class, this);