fjod commented on pull request #8372:
URL: https://github.com/apache/pulsar/pull/8372#issuecomment-806366160


   @hnail I think some bug in deserialize method of ProtobufNativeSchemaUtils. 
I generated descriptor using probuf-net library, here it is 
**CgpUZXN0LnByb3RvEgVwcm90byImCgpYWFhNZXNzYWdlEgsKA2ZvbxgBIAEoCRILCgNiYXIYAiABKAFCD6oCDG5hdGl2ZUNoZWNrMmIGcHJvdG8z**
 .  If you check it on https://protogen.marcgravell.com/decode , it decodes 
fine. Here is json file with some additional fields:
   
   
{"fileDescriptorSet":"ClMKClRlc3QucHJvdG8SC25hdGl2ZUNoZWNrIjAKClhYWE1lc3NhZ2USEAoDZm9vGAEgASgJUgNmb28SEAoDYmFyGAIgASgBUgNiYXJiBnByb3RvMw==","rootMessageTypeName":"proto.XXXMessage","rootFileDescriptorName":"Test.proto"}
   
   When I try to send it to apache-pulsar server, I get null-pointer exception 
on line 104 at  
https://github.com/apache/pulsar/blob/2a1828ca08f096a94b696737e93e84a2bc60a8cc/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/ProtobufNativeSchemaUtils.java#L104
   
   I created sample java app copy-pasting code from ProtobufNativeSchemaUtils. 
Here is simpler version of deserializer:
   
   ```
            File file;
            Descriptors.Descriptor descriptor;
            file = new File("D:\\serialized");
            byte[] fileContent = Files.readAllBytes(file.toPath());
            ProtobufNativeSchemaData schemaData = new 
ObjectMapper().readValue(fileContent, ProtobufNativeSchemaData.class);
            FileDescriptorSet fileDescriptorSet = 
FileDescriptorSet.parseFrom(schemaData.fileDescriptorSet);   
           Map<String, FileDescriptorProto> fileDescriptorProtoCache = new 
HashMap<>();
           Map<String, Descriptors.FileDescriptor> fileDescriptorCache = new 
HashMap<>();
           fileDescriptorSet.getFileList().forEach(fileDescriptorProto -> 
fileDescriptorProtoCache.put(fileDescriptorProto.getName(), 
fileDescriptorProto));        
           FileDescriptorProto rootFileDescriptorProto = 
fileDescriptorProtoCache.get("Test.proto");
           deserializeFileDescriptor(rootFileDescriptorProto, 
fileDescriptorCache, fileDescriptorProtoCache);
           Descriptors.FileDescriptor fileDescriptor = 
fileDescriptorCache.get("Test.proto");      
           System.out.print(fileDescriptor.toProto());
   ```
   
   output is:
   
   ```
   name: "Test.proto"
   package: "nativeCheck"
   message_type {
     name: "XXXMessage"
     field {
       name: "foo"
       number: 1
       label: LABEL_OPTIONAL
       type: TYPE_STRING
       json_name: "foo"
     }
     field {
       name: "bar"
       number: 2
       label: LABEL_OPTIONAL
       type: TYPE_DOUBLE
       json_name: "bar"
     }
   }
   syntax: "proto3"
   ```
   
   **So Descriptor is fine**! But if I try to use code from the repo:
   
   ```
           Descriptors.Descriptor descriptor2;
           Descriptors.FileDescriptor fileDescriptor2 = 
fileDescriptorCache.get(schemaData.rootMessageTypeName);
           String package1 = fileDescriptor2.getPackage();
                   //trim package
           String[] paths = 
StringUtils.removeFirst(schemaData.rootMessageTypeName, 
package1).replaceFirst("\\.", "").split("\\.");
           //extract root message
           descriptor2 = fileDescriptor2.findMessageTypeByName(paths[0]);
           //extract nested message
           for (int i = 1; i < paths.length; i++) {
               descriptor2 = descriptor2.findNestedTypeByName(paths[i]);
           }
           System.out.print(descriptor2.toProto());
   ```
   
   I get nullpointer exception on line with getPackage(); - similar to 
apache-pulsar exception. 
   
![image](https://user-images.githubusercontent.com/7898721/112421589-5fd2b580-8d40-11eb-9e5a-07c7b1854dd7.png)
   I guess our generated descriptor does not contain such "package" and fails 
therefore? It would be great if we can use descriptor from our client too ;)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to