/** * Generates a protobuf descriptor instance from a FileDescriptor set. * * @param set set of file descriptors * @param fileDescriptorMap map of message types to file descriptors * @param descriptorFile descriptor file for message to be decoded * @param messageType the name of the message to be decoded * @return protobuf descriptor instance * @throws StageException */ public static Descriptors.Descriptor getDescriptor( DescriptorProtos.FileDescriptorSet set, Map<String, Descriptors.FileDescriptor> fileDescriptorMap, String descriptorFile, String messageType) throws StageException { // find the FileDescriptorProto which contains the message type // IF cannot find, then bail out DescriptorProtos.FileDescriptorProto file = null; for (DescriptorProtos.FileDescriptorProto fileDescriptorProto : set.getFileList()) { for (DescriptorProtos.DescriptorProto descriptorProto : getAllMessageTypesInDescriptorProto(fileDescriptorProto)) { if (messageType.equals(descriptorProto.getName())) { file = fileDescriptorProto; break; } } if (file != null) { break; } } if (file == null) { // could not find the message type from all the proto files contained in the descriptor file throw new StageException(Errors.PROTOBUF_00, messageType, descriptorFile); } // finally get the FileDescriptor for the message type Descriptors.FileDescriptor fileDescriptor = fileDescriptorMap.get(file.getName()); // create builder using the FileDescriptor return fileDescriptor.findMessageTypeByName(messageType); }
/** * Generates a protobuf descriptor instance from a FileDescriptor set. * * @param set set of file descriptors * @param fileDescriptorMap map of message types to file descriptors * @param descriptorFile descriptor file for message to be decoded * @param qualifiedMessageType the name of the message to be decoded * @return protobuf descriptor instance * @throws StageException */ public static Descriptors.Descriptor getDescriptor( DescriptorProtos.FileDescriptorSet set, Map<String, Descriptors.FileDescriptor> fileDescriptorMap, String descriptorFile, String qualifiedMessageType) throws StageException { // find the FileDescriptorProto which contains the message type // IF cannot find, then bail out String packageName = null; String messageType = qualifiedMessageType; int lastIndex = qualifiedMessageType.lastIndexOf('.'); if (lastIndex != -1) { packageName = qualifiedMessageType.substring(0, lastIndex); messageType = qualifiedMessageType.substring(lastIndex + 1); } DescriptorProtos.FileDescriptorProto file = getFileDescProtoForMsgType(packageName, messageType, set); if (file == null) { // could not find the message type from all the proto files contained in the descriptor file throw new StageException(Errors.PROTOBUF_00, qualifiedMessageType, descriptorFile); } // finally get the FileDescriptor for the message type Descriptors.FileDescriptor fileDescriptor = fileDescriptorMap.get(file.getName()); // create builder using the FileDescriptor // this can only find the top level message types return fileDescriptor.findMessageTypeByName(messageType); }
/** * Returns a Message {@link Descriptor} for a dynamically generated DescriptorProto. * * @param descProto * @throws DescriptorValidationException */ public static Descriptor makeMessageDescriptor(DescriptorProto descProto) throws DescriptorValidationException { DescriptorProtos.FileDescriptorProto fileDescP = DescriptorProtos.FileDescriptorProto.newBuilder().addMessageType(descProto).build(); Descriptors.FileDescriptor[] fileDescs = new Descriptors.FileDescriptor[0]; Descriptors.FileDescriptor dynamicDescriptor = Descriptors.FileDescriptor.buildFrom(fileDescP, fileDescs); return dynamicDescriptor.findMessageTypeByName(descProto.getName()); }