Convert createConverter()

in sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoDynamicMessageSchema.java [113:188]


  Convert createConverter(Schema.Field field) {
    Schema.FieldType fieldType = field.getType();
    if (fieldType.getNullable()) {
      Schema.Field valueField =
          withFieldNumber(Schema.Field.of("value", Schema.FieldType.BOOLEAN), 1);
      switch (fieldType.getTypeName()) {
        case BYTE:
        case INT16:
        case INT32:
        case INT64:
        case FLOAT:
        case DOUBLE:
        case STRING:
        case BOOLEAN:
          return new WrapperConvert(field, new PrimitiveConvert(valueField));
        case BYTES:
          return new WrapperConvert(field, new BytesConvert(valueField));
        case LOGICAL_TYPE:
          String identifier = field.getType().getLogicalType().getIdentifier();
          switch (identifier) {
            case ProtoSchemaLogicalTypes.UInt32.IDENTIFIER:
            case ProtoSchemaLogicalTypes.UInt64.IDENTIFIER:
              return new WrapperConvert(field, new PrimitiveConvert(valueField));
            default:
          }
          // fall through
        default:
      }
    }

    switch (fieldType.getTypeName()) {
      case BYTE:
      case INT16:
      case INT32:
      case INT64:
      case FLOAT:
      case DOUBLE:
      case STRING:
      case BOOLEAN:
        return new PrimitiveConvert(field);
      case BYTES:
        return new BytesConvert(field);
      case ARRAY:
      case ITERABLE:
        return new ArrayConvert(this, field);
      case MAP:
        return new MapConvert(this, field);
      case LOGICAL_TYPE:
        String identifier = field.getType().getLogicalType().getIdentifier();
        switch (identifier) {
          case ProtoSchemaLogicalTypes.Fixed32.IDENTIFIER:
          case ProtoSchemaLogicalTypes.Fixed64.IDENTIFIER:
          case ProtoSchemaLogicalTypes.SFixed32.IDENTIFIER:
          case ProtoSchemaLogicalTypes.SFixed64.IDENTIFIER:
          case ProtoSchemaLogicalTypes.SInt32.IDENTIFIER:
          case ProtoSchemaLogicalTypes.SInt64.IDENTIFIER:
          case ProtoSchemaLogicalTypes.UInt32.IDENTIFIER:
          case ProtoSchemaLogicalTypes.UInt64.IDENTIFIER:
            return new LogicalTypeConvert(field, fieldType.getLogicalType());
          case NanosInstant.IDENTIFIER:
            return new TimestampConvert(field);
          case NanosDuration.IDENTIFIER:
            return new DurationConvert(field);
          case EnumerationType.IDENTIFIER:
            return new EnumConvert(field, fieldType.getLogicalType());
          case OneOfType.IDENTIFIER:
            return new OneOfConvert(this, field, fieldType.getLogicalType());
          default:
            throw new IllegalStateException("Unexpected logical type : " + identifier);
        }
      case ROW:
        return new MessageConvert(this, field);
      default:
        throw new IllegalStateException("Unexpected value: " + fieldType);
    }
  }