/**
  * Build a reader that accounts for schema differences between the reader and writer schemas.
  *
  * @param schema
  * @return
  */
 private ItemReader resolveReader(Schema schema) {
   switch (schema.getType()) {
     case NULL:
       return NullReader.INSTANCE;
     case BOOLEAN:
       return BooleanReader.INSTANCE;
     case INT:
       return IntReader.INSTANCE;
     case LONG:
       return LongReader.INSTANCE;
     case FLOAT:
       return FloatReader.INSTANCE;
     case DOUBLE:
       return DoubleReader.INSTANCE;
     case STRING:
       return StringReader.INSTANCE;
     case BYTES:
       return BytesReader.INSTANCE;
     case RECORD:
       return resolveRecord((RecordSchema) schema);
     case ENUM:
       return resolveEnum((EnumSchema) schema);
     case ARRAY:
       return resolveArray((ArraySchema) schema);
     case MAP:
       return resolveMap((MapSchema) schema);
     case UNION:
       return resolveUnion((UnionSchema) schema);
     default:
       throw new BaijiRuntimeException("Unknown schema type: " + schema);
   }
 }
Esempio n. 2
0
  @Test
  public void structuredAndUnstructuredOptions() throws Exception {
    // From https://developers.google.com/protocol-buffers/docs/proto#options
    Schema schema =
        new SchemaBuilder()
            .add(
                "foo.proto",
                ""
                    + "import \"google/protobuf/descriptor.proto\";\n"
                    + "message FooOptions {\n"
                    + "  optional int32 opt1 = 1;\n"
                    + "  optional string opt2 = 2;\n"
                    + "}\n"
                    + "\n"
                    + "extend google.protobuf.FieldOptions {\n"
                    + "  optional FooOptions foo_options = 1234;\n"
                    + "}\n"
                    + "\n"
                    + "message Bar {\n"
                    + "  optional int32 a = 1 [(foo_options).opt1 = 123, (foo_options).opt2 = \"baz\"];\n"
                    + "  optional int32 b = 2 [(foo_options) = { opt1: 456 opt2: \"quux\" }];\n"
                    + "}\n")
            .add("google/protobuf/descriptor.proto")
            .build();

    ProtoMember fooOptions = ProtoMember.get(Options.FIELD_OPTIONS, "foo_options");
    ProtoMember opt1 = ProtoMember.get(ProtoType.get("FooOptions"), "opt1");
    ProtoMember opt2 = ProtoMember.get(ProtoType.get("FooOptions"), "opt2");

    MessageType bar = (MessageType) schema.getType("Bar");
    assertThat(bar.field("a").options().map())
        .isEqualTo(ImmutableMap.of(fooOptions, ImmutableMap.of(opt1, "123", opt2, "baz")));
    assertThat(bar.field("b").options().map())
        .isEqualTo(ImmutableMap.of(fooOptions, ImmutableMap.of(opt1, "456", opt2, "quux")));
  }
Esempio n. 3
0
 private static void checkProp(Schema s0) throws Exception {
   if (s0.getType().equals(Schema.Type.UNION)) return; // unions have no props
   assertEquals(null, s0.getProp("foo"));
   Schema s1 = Schema.parse(s0.toString());
   s1.addProp("foo", "bar");
   assertEquals("bar", s1.getProp("foo"));
   assertFalse(s0.equals(s1));
   Schema s2 = Schema.parse(s1.toString());
   assertEquals("bar", s2.getProp("foo"));
   assertEquals(s1, s2);
   assertFalse(s0.equals(s2));
 }
Esempio n. 4
0
 @Test
 public void fullyQualifiedOptionFields() throws Exception {
   Schema schema =
       new SchemaBuilder()
           .add(
               "a/b/more_options.proto",
               ""
                   + "syntax = \"proto2\";\n"
                   + "package a.b;\n"
                   + "\n"
                   + "import \"google/protobuf/descriptor.proto\";\n"
                   + "\n"
                   + "extend google.protobuf.MessageOptions {\n"
                   + "  optional MoreOptions more_options = 17000;\n"
                   + "}\n"
                   + "\n"
                   + "message MoreOptions {\n"
                   + "  extensions 100 to 200;\n"
                   + "}\n")
           .add(
               "a/c/event_more_options.proto",
               ""
                   + "syntax = \"proto2\";\n"
                   + "package a.c;\n"
                   + "\n"
                   + "import \"a/b/more_options.proto\";\n"
                   + "\n"
                   + "extend a.b.MoreOptions {\n"
                   + "  optional EvenMoreOptions even_more_options = 100;\n"
                   + "}\n"
                   + "\n"
                   + "message EvenMoreOptions {\n"
                   + "  optional string string_option = 1;\n"
                   + "}\n")
           .add(
               "a/d/message.proto",
               ""
                   + "syntax = \"proto2\";\n"
                   + "package a.d;\n"
                   + "\n"
                   + "import \"a/b/more_options.proto\";\n"
                   + "import \"a/c/event_more_options.proto\";\n"
                   + "\n"
                   + "message Message {\n"
                   + "  option (a.b.more_options) = {\n"
                   + "    [a.c.even_more_options]: {string_option: \"foo\"}\n"
                   + "  };\n"
                   + "}\n")
           .add("google/protobuf/descriptor.proto")
           .build();
   ProtoType moreOptionsType = ProtoType.get("a.b.MoreOptions");
   ProtoType evenMoreOptionsType = ProtoType.get("a.c.EvenMoreOptions");
   ProtoMember moreOptions = ProtoMember.get(Options.MESSAGE_OPTIONS, "a.b.more_options");
   ProtoMember evenMoreOptions = ProtoMember.get(moreOptionsType, "a.c.even_more_options");
   ProtoMember stringOption = ProtoMember.get(evenMoreOptionsType, "string_option");
   MessageType message = (MessageType) schema.getType("a.d.Message");
   assertThat(message.options().map())
       .isEqualTo(
           ImmutableMap.of(
               moreOptions,
               ImmutableMap.of(evenMoreOptions, ImmutableMap.of(stringOption, "foo"))));
 }