From 189a2f531431186550752cb03a78a21292d7c2c1 Mon Sep 17 00:00:00 2001 From: Tristan Tarrant Date: Tue, 26 Apr 2022 08:50:28 +0200 Subject: [PATCH] IPROTO-233 Fix MarshallerByteCodeGenerator on JDK 8 and 9+ --- .../impl/MarshallerByteCodeGenerator.java | 13 +++++++++++-- .../AutoProtoSchemaBuilderAnnotationProcessor.java | 5 +++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/infinispan/protostream/annotations/impl/MarshallerByteCodeGenerator.java b/core/src/main/java/org/infinispan/protostream/annotations/impl/MarshallerByteCodeGenerator.java index 9f8a338d9..8102b1285 100644 --- a/core/src/main/java/org/infinispan/protostream/annotations/impl/MarshallerByteCodeGenerator.java +++ b/core/src/main/java/org/infinispan/protostream/annotations/impl/MarshallerByteCodeGenerator.java @@ -9,6 +9,7 @@ import org.infinispan.protostream.EnumMarshaller; import org.infinispan.protostream.ProtobufTagMarshaller; import org.infinispan.protostream.SerializationContext; +import org.infinispan.protostream.annotations.impl.types.XClass; import org.infinispan.protostream.annotations.impl.types.XTypeFactory; import org.infinispan.protostream.containers.IndexedElementContainerAdapter; import org.infinispan.protostream.containers.IterableElementContainerAdapter; @@ -144,12 +145,20 @@ private Class generateEnumMarshaller(ProtoEnumTypeMetadata petm) ctEncodeMethod.setBody(encodeSrc); marshallerImpl.addMethod(ctEncodeMethod); - Class generatedMarshallerClass = (Class) marshallerImpl.toClass(petm.getAnnotatedClass().asClass()); + Class generatedMarshallerClass = (Class) toClass(marshallerImpl, petm.getAnnotatedClass()); marshallerImpl.detach(); return generatedMarshallerClass; } + private Class toClass(CtClass marshallerImpl, XClass petm) throws CannotCompileException { + if (System.getProperty("java.version").startsWith("1.8")) { + return marshallerImpl.toClass(); + } else { + return marshallerImpl.toClass(petm.asClass()); + } + } + /** * Generates an implementation of {@link ProtobufTagMarshaller} as a static nested class in the message class to be * marshalled. The InnerClasses attribute of the outer class is not altered, so this is not officially considered a @@ -219,7 +228,7 @@ private Class generateMessageMarshaller(ProtoMessageTypeM ctWriteMethod.setBody(writeBody); marshallerImpl.addMethod(ctWriteMethod); - Class generatedMarshallerClass = (Class) marshallerImpl.toClass(pmtm.getAnnotatedClass().asClass()); + Class generatedMarshallerClass = (Class) toClass(marshallerImpl, pmtm.getAnnotatedClass()); marshallerImpl.detach(); return generatedMarshallerClass; diff --git a/processor/src/main/java/org/infinispan/protostream/annotations/impl/processor/AutoProtoSchemaBuilderAnnotationProcessor.java b/processor/src/main/java/org/infinispan/protostream/annotations/impl/processor/AutoProtoSchemaBuilderAnnotationProcessor.java index fedcc734a..d09ef6b80 100644 --- a/processor/src/main/java/org/infinispan/protostream/annotations/impl/processor/AutoProtoSchemaBuilderAnnotationProcessor.java +++ b/processor/src/main/java/org/infinispan/protostream/annotations/impl/processor/AutoProtoSchemaBuilderAnnotationProcessor.java @@ -208,10 +208,11 @@ public boolean process(Set annotations, RoundEnvironment } private void ensureRequiredEnv() { - if (getJavaMajorVersion() < 9) { + if (getJavaMajorVersion() < 9 && !Boolean.getBoolean("org.infinispan.protostream.skipAnnotationCompilerCheck")) { reportWarning(null, "Please ensure you use at least Java ver. 9 for compilation in order to avoid various " + "compiler related bugs from older Java versions that impact the AutoProtoSchemaBuilder annotation " + - "processor (you can still set the output target to 8 or above)."); + "processor (you can still set the output target to 8 or above). To hide this warning set the " + + "`org.infinispan.protostream.skipAnnotationCompilerCheck` system property"); } Version procVersion = Version.getVersion(AutoProtoSchemaBuilder.class);