/**
   * 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);
  }
예제 #3
0
  /**
   * 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());
  }