Skip to content

Commit e7bda4f

Browse files
IGNITE-26526 Fix message serializer code generation problems - Fixes #12374.
Signed-off-by: Aleksey Plekhanov <[email protected]>
1 parent d042b1d commit e7bda4f

File tree

6 files changed

+42
-40
lines changed

6 files changed

+42
-40
lines changed

modules/codegen2/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828
import java.util.ArrayList;
2929
import java.util.BitSet;
3030
import java.util.Collection;
31-
import java.util.HashSet;
3231
import java.util.List;
3332
import java.util.Map;
3433
import java.util.Set;
34+
import java.util.TreeSet;
3535
import java.util.UUID;
3636
import javax.annotation.processing.FilerException;
3737
import javax.annotation.processing.ProcessingEnvironment;
38+
import javax.lang.model.element.Element;
3839
import javax.lang.model.element.QualifiedNameable;
3940
import javax.lang.model.element.TypeElement;
4041
import javax.lang.model.element.VariableElement;
@@ -48,7 +49,6 @@
4849
import javax.tools.FileObject;
4950
import javax.tools.JavaFileObject;
5051
import javax.tools.StandardLocation;
51-
5252
import org.apache.ignite.internal.util.typedef.F;
5353
import org.apache.ignite.internal.util.typedef.internal.SB;
5454
import org.jetbrains.annotations.Nullable;
@@ -83,13 +83,13 @@ class MessageSerializerGenerator {
8383
private static final String METHOD_JAVADOC = "/** */";
8484

8585
/** Collection of lines for {@code writeTo} method. */
86-
private final Collection<String> write = new ArrayList<>();
86+
private final List<String> write = new ArrayList<>();
8787

8888
/** Collection of lines for {@code readFrom} method. */
89-
private final Collection<String> read = new ArrayList<>();
89+
private final List<String> read = new ArrayList<>();
9090

9191
/** Collection of message-specific imports. */
92-
private final Set<String> imports = new HashSet<>();
92+
private final Set<String> imports = new TreeSet<>();
9393

9494
/** */
9595
private final ProcessingEnvironment env;
@@ -155,6 +155,8 @@ private String generateSerializerCode(String serClsName) throws IOException {
155155

156156
writer.write("}");
157157

158+
writer.write(NL);
159+
158160
return writer.toString();
159161
}
160162
}
@@ -404,7 +406,7 @@ else if (assignableFrom(erasedType(type), type(Collection.class.getName()))) {
404406
* </pre>
405407
*/
406408
private void returnFalseIfWriteFailed(Collection<String> code, String accessor, @Nullable String... args) {
407-
String argsStr = String.join(",", args);
409+
String argsStr = String.join(", ", args);
408410

409411
code.add(line("if (!%s(msg.%s))", accessor, argsStr));
410412

@@ -460,12 +462,20 @@ private void returnFalseIfReadFailed(VariableElement field) throws Exception {
460462
}
461463

462464
if (componentType.getKind() == TypeKind.DECLARED) {
463-
String cls = ((DeclaredType)arrType.getComponentType()).asElement().getSimpleName().toString();
465+
Element componentElement = ((DeclaredType)componentType).asElement();
466+
467+
String cls = componentElement.getSimpleName().toString();
464468

465469
returnFalseIfReadFailed(name, "reader.readObjectArray",
466470
"MessageCollectionItemType." + messageCollectionItemType(componentType),
467471
cls + ".class");
468472

473+
if (!"java.lang".equals(env.getElementUtils().getPackageOf(componentElement).getQualifiedName().toString())) {
474+
String importCls = ((QualifiedNameable)componentElement).getQualifiedName().toString();
475+
476+
imports.add(importCls);
477+
}
478+
469479
return;
470480
}
471481
}
@@ -583,10 +593,6 @@ private String messageCollectionItemType(TypeMirror type) throws Exception {
583593
if (!assignableFrom(type, type(MESSAGE_INTERFACE)))
584594
throw new Exception("Do not support type: " + type);
585595

586-
String cls = ((QualifiedNameable)env.getTypeUtils().asElement(type)).getQualifiedName().toString();
587-
588-
imports.add(cls);
589-
590596
return "MSG";
591597
}
592598

@@ -635,7 +641,11 @@ private void returnFalseIfReadFailed(String var, String mtd, String... args) {
635641
}
636642

637643
/** */
638-
private void finish(Collection<String> code) {
644+
private void finish(List<String> code) {
645+
// Remove the last empty line for the last "case".
646+
String removed = code.remove(code.size() - 1);
647+
assert EMPTY.equals(removed) : removed;
648+
639649
code.add(line("}"));
640650
code.add(EMPTY);
641651

@@ -673,11 +683,12 @@ private void writeClassHeader(Writer writer, String pkgName, String serClsName)
673683

674684
writer.write(NL);
675685
writer.write("package " + pkgName + ";" + NL + NL);
676-
writer.write("import java.nio.ByteBuffer;" + NL);
677-
writer.write("import org.apache.ignite.plugin.extensions.communication.Message;" + NL);
678-
writer.write("import org.apache.ignite.plugin.extensions.communication.MessageSerializer;" + NL);
679-
writer.write("import org.apache.ignite.plugin.extensions.communication.MessageWriter;" + NL);
680-
writer.write("import org.apache.ignite.plugin.extensions.communication.MessageReader;" + NL);
686+
687+
imports.add("java.nio.ByteBuffer");
688+
imports.add("org.apache.ignite.plugin.extensions.communication.Message");
689+
imports.add("org.apache.ignite.plugin.extensions.communication.MessageSerializer");
690+
imports.add("org.apache.ignite.plugin.extensions.communication.MessageWriter");
691+
imports.add("org.apache.ignite.plugin.extensions.communication.MessageReader");
681692

682693
for (String i: imports)
683694
writer.write("import " + i + ";" + NL);

modules/codegen2/src/main/java/org/apache/ignite/internal/Order.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
* should be performed strictly through corresponding getter and setter methods
3535
* following the naming convention: {@code fieldName()} for getter and {@code fieldName(Type)} for setter.
3636
*/
37-
@Retention(RetentionPolicy.SOURCE)
37+
@Retention(RetentionPolicy.CLASS)
3838
@Target(ElementType.FIELD)
3939
public @interface Order {
4040
/** @return Order of the field. */

modules/core/src/test/resources/codegen/ChildMessageSerializer.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
package org.apache.ignite.internal.codegen;
1919

2020
import java.nio.ByteBuffer;
21+
import org.apache.ignite.internal.ChildMessage;
2122
import org.apache.ignite.plugin.extensions.communication.Message;
23+
import org.apache.ignite.plugin.extensions.communication.MessageReader;
2224
import org.apache.ignite.plugin.extensions.communication.MessageSerializer;
2325
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
24-
import org.apache.ignite.plugin.extensions.communication.MessageReader;
25-
import org.apache.ignite.internal.ChildMessage;
2626

2727
/**
2828
* This class is generated automatically.
@@ -55,7 +55,6 @@ public class ChildMessageSerializer implements MessageSerializer {
5555
return false;
5656

5757
writer.incrementState();
58-
5958
}
6059

6160
return true;
@@ -83,9 +82,8 @@ public class ChildMessageSerializer implements MessageSerializer {
8382
return false;
8483

8584
reader.incrementState();
86-
8785
}
8886

8987
return true;
9088
}
91-
}
89+
}

modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
package org.apache.ignite.internal.codegen;
1919

2020
import java.nio.ByteBuffer;
21+
import org.apache.ignite.internal.TestCollectionsMessage;
2122
import org.apache.ignite.plugin.extensions.communication.Message;
23+
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
24+
import org.apache.ignite.plugin.extensions.communication.MessageReader;
2225
import org.apache.ignite.plugin.extensions.communication.MessageSerializer;
2326
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
24-
import org.apache.ignite.plugin.extensions.communication.MessageReader;
25-
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
26-
import org.apache.ignite.internal.TestCollectionsMessage;
27-
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
2827

2928
/**
3029
* This class is generated automatically.
@@ -183,7 +182,6 @@ public class TestCollectionsMessageSerializer implements MessageSerializer {
183182
return false;
184183

185184
writer.incrementState();
186-
187185
}
188186

189187
return true;
@@ -379,7 +377,6 @@ public class TestCollectionsMessageSerializer implements MessageSerializer {
379377
return false;
380378

381379
reader.incrementState();
382-
383380
}
384381

385382
return true;

modules/core/src/test/resources/codegen/TestMapMessageSerializer.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
package org.apache.ignite.internal.codegen;
1919

2020
import java.nio.ByteBuffer;
21+
import org.apache.ignite.internal.TestMapMessage;
2122
import org.apache.ignite.plugin.extensions.communication.Message;
23+
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
24+
import org.apache.ignite.plugin.extensions.communication.MessageReader;
2225
import org.apache.ignite.plugin.extensions.communication.MessageSerializer;
2326
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
24-
import org.apache.ignite.plugin.extensions.communication.MessageReader;
25-
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
26-
import org.apache.ignite.internal.TestMapMessage;
27-
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
2827

2928
/**
3029
* This class is generated automatically.
@@ -189,7 +188,6 @@ public class TestMapMessageSerializer implements MessageSerializer {
189188
return false;
190189

191190
writer.incrementState();
192-
193191
}
194192

195193
return true;
@@ -393,7 +391,6 @@ public class TestMapMessageSerializer implements MessageSerializer {
393391
return false;
394392

395393
reader.incrementState();
396-
397394
}
398395

399396
return true;

modules/core/src/test/resources/codegen/TestMessageSerializer.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
package org.apache.ignite.internal.codegen;
1919

2020
import java.nio.ByteBuffer;
21+
import org.apache.ignite.internal.TestMessage;
22+
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
2123
import org.apache.ignite.plugin.extensions.communication.Message;
24+
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
25+
import org.apache.ignite.plugin.extensions.communication.MessageReader;
2226
import org.apache.ignite.plugin.extensions.communication.MessageSerializer;
2327
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
24-
import org.apache.ignite.plugin.extensions.communication.MessageReader;
25-
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
26-
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
27-
import org.apache.ignite.internal.TestMessage;
2828

2929
/**
3030
* This class is generated automatically.
@@ -135,7 +135,6 @@ public class TestMessageSerializer implements MessageSerializer {
135135
return false;
136136

137137
writer.incrementState();
138-
139138
}
140139

141140
return true;

0 commit comments

Comments
 (0)