private FieldSpec optionsField(ProtoType optionsType, String fieldName, Options options) { TypeName optionsJavaType = typeName(optionsType); CodeBlock.Builder initializer = CodeBlock.builder(); initializer.add("$[new $T.Builder()", optionsJavaType); boolean empty = true; for (Map.Entry<ProtoMember, ?> entry : options.map().entrySet()) { if (entry.getKey().equals(FIELD_DEPRECATED) || entry.getKey().equals(PACKED)) { continue; } Field optionField = schema.getField(entry.getKey()); initializer.add("\n.$L($L)", fieldName(optionsType, optionField), fieldInitializer(optionField.type(), entry.getValue())); empty = false; } initializer.add("\n.build()$]"); if (empty) return null; return FieldSpec.builder(optionsJavaType, fieldName) .addModifiers(PUBLIC, STATIC, FINAL) .initializer(initializer.build()) .build(); }
for (ProtoMember protoMember : constant.options().map().keySet()) { Field optionField = schema.getField(protoMember); if (allOptionFieldsBuilder.add(protoMember)) { ProtoMember protoMember = allOptionMembers.get(i); Field field = schema.getField(protoMember); Object fieldValue = constant.options().map().get(protoMember); enumArgs[i + 1] = fieldValue != null ? fieldInitializer(field.type(), fieldValue)
@Test public void excludedTypePrunesTopLevelOption() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message SomeFieldOptions {\n" + " optional string a = 1;\n" + "}\n" + "extend google.protobuf.FieldOptions {\n" + " optional SomeFieldOptions some_field_options = 22001;\n" + " optional string b = 22002;\n" + "}\n" + "message Message {\n" + " optional string f = 1 [some_field_options.a = \"a\", b = \"b\"];\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .exclude("SomeFieldOptions") .build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); Map<ProtoMember, Object> map = field.options().map(); Map.Entry<?, ?> onlyOption = getOnlyElement(map.entrySet()); assertThat(((ProtoMember) onlyOption.getKey()).member()).isEqualTo("b"); assertThat(onlyOption.getValue()).isEqualTo("b"); }
.build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); Map<ProtoMember, Object> map = field.options().map(); Map.Entry<?, ?> onlyOption = getOnlyElement(map.entrySet()); assertThat(((ProtoMember) onlyOption.getKey()).member()).isEqualTo("b");
@Test public void structuredAndUnstructuredOptions() throws Exception { // From https://developers.google.com/protocol-buffers/docs/proto#options Schema schema = new RepoBuilder() .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") .schema(); 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"))); }
@Test public void textFormatCanOmitMapValueSeparator() throws Exception { Schema schema = new RepoBuilder() .add("foo.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message FooOptions {\n" + " optional BarOptions bar = 2;\n" + "}\n" + "message BarOptions {\n" + " optional int32 baz = 2;\n" + "}\n" + "\n" + "extend google.protobuf.FieldOptions {\n" + " optional FooOptions foo = 1234;\n" + "}\n" + "\n" + "message Message {\n" + " optional int32 b = 2 [(foo) = { bar { baz: 123 } }];\n" + "}\n") .schema(); ProtoMember foo = ProtoMember.get(Options.FIELD_OPTIONS, "foo"); ProtoMember bar = ProtoMember.get(ProtoType.get("FooOptions"), "bar"); ProtoMember baz = ProtoMember.get(ProtoType.get("BarOptions"), "baz"); MessageType message = (MessageType) schema.getType("Message"); assertThat(message.field("b").options().map()).isEqualTo(ImmutableMap.of( foo, ImmutableMap.of(bar, ImmutableMap.of(baz, "123")))); }
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"))));
@Test public void excludeOptions() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "extend google.protobuf.FieldOptions {\n" + " optional string a = 22001;\n" + " optional string b = 22002;\n" + "}\n" + "message Message {\n" + " optional string f = 1 [ a = \"a\", b = \"b\" ];\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .exclude("google.protobuf.FieldOptions") .build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); assertThat(field.options().map()).isEmpty(); }
public static List<String> readStringList(Options options, ProtoMember key) { Object value = options.map().get(key); if(value instanceof List){ return ((List<Object>) value).stream() .filter(String.class::isInstance) .map(String.class::cast) .collect(Collectors.toList()); } return Lists.newArrayList(); } }
for (ProtoMember protoMember : constant.options().map().keySet()) { Field optionField = schema.getField(protoMember); if (allOptionFieldsBuilder.add(protoMember)) { ProtoMember protoMember = allOptionMembers.get(i); Field field = schema.getField(protoMember); Object value = constant.options().map().get(protoMember); enumArgs[i + 1] = value != null ? fieldInitializer(field.type(), value)
for (ProtoMember protoMember : constant.options().map().keySet()) { Field optionField = schema.getField(protoMember); if (allOptionFieldsBuilder.add(protoMember)) { ProtoMember protoMember = allOptionMembers.get(i); Field field = schema.getField(protoMember); Object value = constant.options().map().get(protoMember); enumArgs[i + 1] = value != null ? fieldInitializer(field.type(), value)
private FieldSpec optionsField(ProtoType optionsType, String fieldName, Options options) { TypeName optionsJavaType = typeName(optionsType); CodeBlock.Builder initializer = CodeBlock.builder(); initializer.add("$[new $T.Builder()", optionsJavaType); boolean empty = true; for (Map.Entry<ProtoMember, ?> entry : options.map().entrySet()) { if (entry.getKey().equals(FIELD_DEPRECATED) || entry.getKey().equals(PACKED)) { continue; } Field optionField = schema.getField(entry.getKey()); initializer.add("\n.$L($L)", fieldName(optionsType, optionField), fieldInitializer(optionField.type(), entry.getValue())); empty = false; } initializer.add("\n.build()$]"); if (empty) return null; return FieldSpec.builder(optionsJavaType, fieldName) .addModifiers(PUBLIC, STATIC, FINAL) .initializer(initializer.build()) .build(); }
private FieldSpec optionsField(ProtoType optionsType, String fieldName, Options options) { TypeName optionsJavaType = typeName(optionsType); CodeBlock.Builder initializer = CodeBlock.builder(); initializer.add("$[new $T.Builder()", optionsJavaType); boolean empty = true; for (Map.Entry<ProtoMember, ?> entry : options.map().entrySet()) { if (entry.getKey().equals(FIELD_DEPRECATED) || entry.getKey().equals(PACKED)) { continue; } Field optionField = schema.getField(entry.getKey()); initializer.add("\n.$L($L)", fieldName(optionsType, optionField), fieldInitializer(optionField.type(), entry.getValue())); empty = false; } initializer.add("\n.build()$]"); if (empty) { return null; } return FieldSpec.builder(optionsJavaType, fieldName) .addModifiers(PUBLIC, STATIC, FINAL) .initializer(initializer.build()) .build(); }