Anton Vinogradov created IGNITE-28831:
-----------------------------------------
Summary: DTO serializer code generator throws NPE on fields with
type-use annotations (@Nullable/@NotNull) on qualified types
Key: IGNITE-28831
URL: https://issues.apache.org/jira/browse/IGNITE-28831
Project: Ignite
Issue Type: Task
Reporter: Anton Vinogradov
Assignee: Anton Vinogradov
h2. Problem
{\{IgniteDataTransferObjectProcessor}} throws a \{{NullPointerException}}
during annotation
processing, which breaks compilation of \{{modules/core}} from source.
Reproduce from a clean master:
{code}
mvn -o -q -pl modules/core -am test-compile -DskipTests -Dcheckstyle.skip=true
{code}
First (root-cause) errors:
{noformat}
BaselineNode.java: Failed to generate a dto serializer: Cannot invoke
"String.lastIndexOf(int)" because "fqn" is null
IdleVerifyResult.java: Failed to generate a dto serializer: Cannot invoke
"String.lastIndexOf(int)" because "fqn" is null
.../DurableBackgroundCleanupIndexTreeTaskV2Serializer.java:[26,14] '.' expected
.../SnapshotPartitionsVerifyResultSerializer.java:[20,24] '.' expected
.../VisorTaskResultSerializer.java:[26,17] '.' expected
{noformat}
The subsequent cascade of \{{cannot find symbol: class *ViewWalker}} errors is
a side effect:
the processor's exception aborts the annotation-processing round, so the output
of the separate
{\{SystemViewRowAttributeWalkerProcessor}} never gets compiled.
h2. Root cause
{\{IDTOSerializerGenerator.className(TypeMirror)}} strips everything before the
first space in order
to drop a *leading* type-use annotation (e.g. \{{@NotNull
java.util.Collection}}). But the compiler
renders a type-use annotation \{*}inline, right before the simple name\{*} of a
qualified type:
{code}
[email protected] Collection<...>
{code}
The first-space heuristic then discards the \{{java.util.}} qualifier and
returns only \{{Collection}},
which causes:
# \{{COLL_IMPL.get("Collection")}} returns \{{null}} -> NPE in
\{{simpleName()}} for fields like
{\{BaselineNode.addrs}} (\{{@NotNull Collection<ResolvedAddresses>}}) and
{\{IdleVerifyResult.txHashConflicts}} (\{{@Nullable
List<List<TransactionsHashRecord>>}}).
# Malformed \{{import String;}} / \{{import Exception;}} / \{{import
IdleVerifyResult;}} emitted into the
generated serializers for \{{DurableBackgroundCleanupIndexTreeTaskV2}},
\{{SnapshotPartitionsVerifyResult}}
and \{{VisorTaskResult}} (the \{{'.' expected}} compile errors) — for
\{{@Nullable}}-annotated fields.
h2. Fix
Strip type-use annotations wherever they occur (preserving the package
qualifier) instead of using the
first-space heuristic. The fix is confined to the codegen module; DTO classes
are not touched.
h2. Verification
{\{mvn -o -q -pl modules/core -am test-compile -DskipTests
-Dcheckstyle.skip=true}} completes with
BUILD SUCCESS, and the serializers for \{{BaselineNode}}, \{{IdleVerifyResult}},
{\{DurableBackgroundCleanupIndexTreeTaskV2}},
\{{SnapshotPartitionsVerifyResult}}, \{{VisorTaskResult}}
are generated and compile.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)