You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sd...@apache.org on 2022/03/04 11:04:02 UTC
[ignite-3] 02/12: .
This is an automated email from the ASF dual-hosted git repository.
sdanilov pushed a commit to branch ignite-16393
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 2706e424938bb342d815d9dc2f732b768be36e09
Author: Semyon Danilov <sa...@yandex.ru>
AuthorDate: Thu Mar 3 11:53:47 2022 +0300
.
---
.../processor/messages/MessageImplGenerator.java | 76 +++++++++++++++-------
.../serialization/BaseMethodNameResolver.java | 6 +-
2 files changed, 56 insertions(+), 26 deletions(-)
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 835894b..95f0ba2 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
@@ -28,7 +28,7 @@ import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashSet;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -46,9 +46,9 @@ import javax.tools.Diagnostic;
import org.apache.ignite.internal.network.processor.MessageClass;
import org.apache.ignite.internal.network.processor.MessageGroupWrapper;
import org.apache.ignite.internal.network.processor.TypeUtils;
-import org.apache.ignite.internal.network.processor.serialization.BaseMethodNameResolver;
import org.apache.ignite.network.NetworkMessage;
import org.apache.ignite.network.annotations.Marshallable;
+import org.jetbrains.annotations.Nullable;
/**
* Class for generating implementations of the {@link NetworkMessage} interfaces and their builders, generated by a {@link
@@ -63,8 +63,6 @@ public class MessageImplGenerator {
private final TypeUtils typeUtils;
- private final BaseMethodNameResolver methodNameResolver;
-
/**
* Constructor.
*
@@ -75,7 +73,6 @@ public class MessageImplGenerator {
this.processingEnv = processingEnv;
this.messageGroup = messageGroup;
this.typeUtils = new TypeUtils(processingEnv);
- this.methodNameResolver = new BaseMethodNameResolver(processingEnv);
}
/**
@@ -203,9 +200,33 @@ public class MessageImplGenerator {
return messageImpl.build();
}
+ private enum Type {
+ OBJECT_ARRAY,
+ COLLECTION,
+ MESSAGE,
+ MAP;
+ }
+
+ @Nullable
+ private Type resolveType(TypeMirror parameterType) {
+ if (parameterType.getKind() == TypeKind.ARRAY) {
+ if (!((ArrayType) parameterType).getComponentType().getKind().isPrimitive()) {
+ return Type.OBJECT_ARRAY;
+ }
+ } else if (parameterType.getKind() == TypeKind.DECLARED) {
+ if (typeUtils.isSameType(parameterType, Collection.class)) {
+ return Type.COLLECTION;
+ } else if (typeUtils.isSameType(parameterType, Map.class)) {
+ return Type.MAP;
+ }
+ } else if (typeUtils.isSubType(parameterType, NetworkMessage.class)) {
+ return Type.MESSAGE;
+ }
+ return null;
+ }
+
private void generateBeforeSend(TypeSpec.Builder messageImplBuild, MessageClass message) {
ParameterizedTypeName returnType = ParameterizedTypeName.get(ClassName.get(Set.class), TypeName.INT.box());
- ParameterizedTypeName returnTypeImpl = ParameterizedTypeName.get(ClassName.get(HashSet.class), TypeName.INT.box());
Builder beforeRead = MethodSpec.methodBuilder("beforeRead")
.addAnnotation(Override.class)
@@ -230,12 +251,15 @@ public class MessageImplGenerator {
beforeRead.addStatement("$T $N = marshaller.marshal($N)", marshalledObjectClass, moName, objectName);
beforeRead.addStatement("set.addAll($N.usedDescriptorIds())", moName);
beforeRead.addStatement("$N = $N.bytes()", baName, moName).addCode("\n");
- } else if (typeUtils.isSubType(type, NetworkMessage.class)) {
- beforeRead.addStatement("if ($N != null) $N.beforeRead(set, marshallerObj)", objectName, objectName);
} else {
- String methodType = methodNameResolver.resolveBaseMethodName(type);
- switch (methodType) {
- case "ObjectArray":
+ Type objectType = resolveType(type);
+
+ if (objectType == null) {
+ return;
+ }
+
+ switch (objectType) {
+ case OBJECT_ARRAY:
ArrayType arrayType = (ArrayType) type;
if (typeUtils.isSubType(arrayType.getComponentType(), NetworkMessage.class)) {
beforeRead.beginControlFlow("if ($N != null)", objectName);
@@ -245,7 +269,7 @@ public class MessageImplGenerator {
beforeRead.endControlFlow().addCode("\n");
}
break;
- case "Collection":
+ case COLLECTION:
DeclaredType declaredType = (DeclaredType) type;
TypeMirror elementType = declaredType.getTypeArguments().get(0);
if (typeUtils.isSubType(elementType, NetworkMessage.class)) {
@@ -256,7 +280,10 @@ public class MessageImplGenerator {
beforeRead.endControlFlow().addCode("\n");
}
break;
- case "Map":
+ case MESSAGE:
+ beforeRead.addStatement("if ($N != null) $N.beforeRead(set, marshallerObj)", objectName, objectName);
+ break;
+ case MAP:
DeclaredType mapType = (DeclaredType) type;
TypeMirror keyType = mapType.getTypeArguments().get(0);
boolean keyIsMessage = typeUtils.isSubType(keyType, NetworkMessage.class);
@@ -295,9 +322,6 @@ public class MessageImplGenerator {
}
private void generateAfterReceive(TypeSpec.Builder messageImplBuild, MessageClass message) {
- ParameterizedTypeName returnType = ParameterizedTypeName.get(ClassName.get(Set.class), TypeName.INT.box());
- ParameterizedTypeName returnTypeImpl = ParameterizedTypeName.get(ClassName.get(HashSet.class), TypeName.INT.box());
-
Builder afterRead = MethodSpec.methodBuilder("afterRead")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
@@ -318,12 +342,15 @@ public class MessageImplGenerator {
if (executableElement.getAnnotation(Marshallable.class) != null) {
String baName = objectName + "ByteArray";
afterRead.addStatement("$N = marshaller.unmarshal($N, descriptorRegistry)", objectName, baName);
- } else if (typeUtils.isSubType(type, NetworkMessage.class)) {
- afterRead.addStatement("if ($N != null) $N.afterRead(marshallerObj, descriptorsObj)", objectName, objectName);
} else {
- String methodType = methodNameResolver.resolveBaseMethodName(type);
- switch (methodType) {
- case "ObjectArray":
+ Type objectType = resolveType(type);
+
+ if (objectType == null) {
+ return;
+ }
+
+ switch (objectType) {
+ case OBJECT_ARRAY:
ArrayType arrayType = (ArrayType) type;
if (typeUtils.isSubType(arrayType.getComponentType(), NetworkMessage.class)) {
afterRead.beginControlFlow("if ($N != null)", objectName);
@@ -333,7 +360,7 @@ public class MessageImplGenerator {
afterRead.endControlFlow().addCode("\n");
}
break;
- case "Collection":
+ case COLLECTION:
DeclaredType declaredType = (DeclaredType) type;
TypeMirror elementType = declaredType.getTypeArguments().get(0);
if (typeUtils.isSubType(elementType, NetworkMessage.class)) {
@@ -344,7 +371,10 @@ public class MessageImplGenerator {
afterRead.endControlFlow().addCode("\n");
}
break;
- case "Map":
+ case MESSAGE:
+ afterRead.addStatement("if ($N != null) $N.afterRead(marshallerObj, descriptorsObj)", objectName, objectName);
+ break;
+ case MAP:
DeclaredType mapType = (DeclaredType) type;
TypeMirror keyType = mapType.getTypeArguments().get(0);
boolean keyIsMessage = typeUtils.isSubType(keyType, NetworkMessage.class);
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 3a87c4a..00783d0 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
@@ -38,7 +38,7 @@ import org.apache.ignite.network.NetworkMessage;
* @see MessageReaderMethodResolver
* @see MessageWriterMethodResolver
*/
-public class BaseMethodNameResolver {
+class BaseMethodNameResolver {
/** Processing environment. */
private final ProcessingEnvironment processingEnvironment;
@@ -47,7 +47,7 @@ public class BaseMethodNameResolver {
*
* @param processingEnvironment Processing environment.
*/
- public BaseMethodNameResolver(ProcessingEnvironment processingEnvironment) {
+ BaseMethodNameResolver(ProcessingEnvironment processingEnvironment) {
this.processingEnvironment = processingEnvironment;
}
@@ -57,7 +57,7 @@ public class BaseMethodNameResolver {
* @param parameterType parameter of the method to resolve
* @return part of the method name, depending on the parameter type
*/
- public String resolveBaseMethodName(TypeMirror parameterType) {
+ String resolveBaseMethodName(TypeMirror parameterType) {
if (parameterType.getKind().isPrimitive()) {
return resolvePrimitiveMethodName(parameterType);
} else if (parameterType.getKind() == TypeKind.ARRAY) {