private void fieldMapToString(Field field, StringBuilder sb) { Message entryMessage = (Message) field.getType(); Field keyField = entryMessage.getField(1); Field valueField = entryMessage.getField(2); // map<string, string> name = 1; appendLine(sb, "map<%s, %s> %s = %d;", keyField.getTypeName(), valueField.getTypeName(), field.getName(), field.getTag()); } }
private FieldMapEx<T> createPojoFields(Type type) { SerializerSchemaManager serializerSchemaManager = protoMapper.getSerializerSchemaManager(); BeanDescriptor beanDescriptor = protoMapper.getBeanDescriptorManager().getOrCreateBeanDescriptor(type); List<FieldSchema<T>> fieldSchemas = new ArrayList<>(); for (Field protoField : message.getFields()) { PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get(protoField.getName()); if (propertyDescriptor == null) { continue; } Object getter = propertyDescriptor.getGetter(); if (getter == null) { continue; } FieldSchema<T> fieldSchema = serializerSchemaManager.createSchemaField(protoField, propertyDescriptor); fieldSchemas.add(fieldSchema); } return FieldMapEx.createFieldMap(fieldSchemas); }
private void messageToString(Message message, StringBuilder sb) { commentsToString(message.getCommentLines(), sb, 0); appendLine(sb, "message %s {", message.getName()); for (Field field : message.getFields()) { sb.append(" "); fieldToString(field, field.isRepeated(), sb); } appendLine(sb, "}\n"); }
private void createFieldMap() { DeserializerSchemaManager deserializerSchemaManager = protoMapper.getDeserializerSchemaManager(); BeanDescriptor beanDescriptor = protoMapper.getBeanDescriptorManager().getOrCreateBeanDescriptor(javaType); List<FieldSchema<T>> fieldSchemas = new ArrayList<>(); for (PropertyDescriptor propertyDescriptor : beanDescriptor.getPropertyDescriptors().values()) { Field protoField = message.getField(propertyDescriptor.getName()); if (protoField == null) { LOGGER.info("java field {}:{} not exist in proto message {}, ignore it.", beanDescriptor.getJavaType().getRawClass().getName(), propertyDescriptor.getName(), message.getCanonicalName()); continue; } if (propertyDescriptor.getSetter() == null) { LOGGER.info("no setter for java field {}:{} in proto message {}, ignore it.", beanDescriptor.getJavaType().getRawClass().getName(), propertyDescriptor.getName(), message.getCanonicalName()); continue; } FieldSchema<T> fieldSchema = deserializerSchemaManager.createSchemaField(protoField, propertyDescriptor); fieldSchemas.add(fieldSchema); } this.fieldMap = FieldMapEx.createFieldMap(fieldSchemas); }
private void process(Module module, Message message) { ImmutableMessageDescriptor descriptor = ImmutableMessageDescriptor.builder() .type(NodeType.MESSAGE) .name(message.getName()) .canonicalName(message.getCanonicalName()) .description(markdownProcessor.toHtml(message.getComments())) .options(message.getOptions().toMap()) .usages(module.usageIndex().getUsages(message).stream() .map(type -> ImmutableUsageItem.builder() .build()) .collect(Collectors.toList())) .addAllFields(message.getFields().stream() .map(field -> { ImmutableMessageField.Builder builder = ImmutableMessageField.builder() .collect(Collectors.toList())) .build(); String output = "data/type/" + message.getCanonicalName() + ".json"; write(module, output, descriptor);
private List<JsonTreeNode> processContainer(UserTypeContainer proto) { List<JsonTreeNode> result = new ArrayList<>(); proto.getEnums() .forEach(anEnum -> result.add(ImmutableJsonTreeNode.builder() .label(anEnum.getName()) .data(ImmutableNodeData.builder() .type(NodeType.ENUM) .ref(anEnum.getCanonicalName()) .build()) .build())); proto.getMessages().stream() .filter(message -> !message.isMapEntry()) .forEach(message -> { ImmutableJsonTreeNode.Builder builder = ImmutableJsonTreeNode.builder(); builder.label(message.getName()); builder.data(ImmutableNodeData.builder() .type(NodeType.MESSAGE) .ref(message.getCanonicalName()) .build()); List<JsonTreeNode> children = processContainer(message); if (!children.isEmpty()) { builder.children(children); } result.add(builder.build()); }); return result; } }
@Override public void exitMap(ProtoParser.MapContext ctx) { final Field field = context.pop(Field.class); final Message message = context.peek(Message.class); String name = ctx.fieldName().getText(); SourceCodeLocation codeLocation = getSourceCodeLocation(ctx); Message map = new Message(message); String mapEntryTypeName = name + "_entry"; map.setName(mapEntryTypeName); map.setSourceCodeLocation(codeLocation); map.getOptions().set(codeLocation, OPTION_MAP_ENTRY, Value.createBoolean(true)); String keyTypeName = ctx.mapKey().getText(); Field keyField = createMapKeyField(map, keyTypeName, codeLocation); map.addField(keyField); String valueTypeName = ctx.mapValue().getText(); Field valueField = createMapValueField(map, valueTypeName, codeLocation); map.addField(valueField); Integer tag = Integer.decode(ctx.tag().getText()); field.setName(name); field.setTag(tag); field.setIndex(message.getFieldCount() + 1); field.setModifier(REPEATED); field.setTypeName(mapEntryTypeName); field.setType(map); field.setSourceCodeLocation(codeLocation); message.addField(field); message.addMessage(map); attachComments(ctx, field, true); }
public Message getMessageFromCanonicaName(String messageCanonicalName) { for (Message message : proto.getMessages()) { if (message.getCanonicalName().equals(messageCanonicalName)) { return message; } } return null; }
@Override public String messageName() { return message.getName(); }
type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type);
protected void buildSchemas() { SchemaCreateContext context = new SchemaCreateContext(); for (Message message : proto.getMessages()) { RootSerializer rootSerializer = createRootSerializer(context, message); schemas.put(message.getName(), rootSerializer); canonicalSchemas.put(message.getCanonicalName(), rootSerializer); } }
private void walk(Message message) { for (Processor<Field> fieldProcessor : fieldProcessors) { for (Field field : message.getFields()) { fieldProcessor.run(context, field); } } for (Processor<Oneof> processor : oneofProcessors) { for (Oneof oneof : message.getOneofs()) { processor.run(context, oneof); } } }
public boolean isMapEntry() { DynamicMessage.Value value = this.getOptions().get(MessageParseListener.OPTION_MAP_ENTRY); return value != null && value.isBooleanType() && value.getBoolean(); } }
/** * Returns true if this message is generated by parser as a * holder for a map entries. */ public boolean isMap() { if (type instanceof Message) { Message message = (Message) type; return message.isMapEntry(); } return false; }
/** * Returns a list of bit fields used for field presence checks. */ public static List<String> bitFieldNames(Message message) { int fieldCount = message.getFieldCount(); if (fieldCount == 0) { return Collections.emptyList(); } List<String> result = new ArrayList<>(); int n = (fieldCount - 1) / 32 + 1; for (int i = 0; i < n; i++) { result.add("__bitField" + i); } return result; }
private void process(Module module, Message message) { ImmutableMessageDescriptor descriptor = ImmutableMessageDescriptor.builder() .type(NodeType.MESSAGE) .name(message.getName()) .canonicalName(message.getCanonicalName()) .description(markdownProcessor.toHtml(message.getComments())) .options(message.getOptions().toMap()) .usages(module.usageIndex().getUsages(message).stream() .map(type -> ImmutableUsageItem.builder() .build()) .collect(Collectors.toList())) .addAllFields(message.getFields().stream() .map(field -> { ImmutableMessageField.Builder builder = ImmutableMessageField.builder() .collect(Collectors.toList())) .build(); String output = "data/type/" + message.getCanonicalName() + ".json"; write(module, output, descriptor);
private List<JsonTreeNode> processContainer(UserTypeContainer proto) { List<JsonTreeNode> result = new ArrayList<>(); proto.getEnums() .forEach(anEnum -> result.add(ImmutableJsonTreeNode.builder() .label(anEnum.getName()) .data(ImmutableNodeData.builder() .type(NodeType.ENUM) .ref(anEnum.getCanonicalName()) .build()) .build())); proto.getMessages().stream() .filter(message -> !message.isMapEntry()) .forEach(message -> { ImmutableJsonTreeNode.Builder builder = ImmutableJsonTreeNode.builder(); builder.label(message.getName()); builder.data(ImmutableNodeData.builder() .type(NodeType.MESSAGE) .ref(message.getCanonicalName()) .build()); List<JsonTreeNode> children = processContainer(message); if (!children.isEmpty()) { builder.children(children); } result.add(builder.build()); }); return result; } }
@Override public void exitMap(ProtoParser.MapContext ctx) { final Field field = context.pop(Field.class); final Message message = context.peek(Message.class); String name = ctx.fieldName().getText(); SourceCodeLocation codeLocation = getSourceCodeLocation(ctx); Message map = new Message(message); String mapEntryTypeName = name + "_entry"; map.setName(mapEntryTypeName); map.setSourceCodeLocation(codeLocation); map.getOptions().set(codeLocation, OPTION_MAP_ENTRY, Value.createBoolean(true)); String keyTypeName = ctx.mapKey().getText(); Field keyField = createMapKeyField(map, keyTypeName, codeLocation); map.addField(keyField); String valueTypeName = ctx.mapValue().getText(); Field valueField = createMapValueField(map, valueTypeName, codeLocation); map.addField(valueField); Integer tag = Integer.decode(ctx.tag().getText()); field.setName(name); field.setTag(tag); field.setIndex(message.getFieldCount() + 1); field.setModifier(REPEATED); field.setTypeName(mapEntryTypeName); field.setType(map); field.setSourceCodeLocation(codeLocation); message.addField(field); message.addMessage(map); attachComments(ctx, field, true); }