/** * 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); } }
@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"))); }
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)); }
@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")))); }